<?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-13" 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-13"/>
    <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="November" day="03"/>
    <abstract>
      <?line 126?>

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

<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
aggregation servers. The aggregators' goal is to compute some aggregate
statistic over measurements generated by clients without learning the
measurements 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 measurement is ever seen in the clear by any
aggregator.</t>
      <section anchor="change-log">
        <name>Change Log</name>
        <t>(RFC EDITOR: Remove this section.)</t>
        <t>(*) Indicates a change that breaks wire compatibility with the previous draft.</t>
        <t>13:</t>
        <ul spacing="normal">
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-12 to 13 <xref target="VDAF"/> and adopt the streaming
aggregation interface. Accordingly, clarify that DAP is only compatible with
VDAFs for which aggregation is order insensitive.</t>
          </li>
          <li>
            <t>Add public extensions to report metadata. (*)</t>
          </li>
          <li>
            <t>Improve extension points for batch modes. (*)</t>
          </li>
          <li>
            <t>During the upload interaction, allow the Leader to indicate to the Client which
set of report extensions it doesn't support.</t>
          </li>
          <li>
            <t>Add a start time to task parameters and require rejection of reports outside
of the time validity window. Incidentally, replace the task end time with a
task duration parameter.</t>
          </li>
          <li>
            <t>Clarify underspecified behavior around aggregation skew recovery.</t>
          </li>
          <li>
            <t>Improve IANA considerations and add guidelines for extending DAP.</t>
          </li>
          <li>
            <t>Rename "upload extension" to "report extension", and "prepare error" to
"report error", to better align the names of these types with their
functionality.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-12" to "dap-13". (*)</t>
          </li>
        </ul>
        <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. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Aggregate share:</dt>
            <dd>
              <t>A secret share of the aggregate result computed by each Aggregator and
transmitted to the Collector. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Aggregation function:</dt>
            <dd>
              <t>The function computed over the measurements generated by the Clients and the
aggregation parameter selected by the Collector. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Aggregation parameter:</dt>
            <dd>
              <t>Parameter selected by the Collector used to prepare a batch of measurements
for aggregation. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Aggregator:</dt>
            <dd>
              <t>A server that receives report shares from Clients and validates and aggregates
them with the help of the other Aggregator. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Batch:</dt>
            <dd>
              <t>A set of reports (i.e., measurements) that are aggregated into an aggregate
result. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Batch bucket:</dt>
            <dd>
              <t>State associated with a given batch allowing the aggregators to perform
incremental aggregation. Depending on the batch mode, there may be many batch
buckets tracking the state of a single batch.</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 generates a measurement and
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 computes the aggregate
result.</t>
            </dd>
            <dt>Helper:</dt>
            <dd>
              <t>The Aggregator that executes the aggregation and collection interactions
initiated 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 VDAF preparation. Many output shares are combined into an
aggregate share during VDAF aggregation. 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 that must be aggregated before a batch can be
collected.</t>
            </dd>
            <dt>Public share:</dt>
            <dd>
              <t>The output of the VDAF sharding algorithm transmitted 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.
Includes a pair of report shares, one for each Aggregator.</t>
            </dd>
            <dt>Report share:</dt>
            <dd>
              <t>An input share encrypted under the HPKE public key of an Aggregator <xref target="HPKE"/>.
The report share also includes some associated data used for processing the
report.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="representation-language">
        <name>Representation Language</name>
        <t>With some exceptions, we use the presentation language defined in <xref section="3" sectionFormat="comma" target="RFC8446"/> to define messages in the DAP protocol. Encoding and decoding of
these messages as byte strings also follows <xref target="RFC8446"/>. We enumerate the
exceptions below.</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 as follows:</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 the <tt>type</tt> field.
This does not mean that the <tt>type</tt> field of <tt>ExampleStruct</tt> can only ever have
value <tt>number</tt>; it means only that it has this type in this instance.</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>Finally, by convention we do not specify the lower length limit of
variable-length vectors. Rather, the lower limit is always set to <tt>0</tt>.</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>meas_1, ..., meas_N</tt> held by the Clients, and an
"aggregation parameter" <tt>agg_param</tt> shared by the Aggregators, the goal of DAP
is to compute <tt>agg_result = F(agg_param, meas_1, ..., meas_N)</tt> for some
function <tt>F</tt> while revealing nothing else about the measurements. We call <tt>F</tt>
the "aggregation function" and <tt>agg_result</tt> the "aggregate result".</t>
      <t>DAP is extensible in that it allows for the addition of new cryptographic
schemes that compute different aggregation functions. In particular, the
aggregation function is determined by the Verifiable Distributed Aggregation
Function, or VDAF <xref target="VDAF"/>, used to securely
compute it.</t>
      <t>VDAFs rely on secret sharing to protect the privacy of the measurements. Rather
than sending its measurement 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 scheme has 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>Aggregators can compute secret shares of the aggregate result by aggregating
their shares locally into "aggregate shares", which may later be combined
into the aggregate result.</t>
        </li>
      </ul>
      <t>Note that some VDAFs allow measurements to be aggregated multiple times, each
time with a different aggregation parameter; however, DAP only allows each
measurement to be aggregated once. Similarly, some VDAFs produce aggregate
values which depend on the order in which the measurementas are aggregated;
however, DAP only supports VDAFs whose aggregation results are independent of
the order in which measurements are aggregated (see <xref section="4.4.1" sectionFormat="of" target="VDAF"/>).</t>
      <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>DAP architecture (who sends requests to whom).</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 party which wants to obtain the aggregate result for the measurements
generated by the Clients. Any given measurement task will have a single
Collector.</t>
          </dd>
          <dt>Clients:</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>Leader:</dt>
          <dd>
            <t>The Aggregator responsible for coordinating the protocol. It receives the
reports from Clients and aggregates them with the assistance of the Helper; and
it 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, non-overlapping batches of
measurements). The definition of a task includes the following parameters:</t>
        <ul spacing="normal">
          <li>
            <t>The VDAF which determines the type of measurements and the aggregation
function (e.g., mean, standard deviation, etc.).</t>
          </li>
          <li>
            <t>The identities of the Leader and Helper. These are URLs that implement the
