<?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.7.5 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-10" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.4 -->
  <front>
    <title abbrev="DAP-PPM">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-10"/>
    <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="B." surname="Pitman" fullname="Brandon Pitman">
      <organization>ISRG</organization>
      <address>
        <email>bran@bran.land</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="2024" month="February" day="29"/>
    <abstract>
      <?line 95?>

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

<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
two aggregator servers. The aggregators' 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 aggregators 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 aggregator.</t>
      <section anchor="change-log">
        <name>Change Log</name>
        <t>(*) Indicates a change that breaks wire compatibility with the previous draft.</t>
        <t>10:</t>
        <ul spacing="normal">
          <li>
            <t>Editorial changes from httpdir early review.</t>
          </li>
          <li>
            <t>Poll collection jobs with HTTP GET instead of POST. (*)</t>
          </li>
          <li>
            <t>Upload reports with HTTP POST instead of PUT. (*)</t>
          </li>
          <li>
            <t>Clarify requirements for problem documents.</t>
          </li>
          <li>
            <t>Provide guidance on batch sizes when running VDAFs with non-trivial
aggregation parameters.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-09" to "dap-10". (*)</t>
          </li>
        </ul>
        <t>09:</t>
        <ul spacing="normal">
          <li>
            <t>Fixed-size queries: make the maximum batch size optional.</t>
          </li>
          <li>
            <t>Fixed-size queries: require current-batch queries to return distinct batches.</t>
          </li>
          <li>
            <t>Clarify requirements for compatible VDAFs.</t>
          </li>
          <li>
            <t>Clarify rules around creating and abandoning aggregation jobs.</t>
          </li>
          <li>
            <t>Recommend that all task parameters are visible to all parties.</t>
          </li>
          <li>
            <t>Revise security considerations section.</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-07 to 08 <xref target="VDAF"/>. (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-07" to "dap-09". (*)</t>
          </li>
        </ul>
        <t>08:</t>
        <ul spacing="normal">
          <li>
            <t>Clarify requirements for initializing aggregation jobs.</t>
          </li>
          <li>
            <t>Add more considerations for Sybil attacks.</t>
          </li>
          <li>
            <t>Expand guidance around choosing the VDAF verification key.</t>
          </li>
          <li>
            <t>Add an error type registry for the aggregation sub-protocol.</t>
          </li>
        </ul>
        <t>07:</t>
        <ul spacing="normal">
          <li>
            <t>Bump version tag from "dap-06" to "dap-07". This is a bug-fix revision: the
editors overlooked some changes we intended to pick up in the previous
version. (*)</t>
          </li>
        </ul>
        <t>06:</t>
        <ul spacing="normal">
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-06 to 07 <xref target="VDAF"/>. (*)</t>
          </li>
          <li>
            <t>Overhaul security considerations (#488).</t>
          </li>
          <li>
            <t>Adopt revised ping-pong interface in draft-irtf-cfrg-vdaf-07 (#494).</t>
          </li>
          <li>
            <t>Add aggregation parameter to <tt>AggregateShareAad</tt> (#498). (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-05" to "dap-06". (*)</t>
          </li>
        </ul>
        <t>05:</t>
        <ul spacing="normal">
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-05 to 06 <xref target="VDAF"/>. (*)</t>
          </li>
          <li>
            <t>Specialize the protocol for two-party VDAFs (i.e., one Leader and One
Helper). Accordingly, update the aggregation sub-protocol to use the new
"ping-pong" interface for two-party VDAFs introduced in
draft-irtf-cfrg-vdaf-06. (*)</t>
          </li>
          <li>
            <t>Allow the following actions to be safely retried: aggregation job creation,
collection job creation, and requesting the Helper's aggregate share.</t>
          </li>
          <li>
            <t>Merge error types that are related.</t>
          </li>
          <li>
            <t>Drop recommendation to generate IDs using a cryptographically secure
pseudorandom number generator wherever pseudorandomness is not required.</t>
          </li>
          <li>
            <t>Require HPKE config identifiers to be unique.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-04" to "dap-05". (*)</t>
          </li>
        </ul>
        <t>04:</t>
        <ul spacing="normal">
          <li>
            <t>Introduce resource oriented HTTP API. (#278, #398, #400) (*)</t>
          </li>
          <li>
            <t>Clarify security requirements for choosing VDAF verify key. (#407, #411)</t>
          </li>
          <li>
            <t>Require Clients to provide nonce and random input when sharding inputs. (#394,
#425) (*)</t>
          </li>
          <li>
            <t>Add interval of time spanned by constituent reports to Collection message.
(#397, #403) (*)</t>
          </li>
          <li>
            <t>Update share validation requirements based on latest security analysis. (#408,
#410)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-03 to 05 <xref target="VDAF"/>. (#429) (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-03" to "dap-04". (#424) (*)</t>
          </li>
        </ul>
        <t>03:</t>
        <ul spacing="normal">
          <li>
            <t>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. (*)</t>
          </li>
          <li>
            <t>Allow Aggregators to advertise multiple HPKE configurations. (*)</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Remove the extensions from the Report and add extensions to the plaintext
payload of each ReportShare. (*)</t>
          </li>
          <li>
            <t>Clarify that extensions are mandatory to implement: If an Aggregator does not
recognize a ReportShare's extension, it must reject it.</t>
          </li>
          <li>
            <t>Clarify that Aggregators must reject any ReportShare with repeated extension
types.</t>
          </li>
          <li>
            <t>Specify explicitly how to serialize the Additional Authenticated Data (AAD)
string for HPKE encryption. This clarifies an ambiguity in the previous
version. (*)</t>
          </li>
          <li>
            <t>Change the length tag for the aggregation parameter to 32 bits. (*)</t>
          </li>
          <li>
            <t>Use the same prefix ("application") for all media types. (*)</t>
          </li>
          <li>
            <t>Make input share validation more explicit, including adding a new
ReportShareError variant, "report_too_early", for handling reports too far in
the future. (*)</t>
          </li>
          <li>
            <t>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. (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-02" to "dap-03". (*)</t>
          </li>
        </ul>
        <t>02:</t>
        <ul spacing="normal">
          <li>
            <t>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. (*)</t>
          </li>
          <li>
            <t>Define a new task configuration parameter, called the task "expiration", that
defines the lifetime of a given task.</t>
          </li>
          <li>
            <t>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.)</t>
          </li>
          <li>
            <t>Make "task_id" an optional parameter of the "/hpke_config" endpoint.</t>
          </li>
          <li>
            <t>Add report count to CollectResp message. (*)</t>
          </li>
          <li>
            <t>Increase message payload sizes to accommodate VDAFs with input and aggregate
shares larger than 2^16-1 bytes. (*)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-01 to 03 <xref target="VDAF"/>. (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-01" to "dap-02". (*)</t>
          </li>
          <li>
            <t>Rename the report nonce to the "report ID" and move it to the top of the
structure. (*)</t>
          </li>
          <li>
            <t>Clarify when it is safe for an Aggregator to evict various data artifacts from
long-term storage.</t>
          </li>
        </ul>
      </section>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

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

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

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

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

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

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

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

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

/* Represent a zero-length byte string. */
struct {} Empty;
]]></artwork>
      <t>DAP uses the 16-byte <tt>ReportID</tt> as the nonce parameter for the VDAF <tt>shard</tt> and
<tt>prep_init</tt> methods (see <xref section="5" sectionFormat="comma" target="VDAF"/>). Additionally, DAP includes
messages defined in the VDAF specification encoded as opaque byte strings within
various DAP messages. Thus, for a VDAF to be compatible with DAP, it <bcp14>MUST</bcp14>
specify a <tt>NONCE_SIZE</tt> of 16 bytes, and <bcp14>MUST</bcp14> specify encodings for the following
VDAF types:</t>
      <ul spacing="normal">
        <li>
          <t>PublicShare</t>
        </li>
        <li>
          <t>InputShare</t>
        </li>
        <li>
          <t>AggParam</t>
        </li>
        <li>
          <t>AggShare</t>
        </li>
        <li>
          <t>PrepShare</t>
        </li>
        <li>
          <t>PrepMessage</t>
        </li>
      </ul>
      <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"/>). Implementations are free to implement only a subset of the
available query types.</t>
        <t>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),
  (255)
} FixedSizeQueryType;

struct {
  FixedSizeQueryType query_type;
  select (FixedSizeQuery.query_type) {
    case by_batch_id: BatchID batch_id;
    case 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 query is issued in-band as part of the collect interaction
(<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>
            <t><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.</t>
          </li>
          <li>
            <t><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.)</t>
          </li>
        </ul>
        <t>The parameters pertaining to specific query types are described in
<xref target="time-interval-query"/> and <xref target="fixed-size-query"/>.</t>
        <section anchor="time-interval-query">
          <name>Time-interval Queries</name>
          <t>The first query type, <tt>time_interval</tt>, is designed to support applications in
which reports are collected over a long period of time. The Collector specifies
a "batch interval" that determines the time range for reports included in the
batch. For each report in the batch, the time at which that report was generated
(see <xref target="upload-flow"/>) <bcp14>MUST</bcp14> fall within the batch interval specified by the
Collector.</t>
          <t>Typically the Collector issues queries for which the batch intervals are
continuous, monotonically increasing, and have the same duration. For example,
the sequence of batch intervals <tt>(1659544000, 1000)</tt>, <tt>(1659545000, 1000)</tt>,
<tt>(1659546000, 1000)</tt>, <tt>(1659547000, 1000)</tt> satisfies these conditions. (The
first element of the pair denotes the start of the batch interval and the second
denotes the duration.) Of course, there are cases in which Collector may need to
issue queries out-of-order. For example, a previous batch might need to be
queried again with a different aggregation parameter (e.g, for Poplar1). In
addition, the Collector may need to vary the duration to adjust to changing
report upload rates.</t>
        </section>
        <section anchor="fixed-size-query">
          <name>Fixed-size Queries</name>
          <t>The <tt>fixed_size</tt> query type is used to support applications in which the
Collector needs the ability to strictly control the batch 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>MUST</bcp14> select a batch that has not yet been associated with a
collection job.</t>
          <t>In addition to the minimum batch size common to all query types, the
configuration may include a parameter <tt>max_batch_size</tt> that determines maximum
number of reports per batch.</t>
          <t>If the configuration does not include <tt>max_batch_size</tt>, then the Aggregators
can output any batch size that is larger than or equal to <tt>min_batch_size</tt>.
This is useful for applications that are not concerned with sample size, i.e.,
the privacy guarantee is not affected by the sampling rate of the population,
therefore a larger than expected batch size does not weaken the designed privacy
guarantee.</t>
          <t>Implementation note: The goal for the Aggregators is to aggregate the same
number of reports in each batch. The target batch size is deployment-specific,
and may be equal to or greater than the minimum batch size. Deciding how soon
batches should be output is also deployment-specific. Exactly sizing batches may
be challenging for Leader deployments in which multiple, independent nodes
running the aggregate interaction (see <xref target="aggregate-flow"/>) need to be
coordinated. The difference between the minimum batch size and maximum batch
size is in part intended to allow room for error, and allow a range of target
batch sizes.</t>
        </section>
        <section anchor="batch-size">
          <name>Batch Size Considerations</name>
          <t>If each batch will be collected only once (i.e. when using Prio3), then batch
sizes <bcp14>MAY</bcp14> be equal to <tt>min_batch_size</tt> without issue. In the case of fixed size
queries, <tt>max_batch_size</tt> <bcp14>MAY</bcp14> be equal to <tt>min_batch_size</tt>. Any target batch
size between <tt>min_batch_size</tt> and <tt>max_batch_size</tt> may be chosen.</t>
          <t>If each batch may be collected more than once (i.e. when using Poplar1), then
batches <bcp14>SHOULD</bcp14> be larger than <tt>min_batch_size</tt>, to allow for the possibility
that some reports may be accepted with the first aggregation parameter, but be
rejected with a subsequent aggregation parameter. Once a batch has been
collected for the first time, subsequent collections of the same batch must
process the same set of reports, and collections can only succeed if the number
of successfully aggregated reports is at least <tt>min_batch_size</tt> (see
<xref target="time-interval-batch-validation"/> and <xref target="fixed-size-batch-validation"/>). Thus,
if enough reports are rejected such that fewer than <tt>min_batch_size</tt> output
shares are available for aggregation, then collection of that batch may not
proceed. (Note that this is not an issue for the first collection of a batch,
since more reports could be combined with the uncollected reports in a
subsequent collection attempt.)</t>
          <t>The target batch size may be chosen on a deployment-specific basis, based on the
expected rate of invalid reports and Sybil attack defenses (<xref target="sybil"/>). When
using fixed size queries, <tt>max_batch_size</tt> <bcp14>SHOULD</bcp14> be unset or greater than or
equal to the target batch size, and the Leader <bcp14>SHOULD</bcp14> construct batches of the
target batch size. When using time interval queries, the Collector <bcp14>SHOULD</bcp14>
adaptively choose batch intervals based on the report upload rate so that they
exceed <tt>min_batch_size</tt> by enough to allow for subsequent rejections of reports.</t>
        </section>
      </section>
      <section anchor="task-configuration">
        <name>Task Configuration</name>
        <t>Prior to the start of execution of the protocol, each participant must agree on
the configuration for each task. A task is uniquely identified by its task ID:</t>
        <artwork><![CDATA[
opaque TaskID[32];
]]></artwork>
        <t>The task ID value <bcp14>MUST</bcp14> be a globally unique sequence of bytes. Each task has
the following parameters associated with it:</t>
        <ul spacing="normal">
          <li>
            <t><tt>leader_aggregator_url</tt>: A URL relative to which the Leader's API resources
 can be found.</t>
          </li>
          <li>
            <t><tt>helper_aggregator_url</tt>: A URL relative to which the Helper's API resources
can be found.</t>
          </li>
          <li>
            <t>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. The party <bcp14>MUST NOT</bcp14> configure the task if it does not
recognize the query type.</t>
          </li>
          <li>
            <t><tt>max_batch_query_count</tt>: The maximum number of times a batch of reports may be
queried by the Collector.</t>
          </li>
          <li>
            <t><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>.</t>
          </li>
          <li>
            <t>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"/>.</t>
          </li>
        </ul>
        <t>Note that the <tt>leader_aggregator_url</tt> and <tt>helper_aggregator_url</tt> values may
include arbitrary path components.</t>
        <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>
            <t><tt>collector_hpke_config</tt>: The <xref target="HPKE"/> configuration of the Collector
(described in <xref target="hpke-config"/>); see <xref target="compliance"/> for information about the
HPKE configuration algorithms.</t>
          </li>
          <li>
            <t><tt>vdaf_verify_key</tt>: The VDAF verification key shared by the Aggregators. This
key is used in the aggregation interaction (<xref target="aggregate-flow"/>). The security
requirements are described in <xref target="verification-key"/>.</t>
          </li>
        </ul>
        <t>Finally, the Collector is configured with the HPKE secret key corresponding to
<tt>collector_hpke_config</tt>.</t>
        <t>A task's parameters are immutable for the lifetime of that task. The only way to
change parameters or to rotate secret values like collector HPKE configuration
or the VDAF verification key is to configure a new task.</t>
      </section>
      <section anchor="resource-uris">
        <name>Resource URIs</name>
        <t>DAP is defined in terms of "resources", such as reports (<xref target="upload-flow"/>),
aggregation jobs (<xref target="aggregate-flow"/>), and collection jobs (<xref target="collect-flow"/>).
Each resource has an associated URI. Resource URIs are specified by a sequence
of string literals and variables. Variables are expanded into strings according
to the following rules:</t>
        <ul spacing="normal">
          <li>
            <t>Variables <tt>{leader}</tt> and <tt>{helper}</tt> are replaced with the base URL of the
Leader and Helper respectively (the base URL is defined in
<xref target="task-configuration"/>).</t>
          </li>
          <li>
            <t>Variables <tt>{task-id}</tt>, <tt>{aggregation-job-id}</tt>, and <tt>{collection-job-id}</tt> are
replaced with the task ID (<xref target="task-configuration"/>), aggregation job ID
(<xref target="agg-init"/>), and collection job ID (<xref target="collect-init"/>) respectively. The
value <bcp14>MUST</bcp14> be encoded in its URL-safe, unpadded Base 64 representation as
specified in Sections <xref target="RFC4648" section="5" sectionFormat="bare"/> and <xref target="RFC4648" section="3.2" sectionFormat="bare"/> of <xref target="RFC4648"/>.</t>
          </li>
        </ul>
        <t>For example, given a helper URL "https://example.com/api/dap", task ID "f0 16 34
47 36 4c cf 1b c0 e3 af fc ca 68 73 c9 c3 81 f6 4a cd f9 02 06 62 f8 3f 46 c0 72
19 e7" and an aggregation job ID "95 ce da 51 e1 a9 75 23 68 b0 d9 61 f9 46 61
28" (32 and 16 byte octet strings, represented in hexadecimal), resource URI
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt> would be
expanded into
<tt>https://example.com/api/dap/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA</tt>.</t>
      </section>
      <section anchor="upload-flow">
        <name>Uploading Reports</name>
        <t>Clients periodically upload reports to the Leader. Each report contains two
"report shares", one for the Leader and another for the Helper. The Helper's
report share is transmitted by the Leader during the aggregation interaction
(see <xref target="aggregate-flow"/>).</t>
        <section anchor="hpke-config">
          <name>HPKE Configuration Request</name>
          <t>Before the Client can upload its report to the Leader, it must know the HPKE
configuration of each Aggregator. See <xref target="compliance"/> for information on HPKE
algorithm choices.</t>
          <t>Clients retrieve the HPKE configuration from each Aggregator by sending an HTTP
GET request to <tt>{aggregator}/hpke_config</tt>. Clients <bcp14>MAY</bcp14> specify a query parameter
<tt>task_id</tt> whose value is the task ID whose HPKE configuration they want. If the
Aggregator does not recognize the task ID, then it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>An Aggregator is free to use different HPKE configurations for each task with
which it is configured. If the task ID is missing from  the Client's request,
the Aggregator <bcp14>MAY</bcp14> abort with an error of type <tt>missingTaskID</tt>, in which case
the Client <bcp14>SHOULD</bcp14> retry the request with a well-formed task ID included.</t>
          <t>An Aggregator responds to well-formed requests with HTTP status code 200 OK and
an <tt>HpkeConfigList</tt> value, with media type "application/dap-hpke-config-list".
The <tt>HpkeConfigList</tt> structure contains one or more <tt>HpkeConfig</tt> structures in
decreasing order of preference. This allows an Aggregator to support multiple
HPKE configurations simultaneously.</t>
          <t>[TODO: Allow Aggregators to return HTTP status code 403 Forbidden in deployments
that use authentication to avoid leaking information about which tasks exist.]</t>
          <artwork><![CDATA[
HpkeConfig HpkeConfigList<1..2^16-1>;

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

opaque HpkePublicKey<1..2^16-1>;
uint16 HpkeAeadId; /* Defined in [HPKE] */
uint16 HpkeKemId;  /* Defined in [HPKE] */
uint16 HpkeKdfId;  /* Defined in [HPKE] */
]]></artwork>
          <t>[OPEN ISSUE: Decide whether to expand the width of the id.]</t>
          <t>Aggregators <bcp14>MUST</bcp14> allocate distinct id values for each <tt>HpkeConfig</tt> in an
<tt>HpkeConfigList</tt>.</t>
          <t>The Client <bcp14>MUST</bcp14> abort if any of the following happen for any HPKE config
request:</t>
          <ul spacing="normal">
            <li>
              <t>the GET request did not return a valid HPKE config list;</t>
            </li>
            <li>
              <t>the HPKE config list is empty; or</t>
            </li>
            <li>
              <t>no HPKE config advertised by the Aggregator specifies a supported a KEM, KDF,
or AEAD algorithm triple.</t>
            </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 in this example:</t>
          <artwork><![CDATA[
  Cache-Control: max-age=86400
]]></artwork>
          <t>Servers should choose a <tt>max-age</tt> value appropriate to the lifetime of their
keys. 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 POST to
<tt>{leader}/tasks/{task-id}/reports</tt>. The payload is a <tt>Report</tt>, with media type
"application/dap-report", structured as follows:</t>
          <artwork><![CDATA[
struct {
  ReportID report_id;
  Time time;
} ReportMetadata;

struct {
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
  HpkeCiphertext leader_encrypted_input_share;
  HpkeCiphertext helper_encrypted_input_share;
} Report;
]]></artwork>
          <ul spacing="normal">
            <li>
              <t><tt>report_metadata</tt> is public metadata describing the report.  </t>
              <ul spacing="normal">
                <li>
                  <t><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.</t>
                </li>
                <li>
                  <t><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.</t>
                </li>
              </ul>
            </li>
            <li>
              <t><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.</t>
            </li>
            <li>
              <t><tt>leader_encrypted_input_share</tt> is the Leader's encrypted input share.</t>
            </li>
            <li>
              <t><tt>helper_encrypted_input_share</tt> is the Helper's encrypted input share.</t>
            </li>
          </ul>
          <t>Aggregators <bcp14>MAY</bcp14> require Clients to authenticate when uploading reports (see
<xref target="client-auth"/>). If it is used, HTTP client authentication <bcp14>MUST</bcp14> use a scheme
that meets the requirements in <xref target="request-authentication"/>.</t>
          <t>The handling of the upload request by the Leader <bcp14>MUST</bcp14> be idempotent as discussed
in <xref section="9.2.2" sectionFormat="of" target="RFC9110"/>.</t>
          <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.shard(
    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 sharding algorithm will return two input shares. The first input share
returned from the sharding algorithm is considered to be the Leader's input
share, and the second input share is considered to be the Helper's input share.</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-10 input share" || 0x01 || server_role,
  input_share_aad, plaintext_input_share)
]]></artwork>
          <t>where <tt>pk</tt> is the Aggregator's public key; <tt>0x01</tt> represents the Role of the
sender (always the Client); <tt>server_role</tt> is the Role of the intended recipient
(<tt>0x02</tt> for the Leader and <tt>0x03</tt> for the Helper), <tt>plaintext_input_share</tt> is
the Aggregator's PlaintextInputShare, and <tt>input_share_aad</tt> is an encoded
message of type InputShareAad defined below, constructed from the same values as
the corresponding fields in the report. The <tt>SealBase()</tt> function is as
specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the ciphersuite indicated by the HPKE
configuration.</t>
          <artwork><![CDATA[
struct {
  TaskID task_id;
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
} InputShareAad;
]]></artwork>
          <t>The Leader responds to well-formed requests with HTTP status code 201
Created. Malformed requests are handled as described in <xref target="errors"/>.
Clients <bcp14>SHOULD NOT</bcp14> upload the same measurement value in more than one report if
the Leader responds with HTTP status code 201 Created.</t>
          <t>If the Leader does not recognize the task ID, then it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>The Leader responds to requests whose Leader encrypted input share uses an
out-of-date or unknown <tt>HpkeConfig.id</tt> value, indicated by
<tt>HpkeCiphertext.config_id</tt>, with error of type 'outdatedConfig'. When the Client
receives an 'outdatedConfig' error, it <bcp14>SHOULD</bcp14> invalidate any cached
HpkeConfigList and retry with a freshly generated Report. If this retried upload
does not succeed, the Client <bcp14>SHOULD</bcp14> abort and discontinue retrying.</t>
          <t>If a report's ID matches that of a previously uploaded report, the Leader <bcp14>MUST</bcp14>
ignore it. In addition, it <bcp14>MAY</bcp14> alert the Client with error <tt>reportRejected</tt>. See
the implementation note in <xref target="input-share-validation"/>.</t>
          <t>The Leader <bcp14>MUST</bcp14> ignore any report pertaining to a batch that has already been
collected (see <xref target="input-share-validation"/> for details). Otherwise, comparing
the aggregate result to the previous aggregate result may result in a privacy
violation. Note that this is also enforced by the Helper during the aggregation
interaction. The Leader <bcp14>MAY</bcp14> also abort the upload protocol and alert the
Client with error <tt>reportRejected</tt>.</t>
          <t>The Leader <bcp14>MAY</bcp14> ignore any report whose timestamp is past the task's
<tt>task_expiration</tt>. When it does so, it <bcp14>SHOULD</bcp14> also abort the upload protocol and
alert the Client with error <tt>reportRejected</tt>. Client <bcp14>MAY</bcp14> choose to opt out of
the task if its own clock has passed <tt>task_expiration</tt>.</t>
          <t>The Leader may need to buffer reports while waiting to aggregate them (e.g.,
while waiting for an aggregation parameter from the Collector; see
<xref target="collect-flow"/>). The Leader <bcp14>SHOULD NOT</bcp14> accept reports whose timestamps are too
far in the future. Implementors <bcp14>MAY</bcp14> provide for some small leeway, usually no
more than a few minutes, to account for clock skew. If the Leader rejects a
report for this reason, it <bcp14>SHOULD</bcp14> abort the upload protocol and alert the Client
with error <tt>reportTooEarly</tt>. In this situation, the Client <bcp14>MAY</bcp14> re-upload the
report later on.</t>
          <t>If the Leader's input share contains an unrecognized extension, or if two
extensions have the same ExtensionType, then the Leader <bcp14>MAY</bcp14> abort the upload
request with error "invalidMessage". Note that this behavior is not mandatory
because it requires the Leader to decrypt its input share.</t>
        </section>
        <section anchor="upload-extensions">
          <name>Upload Extensions</name>
          <t>Each PlaintextInputShare carries a list of extensions that Clients use to convey
additional information to the Aggregator. Some extensions might be intended for
both Aggregators; others may only be intended for a specific Aggregator. (For
example, a DAP deployment might use some out-of-band mechanism for an Aggregator
to verify that reports come from authenticated Clients. It will likely be useful
to bind the extension to the input share via HPKE encryption.)</t>
          <t>Each extension is a tag-length encoded value of the following form:</t>
          <artwork><![CDATA[
struct {
  ExtensionType extension_type;
  opaque extension_data<0..2^16-1>;
} Extension;

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

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

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

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

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

struct {
  BatchSelector batch_selector;
  opaque agg_param<0..2^32-1>;
  uint64 report_count;
  opaque checksum[32];
} AggregateShareReq;
]]></artwork>
          <t>The media type of the request is "application/dap-aggregate-share-req". The
message contains the following parameters:</t>
          <ul spacing="normal">
            <li>
              <t><tt>batch_selector</tt>: The "batch selector", which encodes parameters used to
determine the batch being aggregated. The value depends on the query type for
the task:  </t>
              <ul spacing="normal">
                <li>
                  <t>For time_interval tasks, the request specifies the batch interval.</t>
                </li>
                <li>
                  <t>For fixed_size tasks, the request specifies the batch ID.</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 "invalidMessage".</t>
            </li>
            <li>
              <t><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"/>).</t>
            </li>
            <li>
              <t><tt>report_count</tt>: The number number of reports included in the batch.</t>
            </li>
            <li>
              <t><tt>checksum</tt>: The batch checksum.</t>
            </li>
          </ul>
          <t>Leaders <bcp14>MUST</bcp14> authenticate their requests to Helpers using a scheme that meets
the requirements in <xref target="request-authentication"/>.</t>
          <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.aggregate(agg_param, out_shares)
]]></artwork>
          <t>Implementation note: For most VDAFs, it is possible to aggregate output shares
as they arrive rather than wait until the batch is collected. To do so however,
it is necessary to enforce the batch parameters as described in
<xref target="batch-validation"/> so that the Aggregator knows which aggregate share to
update.</t>
          <t>The Helper then encrypts <tt>agg_share</tt> under the Collector's HPKE public key as
described in <xref target="aggregate-share-encrypt"/>, yielding <tt>encrypted_agg_share</tt>.
Encryption prevents the Leader from learning the actual result, as it only has
its own aggregate share and cannot compute the Helper's.</t>
          <t>The Helper responds to the Leader with HTTP status code 200 OK and a body
consisting of an <tt>AggregateShare</tt>, with media type
"application/dap-aggregate-share":</t>
          <artwork><![CDATA[
struct {
  HpkeCiphertext encrypted_aggregate_share;
} AggregateShare;
]]></artwork>
          <t><tt>encrypted_aggregate_share.config_id</tt> is set to the Collector's HPKE config ID.
<tt>encrypted_aggregate_share.enc</tt> is set to the encapsulated HPKE context <tt>enc</tt>
computed above and <tt>encrypted_aggregate_share.ciphertext</tt> is the ciphertext
<tt>encrypted_agg_share</tt> computed above.</t>
          <t>The Helper's handling of this request <bcp14>MUST</bcp14> be idempotent. That is, if multiple
identical, valid <tt>AggregateShareReq</tt>s are received, they should all yield the
same response while only consuming one unit of the task's
<tt>max_batch_query_count</tt> (see <xref target="batch-validation"/>).</t>
          <t>After receiving the Helper's response, the Leader uses the HpkeCiphertext to
finalize a collection job (see <xref target="collect-finalization"/>).</t>
          <t>Once an AggregateShareReq has been issued for the batch determined by a given
query, it is an error for the Leader to issue any more aggregation jobs for
additional reports that satisfy the query. These reports will be rejected by the
Helper as described in <xref target="input-share-validation"/>.</t>
          <t>Before completing the collection job, the Leader also computes its own aggregate
share <tt>agg_share</tt> by aggregating all of the prepared output shares that fall
within the batch interval. Finally, it encrypts its aggregate share under the
Collector's HPKE public key as described in <xref target="aggregate-share-encrypt"/>.</t>
        </section>
        <section anchor="collect-finalization">
          <name>Collection Job Finalization</name>
          <t>Once the Collector has received a collection job from the Leader, it can decrypt
the aggregate shares and produce an aggregate result. The Collector decrypts
each aggregate share as described in <xref target="aggregate-share-encrypt"/>. Once the
Collector successfully decrypts all aggregate shares, it unshards the aggregate
shares into an aggregate result using the VDAF's <tt>unshard</tt> algorithm. In
particular, let <tt>leader_agg_share</tt> denote the Leader's aggregate share,
<tt>helper_agg_share</tt> denote the Helper's aggregate share, let <tt>report_count</tt>
denote the report count sent by the Leader, and let <tt>agg_param</tt> be the opaque
aggregation parameter. The final aggregate result is computed as follows:</t>
          <artwork><![CDATA[
agg_result = Vdaf.unshard(agg_param,
                          [leader_agg_share, helper_agg_share],
                          report_count)
]]></artwork>
        </section>
        <section anchor="aggregate-share-encrypt">
          <name>Aggregate Share Encryption</name>
          <t>Encrypting an aggregate share <tt>agg_share</tt> for a given <tt>AggregateShareReq</tt> is
done as follows:</t>
          <artwork><![CDATA[
enc, payload = SealBase(pk, "dap-10 aggregate share" || server_role || 0x00,
  agg_share_aad, agg_share)
]]></artwork>
          <t>where <tt>pk</tt> is the HPKE public key encoded by the Collector's HPKE key,
<tt>server_role</tt> is the Role of the encrypting server (<tt>0x02</tt> for the Leader and
<tt>0x03</tt> for a Helper), <tt>0x00</tt> represents the Role of the recipient (always the
Collector), and <tt>agg_share_aad</tt> is a value of type <tt>AggregateShareAad</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;
  opaque agg_param<0..2^32-1>;
  BatchSelector batch_selector;
} AggregateShareAad;
]]></artwork>
          <ul spacing="normal">
            <li>
              <t><tt>task_id</tt> is the ID of the task the aggregate share was computed in.</t>
            </li>
            <li>
              <t><tt>agg_param</tt> is the aggregation parameter used to compute the aggregate share.</t>
            </li>
            <li>
              <t><tt>batch_selector</tt> is the is the batch selector from the <tt>AggregateShareReq</tt>
(for the Helper) or the batch selector computed from the Collector's query
(for the Leader).</t>
            </li>
          </ul>
          <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-10 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),
