<?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.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-12" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="DAP">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-12"/>
    <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>Independent</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="October" day="10"/>
    <abstract>
      <?line 125?>

<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 137?>

<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>12:</t>
        <ul spacing="normal">
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-08 to 12 <xref target="VDAF"/>, and specify the newly-defined
application context string to be a concatenation of the DAP version in use
with the task ID. (*)</t>
          </li>
          <li>
            <t>Add support for "asynchronous" aggregation, based on the Leader polling the
Helper for the result of each step of aggregation. (*)</t>
          </li>
          <li>
            <t>Update collection semantics to match the new aggregation semantics introduced
in support of asynchronous aggregation. (*)</t>
          </li>
          <li>
            <t>Clarify the requirements around report replay protection, defining when and
how report IDs must be checked and stored in order to correctly detect
replays.</t>
          </li>
          <li>
            <t>Remove support for per-task HPKE configurations. (*)</t>
          </li>
          <li>
            <t>Rename "query type" to "batch mode", to align the name of this configuration
value with its functionality.</t>
          </li>
          <li>
            <t>Rename the "fixed-size" batch mode to "leader-selected", to align the name
with the behavior of this query type.</t>
          </li>
          <li>
            <t>Remove the <tt>max_batch_size</tt> parameter of the "fixed-size" batch mode.</t>
          </li>
          <li>
            <t>Restore the <tt>part_batch_selector</tt> field of the <tt>Collection</tt> structure, which
was removed in draft 11, as it is required to decrypt collection results in
some cases. (*)</t>
          </li>
          <li>
            <t>Update <tt>PrepareError</tt> allocations in order to remove an unused value and to
reserve the zero value for testing. (*)</t>
          </li>
          <li>
            <t>Document distributed-system and synchronization concerns in the operational
considerations section.</t>
          </li>
          <li>
            <t>Document additional storage and runtime requirements in the operational
considerations section.</t>
          </li>
          <li>
            <t>Document deviations from the presentation language of <xref section="3" sectionFormat="of" target="RFC8446"/> for structures described in this specification.</t>
          </li>
          <li>
            <t>Clarify that differential privacy mitigations can help with privacy, rather
than robustness, in the operational considerations section.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-11" to "dap-12". (*)</t>
          </li>
        </ul>
        <t>11:</t>
        <ul spacing="normal">
          <li>
            <t>Remove support for multi-collection of batches, as well as the fixed-size
query type's <tt>by_batch_id</tt> query. (*)</t>
          </li>
          <li>
            <t>Clarify purpose of report ID uniqueness.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-10" to "dap-11". (*)</t>
          </li>
        </ul>
        <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?>

<section anchor="glossary-of-terms">
          <name>Glossary of Terms</name>
          <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. 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>
        </section>
      </section>
      <section anchor="representation-language">
        <name>Representation Language</name>
        <t>We use the presentation language defined in <xref section="3" sectionFormat="comma" target="RFC8446"/> to define
messages in the DAP protocol, with the following deviations.</t>
        <t><xref section="3.7" sectionFormat="of" target="RFC8446"/> defines a syntax for structure fields whose values
are constants. In this document, we do not use that notation, but use something
similar to describe specific variants of structures containing enumerated types,
described in <xref section="3.8" sectionFormat="comma" target="RFC8446"/>.</t>
        <t>For example, suppose we have an enumeration and a structure defined as follows:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  number(0),
  string(1),
  (255)
} ExampleEnum;

struct {
  uint32 always_present;
  ExampleEnum type;
  select (ExampleStruct.type) {
    case number: uint32 a_number;
    case string: opaque a_string<0..10>;
  };
} ExampleStruct;
]]></sourcecode>
        <t>Then we describe the specific variant of <tt>ExampleStruct</tt> where <tt>type == number</tt>
with a <tt>variant</tt> block like so:</t>
        <sourcecode type="tls-presentation"><![CDATA[
variant {
  /* Field exists regardless of variant */
  uint32 always_present;
  ExampleEnum type = number;
  /* Only fields included in the `type == number`
    variant is described */
  uint32 a_number;
} ExampleStruct;
]]></sourcecode>
        <t>The protocol text accompanying this would explain how implementations should
handle the <tt>always_present</tt> and <tt>a_number</tt> fields but not <tt>type</tt>. This does not
mean that the <tt>type</tt> field of <tt>ExampleStruct</tt> can only ever have value <tt>number</tt>.</t>
        <t>This notation can also be used in structures where the enum field does not
affect what fields are or are not present in the structure. For example:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  something(0),
  something_else(1),
  (255)
} FailureReason;

struct {
  FailureReason failure_reason;
  opaque another_field<0..256>;
} FailedOperation;
]]></sourcecode>
        <t>The protocol text might include a description like:</t>
        <sourcecode type="tls-presentation"><![CDATA[
variant {
  FailureReason failure_reason = something;
  opaque another_field<0..256>;
} FailedOperation;
]]></sourcecode>
        <t>Encoding and decoding of these messages as byte strings also follows
<xref target="RFC8446"/>.</t>
        <t>Finally, for variable-length vectors, the lower length limit is <tt>0</tt> rather than
the length of the smallest vector.</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"/>. This protocol only supports VDAFs which
require a single collection to provide useful results.</t>
      <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 anchor="replay-protection">
        <name>Replay Protection</name>
        <t>Another goal of DAP is to mitigate replay attacks in which a report is
aggregated multiple times within a batch or across multiple batches. This would
allow the attacker to learn more information about the underlying measurement
than it would otherwise.</t>
        <t>When a Client generates a report, it also generates a random nonce, called the