APIs for uploading, aggregation, and collection specified in <xref target="protocol"/>.</t>
          </li>
          <li>
            <t>Cryptographic assets involved in the computation (i.e., key material).</t>
          </li>
          <li>
            <t>Various parameters used to determine how reports are partitioned into batches
and the size of each batch.</t>
          </li>
        </ul>
        <t>These parameters are distributed to the Clients, Aggregators, and Collector
before the task begins. (Note that not all parameters are distributed to all
parties.) 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 is uploaded, or it may be necessary to
wait until the Collector transmits a collection request before processing can
begin.</t>
      </section>
      <section anchor="validating-inputs">
        <name>Validating Measurements</name>
        <t>An essential task of any data collection pipeline is ensuring that the data
being aggregated is "valid". For example, if each measurement is expected to be
an number between <tt>0</tt> and <tt>10</tt>, then the aggregator should reject measurements
larger than <tt>10</tt> or smaller than <tt>0</tt>. 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. To an Aggregator, a secret share of a valid
measurement is indistinguishable from a secret share of an invalid measurement.</t>
        <t>In DAP, input validation is accomplished by an interactive computation between
the Leader and Helper. 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 the underlying data is invalid,
in which case the report is rejected.</t>
        <t>This process is known as "preparation" and is specified by the VDAF itself
(<xref section="5.2" sectionFormat="of" target="VDAF"/>). To facilitate preparation, the report generated by
the Client include information used by the Aggregators. For example, Prio3
(<xref section="7" sectionFormat="of" target="VDAF"/>) includes a zero-knowledge proof of the measurement's
validity (<xref section="7.1" sectionFormat="of" target="VDAF"/>); the process of verifying this proof
reveals nothing about the underlying measurement beyond its validity.</t>
        <t>The specific properties attested to by 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., between <tt>0</tt> and <tt>60</tt> 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 <tt>30</tt> seconds on a task but the Client
might report <tt>60</tt> seconds. 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 <tt>10^6</tt>  or <tt>-20</tt> seconds.</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 (e.g., 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:</t>
        <table anchor="urn-space-errors">
          <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>
            <tr>
              <td align="left">unsupportedExtension</td>
              <td align="left">An upload request's extensions list includes an unknown extension.</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">
      <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>An aggregate result is computed from a set of reports, called a "batch". The
Collector requests the aggregate result by making a "query"; the Aggregators
use this query to select a batch for aggregation.</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 two batch modes:</t>
        <ul spacing="normal">
          <li>
            <t>time-interval (<xref target="time-interval-batch-mode"/>) in which the query specifies a
time interval, and the batch consists of all reports with a timestamp in that
interval.</t>
          </li>
          <li>
            <t>leader-selected (<xref target="leader-selected-batch-mode"/>) in which the Leader assigns
reports to batches itself, and the Collector's query simply requests the
aggregate result for the "next" batch of reports.</t>
          </li>
        </ul>
        <t>Future documents may define additional batch modes for DAP; see
<xref target="extending-this-doc"/>. Implementations are free to implement only a subset of
the available batch modes.</t>
        <t>Batch modes are identified with a single byte in serialized messages, as
follows:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0),
  (255)
} BatchMode;
]]></sourcecode>
        <t>The query is issued to the Leader by the Collector during the collection
interaction (<xref target="collect-flow"/>). In addition, information used to guide batch
selection is conveyed from the Leader to the Helper when initializing
aggregation (<xref target="aggregate-flow"/>) and finalizing the aggregate shares.</t>
      </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_start</tt>: The time from which the Clients will start uploading reports to
a task. Aggregators <bcp14>MUST</bcp14> reject reports with timestamps earlier than
<tt>task_start</tt>.</t>
          </li>
          <li>
            <t><tt>task_duration</tt>: The duration of a task. The task is considered completed
after the end time <tt>task_start + task_duration</tt>. Aggregators <bcp14>MUST</bcp14> reject
reports that have timestamps later than the end time, and <bcp14>MAY</bcp14> choose to opt
out of the task if <tt>task_duration</tt> is too long.</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>
          <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>
          <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>
        </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;
  Extension public_extensions<0..2^16-1>;
} 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>
                <li>
                  <t><tt>public_extensions</tt> is the list of public report extensions; see
<xref target="report-extensions"/>.</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-13" || 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 private_extensions<0..2^16-1>;
  opaque payload<0..2^32-1>;
} PlaintextInputShare;
]]></sourcecode>
          <t>Field <tt>private_extensions</tt> is set to the list of private report extensions
