<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.36 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-05" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="DAP-PPM">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-05"/>
    <author initials="T." surname="Geoghegan" fullname="Tim Geoghegan">
      <organization>ISRG</organization>
      <address>
        <email>timgeog+ietf@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Patton" fullname="Christopher Patton">
      <organization>Cloudflare</organization>
      <address>
        <email>chrispatton+ietf@gmail.com</email>
      </address>
    </author>
    <author initials="E." surname="Rescorla" fullname="Eric Rescorla">
      <organization>Mozilla</organization>
      <address>
        <email>ekr@rtfm.com</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2023" month="July" day="10"/>
    <abstract>
      <?line 89?>

<t>There are many situations in which it is desirable to take measurements of data
which people consider sensitive. In these cases, the entity taking the
measurement is usually not interested in people's individual responses but
rather in aggregated data. Conventional methods require collecting individual
responses and then aggregating them, thus representing a threat to user privacy
and rendering many such measurements difficult and impractical. This document
describes a multi-party distributed aggregation protocol (DAP) for privacy
preserving measurement (PPM) which can be used to collect aggregate data without
revealing any individual user's data.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-ppm.github.io/draft-ietf-ppm-dap/draft-ietf-ppm-dap.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-ppm-dap/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Privacy Preserving Measurement Working Group mailing list (<eref target="mailto:ppm@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ppm/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ppm/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-ppm/draft-ietf-ppm-dap"/>.</t>
    </note>
  </front>
  <middle>
    <?line 101?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the Distributed Aggregation Protocol (DAP) for privacy
preserving measurement. The protocol is executed by a large set of clients and a
small set of servers. The servers' goal is to compute some aggregate statistic
over the clients' inputs without learning the inputs themselves. This is made
possible by distributing the computation among the servers in such a way that,
as long as at least one of them executes the protocol honestly, no input is ever
seen in the clear by any server.</t>
      <section anchor="change-log">
        <name>Change Log</name>
        <t>(*) Indicates a change that breaks wire compatibility with the previous draft.</t>
        <t>05:</t>
        <ul spacing="normal">
          <li>Bump draft-irtf-cfrg-vdaf-05 to 06 <xref target="VDAF"/>. (*)</li>
          <li>Specialize the protocol for two-party VDAFs (i.e., one Leader and One
Helper). Accordingly, update the aggregation sub-protocol to use the new
"ping-pong" interface for two-party VDAFs introduced in
draft-irtf-cfrg-vdaf-06. (*)</li>
          <li>Allow the following actions to be safely retried: aggregation job creation,
collection job creation, and requesting the Helper's aggregate share.</li>
          <li>Merge error types that are related.</li>
          <li>Drop recommendation to generate IDs using a cryptographically secure