"report ID". Each Aggregator is responsible for storing the IDs of reports it
has aggregated for a given task. To check whether a report has been replayed,
it checks whether the report's ID is in the set of stored IDs.</t>
        <t>Note that IDs do not need to be stored indefinitely. The protocol allows
Aggregators to enforce replay only for a sliding time window --- say, within
the last two weeks of the current time --- and reject reports that fall outside
of the replay window. This allows implementation to save resources by
forgetting old report IDs.</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">batchQueriedMultipleTimes</td>
              <td align="left">A batch was queried with multiple distinct aggregation parameters.</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">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>
      <section anchor="basic-type-definitions">
        <name>Basic Type Definitions</name>
        <t>The following are some basic type definitions used in other messages:</t>
        <sourcecode type="tls-presentation"><![CDATA[
/* ASCII encoded URL. e.g., "https://example.com" */
opaque Url<0..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<0..2^16-1>;     /* encapsulated HPKE key */
  opaque payload<0..2^32-1>; /* ciphertext */
} HpkeCiphertext;

/* Represent a zero-length byte string. */
struct {} Empty;
]]></sourcecode>
        <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>
      <section anchor="batch-mode">
        <name>Batch Modes, Batches, and Queries</name>
        <t>Aggregated results are computed based on sets of reports, called "batches". The
Collector requests the aggregated results for a given 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>Each measurement task has a preconfigured "batch mode". The batch mode defines
both how reports may be partitioned into batches, as well as how these batches
are addressed and the semantics of the query used for collection.</t>
        <t>This document defines the following batch modes:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0), /* Reserved for testing purposes */
  time_interval(1),
  leader_selected(2),
  (255)
} BatchMode;
]]></sourcecode>
        <t>The time-interval batch mode is described in <xref target="time-interval-batch-mode"/>; the
leader-selected batch mode is described in <xref target="leader-selected-batch-mode"/>.
Future specifications may introduce new batch modes as needed (see
<xref target="batch-mode-reg"/>). Implementations are free to implement only a subset of the
available batch modes.</t>
        <t>A query includes parameters used by the Aggregators to select a batch of
reports specific to the given batch mode. A query is defined as follows:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  BatchMode batch_mode;
  select (Query.batch_mode) {
    case time_interval: Interval batch_interval;
    case leader_selected: Empty;
  }
} Query;
]]></sourcecode>
        <t>The query is issued in-band as part of the collect interaction
(<xref target="collect-flow"/>). Its content is determined by the batch mode, which in turn
is determined by the measurement task, which is configured out-of-band. All
batch modes 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 batch
mode. (See <xref target="batch-validation"/> for details.)</t>
          </li>
        </ul>
        <t>The parameters pertaining to specific batch modes are described in
<xref target="time-interval-batch-mode"/> and <xref target="leader-selected-batch-mode"/>.</t>
        <section anchor="time-interval-batch-mode">
          <name>Time-interval Batch Mode</name>
          <t>The time-interval batch mode is designed to support applications in which
reports are collected into batches grouped by an interval 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.) However, this is not a requirement--the Collector may
decide to issue queries out-of-order. In addition, the Collector may need to
vary the duration to adjust to changing report upload rates.</t>
        </section>
        <section anchor="leader-selected-batch-mode">
          <name>Leader-selected Batch Mode</name>
          <t>The leader-selected batch mode is used to support applications in which it is
acceptable for reports to be batched in an arbitrary fashion by the Leader. Each
batch of reports is identified by an opaque "batch ID". Both the reports
included in each batch and the ID for each batch are allocated in an arbitrary
fashion by the Leader.</t>
          <t>The Collector will not know the set of batch IDs available for collection. To
get the aggregate of a batch, the Collector issues a query, which does not
include any information specifying a particular batch (see <xref target="batch-mode"/>). The
Leader selects 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>The Aggregators can output batches of any size that is larger than or equal to
<tt>min_batch_size</tt>. The target batch size, if any, is implementation-specific, and
may be equal to or greater than the minimum batch size. Deciding how soon
batches should be output is also implementation-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.</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>
        <sourcecode type="tls-presentation"><![CDATA[
opaque TaskID[32];
]]></sourcecode>
        <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 batch mode for this task (see <xref target="batch-mode"/>). This determines how reports
are grouped into batches 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
batch mode.</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 collection
interactions, 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>.</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>
          <sourcecode type="tls-presentation"><![CDATA[
HpkeConfig HpkeConfigList<0..2^16-1>;

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

opaque HpkePublicKey<0..2^16-1>;
uint16 HpkeAeadId; /* Defined in [HPKE] */
uint16 HpkeKemId;  /* Defined in [HPKE] */
uint16 HpkeKdfId;  /* Defined in [HPKE] */
]]></sourcecode>
          <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>
          <sourcecode type="http-message"><![CDATA[
  Cache-Control: max-age=86400
]]></sourcecode>
          <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>
          <sourcecode type="tls-presentation"><![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;
]]></sourcecode>
          <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 is not
 replayed (<xref target="agg-flow"/>). 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>
          <sourcecode type="pseudocode"><![CDATA[
(public_share, input_shares) = Vdaf.shard(
    "dap-12" || task_id,
    measurement, /* plaintext measurement */
    report_id,   /* nonce */
    rand,        /* randomness for sharding algorithm */
)
]]></sourcecode>
          <t>where <tt>task_id</tt> is the task ID. 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>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  Extension extensions<0..2^16-1>;
  opaque payload<0..2^32-1>;
} PlaintextInputShare;
]]></sourcecode>
          <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>
          <sourcecode type="pseudocode"><![CDATA[
enc, payload = SealBase(pk,
  "dap-12 input share" || 0x01 || server_role,
  input_share_aad, plaintext_input_share)
]]></sourcecode>
          <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>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  TaskID task_id;
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
} InputShareAad;
]]></sourcecode>
          <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>.</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 interaction 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 interaction
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 interaction 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>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  ExtensionType extension_type;
  opaque extension_data<0..2^16-1>;
} Extension;