<tt>0x00</tt> represents the Role of the recipient (always the Collector), and
<tt>agg_share_aad</tt> is an <tt>AggregateShareAad</tt> message constructed from the task ID
and the aggregation parameter 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>
              <t>For time_interval tasks, the batch selector is the batch interval specified in
the query.</t>
            </li>
            <li>
              <t>For fixed_size tasks, the batch selector is the batch ID assigned sent in the
response.</t>
            </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="batch-validation">
          <name>Batch Validation</name>
          <t>Before a Leader runs a collection job or a Helper responds to an
AggregateShareReq, it must first check that the job or request does not violate
the parameters associated with the DAP task. It does so as described here. Where
we say that an Aggregator <bcp14>MUST</bcp14> abort with some error, then:</t>
          <ul spacing="normal">
            <li>
              <t>Leaders should respond to subsequent HTTP GET requests to the collection job
with the indicated error.</t>
            </li>
            <li>
              <t>Helpers should respond to the AggregateShareReq with the indicated error.</t>
            </li>
          </ul>
          <t>First the Aggregator checks that the batch respects any "boundaries" determined
by the query type. These are described in the subsections below. If the boundary
check fails, then the Aggregator <bcp14>MUST</bcp14> abort with an error of type
"batchInvalid".</t>
          <t>Next, the Aggregator checks that batch contains a valid number of reports, as