pseudorandom number generator wherever pseudorandomness is not required.</li>
          <li>Require HPKE config identifiers to be unique.</li>
          <li>Bump version tag from "dap-04" to "dap-05". (*)</li>
        </ul>
        <t>04:</t>
        <ul spacing="normal">
          <li>Introduce resource oriented HTTP API. (#278, #398, #400) (*)</li>
          <li>Clarify security requirements for choosing VDAF verify key. (#407, #411)</li>
          <li>Require Clients to provide nonce and random input when sharding inputs. (#394,
#425) (*)</li>
          <li>Add interval of time spanned by constituent reports to Collection message.
(#397, #403) (*)</li>
          <li>Update share validation requirements based on latest security analysis. (#408,
#410)</li>
          <li>Bump draft-irtf-cfrg-vdaf-03 to 05 <xref target="VDAF"/>. (#429) (*)</li>
          <li>Bump version tag from "dap-03" to "dap-04". (#424) (*)</li>
        </ul>
        <t>03:</t>
        <ul spacing="normal">
          <li>Enrich the "fixed_size" query type to allow the Collector to request a
recently aggregated batch without knowing the batch ID in advance. ID
discovery was previously done out-of-band. (*)</li>
          <li>Allow Aggregators to advertise multiple HPKE configurations. (*)</li>
          <li>Clarify requirements for enforcing anti-replay. Namely, while it is sufficient
to detect repeated report IDs, it is also enough to detect repeated IDs and
timestamps.</li>
          <li>Remove the extensions from the Report and add extensions to the plaintext
payload of each ReportShare. (*)</li>
          <li>Clarify that extensions are mandatory to implement: If an Aggregator does not
recognize a ReportShare's extension, it must reject it.</li>
          <li>Clarify that Aggregators must reject any ReportShare with repeated extension
types.</li>
          <li>Specify explicitly how to serialize the Additional Authenticated Data (AAD)
string for HPKE encryption. This clarifies an ambiguity in the previous
version. (*)</li>
          <li>Change the length tag for the aggregation parameter to 32 bits. (*)</li>
          <li>Use the same prefix ("application") for all media types. (*)</li>
          <li>Make input share validation more explicit, including adding a new
ReportShareError variant, "report_too_early", for handling reports too far in
the future. (*)</li>
          <li>Improve alignment of problem details usage with <xref target="RFC7807"/>. Replace
"reportTooLate" problem document type with "repjortRejected" and clarify
handling of rejected reports in the upload sub-protocol. (*)</li>
          <li>Bump version tag from "dap-02" to "dap-03". (*)</li>
        </ul>
        <t>02:</t>
        <ul spacing="normal">
          <li>Define a new task configuration parameter, called the "query type", that
allows tasks to partition reports into batches in different ways. In the
current draft, the Collector specifies a "query", which the Aggregators use to
guide selection of the batch. Two query types are defined: the "time_interval"
type captures the semantics of draft 01; and the "fixed_size" type allows the
Leader to partition the reports arbitrarily, subject to the constraint that
each batch is roughly the same size. (*)</li>
          <li>Define a new task configuration parameter, called the task "expiration", that
defines the lifetime of a given task.</li>
          <li>Specify requirements for HTTP request authentication rather than a concrete
scheme. (Draft 01 required the use of the <tt>DAP-Auth-Token</tt> header; this is now
optional.)</li>
          <li>Make "task_id" an optional parameter of the "/hpke_config" endpoint.</li>
          <li>Add report count to CollectResp message. (*)</li>
          <li>Increase message payload sizes to accommodate VDAFs with input and aggregate
shares larger than 2^16-1 bytes. (*)</li>
          <li>Bump draft-irtf-cfrg-vdaf-01 to 03 <xref target="VDAF"/>. (*)</li>
          <li>Bump version tag from "dap-01" to "dap-02". (*)</li>
          <li>Rename the report nonce to the "report ID" and move it to the top of the
structure. (*)</li>
          <li>Clarify when it is safe for an Aggregator to evict various data artifacts from
long-term storage.</li>
        </ul>
      </section>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<dl>
          <dt>Aggregate result:</dt>
          <dd>
            <t>The output of the aggregation function computed over a batch of measurements
and an aggregation parameter. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregate share:</dt>
          <dd>
            <t>A share of the aggregate result emitted by an Aggregator. Aggregate shares are
reassembled by the Collector into the aggregate result, which is the final
output of the aggregation function. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregation function:</dt>
          <dd>
            <t>The function computed over the Clients' measurements. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregation parameter:</dt>
          <dd>
            <t>Parameter used to prepare a set of measurements for aggregation (e.g., the
candidate prefixes for Poplar1 from <xref section="8" sectionFormat="of" target="VDAF"/>). As defined in
<xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregator:</dt>
          <dd>
            <t>An endpoint that receives input shares from Clients and validates and
aggregates them with the help of the other Aggregators.</t>
          </dd>
          <dt>Batch:</dt>
          <dd>
            <t>A set of reports (i.e., measurements) that are aggregated into an aggregate
result.</t>
          </dd>
          <dt>Batch duration:</dt>
          <dd>
            <t>The time difference between the oldest and newest report in a batch.</t>
          </dd>
          <dt>Batch interval:</dt>
          <dd>
            <t>A parameter of a query issued by the Collector that specifies the time range
of the reports in the batch.</t>
          </dd>
          <dt>Client:</dt>
          <dd>
            <t>A party that uploads a report.</t>
          </dd>
          <dt>Collector:</dt>
          <dd>
            <t>The endpoint that selects the aggregation parameter and receives the
aggregate result.</t>
          </dd>
          <dt>Helper:</dt>
          <dd>
            <t>The Aggregator that executes the aggregation and collection sub-protocols as
instructed by the Leader.</t>
          </dd>
          <dt>Input share:</dt>
          <dd>
            <t>An Aggregator's share of a measurement. The input shares are output by the
VDAF sharding algorithm. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Output share:</dt>
          <dd>
            <t>An Aggregator's share of the refined measurement resulting from successful
execution of the VDAF preparation phase. Many output shares are combined into
an aggregate share during the VDAF aggregation phase. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Leader:</dt>
          <dd>
            <t>The Aggregator that coordinates aggregation and collection with the Helper.</t>
          </dd>
          <dt>Measurement:</dt>
          <dd>
            <t>A plaintext input emitted by a Client (e.g., a count, summand, or string),
before any encryption or secret sharing is applied. Depending on the VDAF in
use, multiple values may be grouped into a single measurement. As defined in
<xref target="VDAF"/>.</t>
          </dd>
          <dt>Minimum batch size:</dt>
          <dd>
            <t>The minimum number of reports in a batch.</t>
          </dd>
          <dt>Public share:</dt>
          <dd>
            <t>The output of the VDAF sharding algorithm broadcast to each of the
Aggregators. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Report:</dt>
          <dd>
            <t>A cryptographically protected measurement uploaded to the Leader by a Client.
Comprised of a set of report shares.</t>
          </dd>
          <dt>Report Share:</dt>
          <dd>
            <t>An encrypted input share comprising a piece of a report.</t>
          </dd>
        </dl>
        <t>This document uses the presentation language of <xref target="RFC8446"/> to define messages
in the DAP protocol. Encoding and decoding of these messages as byte strings
also follows <xref target="RFC8446"/>.</t>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>The protocol is executed by a large set of Clients and a pair of servers
referred to as "Aggregators". Each Client's input to the protocol is its
measurement (or set of measurements, e.g., counts of some user behavior). Given
the input set of measurements <tt>x_1, ..., x_n</tt> held by <tt>n</tt> Clients, and an
aggregation parameter <tt>p</tt> shared by the Aggregators, the goal of DAP is to
compute <tt>y = F(p, x_1, ..., x_n)</tt> for some function <tt>F</tt> while revealing nothing
else about the measurements. We call <tt>F</tt> the "aggregation function."</t>
      <t>This protocol is extensible and allows for the addition of new cryptographic
schemes that implement the VDAF interface specified in
<xref target="VDAF"/>. Candidates include:</t>
      <ul spacing="normal">
        <li>Prio3 (<xref section="7" sectionFormat="of" target="VDAF"/>), which allows for aggregate statistics such as
sum, mean, histograms, etc.</li>
        <li>Poplar1 (<xref section="8" sectionFormat="of" target="VDAF"/>), which allows for finding the most popular
strings uploaded by a set of Clients (e.g., the URL of their home page) as
well as counting the number of Clients that hold a given string. This VDAF is
the basis of the Poplar protocol of <xref target="BBCGGI21"/>, which is designed to solve
the heavy hitters problem in a privacy preserving manner.</li>
      </ul>
      <t>VDAFs rely on secret sharing to protect the privacy of the measurements. Rather
than sending its input in the clear, each Client shards its measurement into a
pair of "input shares" and sends an input share to each of the Aggregators. This
provides two important properties:</t>
      <ul spacing="normal">
        <li>Given only one of the input shares, it is impossible to deduce the plaintext
measurement from which it was generated.</li>
        <li>It allows the Aggregators to compute the aggregation function by first
aggregating up their input shares locally into "aggregate shares", then
combining the aggregate shares into the aggregate result.</li>
      </ul>
      <section anchor="system-architecture">
        <name>System Architecture</name>
        <t>The overall system architecture is shown in <xref target="dap-topology"/>.</t>
        <figure anchor="dap-topology">
          <name>System Architecture</name>
          <artwork><![CDATA[
+--------+
|        |
| Client +----+
|        |    |
+--------+    |
              |
+--------+    |     +------------+         +-----------+
|        |    +----->            |         |           |
| Client +---------->   Leader   <---------> Collector |
|        |    +----->            |         |           |
+--------+    |     +-----^------+         +-----------+
              |           |
+--------+    |           |
|        |    |           |
| Client +----+     +-----V------+
|        |          |            |
+--------+          |   Helper   |
                    |            |
                    +------------+
]]></artwork>
        </figure>
        <t>The main participants in the protocol are as follows:</t>
        <dl>
          <dt>Collector:</dt>
          <dd>
            <t>The entity which wants to obtain the aggregate of the measurements generated
by the Clients. Any given measurement task will have a single Collector.</t>
          </dd>
          <dt>Client(s):</dt>
          <dd>
            <t>The endpoints which directly take the measurement(s) and report them to the
DAP protocol. In order to provide reasonable levels of privacy, there must be
a large number of Clients.</t>
          </dd>
          <dt>Aggregator:</dt>
          <dd>
            <t>An endpoint which receives report shares. Each Aggregator works with its
co-Aggregator to compute the aggregate result. Any given measurement task
will have two Aggregators: a Leader and a Helper.</t>
          </dd>
          <dt>Leader:</dt>
          <dd>
            <t>The Aggregator responsible for coordinating the protocol. It receives the
reports, splits them into report shares, distributes the report shares to the
Helper, and orchestrates the process of computing the aggregate result as
requested by the Collector.</t>
          </dd>
          <dt>Helper:</dt>
          <dd>
            <t>The Aggregator assisting the Leader with the computation. The protocol is
designed so that the Helper is relatively lightweight, with most of the
operational burdern born by the Leader.</t>
          </dd>
        </dl>
        <t>The basic unit of DAP is the "task" which represents a single measurement
process (though potentially aggregating multiple batches of measurements). The
definition of a task includes the following parameters:</t>
        <ul spacing="normal">
          <li>The type of each measurement.</li>
          <li>The aggregation function to compute (e.g., sum, mean, etc.).</li>
          <li>The set of Aggregators and necessary cryptographic keying material to use.</li>
          <li>The VDAF to execute, which to some extent is dictated by the previous choices.</li>
          <li>The minimum "batch size" of reports which can be aggregated.</li>
          <li>The rate at which measurements can be taken, i.e., the "minimum batch
duration".</li>
        </ul>
        <t>These parameters are distributed to the Clients, Aggregators, and Collector
before the task begins. This document does not specify a distribution
mechanism, but it is important that all protocol participants agree on the
task's configuration. Each task is identified by a unique 32-byte ID which is
used to refer to it in protocol messages.</t>
        <t>During the lifetime of a task, each Client records its own measurement
value(s), packages them up into a report, and sends them to the Leader. Each
share is separately encrypted for each Aggregator so that even though they pass
through the Leader, the Leader is unable to see or modify them. Depending on
the task, the Client may only send one report or may send many reports over
time.</t>
        <t>The Leader distributes the shares to the Helper and orchestrates the process of
verifying them (see <xref target="validating-inputs"/>) and assembling them into a final
aggregate result for the Collector. Depending on the VDAF, it may be possible to
incrementally process each report as it comes in, or may be necessary to wait
until the entire batch of reports is received.</t>
      </section>
      <section anchor="validating-inputs">
        <name>Validating Inputs</name>
        <t>An essential task of any data collection pipeline is ensuring that the data
being aggregated is "valid". In DAP, input validation is complicated by the fact
that none of the entities other than the Client ever sees that Client's
plaintext measurement.</t>
        <t>In order to address this problem, the Aggregators engage in a secure,
multi-party computation specified by the chosen VDAF <xref target="VDAF"/> in order to
prepare a report for aggregation. At the beginning of this computation, each
Aggregator is in possession of an input share uploaded by the Client. At the end
of the computation, each Aggregator is in possession of either an "output share"
that is ready to be aggregated or an indication that a valid output share could
not be computed.</t>
        <t>To facilitate this computation, the input shares generated by the Client
include information used by the Aggregators during aggregation in order to
validate their corresponding output shares. For example, Prio3 includes a
zero-knowledge proof of the input's validity (see <xref section="7.1" sectionFormat="of" target="VDAF"/>).
which the Aggregators can jointly verify and reject the report if it cannot be
verified. However, they do not learn anything about the individual report other
than that it is valid.</t>
        <t>The specific properties attested to in the proof vary depending on the
measurement being taken. For instance, to measure the time the user took
performing a given task the proof might demonstrate that the value reported was
within a certain range (e.g., 0-60 seconds). By contrast, to report which of a
set of <tt>N</tt> options the user select, the report might contain <tt>N</tt> integers and
the proof would demonstrate that <tt>N-1</tt> were <tt>0</tt> and the other was <tt>1</tt>.</t>
        <t>It is important to recognize that "validity" is distinct from "correctness". For
instance, the user might have spent 30s on a task but the Client might report
60s. This is a problem with any measurement system and DAP does not attempt to
address it; it merely ensures that the data is within acceptable limits, so the
Client could not report 10^6s or -20s.</t>
      </section>
    </section>
    <section anchor="message-transport">
      <name>Message Transport</name>
      <t>Communications between DAP participants are carried over HTTPS <xref target="RFC9110"/>.
HTTPS provides server authentication and confidentiality. Use of HTTPS is
<bcp14>REQUIRED</bcp14>.</t>
      <section anchor="request-authentication">
        <name>HTTPS Request Authentication</name>
        <t>DAP is made up of several sub-protocols in which different subsets of the
protocol's participants interact with each other.</t>
        <t>In those cases where a channel between two participants is tunneled through
another protocol participant, DAP mandates the use of public-key encryption
using <xref target="HPKE"/> to ensure that only the intended recipient can see a
message in the clear.</t>
        <t>In other cases, DAP requires HTTPS client authentication. Any authentication
scheme that is composable with HTTP is allowed. For example:</t>
        <ul spacing="normal">
          <li>
            <xref target="OAuth2"/> credentials are presented in an Authorization HTTP header,
which can be added to any DAP protocol message.</li>
          <li>TLS client certificates can be used to authenticate the underlying transport.</li>
        </ul>
        <t>This flexibility allows organizations deploying DAP to use existing well-known
HTTP authentication mechanisms that they already support. Discovering what
authentication mechanisms are supported by a DAP participant is outside of this
document's scope.</t>
      </section>
      <section anchor="errors">
        <name>Errors</name>
        <t>Errors can be reported in DAP both at the HTTP layer and within challenge
objects as defined in <xref target="iana-considerations"/>. DAP servers can return responses
with an HTTP error response code (4XX or 5XX). For example, if the Client
submits a request using a method not allowed in this document, then the server
<bcp14>MAY</bcp14> return HTTP status code 405 Method Not Allowed.</t>
        <t>When the server responds with an error status, it <bcp14>SHOULD</bcp14> provide additional
information using a problem document <xref target="RFC7807"/>. To facilitate automatic
response to errors, this document defines the following standard tokens for use
in the "type" field (within the DAP URN namespace
"urn:ietf:params:ppm:dap:error:"):</t>
        <table>
          <thead>
            <tr>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">invalidMessage</td>
              <td align="left">A message received by a protocol participant could not be parsed or otherwise was invalid.</td>
            </tr>
            <tr>
              <td align="left">unrecognizedTask</td>
              <td align="left">An endpoint received a message with an unknown task ID.</td>
            </tr>
            <tr>
              <td align="left">unrecognizedAggregationJob</td>
              <td align="left">An endpoint received a message with an unknown aggregation job ID.</td>
            </tr>
            <tr>
              <td align="left">outdatedConfig</td>
              <td align="left">The message was generated using an outdated configuration.</td>
            </tr>
            <tr>
              <td align="left">reportRejected</td>
              <td align="left">Report could not be processed for an unspecified reason.</td>
            </tr>
            <tr>
              <td align="left">reportTooEarly</td>
              <td align="left">Report could not be processed because its timestamp is too far in the future.</td>
            </tr>
            <tr>
              <td align="left">batchInvalid</td>
              <td align="left">The batch boundary check for Collector's query failed.</td>
            </tr>
            <tr>
              <td align="left">invalidBatchSize</td>
              <td align="left">There are an invalid number of reports in the batch.</td>
            </tr>
            <tr>
              <td align="left">batchQueriedTooManyTimes</td>
              <td align="left">The maximum number of batch queries has been exceeded for one or more reports included in the batch.</td>
            </tr>
            <tr>
              <td align="left">batchMismatch</td>
              <td align="left">Aggregators disagree on the report shares that were aggregated in a batch.</td>
            </tr>
            <tr>
              <td align="left">unauthorizedRequest</td>
              <td align="left">Authentication of an HTTP request failed (see <xref target="request-authentication"/>).</td>
            </tr>
            <tr>
              <td align="left">missingTaskID</td>
              <td align="left">HPKE configuration was requested without specifying a task ID.</td>
            </tr>
            <tr>
              <td align="left">stepMismatch</td>
              <td align="left">The Aggregators disagree on the current step of the DAP aggregation protocol.</td>
            </tr>
            <tr>
              <td align="left">batchOverlap</td>
              <td align="left">A request's query includes reports that were previously collected in a different batch.</td>
            </tr>
          </tbody>
        </table>
        <t>This list is not exhaustive. The server <bcp14>MAY</bcp14> return errors set to a URI other
than those defined above. Servers <bcp14>MUST NOT</bcp14> use the DAP URN namespace for errors
not listed in the appropriate IANA registry (see <xref target="urn-space"/>). The "detail"
member of the Problem Details document includes additional diagnostic
information.</t>
        <t>When the task ID is known (see <xref target="task-configuration"/>), the problem document
<bcp14>SHOULD</bcp14> include an additional "taskid" member containing the ID encoded in Base
64 using the URL and filename safe alphabet with no padding defined in
Sections <xref target="RFC4648" section="5" sectionFormat="bare"/> and <xref target="RFC4648" section="3.2" sectionFormat="bare"/> of <xref target="RFC4648"/>.</t>
        <t>In the remainder of this document, the tokens in the table above are used to
refer to error types, rather than the full URNs. For example, an "error of type
'invalidMessage'" refers to an error document with "type" value
"urn:ietf:params:ppm:dap:error:invalidMessage".</t>
        <t>This document uses the verbs "abort" and "alert with [some error message]" to
describe how protocol participants react to various error conditions. This
implies HTTP status code 400 Bad Request unless explicitly specified otherwise.</t>
      </section>
    </section>
    <section anchor="protocol-definition">
      <name>Protocol Definition</name>
      <t>DAP has three major interactions which need to be defined:</t>
      <ul spacing="normal">
        <li>Uploading reports from the Client to the Aggregators, specified in
<xref target="upload-flow"/></li>
        <li>Computing the results for a given measurement task, specified in
<xref target="aggregate-flow"/></li>
        <li>Collecting aggregated results, specified in <xref target="collect-flow"/></li>
      </ul>
      <t>Each of these interactions is defined in terms of "resources". In this section
we define these resources and the messages used to act on them.</t>
      <t>The following are some basic type definitions used in other messages:</t>
      <artwork><![CDATA[
/* ASCII encoded URL. e.g., "https://example.com" */
opaque Url<1..2^16-1>;

uint64 Duration; /* Number of seconds elapsed between two instants */

uint64 Time; /* seconds elapsed since start of UNIX epoch */

/* An interval of time of length duration, where start is included and (start +
duration) is excluded. */
struct {
  Time start;
  Duration duration;
} Interval;

/* An ID used to uniquely identify a report in the context of a DAP task. */
opaque ReportID[16];

/* The various roles in the DAP protocol. */
enum {
  collector(0),
  client(1),
  leader(2),
  helper(3),
  (255)
} Role;

/* Identifier for a server's HPKE configuration */
uint8 HpkeConfigId;

/* An HPKE ciphertext. */
struct {
  HpkeConfigId config_id;    /* config ID */
  opaque enc<1..2^16-1>;     /* encapsulated HPKE key */
  opaque payload<1..2^32-1>; /* ciphertext */
} HpkeCiphertext;

/* Represent a zero-length byte string. */
struct {} Empty;
]]></artwork>
      <t>DAP uses the 16-byte <tt>ReportID</tt> as the nonce parameter for the VDAF
<tt>measurement_to_input_shares</tt> and <tt>prep_init</tt> methods (see <xref section="5" sectionFormat="comma" target="VDAF"/>). Thus for a VDAF to be compatible with DAP, it <bcp14>MUST</bcp14> specify a <tt>NONCE_SIZE</tt>
of 16 bytes.</t>
      <section anchor="query">
        <name>Queries</name>
        <t>Aggregated results are computed based on sets of reports, called "batches". The
Collector influences which reports are used in a batch via a "query." The
Aggregators use this query to carry out the aggregation flow and produce
aggregate shares encrypted to the Collector.</t>
        <t>This document defines the following query types:</t>
        <artwork><![CDATA[
enum {
  reserved(0), /* Reserved for testing purposes */
  time_interval(1),
  fixed_size(2),
  (255)
} QueryType;
]]></artwork>
        <t>The time_interval query type is described in <xref target="time-interval-query"/>; the
fixed_size query type is described in <xref target="fixed-size-query"/>. Future
specifications may introduce new query types as needed (see <xref target="query-type-reg"/>).
A query includes parameters used by the Aggregators to select a batch of reports
specific to the given query type. A query is defined as follows:</t>
        <artwork><![CDATA[
opaque BatchID[32];

enum {
  by_batch_id(0),
  current_batch(1),
} FixedSizeQueryType;

struct {
  FixedSizeQueryType query_type;
  select (FixedSizeQuery.query_type) {
    by_batch_id: BatchID batch_id;
    current_batch: Empty;
  }
} FixedSizeQuery;

struct {
  QueryType query_type;
  select (Query.query_type) {
    case time_interval: Interval batch_interval;
    case fixed_size: FixedSizeQuery fixed_size_query;
  }
} Query;
]]></artwork>
        <t>The parameters pertaining to each query type are described in one of the
subsections below. The query is issued in-band as part of the collect
sub-protocol (<xref target="collect-flow"/>). Its content is determined by the "query type",
which in turn is encoded by the "query configuration" configured out-of-band.
All query types have the following configuration parameters in common:</t>
        <ul spacing="normal">
          <li>
            <tt>min_batch_size</tt> - The smallest number of reports the batch is allowed to
include. In a sense, this parameter controls the degree of privacy that will
be obtained: the larger the minimum batch size, the higher degree of privacy.
However, this ultimately depends on the application and the nature of the
measurements and aggregation function.</li>
          <li>
            <tt>time_precision</tt> - Clients use this value to truncate their report timestamps;
see <xref target="upload-flow"/>. Additional semantics may apply, depending on the query
type. (See <xref target="batch-validation"/> for details.)</li>
        </ul>
        <t>The parameters pertaining to specific query types are described in the relevant
subsection below.</t>
        <section anchor="time-interval-query">
          <name>Time-interval Queries</name>
          <t>The first query type, <tt>time_interval</tt>, is designed to support applications in
which reports are collected over a long period of time. The Collector specifies
a "batch interval" that determines the time range for reports included in the
batch. For each report in the batch, the time at which that report was generated
(see <xref target="upload-flow"/>) <bcp14>MUST</bcp14> fall within the batch interval specified by the
Collector.</t>
          <t>Typically the Collector issues queries for which the batch intervals are
continuous, monotonically increasing, and have the same duration. For example,
the sequence of batch intervals <tt>(1659544000, 1000)</tt>, <tt>(1659545000, 1000)</tt>,
<tt>(1659546000, 1000)</tt>, <tt>(1659547000, 1000)</tt> satisfies these conditions. (The
first element of the pair denotes the start of the batch interval and the second
denotes the duration.) Of course, there are cases in which Collector may need to
issue queries out-of-order. For example, a previous batch might need to be
queried again with a different aggregation parameter (e.g, for Poplar1). In
addition, the Collector may need to vary the duration to adjust to changing
report upload rates.</t>
        </section>
        <section anchor="fixed-size-query">
          <name>Fixed-size Queries</name>
          <t>The <tt>fixed_size</tt> query type is used to support applications in which the
Collector needs the ability to strictly control the sample size. This is
particularly important for controlling the amount of noise added to reports by
Clients (or added to aggregate shares by Aggregators) in order to achieve
differential privacy.</t>
          <t>For this query type, the Aggregators group reports into arbitrary batches such
that each batch has roughly the same number of reports. These batches are
identified by opaque "batch IDs", allocated in an arbitrary fashion by the
Leader.</t>
          <t>To get the aggregate of a batch, the Collector issues a query specifying the
batch ID of interest (see <xref target="query"/>). The Collector may not know which batch ID
it is interested in; in this case, it can also issue a query of type
<tt>current_batch</tt>, which allows the Leader to select a recent batch to aggregate.
The Leader <bcp14>SHOULD</bcp14> select a batch which has not yet began collection.</t>
          <t>In addition to the minimum batch size common to all query types, the
configuration includes a parameter <tt>max_batch_size</tt> that determines maximum
number of reports per batch.</t>
          <t>Implementation note: The goal for the Aggregators is to aggregate precisely
<tt>min_batch_size</tt> reports per batch. Doing so, however, may be challenging for
Leader deployments in which multiple, independent nodes running the aggregate
sub-protocol (see <xref target="aggregate-flow"/>) need to be coordinated. The maximum batch
size is intended to allow room for error. Typically the difference between the
minimum and maximum batch size will be a small fraction of the target batch size
for each batch.</t>
          <t>[OPEN ISSUE: It may be feasible to require a fixed batch size, i.e.,
<tt>min_batch_size == max_batch_size</tt>. We should know better once we've had some
implementation/deployment experience.]</t>
        </section>
      </section>
      <section anchor="task-configuration">
        <name>Task Configuration</name>
        <t>Prior to the start of execution of the protocol, each participant must agree on
the configuration for each task. A task is uniquely identified by its task ID:</t>
        <artwork><![CDATA[
opaque TaskID[32];
]]></artwork>
        <t>The task ID value <bcp14>MUST</bcp14> be a globally unique sequence of bytes. Each task has
the following parameters associated with it:</t>
        <ul spacing="normal">
          <li>
            <tt>leader_aggregator_endpoint</tt>: A URL relative to which the Leader's API
endpoints can be found.</li>
          <li>
            <tt>helper_aggregator_endpoint</tt>: A URL relative to which the Helper's API
endpoints can be found.</li>
          <li>The query configuration for this task (see <xref target="query"/>). This determines the
query type for batch selection and the properties that all batches for this
task must have.</li>
          <li>
            <tt>max_batch_query_count</tt>: The maximum number of times a batch of reports may be
queried by the Collector.</li>
          <li>
            <tt>task_expiration</tt>: The time up to which Clients are expected to upload to this
task. The task is considered completed after this time. Aggregators <bcp14>MAY</bcp14> reject
reports that have timestamps later than <tt>task_expiration</tt>.</li>
          <li>A unique identifier for the VDAF in use for the task, e.g., one of the VDAFs
defined in <xref section="10" sectionFormat="of" target="VDAF"/>.</li>
        </ul>
        <t>In addition, in order to facilitate the aggregation and collect protocols, each
of the Aggregators is configured with following parameters:</t>
        <ul spacing="normal">
          <li>
            <tt>collector_hpke_config</tt>: The <xref target="HPKE"/> configuration of the Collector
(described in <xref target="hpke-config"/>); see <xref target="compliance"/> for information about the
HPKE configuration algorithms.</li>
          <li>
            <tt>vdaf_verify_key</tt>: The VDAF verification key shared by the Aggregators. This
key is used in the aggregation sub-protocol (<xref target="aggregate-flow"/>). The security
requirements are described in <xref target="verification-key"/>.</li>
        </ul>
        <t>Finally, the Collector is configured with the HPKE secret key corresponding to
<tt>collector_hpke_config</tt>.</t>
        <t>A task's parameters are immutable for the lifetime of that task. The only way to
change parameters or to rotate secret values like collector HPKE configuration
or the VDAF verification key is to configure a new task.</t>
      </section>
      <section anchor="resource-uris">
        <name>Resource URIs</name>
        <t>DAP is defined in terms of "resources", such as reports (<xref target="upload-flow"/>),
aggregation jobs (<xref target="aggregate-flow"/>), and collection jobs (<xref target="collect-flow"/>).
Each resource has an associated URI. Resource URIs are specified by a sequence
of string literals and variables. Variables are expanded into strings according
to the following rules:</t>
        <ul spacing="normal">
          <li>Variables <tt>{leader}</tt> and <tt>{helper}</tt> are replaced with the base URL of the
Leader and Helper respectively (the base URL is defined in
<xref target="task-configuration"/>).</li>
          <li>Variables <tt>{task-id}</tt>, <tt>{aggregation-job-id}</tt>, and <tt>{collection-job-id}</tt> are
replaced with the task ID (<xref target="task-configuration"/>), aggregation job ID
(<xref target="agg-init"/>), and collection job ID (<xref target="collect-init"/>) respectively. The
value <bcp14>MUST</bcp14> be encoded in its URL-safe, unpadded Base 64 representation as
specified in Sections <xref target="RFC4648" section="5" sectionFormat="bare"/> and <xref target="RFC4648" section="3.2" sectionFormat="bare"/> of <xref target="RFC4648"/>.</li>
        </ul>
        <t>For example, resource URI <tt>{leader}/tasks/{task-id}/reports</tt> might be expanded
into:
~~~
https://example.com/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/reports
~~~</t>
      </section>
      <section anchor="upload-flow">
        <name>Uploading Reports</name>
        <t>Clients periodically upload reports to the Leader. Each report contains two
"report shares", one for the Leader and another for the Helper. The Helper's
report share is transmitted by the Leader during the aggregation sub-protocol
(see <xref target="aggregate-flow"/>).</t>
        <section anchor="hpke-config">
          <name>HPKE Configuration Request</name>
          <t>Before the Client can upload its report to the Leader, it must know the HPKE
configuration of each Aggregator. See <xref target="compliance"/> for information on HPKE
algorithm choices.</t>
          <t>Clients retrieve the HPKE configuration from each Aggregator by sending an HTTP
GET request to <tt>{aggregator}/hpke_config</tt>. Clients <bcp14>MAY</bcp14> specify a query parameter
<tt>task_id</tt> whose value is the task ID whose HPKE configuration they want. If the
Aggregator does not recognize the task ID, then it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>An Aggregator is free to use different HPKE configurations for each task with
which it is configured. If the task ID is missing from  the Client's request,
the Aggregator <bcp14>MAY</bcp14> abort with an error of type <tt>missingTaskID</tt>, in which case
the Client <bcp14>SHOULD</bcp14> retry the request with a well-formed task ID included.</t>
          <t>An Aggregator responds to well-formed requests with HTTP status code 200 OK and
an <tt>HpkeConfigList</tt> value, with media type "application/dap-hpke-config-list".
The <tt>HpkeConfigList</tt> structure contains one or more <tt>HpkeConfig</tt> structures in
decreasing order of preference. This allows an Aggregator to support multiple
HPKE configurations simultaneously.</t>
          <t>[TODO: Allow Aggregators to return HTTP status code 403 Forbidden in deployments
that use authentication to avoid leaking information about which tasks exist.]</t>
          <artwork><![CDATA[
HpkeConfig HpkeConfigList<1..2^16-1>;

struct {
  HpkeConfigId id;
  HpkeKemId kem_id;
  HpkeKdfId kdf_id;
  HpkeAeadId aead_id;
  HpkePublicKey public_key;
} HpkeConfig;

opaque HpkePublicKey<1..2^16-1>;
uint16 HpkeAeadId; /* Defined in [HPKE] */
uint16 HpkeKemId;  /* Defined in [HPKE] */
uint16 HpkeKdfId;  /* Defined in [HPKE] */
]]></artwork>
          <t>[OPEN ISSUE: Decide whether to expand the width of the id.]</t>
          <t>Aggregators <bcp14>MUST</bcp14> allocate distinct id values for each <tt>HpkeConfig</tt> in an
<tt>HpkeConfigList</tt>.</t>
          <t>The Client <bcp14>MUST</bcp14> abort if any of the following happen for any HPKE config
request:</t>
          <ul spacing="normal">
            <li>the GET request failed or did not return a valid HPKE config list;</li>
            <li>the HPKE config list is empty; or</li>
            <li>no HPKE config advertised by the Aggregator specifies a supported a KEM, KDF,
or AEAD algorithm triple.</li>
          </ul>
          <t>Aggregators <bcp14>SHOULD</bcp14> use HTTP caching to permit client-side caching of this
resource <xref target="RFC5861"/>. Aggregators <bcp14>SHOULD</bcp14> favor long cache lifetimes to avoid
frequent cache revalidation, e.g., on the order of days. Aggregators can control
this cached lifetime with the Cache-Control header, as follows:</t>
          <artwork><![CDATA[
  Cache-Control: max-age=86400
]]></artwork>
          <t>Clients <bcp14>SHOULD</bcp14> follow the usual HTTP caching <xref target="RFC9111"/> semantics for HPKE
configurations.</t>
          <t>Note: Long cache lifetimes may result in Clients using stale HPKE
configurations; Aggregators <bcp14>SHOULD</bcp14> continue to accept reports with old keys for
at least twice the cache lifetime in order to avoid rejecting reports.</t>
        </section>
        <section anchor="upload-request">
          <name>Upload Request</name>
          <t>Clients upload reports by using an HTTP PUT to
<tt>{leader}/tasks/{task-id}/reports</tt>. The payload is a <tt>Report</tt>, with media type
"application/dap-report", structured as follows:</t>
          <artwork><![CDATA[
struct {
  ReportID report_id;
  Time time;
} ReportMetadata;

struct {
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
  HpkeCiphertext leader_encrypted_input_share;
  HpkeCiphertext helper_encrypted_input_share;
} Report;
]]></artwork>
          <ul spacing="normal">
            <li>
              <t><tt>report_metadata</tt> is public metadata describing the report.  </t>
              <ul spacing="normal">
                <li>
                  <tt>report_id</tt> is used by the Aggregators to ensure the report appears in at
most one batch (see <xref target="input-share-validation"/>). The Client <bcp14>MUST</bcp14> generate
this by generating 16 random bytes using a cryptographically secure random
number generator.</li>
                <li>
                  <tt>time</tt> is the time at which the report was generated. The Client <bcp14>SHOULD</bcp14>
round this value down to the nearest multiple of the task's
<tt>time_precision</tt> in order to ensure that that the timestamp cannot be used
to link a report back to the Client that generated it.</li>
              </ul>
            </li>
            <li>
              <tt>public_share</tt> is the public share output by the VDAF sharding algorithm. Note
that the public share might be empty, depending on the VDAF.</li>
            <li>
              <tt>leader_encrypted_input_share</tt> is the Leader's encrypted input share.</li>
            <li>
              <tt>helper_encrypted_input_share</tt> is the Helper's encrypted input share.</li>
          </ul>
          <t>To generate a report, the Client begins by sharding its measurement into input
shares and the public share using the VDAF's sharding algorithm (<xref section="5.1" sectionFormat="of" target="VDAF"/>), using the report ID as the nonce:</t>
          <artwork><![CDATA[
(public_share, input_shares) = VDAF.measurement_to_input_shares(
    measurement, /* plaintext measurement */
    report_id,   /* nonce */
    rand,        /* randomness for sharding algorithm */
)
]]></artwork>
          <t>The last input comprises the randomness consumed by the sharding algorithm. The
sharding randomness is a random byte string of length specified by the VDAF. The
Client <bcp14>MUST</bcp14> generate this using a cryptographically secure random number
generator.</t>
          <t>The Client then wraps each input share in the following structure:</t>
          <artwork><![CDATA[
struct {
  Extension extensions<0..2^16-1>;
  opaque payload<0..2^32-1>;
} PlaintextInputShare;
]]></artwork>
          <t>Field <tt>extensions</tt> is set to the list of extensions intended to be consumed by
the given Aggregator. (See <xref target="upload-extensions"/>.) Field <tt>payload</tt> is set to the
Aggregator's input share output by the VDAF sharding algorithm.</t>
          <t>Next, the Client encrypts each PlaintextInputShare <tt>plaintext_input_share</tt> as
follows:</t>
          <artwork><![CDATA[
enc, payload = SealBase(pk,
  "dap-05 input share" || 0x01 || server_role,
  input_share_aad, plaintext_input_share)
]]></artwork>
          <t>where <tt>pk</tt> is the Aggregator's public key; <tt>server_role</tt> is the Role of the
intended recipient (<tt>0x02</tt> for the Leader and <tt>0x03</tt> for the Helper),
<tt>plaintext_input_share</tt> is the Aggregator's PlaintextInputShare, and
<tt>input_share_aad</tt> is an encoded message of type InputShareAad defined below,
constructed from the same values as the corresponding fields in the report. The
<tt>SealBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the HPKE configuration.</t>
          <artwork><![CDATA[
struct {
  TaskID task_id;
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
} InputShareAad;
]]></artwork>
          <t>The Leader responds to well-formed requests with HTTP status code 201
Created. Malformed requests are handled as described in <xref target="errors"/>.
Clients <bcp14>SHOULD NOT</bcp14> upload the same measurement value in more than one report if
the Leader responds with HTTP status code 201 Created.</t>
          <t>If the Leader does not recognize the task ID, then it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>The Leader responds to requests whose Leader encrypted input share uses an
out-of-date or unknown <tt>HpkeConfig.id</tt> value, indicated by
<tt>HpkeCiphertext.config_id</tt>, with error of type 'outdatedConfig'. When the Client
receives an 'outdatedConfig' error, it <bcp14>SHOULD</bcp14> invalidate any cached
HpkeConfigList and retry with a freshly generated Report. If this retried upload
does not succeed, the Client <bcp14>SHOULD</bcp14> abort and discontinue retrying.</t>
          <t>If a report's ID matches that of a previously uploaded report, the Leader <bcp14>MUST</bcp14>
ignore it. In addition, it <bcp14>MAY</bcp14> alert the Client with error <tt>reportRejected</tt>. See
the implementation note in <xref target="input-share-validation"/>.</t>
          <t>The Leader <bcp14>MUST</bcp14> ignore any report pertaining to a batch that has already been
collected (see <xref target="input-share-validation"/> for details). Otherwise, comparing
the aggregate result to the previous aggregate result may result in a privacy
violation. Note that this is also enforced by the Helper during the aggregation
sub-protocol. The Leader <bcp14>MAY</bcp14> also abort the upload protocol and alert the
Client with error <tt>reportRejected</tt>.</t>
          <t>The Leader <bcp14>MAY</bcp14> ignore any report whose timestamp is past the task's
<tt>task_expiration</tt>. When it does so, it <bcp14>SHOULD</bcp14> also abort the upload protocol and
alert the Client with error <tt>reportRejected</tt>. Client <bcp14>MAY</bcp14> choose to opt out of
the task if its own clock has passed <tt>task_expiration</tt>.</t>
          <t>The Leader may need to buffer reports while waiting to aggregate them (e.g.,
while waiting for an aggregation parameter from the Collector; see
<xref target="collect-flow"/>). The Leader <bcp14>SHOULD NOT</bcp14> accept reports whose timestamps are too
far in the future. Implementors <bcp14>MAY</bcp14> provide for some small leeway, usually no
more than a few minutes, to account for clock skew. If the Leader rejects a
report for this reason, it <bcp14>SHOULD</bcp14> abort the upload protocol and alert the Client
with error <tt>reportTooEarly</tt>. In this situation, the Client <bcp14>MAY</bcp14> re-upload the
report later on.</t>
          <t>If the Leader's input share contains an unrecognized extension, or if two
extensions have the same ExtensionType, then the Leader <bcp14>MAY</bcp14> abort the upload
request with error "invalidMessage". Note that this behavior is not mandatory
because it requires the Leader to decrypt its input share.</t>
        </section>
        <section anchor="upload-extensions">
          <name>Upload Extensions</name>
          <t>Each PlaintextInputShare carries a list of extensions that Clients use to convey
additional information to the Aggregator. Some extensions might be intended for
both Aggregators; others may only be intended for a specific Aggregator. (For
example, a DAP deployment might use some out-of-band mechanism for an Aggregator
to verify that reports come from authenticated Clients. It will likely be useful
to bind the extension to the input share via HPKE encryption.)</t>
          <t>Each extension is a tag-length encoded value of the following form:</t>
          <artwork><![CDATA[
struct {
  ExtensionType extension_type;
  opaque extension_data<0..2^16-1>;
} Extension;

enum {
  TBD(0),
  (65535)
} ExtensionType;
]]></artwork>
          <t>Field "extension_type" indicates the type of extension, and "extension_data"
contains information specific to the extension.</t>
          <t>Extensions are mandatory-to-implement: If an Aggregator receives a report
containing an extension it does not recognize, then it <bcp14>MUST</bcp14> reject the report.
(See <xref target="input-share-validation"/> for details.)</t>
        </section>
        <section anchor="upload-message-security">
          <name>Upload Message Security</name>
          <t>The contents of each input share must be kept confidential from everyone but the
Client and the Aggregator it is being sent to. In addition, Clients must be able
to authenticate the Aggregator they upload to.</t>
          <t>HTTPS provides confidentiality between the DAP Client and the Leader, but this
is not sufficient since the Helper's report shares are relayed through the
Leader. Confidentiality of report shares is achieved by encrypting each report
share to a public key held by the respective Aggregator using <xref target="HPKE"/>. Clients
fetch the public keys from each Aggregator over HTTPS, allowing them to
authenticate the server.</t>
          <t>Aggregators <bcp14>MAY</bcp14> require Clients to authenticate when uploading reports. This is
an effective mitigation against Sybil <xref target="Dou02"/> attacks in deployments where it
is practical for each Client to have an identity provisioned (e.g., a user
logged into an online service or a hardware device programmed with an identity).
If it is used, Client authentication <bcp14>MUST</bcp14> use a scheme that meets the
requirements in <xref target="request-authentication"/>.</t>
          <t>In some deployments, it will not be practical to require Clients to authenticate
(e.g., a widely distributed application that does not require its users to login
to any service), so Client authentication is not mandatory in DAP.</t>
          <t>[[OPEN ISSUE: deployments that don't have client auth will need to do something
about Sybil attacks. Is there any useful guidance or <bcp14>SHOULD</bcp14> we can provide? Sort
of relevant: issue #89]]</t>
        </section>
      </section>
      <section anchor="aggregate-flow">
        <name>Verifying and Aggregating Reports</name>
        <t>Once a set of Clients have uploaded their reports to the Leader, the Leader can
begin the process of validating and aggregating them with the Helper. To enable
the system to handle large batches of reports, this process can be parallelized
across many "aggregation jobs" in which small subsets of the reports are
processed independently. Each aggregation job is associated with exactly one DAP
task, but a task can have many aggregation jobs.</t>
        <t>The primary objective of an aggregation job is to run the VDAF preparation
process described in <xref section="5.2" sectionFormat="comma" target="VDAF"/> for each report in the job.
Preparation has two purposes:</t>
        <ol spacing="normal" type="1"><li>To "refine" the input shares into "output shares" that have the desired
aggregatable form. For some VDAFs, like Prio3, the mapping from input to
output shares is some fixed, linear operation, but in general the mapping is
controlled dynamically by the Collector and can be non-linear. In
Poplar1, for example, the refinement process involves a sequence of
"candidate prefixes" and the output consists of a sequence of zeros and ones,
each indicating whether the corresponding candidate is a prefix of the
measurement from which the input shares were generated.</li>
          <li>To verify that the output shares, when combined, correspond to a valid,
refined measurement, where validity is determined by the VDAF itself. For
example, the Prio3Sum variant of Prio3 (<xref section="7.4.2" sectionFormat="of" target="VDAF"/>) requires
that the output shares sum up to an integer in a specific range; for Poplar1,
the output shares are required to sum up to a vector that is non-zero in at
most one position.</li>
        </ol>
        <t>In general, refinement and verification are not distinct computations, since for
some VDAFs, verification may only be achieved implicitly as a result of the
refinement process. We instead think of these as properties of the output shares
themselves: if preparation succeeds, then the resulting output shares are
guaranteed to combine into a valid, refined measurement.</t>
        <t>VDAF preparation is mapped onto an aggregation job as illustrated in
<xref target="agg-flow"/>. The protocol is comprised of a sequence of HTTP requests from the
Leader to the Helper, the first of which includes the aggregation parameter, the
Helper's report share for each report in the job, and for each report the
initialization step for preparation. The Helper's response, along with each
subsequent request and response, carries the remaining messages exchanged during
preparation.</t>
        <figure anchor="agg-flow">
          <name>Overview of the DAP aggregation sub-protocol.</name>
          <sourcecode type="ladder"><![CDATA[
  report, agg_param
   |
   v
+--------+                                         +--------+
| Leader |                                         | Helper |
+--------+                                         +--------+
   | AggregationJobInitReq:                              |
   |   agg_param, prep_init                              |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                               prep_resp(continue)   |
   |<----------------------------------------------------|
   | AggregationJobContinueReq:                          |
   |   prep_continue                                     |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                               prep_resp(continue)   |
   |<----------------------------------------------------|
   |                                                     |
  ...                                                   ...
   |                                                     |
   | AggregationJobContinueReq:                          |
   |   prep_continue                                     |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                      prep_resp(continue|finished)   |
   |<----------------------------------------------------|
   |                                                     |
   v                                                     v
  leader_out_share                         helper_out_share
]]></sourcecode>
        </figure>
        <t>The number of steps, and the type of the responses, depends on the VDAF. The
message structures and processing rules are specified in the following
subsections.</t>
        <t>In general, reports cannot be aggregated until the Collector specifies an
aggregation parameter. However, in some situations it is possible to begin
aggregation as soon as reports arrive. For example, Prio3 has just one valid
aggregation parameter (the empty string). And there are use cases for Poplar1
in which aggregation can begin immediately (i.e., those for which the candidate
prefixes/strings are fixed in advance).</t>
        <t>An aggregation job can be thought of as having three phases:</t>
        <ul spacing="normal">
          <li>Initialization: Begin the aggregation flow by disseminating report shares and
initializing the VDAF prep state for each report.</li>
          <li>Continuation: Continue the aggregation flow by exchanging prep shares and
messages until preparation completes or an error occurs.</li>
          <li>Completion: Finish the aggregate flow, yielding an output share corresponding
to each report share in the aggregation job.</li>
        </ul>
        <t>These phases are described in the following subsections.</t>
        <section anchor="agg-init">
          <name>Aggregate Initialization</name>
          <t>The Leader begins an aggregation job by choosing a set of candidate reports that
pertain to the same DAP task and a job ID which <bcp14>MUST</bcp14> be unique within the scope
of the task. The job ID is a 16-byte value, structured as follows:</t>
          <artwork><![CDATA[
opaque AggregationJobID[16];
]]></artwork>
          <t>The Leader can run this process for many sets of candidate reports in parallel
as needed. After choosing a set of candidates, the Leader begins aggregation by
splitting each report into report shares, one for each Aggregator. The Leader
and Helper then run the aggregate initialization flow to accomplish two tasks:</t>
          <ol spacing="normal" type="1"><li>Recover and determine which input report shares are valid.</li>
            <li>For each valid report share, initialize the VDAF preparation process (see
<xref section="5.2" sectionFormat="of" target="VDAF"/>).</li>
          </ol>
          <t>The Leader and Helper initialization behavior is detailed below.</t>
          <section anchor="leader-init">
            <name>Leader Initialization</name>
            <t>The Leader begins the aggregate initialization phase with the set of candidate
reports as follows:</t>
            <ol spacing="normal" type="1"><li>Generate a fresh AggregationJobID.</li>
              <li>Decrypt the input share for each report share as described in
<xref target="input-share-decryption"/>.</li>
              <li>Check that the resulting input share is valid as described in
<xref target="input-share-validation"/>.</li>
            </ol>
            <t>If any step invalidates the report, the Leader rejects the report and removes
it from the set of candidate reports.</t>
            <t>Next, for each report the Leader executes the following procedure:</t>
            <artwork><![CDATA[
state = VDAF.ping_pong_start(vdaf_verify_key,
                             True,
                             agg_param,
                             report_id,
                             public_share,
                             plaintext_input_share.payload)
if state != Rejected():
  (state, outbound) = VDAF.ping_pong_req(agg_param, state, None)
]]></artwork>
            <t>where:</t>
            <ul spacing="normal">
              <li>
                <tt>vdaf_verify_key</tt> is the VDAF verification key for the task</li>
              <li>
                <tt>agg_param</tt> is the VDAF aggregation parameter provided by the Collector (see
<xref target="collect-flow"/>)</li>
              <li>
                <tt>report_id</tt> is the report ID, used as the nonce for VDAF sharding</li>
              <li>
                <tt>public_share</tt> is the report's public share</li>
              <li>
                <tt>plaintext_input_share</tt> is the Leader's <tt>PlaintextInputShare</tt></li>
            </ul>
            <t>The methods are defined in <xref section="5.8" sectionFormat="of" target="VDAF"/>. This process determines
the initial per-report <tt>state</tt>, as well as the initial <tt>outbound</tt> message to
send to the Helper. (These are coalesced into a single HTTP request to the
Helper as described below.) If <tt>state == Rejected()</tt>, then the report is
rejected and removed from the set of candidate reports.</t>
            <t>Next, for each candidate report the Leader constructs a <tt>PrepareInit</tt> message
structured as follows:</t>
            <artwork><![CDATA[
struct {
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
  HpkeCiphertext encrypted_input_share;
} ReportShare;

struct {
  ReportShare report_share;
  opaque payload<0..2^32-1>;
} PrepareInit;
]]></artwork>
            <t>Each of these messages is constructed as follows:</t>
            <ul spacing="normal">
              <li>
                <tt>report_share.report_metadata</tt> is the report's metadata.</li>
              <li>
                <tt>report_share.public_share</tt> is the report's public share.</li>
              <li>
                <tt>report_share.encrypted_input_share</tt> is the intended recipient's (i.e.
Helper's) encrypted input share.</li>
              <li>
                <tt>payload</tt> is set to the <tt>outbound</tt> message computed by the previous step.</li>
            </ul>
            <t>Next, the Leader creates an <tt>AggregationJobInitReq</tt> message structured as
follows:</t>
            <artwork><![CDATA[
struct {
  QueryType query_type;
  select (PartialBatchSelector.query_type) {
    case time_interval: Empty;
    case fixed_size: BatchID batch_id;
  };
} PartialBatchSelector;

struct {
  opaque agg_param<0..2^32-1>;
  PartialBatchSelector part_batch_selector;
  PrepareInit prepare_inits<1..2^32-1>;
} AggregationJobInitReq;
]]></artwork>
            <t>[[OPEN ISSUE: Consider sending report shares separately (in parallel) to the
aggregate instructions. Right now, aggregation parameters and the corresponding
report shares are sent at the same time, but this may not be strictly
necessary.]]</t>
            <t>This message consists of:</t>
            <ul spacing="normal">
              <li>
                <tt>agg_param</tt>: The VDAF aggregation parameter.</li>
              <li>
                <t><tt>part_batch_selector</tt>: The "partial batch selector" used by the Aggregators to
determine how to aggregate each report:  </t>
                <ul spacing="normal">
                  <li>
                    <t>For <tt>fixed_size</tt> tasks, the Leader specifies a "batch ID" that determines
the batch to which each report for this aggregation job belongs.      </t>
                    <t>
[OPEN ISSUE: For fixed_size tasks, the Leader is in complete control over
which batch a report is included in. For time_interval tasks, the Client
has some control, since the timestamp determines which batch window it
falls in. Is this desirable from a privacy perspective? If not, it might
be simpler to drop the timestamp altogether and have the agg init request
specify the batch window instead.]</t>
                  </li>
                </ul>
                <t>
The indicated query type <bcp14>MUST</bcp14> match the task's query type. Otherwise, the
Helper <bcp14>MUST</bcp14> abort with error <tt>invalidMessage</tt>.  </t>
                <t>
This field is called the "partial" batch selector because, depending on the
query type, it may not determine a batch. In particular, if the query type is
<tt>time_interval</tt>, the batch is not determined until the Collector's query is
issued (see <xref target="query"/>).</t>
              </li>
              <li>
                <tt>prepare_inits</tt>: the sequence of <tt>PrepareInit</tt> messages constructed in the
previous step.</li>
            </ul>
            <t>Finally, the Leader sends a PUT request to
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt>. The payload
is set to <tt>AggregationJobInitReq</tt> and the media type is set to
"application/dap-aggregation-job-init-req".</t>
            <t>The Helper's response will be an <tt>AggregationJobResp</tt> message (see
<xref target="aggregation-helper-init"/>. The response's <tt>preapre_resps</tt> must include exactly
the same report IDs in the same order as the Leader's <tt>AggregationJobInitReq</tt>.
Otherwise, the Leader <bcp14>MUST</bcp14> abort the aggregation job.</t>
            <t>[[OPEN ISSUE: consider relaxing this ordering constraint. See issue#217.]]</t>
            <t>Otherwise, the Leader proceeds as follows with each report:</t>
            <ol spacing="normal" type="1"><li>
                <t>If the inbound prep step has type "continue", then the Leader computes  </t>
                <artwork><![CDATA[
(state, outbound) = VDAF.ping_pong_req(agg_param, state, inbound)
]]></artwork>
                <t>
where <tt>inbound</tt> is the message payload. If <tt>outbound != None</tt>, then the
Leader stores <tt>state</tt> and <tt>outbound</tt> and proceeds to
<xref target="aggregation-leader-continuation"/>. If <tt>outbound == None</tt>, then the
preparation process is complete: either <tt>state == Rejected()</tt>, in which case
the Leader rejects the report and removes it from the candidate set; or
<tt>state == Finished(out_share)</tt>, in which case preparation is complete and the
Leader stores the output share for use in the collection sub-protocol
<xref target="collect-flow"/>.</t>
              </li>
              <li>Else if the type is "rejected", then the Leader rejects the report and
removes it from the candidate set. The Leader <bcp14>MUST NOT</bcp14> include the report in
a subsequent aggregation job, unless the error is <tt>report_too_early</tt>, in
which case the Leader <bcp14>MAY</bcp14> include the report in a subsequent aggregation job.</li>
              <li>Else the type is invalid, in which case the Leader <bcp14>MUST</bcp14> abort the
aggregation job.</li>
            </ol>
            <t>(Note: Since VDAF preparation completes in a constant number of rounds, it will
never be the case that some reports are completed and others are not.)</t>
          </section>
          <section anchor="aggregation-helper-init">
            <name>Helper Initialization</name>
            <t>The Helper begins an aggregation job when it receives an <tt>AggregationJobInitReq</tt>
message from the Leader. For each <tt>PrepareInit</tt> conveyed by this message, the
Helper attempts to initialize VDAF preparation (see <xref section="5.1" sectionFormat="of" target="VDAF"/>)
just as the Leader does. If successful, it includes the result in its response
that the Leader will use to continue preparing the report.</t>
            <t>To begin this process, the Helper checks if it recognizes the task ID. If not,
then it <bcp14>MUST</bcp14> abort with error <tt>unrecognizedTask</tt>.</t>
            <t>Next, the Helper checks that the report IDs in
<tt>AggregationJobInitReq.prepare_inits</tt> are all distinct. If two preparation
initialization messages have the same report ID, then the Helper <bcp14>MUST</bcp14> abort with
error <tt>invalidMessage</tt>.</t>
            <t>The Helper is now ready to process each report share into an outbound prepare
step to return to the server. The responses will be structured as follows:</t>
            <artwork><![CDATA[
enum {
  continue(0),
  finished(1)
  reject(2),
  (255)
} PrepareRespState;

enum {
  batch_collected(0),
  report_replayed(1),
  report_dropped(2),
  hpke_unknown_config_id(3),
  hpke_decrypt_error(4),
  vdaf_prep_error(5),
  batch_saturated(6),
  task_expired(7),
  invalid_message(8),
  report_too_early(9),
  (255)
} PrepareError;

struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state;
  select (PrepareResp.prepare_resp_state) {
    case continue: opaque payload<0..2^32-1>;
    case finished: Empty;
    case reject:   PrepareError prepare_error;
  };
} PrepareResp;
]]></artwork>
            <t>First the Helper preprocesses each report as follows:</t>
            <ol spacing="normal" type="1"><li>Decrypt the input share for each report share as described in
<xref target="input-share-decryption"/>.</li>
              <li>Check that the resulting input share is valid as described in
<xref target="input-share-validation"/>.</li>
            </ol>
            <t>For any report that was rejected, the Helper sets the outbound preparation
response to</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error;
} PrepareResp;
]]></artwork>
            <t>where <tt>report_id</tt> is the report ID and <tt>prepare_error</tt> is the indicated error.
For all other reports it initializes the VDAF prep state as follows (let
<tt>inbound</tt> denote the payload of the prep step sent by the Leader):</t>
            <artwork><![CDATA[
state = VDAF.ping_pong_start(vdaf_verify_key,
                             False,
                             agg_param,
                             report_id,
                             public_share,
                             plaintext_input_share.payload)
if state != Rejected():
  (state, outbound) = VDAF.ping_pong_resp(agg_param, state, inbound)
]]></artwork>
            <t>where:</t>
            <ul spacing="normal">
              <li>
                <tt>vdaf_verify_key</tt> is the VDAF verification key for the task</li>
              <li>
                <tt>agg_param</tt> is the VDAF aggregation parameter sent in the
<tt>AggregationJobInitReq</tt></li>
              <li>
                <tt>report_id</tt> is the report ID</li>
              <li>
                <tt>public_share</tt> is the report's public share</li>
              <li>
                <tt>plaintext_input_share</tt> is the Helper's <tt>PlaintextInputShare</tt></li>
            </ul>
            <t>This procedure determines the initial per-report <tt>state</tt>, as well as the
initial <tt>outbound</tt> to send in response to the Leader. If <tt>state == Rejected()</tt>,
then the Helper responds with</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error = vdaf_prep_error;
} PrepareResp;
]]></artwork>
            <t>Otherwise the Helper responds with</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = continue;
  opaque payload<0..2^32-1> = outbound;
} PrepareResp;
]]></artwork>
            <t>Finally, the Helper creates an <tt>AggregationJobResp</tt> to send to the Leader. This
message is structured as follows:</t>
            <artwork><![CDATA[
struct {
  PrepareResp prepare_resps<1..2^32-1>;
} AggregationJobResp;
]]></artwork>
            <t>where <tt>prepare_resps</tt> are the outbound prep steps computed in the previous step.
The order <bcp14>MUST</bcp14> match <tt>AggregationJobInitReq.prepare_inits</tt>.</t>
            <t>The Helper responds to the Leader with HTTP status code 201 Created and a body
consisting of the <tt>AggregationJobResp</tt>, with media type
"application/dap-aggregation-job-resp".</t>
            <t>Changing an aggregation job's parameters is illegal, so further requests to
<tt>PUT /tasks/{tasks}/aggregation_jobs/{aggregation-job-id}</tt> for the same
<tt>aggregation-job-id</tt> but with a different <tt>AggregationJobInitReq</tt> in the body
<bcp14>MUST</bcp14> fail with an HTTP client error status code.</t>
            <t>Additionally, it is not possible to rewind or reset the state of an aggregation
job. Once an aggregation job has been continued at least once (see
<xref target="agg-continue-flow"/>), further requests to initialize that aggregation job <bcp14>MUST</bcp14>
fail with an HTTP client error status code.</t>
            <t>Finally, if <tt>state == Continued(prep_state)</tt>, then the Helper stores <tt>state</tt> to
prepare for the next continuation step (<xref target="aggregation-helper-continuation"/>).
Otherwise, if <tt>state == Finished(out_share)</tt>, then the Helper stores <tt>out_share</tt>
for use in the collection sub-protocol (<xref target="collect-flow"/>).</t>
          </section>
          <section anchor="input-share-decryption">
            <name>Input Share Decryption</name>
            <t>Each report share has a corresponding task ID, report metadata (report ID and,
timestamp), public share, and the Aggregator's encrypted input share. Let
<tt>task_id</tt>, <tt>report_metadata</tt>, <tt>public_share</tt>, and <tt>encrypted_input_share</tt>
denote these values, respectively. Given these values, an Aggregator decrypts
the input share as follows. First, it constructs an <tt>InputShareAad</tt> message
from <tt>task_id</tt>, <tt>report_metadata</tt>, and <tt>public_share</tt>. Let this be denoted by
<tt>input_share_aad</tt>. Then, the Aggregator looks up the HPKE config and
corresponding secret key indicated by <tt>encrypted_input_share.config_id</tt> and
attempts decryption of the payload with the following procedure:</t>
            <artwork><![CDATA[
plaintext_input_share = OpenBase(encrypted_input_share.enc, sk,
  "dap-05 input share" || 0x01 || server_role,
  input_share_aad, encrypted_input_share.payload)
]]></artwork>
            <t>where <tt>sk</tt> is the HPKE secret key, and <tt>server_role</tt> is the role of the
Aggregator (<tt>0x02</tt> for the Leader and <tt>0x03</tt> for the Helper). The <tt>OpenBase()</tt>
function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the ciphersuite indicated
by the HPKE configuration. If decryption fails, the Aggregator marks the report
share as invalid with the error <tt>hpke_decrypt_error</tt>. Otherwise, the Aggregator
outputs the resulting PlaintextInputShare <tt>plaintext_input_share</tt>.</t>
          </section>
          <section anchor="input-share-validation">
            <name>Input Share Validation</name>
            <t>Validating an input share will either succeed or fail. In the case of failure,
the input share is marked as invalid with a corresponding PrepareError.</t>
            <t>Before beginning the preparation step, Aggregators are required to perform the
following checks:</t>
            <ol spacing="normal" type="1"><li>Check that the input share can be decoded as specified by the VDAF. If not,
the input share <bcp14>MUST</bcp14> be marked as invalid with the error <tt>invalid_message</tt>.</li>
              <li>Check if the report is too far into the future. Implementors can provide for
some small leeway, usually no more than a few minutes, to account for clock
skew. If a report is rejected for this reason, the Aggregator <bcp14>SHOULD</bcp14> mark the
input share as invalid with the error <tt>report_too_early</tt>.</li>
              <li>Check if the report's timestamp has passed the task's <tt>task_expiration</tt> time.
If so, the Aggregator <bcp14>MAY</bcp14> mark the input share as invalid with the error
<tt>task_expired</tt>.</li>
              <li>Check if the PlaintextInputShare contains unrecognized extensions. If so, the
Aggregator <bcp14>MUST</bcp14> mark the input share as invalid with error <tt>invalid_message</tt>.</li>
              <li>Check if the ExtensionType of any two extensions in PlaintextInputShare are
the same. If so, the Aggregator <bcp14>MUST</bcp14> mark the input share as invalid with
error <tt>invalid_message</tt>.</li>
              <li>
                <t>Check if the report may still be aggregated with the current aggregation
parameter. This can be done by looking up all aggregation parameters
previously used for this report and calling  </t>
                <artwork><![CDATA[
VDAF.is_valid(current_agg_param, previous_agg_params)
]]></artwork>
                <t>
If this returns false, the input share <bcp14>MUST</bcp14> be marked as invalid with the
error <tt>report_replayed</tt>.  </t>
                <ul spacing="normal">
                  <li>Implementation note: To detect replay attacks, each Aggregator is required
to keep track of the set of reports it has processed for a given task.
Because honest Clients choose the report ID at random, it is sufficient to
store the set of IDs of processed reports. However, implementations may
find it helpful to track additional information, like the timestamp, so
that the storage used for anti-replay can be sharded efficiently.</li>
                </ul>
              </li>
              <li>
                <t>If the report pertains to a batch that was previously collected, then make
sure the report was already included in all previous collections for the
batch. If not, the input share <bcp14>MUST</bcp14> be marked as invalid with error
<tt>batch_collected</tt>. This prevents Collectors from learning anything about
small numbers of reports that are uploaded between two collections of a
batch.  </t>
                <ul spacing="normal">
                  <li>
                    <t>Implementation note: The Leader considers a batch to be collected once it
has completed a collection job for a CollectionReq message from the
Collector; the Helper considers a batch to be collected once it has
responded to an <tt>AggregateShareReq</tt> message from the Leader. A batch is
determined by query (<xref target="query"/>) conveyed in these messages. Queries must
satisfy the criteria covered in <xref target="batch-validation"/>. These criteria are
meant to restrict queries in a way make it easy to determine wither a
report pertains to a batch that was collected.      </t>
                    <t>
[TODO: If a section to clarify report and batch states is added this can be
removed. See Issue #384]</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Depending on the query type for the task, additional checks may be
applicable:  </t>
                <ul spacing="normal">
                  <li>For <tt>fixed_size</tt> tasks, the Aggregators need to ensure that each batch is
roughly the same size. If the number of reports aggregated for the current
batch exceeds the maximum batch size (per the task configuration), the
Aggregator <bcp14>MAY</bcp14> mark the input share as invalid with the error
<tt>batch_saturated</tt>. Note that this behavior is not strictly enforced here
but during the collect sub-protocol. (See <xref target="batch-validation"/>.) If both
checks succeed, the input share is not marked as invalid.</li>
                </ul>
              </li>
              <li>Finally, if an Aggregator cannot determine if an input share is valid, it
<bcp14>MUST</bcp14> mark the input share as invalid with error <tt>report_dropped</tt>. For
example, if the Aggregator has evicted the state required to perform the
check from long-term storage. (See <xref target="reducing-storage-requirements"/> for
details.)</li>
            </ol>
            <t>If all of the above checks succeed, the input share is not marked as invalid.</t>
          </section>
        </section>
        <section anchor="agg-continue-flow">
          <name>Aggregate Continuation</name>
          <t>In the continuation phase, the Leader drives the VDAF preparation of each report
in the candidate report set until the underlying VDAF moves into a terminal
state, yielding an output share for both Aggregators or a rejection.</t>
          <t>Whether this phase is reached depends on the VDAF: for 1-round VDAFs, like
Prio3, processing has already completed. Continuation is required for VDAFs
that require more than one round.</t>
          <section anchor="aggregation-leader-continuation">
            <name>Leader Continuation</name>
            <t>The Leader begins each step of aggregation continuation with a prep state object
<tt>state</tt> and an outbound message <tt>outbound</tt> for each report in the candidate set.</t>
            <t>The Leader advances its aggregation job to the next step (step 1 if this is the
first continuation after initialization). Then it instructs the Helper to
advance the aggregation job to the step the Leader has just reached. For each
report the Leader constructs a preparation continuation message:</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  opaque payload<0..2^32-1>;
} PrepareContinue;
]]></artwork>
            <t>where <tt>report_id</tt> is the report ID associated with <tt>state</tt> and <tt>outbound</tt>, and