enum {
  TBD(0),
  (65535)
} ExtensionType;
]]></sourcecode>
          <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 a fixed operation depending only on the input share, but in
general the mapping involves an aggregation parameter chosen by the
Collector.</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, while the
Prio3Histogram variant (<xref section="7.4.4" sectionFormat="of" target="VDAF"/>) proves that output shares
sum up to a one-hot vector representing a contribution to a single bucket of
the histogram.</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>
          <artwork><![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
]]></artwork>
        </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>Normally, the Helper processes each step synchronously, meaning it computes
each step of the computation before producing a response to the Leader's HTTP
request. The Helper can optionally instead process each step asynchronously,
meaning the Helper responds to requests immediately, while deferring processing
to a background worker. To continue, the Leader polls the Helper until it
responds with the next step. This choice allows a Helper implementation
flexibility in choosing a request model that best supports its architecture
and use case. For instance, resource-intensive use cases, such as replay checks
across vast numbers of reports and preparation of large histograms, may be
better suited for the asynchronous model. For use cases where datastore
performance is a concern, the synchronous model may be better suited.</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).</t>
        <t>An aggregation job can be thought of as having three phases, which are
described in the remaining subsections:</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 aggregation flow, yielding an output share
corresponding to each report share in the aggregation job.</t>
          </li>
        </ul>
        <t>After an aggregation job is completed, each Aggregator stores the output shares
until the aggregate share is collected as described in <xref target="collect-flow"/>. Note
that it is usually not necessary to store output shares individually: depending
on the batch mode and VDAF, the output shares can be merged into existing
aggregate shares that are updated as aggregation jobs complete. This streaming
aggregation is compatible with Prio3 and all batch modes specified in this
document.</t>
        <t>Apart from VDAF preparation, another important task of the aggregation
interaction is to provide replay protection (<xref target="replay-protection"/>). Along with
the output shares, each Aggregator records the IDs of all reports it is has
aggregated for a given task: before committing to an output share, it checks
whether the corresponding report ID is in the set of stored IDs.</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>
          <sourcecode type="tls-presentation"><![CDATA[
opaque AggregationJobID[16];
]]></sourcecode>
          <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>
          <t>Implementation note: the Leader will generally want to associate each report
with a single aggregation job, as otherwise the duplicated reports will
eventually be discarded as a replay. However, it is likely not appropriate to
directly use the used-ID storage used for replay protection to determine which
reports can be added to an aggregation job: certain errors (e.g.
<tt>report_too_early</tt>) allow the report to be added to another aggregation job in
the future; but storage into the used-ID storage is permanent.</t>
          <section anchor="leader-init">
            <name>Leader Initialization</name>
            <t>The Leader begins the aggregate initialization by sampling a fresh
AggregationJobID.</t>
            <t>Next, for each report in the candidate set, it checks if the report ID
corresponds to a report ID it has previously stored for this task. If so, it
marks the report as invalid and removes it from the candidate set.</t>
            <t>Next, the Leader decrypts each of its report shares as described in
<xref target="input-share-decryption"/>, then checks input share validity as described in
<xref target="input-share-validation"/>. If either 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>
            <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_init(
    vdaf_verify_key,
    "dap-12" || task_id,
    agg_param,
    report_id,
    public_share,
    plaintext_input_share.payload)
]]></sourcecode>
            <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>task_id</tt> is the task ID</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>
            <sourcecode type="tls-presentation"><![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;
]]></sourcecode>
            <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>
            <sourcecode type="tls-presentation"><![CDATA[
opaque BatchID[32];

struct {
  BatchMode batch_mode;
  select (PartialBatchSelector.batch_mode) {
    case time_interval: Empty;
    case leader_selected: BatchID batch_id;
  };
} PartialBatchSelector;

struct {
  opaque agg_param<0..2^32-1>;
  PartialBatchSelector part_batch_selector;
  PrepareInit prepare_inits<0..2^32-1>;
} AggregationJobInitReq;
]]></sourcecode>
            <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 leader-selected tasks, the Leader specifies a "batch ID" that
determines the batch to which each report for this aggregation job
belongs.</t>
                  </li>
                </ul>
                <t>
The indicated batch mode <bcp14>MUST</bcp14> match the task's batch mode. 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
batch mode, it may not determine a batch. In particular, if the batch mode is
<tt>time_interval</tt>, the batch is not determined until the Collector's query is
issued (see <xref target="batch-mode"/>).</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 an HTTP PUT request to
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt> with a media
type of "application/dap-aggregation-job-init-req" and a body containing the
<tt>AggregationJobInitReq</tt>.</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 responds with HTTP status 201 Created with a body containing an
<tt>AggregationJobResp</tt> (see <xref target="aggregation-helper-init"/>). If the <tt>status</tt> field
is <tt>ready</tt>, the Leader proceeds onward. Otherwise, if the <tt>status</tt> field is
<tt>processing</tt>, the Leader polls the aggregation job by sending GET requests to
the URI indicated in the Location header field, until the <tt>status</tt> is <tt>ready</tt>.
The Helper's response when processing <bcp14>SHOULD</bcp14> include a Retry-After header to
suggest a polling interval to the Leader.</t>
            <t>The <tt>AggregationJobResp.prepare_resps</tt> field 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>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>
                <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_continued(
    "dap-12" || task_id,
    agg_param,
    prev_state,
    inbound,
)
]]></sourcecode>
                <t>