determined by the query type. If the size check fails, then Helpers <bcp14>MUST</bcp14> abort
with an error of type "invalidBatchSize". Leaders <bcp14>SHOULD</bcp14> wait for more reports
to be validated and try the collection job again later.</t>
          <t>Next, the Aggregator checks that the batch has not been queried too many times.
This is determined by the maximum number of times a batch can be queried,
<tt>max_batch_query_count</tt>. If the batch has been queried with more than
<tt>max_batch_query_count</tt> distinct aggregation parameters, 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>
                  <t><tt>batch_interval.duration &gt;= time_precision</tt> (this field determines,
effectively, the minimum batch duration)</t>
                </li>
                <li>
                  <t>both <tt>batch_interval.start</tt> and <tt>batch_interval.duration</tt> are divisible by
<tt>time_precision</tt></t>
                </li>
              </ul>
              <t>These measures ensure that Aggregators can efficiently "pre-aggregate" output
shares recovered during the aggregation interaction.</t>
            </section>
            <section anchor="size-check">
              <name>Size Check</name>
              <t>The query configuration specifies the minimum batch size, <tt>min_batch_size</tt>. The
Aggregator checks that <tt>len(X) &gt;= min_batch_size</tt>, where <tt>X</tt> is the set of
reports successfully aggregated into the batch.</t>
            </section>
          </section>
          <section anchor="fixed-size-batch-validation">
            <name>Fixed-size Queries</name>
            <section anchor="boundary-check-1">
              <name>Boundary Check</name>
              <t>For fixed_size tasks, the batch boundaries are defined by opaque batch IDs. Thus