<tt>payload</tt> is set to the <tt>outbound</tt> message.</t>
            <t>Next, the Leader sends a POST request to the aggregation job URI used during
initialization (see <xref target="leader-init"/>) with media type
"application/dap-aggregation-job-continue-req" and body structured as:</t>
            <artwork><![CDATA[
struct {
  uint16 step;
  PrepareContinue prepare_continues<1..2^32-1>;
} AggregationJobContinueReq;
]]></artwork>
            <t>The <tt>step</tt> field is the step of DAP aggregation that the Leader just reached and
wants the Helper to advance to. The <tt>prepare_continues</tt> field is the sequence of
preparation continuation messages constructed in the previous step. The
<tt>PrepareContinue</tt>s <bcp14>MUST</bcp14> be in the same order as the previous aggregate request.</t>
            <t>The Helper's response will be an <tt>AggregationJobResp</tt> message (see
<xref target="aggregation-helper-init"/>). The response's <tt>prepare_resps</tt> must include
exactly the same report IDs in the same order as the Leader's
<tt>AggregationJobContinueReq</tt>. Otherwise, the Leader <bcp14>MUST</bcp14> abort the aggregation
job.</t>
            <t>[[OPEN ISSUE: consider relaxing this ordering constraint. See issue#217.]]</t>
            <t>Otherwise, the Leader proceeds as follows with each report:</t>
            <ol spacing="normal" type="1"><li>
                <t>If the inbound prep step type is "continue" and the state is
<tt>Continued(prep_state)</tt>, then the Leader computes  </t>
                <artwork><![CDATA[
(state, outbound) = VDAF.ping_pong_req(agg_param, state, inbound)
]]></artwork>
                <t>
where <tt>inbound</tt> is the message payload. If <tt>outbound != None</tt>, then the
Leader stores <tt>state</tt> and <tt>outbound</tt> and proceeds to another continuation
step. If <tt>outbound == None</tt>, then the preparation process is complete: either
<tt>state == Rejected()</tt>, in which case the Leader rejects the report and
removes it from the candidate set; or <tt>state == Finished(out_share)</tt>, in
which case preparation is complete and the Leader stores the output share for
use in the collection sub-protocol <xref target="collect-flow"/>.</t>
              </li>
              <li>Else if the type is "finished" and <tt>state == Finished(out_share)</tt>, then
preparation is complete and the Leader stores the output share for use in
the collection flow (<xref target="collect-flow"/>).</li>
              <li>Else if the type is "reject", then the Leader rejects the report and removes
it from the candidate set.</li>
              <li>Else the type is invalid, in which case the Leader <bcp14>MUST</bcp14> abort the
aggregation job.</li>
            </ol>
          </section>
          <section anchor="aggregation-helper-continuation">
            <name>Helper Continuation</name>
            <t>The Helper begins each step of continuation with a sequence of <tt>state</tt> objects,
which will be <tt>Continued(prep_state)</tt>, one for each report in the candidate set.</t>
            <t>The Helper awaits an HTTP POST request to the aggregation job URI from the
Leader, the body of which is an <tt>AggregationJobContinueReq</tt> as specified in
<xref target="aggregation-leader-continuation"/>.</t>
            <t>Next, it checks that it recognizes the task ID. If not, then it <bcp14>MUST</bcp14> abort with
error <tt>unrecognizedTask</tt>.</t>
            <t>Next, it checks if it recognizes the indicated aggregation job ID. If not, it
<bcp14>MUST</bcp14> abort with error <tt>unrecognizedAggregationJob</tt>.</t>
            <t>Next, the Helper checks that:</t>
            <ol spacing="normal" type="1"><li>the report IDs are all distinct</li>
              <li>each report ID corresponds to one of the <tt>state</tt> objects</li>
              <li>
                <tt>AggregationJobContinueReq.step</tt> is not equal to <tt>0</tt></li>
            </ol>
            <t>If any of these checks fail, then the Helper <bcp14>MUST</bcp14> abort with error
<tt>invalidMessage</tt>. Additionally, if any prep step appears out of order relative
to the previous request, then the Helper <bcp14>MAY</bcp14> abort with error <tt>invalidMessage</tt>.
(Note that a report may be missing, in which case the Helper should assume the
Leader rejected it.)</t>
            <t>[OPEN ISSUE: Issue 438: It may be useful for the Leader to explicitly signal
rejection.]</t>
            <t>Next, the Helper checks if the continuation step indicated by the request is
correct. (For the first <tt>AggregationJobContinueReq</tt> the value should be <tt>1</tt>;
for the second the value should be <tt>2</tt>; and so on.) If the Leader is one step
behind (e.g., the Leader has resent the previous HTTP request), then the Helper
<bcp14>MAY</bcp14> attempt to recover by re-sending the previous <tt>AggregationJobResp</tt>. In this
case it <bcp14>SHOULD</bcp14> verify that the contents of the <tt>AggregationJobContinueReq</tt> are
identical to the previous message (see <xref target="aggregation-step-skew-recovery"/>).
Otherwise, if the step is incorrect, the Helper <bcp14>MUST</bcp14> abort with error
<tt>stepMismatch</tt>.</t>
            <t>The Helper is now ready to continue preparation for each report. Let <tt>inbound</tt>
denote the payload of the prep step. The Helper computes the following:</t>
            <artwork><![CDATA[
(state, outbound) = VDAF.ping_pong_resp(agg_param, state, inbound)
]]></artwork>
            <t>If <tt>state == Rejected()</tt>, then the Helper's response is</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error = vdaf_prep_error;
} PrepareResp;
]]></artwork>
            <t>Otherwise, if <tt>outbound != None</tt>, then the Helper's response is</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = continue;
  opaque payload<0..2^32-1> = outbound;
} PrepareResp;
]]></artwork>
            <t>Otherwise, if <tt>outbound == None</tt>, then the Helper's resposne is</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = finished;
} PrepareResp;
]]></artwork>
            <t>Next, the Helper constructs an <tt>AggregationJobResp</tt> message