where:  </t>
                <ul spacing="normal">
                  <li>
                    <t><tt>task_id</tt> is the task ID</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>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>When the Leader stores the <tt>out_share</tt>, it <bcp14>MUST</bcp14> also store the report ID for
replay protection.</t>
            <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>Upon receipt of an <tt>AggregationJobInitReq</tt>, 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>To process the aggregation job, the Helper computes an outbound prepare step
for each report share. This includes the following structures:</t>
            <sourcecode type="tls-presentation"><![CDATA[
enum {
  continue(0),
  finished(1)
  reject(2),
  (255)
} PrepareRespState;

enum {
  reserved(0),
  batch_collected(1),
  report_replayed(2),
  report_dropped(3),
  hpke_unknown_config_id(4),
  hpke_decrypt_error(5),
  vdaf_prep_error(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;
]]></sourcecode>
            <t>First, for each report in the request, the Helper <bcp14>MAY</bcp14> check if the report ID
corresponds to a report ID it has previously stored for this task. If so, it
rejects the report by setting the outbound preparation response to</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError report_replayed;
} PrepareResp;
]]></sourcecode>
            <t>where <tt>report_id</tt> is the report ID. Note that the Helper must perform this
check before completing the aggregation job.</t>
            <t>Next the Helper decrypts each of its remaining report shares as described in
<xref target="input-share-decryption"/>, then checks input share validity as described in
<xref target="input-share-validation"/>. For any report that was rejected, the Helper sets
the outbound preparation response to</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error;
} PrepareResp;
]]></sourcecode>
            <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>
            <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_helper_init(
    vdaf_verify_key,
    "dap-12" || task_id,
    agg_param,
    report_id,
    public_share,
    plaintext_input_share.payload)
]]></sourcecode>
            <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>task_id</tt> is the task ID</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>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error = vdaf_prep_error;
} PrepareResp;
]]></sourcecode>
            <t>Otherwise the Helper responds with</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = continue;
  opaque payload<0..2^32-1> = outbound;
} PrepareResp;
]]></sourcecode>
            <t>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"/>).</t>
            <t>If <tt>state == Finished(out_share)</tt>, the Helper <bcp14>MUST</bcp14> resolve replay of the
report. It does so by checking if the report ID was previously stored for this
task. If so, it responds with</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError report_replayed;
} PrepareResp;
]]></sourcecode>
            <t>Otherwise it stores the report ID for replay protection and <tt>out_share</tt> for use
in the collection interaction (<xref target="collect-flow"/>).</t>
            <t>Finally, the Helper creates an <tt>AggregationJobResp</tt> to send to the Leader. This
message is structured as follows:</t>
            <sourcecode type="tls-presentation"><![CDATA[
enum {
  processing(0),
  ready(1),
} AggregationJobStatus;

struct {
  AggregationJobStatus status;
  select (AggregationJobResp.status) {
    case processing: Empty;
    case ready:      PrepareResp prepare_resps<0..2^32-1>;
  };
} AggregationJobResp;
]]></sourcecode>
            <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 201 Created, a body
consisting of the <tt>AggregationJobResp</tt>, and the media type
"application/dap-aggregation-job-resp".</t>
            <t>Depending on the task parameters, processing an aggregation job may take some
time, so the Helper <bcp14>MAY</bcp14> defer computation to a background process. It does so
by responding with the field <tt>status</tt> set to <tt>processing</tt> and a Location header
field set to the relative reference
<tt>/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}?step=0</tt>. The Leader
then polls the Helper by making HTTP GET requests to the aforementioned
Location. The Helper responds to GET requests with HTTP status 200 and the
<tt>status</tt> field reflecting the current state of the job. When the aggregation
job is <tt>processing</tt>, the response <bcp14>SHOULD</bcp14> include a Retry-After header field to
suggest a polling interval to the Leader.</t>
            <t>Changing an aggregation job's parameters is illegal, so further HTTP PUT
requests to <tt>/tasks/{task-id}/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. For further requests with
the same <tt>AggregationJobInitReq</tt> in the body, the Helper <bcp14>SHOULD</bcp14> respond as it
did for the original <tt>AggregationJobInitReq</tt>, or otherwise 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>
          </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>
            <sourcecode type="pseudocode"><![CDATA[
plaintext_input_share = OpenBase(encrypted_input_share.enc, sk,
  "dap-12 input share" || 0x01 || server_role,
  input_share_aad, encrypted_input_share.payload)
]]></sourcecode>
            <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>If the report pertains to a batch that was previously collected, then the
input share <bcp14>MUST</bcp14> be marked as invalid with error <tt>batch_collected</tt>.  </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 CollectionJobReq 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="batch-mode"/>) 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 that makes it easy to determine
whether a report pertains to a batch that was collected. See
<xref target="distributed-systems"/> for more information.</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>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  ReportID report_id;
  opaque payload<0..2^32-1>;
} PrepareContinue;
]]></sourcecode>
            <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
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt> with media
type "application/dap-aggregation-job-continue-req" and body structured as:</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint16 step;
  PrepareContinue prepare_continues<0..2^32-1>;
} AggregationJobContinueReq;
]]></sourcecode>
            <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 responds with HTTP status 202 Accepted with a body containing an