the Aggregator needs to check that the query is associated with a known batch
ID:</t>
              <ul spacing="normal">
                <li>
                  <t>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.</t>
                </li>
                <li>
                  <t>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.</t>
                </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
optionally the maximum batch size, <tt>max_batch_size</tt>. The Aggregator checks that
<tt>len(X) &gt;= min_batch_size</tt>. And if <tt>max_batch_size</tt> is specified, also
<tt>len(X) &lt;= max_batch_size</tt>, where <tt>X</tt> is the set of reports successfully
aggregated into the batch.</t>
            </section>
          </section>
        </section>
      </section>
    </section>
    <section anchor="operational-capabilities">
      <name>Operational Considerations</name>
      <t>The DAP protocol has inherent constraints derived from the tradeoff between
privacy guarantees and computational complexity. These tradeoffs influence how
applications may choose to utilize services implementing the specification.</t>
      <section anchor="entity-capabilities">
        <name>Protocol Participant Capabilities</name>
        <t>The design in this document has different assumptions and requirements for
different protocol participants, including Clients, Aggregators, and Collectors.
This section describes these capabilities in more detail.</t>
        <section anchor="client-capabilities">
          <name>Client Capabilities</name>
          <t>Clients have limited capabilities and requirements. Their only inputs to the
protocol are (1) the parameters configured out of band and (2) a measurement.
Clients are not expected to store any state across any upload flows, nor are
they required to implement any sort of report upload retry mechanism. By design,
the protocol in this document is robust against individual Client upload
failures since the protocol output is an aggregate over all inputs.</t>
        </section>
        <section anchor="aggregator-capabilities">
          <name>Aggregator Capabilities</name>
          <t>Leaders and Helpers have different operational requirements. The design in this
