<?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.18 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-04" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.3 -->
  <front>
    <title abbrev="DAP-PPM">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-04"/>
    <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="March" day="13"/>
    <abstract>
      <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>
    <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>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>
        <dl>
          <dt>Aggregate result:</dt>
          <dd>
            <t>The output of the aggregation function over a given set of measurements and
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 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>An 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 prepared 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>A distinguished Aggregator that coordinates aggregation and collection
amongst the Aggregators.</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 small set of servers.
Servers are 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> users, 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 measurements into a
sequence 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 a subset of the input shares, it is impossible to deduce the
plaintext measurement from which they were 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[
                    +------------+
                    |            |
+--------+          |   Helper   |
|        |          |            |
| Client +----+     +-----^------+
|        |    |           |
+--------+    |           |
              |           |
+--------+    |     +-----v------+         +-----------+
|        |    +----->            |         |           |
| Client +---------->   Leader   <---------> Collector |
|        |    +----->            |         |           |
+--------+    |     +-----^------+         +-----------+
              |           |
+--------+    |           |
|        |    |           |
| Client +----+     +-----V------+
|        |          |            |
+--------+          |   Helper   |
                    |            |
                    +------------+
]]></artwork>
        </figure>
        <t>[[OPEN ISSUE: This shows two helpers, but the document only allows one for now.
https://github.com/ietf-wg-ppm/draft-ietf-ppm-dap/issues/117]]</t>
        <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 the other
Aggregators to compute the aggregate result. This protocol defines two types of
Aggregators: Leaders and Helpers. For each measurement task, there is a single
Leader and Helper.</t>
          </dd>
          <dt>Leader:</dt>
          <dd>
            <t>The Aggregator responsible for coordinating the protocol. It receives the
reports, splits them into report shares, and distributes the report shares to
the Helpers, and orchestrates the process of computing the aggregate result as
requested by the Collector.</t>
          </dd>
          <dt>Helper:</dt>
          <dd>
            <t>Helpers are responsible for executing the protocol as instructed by the
Leader. The protocol is designed so that Helpers can be relatively
lightweight, with most of the state held at the Leader.</t>
          </dd>
        </dl>
        <t>The basic unit of DAP is the "task" which represents a single measurement
process (though potentially taken over multiple time windows). 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 out of band to the Clients and to the
Aggregators. They are distributed by the Collector in some authenticated form.
Each task is identified by a unique 32-byte ID which is used to refer to it in
protocol messages.</t>
        <t>During the duration of the 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 Helpers 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 distributed
zero-knowledge proof of the input's validity <xref target="BBCGGI19"/> 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">unrecognizedMessage</td>
              <td align="left">The message type for a response was incorrect or the payload was malformed.</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">queryMismatch</td>
              <td align="left">Query type indicated by a message does not match the task's query type.</td>
            </tr>
            <tr>
              <td align="left">roundMismatch</td>
              <td align="left">The aggregators disagree on the current round of the VDAF preparation protocol.</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
'unrecognizedMessage'" refers to an error document with "type" value
"urn:ietf:params:ppm:dap:error:unrecognizedMessage".</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>A resource's path is resolved relative to a server's endpoint to construct a
resource URI. Resource paths are specified as templates like:</t>
      <artwork><![CDATA[
{role}/resource_type/{resource-id}
]]></artwork>
      <t><tt>{role}</tt> is one of the API endpoints in the task's <tt>aggregator_endpoints</tt> (see
<xref target="task-configuration"/>). The remainder of the path is resolved relative to the
endpoint.</t>
      <t>DAP resource identifiers are opaque byte strings, so any occurrence of
<tt>{resource-id}</tt> in a URL template (e.g., <tt>{task-id}</tt> or <tt>{report-id}</tt>) <bcp14>MUST</bcp14> be
expanded to the URL-safe, unpadded Base 64 representation of the corresponding
resource identifier, as specified in Sections <xref target="RFC4648" section="5" sectionFormat="bare"/> and <xref target="RFC4648" section="3.2" sectionFormat="bare"/> of <xref target="RFC4648"/>.</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 (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>(1659545000, 1000)</tt>, <tt>(1659546000, 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>A <tt>TaskID</tt> is a globally unique sequence of bytes. It is <bcp14>RECOMMENDED</bcp14> that this
be set to a random string output by a cryptographically secure pseudorandom
number generator. Each task has the following parameters associated with it:</t>
        <ul spacing="normal">
          <li>
            <tt>aggregator_endpoints</tt>: A list of URLs relative to which each Aggregator's API
endpoints can be found. Each endpoint's list <bcp14>MUST</bcp14> be in the same order. The
Leader's endpoint <bcp14>MUST</bcp14> be the first in the list. The order of the
<tt>encrypted_input_shares</tt> in a <tt>Report</tt> (see <xref target="upload-flow"/>) <bcp14>MUST</bcp14> be the same
as the order in which aggregators appear in this list.</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_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>
      </section>
      <section anchor="upload-flow">
        <name>Uploading Reports</name>
        <t>Clients periodically upload reports to the Leader, which then distributes the
individual report shares to each Helper.</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. 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>SHOULD</bcp14> allocate distinct id values for each <tt>HpkeConfig</tt> in a
<tt>HpkeConfigList</tt>. The <bcp14>RECOMMENDED</bcp14> strategy for generating these values is via
rejection sampling, i.e., to randomly select an id value repeatedly until it
does not match any known <tt>HpkeConfig</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>, where <tt>{leader}</tt> is the first entry in the
task's Aggregator endpoints.</t>
          <t>The payload is 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 encrypted_input_shares<1..2^32-1>;
} 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>encrypted_input_shares</tt> is the sequence of input shares encrypted to each of
the Aggregators.</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-04 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 order of the encrypted input shares appear <bcp14>MUST</bcp14> match the order of the
task's <tt>aggregator_endpoints</tt>. That is, the first share should be the Leader's,
the second share should be for the first Helper, and so on.</t>
          <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'. If the leader
supports multiple HPKE configurations, it can use trial decryption with each
configuration to determine if requests match a known HPKE configuration. 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 enforced by all Aggregators, not just the Leader.
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 ReportShare contains an unrecognized extension, or if two
extensions have the same ExtensionType, then the Leader <bcp14>MAY</bcp14> abort the upload
request with error "unrecognizedMessage". Note that this behavior is not
mandatory because it requires the Leader to decrypt its ReportShare.</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
all 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 verifying and aggregating them with the Helpers. To enable
the system to handle very large batches of reports, this process can be
parallelized across smaller sets of reports. Verification of a set of reports is
referred to as an "aggregation job". Each aggregation job is associated with
exactly one DAP task, and a DAP task can have many aggregation jobs. Each job is
associated with an ID that is unique within the context of a DAP task in order
to distinguish different jobs from one another. Each aggregator uses this ID as
an index into per-job storage, e.g., to keep track of report shares that belong
to a given aggregation job.</t>
        <t>To run an aggregation job, the Leader sends a request to each Helper containing
the report shares in the job. Each Helper then processes them (verifying the
proofs and incorporating their values into the ongoing aggregate) and responds
to the Leader.</t>
        <t>The exact structure of the aggregation job flow depends on the VDAF.
Specifically:</t>
        <ul spacing="normal">
          <li>Some VDAFs (e.g., Prio3) allow the leader to start aggregating reports
proactively before all the reports in a batch are received. Others (e.g.,
Poplar1) require all the reports to be present and must be initiated by the
collector.</li>
          <li>Processing the reports -- especially validating them -- may require multiple
round trips.</li>
        </ul>
        <t>Note that it is possible to aggregate reports from one batch while reports from
the next batch are coming in. This is because each report is validated
independently.</t>
        <t>This process is illustrated below in <xref target="aggregation-flow-illustration"/>. In this
example, the batch size is 20, but the Leader opts to process the reports in
sub-batches of 10. Each sub-batch takes two round-trips to process.</t>
        <figure anchor="aggregation-flow-illustration">
          <name>Aggregation Flow (batch size=20). Multiple aggregation flows can be executed at the same time.</name>
          <artwork><![CDATA[
Leader                                                 Helper

Aggregate request (Reports 1-10, Job = N) --------------->  \
<----------------------------- Aggregate response (Job = N) | Reports
Aggregate request (continued, Job = N) ------------------>  | 1-10
<----------------------------- Aggregate response (Job = N) /


Aggregate request (Reports 11-20, Job = M) -------------->  \
<----------------------------- Aggregate response (Job = M) | Reports
Aggregate request (continued, Job = M) ------------------>  | 11-20
<----------------------------- Aggregate response (Job = M) /
]]></artwork>
        </figure>
        <t>The aggregation flow can be thought of as having three phases for transforming
each valid input report share into an output share:</t>
        <ul spacing="normal">
          <li>Initialization: Begin the aggregation flow by sharing report shares with each
Helper. Each Aggregator, including the Leader, initializes the underlying VDAF
instance using these report shares and the VDAF configured for the
corresponding measurement task.</li>
          <li>Continuation: Continue the aggregation flow by exchanging messages produced by
the underlying VDAF instance until aggregation completes or an error occurs.
These messages do not replay the shares.</li>
          <li>Completion: Finish the aggregate flow, yielding an output share corresponding
for each input report share in the batch.</li>
        </ul>
        <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 unique job ID. 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 Helpers 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 invalid.</li>
            <li>For each valid report share, initialize the VDAF preparation process (see
<xref section="5.2" sectionFormat="of" target="VDAF"/>).</li>
          </ol>
          <t>An invalid report share is marked with one of the following errors:</t>
          <artwork><![CDATA[
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),
  unrecognized_message(8),
  report_too_early(9),
  (255)
} ReportShareError;
]]></artwork>
          <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