intended to be consumed by the given Aggregator. (See <xref target="report-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-13 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>MUST</bcp14> ignore any report whose timestamp is before the task's
<tt>task_start</tt>, or is past the end time <tt>task_start + task_duration</tt>. When it does
so, it <bcp14>SHOULD</bcp14> also abort the upload interaction and alert the Client with error
<tt>reportRejected</tt>. Clients <bcp14>MUST NOT</bcp14> upload a report if its timestamp would be
earlier than <tt>task_start</tt> or later than <tt>task_start + task_duration</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 report contains an unrecognized public report extension, or if the
Leader's input share contains an unrecognized private report extension, then the
Leader <bcp14>MAY</bcp14> abort the upload request with error "unsupportedExtension." If the
Leader does abort for this reason, it <bcp14>MAY</bcp14> indicate the unsupported extensions in
the resulting problem document via an extension member (<xref section="3.2" sectionFormat="of" target="RFC9457"/>) "unsupported_extensions" on the problem document; this member <bcp14>MUST</bcp14>
contain an array of numeric values indicating the extension code points which
were not recognized. For example, if the report upload contained two unsupported
extensions with code points <tt>23</tt> and <tt>42</tt>, the "unsupported_extensions" member
would contain the value <tt>[23, 42]</tt>.</t>
          <t>If the same extension type appears more than once among the public extensions
and the private extensions in the Leader's input share, then the Leader <bcp14>MAY</bcp14>
abort the upload request with error "invalidMessage".</t>
          <t>(Note that validation of extensions is not mandatory here because it requires
the Leader to decrypt its input share. The Leader also cannot validate the
Helper's extensions because it cannot decrypt the Helper's input share.
Mandatory validation of extensions will occur during aggregation.)</t>
        </section>
        <section anchor="report-extensions">
          <name>Report Extensions</name>
          <t>Each <tt>ReportMetadata</tt> contains a list of extensions public to both aggregators,
and each <tt>PlaintextInputShare</tt> contains a list of extensions private to the
relevant Aggregator. Clients use these extensions to convey additional
information to the Aggregators. 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 {
  reserved(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, aggregation cannot begin until the Collector specifies a query and
an aggregation parameter. However, depending on the VDAF and batch mode in use,
it is often possible to begin aggregation as soon as reports arrive. For
example, Prio3 has just one valid aggregation parameter (the empty string), and
thus allows for eager aggregation; and both the time-interval
(<xref target="time-interval-batch-mode"/>) and leader-selected
(<xref target="leader-selected-batch-mode"/>) batch modes defined in this document allow for
eager aggregation.</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, and update the
appropriate aggregate shares with these output shares.</t>
          </li>
        </ul>
        <t>After an aggregation job is completed, each Aggregator updates running-total
aggregate shares and other values for each "batch bucket" associated with a
recovered output share, as described in <xref target="batch-buckets"/>. These values are
stored until the batch is collected as described in <xref target="collect-flow"/>.</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-13" || 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 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;
  opaque config<0..2^16-1>;
} 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. Its contents depends on the
indicated batch mode: for time-interval mode, the <tt>config</tt> field is empty
(<xref target="time-interval-batch-mode"/>); for leader-selected tasks, the Leader
specifies a "batch ID" that determines the batch to which each report for
this aggregation job belongs (<xref target="leader-selected-batch-mode"/>).  </t>
                <t>
Documents that define batch modes <bcp14>MUST</bcp14> specify the content this field; see
<xref target="extending-this-doc"/> for details.  </t>
                <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-13" || 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 updates the relevant batch bucket with <tt>out_share</tt> as described in
<xref target="batch-buckets"/>.</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 updates a batch bucket based on <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>
            <t>If the Leader fails to process the response from the Helper, for example because
of a transient failure such as a network connection failure or process crash,
the Leader <bcp14>SHOULD</bcp14> re-send the original request unmodified in order to attempt
recovery (see <xref target="aggregation-step-skew-recovery"/>).</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),
  task_not_started(10),
  (255)
} ReportError;

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:   ReportError report_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;
  ReportError report_error = 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;
  ReportError report_error;
} PrepareResp;
]]></sourcecode>
            <t>where <tt>report_id</tt> is the report ID and <tt>report_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-13" || 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;
  ReportError report_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;
  Reporterror report_error = report_replayed;
} PrepareResp;
]]></sourcecode>
            <t>Otherwise it stores the report ID for replay protection and updates the relevant
batch bucket with <tt>out_share</tt> as described in <xref target="batch-buckets"/>.</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,
timestamp, and public extensions), 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-13 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 report error.</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 is before the task's <tt>task_start</tt> time. If
so, the Aggregator <bcp14>MUST</bcp14> mark the input share as invalid with the error
<tt>task_not_started</tt>.</t>
              </li>
              <li>
                <t>Check if the report's timestamp is past the task's end time, given by
<tt>task_start + task_duration</tt>. If so, the Aggregator <bcp14>MUST</bcp14> mark the input
share as invalid with the error <tt>task_expired</tt>.</t>
              </li>
              <li>
                <t>Check if the public or private report extensions contain any unrecognized
report extension types. 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 any two public or private report extensions have the same extension
type. (For the purposes of this check, a private report extension can
conflict with a public report extension.) 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-13" || 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 updates the relevant batch bucket with <tt>out_share</tt> as described in
<xref target="batch-buckets"/>.</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>
            <t>If the Leader fails to process the response from the Helper, for example because
of a transient failure such as a network connection failure or process crash,
the Leader <bcp14>SHOULD</bcp14> re-send the original request unmodified in order to attempt
recovery (see <xref target="aggregation-step-skew-recovery"/>).</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 or if
the Helper does not wish to attempt recovery, 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-13" || 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;
  ReportError report_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;
  ReportError report_error = report_replayed;
} PrepareResp;
]]></sourcecode>
            <t>Otherwise it stores the report ID for replay protection and updates the relevant
batch bucket with <tt>out_share</tt> as described in <xref target="batch-buckets"/>.</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="batch-buckets">
            <name>Batch Buckets</name>
            <t>When aggregation recovers an output share, it must be stored into an appropriate
"batch bucket", which is defined in this section. The data stored in a batch
bucket is kept for eventual use in the <xref target="collect-flow"/>.</t>
            <t>Batch buckets are indexed by a "batch bucket identifier" as as specified by the