<tt>AggregationJobResp</tt> (see <xref target="aggregation-helper-init"/>). If the <tt>status</tt> field
is <tt>ready</tt>, the Leader proceeds onward. Otherwise, if the <tt>status</tt> field is
<tt>processing</tt>, the Leader polls the aggregation job by sending GET requests to
the URI indicated in the Location header field, until the <tt>status</tt> is
<tt>ready</tt>. The Helper's response when processing <bcp14>SHOULD</bcp14> include a Retry-After
header to suggest a polling interval to the Leader.</t>
            <t>The response's <tt>prepare_resps</tt> <bcp14>MUST</bcp14> 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>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>
                <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_continued(
    "dap-12" || task_id,
    agg_param,
    state,
    inbound,
)
]]></sourcecode>
                <t>
where <tt>task_id</tt> is the task ID and <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 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.</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>When the Leader stores the <tt>out_share</tt>, it <bcp14>MUST</bcp14> also store the report ID for
replay protection.</t>
          </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
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt> 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>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 sending the same response as it did for the previous
<tt>AggregationJobContinueReq</tt>, without performing any additional work on the
aggregation job. 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>Let <tt>inbound</tt> denote the payload of the prep step. For each report, the Helper
computes the following:</t>
            <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_helper_continued(
    "dap-12" || task_id,
    agg_param,
    state,
    inbound,
)
]]></sourcecode>
            <t>where <tt>task_id</tt> is the task ID. If <tt>state == Rejected()</tt>, then the Helper's
response is</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error = vdaf_prep_error;
} PrepareResp;
]]></sourcecode>
            <t>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"/>).</t>
            <t>If <tt>state == Finished(out_share)</tt>, the Helper <bcp14>MUST</bcp14> resolve replay of the
report. It does so by checking if the report ID was previously stored for this
task. If so, it responds with</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError report_replayed;
} PrepareResp;
]]></sourcecode>
            <t>Otherwise it stores the report ID for replay protection and <tt>out_share</tt> for use
in the collection interaction (<xref target="collect-flow"/>).</t>
            <t>The Helper's response depends on the value of <tt>outbound</tt>. If <tt>outbound !=
None</tt>, then the Helper's response is</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = continue;
  opaque payload<0..2^32-1> = outbound;
} PrepareResp;
]]></sourcecode>
            <t>Otherwise, if <tt>outbound == None</tt>, then the Helper's response is</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = finished;
} PrepareResp;
]]></sourcecode>
            <t>The Helper constructs an <tt>AggregationJobResp</tt> message (see
<xref target="aggregation-helper-init"/>) with each prep step. The order of the prep steps
<bcp14>MUST</bcp14> match the Leader's <tt>AggregationJobContinueReq</tt>.</t>
            <t>The Helper responds to the Leader with HTTP status 200 OK, a body consisting
of the <tt>AggregationJobResp</tt>, and the media type
"application/dap-aggregation-job-resp".</t>
            <t>Depending on the task parameters, processing an aggregation job may take some
time, so the Helper <bcp14>MAY</bcp14> defer computation to a background process by responding
with the field <tt>status</tt> set to <tt>processing</tt> and Location header field set to the
relative reference
<tt>/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}?step={step}</tt>, where
<tt>step</tt> is the step indicated in the <tt>AggregationJobContinueReq</tt>. If so, the
Leader polls the Helper by making HTTP GET requests to the aforementioned
Location. The Helper responds to GET requests with HTTP status 200 and the
<tt>status</tt> field reflecting the current state of the job. When the aggregation
job is <tt>processing</tt>, the response <bcp14>SHOULD</bcp14> include a Retry-After header field to
suggest a polling interval to the Leader.</t>
            <t>If for whatever reason the Leader must abandon the aggregation job, it <bcp14>SHOULD</bcp14>
send an HTTP DELETE request to
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt> 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 DAP
aggregation. 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>AggregationJobResp</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>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="batch-mode"/>), 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>
          <sourcecode type="tls-presentation"><![CDATA[
opaque CollectionJobID[16];
]]></sourcecode>
          <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-collection-job-req", and it is structured
as follows:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  Query query;
  opaque agg_param<0..2^32-1>; /* VDAF aggregation parameter */
} CollectionJobReq;
]]></sourcecode>
          <t>The named parameters are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>query</tt>, the Collector's query. The indicated batch mode <bcp14>MUST</bcp14> match the task's
batch mode. 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>CollectionJobReq</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
<tt>CollectionJobReq</tt> message, and the batch will have to be re-validated later on
regardless.</t>
          <t>Changing a collection job's parameters is illegal, so further requests to
<tt>PUT /tasks/{task-id}/collection_jobs/{collection-job-id}</tt> for the same
<tt>collection-job-id</tt> but with a different <tt>CollectionJobReq</tt> in the body <bcp14>MUST</bcp14>
fail with an HTTP client error status code.</t>
          <t>The Leader responds to <tt>CollectionJobReq</tt>s with a <tt>CollectionJobResp</tt>, which is
structured as follows:</t>
          <sourcecode type="tls-presentation"><![CDATA[
enum {
  processing(0),
  ready(1),
} CollectionJobStatus;

struct {
  PartialBatchSelector part_batch_selector;
  uint64 report_count;
  Interval interval;
  HpkeCiphertext leader_encrypted_agg_share;
  HpkeCiphertext helper_encrypted_agg_share;
} Collection;

struct {
  CollectionJobStatus status;
  select (CollectionJob.status) {
    case processing: Empty;
    case ready:      Collection;
  }
} CollectionJobResp;
]]></sourcecode>
          <t>The body's media type is "application/dap-collection-job-resp". 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 leader-selected tasks, this includes the batch ID assigned to the