document assumes an operationally competent Leader, i.e., one that has no
storage or computation limitations or constraints, but only a modestly
provisioned Helper, i.e., one that has computation, bandwidth, and storage
constraints. By design, Leaders must be at least as capable as Helpers, where
Helpers are generally required to:</t>
          <ul spacing="normal">
            <li>
              <t>Support the aggregate interaction, which includes validating and aggregating
reports; and</t>
            </li>
            <li>
              <t>Publish and manage an HPKE configuration that can be used for the upload
protocol.</t>
            </li>
          </ul>
          <t>In addition, for each DAP task, the Helper is required to:</t>
          <ul spacing="normal">
            <li>
              <t>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"/>.</t>
            </li>
          </ul>
          <t>Beyond the minimal capabilities required of Helpers, Leaders are generally
required to:</t>
          <ul spacing="normal">
            <li>
              <t>Support the upload protocol and store reports; and</t>
            </li>
            <li>
              <t>Track batch report size during each collect flow and request encrypted output
shares from Helpers.</t>
            </li>
          </ul>
          <t>In addition, for each DAP task, the Leader is required to:</t>
          <ul spacing="normal">
            <li>
              <t>Implement and store state for the form of inter- and intra-batch replay
mitigation in <xref target="input-share-validation"/>.</t>
            </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="vdafs-and-compute-requirements">
        <name>VDAFs and Compute Requirements</name>
        <t>The choice of VDAF can impact the computation required for a DAP task. For
instance, the Poplar1 VDAF <xref target="VDAF"/> when configured to compute a set of heavy
hitters requires each measurement to be of the same bit-length which all parties
need to agree on prior to VDAF execution. The computation required for such
tasks increases superlinearly as a function of the chosen bit-length, as
multiple rounds of collection are needed for each bit of the measurement value,
and each bit of the measurement value requires computation which scales with the
chosen bit-length.</t>
        <t>When dealing with variable length measurements (e.g domain names), it is
necessary to pad them to convert into fixed-length measurements. When computing
the heavy hitters from a batch of such measurements, VDAF execution can be
terminated early once once the padding region is reached for a given
measurement: at this point, the padded measurement can be included in the last
set of candidate prefixes. For smaller length measurements, this significantly
reduces the cost of communication between Aggregators and the steps required for
the computation. However, malicious Clients can still generate maximum length
measurements forcing the system to always operate at worst-case performance.</t>
        <t>Therefore, care must be taken that a DAP deployment can handle VDAF execution of
all possible measurement values for any tasks that the deployment is configured
for. Otherwise, an attacker may deny service by uploading many expensive
reports.</t>
        <t>Applications which require computationally-expensive VDAFs can mitigate the