task's batch mode:</t>
            <ul spacing="normal">
              <li>
                <t>For the time-interval batch mode (<xref target="time-interval-batch-mode"/>, the batch
bucket identifier is an interval of time and is determined by the report's timestamp.</t>
              </li>
              <li>
                <t>For the leader-selected batch mode (<xref target="leader-selected-batch-mode"/>), the
batch bucket identifier is the batch ID and indicated in the aggregation job.</t>
              </li>
            </ul>
            <t>A few different pieces of information are associated with each batch bucket:</t>
            <ul spacing="normal">
              <li>
                <t>A VDAF-specific aggregate share, as defined in <xref target="VDAF"/>.</t>
              </li>
              <li>
                <t>A count of a number of reports included in the batch bucket.</t>
              </li>
              <li>
                <t>A 32-byte checksum value, as defined below.</t>
              </li>
            </ul>
            <t>When processing an output share <tt>out_share</tt>, the following procedure is used to
update the batch buckets:</t>
            <ul spacing="normal">
              <li>
                <t>Look up the existing batch bucket for the batch bucket identifier
associated with the aggregation job and output share.
                </t>
                <ul spacing="normal">
                  <li>
                    <t>If there is no existing batch bucket, initialize a new one. The initial
aggregate share value is computed as <tt>Vdaf.agg_init(agg_param)</tt>, where
<tt>agg_param</tt> is the aggregation parameter associated with the aggregation job
(see <xref section="4.4" sectionFormat="comma" target="VDAF"/>); the initial count is <tt>0</tt>; and the initial
checksum is 32 zero bytes.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Update the aggregate share <tt>agg_share</tt> to <tt>Vdaf.agg_update(agg_param,
agg_share, out_share)</tt>.</t>
              </li>
              <li>
                <t>Increment the count by 1.</t>
              </li>
              <li>
                <t>Update the checksum value to the bitwise-XOR of the checksum value with the
SHA256 <xref target="SHS"/> hash of the report ID associated
with the output share.</t>
              </li>
            </ul>
            <t>Implementation note: this section describes a single set of values associated
with each batch bucket. However, implementations are free to shard the aggregate
share/count/checksum values associated with the batch bucket, combining them
back into a single set of values when reading the batch bucket. This may be
useful to avoid write contention. The aggregate share values are combined using
<tt>Vdaf.merge(agg_param, agg_shares)</tt> (see <xref section="4.4" sectionFormat="comma" target="VDAF"/>), the count
values are combined by summing, and the checksum values are combined by bitwise
XOR.</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 {
  BatchMode batch_mode;
  opaque config<0..2^16-1>;
} Query;

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 content of this field depends on the
indicated batch mode: for time-interval mode, the <tt>config</tt> field contains the
requested time interval (<xref target="time-interval-batch-mode"/>); for leader-selected
mode, the <tt>config</tt> field is empty, and the Collector gets the aggregate
result for the next batch selected by the Leader
(<xref target="leader-selected-batch-mode"/>).  </t>
              <t>
Batch modes defined by future documents <bcp14>MUST</bcp14> specify the content of this field;
see <xref target="extending-this-doc"/> for details.  </t>
              <t>
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. If aggregation is performed eagerly, the Leader <bcp14>MUST</bcp14>
validate that the aggregation parameter received in the <tt>CollectionJobReq</tt>
matches the aggregation parameter used in aggregations.</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 (<xref target="time-interval-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 compute its own aggregate share, as well as obtaining the
Helper's encrypted aggregate share, before it can complete a collection job.</t>
          <t>First, the Leader retrieves all batch buckets (<xref target="batch-buckets"/>) associated
with this collection job. The batch buckets to retrieve depend on the batch mode
of this task:</t>
          <ul spacing="normal">
            <li>
              <t>For time-interval (<xref target="time-interval-batch-mode"/>), this is all batch buckets
whose batch bucket identifiers are contained within the batch interval
specified in the <tt>CollectionJobReq</tt>'s query.</t>
            </li>
            <li>
              <t>For leader-selected (<xref target="leader-selected-batch-mode"/>), this is the batch
bucket associated with the batch ID the Leader has chosen for this collection
job.</t>
            </li>
          </ul>
          <t>The Leader then combines the values inside the batch bucket as follows:</t>
          <ul spacing="normal">
            <li>
              <t>Aggregate shares are combined via <tt>Vdaf.merge(agg_param, agg_shares)</tt> ((see
<xref section="4.4" sectionFormat="comma" target="VDAF"/>)), where <tt>agg_param</tt> is the aggregation parameter
provided in the <tt>CollectionJobReq</tt>, and <tt>agg_shares</tt> are the (partial)
aggregate shares in the batch buckets. The result is the final aggregate share
for this collection job.</t>
            </li>
            <li>
              <t>Report counts are combined via summing.</t>
            </li>
            <li>
              <t>Checksums are combined via bitwise XOR.</t>
            </li>
          </ul>
          <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;
  opaque config<0..2^16-1>;
} 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", the contents of which depends on the
indicated batch mode: for time-interval mode, the <tt>config</tt> field contains the
time interval selected by the Collector (<xref target="time-interval-batch-mode"/>); in
leader-selected mode, the field contains the batch ID selected by the Leader
(<xref target="leader-selected-batch-mode"/>).  </t>
              <t>
Future documents that new batch modes <bcp14>MUST</bcp14> specify the contents of the
<tt>config</tt> field; see <xref target="extending-this-doc"/> for details.  </t>
              <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 <tt>AggregationJobInitReq</tt> 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, as
computed above.</t>
            </li>
            <li>
              <t><tt>checksum</tt>: The batch checksum, as computed above.</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"/>. The Helper <bcp14>MUST</bcp14> validate that the aggregation parameter
matches the aggregation parameter used during aggregation of this batch;
otherwise, it aborts with "invalidMessage".</t>
          <t>Next, the Helper retrieves and combines the batch buckets associated with the
request using the same process used by the Leader (as described at the beginning
of this section <xref target="collect-aggregate"/>), arriving at its final aggregate share,
report count, and checksum values. If the Helper's computed report count and
checksum values do not match the values provided in the <tt>AggregateShareReq</tt>, it
<bcp14>MUST</bcp14> abort with an error of type "batchMismatch".</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 <tt>AggregateShareReq</tt> 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 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-13 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-13 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 determined by the batch mode.</t>
          <ul spacing="normal">
            <li>
              <t>For time-interval (<xref target="time-interval-batch-mode"/>), the batch selector is the
batch interval specified in the query.</t>
            </li>
            <li>
              <t>For leader-selected (<xref target="leader-selected-batch-mode"/>), 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>When the Leader receives a <tt>Query</tt> in the request from the Collector during
collection initialization (<xref target="collect-init"/>), it must first check that the
batch determined by the query can be collected. It does so as described here.
The Helper performs the same check when it receives a <tt>BatchSelector</tt> in the
request from the Leader for its aggregate share (<xref target="collect-aggregate"/>).</t>
          <t>First, the Aggregator checks if the request (the <tt>CollectionJobReq</tt> for the
Leader and the <tt>AggregateShareReq</tt> for the Helper) identifies a valid set of
batch buckets (<xref target="batch-buckets"/>). If not, it <bcp14>MUST</bcp14> abort the request with
"batchInvalid".</t>
          <t>Next, the Aggregator checks that batch contains a valid number of reports. 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 and <tt>min_batch_size</tt> is the
minimum batch size for the task. If this 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>Next, the Aggregator checks if the set of batch buckets identified by the
request overlaps with the batch buckets that have already been collected. If
so, it <bcp14>MUST</bcp14> abort with "batchOverlap".</t>
          <t>Finally, the batch mode may define additional batch validation rules.</t>
        </section>
      </section>
    </section>
    <section anchor="batch-modes">
      <name>Batch Modes</name>
      <t>This section defines an initial set of batch modes for DAP. New batch modes may
be defined by future documents following the guidelines in
<xref target="extending-this-doc"/>.</t>
      <t>Each batch mode specifies the following:</t>
      <ol spacing="normal" type="1"><li>
          <t>The value of the <tt>config</tt> field of <tt>Query</tt>, <tt>PartialBatchSelector</tt>, and
<tt>BatchSelector</tt></t>
        </li>
        <li>
          <t>Batch buckets (<xref target="batch-buckets"/>): how reports are assigned to batch
buckets; how each bucket is identified; and how batch buckets are mapped to
batches and how batch buckets</t>
        </li>
      </ol>
      <section anchor="time-interval-batch-mode">
        <name>Time Interval</name>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  time_interval(1),
  (255)
} BatchMode;
]]></sourcecode>
        <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 anchor="query-configuration">
          <name>Query Configuration</name>
          <t>The payload of <tt>Query.config</tt> is</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  Interval batch_interval;
} TimeIntervalQueryConfig;
]]></sourcecode>
          <t>where <tt>batch_interval</tt> is the batch interval requested by the Collector.</t>
        </section>
        <section anchor="partial-batch-selector-configuration">
          <name>Partial Batch Selector Configuration</name>
          <t>The payload of <tt>PartialBatchSelector.config</tt> is empty.</t>
        </section>
        <section anchor="batch-selector-configuration">
          <name>Batch Selector Configuration</name>
          <t>The payload of <tt>BatchSelector.config</tt> is</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  Interval batch_interval;
} TimeIntervalBatchSelectorConfig;
]]></sourcecode>
          <t>where <tt>batch_interval</tt> is the batch interval requested by the Collector.</t>
        </section>
        <section anchor="time-interval-batch-buckets">
          <name>Batch Buckets</name>
          <t>Each batch bucket is identified by an interval of time whose beginning is a