batch by the Leader. The indicated batch mode <bcp14>MUST</bcp14> match the task's batch
mode.</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 time-interval query (see <xref target="batch-mode"/>), this interval can be smaller
than the one in the corresponding <tt>CollectionJobReq.query</tt>.</t>
            </li>
            <li>
              <t><tt>leader_encrypted_agg_share</tt>: The Leader's aggregate share, encrypted to the
Collector (see <xref target="aggregate-share-encrypt"/>).</t>
            </li>
            <li>
              <t><tt>helper_encrypted_agg_share</tt>: The Helper's aggregate share, encrypted to the
Collector (see <xref target="aggregate-share-encrypt"/>).</t>
            </li>
          </ul>
          <t>If the Leader finds the <tt>CollectionJobReq</tt> to be valid, it immediately responds
with HTTP status 201 Created with a body containing a <tt>CollectionJobResp</tt> with
the <tt>status</tt> field set to <tt>processing</tt>. The Leader <bcp14>SHOULD</bcp14> include a Retry-After
header field to suggest a polling interval to the Collector.</t>
          <t>After receiving the response to its <tt>CollectionJobReq</tt>, the Collector
periodically makes HTTP GET requests
<tt>/tasks/{task-id}/collection_jobs/{collection-job-id}</tt> to check on the status
of the collect job and eventually obtain the result. The Leader responds to GET
requests with HTTP status 200 and the <tt>status</tt> field reflecting the current
state of the job. When the collection job is <tt>processing</tt>, the response <bcp14>SHOULD</bcp14>
include a Retry-After header field to suggest a polling interval to the
Collector.</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>The Leader 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 with the <tt>status</tt> field set to <tt>ready</tt> and the
<tt>Collection</tt> field populated with the encrypted aggregate shares. The Collector
stops polling once receiving this final request.</t>
          <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>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  BatchMode batch_mode;
  select (BatchSelector.batch_mode) {
    case time_interval: Interval batch_interval;
    case leader_selected: BatchID batch_id;
  };
} BatchSelector;

struct {
  BatchSelector batch_selector;
  opaque agg_param<0..2^32-1>;
  uint64 report_count;
  opaque checksum[32];
} AggregateShareReq;
]]></sourcecode>
          <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 batch mode for
the task:  </t>
              <ul spacing="normal">
                <li>
                  <t>For time-interval tasks, the request specifies the batch interval.</t>
                </li>
                <li>
                  <t>For leader-selected tasks, the request specifies the batch ID.</t>
                </li>
              </ul>
              <t>
The indicated batch mode <bcp14>MUST</bcp14> match the task's batch mode. 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 CollectionJobReq
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>
          <sourcecode type="pseudocode"><![CDATA[
agg_share = Vdaf.aggregate(agg_param, out_shares)
]]></sourcecode>
          <t>Implementation note: For most VDAFs, including Prio3, it is possible to
aggregate output shares as they arrive rather than wait until the batch is
collected. For the batch modes specified in this document, 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>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  HpkeCiphertext encrypted_aggregate_share;
} AggregateShare;
]]></sourcecode>
          <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.</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>
          <sourcecode type="pseudocode"><![CDATA[
agg_result = Vdaf.unshard(agg_param,
                          [leader_agg_share, helper_agg_share],
                          report_count)
]]></sourcecode>
        </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>
          <sourcecode type="pseudocode"><![CDATA[
(enc, payload) = SealBase(
    pk,
    "dap-12 aggregate share" || server_role || 0x00,
    agg_share_aad,
    agg_share)
]]></sourcecode>
          <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>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  TaskID task_id;
  opaque agg_param<0..2^32-1>;
  BatchSelector batch_selector;
} AggregateShareAad;
]]></sourcecode>
          <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>
          <sourcecode type="pseudocode"><![CDATA[
agg_share = OpenBase(
    enc_share.enc,
    sk,
    "dap-12 aggregate share" || server_role || 0x00,
    agg_share_aad,
    enc_share.payload)
]]></sourcecode>
          <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 leader-selected tasks, the batch selector is the batch ID 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 batch mode. 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 batch mode. 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 with multiple
distinct aggregation parameters. If the batch has been queried with more than
one distinct aggregation parameter, the Aggregator <bcp14>MUST</bcp14> abort with error of type
"batchQueriedMultipleTimes".</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>
          <section anchor="time-interval-batch-validation">
            <name>Time-interval Batch Mode</name>
            <section anchor="boundary-check">
              <name>Boundary Check</name>
              <t>The batch boundaries are determined by the <tt>time_precision</tt> field of the task
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="leader-selected-batch-validation">
            <name>Leader-selected Batch Mode</name>
            <section anchor="boundary-check-1">
              <name>Boundary Check</name>
              <t>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; specifically, for
an <tt>AggregateShareReq</tt>, 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>
            </section>
            <section anchor="size-check-1">
              <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>
      </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
interaction.</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 interaction 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="agg-flow"/>. This requires storing the report IDs of all
reports processed for a given task. 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>
        </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 and storage required for a DAP
task:</t>
        <ul spacing="normal">
          <li>
            <t>The runtime of VDAF sharding and preparation is related to the "size" of the
underlying measurements. For example, the Prio3SumVec VDAF defined in
<xref section="7" sectionFormat="of" target="VDAF"/> requires each measurement to be a vector of the same
length, which all parties need to agree on prior to VDAF execution. The
computation required for such tasks increases linearly as a function of the
chosen length, as each vector element must be processed in turn.</t>
          </li>
          <li>
            <t>The runtime of VDAF preparation is related to the size of the aggregation