report shares as follows:</t>
            <ol spacing="normal" type="1"><li>Generate a fresh AggregationJobID. This ID <bcp14>MUST</bcp14> be unique within the context
of the corresponding DAP task. It is <bcp14>RECOMMENDED</bcp14> that this be set to a random
string output by a cryptographically secure pseudorandom number generator.</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>
              <li>Initialize VDAF preparation as described in <xref target="input-share-prep"/>.</li>
            </ol>
            <t>If any step invalidates the report share, the Leader removes the report share
from the set of candidate reports. Once the leader has initialized this state
for all valid candidate report shares, it creates an <tt>AggregationJobInitReq</tt>
message for each Helper to initialize the preparation of this candidate set. The
<tt>AggregationJobInitReq</tt> message is structured as follows:</t>
            <artwork><![CDATA[
struct {
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
  HpkeCiphertext encrypted_input_share;
} ReportShare;

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;
  ReportShare report_shares<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 opaque, VDAF-specific aggregation parameter provided during
the collection flow (<xref target="collect-flow"/>),</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 fixed_size 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 "queryMismatch".  </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>report_shares</tt>: The sequence of report shares to aggregate. The
<tt>encrypted_input_share</tt> field of the report share is the <tt>HpkeCiphertext</tt>
whose index in <tt>Report.encrypted_input_shares</tt> is equal to the index of the
aggregator in the task's <tt>aggregator_endpoints</tt> to which the
<tt>AggregationJobInitReq</tt> is being sent.</li>
            </ul>
            <t>Let <tt>{aggregator}</tt> denote the Helper's API endpoint. The Leader sends a PUT
request to <tt>{aggregator}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt>
with its <tt>AggregationJobInitReq</tt> message as the payload. The media type is
"application/dap-aggregation-job-init-req". The Leader's aggregation job is now
in round 0.</t>
            <t>The Helper's response will be an <tt>AggregationJobResp</tt> message (see
<xref target="aggregation-helper-init"/>, which the Leader validates according to the
criteria in <xref target="aggregation-job-validation"/>. If the message is valid, the Leader
moves to the aggregation job continuation phase with the enclosed prepare steps,
as described in <xref target="agg-continue-flow"/>. Otherwise, the Leader should abandon the
aggregation job entirely.</t>
          </section>
          <section anchor="aggregation-helper-init">
            <name>Helper Initialization</name>
            <t>Each Helper begins their portion of the aggregate initialization when they
receive an AggregationJobInitReq message from the Leader. For each ReportShare
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 its prepare message in its response that the Leader will use to
continue the process.</t>
            <t>To begin this process, the Helper first checks if it recognizes the task ID. If
not, then it <bcp14>MUST</bcp14> abort with error <tt>unrecognizedTask</tt>. Then the Helper checks
that the report IDs in <tt>AggregationJobInitReq.report_shares</tt> are all distinct.
If two ReportShare values have the same report ID, then the helper <bcp14>MUST</bcp14> abort
with error <tt>unrecognizedMessage</tt>. If this check succeeds, the helper then
attempts to recover each input share in <tt>AggregationJobInitReq.report_shares</tt> 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>
              <li>Initialize VDAF preparation and initial outputs as described in
<xref target="input-share-prep"/>.</li>
            </ol>
            <t>Once the Helper has processed each report share in
<tt>AggregationJobInitReq.report_shares</tt>, the Helper creates an
<tt>AggregationJobResp</tt> message to complete its initialization. This message is
structured as follows:</t>
            <artwork><![CDATA[
enum {
  continued(0),
  finished(1),
  failed(2),
  (255)
} PrepareStepState;

struct {
  ReportID report_id;
  PrepareStepState prepare_step_state;
  select (PrepareStep.prepare_step_state) {
    case continued: opaque prep_msg<0..2^32-1>; /* VDAF preparation message */
    case finished:  Empty;
    case failed:    ReportShareError;
  };
} PrepareStep;

struct {
  PrepareStep prepare_steps<1..2^32-1>;
} AggregationJobResp;
]]></artwork>
            <t>The message is a sequence of PrepareStep values, the order of which matches that
of the ReportShare values in <tt>AggregationJobInitReq.report_shares</tt>. Each report
that was marked as invalid is assigned the <tt>PrepareStepState</tt> <tt>failed</tt>.
Otherwise, the <tt>PrepareStep</tt> is either marked as continued with the output
<tt>prep_msg</tt>, or is marked as finished if the VDAF preparation process is finished
for the report share. The Helper's aggregation job is now in round 0.</t>
            <t>On success, 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>
          </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), the public share sent to each Aggregator, and the recipient'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-04 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 the leader supports multiple HPKE configurations
with non-distinct configuration identifiers, it can use trial decryption with
each 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 ReportShareError
error.</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>unrecognized_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
"task_expired".</li>
              <li>Check if the PlaintextInputShare contains unrecognized extensions. If so, the
Aggregator <bcp14>MUST</bcp14> mark the input share as invalid with error
"unrecognized_message".</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 "unrecognized_message".</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
"batch_collected". 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 AggregateShareReq message from the Leader. A batches 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 fixed_size 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
"batch_saturated". 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 anchor="input-share-prep">
            <name>Input Share Preparation</name>
            <t>Input share preparation consists of running the preparation-state initialization
algorithm for the VDAF associated with the task and computing the first state
transition. This produces three possible values:</t>
            <ol spacing="normal" type="1"><li>An error, in which case the input report share is marked as invalid.</li>
              <li>An output share, in which case the aggregator stores the output share for
future collection as described in <xref target="collect-flow"/>.</li>
              <li>An initial VDAF state and preparation message-share, denoted <tt>(prep_state,
prep_share)</tt>.</li>
            </ol>
            <t>Each aggregator runs this procedure for a given input share with corresponding
report ID as follows:</t>
            <artwork><![CDATA[
prep_state = VDAF.prep_init(vdaf_verify_key,
                            agg_id,
                            agg_param,
                            report_id,
                            public_share,
                            plaintext_input_share.payload)
out = VDAF.prep_next(prep_state, None)
]]></artwork>
            <t><tt>vdaf_verify_key</tt> is the VDAF verification key shared by the Aggregators;
<tt>agg_id</tt> is the aggregator ID (<tt>0x00</tt> for the Leader and <tt>0x01</tt> for the helper);
<tt>agg_param</tt> is the opaque aggregation parameter distributed to the Aggregators
by the Collector; <tt>public_share</tt> is the public share generated by the client and
distributed to each aggregator; and <tt>plaintext_input_share</tt> is the Aggregator's
PlaintextInputShare.</t>
            <t>If either step fails, the Aggregator marks the report as invalid with error
<tt>vdaf_prep_error</tt>. Otherwise, the value <tt>out</tt> is interpreted as follows. If this
is the last round of the VDAF, then <tt>out</tt> is the aggregator's output share.
Otherwise, <tt>out</tt> is the pair <tt>(prep_state, prep_share)</tt>.</t>
          </section>
          <section anchor="aggregation-job-validation">
            <name>Aggregation Job Validation</name>
            <t>During the aggregation job initialization (<xref target="leader-init"/>) or continuation
(<xref target="agg-continue-flow"/>) phases, the Leader will receive an <tt>AggregationJobResp</tt>
message from the Helper, which needs to be validated before the Leader can move
to the next phase of the aggregation protocol.</t>
            <t>An <tt>AggregationJobResp</tt> is valid only if it satisfies the following requirement:</t>
            <ul spacing="normal">
              <li>The Helper's <tt>prepare_steps</tt> <bcp14>MUST</bcp14> include exactly the same report IDs in the
same order as either the <tt>report_shares</tt> in the Leader's
<tt>AggregationJobInitReq</tt> (if this is the first round of continuation) or the
<tt>prepare_steps</tt> in the Leader's <tt>AggregationJobContinueReq</tt> (if this is a
subsequent round).</li>
            </ul>
            <t>[[OPEN ISSUE: consider relaxing this ordering constraint. See issue#217.]]</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 share
in the candidate report set until the underlying VDAF moves into a terminal
state, yielding an output share for all Aggregators or an error. This phase may
involve multiple rounds of interaction depending on the underlying VDAF. Each
round trip is initiated by the leader.</t>
          <section anchor="aggregation-leader-continuation">
            <name>Leader Continuation</name>
            <t>The Leader begins each round of continuation for a report share based on its
locally computed prepare message and the previous PrepareStep from the Helper.
If PrepareStep is of type <tt>failed</tt>, then the leader acts based on the value of
the <tt>ReportShareError</tt>:</t>
            <ul spacing="normal">
              <li>If the error is <tt>ReportShareError.report_too_early</tt>, then the leader <bcp14>MAY</bcp14> try
to re-send the report in a later <tt>AggregationJobInitReq</tt>.</li>
              <li>For any other error, the leader marks the report as failed, removes it from
the candidate report set and does not process it further.</li>
            </ul>
            <t>If the type is <tt>finished</tt> and the Leader's preparation of this report share is
also finished, then the report share is aggregated and can now be collected (see
<xref target="collect-flow"/>). If the Leader is not finished, then the report cannot be
processed further and <bcp14>MUST</bcp14> be removed from the candidate set.</t>
            <t>If the Helper's <tt>PrepareStep</tt> is of type <tt>continued</tt>, then the Leader proceeds
as follows.</t>
            <t>Let <tt>leader_prep_share</tt> denote the Leader's prepare message-share and
<tt>helper_prep_share</tt> denote the Helper's. The Leader computes the next state
transition as follows:</t>
            <artwork><![CDATA[
prep_msg = VDAF.prep_shares_to_prep(agg_param, [
    leader_prep_share,
    helper_prep_share,
])
out = VDAF.prep_next(prep_state, prep_msg)
]]></artwork>
            <t>where <tt>[leader_prep_share, helper_prep_share]</tt> is a vector of two elements. If
either of these operations fails, then the leader marks the report as invalid
with error "prep_share_failed". Otherwise it interprets <tt>out</tt> as follows: If
this is the last round of the VDAF, then <tt>out</tt> is the Leader's output share, in
which case it stores the output share for further processing as described in
<xref target="collect-flow"/>. Otherwise, <tt>out</tt> is the pair <tt>(next_prep_state,
next_prep_share)</tt>, where <tt>next_prep_state</tt> is its updated state and
<tt>next_prep_share</tt> is its next preparation message-share (which will be
<tt>leader_prep_share</tt> in the next round of continuation). For the latter case, the
helper sets <tt>prep_state</tt> to <tt>next_prep_state</tt>.</t>
            <t>The Leader now advances its aggregation job to the next round (round 1 if this
is the first continuation after initialization) and then instructs the Helper to
advance the aggregation job to the round the Leader has just reached by sending
the new <tt>prep_msg</tt> message to the Helper in a POST request to the aggregation
job URI used during initialization (see <xref target="leader-init"/>). The body of the
request is an <tt>AggregationJobContinueReq</tt>:</t>
            <artwork><![CDATA[
struct {
  u16 round;
  PrepareStep prepare_steps<1..2^32-1>;
} AggregationJobContinueReq;
]]></artwork>
            <t>The <tt>round</tt> field is the round of VDAF preparation that the Leader just reached
and wants the Helper to advance to.</t>
            <t>The <tt>prepare_steps</tt> field <bcp14>MUST</bcp14> be a sequence of <tt>PrepareStep</tt>s in the
<tt>continued</tt> state containing the corresponding <tt>inbound</tt> prepare message. The
media type is set to "application/dap-aggregation-job-continue-req".</t>
            <t>The Helper's response will be an <tt>AggregationJobResp</tt> message (see
<xref target="aggregation-helper-init"/>), which the Leader validates according to
the criteria in <xref target="aggregation-job-validation"/>. If the message is valid, the
Leader moves to the next round of continuation with the enclosed prepare steps.
Otherwise, the Leader should abandon the aggregation job entirely.</t>
          </section>
          <section anchor="aggregation-helper-continuation">
            <name>Helper Continuation</name>
            <t>If the Helper does not recognize the task ID, then it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
            <t>Otherwise, the Helper continues with preparation for a report share by combining
the previous message round's prepare message (carried by the AggregationJobReq)
and its current preparation state (<tt>prep_state</tt>). This step yields one of three
outputs:</t>
            <ol spacing="normal" type="1"><li>An error, in which case the report share is marked as invalid.</li>
              <li>An output share, in which case the helper stores the output share for future
collection as described in <xref target="collect-flow"/>.</li>
              <li>Its next VDAF preparation state and message-share, denoted <tt>(next_prep_state,
next_prep_share)</tt>.</li>
            </ol>
            <t>To carry out this step, for each <tt>PrepareStep</tt> in <tt>AggregationJob.prepare_steps</tt>
received from the leader, the helper performs the following check to determine
if it should continue preparing the report share:</t>
            <ul spacing="normal">
              <li>If the status is <tt>failed</tt>, then mark the report as failed and reply with a
failed PrepareStep to the Leader.</li>
              <li>If the status is <tt>finished</tt>, then mark the report as finished and reply with a
finished PrepareStep to the leader. The Helper then stores the output share
and awaits collection; see <xref target="collect-flow"/>.</li>
            </ul>
            <t>Otherwise, preparation continues. The Helper <bcp14>MUST</bcp14> check its current round
against the Leader's <tt>AggregationJobContinueReq.round</tt> value. If the Leader is
one round ahead of the Helper, then the Helper combines the Leader's prepare
message and the Helper's current preparation state as follows:</t>
            <artwork><![CDATA[
out = VDAF.prep_next(prep_state, prep_msg)
]]></artwork>
            <t>where <tt>prep_msg</tt> is the previous VDAF prepare message sent by the leader and
<tt>prep_state</tt> is the helper's current preparation state. This step yields one of
three outputs:</t>
            <ul spacing="normal">
              <li>An error, in which case the report share is marked as failed and the Helper
replies to the Leader with a <tt>PrepareStep</tt> in the <tt>failed</tt> state.</li>
              <li>An output share, in which case the Helper stores the output share for future
collection as described in <xref target="collect-flow"/> and replies to the Leader with a
<tt>PrepareStep</tt> in the <tt>finished</tt> state.</li>
              <li>An updated VDAF state and preparation message-share, denoted
<tt>(next_prep_state, next_prep_msg)</tt>, in which case the Helper replies to the
Leader with a <tt>PrepareStep</tt> in the <tt>continued</tt> state containing <tt>prep_share</tt>.</li>
            </ul>
            <t>After stepping each state, the Helper advances its aggregation job to the
Leader's <tt>AggregationJobContinueReq.round</tt>.</t>
            <t>If the <tt>round</tt> in the Leader's request is 0, then the Helper <bcp14>MUST</bcp14> abort with an
error of type <tt>unrecognizedMessage</tt>.</t>
            <t>If the <tt>round</tt> in the Leader's request is equal to the Helper's current round
(i.e., this is not the first time the Leader has sent this request), then the
Helper responds with the current round's prepare message-shares. The Helper
<bcp14>SHOULD</bcp14> verify that the contents of the <tt>AggregationJobContinueReq</tt> are identical
to the previous message (see <xref target="aggregation-round-skew-recovery"/>).</t>
            <t>If the Leader's <tt>round</tt> is behind or more than one round ahead of the Helper's
current round, then the Helper <bcp14>MUST</bcp14> abort with an error of type <tt>roundMismatch</tt>.</t>
            <t>If successful, the Helper responds to the Leader with HTTP status 200 OK, media
type <tt>application/dap-aggregation-job-resp</tt> and a body consisting of an
<tt>AggregationJobResp</tt> (see <xref target="aggregation-helper-init"/>) compiled from the stepped
<tt>PrepareStep</tt>s.</t>
          </section>
          <section anchor="aggregation-round-skew-recovery">
            <name>Recovering From Round Skew</name>
            <t><tt>AggregationJobContinueReq</tt> messages contain a <tt>round</tt> field, allowing
Aggregators to ensure that their peer is on an expected round of the VDAF
preparation algorithm. In particular, the intent is to allow recovery from a
scenario where the Helper successfully advances from round <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 round <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
round's preparation state and messages to durable storage such that Leaders can
re-construct continuation requests and Helpers can re-construct continuation
responses as needed.</t>
            <t>When implementing a round skew recovery strategy, Helpers <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 contain the same set of report IDs and prepare
messages). This prevents the Leader from re-winding an aggregation job and
re-running a round 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 preparation 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 a Helper could address this would be to store a digest of the Leader's
request, indexed by aggregation job ID and round, and refuse to service a
request for a given aggregation job round 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>Leaders <bcp14>MUST</bcp14> authenticate their requests to helpers 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 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 each aggregator,
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 <bcp14>MUST</bcp14> be unique within the context of the corresponding DAP task. It is
<bcp14>RECOMMENDED</bcp14> that this be set to a random string output by a cryptographically
secure pseudorandom number generator.</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 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 "queryMismatch".</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>. Then, the Leader verifies that the request meets the
requirements of the batch parameters using the procedure in
<xref target="batch-validation"/>. If so, 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>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>The Leader obtains each Helper's aggregate share following the
aggregate-share request flow described in <xref target="collect-aggregate"/>. When all
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 encrypted_agg_shares<1..2^32-1>;
} Collection;
]]></artwork>
          <t>This 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>The number of reports included in the batch.</li>
            <li>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>The vector of encrypted aggregate shares. They <bcp14>MUST</bcp14> appear in the same order