multiple of the task's <tt>time_precision</tt> and whose duration is equal to the
task's <tt>time_precision</tt>. The identifier associated with a given report is the
unique such interval containing the timestamp of the report; for example, if
the task's <tt>time_precision</tt> is 1000 seconds and the report's timestamp is
1729629081, the relevant batch bucket identifier is <tt>(1729629000, 1000)</tt>. The
first element of the pair denotes the start of the batch interval and the
second denotes the duration.</t>
          <t>The <tt>Query</tt> received by the Leader determines a valid set of batch bucket
identifiers if the following conditions hold (likewise for the <tt>BatchSelector</tt>
received by the Helper):</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>A batch consists of a sequence of contiguous batch buckets. That is, the set of
batch buckets identifiers for the batch interval is
<tt>(batch_interval.start,
  batch_interval.start + time_precision)</tt>,
<tt>(batch_interval.start + time_precision,
  batch_interval.start + 2*time_precision)</tt>, ...,
<tt>(batch_interval.start + batch_interval.duration - time_precision) +
  batch_interval.start + batch_interval.duration)</tt>.</t>
        </section>
      </section>
      <section anchor="leader-selected-batch-mode">
        <name>Leader-selected Batch Mode</name>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  leader_selected(2),
  (255)
} BatchMode;
]]></sourcecode>
        <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 anchor="query-configuration-1">
          <name>Query Configuration</name>
          <t>They payload of <tt>Query.config</tt> is empty; the request merely indicates the
Collector would like the next batch selected by the Leader.</t>
        </section>
        <section anchor="partial-batch-selector-configuration-1">
          <name>Partial Batch Selector Configuration</name>
          <t>The payload of <tt>PartialBatchSelector.config</tt> is:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  BatchID batch_id;
} LeaderSelectedPartialBatchSelectorConfig;
]]></sourcecode>
          <t>where <tt>batch_id</tt> is the batch ID selected by the Leader.</t>
        </section>
        <section anchor="batch-selector-configuration-1">
          <name>Batch Selector Configuration</name>
          <t>The payload of <tt>BatchSelector.config</tt> is:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  BatchID batch_id;
} LeaderSelectedBatchSelectorConfig;
]]></sourcecode>
          <t>where <tt>batch_id</tt> is the batch ID selected by the Leader.</t>
        </section>
        <section anchor="leader-selected-batch-buckets">
          <name>Batch Buckets</name>
          <t>Each batch consists of a single bucket and is identified by the batch ID
selected by the Leader. A report is assigned to the batch indicated by the
<tt>PartialBatchSelector</tt> during aggregation.</t>
        </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 end time <tt>task_start + task_duration</tt>.
Aggregator <bcp14>MAY</bcp14> delete the task and all data pertaining to this task after the
end time. 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="report-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 a report 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
report extensions <xref target="report-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">
      <name>IANA Considerations</name>
      <t>This document requests registry of new media types (<xref target="iana-media-types"/>),
creation of new codepoint registries (<xref target="iana-codepoints"/>), and registration of
an IETF URN sub-namespace (<xref target="urn-space"/>).</t>
      <t>(RFC EDITOR: In the remainder of this section, replace "RFC XXXX" with the RFC
number assigned to this document.)</t>
      <section anchor="iana-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-aggregate"/>: "application/dap-aggregate-share-req"</t>
          </li>
          <li>
            <t>AggregateShare <xref target="collect-aggregate"/>: "application/dap-aggregate-share"</t>
          </li>
          <li>
            <t>CollectionJobReq <xref target="collect-init"/>: "application/dap-collection-job-req"</t>
          </li>
          <li>
            <t>CollectionJobResp <xref target="collect-init"/>: "application/dap-collection-job-resp"</t>
          </li>
        </ul>
        <t>Protocol message format evolution is supported through the definition of new