parameter. For example for Poplar1 defined in <xref section="8" sectionFormat="of" target="VDAF"/>,
preparation takes as input a sequence of so-called "candidate prefixes", and
the amount of computation is linear in the number of prefixes.</t>
          </li>
          <li>
            <t>The storage requirements for aggregate shares vary depending on the size of
the measurements and/or the aggregation parameter.</t>
          </li>
        </ul>
        <t>To account for these factors, care must be taken that a DAP deployment can
handle VDAF execution of all possible configurations for any tasks which the
deployment may be configured for. Otherwise, an attacker may deny service by
uploading many expensive reports to a suitably-configured VDAF.</t>
        <t>The varying cost of VDAF computation means that Aggregators should negotiate
reasonable limits for each VDAF configuration, out of band with the protocol.
For example, Aggregators may agree on a maximum size for an aggregation job or
on a maximum rate of incoming 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>
      </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 VDAF. 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 collection requests can be made for them. However, it is
not necessary to store the complete reports. Each Aggregator only needs to store
an aggregate share for each possible batch interval (for time-interval) or batch
ID (for leader-selected), along with a flag indicating whether the aggregate
share has been collected. This is due to the requirement that in the
time-interval case, the batch interval respect the boundaries defined by the DAP
parameters; and that in leader-selected case, a batch is determined entirely by
a batch ID. (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 anchor="distributed-systems">
          <name>Distributed-systems and Synchronization Concerns</name>
          <t>Various parts of a DAP implementation will need to synchronize in order to
ensure correctness during concurrent operation. This section describes the
relevant concerns and makes suggestions as to potential implementation
tradeoffs.</t>
          <ul spacing="normal">
            <li>
              <t>The upload interaction requires the Leader to ignore uploaded reports with a
duplicated ID, including concurrently-uploaded reports. This might be
implemented by synchronization or via an eventually-consistent process. If the
Leader wishes to alert the Client with a <tt>reportRejected</tt> error,
synchronization will be necessary to ensure all but one concurrent request
receive the error.</t>
            </li>
            <li>
              <t>The Leader is responsible for generating aggregation jobs, and will generally
want to place each report in exactly one aggregation job. (The only event in
which a Leader will want to place a report in multiple aggregation jobs is if
the Helper rejects the report with <tt>report_too_early</tt>, in which case the
Leader can place the report into a later aggregation job.) This may require
synchronization between different components of the system which are
generating aggregation jobs. Note that placing a report into more than one
aggregation job will result in a loss of throughput, rather than a loss of
correctness, privacy, or robustness, so it is acceptable for implementations
to use an eventually-consistent scheme which may rarely place a report into
multiple aggregation jobs.</t>
            </li>
            <li>
              <t>Aggregation is implemented as a sequence of aggregation steps by both the
Leader and the Helper. The Leader must ensure that each aggregation job is
only processed once concurrently, which may require synchronization between
the components responsible for performing aggregation. The Helper must ensure
that concurrent requests against the same aggregation job are handled
appropriately, which requires synchronization between the components handling
aggregation requests.</t>
            </li>
            <li>
              <t>Aggregation requires checking and updating used-report storage as part of
implementing replay protection. This must be done while processing the
aggregation job, though which steps the checks are performed at is up to the
implementation. The checks and storage require synchronization, so that if two
aggregation jobs contianing the same report are processed, at most one
instance of the report will be aggregated. However, the interaction with the
used-report storage does not necessarily have to be synchronized with the
processing and storage for the remainder of the aggregation process. For
example, used-report storage could be implemented in a separate datastore than
is used for the remainder of data storage, without any transactionality
between updates to the two datastores.</t>
            </li>
            <li>
              <t>The aggregation and collection interactions require synchronization to avoid
modifying the aggregate of a batch after it has already been collected. Any
reports being aggregated which pertain to a batch which has already been
collected must fail with a <tt>batch_collected</tt> error; correctly determining this
requires synchronizing aggregation with the completion of collection jobs (for
the Leader) or aggregate share requests (for the Helper). Also, the Leader
must complete all outstanding aggregation jobs for a batch before requesting
aggregate shares from the Helper, again requiring synchronization between the
Leader's collection and aggregation interactions. Further, the Helper must
determine the aggregated report count and checksum of aggregated report IDs
before responding to an aggregate share request, requiring synchronization
between the Helper's collection and aggregation interactions.</t>
            </li>
          </ul>
        </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>Some VDAFs could leak information to either Aggregator or the Collector
beyond what the protocol intended to learn. It may be possible to mitigate
such leakages 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>Some mechanisms for differential privacy (<xref target="dp"/>) can help mitigate Sybil
attacks against privacy to some extent.</t>
          </li>
        </ol>
      </section>
      <section anchor="batch-selection">
        <name>Batch-selection Attacks</name>
        <t>Depending on the batch mode, the privacy of an individual Client may be
infringed upon by selection of the batch. For example, in the leader-selected
batch mode, the Leader is free to select the reports that compose a given batch
almost arbitrarily; a malicious Leader might choose a batch composed of reports
arriving from a single client. The aggregate derived from this batch might then
reveal information about that Client.</t>
        <t>The mitigations for this attack are similar to those used for Sybil attacks
(<xref target="sybil"/>):</t>
        <ol spacing="normal" type="1"><li>
            <t>Implementing Client authentication, as described in <xref target="client-auth"/>, and
having each aggregator verify that each batch contains reports from a
suitable number of distinct clients.</t>
          </li>
          <li>
            <t>Disassociating each report from the Client which generated it, via the use of
anonymizing proxies (<xref target="anon-proxy"/>) or similar techniques.</t>
          </li>
          <li>
            <t>Differential privacy (<xref target="dp"/>) can help mitigate the impact of this attack.</t>
          </li>
          <li>
            <t>Deployment-specific mitigations may also be possible: for example, if every
Client is sending reports at a given rate, it may be possible for aggregators
to bound the accepted age of reports such that the number of aggregatable
reports from a given Client is small enough to effectively mitigate this
attack.</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>
          <sourcecode type="pseudocode"><![CDATA[
verify_key = HKDF-Expand(
    HKDF-Extract(
        "verify_key",    # salt
        verify_key_seed, # IKM
    ),
    task_id,             # info
    VERIFY_KEY_SIZE,     # L
)
]]></sourcecode>
          <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 collection, 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>
        </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>CollectionJobReq <xref target="collect-flow"/>: "application/dap-collection-job-req"</t>
          </li>
          <li>
            <t>CollectionJobResp <xref target="collect-flow"/>: "application/dap-collection-job-resp"</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 (RFC EDITOR: change "shall update" to "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>
        <ul empty="true">
          <li>
            <t>TODO Solicit review of these allocations from domain experts.</t>
          </li>
        </ul>
        <section anchor="message-versioning">
          <name>Message versioning</name>
          <t>Media types for the HTTP requests are specific to this version of DAP. When a
new major enhancement is proposed that results in newer IETF specification
for DAP, a new set of media types need to be defined. In other words, newer
versions of DAP will not be backward compatible with this version of DAP.</t>
          <t>(NOTE TO RFC EDITOR: Remove this paragraph.) HTTP requests with DAP media types
<bcp14>MAY</bcp14> express an optional parameter 'version', following <xref section="8.3" sectionFormat="of" target="RFC9110"/>.
Value of this parameter indicates current draft version of the protocol the
component is using. This <bcp14>MAY</bcp14> be used as a hint by the receiver of the request
to do compatibility checks between client and server.
For example, A report submission to leader from a client that supports
draft-ietf-ppm-dap-09 could have the header
<tt>Media-Type: application/dap-report;version=09</tt>.</t>
        </section>
        <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-collection-job-req-media-type">
          <name>"application/dap-collection-job-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-collection-job-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-job-resp-media-type">
          <name>"application/dap-collection-job-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-collection-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>
      <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="batch-mode-reg">
          <name>Batch Modes Registry</name>
          <t>This document requests creation of a new registry for Batch Modes. This registry
should contain the following columns:</t>
          <ul empty="true">
            <li>
              <t>TODO Define how we want to structure this registry.</t>
            </li>
          </ul>
        </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
interaction (<xref target="upload-flow"/>). This registry should contain the following
columns:</t>
          <ul empty="true">
            <li>
              <t>TODO Define how we want to structure this registry.</t>
            </li>
          </ul>
        </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 (RFC EDITOR: change "will be" to "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>
  </middle>
  <back>
    <references anchor="sec-combined-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="4" month="October" year="2024"/>
            <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-12"/>
        </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="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="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>
              <organization/>
            </author>
            <date year="2015"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.180-4"/>
          <refcontent>National Institute of Standards and Technology (U.S.)</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="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>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="J." surname="Aas" fullname="Josh Aas">
        <organization>ISRG</organization>
        <address>
          <email>josh@abetterinternet.org</email>
        </address>
      </contact>
      <contact initials="J." surname="Chen" fullname="Junye Chen">
        <organization>Apple</organization>
        <address>
          <email>junyec@apple.com</email>
        </address>
      </contact>
      <contact initials="D." surname="Cook" fullname="David Cook">
        <organization>ISRG</organization>
        <address>
          <email>dcook@divviup.org</email>
        </address>
      </contact>
      <contact initials="S." surname="Ganta" fullname="Suman Ganta">
        <organization>Apple</organization>
        <address>
          <email>sganta2@apple.com</email>
        </address>
      </contact>
      <contact initials="A." surname="Ghani" fullname="Ameer Ghani">
        <organization>ISRG</organization>
        <address>
          <email>inahga@divviup.org</email>
        </address>
      </contact>
      <contact initials="K." surname="Guo" fullname="Kristine Guo">
        <organization>Apple</organization>
        <address>
          <email>kristine_guo@apple.com</email>
        </address>
      </contact>
      <contact initials="C." surname="Harrison" fullname="Charlie Harrison">
        <organization>Google</organization>
        <address>
          <email>csharrison@chromium.org</email>
        </address>
      </contact>
      <contact initials="P." surname="Saint-Andre" fullname="Peter Saint-Andre">
        <organization/>
        <address>
          <email>stpeter@gmail.com</email>
        </address>
      </contact>
      <contact initials="S." surname="Sahib" fullname="Shivan Sahib">
        <organization>Brave</organization>
        <address>
          <email>shivankaulsahib@gmail.com</email>
        </address>
      </contact>
      <contact initials="P." surname="Schoppmann" fullname="Phillipp Schoppmann">
        <organization>Google</organization>
        <address>
          <email>schoppmann@google.com</email>
        </address>
      </contact>
      <contact initials="M." surname="Thomson" fullname="Martin Thomson">
        <organization>Mozilla</organization>
        <address>
          <email>mt@mozilla.com</email>
        </address>
      </contact>
      <contact initials="S." surname="Wang" fullname="Shan Wang">
        <organization>Apple</organization>
        <address>
          <email>shan_wang@apple.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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
QmFFsCcCAA==

-->

</rfc>