as the aggregator endpoints list of the task parameters.</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 we use a POST instead of a GET to poll the state of a collection job
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 current batch, 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 current batch 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 obtains each Helper's encrypted aggregate share before it completes a
collection job. To do this, the Leader first computes a checksum over the set of
output shares 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, for each Aggregator endpoint <tt>{aggregator}</tt> in the parameters associated
with <tt>CollectionReq.task_id</tt> (see <xref target="collect-flow"/>) except its own, the Leader
sends a POST request to <tt>{aggregator}/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 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 "queryMismatch".</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>:</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>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
helpers as described <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 it 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>agg_shares</tt> denote the ordered sequence of
aggregator shares, ordered by aggregator index, 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,
                                       agg_shares,
                                       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-04 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 <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-04 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 an Aggregator responds to a CollectionReq or AggregateShareReq, it must
first check that the request does not violate the parameters associated with the
DAP task. It does so as described here.</t>
          <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 the Aggregator <bcp14>MUST</bcp14>
abort with error of type "invalidBatchSize".</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 in 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
in 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>Helpers and leaders 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, helpers are 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, leaders are 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>
      </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="13" month="March" 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-05"/>
        </reference>
        <reference anchor="RFC7807">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="E. Wilde" initials="E." surname="Wilde">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan">
              <organization/>
            </author>
            <author fullname="B. Lipp" initials="B." surname="Lipp">
              <organization/>
            </author>
            <author fullname="C. Wood" initials="C." surname="Wood">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <author fullname="T. Hardie" initials="T." surname="Hardie">
              <organization/>
            </author>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="J. Hoffman-Andrews" initials="J." surname="Hoffman-Andrews">
              <organization/>
            </author>
            <author fullname="D. McCarney" initials="D." surname="McCarney">
              <organization/>
            </author>
            <author fullname="J. Kasten" initials="J." surname="Kasten">
              <organization/>
            </author>
            <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:
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
k6Uc/a20k0wt3tQslnBcFjQlRafWsXlGBDTvF7DMEKQJ0LMLL/UQRxOW8O3p
6GTcb4x4guaH5yr4NmJbxvC132D0Sv0o2wsi71dW5FWFwsyjx2PdiJsYxQ24
Eoa4mqDPXmH8HUxuiQTUzsbUncjZeztk7J4OL0q+F2ibauCXq3q1gUa8z6AJ
XI3OVXKigvif/fz2Rzno5Tq7QlpZwVHf55FfF7DjcJSIyrXDwP61OdqdK5Bx
g2pJoxAvBe9UI4b1ad6Ujd4EPPdALsTANFjs82ejvGHQzWXFh7upFx8Kae6K
AsSuOEDMW9PpQpLghswGN6A7F+U8tnitC7gVUEaML2H2LJMfjdkDtyNjjs/F
W7IsOjKJNXJdl60yGOvEH/KVxu5rvv6aLGE3Yu3OXYN2zIpvhYGVLNmahT2R
08feKfGlGQs3eirRXQ4bdk1eNrhpchgKPF6ho7NoiPyZZ5ERJkfpWWinTURc
9T9iOxJOQdcNhQvwpR3kJ8tRSQ71lvctEBmM/bKAfUG9i47EaWvs3KlbVtne
TiMHUPxFuW5aa8iAXdmshMojQX1Rs2xA6z5IxNeG7NMFikgs6+oZSN/bbX9g
M9/ZtmmBLI8xhBvpCtYCrsWGno5y81RuSLww6brj7+wbZIoksxfJPmgXbetV
vagvt3Tx/m/4o1G70Z/fjsyf3/a+8mv0D+e/+G38Cutl9MqvPZ8mrfyqovJv
Q1Pc8n/pWOJWfo0+jwcR/7Z79P3f8bMP6aTsyqSD4d/+tb+fuMd4oiP/oQiU
WfY78zgo7ekifkGPu+f4X+Z5zxy/dOHCFO0nN03f7vMf+pe22/ndaC7r+ZO0
0vdKQv90Tj4dZffsCeIA128HPed1AEfzz39+/ebFT9np2dnPL474csOjyAz1
ikYIfHEqApSX2pmXMkPDEBS8wqv6euw0+FWyLTBq9+a8jQdk+WkeHB5+9csv
zCqWeVmx+29WrvIqmHX8pUqGrUbl9KNe8w1FnTJTvs4luqqetrm0FbhazyUY
mDcqultr6gRdDTRelgnsHUB+wOsSOByIykXQUv3IvDlqr9lPjUyNDHReruHd
xZZjcJNRwXdiZSKNjCyFzKIx9jrSfk5REVc/qkSUobG5rijIdwGC8qJhdz8J
AnQnYNAKBotMyXYliksQjSRI7UYjKM/Cm8FiXZL1FWPluK7X75tg7CQDZ6wY
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
tON55wEA

-->

</rfc>