formats that are identified by new media types. The messages above are specific
to this specification. When a new major enhancement is proposed that results in
newer IETF specification for DAP, a new set of media types will be defined. In
other words, newer versions of DAP will not be backward compatible with this
version of DAP.</t>
        <t>(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>
        <t>The "Media Types" registry at https://www.iana.org/assignments/media-types will
be (RFC EDITOR: replace "will be" with "has been") updated to include each of
these media types. The information required for each media type is listed in
the remaining subsections.</t>
        <section anchor="applicationdap-hpke-config-list-media-type">
          <name>"application/dap-hpke-config-list" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-hpke-config-list</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="upload-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</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 of the published specification</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 of the published specification</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-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</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 of the published specification</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 of the published specification</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="aggregate-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</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 of the published specification</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 of the published specification</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="aggregate-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</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 of the published specification</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 of the published specification</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="aggregate-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</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 of the published specification</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 of the published specification</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"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</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 of the published specification</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 of the published specification</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"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</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 of the published specification</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 of the published specification</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"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</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 of the published specification</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 of the published specification</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"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</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 of the published specification</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 of the published specification</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="iana-codepoints">
        <name>DAP Type Registries</name>
        <t>This document also requests creation of a new "Distributed Aggregation Protocol
(DAP)" page. This page will contain several new registries, described in the
following sections. All registries are administered under the Specification
Required policy <xref target="RFC8126"/>.</t>
        <section anchor="batch-mode-reg">
          <name>Batch Modes Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "Batch Mode Identifiers" for DAP batch modes (<xref target="batch-mode"/>). This
registry should contain the following columns:</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The one-byte identifier for the batch mode</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the batch mode</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the batch mode is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry listed in <xref target="batch-mode-id"/>.</t>
          <table anchor="batch-mode-id">
            <name>Initial contents of the Batch Mode Identifiers registry.</name>
            <thead>
              <tr>
                <th align="left">Value</th>
                <th align="left">Name</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>reserved</tt></td>
                <td align="left">
                  <xref target="batch-mode"/> of RFC XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">
                  <tt>time_interval</tt></td>
                <td align="left">
                  <xref target="time-interval-batch-mode"/> of RFC XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x02</tt></td>
                <td align="left">
                  <tt>leader_selected</tt></td>
                <td align="left">
                  <xref target="leader-selected-batch-mode"/> of RFC XXXX</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="report-extension-registry">
          <name>Report Extension Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "Report Extension Identifiers" for extensions to the upload interaction
(<xref target="upload-flow"/>). This registry should contain the following columns:</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The two-byte identifier for the upload extension</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the upload extension</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the upload extension is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are listed in <xref target="upload-extension-id"/>.</t>
          <table anchor="upload-extension-id">
            <name>Initial contents of the Report Extension Identifiers registry.</name>
            <thead>
              <tr>
                <th align="left">Value</th>
                <th align="left">Name</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>0x0000</tt></td>
                <td align="left">
                  <tt>reserved</tt></td>
                <td align="left">RFC XXXX</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="report-error-reg">
          <name>Report Error Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "Report Error Identifiers" for reasons for rejecting reports during the
aggregation interaction (<xref target="aggregation-helper-init"/>).</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The one-byte identifier of the report error</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the report error</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the report error is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are listed below in <xref target="report-error-id"/>.</t>
          <table anchor="report-error-id">
            <name>Initial contents of the Report Error Identifiers registry.</name>
            <thead>
              <tr>
                <th align="left">Value</th>
                <th align="left">Name</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>reserved</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">
                  <tt>batch_collected</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x02</tt></td>
                <td align="left">
                  <tt>report_replayed</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x03</tt></td>
                <td align="left">
                  <tt>report_dropped</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x04</tt></td>
                <td align="left">
                  <tt>hpke_unknown_config_id</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x05</tt></td>
                <td align="left">
                  <tt>hpke_decrypt_error</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x06</tt></td>
                <td align="left">
                  <tt>vdaf_prep_error</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x07</tt></td>
                <td align="left">
                  <tt>task_expired</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x08</tt></td>
                <td align="left">
                  <tt>invalid_message</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x09</tt></td>
                <td align="left">
                  <tt>report_too_early</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x10</tt></td>
                <td align="left">
                  <tt>task_not_started</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
            </tbody>
          </table>
        </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:  RFC XXXX

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

Index value:  No transformation needed.
]]></artwork>
        <t>The initial contents of this namespace are the types and descriptions in
<xref target="urn-space-errors"/>, with the Reference field set to RFC XXXX.</t>
      </section>
    </section>
    <section anchor="extending-this-doc">
      <name>Extending this Document</name>
      <t>The behavior of DAP may be extended or modified by future documents defining
one or more of the following:</t>
      <ol spacing="normal" type="1"><li>
          <t>a new batch mode (<xref target="batch-mode"/>)</t>
        </li>
        <li>
          <t>a new report extension (<xref target="report-extensions"/>)</t>
        </li>
        <li>
          <t>a new report error (<xref target="aggregation-helper-init"/>)</t>
        </li>
        <li>
          <t>a new entry in the URN sub-namespace for DAP (<xref target="urn-space-errors"/>)</t>
        </li>
      </ol>
      <t>Each of these requires registration of a codepoint or other value; see
<xref target="iana"/>. No other considerations are required except in the following cases:</t>
      <ul spacing="normal">
        <li>
          <t>When a document defines a new batch mode, it <bcp14>MUST</bcp14> include a section titled
"DAP Batch Mode Considerations" specifying the following:  </t>
          <ul spacing="normal">
            <li>
              <t>The value of the <tt>config</tt> field of <tt>Query</tt>, <tt>PartialBatchSelector</tt>, and
<tt>BatchSelector</tt></t>
            </li>
            <li>
              <t>Batch buckets (<xref target="batch-buckets"/>): how reports are assigned to batch
buckets; how each bucket is identified; and how batch buckets are mapped to
batches.</t>
            </li>
          </ul>
          <t>
See <xref target="batch-modes"/> for examples.</t>
        </li>
        <li>
          <t>When a document defines a new report extension, it <bcp14>SHOULD</bcp14> include in its
"Security Considerations" section some discussion of how the extension
impacts the security of DAP with respect to the threat model in
<xref target="sec-considerations"/>.</t>
        </li>
      </ul>
    </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="2" month="November" 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 invalid
   measurement.  Two concrete VDAFs are specified, one for general-
   purpose aggregation (Prio3) and another for heavy hitters (Poplar1).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vdaf-13"/>
        </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="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="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="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="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </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://doi.org/10.1007/3-540-45748-8_24">
          <front>
            <title>The Sybil Attack</title>
            <author initials="J. R." surname="Douceur" fullname="John R. Douceur">
              <organization/>
            </author>
            <date year="2002"/>
          </front>
          <refcontent>International Workshop on Peer-to-Peer Systems (IPTPS)</refcontent>
        </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" fullname="Salil Vadhan">
              <organization/>
            </author>
            <date year="2016"/>
          </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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