(<xref target="aggregation-helper-init"/>) with each prep step. The order of the prep steps
<bcp14>MUST</bcp14> match the Leader's request. It responds to the Leader with HTTP status 200
OK, media type <tt>application/dap-aggregation-job-resp</tt>, and a body consisting of
the <tt>AggregationJobResp</tt>.</t>
            <t>Finally, if <tt>state == Continued(prep_state)</tt>, then the Helper stores <tt>state</tt> to
prepare for the next continuation step (<xref target="aggregation-helper-continuation"/>).
Otherwise, if <tt>state == Finished(out_share)</tt>, then the Helper stores <tt>out_share</tt>
for use in the collection sub-protocol (<xref target="collect-flow"/>).</t>
          </section>
          <section anchor="aggregation-step-skew-recovery">
            <name>Recovering from Aggregation Step Skew</name>
            <t><tt>AggregationJobContinueReq</tt> messages contain a <tt>step</tt> field, allowing
Aggregators to ensure that their peer is on an expected step of the DAP
aggregation protocol. In particular, the intent is to allow recovery from a
scenario where the Helper successfully advances from step <tt>n</tt> to <tt>n+1</tt>, but its
<tt>AggregationJobResp</tt> response to the Leader gets dropped due to something like a
transient network failure. The Leader could then resend the request to have the
Helper advance to step <tt>n+1</tt> and the Helper should be able to retransmit the
<tt>AggregationJobContinueReq</tt> that was previously dropped. To make that kind of
recovery possible, Aggregator implementations <bcp14>SHOULD</bcp14> checkpoint the most recent
step's prep state and messages to durable storage such that the Leader can
re-construct continuation requests and the Helper can re-construct continuation
responses as needed.</t>
            <t>When implementing an aggregation step skew recovery strategy, the Helper <bcp14>SHOULD</bcp14>