computation cost of aggregation in a few ways, such as producing aggregates over
a sample of the data or choosing a representation of the data permitting a
simpler aggregation scheme.</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>
          <t>KEM: DHKEM(X25519, HKDF-SHA256) (see <xref section="7.1" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
        <li>
          <t>KDF: HKDF-SHA256 (see <xref section="7.2" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
        <li>
          <t>AEAD: AES-128-GCM (see <xref section="7.3" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>DAP aims to achieve the privacy and robustness security goals defined in
<xref section="9" sectionFormat="of" target="VDAF"/>, even in the presence of an active attacker. It is
assumed that the attacker may control the network and have the ability to
control a subset of of Clients, one of the Aggregators, and the Collector for a
given task.</t>
      <t>In the presence of this adversary, there are some threats DAP does not defend
against and which are considered outside of DAP's threat model. These are
enumerated below, along with potential mitigations.</t>
      <t>Attacks on robustness:</t>
      <ol spacing="normal" type="1"><li>
          <t>Aggregators can defeat robustness by emitting incorrect aggregate shares, by
omitting reports from the aggregation process, or by manipulating the VDAF
preparation process for a single report. DAP follows VDAF in providing
robustness only if both Aggregators honestly follow the protocol.</t>
        </li>
        <li>
          <t>Clients may affect the quality of aggregate results by reporting false
measurements. A VDAF can only verify that a submitted measurement is valid,
not that it is true.</t>
        </li>
        <li>
          <t>An attacker can impersonate multiple Clients, or a single malicious Client
can upload an unexpectedly-large number of reports, in order to skew
aggregate results or to reduce the number of measurements from honest Clients
in a batch below the minimum batch size. See <xref target="sybil"/> for discussion and
potential mitigations.</t>
        </li>
      </ol>
      <t>Attacks on privacy:</t>
      <ol spacing="normal" type="1"><li>
          <t>Clients can intentionally leak their own measurements and compromise their
own privacy.</t>
        </li>
        <li>
          <t>Both Aggregators together can, purposefully or accidentally, share
unencrypted input shares in order to defeat the privacy of individual
reports. DAP follows VDAF in providing privacy only if at least one
Aggregator honestly follows the protocol.</t>
        </li>
      </ol>
      <t>Attacks on other properties of the system:</t>
      <ol spacing="normal" type="1"><li>
          <t>Both Aggregators together can, purposefully or accidentally, share
unencrypted aggregate shares in order to reveal the aggregation result for a
given batch.</t>
        </li>
        <li>
          <t>Aggregators, or a passive network attacker between the Clients and the
Leader, can examine metadata such as HTTP client IP in order to infer which
Clients are submitting reports. Depending on the particulars of the
deployment, this may be used to infer sensitive information about the Client.
This can be mitigated for the Aggregator by deploying an anonymizing proxy
(see <xref target="anon-proxy"/>), or in general by requiring Clients to submit reports at
regular intervals independently of the measurement value such that the
existence of a report does not imply the occurrence of a sensitive event.</t>
        </li>
        <li>
          <t>Aggregators can deny service by refusing to respond to collection requests or
aggregate share requests.</t>
        </li>
        <li>
          <t>Collection requests may leak information beyond the collection results. 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. Or the result could leak information about outlier
values. This leakage can be mitigated using differential privacy (<xref target="dp"/>).</t>
        </li>
      </ol>
      <section anchor="sybil">
        <name>Sybil Attacks</name>
        <t>Several attacks on privacy or robustness involve malicious Clients uploading
reports that are valid under the chosen VDAF but incorrect.</t>
        <t>For example, a DAP deployment might be measuring the heights of a human
population and configure a variant of Prio3 to prove that measurements are
values in the range of 80-250 cm. A malicious Client would not be able to claim
a height of 400 cm, but they could submit multiple bogus reports inside the
acceptable range, which would yield incorrect averages. More generally, DAP
deployments are susceptible to Sybil attacks <xref target="Dou02"/>, especially when carried
out by the Leader.</t>
        <t>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, sending known measurements
to the Aggregators can allow a Collector to shrink the effective anonymity set
by subtracting the known measurements from the aggregate result. 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").</t>
        <t>Depending on the deployment and the specific threat being mitigated, there are
different ways to address Sybil attacks, such as:</t>
        <ol spacing="normal" type="1"><li>
            <t>Implementing Client authentication, as described in <xref target="client-auth"/>, likely
paired with rate-limiting uploads from individual Clients.</t>
          </li>
          <li>
            <t>Removing Client-specific metadata on individual reports, such as through the
use of anonymizing proxies in the upload flow, as described in
<xref target="anon-proxy"/>.</t>
          </li>
          <li>
            <t>Differential privacy (<xref target="dp"/>) can help mitigate Sybil attacks to some extent.</t>
          </li>
        </ol>
      </section>
      <section anchor="client-auth">
        <name>Client Authentication</name>
        <t>In settings where it is practical for each Client to have an identity
provisioned (e.g., a user logged into a backend service or a hardware device
programmed with an identity), Client authentication can help Aggregators (or an
authenticating proxy deployed between Clients and the Aggregators; see
<xref target="anon-proxy"/>) ensure that all reports come from authentic Clients. Note that
because the Helper never handles messages directly from the Clients, reports
would need to include an extension (<xref target="upload-extensions"/>) to convey
authentication information to the Helper. For example, a deployment might
include a Privacy Pass token (<xref target="I-D.draft-ietf-privacypass-architecture-16"/>)
in an extension to allow both Aggregators to independently verify the Client's
identity.</t>
        <t>However, in some deployments, it will not be practical to require Clients to
authenticate, so Client authentication is not mandatory in DAP. For example, a
widely distributed application that does not require its users to log in to any
service has no obvious way to authenticate its report uploads.</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 Client authentication information (in deployments which use it, see
<xref target="client-auth"/>). This metadata can be used by Aggregators to identify
participating Clients or permit some attacks on robustness. This auxiliary
information can be removed by having Clients submit reports to an anonymizing
proxy server which would then use Oblivious HTTP <xref target="RFC9458"/> to forward reports
to the DAP Leader. In this scenario, Client authentication would be performed by
the proxy rather than any of the participants in the DAP protocol.</t>
      </section>
      <section anchor="dp">
        <name>Differential Privacy</name>
        <t>DAP deployments can choose to ensure their aggregate results achieve
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 aggregate shares. 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 measurement in a batch except for one, that one measurement is still
formally protected.</t>
      </section>
      <section anchor="task-parameters">
        <name>Task Parameters</name>
        <t>Distribution of DAP task parameters is out of band from DAP itself and thus not
discussed in this document. This section examines the security tradeoffs
involved in the selection of the DAP task parameters. Generally, attacks
involving crafted DAP task parameters can be mitigated by having the Aggregators
refuse shared parameters that are trivially insecure (e.g., a minimum batch size
of 1 report).</t>
        <section anchor="verification-key">
          <name>VDAF Verification Key Requirements</name>
          <t>Knowledge of the verification key would allow a Client to forge a report with
invalid values that will nevertheless pass verification. Therefore, the
verification key must be kept secret from Clients.</t>
          <t>Furthermore, for a given report, it may be possible to craft a verification key
which leaks information about that report's measurement during VDAF preparation.
Therefore, the verification key for a task <bcp14>SHOULD</bcp14> be chosen before any reports
are generated. Moreover, it <bcp14>SHOULD</bcp14> be fixed for the lifetime of the task and not
be rotated. One way to ensure that the verification key is generated
independently from any given report is to derive the key based on the task ID
and some previously agreed upon secret (verify_key_seed) between Aggregators, as
follows:</t>
          <artwork><![CDATA[
verify_key = HKDF-Expand(
    HKDF-Extract(
        "verify_key",    # salt
        verify_key_seed, # IKM
    ),
    task_id,             # info
    VERIFY_KEY_SIZE,     # L
)
]]></artwork>
          <t>Here, VERIFY_KEY_SIZE is the length of the verification key, and HKDF-Extract
and HKDF-Expand are as defined in <xref target="RFC5869"/>.</t>
          <t>This requirement comes from current security analysis for existing VDAFs. In
particular, the security proofs for Prio3 require that the verification key is
chosen independently of the generated reports.</t>
        </section>
        <section anchor="batch-parameters">
          <name>Batch Parameters</name>
          <t>An important parameter of a DAP deployment is the minimum batch size. If a batch
includes too few reports, then the aggregate result can reveal information about
individual measurements. Aggregators enforce the agreed-upon minimum batch size
during the collection protocol, but implementations <bcp14>SHOULD</bcp14> 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 an appropriate minimum batch size, but
an appropriate value may be determined from the differential privacy (<xref target="dp"/>)
parameters in use, if any.</t>
          <t>If batches will be collected more than once, it is possible that some invalid
reports could be accepted and successfully aggregated into the first collection,
but be rejected with a subsequent aggregation parameter. This could reduce the
number of successfully aggregated reports below the minimum batch size, and make
the batch uncollectable with that aggregation parameter, as described in
<xref target="batch-size"/>. This constitutes an efficient denial of service vector for a
Sybil attacker. In deployments that will collect batches more than once, the
actual batch sizes, as determined by the Leader or Collector (depending on query
type) <bcp14>SHOULD</bcp14> be greater than the minimum batch size to allow for later rejection
of some number of invalid reports.</t>
        </section>
        <section anchor="task-configuration-agreement-and-consistency">
          <name>Task Configuration Agreement and Consistency</name>
          <t>In order to execute a DAP task, it is necessary for all parties to ensure they
agree on the configuration of the task. However, it is possible for a party to
participate in the execution of DAP without knowing all of the task's
parameters. For example, a Client can upload a report (<xref target="upload-flow"/>) without
knowing the minimum batch size that is enforced by the Aggregators during
collection (<xref target="collect-flow"/>).</t>
          <t>Depending on the deployment model, agreement can require that task parameters
are visible to all parties such that each party can choose whether to
participate based on the value of any parameter. This includes the parameters
enumerated in <xref target="task-configuration"/> and any additional parameters implied by
upload extensions <xref target="upload-extensions"/> used by the task. Since meaningful
privacy requires that multiple Clients contribute to a task, they should also
share a consistent view of the task configuration.</t>
        </section>
      </section>
      <section anchor="infrastructure-diversity">
        <name>Infrastructure Diversity</name>
        <t>DAP deployments should ensure that Aggregators do not have common dependencies
that would enable a single vendor to reassemble measurements. 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>
    <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>
            <t>HpkeConfigList <xref target="hpke-config"/>: "application/dap-hpke-config-list"</t>
          </li>
          <li>
            <t>Report <xref target="upload-request"/>: "application/dap-report"</t>
          </li>
          <li>
            <t>AggregationJobInitReq <xref target="leader-init"/>: "application/dap-aggregation-job-init-req"</t>
          </li>
          <li>
            <t>AggregationJobResp <xref target="aggregation-helper-init"/>: "application/dap-aggregation-job-resp"</t>
          </li>
          <li>
            <t>AggregationJobContinueReq <xref target="aggregation-leader-continuation"/>: "application/dap-aggregation-job-continue-req"</t>
          </li>
          <li>
            <t>AggregateShareReq <xref target="collect-flow"/>: "application/dap-aggregate-share-req"</t>
          </li>
          <li>
            <t>AggregateShare <xref target="collect-flow"/>: "application/dap-aggregate-share"</t>
          </li>
          <li>
            <t>CollectionReq <xref target="collect-flow"/>: "application/dap-collect-req"</t>
          </li>
          <li>
            <t>Collection <xref target="collect-flow"/>: "application/dap-collection"</t>
          </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="dap-type-registries">
        <name>DAP Type Registries</name>
        <t>This document also requests creation of a new "Distributed Aggregation Protocol
Parameters" page. This page will contain several new registries, described in the
following sections.</t>
        <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="prepare-error-reg">
          <name>Prepare Error Registry</name>
          <t>This document requests creation of a new registry for PrepareError values. This
registry should contain the following columns:</t>
          <dl>
            <dt>Name:</dt>
            <dd>
              <t>The name of the PrepareError value</t>
            </dd>
            <dt>Value:</dt>
            <dd>
              <t>The 1-byte value of the PrepareError value</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>A reference to where the PrepareError type is defined.</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are as defined in <xref target="aggregation-helper-init"/>,
with this document as the reference.</t>
        </section>
      </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 numbered="false" anchor="contributors">
      <name>Contributors</name>
      <artwork><![CDATA[
    Josh Aas
    ISRG
    josh@abetterinternet.org

    Junye Chen
    Apple
    junyec@apple.com

    David Cook
    ISRG
    dcook@divviup.org

    Charlie Harrison
    Google
    csharrison@chromium.org

    Peter Saint-Andre
    stpeter@gmail.com

    Shivan Sahib
    Brave
    shivankaulsahib@gmail.com

    Phillipp Schoppmann
    Google
    schoppmann@google.com

    Martin Thomson
    Mozilla
    mt@mozilla.com

    Shan Wang
    Apple
    shan_wang@apple.com
]]></artwork>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-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="20" month="November" 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
   measurement that would result in an invalid aggregate result.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-dcook-ppm-dap-interop-test-design-04"/>
        </reference>
        <reference anchor="I-D.draft-ietf-privacypass-architecture-16">
          <front>
            <title>The Privacy Pass Architecture</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="September" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for authorization
   based on privacy-preserving authentication mechanisms.  It describes
   the conceptual model of Privacy Pass and its protocols, its security
   and privacy goals, practical deployment models, and recommendations
   for each deployment model that helps ensure the desired security and
   privacy goals are fulfilled.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-architecture-16"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y963obx5U2+r+uogf6YdIBIFKiDqbiZGhJtjmxLY0kJ5PJ
9ggNoEF0BKARdIMUImtfy76WfWV7HatWVTdIynFmz/d8n548sQSgq+uwap3X
uwaDgWvKZlGcZr1nZd1syvG2KabZ2cXFprjIm7JaZS83VVNNqkU2qzbwj/Iy
n+zgv0VdbC7L1UX2fZHX202xLFZNz+Xj8aa4PM2enb0cvHz5vZtWk1W+hOGn
m3zWDMqimQ3W6+Vgmq8Hx0dukjfFRbXZnWZ1M3Xuslhti1OXZRebaruGOd30
uixrdmuc/J+qzTv89ht8ED9f5uUCPod3/Su+dFhtLvDjfDOZw8fzplnXp3fv
4q/wo/KyGOrP7uIHd8eb6qou7sLzd/G5i7KZb8fwJK3g6gIXcbe9JvzpAtZU
N+Yl5pEhjzMsq46HOz4azpvlogcbc5rddy7fNvNqA/szgNfQn3JVn2Zvhtk3
RXUxhwNb6Re86W/KZfsrWGK+Kv9Oh3uanb9+9Y1+U/CmNeXyAh76DU7kXy/w
s+GkWrr0tU+H2cu8aarknU/nGyCkaj0vNsn38YufLqrtdAa7XySvn+AAa3ry
pil8BVMom2W67K82+WqKlBt9d+O6x/DYv+L/DRfwfOtlz4fZq6KeVJtFHr/u
+aactL6K3/Z99fdyEb6UFxbvNv+6aWbLfdt7Nsz+VFXT/fub/OC2G5xf/eu8
yNdwX8ZlUw9XReOcK1dwv5fw7CXcQHji6TdfHT86pUeVQ8BtrE6ZBTRFP3tV
jbd1089gs7LXk3yRjxdF9rRarrcNc45q5hlJkb3GD+umnNQ9GnQKH55m946O
Hw2O7g+OT/hN+eaisHdnstmtm2pYNzlObzosptu7a5jG3XW+LjbD9XTGo/mr
QX8GvIXfDmE6m00JuzL4phyP6/jrZ8Psq2pVzHG1X3319Jtvzo+/iBf8n8Wm
GvxhVV0tiulFgZywmtUZrOx1MdkUzeD1HHZ3mj3Lmzy7LPPs6+1iscu+K1dF
DsT/9GWy1HvHgyP434PupRawrlUzLPPJhtgQbM0Xd48fP75mgX4F0afP8dPd
ovikzfgBmEi5GFd5/PGfh9l5Pc/LsEf3juM9+q68mDdXBf5/9qaYzFfl37ZF
HYQFHP23RX65y74tm6bY/INbcu/4LlDM/5gteVZtj+7F+/FmDrS+G5eL7Kxp
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
fZS8VuxSwmLK9Txnn8MgO49UvdPsK++janXtAbMOTJG6WCL6Zch59Sr6akoJ
RjKeTcwkNkIZCy19dAhzEL4qM3jqSyn2TEI0QgJ4oXHt+0PfPCJMq/Qrxg8B
dYRazclku6l5GvQ9TeJrYnLRFAqaQD/boU829HO2MRhj3TtK1raKdZSQl5wZ
O6xqPZk2ekrsrY7vKoY9fKOo5EDZrcl4ClGwUXJwOyyfseCzcQqmOD+Dr8Ki
HjkJr3scNIwhaWs6dmcq6AATuWYXC/aRaSBQT8CMVICfALgiT5ODRJueSTLI
dQUl4phPlGbpjJemDeF9Yeef8Y/OCAJ7tfOdtdo7wKCt5D51vl0SsAsCkLpm
C+vIMawHYU5hvHM12OgNXbLYdvOQ696Po+X/rar2sEJngEbI0lZXp0XBjaiG
hRuHVNFdgFfhquKaU3ZVviom3PECs07U9eMNVrwUCXdQd9EQn/Y9KixqYubT
q2UuRac/1h8RpdpnWWbzuyNPURxeN5uQrNZGIzlsoBl6fLvu6BCtu8WqxP7r
de0m010P/v2UTHwLq4i6YfO+Ccn1lE7UInPa4mcSJk3DZ6m9z58meW28rTa+
IlFXybyB8Z9S13bvfwuOmySpmU/4xvGTzJ5zLmQlz0PItFInQSstSYP64Wtx
MiyBSGvEqw/ZlXsYms/i7XCI+Fw2gndsNZwjgpyGnOoDknR9lA7U5N7XCKAP
/C0IiIu3ooMiRXDNQALtRb5IY7cnpQL0z6gogT/pym8dSu6wTeplOLQUTkwz
b7sxqCwSHT7tJxc/161XSYZHG+pPb3Er78S1CtvM4WLiItW5RV0vcYZRjvbe
uiefC2erSejX+zKE49SLUUfmwIgZgPbSZBHegcr3YPjYwvIxWkGIMSlIJCfF
McfANDappMxGRFwjquLFJFfdAv3pSKlupLoQRnEw+zp2NVJejAyG6/OYFT7r
KXLLsvypAyB0uF/Tmy8XWzeryk+J8u9XjYunRPe+a06qE/pJRaFVTaKm0lSO
shXIqkdt2+g2xae/avXoDXWgUiXRngQno8gMfK3p9fUXYeWi5MRdq71qLKUm
mnge7YgtKGX20VWgGt0h/WbY9fTtr1/n49cX9bXLAmBMsq+IHap3+nBv0R+9
sLsopOsihb6rOwnjSyInyimk3kYTmrzxijxJKZorWTxRfy2OlJFmaYq2FqsJ
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
NxQl0cDXZUfoXD7JLPMdiTVLhxb3NZoKA5L54crM/Ie3vy832R2tWzTTKySu
IDVEatyZLef0mO1ZKfZ9wnP5NMq2Vp1nXFrN3JMQLtg6SnsnipDi3CIeznvW
xru3mjcZ1SG7rCX6tA9asKgS1OY8fEMJRFgZLwLQhQa0EW676b3njbuu4N4+
vOnYwgsz3Ilx5zHS9k1UreN8Lzqu4ibAaMl0/5m3h90O1ZoDiotYO4sf9LpT
uHZ7NBi3/9qB8EJ4j1lrPNIT1O7tU7jQD/PbL7Pk13tvb9Z1e921txfdWbx/
IO6eSl8RgQn4cKcKXw4m+TonGQw7LPnqaG4qQCDpn+VqzhW9QbijAryhMF1w
0GyAXqrZTDF4nOB6ZRdbUDuBd0o0jj0nOjmOtr4nHYDZuo6D750tGEgftA1n
sjq4WF2b/1bZtikpJC6YV3WMBkc7qb5Gz72zl7pEKlKblGts7PnUbAfsFI7Q
7Lo2CWzA8mLFBiCaA1psgfsVSqAJEnzNU2acojgJzxnsNZ3OOkwHtU2S+bgM
6Xls0f1qdmwF9BGxT7QtqBqq6p6168CpkxnB/fk0ksvJ93YbnNNuy1TFsSiX
JRJdNFa6NjrLcsNJFeTGVQ+B8+skt+TxYZY4QAIqiUK/j7kH2zQ7uHcIzEbE
Pr5n6KeGgxFuvaJfBny11U5hDCebqmazn5v5Uiku7OEKOeeGXDE7D+9Gfjol
Ix4FtWZ/HXUMxHbcwaQQWa6sl8Psq50QBxew+vW2SAXzYKoxIaGiyUq1Zqj6
TDElSw6CX+IEvLJGQDOJmvtxJWGA3aomK++SMhQWsv1Ju0RYcXzGaoXjPqs5
T+cdKNSwjfZhJxfCVh8hKj5NzgzAoG3rgoqJfDyfcBGrlahybI87RZn0QQuW
C0SHwg2qjWVNDCtKpAfUgun3oPw5EnCoPxa6wM4Xmlf0ifKuymkz7wvMHs3E
mXfZ4/aeDAVyzKkytaYKLLouCwqSyvYKv3e620jCAg2ziMiQ3HKvt2vfVi8c
slFJteLAl3SqXsY10DbvJJQnEu4+jP4Sg6Q112gv8xVuN9ZhtVytma9qHpuu
5DgnIdQsQMsS5p8m9vRDHrx6MyO9xHaNlBX7vFT2U/5/7V1tcxvHkf4+v2KP
/mCqCqD8EuVsxnHEiJLNUyjpRNt3OVfKtQCW5EYAFoUFSCEq/ffrfrp7pmd3
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
TepiWq+n24UA+NvjNK2l82OugeeslduelhKeY2DdvsvzCCl2Xr1mpwvmDT3a
SBRqs6y6eQdAgQP2KXteOlH09mLKDc5Kv4goEZI/96I0wdUtPOFRfdEnXjv/
jvRuNb9UE2QrzdE1ZG94a1dZqdrEqmA1Hmol1ZrbjGXGQSMKic2psliUvtWB
mR4V3yXXVVWaDsQSNeUjnEYcesZe7CQptK4IITCncjzzY8TAhrYVRYEQHq1K
ZmY/8xHogT5XJXZPcWiIgfwEkJNqqKfVrpvCv3Hfj19VfJ49dfKEifvfAKh7
a8zr4rlGI5kk5qpKQU006VJeKANiCxUQTAwWVRqee4QjOp7dB/6pYcRZs/Qm
YZjxVyzSyqsIsYqOUI4D8WS3MkHhd5PAtW+AgXfMwZzOLbVIikNl7aB3XNpR
hZaiaUtpVRxeiMt4HoX8GfsLLXOGnCnAY5JqV5TvbrmLh1cq9EPLDQ7ENAau
S9ejgmOw7CkDpvBO5MO52choDBxVy8n7AYPzpj0a55Gr39RY2r+JQvCnwjwg
sQwaJesz41kiNW4g1BTgO1mz+t6u2LgSSTgUM/gXGucXMoRm94bKJ1D0kzOH
psuKPwrS4/FrOppnh6Bv1g8QdTmMhM4H6aKDEX/wCR1v8038vjOVEX1/9vQc
X98TWmhlrx1lrNCfQMbw/U+PX549+esvTx//9ZeLs/95PNLv/xKUbfT7ikWo
8yuDbmsFyp7NLGeRf7DgPlgBomQE6YYWISvqT2RFPfjq919rq8lUfim1Gs3C
qjkNPRXVc7ks57u2ljw/siG2N9oed3mm1+kYai7lMomtJsNjvxxaydRguibK
aMx/ecJJf8SdILVOP+HgbiIlRVC4E0eu9/GZgNqrjLxe1p+3aVCpEUMwGysa
6MUdBQ6IMF1P+wQXzelgD5xJ5vvryKYZY9MMHCiOKsnlcMwolahyFyytOgb4
z2a10RO/4z3AHonHp7YT7U9AVEIjdVSam4nUA9EJVNAYSMvAEgSrV4Bn64bs
IwAhBqhlaPqh8zNJ2Ol54Pi+YgzinUmQ4I0duB4jsdl20k0WN69SX4sIm0+U
f4pB7nZkQrsM1nh6lIYUdlGHQyL1WnnxXiYo6x0aay8Cv0vfakOZlBwt6F6+
/dqmkbAdIQXU983FnuBdYI6Rcha8EsCkfLFd6rwRH1Y0dblnfv1ApEGZeXzu
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

-->

</rfc>