XeUGnmcq1h4WDlLvt6eK3NMpUYAE3Nqt3Ojw44Fpy8K7/LANCFEHnYlCDJvy
rKIsuWAqkaNLufdzwqwDIpmjin1V4P8PuflF3bTBC2Fzpk/WQA9VdlKvqqLj
ShTL+TvyTjflFLNyWlF/CNnpXMIDB0KnHg2s6fXxOF3lLUyIODvPlnXLOeHz
SMTy8suQcnMpQzBfYo6Xj6SF+zkKmOAVm/n4M/Zw0tHzDgQcbkjiCtmnJJ2+
U5+OSiKiVoj/Hg1GqQaqYa5GnjBILOqEQzvUEMMYqhmI5SElH6SydjoGsYD7
Zrc+nXkhWpMwJ95AfLFhHLsf3n4nSpW31qmP6c0hK2fsEYKpDmP4k8TlGGB0
SIxQokMR4vPsuVXmkH4LYr2X9fwyGC8N4WowCzp7Fijtwt7SFH8n4YUm51d1
Kb/UBm2EpSsfFqyOQ9l95EOy9pwufWqif8mMh8uUpBdbdLgIRgnk40jPx6b9
cXbiLWw1/PekOCspbSYI52gPkozlGzqEN5zmNG9nCcibGkLVrJQbjDLKzcKs
2LJZsEmVtCQXFC2fVu05RnRV5jC5QoVqnMS9BAtl7MjKw6elCdl4YkviXLzs
wd6IXE+HL1TVCntINiTKfkHF1PlxqN8KbQoB9iqOkMZuYwUWc2NUg0X51rIQ
0hfgyhvCHKcX5BMj7k+pwaTgMgUNjUZrrkRlbmTXcqzhEkoaRQ0g9wx+zB43
qGe+BUV1MxeDZq9hNE0DKsNKn0hHQ3uUccEqRZdEdQHRJOqZ2BEXsXPd6W4N
Da2SGsmaDStK3mOKTeXymKKqPE7XJVoSYLX5YOhYAnVKKD9rs7JKcq9QPOvm
q9JxwqNCQqoKpDkw1dmIsxZB++EbG/jH4mTu35cNO0Vjq9sofpmoxN7gA06T
4jADYzdwJjyNveY0atpQWTMPXKPOc7IHhdaqAj/JKa/LXeXwA6KzzNNwL/H4
E6KeRbvhWH5hIMY/Pc0rR2yEVcLf+eWyoO0NqIXdhXTuoMqgGUFSoRNLTvVr
doeb/pflkhDMyJBXNXr6RHAgGNOTwoITIJNtsgF1OoicELDCwmFTvML3S45E
ICOAyyuVCzWMbLIjvqHdnQnRcSxq44Ei55JmrUWito3XxwYoMmWB6Rj6cGdC
Mi2II0MxJJn8K0J8WnAqVzFzItxgWLuy7WCFCndv6zMtzKlTXEa+cp03h4dY
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
n9FbZTCnptuRCKcdSVB9elwmkbiwKQzERZmi5bFDxBhMhitVuLpYXu7ZVpIl
cIkknwyHT7kKFEPFOFVuwxZjqQXNH05yncvFYs3eI+VnNseXz4y/0rhCSk5Z
lVzt1zYnlRVrom4ZpZwbxAcMdseerXaWwXY2UwHbVMgI1Z802UCqhP7w9rDx
Ub632PgRHnZ6zqgQUs8huXRAC0rrP/eSQiczX99MNRo2gPiapucMbG+EWRj/
OJ4NuwNs8lju5WbHALq498BTMIxZS2IwgCHQ+u/0P6mdgkpRqzjokYi1iq8T
HSRwECodTswjNDQR7f+DcMyfmGXinyuJop9aosXKoiQfe7bdyUqMQuE4YM5/
VXbAxXsdweNkjPRSOfswGcIfZhdHsDfynEcfts3/hBNhsSqZiio2Wxu90d1Y
KGSURDMjVDQ3UIs0qvQib0bLwha8LFGqjKcalTZYsBG6o4cgwyw50hgd2Nnj
hwHhQyOrUdCKXWh38E5H/mF27uXiJqDd6nMp3c+X5f1ZvsSia7KAg9MdtM4+
eOgePskePM4eTrPpabZ7kk13suIByMbZKTzJs8dPsycPsukX2fRB9nQ3O4U3
82wKGvgX2c4eVrl+vJedPs0enGYPH+O3T/bc7hdZ8WSgNSy6+5ENvniUTTH/
KXu0mxW7Wf5F9uRRtvcAOzvZyWZfZI93sQNo8fGu23s6yLYQsBfaE3tyVk9b
TOjl4zMMK8vreA5Tn8G6guy2PQyHHQ6z82flPtUdvO+p9L4Z5zFyj/u9NCsJ
RCcICW5OspvcsOrS1dOvfr/z9i///uov7y8PHj4+fnq9OP/L9fT1V19crL4f
/dvhN7+/PDt+23x1/U0x7Q5mPn2S/1B8s5wdfV8338/PRz/8+/lvDybMfINX
+a3w0Z8+s2zUIyRhAZqyngkYvg8D8tbAoIyLHcBXnqP4DLKj+gwnD9KnsPfW
1kh7z/5R/ckAsXiV3Nm26JIxJQAiSB1rwNogJDhR0buCAhfLojsvtgdpgMBP
n1nRybmvAnKJJt/lPm6qbH1JpGjNQs1ZjJrx4oLriHFpfYDs6HY5rWYPnQvV
EkBrLKdk69Ld5TLqUtq3R5gjZT7N9j659jCZElznvnn5zgfYIZbuT0EW/3A/
lWqqLlrVjFHIMIsAJ1D4ULPG5H/YeI29nZ3s9W/JY4bQBMHX+F3ZtCL6KxyT
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
7devX++TgNxvV2e3WdBCDbvtBCbIknxqCY2Z8BZaF9m9oxhoO3tSN52Eu2EQ
tGjt2dX96+29kwnascAv6+OMw9uxtldENQP1o1RpF4s/g4JwvXR1Q6PVdF2S
mhNEd7LZRfHy4mSd/HVotKJ4oVOPhgWe/v72YVH80LtS8kcqPCmeLoJOJmg9
TlXEEyhV2Xlw0oQJhz3ZOWkWwYreARNjaNN6Srnf4m0aGGGgN7fdMm5DESad
MDsy6sMUAY+kF6Q/Lhb2fHgEPKAaXoYviwvBGRYI7+ohxEG/CdyLOXVszrpt
AoeDebT4+5+ns78UZfif9V+eVWfNRHJ9dru9gz/fDj/+eTr9Sxgj/PtUn3tC
QLKMo1TNGgrFV/Pa5bdhntte/obqgc1KvOozzwh4Zt125yVqiEFepJZvfec2
LaV4jiI5sCWi/Jnly3KuyJqytmiqpxxL6G0IUQKlHQUb6rPykN+tY4jqfYgC
RQ4XJI4x4uMfnj374XsifjIyBOygXbgn+JDw0U8xh8fnSN2XGttZzYMePX35
1y3XXpTij7rsPMbNFb+54jdX/A94xbdarR916beN+odnA3mf0BtOcMMJ/pdy
AngwPikXoBFvOMANB7jhAP8zOEDi/P2knMCPfMMRbjjCDUf4Y3MEH7T5JIzA
DfiHv/9pYsjN7b+5/f87b/8nvfk3t/7m1t/c+j/irR/Iifioi98f7+bu39z9
m7v/P+Luf6wLcGDAm9t/c/tvbv//99uPRDZc5xcxzVmSf12Wc55qbf0IubOl
y53m3L4d19AsaYeimZDFbvjw3k643me1ZKLRv3Iqn+IpaGvDBaqkdHqjFLeI
sttiQp2lMJWHwC2xNSH1f0qVIt265tR3xWF8mWxYZEttuIEbgRB4cPfel6h4
i1Viz1oqpXih2WGKyEUlIYHDnb2j7sZu5hvLbkzywSZ8PDEdLFCmTwbD3gaO
pe3X47fLI7vr3Y4mVzrML6SrxzkZHERhE5J6Bd3uNIc7HNLFHHwDeYgHgWgo
1Szw3/HJZl17TqPFpfHbRfE9+D+/s6hiwal/5kWNEqsJHvxPIPSkjzDEHnJB
OTMPqbAVU0htHawal/Jv6W2lX/y4meL0fi05qbL8taQJJlWX4TebUHntP78W
vx6M+R/7F/fP0G9b/wljlcd33ty5cxzmcEy49KtL6gRi80rPkRatkmJoXhjr
LsaiUt9XCl17LGMl/VLHV4ysY93DWJya+UqB3Y4xVob2tn20X4u3B+Wt5ETK
dbOe1V/vHA0eal0Ok7od9f7OO+34i0TSpwafo3fy97mBvc/17qErfRKAkX6f
wqJX2iZs8KNuJwFrbLudMgeb3PY72n9yy03NH/yA+0p82d9Z2RMbsndzr7+7
7mpefznt7m2/ffFGMBEPTPE6Ur6KZrYTNDUC8gJGq+jo999RxCSf7xE31XEp
YCG3PvSoc1NDIy62tJYB9N62mheqhrpW3KR9vbAb22k5fWoLHfuHPo6GuUkB
KDk5rfeRP79ZDF0jg36zKLpGDjlxtPUAmef/rDzfy6Jeo6sPHu+ezA/tNbkn
3keN97kfTzozH3/Eer/AeJTf/upiAaTjV5zn/qoRsfnbxrsfx5vWKNd8Bao6
/sD5fYnxLqfV6SvCJ/GDfdB4X7GuQVAW9ZslKc+eZn77eA8wnkDJvJLapY+Y
30N/vrEd64eOd/dOXO+iXXNb6rjm3zIeiZOMT7yvKMm5cy5GUHn6Mqk8VRth
92K1OKACmgN4V7qD5XJ+MK2We0HGxNJU5n5R5eDS8g+RMGJxwOwSTWbHimP7
U3wRnzZz0SA5UoGka/Y1VajlrufLmQAWsAH3+f37n797dwDYl8JkKrxUJfmo
iiIxA8OP0RlDW941BGUYfqYSoKsqgDDWUTAu3/COhVe+b7lNYizS4e7w+4zh
cqWQiVtTibDi4iIulyY7eMk+BLTystNjcuoIxzfWBptYOQUgPhXghYPSdaLc
GhrKVDsNlk/U4H97q9a/jOkv42k7EQo5qQn1ql1pNZ6AavDzhEyw4saMUp94
eoEyenUliLBF87dFzQ+vTHrbqR4A15idC84+zC3c+FAPU3MLSGj/DVysK5WU
+E5YAONb0mT7pd524YZOZq8onnJZV8llXYZykNWSA7JAq9Fpn+GqAnEpfCvq
4d8RBqv8NXX+ldrRA44NwYXr2xRVh7rrP2ntZ4RgkSrvfP8BHcLN+AwWVf1S
YGOEIL1DO+BsubSYf8e1/+sdObFT7hJ6GWsh6/KYpemx0HH49fjfL+oVNdg+
fk6QB9UM33tZc5uCYwOzDv8cp3/Sj/AETy4mv9Rr5zmRHwhZG7gzhq4MZKRY
YM/YPvwFeecRXmBsbPyCns9Wq/uIu9+1up/6aRp5XpEKUq5bHZGeQM/UUhpd
RarvpN2VVFZyY9WrDzC/Gx4xTA+SG0fQ8W1pTLhjJ824srHbVjiPc+nUFU3I
UjCxM/Q+hx+DPjUAgpd+sa5PHiPzv3070AqR1Oqgu6Lwt/i/nuyJTbhjAgA=

-->

</rfc>