ensure that the Leader's <tt>AggregationJobContinueReq</tt> message did not change when
it was re-sent (i.e., the two messages must be identical). This prevents the
Leader from re-winding an aggregation job and re-running an aggregation step
with different parameters.</t>
            <t>[[OPEN ISSUE: Allowing the Leader to "rewind" aggregation job state of the
Helper may allow an attack on privacy. For instance, if the VDAF verification
key changes, the prep shares in the Helper's response would change even if the
consistency check is made. Security analysis is required. See #401.]]</t>
            <t>One way the Helper could address this would be to store a digest of the Leader's
request, indexed by aggregation job ID and step, and refuse to service a request
for a given aggregation step unless it matches the previously seen request (if
any).</t>
          </section>
        </section>
        <section anchor="aggregate-message-security">
          <name>Aggregate Message Security</name>
          <t>Aggregate sub-protocol messages must be confidential and mutually authenticated.</t>
          <t>The aggregate sub-protocol is driven by the Leader acting as an HTTPS client,
making requests to the Helper's HTTPS server. HTTPS provides confidentiality and
authenticates the Helper to the Leader.</t>
          <t>The Leader <bcp14>MUST</bcp14> authenticate its requests to the Helper using a scheme that
meets the requirements in <xref target="request-authentication"/>.</t>
        </section>
      </section>
      <section anchor="collect-flow">
        <name>Collecting Results</name>
        <t>In this phase, the Collector requests aggregate shares from each Aggregator and
then locally combines them to yield a single aggregate result. In particular,
the Collector issues a query to the Leader (<xref target="query"/>), which the Aggregators
use to select a batch of reports to aggregate. Each Aggregator emits an
aggregate share encrypted to the Collector so that it can decrypt and combine
them to yield the aggregate result. This entire process is composed of two
interactions:</t>
        <ol spacing="normal" type="1"><li>Collect request and response between the Collector and Leader, specified in
<xref target="collect-init"/></li>
          <li>Aggregate share request and response between the Leader and the Helper,
specified in <xref target="collect-aggregate"/></li>
        </ol>
        <t>Once complete, the Collector computes the final aggregate result as specified in
<xref target="collect-finalization"/>.</t>
        <t>This overall process is referred to as a "collection job".</t>
        <section anchor="collect-init">
          <name>Collection Job Initialization</name>
          <t>First, the Collector chooses a collection job ID:</t>
          <artwork><![CDATA[
opaque CollectionJobID[16];
]]></artwork>
          <t>This ID value <bcp14>MUST</bcp14> be unique within the scope of the corresponding DAP task.</t>
          <t>To initiate the collection job, the collector issues a PUT request to
<tt>{leader}/tasks/{task-id}/collection_jobs/{collection-job-id}</tt>. The body of the
request has media type "application/dap-collect-req", and it is structured as
follows:</t>
          <t>[OPEN ISSUE: Decide if and how the Collector's request is authenticated. If not,
then we need to ensure that collection job URIs are resistant to enumeration
attacks.]</t>
          <artwork><![CDATA[
struct {
  Query query;
  opaque agg_param<0..2^32-1>; /* VDAF aggregation parameter */
} CollectionReq;
]]></artwork>
          <t>The named parameters are:</t>
          <ul spacing="normal">
            <li>
              <tt>query</tt>, the Collector's query. The indicated query type <bcp14>MUST</bcp14> match the task's
query type. Otherwise, the Leader <bcp14>MUST</bcp14> abort with error "invalidMessage".</li>
            <li>
              <tt>agg_param</tt>, an aggregation parameter for the VDAF being executed. This is the
same value as in <tt>AggregationJobInitReq</tt> (see <xref target="leader-init"/>).</li>
          </ul>
          <t>Depending on the VDAF scheme and how the Leader is configured, the Leader and
Helper may already have prepared a sufficient number of reports satisfying the
query and be ready to return the aggregate shares right away. However, this is
not always the case. In fact, for some VDAFs, it is not be possible to begin
running aggregation jobs (<xref target="aggregate-flow"/>) until the Collector initiates a
collection job. This is because, in general, the aggregation parameter is not
known until this point. In certain situations it is possible to predict the
aggregation parameter in advance. For example, for Prio3 the only valid
aggregation parameter is the empty string. For these reasons, the collection
job is handled asynchronously.</t>
          <t>Upon receipt of a <tt>CollectionReq</tt>, the Leader begins by checking that it
recognizes the task ID in the request path. If not, it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>The Leader <bcp14>MAY</bcp14> further validate the request according to the requirements in
<xref target="batch-validation"/> and abort with the indicated error, though some conditions
such as the number of valid reports may not be verifiable while handling the
CollectionReq message, and the batch will have to be re-validated later on
regardless.</t>
          <t>If the Leader finds the CollectionReq to be valid, it immediately responds with
HTTP status 201.</t>
          <t>The Leader then begins working with the Helper to aggregate the reports
satisfying the query (or continues this process, depending on the VDAF) as
described in <xref target="aggregate-flow"/>.</t>
          <t>Changing a collection job's parameters is illegal, so further requests to
<tt>PUT /tasks/{tasks}/collection_jobs/{collection-job-id}</tt> for the same
<tt>collection-job-id</tt> but with a different <tt>CollectionReq</tt> in the body <bcp14>MUST</bcp14> fail
with an HTTP client error status code.</t>
          <t>After receiving the response to its <tt>CollectionReq</tt>, the Collector makes an HTTP
<tt>POST</tt> request to the collection job URI to check on the status of the collect
job and eventually obtain the result. If the collection job is not finished
yet, the Leader responds with HTTP status 202 Accepted. The response <bcp14>MAY</bcp14> include
a Retry-After header field to suggest a polling interval to the Collector.</t>
          <t>Asynchronously from any request from the Collector, the Leader attempts to run
the collection job. It first checks whether it can construct a batch for the
collection job by applying the requirements in <xref target="batch-validation"/>. If so, then
the Leader obtains the Helper's aggregate share following the aggregate-share
request flow described in <xref target="collect-aggregate"/>. If not, it either aborts the
collection job or tries again later, depending on which requirement in
<xref target="batch-validation"/> was not met.</t>
          <t>Once both aggregate shares are successfully obtained, the Leader responds to
subsequent HTTP POST requests to the collection job with HTTP status code 200 OK
and a body consisting of a <tt>Collection</tt>:</t>
          <artwork><![CDATA[
struct {
  PartialBatchSelector part_batch_selector;
  uint64 report_count;
  Interval interval;
  HpkeCiphertext leader_encrypted_agg_share;
  HpkeCiphertext helper_encrypted_agg_share;
} Collection;
]]></artwork>
          <t>The body's media type is "application/dap-collection". The <tt>Collection</tt>
structure includes the following:</t>
          <ul spacing="normal">
            <li>
              <t><tt>part_batch_selector</tt>: Information used to bind the aggregate result to the
query. For fixed_size tasks, this includes the batch ID assigned to the batch
by the Leader. The indicated query type <bcp14>MUST</bcp14> match the task's query type.  </t>
              <t>
[OPEN ISSUE: What should the Collector do if the query type doesn't match?]</t>
            </li>
            <li>
              <tt>report_count</tt>: The number of reports included in the batch.</li>
            <li>
              <tt>interval</tt>: The smallest interval of time that contains the timestamps of all
reports included in the batch, such that the interval's start and duration are
both multiples of the task's <tt>time_precision</tt> parameter. Note that in the case
of a <tt>time_interval</tt> type query (see <xref target="query"/>), this interval can be smaller
than the one in the corresponding <tt>CollectionReq.query</tt>.</li>
            <li>
              <tt>leader_encrypted_agg_share</tt>: The Leader's aggregate share, encrypted to the
Collector.</li>
            <li>
              <tt>helper_encrypted_agg_share</tt>: The Helper's aggregate share, encrypted to the
Collector.</li>
          </ul>
          <t>If obtaining aggregate shares fails, then the Leader responds to subsequent HTTP
POST requests to the collection job with an HTTP error status and a problem
document as described in <xref target="errors"/>.</t>
          <t>The Leader <bcp14>MAY</bcp14> respond with HTTP status 204 No Content to requests to a
collection job if the results have been deleted.</t>
          <t>The Collector can send an HTTP DELETE request to the collection job, which
indicates to the Leader that it can abandon the collection job and discard all
state related to it.</t>
          <section anchor="a-note-on-idempotence">
            <name>A Note on Idempotence</name>
            <t>The reason a POST is used to poll the state of a collection job instead of a
GET is because of the fixed-size query mode (see <xref target="fixed-size-query"/>).
Collectors may make a query against the current batch, and it is the Leader's
responsibility to keep track of what batch is current for some task. Polling a
collection job is the only point at which it is safe for the Leader to change
its set of current batches, since it constitutes acknowledgement on the
Collector's part that it received the response to some previous PUT request to
the collection jobs resource.</t>
            <t>This means that polling a collection job can have the side effect of changing
the set of current batches in the Leader, and thus using a GET is inappropriate.</t>
          </section>
        </section>
        <section anchor="collect-aggregate">
          <name>Obtaining Aggregate Shares</name>
          <t>The Leader must obtain the Helper's encrypted aggregate share before it can
complete a collection job. To do this, the Leader first computes a checksum
over the reports included in the batch. The checksum is computed by taking the
SHA256 <xref target="SHS"/> hash of each report ID from the
Client reports included in the aggregation, then combining the hash values with
a bitwise-XOR operation.</t>
          <t>Then the Leader sends a POST request to
<tt>{helper}/tasks/{task-id}/aggregate_shares</tt> with the following message:</t>
          <artwork><![CDATA[
struct {
  QueryType query_type;
  select (BatchSelector.query_type) {
    case time_interval: Interval batch_interval;
    case fixed_size: BatchID batch_id;
  };
} BatchSelector;

struct {
  BatchSelector batch_selector;
  opaque agg_param<0..2^32-1>;
  uint64 report_count;
  opaque checksum[32];
} AggregateShareReq;
]]></artwork>
          <t>The media type of the request is "application/dap-aggregate-share-req". The
message contains the following parameters:</t>
          <ul spacing="normal">
            <li>
              <t><tt>batch_selector</tt>: The "batch selector", which encodes parameters used to
determine the batch being aggregated. The value depends on the query type for
the task:  </t>
              <ul spacing="normal">
                <li>For time_interval tasks, the request specifies the batch interval.</li>
                <li>For fixed_size tasks, the request specifies the batch ID.</li>
              </ul>
              <t>
The indicated query type <bcp14>MUST</bcp14> match the task's query type. Otherwise, the
Helper <bcp14>MUST</bcp14> abort with "invalidMessage".</t>
            </li>
            <li>
              <tt>agg_param</tt>: The opaque aggregation parameter for the VDAF being executed.
This value <bcp14>MUST</bcp14> match the AggregationJobInitReq message for each aggregation
job used to compute the aggregate shares (see <xref target="leader-init"/>) and the
aggregation parameter indicated by the Collector in the CollectionReq message
(see <xref target="collect-init"/>).</li>
            <li>
              <tt>report_count</tt>: The number number of reports included in the batch.</li>
            <li>
              <tt>checksum</tt>: The batch checksum.</li>
          </ul>
          <t>To handle the Leader's request, the Helper first ensures that it recognizes the
task ID in the request path. If not, it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>. The Helper then verifies that the request meets the
requirements for batch parameters following the procedure in
<xref target="batch-validation"/>.</t>
          <t>Next, it computes a checksum based on the reports that satisfy the query, and
checks that the <tt>report_count</tt> and <tt>checksum</tt> included in the request match its
computed values. If not, then it <bcp14>MUST</bcp14> abort with an error of type
"batchMismatch".</t>
          <t>Next, it computes the aggregate share <tt>agg_share</tt> corresponding to the set of
output shares, denoted <tt>out_shares</tt>, for the batch interval, as follows:</t>
          <artwork><![CDATA[
agg_share = VDAF.out_shares_to_agg_share(agg_param, out_shares)
]]></artwork>
          <t>Implementation note: For most VDAFs, it is possible to aggregate output shares
as they arrive rather than wait until the batch is collected. To do so however,
it is necessary to enforce the batch parameters as described in
<xref target="batch-validation"/> so that the Aggregator knows which aggregate share to
update.</t>
          <t>The Helper then encrypts <tt>agg_share</tt> under the Collector's HPKE public key as
described in <xref target="aggregate-share-encrypt"/>, yielding <tt>encrypted_agg_share</tt>.
Encryption prevents the Leader from learning the actual result, as it only has
its own aggregate share and cannot compute the Helper's.</t>
          <t>The Helper responds to the Leader with HTTP status code 200 OK and a body
consisting of an <tt>AggregateShare</tt>, with media type
"application/dap-aggregate-share":</t>
          <artwork><![CDATA[
struct {
  HpkeCiphertext encrypted_aggregate_share;
} AggregateShare;
]]></artwork>
          <t><tt>encrypted_aggregate_share.config_id</tt> is set to the Collector's HPKE config ID.
<tt>encrypted_aggregate_share.enc</tt> is set to the encapsulated HPKE context <tt>enc</tt>
computed above and <tt>encrypted_aggregate_share.ciphertext</tt> is the ciphertext
<tt>encrypted_agg_share</tt> computed above.</t>
          <t>The Helper's handling of this request <bcp14>MUST</bcp14> be idempotent. That is, if multiple
identical, valid <tt>AggregateShareReq</tt>s are received, they should all yield the
same response while only consuming one unit of the task's
<tt>max_batch_query_count</tt> (see <xref target="batch-validation"/>).</t>
          <t>After receiving the Helper's response, the Leader uses the HpkeCiphertext to
finalize a collection job (see <xref target="collect-finalization"/>).</t>
          <t>Once an AggregateShareReq has been issued for the batch determined by a given
query, it is an error for the Leader to issue any more aggregation jobs for
additional reports that satisfy the query. These reports will be rejected by the
Helper as described in <xref target="input-share-validation"/>.</t>
          <t>Before completing the collection job, the Leader also computes its own aggregate
share <tt>agg_share</tt> by aggregating all of the prepared output shares that fall
within the batch interval. Finally, it encrypts its aggregate share under the
Collector's HPKE public key as described in <xref target="aggregate-share-encrypt"/>.</t>
        </section>
        <section anchor="collect-finalization">
          <name>Collection Job Finalization</name>
          <t>Once the Collector has received a collection job from the Leader, it can decrypt
the aggregate shares and produce an aggregate result. The Collector decrypts
each aggregate share as described in <xref target="aggregate-share-encrypt"/>. Once the
Collector successfully decrypts all aggregate shares, it unshards the aggregate
shares into an aggregate result using the VDAF's <tt>agg_shares_to_result</tt>
algorithm. In particular, let <tt>leader_agg_share</tt> denote the Leader's aggregate
share, <tt>helper_agg_share</tt> denote the Helper's aggregate share, let
<tt>report_count</tt> denote the report count sent by the Leader, and let <tt>agg_param</tt>
be the opaque aggregation parameter. The final aggregate result is computed as
follows:</t>
          <artwork><![CDATA[
agg_result = VDAF.agg_shares_to_result(agg_param,
                                       [leader_agg_share, helper_agg_share],
                                       report_count)
]]></artwork>
        </section>
        <section anchor="aggregate-share-encrypt">
          <name>Aggregate Share Encryption</name>
          <t>Encrypting an aggregate share <tt>agg_share</tt> for a given <tt>AggregateShareReq</tt> is
done as follows:</t>
          <artwork><![CDATA[
enc, payload = SealBase(pk, "dap-05 aggregate share" || server_role || 0x00,
  agg_share_aad, agg_share)
]]></artwork>
          <t>where <tt>pk</tt> is the HPKE public key encoded by the Collector's HPKE key,
<tt>server_role</tt> is the role of the encrypting server (<tt>0x02</tt> for the Leader and
<tt>0x03</tt> for a Helper), and <tt>agg_share_aad</tt> is a value of type <tt>AggregateShareAad</tt>
with its values set from the corresponding fields of the <tt>AggregateShareReq</tt>.
The <tt>SealBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the HPKE configuration.</t>
          <artwork><![CDATA[
struct {
  TaskID task_id;
  BatchSelector batch_selector;
} AggregateShareAad;
]]></artwork>
          <t>The Collector decrypts these aggregate shares using the opposite process.
Specifically, given an encrypted input share, denoted <tt>enc_share</tt>, for a given
batch selector, decryption works as follows:</t>
          <artwork><![CDATA[
agg_share = OpenBase(enc_share.enc, sk, "dap-05 aggregate share" ||
  server_role || 0x00, agg_share_aad, enc_share.payload)
]]></artwork>
          <t>where <tt>sk</tt> is the HPKE secret key, <tt>server_role</tt> is the role of the server that
sent the aggregate share (<tt>0x02</tt> for the Leader and <tt>0x03</tt> for the Helper), and
<tt>agg_share_aad</tt> is an <tt>AggregateShareAad</tt> message constructed from the task ID
in the collect request and a batch selector. The value of the batch selector
used in <tt>agg_share_aad</tt> is computed by the Collector from its query and the
response to its query as follows:</t>
          <ul spacing="normal">
            <li>For time_interval tasks, the batch selector is the batch interval specified in
the query.</li>
            <li>For fixed_size tasks, the batch selector is the batch ID assigned sent in the
response.</li>
          </ul>
          <t>The <tt>OpenBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the HPKE configuration.</t>
        </section>
        <section anchor="collect-message-security">
          <name>Collect Message Security</name>
          <t>Collect sub-protocol messages must be confidential and mutually authenticated.</t>
          <t>HTTPS provides confidentiality and authenticates the Leader to the Collector.
Additionally, the Leader encrypts its aggregate share to a public key held by
the Collector using <xref target="HPKE"/>.</t>
          <t>Collectors <bcp14>MUST</bcp14> authenticate their requests to Leaders using a scheme that meets
the requirements in <xref target="request-authentication"/>.</t>
          <t>[[OPEN ISSUE: Collector public key is currently in the task parameters, but this
will have to change #102]]</t>
          <t>The Collector and Helper never directly communicate with each other, but the
Helper does transmit an aggregate share to the Collector through the Leader, as
detailed in <xref target="collect-aggregate"/>. The aggregate share must be confidential from
everyone but the Helper and the Collector.</t>
          <t>Confidentiality is achieved by having the Helper encrypt its aggregate share to
a public key held by the Collector using <xref target="HPKE"/>.</t>
          <t>There is no authentication between the Collector and the Helper. This allows the
Leader to:</t>
          <ul spacing="normal">
            <li>Send collect parameters to the Helper that do not reflect the parameters
chosen by the Collector</li>
            <li>Discard the aggregate share computed by the Helper and then fabricate
aggregate shares that combine into an arbitrary aggregate result</li>
          </ul>
          <t>These are attacks on robustness, which we already assume to hold only if both
Aggregators are honest, which puts these malicious-Leader attacks out of scope
(see <xref target="sec-considerations"/>).</t>
          <t>[[OPEN ISSUE: Should we have authentication in either direction between the
Helper and the Collector? #155]]</t>
        </section>
        <section anchor="batch-validation">
          <name>Batch Validation</name>
          <t>Before a Leader runs a collection job or a Helper responds to an
AggregateShareReq, it must first check that the job or request does not violate
the parameters associated with the DAP task. It does so as described here. Where
we say that an Aggregator <bcp14>MUST</bcp14> abort with some error, then:</t>
          <ul spacing="normal">
            <li>Leaders should respond to subsequent HTTP POST requests to the collection job
with the indicated error.</li>
            <li>Helpers should respond to the AggregateShareReq with the indicated error.</li>
          </ul>
          <t>First the Aggregator checks that the batch respects any "boundaries" determined
by the query type. These are described in the subsections below. If the boundary
check fails, then the Aggregator <bcp14>MUST</bcp14> abort with an error of type
"batchInvalid".</t>
          <t>Next, the Aggregator checks that batch contains a valid number of reports, as
determined by the query type. If the size check fails, then Helpers <bcp14>MUST</bcp14> abort
with an error of type "invalidBatchSize". Leaders <bcp14>SHOULD</bcp14> wait for more reports
to be validated and try the collection job again later.</t>
          <t>Next, the Aggregator checks that the batch has not been aggregated too many
times. This is determined by the maximum number of times a batch can be queried,
<tt>max_batch_query_count</tt>. Unless the query has been issued less than
<tt>max_batch_query_count</tt> times, the Aggregator <bcp14>MUST</bcp14> abort with error of type
"batchQueriedTooManyTimes".</t>
          <t>Finally, the Aggregator checks that the batch does not contain a report that was
included in any previous batch. If this batch overlap check fails, then the
Aggregator <bcp14>MUST</bcp14> abort with error of type "batchOverlap". For time_interval
tasks, it is sufficient (but not necessary) to check that the batch interval
does not overlap with the batch interval of any previous query. If this batch
interval check fails, then the Aggregator <bcp14>MAY</bcp14> abort with error of type
"batchOverlap".</t>
          <t>[[OPEN ISSUE: #195 tracks how we might relax this constraint to allow for more
collect query flexibility. As of now, this is quite rigid and doesn't give the
Collector much room for mistakes.]]</t>
          <section anchor="time-interval-batch-validation">
            <name>Time-interval Queries</name>
            <section anchor="boundary-check">
              <name>Boundary Check</name>
              <t>The batch boundaries are determined by the <tt>time_precision</tt> field of the query
configuration. For the <tt>batch_interval</tt> included with the query, the Aggregator
checks that:</t>
              <ul spacing="normal">
                <li>
                  <tt>batch_interval.duration &gt;= time_precision</tt> (this field determines,
effectively, the minimum batch duration)</li>
                <li>both <tt>batch_interval.start</tt> and <tt>batch_interval.duration</tt> are divisible by
<tt>time_precision</tt></li>
              </ul>
              <t>These measures ensure that Aggregators can efficiently "pre-aggregate" output
shares recovered during the aggregation sub-protocol.</t>
            </section>
            <section anchor="size-check">
              <name>Size Check</name>
              <t>The query configuration specifies the minimum batch size, <tt>min_batch_size</tt>. The
Aggregator checks that <tt>len(X) &gt;= min_batch_size</tt>, where <tt>X</tt> is the set of
reports successfully aggregated into the batch.</t>
            </section>
          </section>
          <section anchor="fixed-size-batch-validation">
            <name>Fixed-size Queries</name>
            <section anchor="boundary-check-1">
              <name>Boundary Check</name>
              <t>For fixed_size tasks, the batch boundaries are defined by opaque batch IDs. Thus
the Aggregator needs to check that the query is associated with a known batch
ID:</t>
              <ul spacing="normal">
                <li>For a CollectionReq containing a query of type <tt>by_batch_id</tt>, the Leader
checks that the provided batch ID corresponds to a batch ID it returned in a
previous collection for the task.</li>
                <li>For an AggregateShareReq, the Helper checks that the batch ID provided by the
Leader corresponds to a batch ID used in a previous <tt>AggregationJobInitReq</tt>
for the task.</li>
              </ul>
            </section>
            <section anchor="size-check-1">
              <name>Size Check</name>
              <t>The query configuration specifies the minimum batch size, <tt>min_batch_size</tt>, and
maximum batch size, <tt>max_batch_size</tt>. The Aggregator checks that <tt>len(X) &gt;=
min_batch_size</tt> and <tt>len(X) &lt;= max_batch_size</tt>, where <tt>X</tt> is the set of reports
successfully aggregated into the batch.</t>
            </section>
          </section>
        </section>
      </section>
    </section>
    <section anchor="operational-capabilities">
      <name>Operational Considerations</name>
      <t>The DAP protocol has inherent constraints derived from the tradeoff between
privacy guarantees and computational complexity. These tradeoffs influence how
applications may choose to utilize services implementing the specification.</t>
      <section anchor="entity-capabilities">
        <name>Protocol participant capabilities</name>
        <t>The design in this document has different assumptions and requirements for
different protocol participants, including Clients, Aggregators, and Collectors.
This section describes these capabilities in more detail.</t>
        <section anchor="client-capabilities">
          <name>Client capabilities</name>
          <t>Clients have limited capabilities and requirements. Their only inputs to the
protocol are (1) the parameters configured out of band and (2) a measurement.
Clients are not expected to store any state across any upload flows, nor are
they required to implement any sort of report upload retry mechanism. By design,
the protocol in this document is robust against individual Client upload
failures since the protocol output is an aggregate over all inputs.</t>
        </section>
        <section anchor="aggregator-capabilities">
          <name>Aggregator capabilities</name>
          <t>Leaders and Helpers have different operational requirements. The design in this
document assumes an operationally competent Leader, i.e., one that has no
storage or computation limitations or constraints, but only a modestly
provisioned Helper, i.e., one that has computation, bandwidth, and storage
constraints. By design, Leaders must be at least as capable as Helpers, where
Helpers are generally required to:</t>
          <ul spacing="normal">
            <li>Support the aggregate sub-protocol, which includes validating and aggregating
reports; and</li>
            <li>Publish and manage an HPKE configuration that can be used for the upload
protocol.</li>
          </ul>
          <t>In addition, for each DAP task, the Helper is required to:</t>
          <ul spacing="normal">
            <li>Implement some form of batch-to-report index, as well as inter- and
intra-batch replay mitigation storage, which includes some way of tracking
batch report size. Some of this state may be used for replay attack
mitigation. The replay mitigation strategy is described in
<xref target="input-share-validation"/>.</li>
          </ul>
          <t>Beyond the minimal capabilities required of Helpers, Leaders are generally
required to:</t>
          <ul spacing="normal">
            <li>Support the upload protocol and store reports; and</li>
            <li>Track batch report size during each collect flow and request encrypted output
shares from Helpers.</li>
          </ul>
          <t>In addition, for each DAP task, the Leader is required to:</t>
          <ul spacing="normal">
            <li>Implement and store state for the form of inter- and intra-batch replay
mitigation in <xref target="input-share-validation"/>.</li>
          </ul>
        </section>
        <section anchor="collector-capabilities">
          <name>Collector capabilities</name>
          <t>Collectors statefully interact with Aggregators to produce an aggregate output.
Their input to the protocol is the task parameters, configured out of band,
which include the corresponding batch window and size. For each collect
invocation, Collectors are required to keep state from the start of the protocol
to the end as needed to produce the final aggregate output.</t>
          <t>Collectors must also maintain state for the lifetime of each task, which
includes key material associated with the HPKE key configuration.</t>
        </section>
      </section>
      <section anchor="data-resolution-limitations">
        <name>Data resolution limitations</name>
        <t>Privacy comes at the cost of computational complexity. While affine-aggregatable
encodings (AFEs) can compute many useful statistics, they require more bandwidth
and CPU cycles to account for finite-field arithmetic during input-validation.
The increased work from verifying inputs decreases the throughput of the system
or the inputs processed per unit time. Throughput is related to the verification
circuit's complexity and the available compute-time to each Aggregator.</t>
        <t>Applications that utilize proofs with a large number of multiplication gates or
a high frequency of inputs may need to limit inputs into the system to meet
bandwidth or compute constraints. Some methods of overcoming these limitations
include choosing a better representation for the data or introducing sampling
into the data collection methodology.</t>
        <t>[[TODO: Discuss explicit key performance indicators, here or elsewhere.]]</t>
      </section>
      <section anchor="aggregation-utility-and-soft-batch-deadlines">
        <name>Aggregation utility and soft batch deadlines</name>
        <t>A soft real-time system should produce a response within a deadline to be
useful. This constraint may be relevant when the value of an aggregate decreases
over time. A missed deadline can reduce an aggregate's utility but not
necessarily cause failure in the system.</t>
        <t>An example of a soft real-time constraint is the expectation that input data can
be verified and aggregated in a period equal to data collection, given some
computational budget. Meeting these deadlines will require efficient
implementations of the input-validation protocol. Applications might batch
requests or utilize more efficient serialization to improve throughput.</t>
        <t>Some applications may be constrained by the time that it takes to reach a
privacy threshold defined by a minimum number of reports. One possible solution
is to increase the reporting period so more samples can be collected, balanced
against the urgency of responding to a soft deadline.</t>
      </section>
      <section anchor="protocol-specific-optimizations">
        <name>Protocol-specific optimizations</name>
        <t>Not all DAP tasks have the same operational requirements, so the protocol is
designed to allow implementations to reduce operational costs in certain cases.</t>
        <section anchor="reducing-storage-requirements">
          <name>Reducing storage requirements</name>
          <t>In general, the Aggregators are required to keep state for tasks and all valid
reports for as long as collect requests can be made for them. In particular,
Aggregators must store a batch as long as the batch has not been queried more
than <tt>max_batch_query_count</tt> times. However, it is not always necessary to store
the reports themselves. For schemes like Prio3 <xref target="VDAF"/> in which reports are
verified only once, each Aggregator only needs to store its aggregate share for
each possible batch interval, along with the number of times the aggregate share
was used in a batch. This is due to the requirement that the batch interval
respect the boundaries defined by the DAP parameters. (See
<xref target="batch-validation"/>.)</t>
          <t>However, Aggregators are also required to implement several per-report checks
that require retaining a number of data artifacts. For example, to detect replay
attacks, it is necessary for each Aggregator to retain the set of report IDs of
reports that have been aggregated for the task so far. Depending on the task
lifetime and report upload rate, this can result in high storage costs. To
alleviate this burden, DAP allows Aggregators to drop this state as needed, so
long as reports are dropped properly as described in <xref target="input-share-validation"/>.
Aggregators <bcp14>SHOULD</bcp14> take steps to mitigate the risk of dropping reports (e.g., by
evicting the oldest data first).</t>
          <t>Furthermore, the Aggregators must store data related to a task as long as the
current time has not passed this task's <tt>task_expiration</tt>. Aggregator <bcp14>MAY</bcp14> delete
the task and all data pertaining to this task after <tt>task_expiration</tt>.
Implementors <bcp14>SHOULD</bcp14> provide for some leeway so the Collector can collect the
batch after some delay.</t>
        </section>
      </section>
    </section>
    <section anchor="compliance">
      <name>Compliance Requirements</name>
      <t>In the absence of an application or deployment-specific profile specifying
otherwise, a compliant DAP application <bcp14>MUST</bcp14> implement the following HPKE cipher
suite:</t>
      <ul spacing="normal">
        <li>KEM: DHKEM(X25519, HKDF-SHA256) (see <xref section="7.1" sectionFormat="comma" target="HPKE"/>)</li>
        <li>KDF: HKDF-SHA256 (see <xref section="7.2" sectionFormat="comma" target="HPKE"/>)</li>
        <li>AEAD: AES-128-GCM (see <xref section="7.3" sectionFormat="comma" target="HPKE"/>)</li>
      </ul>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>DAP assumes an active attacker that controls the network and has the ability to
statically corrupt any number of Clients, Aggregators, and Collectors. That is,
the attacker can learn the secret state of any party prior to the start of its
attack. For example, it may coerce a Client into providing malicious input
shares for aggregation or coerce an Aggregator into diverting from the protocol
specified (e.g., by divulging its input shares to the attacker).</t>
      <t>In the presence of this adversary, DAP aims to achieve the privacy and
robustness security goals described in <xref target="VDAF"/>'s Security Considerations
section.</t>
      <t>Currently, the specification does not achieve these goals. In particular, there
are several open issues that need to be addressed before these goals are met.
Details for each issue are below.</t>
      <ol spacing="normal" type="1"><li>When crafted maliciously, collect requests may leak more information about
the measurements than the system intends. For example, the spec currently
allows sequences of collect requests to reveal an aggregate result for a
batch smaller than the minimum batch size. [OPEN ISSUE: See issue#195. This
also has implications for how we solve issue#183.]</li>
        <li>Even benign collect requests may leak information beyond what one might
expect intuitively. For example, the Poplar1 VDAF
<xref target="VDAF"/> can be used to compute the set of heavy hitters among a set of
arbitrary bit strings uploaded by Clients. This requires multiple evaluations
of the VDAF, the results of which reveal information to the Aggregators and
Collector beyond what follows from the heavy hitters themselves. Note that
this leakage can be mitigated using differential privacy.
[OPEN ISSUE: We have yet not specified how to add DP.]</li>
        <li>The core DAP spec does not defend against Sybil attacks. In this type of
attack, the adversary adds to a batch a number of reports that skew the
aggregate result in its favor. For example: The result may reveal additional
information about the honest measurements, leading to a privacy violation; or
the result may have some property that is desirable to the adversary ("stats
poisoning"). The upload sub-protocol includes an extensions mechanism that
can be used to prevent --- or at least mitigate --- these types of attacks.
See <xref target="upload-extensions"/>. [OPEN ISSUE: No such extension has been
implemented, so we're not yet sure if the current mechanism is sufficient.]</li>
        <li>
          <t>The choice of VDAF can impact the computation required for a DAP Task. For
instance, the Poplar1 VDAF <xref target="VDAF"/> when configured to compute a set of
heavy hitters requires each measurement to be of the same bit-length which
all parties need to agree on prior to VDAF execution. The computation
required for such tasks can increase superlinearly as multiple rounds of
evaluation are needed for each bit of the measurement value.  </t>
          <t>
When dealing with variable length inputs (e.g domain names), it is
necessary to pad them to convert into fixed-size measurements. When
computing the heavy hitters from a batch of such measurements, we can
early-abort the Poplar1 execution once we have reached the padding region
for a candidate measurement. For smaller length inputs, this significantly
reduces the cost of communication between Aggregators and the steps
required for the computation. However, malicious Clients can still generate
maximum length inputs forcing the system to always operate at worst-case
performance.  </t>
          <t>
Therefore, care must be taken that a DAP deployment can comfortably handle
computation of measurements for arbitrarily large sizes, otherwise, it may
result in a DoS possibility for the entire system.</t>
        </li>
      </ol>
      <section anchor="threat-model">
        <name>Threat model</name>
        <t>[OPEN ISSUE: This subsection is a bit out-of-date.]</t>
        <t>In this section, we enumerate the actors participating in the Prio system and
enumerate their assets (secrets that are either inherently valuable or which
confer some capability that enables further attack on the system), the
capabilities that a malicious or compromised actor has, and potential
mitigations for attacks enabled by those capabilities.</t>
        <t>This model assumes that all participants have previously agreed upon and
exchanged all shared parameters over some unspecified secure channel.</t>
        <section anchor="clientuser">
          <name>Client/user</name>
          <section anchor="assets">
            <name>Assets</name>
            <ol spacing="normal" type="1"><li>Unshared inputs. Clients are the only actor that can ever see the original
inputs.</li>
              <li>Unencrypted input shares.</li>
            </ol>
          </section>
          <section anchor="capabilities">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>Individual users can reveal their own input and compromise their own privacy.</li>
              <li>Clients (that is, software which might be used by many users of the system)
can defeat privacy by leaking input outside of the Prio system.</li>
              <li>
                <t>Clients may affect the quality of aggregations by reporting false input.
                </t>
                <ul spacing="normal">
                  <li>Prio can only prove that submitted input is valid, not that it is true.
False input can be mitigated orthogonally to the Prio protocol (e.g., by
requiring that aggregations include a minimum number of contributions)
and so these attacks are considered to be outside of the threat model.</li>
                </ul>
              </li>
              <li>Clients can send invalid encodings of input.</li>
            </ol>
          </section>
          <section anchor="mitigations">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>The input validation protocol executed by the Aggregators prevents either
individual Clients or a coalition of Clients from compromising the robustness
property.</li>
              <li>If Aggregator output satisfies differential privacy <xref target="dp"/>, then all records
not leaked by malicious Clients are still protected.</li>
            </ol>
          </section>
        </section>
        <section anchor="aggregator">
          <name>Aggregator</name>
          <section anchor="assets-1">
            <name>Assets</name>
            <ol spacing="normal" type="1"><li>Unencrypted input shares.</li>
              <li>Input share decryption keys.</li>
              <li>Client identifying information.</li>
              <li>Aggregate shares.</li>
              <li>Aggregator identity.</li>
            </ol>
          </section>
          <section anchor="capabilities-1">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>Aggregators may defeat the robustness of the system by emitting bogus output
shares.</li>
              <li>
                <t>If Clients reveal identifying information to Aggregators (such as a trusted
identity during Client authentication), Aggregators can learn which Clients
are contributing input.
                </t>
                <ol spacing="normal" type="1"><li>Aggregators may reveal that a particular Client contributed input.</li>
                  <li>
                    <t>Aggregators may attack robustness by selectively omitting inputs from
certain Clients.
                    </t>
                    <ul spacing="normal">
                      <li>For example, omitting submissions from a particular geographic
region to falsely suggest that a particular localization is not
being used.</li>
                    </ul>
                  </li>
                </ol>
              </li>
              <li>Individual Aggregators may compromise availability of the system by refusing
to emit aggregate shares.</li>
              <li>Input validity proof forging. Any Aggregator can collude with a malicious
Client to craft a proof that will fool honest Aggregators into accepting
invalid input.</li>
              <li>Aggregators can count the total number of input shares, which could
compromise user privacy (and differential privacy <xref target="dp"/>) if the presence or
absence of a share for a given user is sensitive.</li>
            </ol>
          </section>
          <section anchor="mitigations-1">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>The linear secret sharing scheme employed by the Client ensures that privacy
is preserved as long as at least one Aggregator does not reveal its input
shares.</li>
              <li>If computed over a sufficient number of reports, aggregate shares reveal
nothing about either the inputs or the participating Clients.</li>
              <li>Clients can ensure that aggregate counts are non-sensitive by generating
input independently of user behavior. For example, a Client should
periodically upload a report even if the event that the task is tracking has
not occurred, so that the absence of reports cannot be distinguished from
their presence.</li>
              <li>
                <t>Bogus inputs can be generated that encode "null" shares that do not affect
the aggregate output, but mask the total number of true inputs.
                </t>
                <ul spacing="normal">
                  <li>Either Leaders or Clients can generate these inputs to mask the total
number from non-Leader Aggregators or all the Aggregators, respectively.</li>
                  <li>In either case, care must be taken to ensure that bogus inputs are
indistinguishable from true inputs (metadata, etc), especially when
constructing timestamps on reports.</li>
                </ul>
              </li>
            </ol>
            <t>[OPEN ISSUE: Define what "null" shares are. They should be defined such that
inserting null shares into an aggregation is effectively a no-op. See issue#98.]</t>
          </section>
        </section>
        <section anchor="leader">
          <name>Leader</name>
          <t>The Leader is also an Aggregator, and so all the assets, capabilities and
mitigations available to Aggregators also apply to the Leader.</t>
          <section anchor="capabilities-2">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>
                <t>Input validity proof verification. The Leader can forge proofs and collude
with a malicious Client to trick Aggregators into aggregating invalid inputs.
                </t>
                <ul spacing="normal">
                  <li>This capability is no stronger than any Aggregator's ability to forge
validity proof in collusion with a malicious Client.</li>
                </ul>
              </li>
              <li>
                <t>Relaying messages between Aggregators. The Leader can compromise availability
by dropping messages.
                </t>
                <ul spacing="normal">
                  <li>This capability is no stronger than any Aggregator's ability to refuse to
emit aggregate shares.</li>
                </ul>
              </li>
              <li>Shrinking the anonymity set. The Leader instructs Aggregators to construct
output parts and so could request aggregations over few inputs.</li>
            </ol>
          </section>
          <section anchor="mitigations-2">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>Aggregators enforce agreed upon minimum aggregation thresholds to prevent
deanonymizing.</li>
              <li>If Aggregator output satisfies differential privacy <xref target="dp"/>, then genuine
records are protected regardless of the size of the anonymity set.</li>
            </ol>
          </section>
        </section>
        <section anchor="collector">
          <name>Collector</name>
          <section anchor="capabilities-3">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>Advertising shared configuration parameters (e.g., minimum thresholds for
aggregations, joint randomness, arithmetic circuits).</li>
              <li>Collectors may trivially defeat availability by discarding aggregate shares
submitted by Aggregators.</li>
              <li>Known input injection. Collectors may collude with Clients to send known
input to the Aggregators, allowing Collectors to shrink the effective
anonymity set by subtracting the known inputs from the final output. Sybil
attacks <xref target="Dou02"/> could be used to amplify this capability.</li>
            </ol>
          </section>
          <section anchor="mitigations-3">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>Aggregators should refuse shared parameters that are trivially insecure
(i.e., aggregation threshold of 1 contribution).</li>
              <li>If Aggregator output satisfies differential privacy <xref target="dp"/>, then genuine
records are protected regardless of the size of the anonymity set.</li>
            </ol>
          </section>
        </section>
        <section anchor="aggregator-collusion">
          <name>Aggregator collusion</name>
          <t>If all Aggregators collude (e.g. by promiscuously sharing unencrypted input
shares), then none of the properties of the system hold. Accordingly, such
scenarios are outside of the threat model.</t>
        </section>
        <section anchor="attacker-on-the-network">
          <name>Attacker on the network</name>
          <t>We assume the existence of attackers on the network links between participants.</t>
          <section anchor="capabilities-4">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>
                <t>Observation of network traffic. Attackers may observe messages exchanged
between participants at the IP layer.
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>The time of transmission of input shares by Clients could reveal
information about user activity.
                    </t>
                    <ul spacing="normal">
                      <li>For example, if a user opts into a new feature, and the Client
immediately reports this to Aggregators, then just by observing
network traffic, the attacker can infer what the user did.</li>
                    </ul>
                  </li>
                  <li>
                    <t>Observation of message size could allow the attacker to learn how much
input is being submitted by a Client.
                    </t>
                    <ul spacing="normal">
                      <li>For example, if the attacker observes an encrypted message of some
size, they can infer the size of the plaintext, plus or minus the
cipher block size. From this they may be able to infer which
aggregations the user has opted into or out of.</li>
                    </ul>
                  </li>
                </ol>
              </li>
              <li>Tampering with network traffic. Attackers may drop messages or inject new
messages into communications between participants.</li>
            </ol>
          </section>
          <section anchor="mitigations-4">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>All messages exchanged between participants in the system should be
encrypted.</li>
              <li>All messages exchanged between Aggregators, the Collector and the Leader
should be mutually authenticated so that network attackers cannot impersonate
participants.</li>
              <li>Clients should be required to submit inputs at regular intervals so that the
timing of individual messages does not reveal anything.</li>
              <li>Clients should submit dummy inputs even for aggregations the user has not
opted into.</li>
            </ol>
            <t>[[OPEN ISSUE: The threat model for Prio --- as it's described in the original
paper and <xref target="BBCGGI19"/> --- considers <strong>either</strong> a malicious Client (attacking
robustness) <strong>or</strong> a malicious subset of Aggregators (attacking privacy). In
particular, robustness isn't guaranteed if any one of the Aggregators is
malicious; in theory it may be possible for a malicious Client and Aggregator to
collude and break robustness. Is this a contingency we need to address? There
are techniques in <xref target="BBCGGI19"/> that account for this; we need to figure out if
they're practical.]]</t>
          </section>
        </section>
      </section>
      <section anchor="client-authentication-or-attestation">
        <name>Client authentication or attestation</name>
        <t>[TODO: Solve issue#89]</t>
      </section>
      <section anchor="anon-proxy">
        <name>Anonymizing proxies</name>
        <t>Client reports can contain auxiliary information such as source IP, HTTP user
agent or in deployments which use it, client authentication information, which
could be used by Aggregators to identify participating Clients or permit some
attacks on robustness. This auxiliary information could be removed by having
Clients submit reports to an anonymizing proxy server which would then use
Oblivious HTTP <xref target="I-D.draft-ietf-ohai-ohttp-07"/> to forward inputs to the
DAP Leader, without requiring any server participating in DAP to be aware of
whatever client authentication or attestation scheme is in use.</t>
      </section>
      <section anchor="batch-parameters">
        <name>Batch parameters</name>
        <t>An important parameter of a DAP deployment is the minimum batch size. If an
aggregation includes too few inputs, then the outputs can reveal information
about individual participants. Aggregators use the batch size field of the
shared task parameters to enforce minimum batch size during the collect
protocol, but server implementations may also opt out of participating in a DAP
task if the minimum batch size is too small. This document does not specify how
to choose minimum batch sizes.</t>
        <t>The DAP parameters also specify the maximum number of times a report can be
used. Some protocols, such as Poplar <xref target="BBCGGI21"/>, require reports to be used in
multiple batches spanning multiple collect requests.</t>
      </section>
      <section anchor="dp">
        <name>Differential privacy</name>
        <t>Optionally, DAP deployments can choose to ensure their output F achieves
differential privacy <xref target="Vad16"/>. A simple approach would require the Aggregators to
add two-sided noise (e.g. sampled from a two-sided geometric distribution) to
outputs. Since each Aggregator is adding noise independently, privacy can be
guaranteed even if all but one of the Aggregators is malicious. Differential
privacy is a strong privacy definition, and protects users in extreme
circumstances: even if an adversary has prior knowledge of every input in a
batch except for one, that one record is still formally protected.</t>
        <t>[OPEN ISSUE: While parameters configuring the differential privacy noise (like
specific distributions / variance) can be agreed upon out of band by the
Aggregators and Collector, there may be benefits to adding explicit protocol
support by encoding them into task parameters.]</t>
      </section>
      <section anchor="robustness-in-the-presence-of-malicious-servers">
        <name>Robustness in the presence of malicious servers</name>
        <t>Most DAP protocols, including Prio and Poplar, are robust against malicious
clients, but are not robust against malicious servers. Any Aggregator can simply
emit bogus aggregate shares and undetectably spoil aggregates. If enough
Aggregators were available, this could be mitigated by running the protocol
multiple times with distinct subsets of Aggregators chosen so that no Aggregator
appears in all subsets and checking all the outputs against each other. If all
the protocol runs do not agree, then participants know that at least one
Aggregator is defective, and it may be possible to identify the defector (i.e.,
if a majority of runs agree, and a single Aggregator appears in every run that
disagrees). See
<eref target="https://github.com/ietf-wg-ppm/draft-ietf-ppm-dap/issues/22">#22</eref> for
discussion.</t>
      </section>
      <section anchor="verification-key">
        <name>Verification key requirements</name>
        <t>The verification key for a task <bcp14>SHOULD</bcp14> be chosen before any reports are generated.
It <bcp14>SHOULD</bcp14> be fixed for the lifetime of the task and not be rotated. One way
to ensure this is to include the verification key in a derivation of the task ID.</t>
        <t>This consideration comes from current security analysis for existing VDAFs. For example,
to ensure that the security proofs for Prio3 hold, the verification key <bcp14>MUST</bcp14> be
chosen independently of the generated reports. This can be achieved as
recommended above.</t>
      </section>
      <section anchor="infrastructure-diversity">
        <name>Infrastructure diversity</name>
        <t>Prio deployments should ensure that Aggregators do not have common dependencies
that would enable a single vendor to reassemble inputs. For example, if all
participating Aggregators stored unencrypted input shares on the same cloud
object storage service, then that cloud vendor would be able to reassemble all
the input shares and defeat privacy.</t>
      </section>
      <section anchor="operational-requirements">
        <name>System requirements</name>
        <section anchor="data-types">
          <name>Data types</name>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="protocol-message-media-types">
        <name>Protocol Message Media Types</name>
        <t>This specification defines the following protocol messages, along with their
corresponding media types types:</t>
        <ul spacing="normal">
          <li>HpkeConfigList <xref target="hpke-config"/>: "application/dap-hpke-config-list"</li>
          <li>Report <xref target="upload-request"/>: "application/dap-report"</li>
          <li>AggregationJobInitReq <xref target="leader-init"/>: "application/dap-aggregation-job-init-req"</li>
          <li>AggregationJobResp <xref target="aggregation-helper-init"/>: "application/dap-aggregation-job-resp"</li>
          <li>AggregationJobContinueReq <xref target="aggregation-leader-continuation"/>: "application/dap-aggregation-job-continue-req"</li>
          <li>AggregateShareReq <xref target="collect-flow"/>: "application/dap-aggregate-share-req"</li>
          <li>AggregateShare <xref target="collect-flow"/>: "application/dap-aggregate-share"</li>
          <li>CollectionReq <xref target="collect-flow"/>: "application/dap-collect-req"</li>
          <li>Collection <xref target="collect-flow"/>: "application/dap-collection"</li>
        </ul>
        <t>The definition for each media type is in the following subsections.</t>
        <t>Protocol message format evolution is supported through the definition of new
formats that are identified by new media types.</t>
        <t>IANA [shall update / has updated] the "Media Types" registry at
https://www.iana.org/assignments/media-types with the registration information
in this section for all media types listed above.</t>
        <t>[OPEN ISSUE: Solicit review of these allocations from domain experts.]</t>
        <section anchor="applicationdap-hpke-config-list-media-type">
          <name>"application/dap-hpke-config-list" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-hpke-config-list</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="task-configuration"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-report-media-type">
          <name>"application/dap-report" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-report</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="upload-request"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregation-job-init-req-media-type">
          <name>"application/dap-aggregation-job-init-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregation-job-init-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregation-job-resp-media-type">
          <name>"application/dap-aggregation-job-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregation-job-resp</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregation-job-continue-req-media-type">
          <name>"application/dap-aggregation-job-continue-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregation-job-continue-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregate-share-req-media-type">
          <name>"application/dap-aggregate-share-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregate-share-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregate-share-media-type">
          <name>"application/dap-aggregate-share" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregate-share</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-collect-req-media-type">
          <name>"application/dap-collect-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-collect-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-collection-media-type">
          <name>"application/dap-collection" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-collection</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="query-type-reg">
        <name>Query Types Registry</name>
        <t>This document requests creation of a new registry for Query Types. This registry
should contain the following columns:</t>
        <t>[TODO: define how we want to structure this registry when the time comes]</t>
      </section>
      <section anchor="upload-extension-registry">
        <name>Upload Extension Registry</name>
        <t>This document requests creation of a new registry for extensions to the Upload
protocol. This registry should contain the following columns:</t>
        <t>[TODO: define how we want to structure this registry when the time comes]</t>
      </section>
      <section anchor="urn-space">
        <name>URN Sub-namespace for DAP (urn:ietf:params:ppm:dap)</name>
        <t>The following value [will be/has been] registered in the "IETF URN Sub-namespace
for Registered Protocol Parameter Identifiers" registry, following the template
in <xref target="RFC3553"/>:</t>
        <artwork><![CDATA[
Registry name:  dap

Specification:  [[THIS DOCUMENT]]

Repository:  http://www.iana.org/assignments/dap

Index value:  No transformation needed.
]]></artwork>
        <t>Initial contents: The types and descriptions in the table in <xref target="errors"/> above,
with the Reference field set to point to this specification.</t>
      </section>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The text in <xref target="message-transport"/> is based extensively on <xref target="RFC8555"/></t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="VDAF">
          <front>
            <title>Verifiable Distributed Aggregation Functions</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="David Cook" initials="D." surname="Cook">
              <organization>ISRG</organization>
            </author>
            <author fullname="Christopher Patton" initials="C." surname="Patton">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Phillipp Schoppmann" initials="P." surname="Schoppmann">
              <organization>Google</organization>
            </author>
            <date day="15" month="June" year="2023"/>
            <abstract>
              <t>   This document describes Verifiable Distributed Aggregation Functions
   (VDAFs), a family of multi-party protocols for computing aggregate
   statistics over user measurements.  These protocols are designed to
   ensure that, as long as at least one aggregation server executes the
   protocol honestly, individual measurements are never seen by any
   server in the clear.  At the same time, VDAFs allow the servers to
   detect if a malicious or misconfigured client submitted an input that
   would result in an incorrect aggregate result.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vdaf-06"/>
        </reference>
        <reference anchor="RFC7807">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <date month="March" year="2016"/>
            <abstract>
              <t>This document defines a "problem detail" as a way to carry machine- readable details of errors in a HTTP response to avoid the need to define new error response formats for HTTP APIs.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7807"/>
          <seriesInfo name="DOI" value="10.17487/RFC7807"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="HPKE">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="OAuth2">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5861">
          <front>
            <title>HTTP Cache-Control Extensions for Stale Content</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document defines two independent HTTP Cache-Control extensions that allow control over the use of stale responses by caches. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5861"/>
          <seriesInfo name="DOI" value="10.17487/RFC5861"/>
        </reference>
        <reference anchor="RFC9111">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="SHS">
          <front>
            <title>Secure Hash Standard</title>
            <author fullname="Quynh H. Dang" initials="Q." surname="Dang">
              <organization/>
            </author>
            <date month="July" year="2015"/>
          </front>
          <seriesInfo name="National Institute of Standards and Technology" value="report"/>
          <seriesInfo name="DOI" value="10.6028/nist.fips.180-4"/>
        </reference>
        <reference anchor="I-D.draft-ietf-ohai-ohttp-07">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="9" month="March" year="2023"/>
            <abstract>
              <t>   This document describes a system for forwarding encrypted HTTP
   messages.  This allows a client to make multiple requests to an
   origin server without that server being able to link those requests
   to the client or to identify the requests as having come from the
   same client, while placing only limited trust in the nodes used to
   forward the messages.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-ohttp-07"/>
        </reference>
        <reference anchor="RFC3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <author fullname="T. Hardie" initials="T." surname="Hardie"/>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <date month="June" year="2003"/>
            <abstract>
              <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items. The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="73"/>
          <seriesInfo name="RFC" value="3553"/>
          <seriesInfo name="DOI" value="10.17487/RFC3553"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="CGB17" target="https://crypto.stanford.edu/prio/paper.pdf">
          <front>
            <title>Prio: Private, Robust, and Scalable Computation of Aggregate Statistics</title>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <date year="2017" month="March" day="14"/>
          </front>
        </reference>
        <reference anchor="BBCGGI19" target="https://eprint.iacr.org/2019/188">
          <front>
            <title>Zero-Knowledge Proofs on Secret-Shared Data via Fully Linear PCPs</title>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <author initials="E." surname="Boyle">
              <organization/>
            </author>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2021" month="January" day="05"/>
          </front>
        </reference>
        <reference anchor="BBCGGI21" target="https://eprint.iacr.org/2021/017">
          <front>
            <title>Lightweight Techniques for Private Heavy Hitters</title>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <author initials="E." surname="Boyle">
              <organization/>
            </author>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2021" month="January" day="05"/>
          </front>
        </reference>
        <reference anchor="Dou02" target="https://link.springer.com/chapter/10.1007/3-540-45748-8_24">
          <front>
            <title>The Sybil Attack</title>
            <author initials="J." surname="Douceur">
              <organization/>
            </author>
            <date year="2022" month="October" day="10"/>
          </front>
        </reference>
        <reference anchor="Vad16" target="https://privacytools.seas.harvard.edu/files/privacytools/files/complexityprivacy_1.pdf">
          <front>
            <title>The Complexity of Differential Privacy</title>
            <author initials="S." surname="Vadhan">
              <organization/>
            </author>
            <date year="2016" month="August" day="09"/>
          </front>
        </reference>
        <reference anchor="RFC8555">
          <front>
            <title>Automatic Certificate Management Environment (ACME)</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="J. Hoffman-Andrews" initials="J." surname="Hoffman-Andrews"/>
            <author fullname="D. McCarney" initials="D." surname="McCarney"/>
            <author fullname="J. Kasten" initials="J." surname="Kasten"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>Public Key Infrastructure using X.509 (PKIX) certificates are used for a number of purposes, the most significant of which is the authentication of domain names. Thus, certification authorities (CAs) in the Web PKI are trusted to verify that an applicant for a certificate legitimately represents the domain name(s) in the certificate. As of this writing, this verification is done through a collection of ad hoc mechanisms. This document describes a protocol that a CA and an applicant can use to automate the process of verification and certificate issuance. The protocol also provides facilities for other certificate management functions, such as certificate revocation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8555"/>
          <seriesInfo name="DOI" value="10.17487/RFC8555"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y9+3obx5Uv+n89RQ/0h8kEgEjdLFNxMrIk25zYlkaSc5mc
bKEJNImOgG6kuyEKkbWf5TzLebKzrlWrqhsk5Xhm7/3N1jcTSwC6ui6r1n39
1mQycV3ZrYqTbPS0bLumPNt2xSJ7fHHRFBd5V9ZV9qKpu3per7LzuoF/lO/y
+Q7+W7RF866sLrLvi7zdNsW6qLqRy8/OmuLdSfb08YvJixffu0U9r/I1DL9o
8vNuUhbd+WSzWU8W+WZydN/N8664qJvdSdZ2C+feFdW2OHFZdtHU2w3M6brX
ZVm32+Dk/1g3b/Hbb/BB/Hydlyv4HN71r/jSad1c4Md5M1/Cx8uu27Qnt2/j
r/Cj8l0x1Z/dxg9unzX1ZVvchudv43MXZbfcnsGTtILLC1zE7f6a8KcrWFPb
mZeYR6Y8zrSsBx4e+Gi67NarEWzMSXbPuXzbLesG9mcCr6E/ZdWeZK+n2TdF
fbGEA6v0C9701+W6/xUsMa/Kf9DhnmSnr15+o98UvGldub6Ah36NE/nXC/xs
Oq/XLn3tk2n2Iu+6Onnnk2UDhFRvlkWTfB+/+Mmq3i7OYfeL5PVzHGBDT143
hWfT7GXRzutmlceTeNaU895X8fu/r/9RrsKX8vLibfOvTXe+3rfix9Psj3W9
2L/k5Ac3XXN++a/LIt8ACZ+VXTutis45V1Zw5dbw7Du4FPDEk2++Ov78hB7V
SwsXpD7hW9kV4+xlfbZtu3GWV4vs1Txf5WerIntSrzfbji9zfe7vdpG9wg/b
rpy3Ixp0AR+eZHeOjj+fHN2dHN/jN+XNRWHJed7sNl09bbscp7eYFovt7Q1M
4/Ym3xTNdLM459E8tdKfCW/ht1OYTtOUsCuTb8qzszb++uk0+6quiiWu9quv
nnzzzenxF/GC/6No6snvq/pyVSwuCmRO9XmbwcpeFfOm6CavlrC7i+xp3uXZ
uzLPvt6uVrvsu7IqcqDHJy+Spd45nhwdIycaXGoB66q6aZnPG+IMsDVf3D5+
+PCKBfoVRJ8+w093q+KTNuMHuNfl6qzO44//PM1O22Vehj26cxzv0XflxbK7
LPB/s9fFfFmVf98WbeDfcPTfFvm7XfZt2XVF809uyZ3j20Ax/9tsydN6e3Qn
3o/XS6D13Vm5yh53XT5/m6z3zuT4CP5veL2rsno7bXHRF0DcwBVuz5f5Bnbt
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
typyAQIA

-->

</rfc>
