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

<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 on some server, 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 which can be used to collect aggregate data
without revealing any individual contributor'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 142?>

<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>15:</t>
        <ul spacing="normal">
          <li>
            <t>Specify body of responses to aggregation job GET requests. (#651)</t>
          </li>
          <li>
            <t>Add diagram illustrating object lifecycles and relationships. (#655)</t>
          </li>
          <li>
            <t>Use aasvg for prettier diagrams. (#657)</t>
          </li>
          <li>
            <t>Add more precise description of time and intervals. (#658)</t>
          </li>
          <li>
            <t>Reorganize text for clarity and flow. (#659, #660, #661, #663, #665, #666,
#668, #672, #678, #680, #684, #653, #654)</t>
          </li>
          <li>
            <t>Align with RFC 9205 recommendations. (*) (#673, #683)</t>
          </li>
          <li>
            <t>Define consistent semantics for long-running interactions: aggregation jobs,
collection jobs and aggregate shares. (*) (#674, #675, #677)</t>
          </li>
          <li>
            <t>Add security consideration for predictable task IDs. (#679)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-14" to "dap-15". (*)</t>
          </li>
        </ul>
        <t>14:</t>
        <ul spacing="normal">
          <li>
            <t>Enforce VDAF aggregation parameter validity. This is not relevant for Prio3,
which requires only that reports be aggregated at most once. It is relevant
for VDAFs for which validity depends on how many times a report might be
aggregated (at most once in DAP). (*)</t>
          </li>
          <li>
            <t>Require all timestamps to be truncated by <tt>time_precision</tt>. (*)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-13 to 14 <xref target="VDAF"/>. There are no functional or
breaking changes in this draft.</t>
          </li>
          <li>
            <t>Clarify conditions for rejecting reports based on the report metadata,
including the timestamp and public and private extensions.</t>
          </li>
          <li>
            <t>Clarify that the Helper responds with 202 Accepted to an aggregation
continuation request.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-13" to "dap-14". (*)</t>
          </li>
        </ul>
        <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>The party that receives report shares from Clients and validates and
aggregates them with the help of the other Aggregator, producing aggregate
shares for the Collector. 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 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 party that generates a measurement and uploads a report, as defined in
<xref target="VDAF"/>. 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 assembles the aggregate
result from the aggregate shares constructed by the Aggregators. As defined in
<xref target="VDAF"/>.</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>An 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 public share and 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>
            <dt>Task:</dt>
            <dd>
              <t>A task in which measurements of an understood type will be reported by the
Clients, aggregated by the Aggregators and received by the Collector. Many
collections can be performed in the course of a single task.</t>
            </dd>
          </dl>
        </section>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>The protocol is executed by a large set of Clients and a pair of Aggregators.
Each Client's input to the protocol is its measurement (or set of measurements,
e.g., counts of some user behavior). Given a 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, determined by the
Verifiable Distributed Aggregation Function, or
<xref target="VDAF"/>, used to 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 merged into
the aggregate result.</t>
        </li>
      </ul>
      <t>DAP is not compatible with all VDAFs. 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"/>). Some VDAFs may involve three or more Aggregators,
but DAP requires exactly two Aggregators. Some VDAFs allow measurements to be
aggregated multiple times with a different aggregation parameter. DAP may be
compatible with such VDAFs, but only allows each measurement to be aggregated
once.</t>
      <section anchor="system-architecture">
        <name>System Architecture</name>
        <figure anchor="dap-topology">
          <name>DAP architecture</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="456" viewBox="0 0 456 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,96" fill="none" stroke="black"/>
                <path d="M 8,128 L 8,192" fill="none" stroke="black"/>
                <path d="M 8,256 L 8,320" fill="none" stroke="black"/>
                <path d="M 80,32 L 80,96" fill="none" stroke="black"/>
                <path d="M 80,128 L 80,192" fill="none" stroke="black"/>
                <path d="M 80,256 L 80,320" fill="none" stroke="black"/>
                <path d="M 120,64 L 120,128" fill="none" stroke="black"/>
                <path d="M 120,192 L 120,288" fill="none" stroke="black"/>
                <path d="M 168,112 L 168,208" fill="none" stroke="black"/>
                <path d="M 168,256 L 168,320" fill="none" stroke="black"/>
                <path d="M 216,216 L 216,248" fill="none" stroke="black"/>
                <path d="M 272,112 L 272,208" fill="none" stroke="black"/>
                <path d="M 272,256 L 272,320" fill="none" stroke="black"/>
                <path d="M 352,128 L 352,192" fill="none" stroke="black"/>
                <path d="M 448,128 L 448,192" fill="none" stroke="black"/>
                <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
                <path d="M 80,64 L 120,64" fill="none" stroke="black"/>
                <path d="M 8,96 L 80,96" fill="none" stroke="black"/>
                <path d="M 168,112 L 272,112" fill="none" stroke="black"/>
                <path d="M 8,128 L 80,128" fill="none" stroke="black"/>
                <path d="M 120,128 L 160,128" fill="none" stroke="black"/>
                <path d="M 352,128 L 448,128" fill="none" stroke="black"/>
                <path d="M 80,160 L 160,160" fill="none" stroke="black"/>
                <path d="M 280,160 L 352,160" fill="none" stroke="black"/>
                <path d="M 8,192 L 80,192" fill="none" stroke="black"/>
                <path d="M 120,192 L 160,192" fill="none" stroke="black"/>
                <path d="M 352,192 L 448,192" fill="none" stroke="black"/>
                <path d="M 168,208 L 272,208" fill="none" stroke="black"/>
                <path d="M 8,256 L 80,256" fill="none" stroke="black"/>
                <path d="M 168,256 L 272,256" fill="none" stroke="black"/>
                <path d="M 80,288 L 120,288" fill="none" stroke="black"/>
                <path d="M 8,320 L 80,320" fill="none" stroke="black"/>
                <path d="M 168,320 L 272,320" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="288,160 276,154.4 276,165.6" fill="black" transform="rotate(180,280,160)"/>
                <polygon class="arrowhead" points="224,248 212,242.4 212,253.6" fill="black" transform="rotate(90,216,248)"/>
                <polygon class="arrowhead" points="168,192 156,186.4 156,197.6" fill="black" transform="rotate(0,160,192)"/>
                <polygon class="arrowhead" points="168,160 156,154.4 156,165.6" fill="black" transform="rotate(0,160,160)"/>
                <polygon class="arrowhead" points="168,128 156,122.4 156,133.6" fill="black" transform="rotate(0,160,128)"/>
                <g class="text">
                  <text x="44" y="68">Client</text>
                  <text x="44" y="164">Client</text>
                  <text x="220" y="164">Leader</text>
                  <text x="400" y="164">Collector</text>
                  <text x="136" y="180">...</text>
                  <text x="40" y="228">...</text>
                  <text x="44" y="292">Client</text>
                  <text x="220" y="292">Helper</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
.--------.
|        |
| Client +----.
|        |    |
'--------'    |
              |     .------------.
.--------.    '---->|            |         .-----------.
|        |          |            |         |           |
| Client +--------->|   Leader   |<--------+ Collector |
|        |     ...  |            |         |           |
'--------'    .---->|            |         '-----------'
              |     '------------'
   ...        |           |
              |           v
.--------.    |     .------------.
|        |    |     |            |
| Client +----'     |   Helper   |
|        |          |            |
'--------'          '------------'
]]></artwork>
          </artset>
        </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 over the measurements
generated by the Clients. A task will have a single Collector.</t>
          </dd>
          <dt>Clients:</dt>
          <dd>
            <t>The parties which take the measurements and report them to the Aggregators.
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, aggregates them with the assistance of the Helper, and
it orchestrates the process of computing the aggregate result as requested by
the Collector. Each task has a single Leader.</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. Each task has a single Helper.</t>
          </dd>
        </dl>
        <t><xref target="dap-topology"/> illustrates which participants exchange HTTP messages. Arrows
go from HTTP clients to HTTP servers. Some DAP participants may be HTTP clients
sometimes but HTTP servers at other times. It is even possible for a single
entity to perform multiple DAP roles. For example, the Collector could also be
one of the Aggregators.</t>
        <t>In the course of a measurement task (<xref target="task-configuration"/>), each Client
records its own measurement, packages it up into a report, and sends it to the
Leader. Each share is encrypted to only one of the two Aggregators so that even
though both pass through the Leader, the Leader is unable to see or modify the
Helper's share. 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 and assembling them into a aggregate shares for the Collector.
Depending on the VDAF, it may be possible to process each report as it is
uploaded, or it may be necessary to wait until the Collector initializes a
collection job before processing can begin.</t>
      </section>
      <section anchor="validating-inputs">
        <name>Validating Measurements</name>
        <t>An essential goal of any data collection pipeline is ensuring that the data
being aggregated is "valid". For example, each measurement might be expected to
be a number between 0 and 10. 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>DAP validates inputs using an interactive computation between the Leader and
Helper. At the beginning of this computation, each Aggregator holds an input
share uploaded by the Client. At the end of the computation, each Aggregator
either obtains an output share that is ready to be aggregated or rejects the
report as invalid.</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 includes 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"/>). Verifying this proof reveals nothing about
the underlying measurement but its validity.</t>
        <t>The specific properties attested to by the proof depend on the measurement being
taken. For instance, if the task is measuring the latency of some operation, the
proof might demonstrate that the value reported was between 0 and 60 seconds.
But to report which of <tt>N</tt> options a user selected, the report might contain <tt>N</tt>
integers and the proof would demonstrate that <tt>N-1</tt> of them were <tt>0</tt> and the
other was <tt>1</tt>.</t>
        <t>"Validity" is distinct from "correctness". For instance, the user might have
spent <tt>30</tt> seconds on a task but might report <tt>60</tt> seconds. This is a problem
with any measurement system and DAP does not attempt to address it. DAP merely
ensures that the data is within the chosen 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 and Double Collection</name>
        <t>Another goal of DAP is to mitigate replay attacks in which a report is
aggregated in multiple batches or multiple times in a single batch. 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 and rejecting replayed reports.</t>
        <t>DAP must also ensure that any batch is only collected once, even if new reports
arrive that would fall into that batch. Otherwise, comparing the new aggregate
result to the previous aggregate result can violate the privacy of the added
reports.</t>
        <t>Aggregators are responsible for refusing new reports if the batch they fall into
has been collected (<xref target="collect-flow"/>).</t>
      </section>
      <section anchor="lifecycle-of-protocol-objects">
        <name>Lifecycle of Protocol Objects</name>
        <t>The following diagram illustrates how the various objects in the protocol are
constructed or transformed into other protocol objects. Oval nodes are verbs or
actions which process, transform or combine one or more objects into one or more
other objects. This diagram does not necessarily illustrate how participants
communicate. In particular, the processing of aggregation jobs happens in
distinct, non-colluding parties.</t>
        <figure anchor="object-lifecycle">
          <name>Lifecycles of protocol objects</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1792" width="648" viewBox="0 0 648 1792" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 10,688 L 10,1376" fill="none" stroke="black"/>
                <path d="M 6,688 L 6,1376" fill="none" stroke="black"/>
                <path d="M 24,1264 L 24,1280" fill="none" stroke="black"/>
                <path d="M 26,1392 L 26,1424" fill="none" stroke="black"/>
                <path d="M 22,1392 L 22,1424" fill="none" stroke="black"/>
                <path d="M 34,736 L 34,1072" fill="none" stroke="black"/>
                <path d="M 30,736 L 30,1072" fill="none" stroke="black"/>
                <path d="M 42,1472 L 42,1488" fill="none" stroke="black"/>
                <path d="M 38,1472 L 38,1488" fill="none" stroke="black"/>
                <path d="M 40,1536 L 40,1552" fill="none" stroke="black"/>
                <path d="M 50,1088 L 50,1136" fill="none" stroke="black"/>
                <path d="M 46,1088 L 46,1136" fill="none" stroke="black"/>
                <path d="M 56,144 L 56,160" fill="none" stroke="black"/>
                <path d="M 56,192 L 56,320" fill="none" stroke="black"/>
                <path d="M 72,608 L 72,624" fill="none" stroke="black"/>
                <path d="M 72,656 L 72,688" fill="none" stroke="black"/>
                <path d="M 74,1184 L 74,1216" fill="none" stroke="black"/>
                <path d="M 70,1184 L 70,1216" fill="none" stroke="black"/>
                <path d="M 72,1296 L 72,1328" fill="none" stroke="black"/>
                <path d="M 72,1360 L 72,1512" fill="none" stroke="black"/>
                <path d="M 88,784 L 88,800" fill="none" stroke="black"/>
                <path d="M 88,832 L 88,864" fill="none" stroke="black"/>
                <path d="M 88,912 L 88,936" fill="none" stroke="black"/>
                <path d="M 88,1440 L 88,1512" fill="none" stroke="black"/>
                <path d="M 96,976 L 96,1008" fill="none" stroke="black"/>
                <path d="M 96,1056 L 96,1240" fill="none" stroke="black"/>
                <path d="M 104,1568 L 104,1600" fill="none" stroke="black"/>
                <path d="M 104,1648 L 104,1664" fill="none" stroke="black"/>
                <path d="M 112,1120 L 112,1240" fill="none" stroke="black"/>
                <path d="M 120,528 L 120,544" fill="none" stroke="black"/>
                <path d="M 136,1472 L 136,1512" fill="none" stroke="black"/>
                <path d="M 144,1408 L 144,1440" fill="none" stroke="black"/>
                <path d="M 160,1200 L 160,1240" fill="none" stroke="black"/>
                <path d="M 168,1536 L 168,1552" fill="none" stroke="black"/>
                <path d="M 184,720 L 184,736" fill="none" stroke="black"/>
                <path d="M 184,1264 L 184,1280" fill="none" stroke="black"/>
                <path d="M 192,784 L 192,800" fill="none" stroke="black"/>
                <path d="M 192,832 L 192,864" fill="none" stroke="black"/>
                <path d="M 192,912 L 192,936" fill="none" stroke="black"/>
                <path d="M 200,48 L 200,64" fill="none" stroke="black"/>
                <path d="M 200,96 L 200,160" fill="none" stroke="black"/>
                <path d="M 200,192 L 200,208" fill="none" stroke="black"/>
                <path d="M 200,240 L 200,272" fill="none" stroke="black"/>
                <path d="M 200,304 L 200,352" fill="none" stroke="black"/>
                <path d="M 200,384 L 200,400" fill="none" stroke="black"/>
                <path d="M 200,432 L 200,504" fill="none" stroke="black"/>
                <path d="M 200,560 L 200,600" fill="none" stroke="black"/>
                <path d="M 200,1264 L 200,1280" fill="none" stroke="black"/>
                <path d="M 216,448 L 216,504" fill="none" stroke="black"/>
                <path d="M 224,976 L 224,1008" fill="none" stroke="black"/>
                <path d="M 224,1056 L 224,1240" fill="none" stroke="black"/>
                <path d="M 232,1536 L 232,1552" fill="none" stroke="black"/>
                <path d="M 232,1664 L 232,1696" fill="none" stroke="black"/>
                <path d="M 232,1728 L 232,1760" fill="none" stroke="black"/>
                <path d="M 240,1120 L 240,1240" fill="none" stroke="black"/>
                <path d="M 264,464 L 264,504" fill="none" stroke="black"/>
                <path d="M 264,896 L 264,936" fill="none" stroke="black"/>
                <path d="M 288,784 L 288,896" fill="none" stroke="black"/>
                <path d="M 288,1200 L 288,1240" fill="none" stroke="black"/>
                <path d="M 296,528 L 296,544" fill="none" stroke="black"/>
                <path d="M 296,1536 L 296,1552" fill="none" stroke="black"/>
                <path d="M 322,736 L 322,1072" fill="none" stroke="black"/>
                <path d="M 318,736 L 318,1072" fill="none" stroke="black"/>
                <path d="M 328,1296 L 328,1328" fill="none" stroke="black"/>
                <path d="M 328,1360 L 328,1512" fill="none" stroke="black"/>
                <path d="M 336,720 L 336,752" fill="none" stroke="black"/>
                <path d="M 344,1440 L 344,1512" fill="none" stroke="black"/>
                <path d="M 352,368 L 352,384" fill="none" stroke="black"/>
                <path d="M 352,416 L 352,448" fill="none" stroke="black"/>
                <path d="M 352,608 L 352,624" fill="none" stroke="black"/>
                <path d="M 352,656 L 352,672" fill="none" stroke="black"/>
                <path d="M 354,752 L 354,1136" fill="none" stroke="black"/>
                <path d="M 350,752 L 350,1136" fill="none" stroke="black"/>
                <path d="M 360,1264 L 360,1280" fill="none" stroke="black"/>
                <path d="M 360,1568 L 360,1600" fill="none" stroke="black"/>
                <path d="M 360,1648 L 360,1664" fill="none" stroke="black"/>
                <path d="M 376,1408 L 376,1440" fill="none" stroke="black"/>
                <path d="M 392,1472 L 392,1512" fill="none" stroke="black"/>
                <path d="M 408,144 L 408,160" fill="none" stroke="black"/>
                <path d="M 408,192 L 408,208" fill="none" stroke="black"/>
                <path d="M 408,240 L 408,272" fill="none" stroke="black"/>
                <path d="M 408,304 L 408,320" fill="none" stroke="black"/>
                <path d="M 408,720 L 408,816" fill="none" stroke="black"/>
                <path d="M 418,816 L 418,1216" fill="none" stroke="black"/>
                <path d="M 414,816 L 414,1216" fill="none" stroke="black"/>
                <path d="M 424,1536 L 424,1552" fill="none" stroke="black"/>
                <path d="M 480,768 L 480,1024" fill="none" stroke="black"/>
                <path d="M 480,1088 L 480,1104" fill="none" stroke="black"/>
                <path d="M 536,368 L 536,384" fill="none" stroke="black"/>
                <path d="M 536,416 L 536,464" fill="none" stroke="black"/>
                <path d="M 546,688 L 546,1376" fill="none" stroke="black"/>
                <path d="M 542,688 L 542,1376" fill="none" stroke="black"/>
                <path d="M 560,672 L 560,704" fill="none" stroke="black"/>
                <path d="M 578,704 L 578,1424" fill="none" stroke="black"/>
                <path d="M 574,704 L 574,1424" fill="none" stroke="black"/>
                <path d="M 632,608 L 632,624" fill="none" stroke="black"/>
                <path d="M 632,656 L 632,768" fill="none" stroke="black"/>
                <path d="M 642,768 L 642,1488" fill="none" stroke="black"/>
                <path d="M 638,768 L 638,1488" fill="none" stroke="black"/>
                <path d="M 184,64 L 216,64" fill="none" stroke="black"/>
                <path d="M 184,96 L 216,96" fill="none" stroke="black"/>
                <path d="M 56,144 L 408,144" fill="none" stroke="black"/>
                <path d="M 136,208 L 264,208" fill="none" stroke="black"/>
                <path d="M 344,208 L 472,208" fill="none" stroke="black"/>
                <path d="M 136,240 L 264,240" fill="none" stroke="black"/>
                <path d="M 344,240 L 472,240" fill="none" stroke="black"/>
                <path d="M 56,320 L 192,320" fill="none" stroke="black"/>
                <path d="M 208,320 L 408,320" fill="none" stroke="black"/>
                <path d="M 328,384 L 368,384" fill="none" stroke="black"/>
                <path d="M 512,384 L 552,384" fill="none" stroke="black"/>
                <path d="M 176,400 L 216,400" fill="none" stroke="black"/>
                <path d="M 328,416 L 368,416" fill="none" stroke="black"/>
                <path d="M 512,416 L 552,416" fill="none" stroke="black"/>
                <path d="M 176,432 L 216,432" fill="none" stroke="black"/>
                <path d="M 216,448 L 352,448" fill="none" stroke="black"/>
                <path d="M 264,464 L 536,464" fill="none" stroke="black"/>
                <path d="M 136,512 L 280,512" fill="none" stroke="black"/>
                <path d="M 304,544 L 328,544" fill="none" stroke="black"/>
                <path d="M 136,560 L 280,560" fill="none" stroke="black"/>
                <path d="M 72,608 L 528,608" fill="none" stroke="black"/>
                <path d="M 576,608 L 632,608" fill="none" stroke="black"/>
                <path d="M 352,672 L 560,672" fill="none" stroke="black"/>
                <path d="M 8,686 L 544,686" fill="none" stroke="black"/>
                <path d="M 8,690 L 544,690" fill="none" stroke="black"/>
                <path d="M 552,702 L 576,702" fill="none" stroke="black"/>
                <path d="M 552,706 L 576,706" fill="none" stroke="black"/>
                <path d="M 32,734 L 320,734" fill="none" stroke="black"/>
                <path d="M 32,738 L 320,738" fill="none" stroke="black"/>
                <path d="M 328,750 L 352,750" fill="none" stroke="black"/>
                <path d="M 328,754 L 352,754" fill="none" stroke="black"/>
                <path d="M 624,766 L 640,766" fill="none" stroke="black"/>
                <path d="M 624,770 L 640,770" fill="none" stroke="black"/>
                <path d="M 64,800 L 112,800" fill="none" stroke="black"/>
                <path d="M 168,800 L 216,800" fill="none" stroke="black"/>
                <path d="M 400,814 L 416,814" fill="none" stroke="black"/>
                <path d="M 400,818 L 416,818" fill="none" stroke="black"/>
                <path d="M 64,832 L 112,832" fill="none" stroke="black"/>
                <path d="M 168,832 L 216,832" fill="none" stroke="black"/>
                <path d="M 264,896 L 288,896" fill="none" stroke="black"/>
                <path d="M 64,944 L 264,944" fill="none" stroke="black"/>
                <path d="M 288,960 L 312,960" fill="none" stroke="black"/>
                <path d="M 328,960 L 344,960" fill="none" stroke="black"/>
                <path d="M 360,960 L 408,960" fill="none" stroke="black"/>
                <path d="M 424,960 L 480,960" fill="none" stroke="black"/>
                <path d="M 64,976 L 264,976" fill="none" stroke="black"/>
                <path d="M 360,1008 L 408,1008" fill="none" stroke="black"/>
                <path d="M 424,1008 L 480,1008" fill="none" stroke="black"/>
                <path d="M 32,1070 L 320,1070" fill="none" stroke="black"/>
                <path d="M 32,1074 L 320,1074" fill="none" stroke="black"/>
                <path d="M 424,1104 L 480,1104" fill="none" stroke="black"/>
                <path d="M 48,1134 L 352,1134" fill="none" stroke="black"/>
                <path d="M 48,1138 L 352,1138" fill="none" stroke="black"/>
                <path d="M 72,1214 L 416,1214" fill="none" stroke="black"/>
                <path d="M 72,1218 L 416,1218" fill="none" stroke="black"/>
                <path d="M 40,1248 L 168,1248" fill="none" stroke="black"/>
                <path d="M 216,1248 L 344,1248" fill="none" stroke="black"/>
                <path d="M 40,1296 L 168,1296" fill="none" stroke="black"/>
                <path d="M 216,1296 L 344,1296" fill="none" stroke="black"/>
                <path d="M 8,1374 L 544,1374" fill="none" stroke="black"/>
                <path d="M 8,1378 L 544,1378" fill="none" stroke="black"/>
                <path d="M 24,1422 L 576,1422" fill="none" stroke="black"/>
                <path d="M 24,1426 L 576,1426" fill="none" stroke="black"/>
                <path d="M 88,1440 L 144,1440" fill="none" stroke="black"/>
                <path d="M 344,1440 L 376,1440" fill="none" stroke="black"/>
                <path d="M 40,1486 L 640,1486" fill="none" stroke="black"/>
                <path d="M 40,1490 L 640,1490" fill="none" stroke="black"/>
                <path d="M 56,1520 L 152,1520" fill="none" stroke="black"/>
                <path d="M 312,1520 L 408,1520" fill="none" stroke="black"/>
                <path d="M 176,1552 L 288,1552" fill="none" stroke="black"/>
                <path d="M 56,1568 L 152,1568" fill="none" stroke="black"/>
                <path d="M 312,1568 L 408,1568" fill="none" stroke="black"/>
                <path d="M 104,1664 L 360,1664" fill="none" stroke="black"/>
                <path d="M 208,1696 L 256,1696" fill="none" stroke="black"/>
                <path d="M 208,1728 L 256,1728" fill="none" stroke="black"/>
                <path d="M 184,64 C 175.16936,64 168,71.16936 168,80" fill="none" stroke="black"/>
                <path d="M 216,64 C 224.83064,64 232,71.16936 232,80" fill="none" stroke="black"/>
                <path d="M 184,96 C 175.16936,96 168,88.83064 168,80" fill="none" stroke="black"/>
                <path d="M 216,96 C 224.83064,96 232,88.83064 232,80" fill="none" stroke="black"/>
                <path d="M 136,208 C 127.16936,208 120,215.16936 120,224" fill="none" stroke="black"/>
                <path d="M 264,208 C 272.83064,208 280,215.16936 280,224" fill="none" stroke="black"/>
                <path d="M 344,208 C 335.16936,208 328,215.16936 328,224" fill="none" stroke="black"/>
                <path d="M 472,208 C 480.83064,208 488,215.16936 488,224" fill="none" stroke="black"/>
                <path d="M 136,240 C 127.16936,240 120,232.83064 120,224" fill="none" stroke="black"/>
                <path d="M 264,240 C 272.83064,240 280,232.83064 280,224" fill="none" stroke="black"/>
                <path d="M 344,240 C 335.16936,240 328,232.83064 328,224" fill="none" stroke="black"/>
                <path d="M 472,240 C 480.83064,240 488,232.83064 488,224" fill="none" stroke="black"/>
                <path d="M 328,384 C 319.16936,384 312,391.16936 312,400" fill="none" stroke="black"/>
                <path d="M 368,384 C 376.83064,384 384,391.16936 384,400" fill="none" stroke="black"/>
                <path d="M 512,384 C 503.16936,384 496,391.16936 496,400" fill="none" stroke="black"/>
                <path d="M 552,384 C 560.83064,384 568,391.16936 568,400" fill="none" stroke="black"/>
                <path d="M 176,400 C 167.16936,400 160,407.16936 160,416" fill="none" stroke="black"/>
                <path d="M 216,400 C 224.83064,400 232,407.16936 232,416" fill="none" stroke="black"/>
                <path d="M 328,416 C 319.16936,416 312,408.83064 312,400" fill="none" stroke="black"/>
                <path d="M 368,416 C 376.83064,416 384,408.83064 384,400" fill="none" stroke="black"/>
                <path d="M 512,416 C 503.16936,416 496,408.83064 496,400" fill="none" stroke="black"/>
                <path d="M 552,416 C 560.83064,416 568,408.83064 568,400" fill="none" stroke="black"/>
                <path d="M 176,432 C 167.16936,432 160,424.83064 160,416" fill="none" stroke="black"/>
                <path d="M 216,432 C 224.83064,432 232,424.83064 232,416" fill="none" stroke="black"/>
                <path d="M 136,512 C 127.16936,512 120,519.16936 120,528" fill="none" stroke="black"/>
                <path d="M 280,512 C 288.83064,512 296,519.16936 296,528" fill="none" stroke="black"/>
                <path d="M 136,560 C 127.16936,560 120,552.83064 120,544" fill="none" stroke="black"/>
                <path d="M 280,560 C 288.83064,560 296,552.83064 296,544" fill="none" stroke="black"/>
                <path d="M 64,800 C 55.16936,800 48,807.16936 48,816" fill="none" stroke="black"/>
                <path d="M 112,800 C 120.83064,800 128,807.16936 128,816" fill="none" stroke="black"/>
                <path d="M 168,800 C 159.16936,800 152,807.16936 152,816" fill="none" stroke="black"/>
                <path d="M 216,800 C 224.83064,800 232,807.16936 232,816" fill="none" stroke="black"/>
                <path d="M 64,832 C 55.16936,832 48,824.83064 48,816" fill="none" stroke="black"/>
                <path d="M 112,832 C 120.83064,832 128,824.83064 128,816" fill="none" stroke="black"/>
                <path d="M 168,832 C 159.16936,832 152,824.83064 152,816" fill="none" stroke="black"/>
                <path d="M 216,832 C 224.83064,832 232,824.83064 232,816" fill="none" stroke="black"/>
                <path d="M 64,944 C 55.16936,944 48,951.16936 48,960" fill="none" stroke="black"/>
                <path d="M 264,944 C 272.83064,944 280,951.16936 280,960" fill="none" stroke="black"/>
                <path d="M 64,976 C 55.16936,976 48,968.83064 48,960" fill="none" stroke="black"/>
                <path d="M 264,976 C 272.83064,976 280,968.83064 280,960" fill="none" stroke="black"/>
                <path d="M 40,1248 C 31.16936,1248 24,1255.16936 24,1264" fill="none" stroke="black"/>
                <path d="M 168,1248 C 176.83064,1248 184,1255.16936 184,1264" fill="none" stroke="black"/>
                <path d="M 216,1248 C 207.16936,1248 200,1255.16936 200,1264" fill="none" stroke="black"/>
                <path d="M 344,1248 C 352.83064,1248 360,1255.16936 360,1264" fill="none" stroke="black"/>
                <path d="M 40,1296 C 31.16936,1296 24,1288.83064 24,1280" fill="none" stroke="black"/>
                <path d="M 168,1296 C 176.83064,1296 184,1288.83064 184,1280" fill="none" stroke="black"/>
                <path d="M 216,1296 C 207.16936,1296 200,1288.83064 200,1280" fill="none" stroke="black"/>
                <path d="M 344,1296 C 352.83064,1296 360,1288.83064 360,1280" fill="none" stroke="black"/>
                <path d="M 56,1520 C 47.16936,1520 40,1527.16936 40,1536" fill="none" stroke="black"/>
                <path d="M 152,1520 C 160.83064,1520 168,1527.16936 168,1536" fill="none" stroke="black"/>
                <path d="M 312,1520 C 303.16936,1520 296,1527.16936 296,1536" fill="none" stroke="black"/>
                <path d="M 408,1520 C 416.83064,1520 424,1527.16936 424,1536" fill="none" stroke="black"/>
                <path d="M 56,1568 C 47.16936,1568 40,1560.83064 40,1552" fill="none" stroke="black"/>
                <path d="M 152,1568 C 160.83064,1568 168,1560.83064 168,1552" fill="none" stroke="black"/>
                <path d="M 312,1568 C 303.16936,1568 296,1560.83064 296,1552" fill="none" stroke="black"/>
                <path d="M 408,1568 C 416.83064,1568 424,1560.83064 424,1552" fill="none" stroke="black"/>
                <path d="M 208,1696 C 199.16936,1696 192,1703.16936 192,1712" fill="none" stroke="black"/>
                <path d="M 256,1696 C 264.83064,1696 272,1703.16936 272,1712" fill="none" stroke="black"/>
                <path d="M 208,1728 C 199.16936,1728 192,1720.83064 192,1712" fill="none" stroke="black"/>
                <path d="M 256,1728 C 264.83064,1728 272,1720.83064 272,1712" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="432,1104 420,1098.4 420,1109.6" fill="black" transform="rotate(180,424,1104)"/>
                <polygon class="arrowhead" points="416,272 404,266.4 404,277.6" fill="black" transform="rotate(90,408,272)"/>
                <polygon class="arrowhead" points="400,1512 388,1506.4 388,1517.6" fill="black" transform="rotate(90,392,1512)"/>
                <polygon class="arrowhead" points="368,1600 356,1594.4 356,1605.6" fill="black" transform="rotate(90,360,1600)"/>
                <polygon class="arrowhead" points="368,1008 356,1002.4 356,1013.6" fill="black" transform="rotate(180,360,1008)"/>
                <polygon class="arrowhead" points="352,1512 340,1506.4 340,1517.6" fill="black" transform="rotate(90,344,1512)"/>
                <polygon class="arrowhead" points="336,1512 324,1506.4 324,1517.6" fill="black" transform="rotate(90,328,1512)"/>
                <polygon class="arrowhead" points="336,1328 324,1322.4 324,1333.6" fill="black" transform="rotate(90,328,1328)"/>
                <polygon class="arrowhead" points="312,544 300,538.4 300,549.6" fill="black" transform="rotate(180,304,544)"/>
                <polygon class="arrowhead" points="296,1552 284,1546.4 284,1557.6" fill="black" transform="rotate(0,288,1552)"/>
                <polygon class="arrowhead" points="296,1240 284,1234.4 284,1245.6" fill="black" transform="rotate(90,288,1240)"/>
                <polygon class="arrowhead" points="296,960 284,954.4 284,965.6" fill="black" transform="rotate(180,288,960)"/>
                <polygon class="arrowhead" points="272,936 260,930.4 260,941.6" fill="black" transform="rotate(90,264,936)"/>
                <polygon class="arrowhead" points="272,504 260,498.4 260,509.6" fill="black" transform="rotate(90,264,504)"/>
                <polygon class="arrowhead" points="248,1240 236,1234.4 236,1245.6" fill="black" transform="rotate(90,240,1240)"/>
                <polygon class="arrowhead" points="240,1760 228,1754.4 228,1765.6" fill="black" transform="rotate(90,232,1760)"/>
                <polygon class="arrowhead" points="232,1240 220,1234.4 220,1245.6" fill="black" transform="rotate(90,224,1240)"/>
                <polygon class="arrowhead" points="232,1008 220,1002.4 220,1013.6" fill="black" transform="rotate(90,224,1008)"/>
                <polygon class="arrowhead" points="224,504 212,498.4 212,509.6" fill="black" transform="rotate(90,216,504)"/>
                <polygon class="arrowhead" points="216,320 204,314.4 204,325.6" fill="black" transform="rotate(180,208,320)"/>
                <polygon class="arrowhead" points="208,600 196,594.4 196,605.6" fill="black" transform="rotate(90,200,600)"/>
                <polygon class="arrowhead" points="208,504 196,498.4 196,509.6" fill="black" transform="rotate(90,200,504)"/>
                <polygon class="arrowhead" points="208,352 196,346.4 196,357.6" fill="black" transform="rotate(90,200,352)"/>
                <polygon class="arrowhead" points="208,272 196,266.4 196,277.6" fill="black" transform="rotate(90,200,272)"/>
                <polygon class="arrowhead" points="208,136 196,130.4 196,141.6" fill="black" transform="rotate(90,200,136)"/>
                <polygon class="arrowhead" points="200,936 188,930.4 188,941.6" fill="black" transform="rotate(90,192,936)"/>
                <polygon class="arrowhead" points="200,864 188,858.4 188,869.6" fill="black" transform="rotate(90,192,864)"/>
                <polygon class="arrowhead" points="200,320 188,314.4 188,325.6" fill="black" transform="rotate(0,192,320)"/>
                <polygon class="arrowhead" points="184,1552 172,1546.4 172,1557.6" fill="black" transform="rotate(180,176,1552)"/>
                <polygon class="arrowhead" points="168,1240 156,1234.4 156,1245.6" fill="black" transform="rotate(90,160,1240)"/>
                <polygon class="arrowhead" points="144,1512 132,1506.4 132,1517.6" fill="black" transform="rotate(90,136,1512)"/>
                <polygon class="arrowhead" points="120,1240 108,1234.4 108,1245.6" fill="black" transform="rotate(90,112,1240)"/>
                <polygon class="arrowhead" points="112,1600 100,1594.4 100,1605.6" fill="black" transform="rotate(90,104,1600)"/>
                <polygon class="arrowhead" points="104,1240 92,1234.4 92,1245.6" fill="black" transform="rotate(90,96,1240)"/>
                <polygon class="arrowhead" points="104,1008 92,1002.4 92,1013.6" fill="black" transform="rotate(90,96,1008)"/>
                <polygon class="arrowhead" points="96,1512 84,1506.4 84,1517.6" fill="black" transform="rotate(90,88,1512)"/>
                <polygon class="arrowhead" points="96,936 84,930.4 84,941.6" fill="black" transform="rotate(90,88,936)"/>
                <polygon class="arrowhead" points="96,864 84,858.4 84,869.6" fill="black" transform="rotate(90,88,864)"/>
                <polygon class="arrowhead" points="80,1512 68,1506.4 68,1517.6" fill="black" transform="rotate(90,72,1512)"/>
                <polygon class="arrowhead" points="80,1328 68,1322.4 68,1333.6" fill="black" transform="rotate(90,72,1328)"/>
                <g class="text">
                  <text x="200" y="36">measurement</text>
                  <text x="200" y="84">shard</text>
                  <text x="28" y="180">public</text>
                  <text x="80" y="180">share</text>
                  <text x="148" y="180">Leader</text>
                  <text x="200" y="180">input</text>
                  <text x="248" y="180">share</text>
                  <text x="364" y="180">Helper</text>
                  <text x="416" y="180">input</text>
                  <text x="464" y="180">share</text>
                  <text x="160" y="228">encrypt</text>
                  <text x="204" y="228">to</text>
                  <text x="244" y="228">Leader</text>
                  <text x="368" y="228">encrypt</text>
                  <text x="412" y="228">to</text>
                  <text x="452" y="228">Helper</text>
                  <text x="148" y="292">Leader</text>
                  <text x="204" y="292">report</text>
                  <text x="256" y="292">share</text>
                  <text x="356" y="292">Helper</text>
                  <text x="412" y="292">report</text>
                  <text x="464" y="292">share</text>
                  <text x="316" y="356">Client</text>
                  <text x="352" y="356">2</text>
                  <text x="388" y="356">report</text>
                  <text x="440" y="356">...</text>
                  <text x="500" y="356">Client</text>
                  <text x="536" y="356">i</text>
                  <text x="572" y="356">report</text>
                  <text x="164" y="372">Client</text>
                  <text x="200" y="372">1</text>
                  <text x="236" y="372">report</text>
                  <text x="348" y="404">upload</text>
                  <text x="532" y="404">upload</text>
                  <text x="196" y="420">upload</text>
                  <text x="240" y="500">...</text>
                  <text x="180" y="532">assign</text>
                  <text x="240" y="532">reports</text>
                  <text x="140" y="548">to</text>
                  <text x="200" y="548">aggregation</text>
                  <text x="268" y="548">jobs</text>
                  <text x="384" y="548">aggregation</text>
                  <text x="472" y="548">parameter</text>
                  <text x="364" y="564">chosen</text>
                  <text x="404" y="564">by</text>
                  <text x="456" y="564">Collector</text>
                  <text x="552" y="612">...</text>
                  <text x="48" y="644">aggregation</text>
                  <text x="112" y="644">job</text>
                  <text x="136" y="644">1</text>
                  <text x="336" y="644">aggregation</text>
                  <text x="400" y="644">job</text>
                  <text x="424" y="644">2</text>
                  <text x="552" y="644">aggregation</text>
                  <text x="616" y="644">job</text>
                  <text x="640" y="644">j</text>
                  <text x="180" y="708">report</text>
                  <text x="216" y="708">1</text>
                  <text x="316" y="708">report</text>
                  <text x="352" y="708">2</text>
                  <text x="376" y="708">...</text>
                  <text x="420" y="708">report</text>
                  <text x="456" y="708">k</text>
                  <text x="480" y="740">aggregation</text>
                  <text x="84" y="756">Leader</text>
                  <text x="164" y="756">Helper</text>
                  <text x="220" y="756">report</text>
                  <text x="284" y="756">public</text>
                  <text x="480" y="756">parameter</text>
                  <text x="68" y="772">report</text>
                  <text x="120" y="772">share</text>
                  <text x="152" y="772">1</text>
                  <text x="192" y="772">share</text>
                  <text x="224" y="772">1</text>
                  <text x="272" y="772">share</text>
                  <text x="304" y="772">1</text>
                  <text x="600" y="772">...</text>
                  <text x="88" y="820">decrypt</text>
                  <text x="192" y="820">decrypt</text>
                  <text x="376" y="820">...</text>
                  <text x="68" y="884">Leader</text>
                  <text x="120" y="884">input</text>
                  <text x="188" y="884">Helper</text>
                  <text x="240" y="884">input</text>
                  <text x="80" y="900">share</text>
                  <text x="112" y="900">1</text>
                  <text x="184" y="900">share</text>
                  <text x="216" y="900">1</text>
                  <text x="112" y="964">prepare</text>
                  <text x="168" y="964">input</text>
                  <text x="220" y="964">shares</text>
                  <text x="76" y="1028">Leader</text>
                  <text x="132" y="1028">output</text>
                  <text x="204" y="1028">Helper</text>
                  <text x="260" y="1028">output</text>
                  <text x="88" y="1044">share</text>
                  <text x="120" y="1044">1</text>
                  <text x="216" y="1044">share</text>
                  <text x="248" y="1044">1</text>
                  <text x="480" y="1060">...</text>
                  <text x="132" y="1092">Leader</text>
                  <text x="188" y="1092">output</text>
                  <text x="260" y="1092">Helper</text>
                  <text x="316" y="1092">output</text>
                  <text x="128" y="1108">share</text>
                  <text x="160" y="1108">2</text>
                  <text x="256" y="1108">share</text>
                  <text x="288" y="1108">2</text>
                  <text x="72" y="1156">...</text>
                  <text x="156" y="1156">Leader</text>
                  <text x="292" y="1156">Helper</text>
                  <text x="156" y="1172">output</text>
                  <text x="292" y="1172">output</text>
                  <text x="152" y="1188">share</text>
                  <text x="184" y="1188">k</text>
                  <text x="288" y="1188">share</text>
                  <text x="320" y="1188">k</text>
                  <text x="136" y="1236">...</text>
                  <text x="264" y="1236">...</text>
                  <text x="76" y="1268">accumulate</text>
                  <text x="148" y="1268">Leader</text>
                  <text x="252" y="1268">accumulate</text>
                  <text x="324" y="1268">Helper</text>
                  <text x="76" y="1284">output</text>
                  <text x="132" y="1284">shares</text>
                  <text x="252" y="1284">output</text>
                  <text x="308" y="1284">shares</text>
                  <text x="52" y="1348">Leader</text>
                  <text x="104" y="1348">batch</text>
                  <text x="156" y="1348">bucket</text>
                  <text x="192" y="1348">1</text>
                  <text x="300" y="1348">Helper</text>
                  <text x="352" y="1348">batch</text>
                  <text x="404" y="1348">bucket</text>
                  <text x="440" y="1348">1</text>
                  <text x="116" y="1396">Leader</text>
                  <text x="168" y="1396">batch</text>
                  <text x="220" y="1396">bucket</text>
                  <text x="256" y="1396">2</text>
                  <text x="372" y="1396">Helper</text>
                  <text x="424" y="1396">batch</text>
                  <text x="476" y="1396">bucket</text>
                  <text x="512" y="1396">2</text>
                  <text x="40" y="1444">...</text>
                  <text x="132" y="1460">Leader</text>
                  <text x="184" y="1460">batch</text>
                  <text x="236" y="1460">bucket</text>
                  <text x="272" y="1460">j</text>
                  <text x="388" y="1460">Helper</text>
                  <text x="440" y="1460">batch</text>
                  <text x="492" y="1460">bucket</text>
                  <text x="528" y="1460">j</text>
                  <text x="112" y="1508">...</text>
                  <text x="208" y="1508">query</text>
                  <text x="260" y="1508">chosen</text>
                  <text x="368" y="1508">...</text>
                  <text x="196" y="1524">by</text>
                  <text x="248" y="1524">Collector</text>
                  <text x="80" y="1540">merge</text>
                  <text x="132" y="1540">Leader</text>
                  <text x="328" y="1540">merge</text>
                  <text x="380" y="1540">Helper</text>
                  <text x="72" y="1556">batch</text>
                  <text x="128" y="1556">buckets</text>
                  <text x="328" y="1556">batch</text>
                  <text x="384" y="1556">buckets</text>
                  <text x="100" y="1620">Leader</text>
                  <text x="356" y="1620">Helper</text>
                  <text x="72" y="1636">aggregate</text>
                  <text x="136" y="1636">share</text>
                  <text x="336" y="1636">aggregate</text>
                  <text x="400" y="1636">share</text>
                  <text x="232" y="1716">unshard</text>
                  <text x="208" y="1780">aggregate</text>
                  <text x="276" y="1780">result</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                   measurement
                        |
                     .--+--.
                    | shard |
                     '--+--'
                        |
                        v
      .-----------------+-------------------------.
      |                 |                         |
public share   Leader input share         Helper input share
      |                 |                         |
      |        .--------+--------.       .--------+--------.
      |       | encrypt to Leader |     | encrypt to Helper |
      |        '--------+--------'       '--------+--------'
      |                 |                         |
      |                 v                         v
      |        Leader report share       Helper report share
      |                 |                         |
      '---------------->+<------------------------'
                        |
                        v           Client 2 report  ...   Client i report
                 Client 1 report           |                      |
                        |              .---+--.               .---+--.
                    .---+--.          | upload |             | upload |
                   | upload |          '---+--'               '---+--'
                    '---+--'               |                      |
                        | .----------------'                      |
                        | |     .---------------------------------'
                        | |     |
                        v v ... v
               .--------+-+-----+--.
              |    assign reports   |
              | to aggregation jobs |<--- aggregation parameter
               '--------+----------'      chosen by Collector
                        |
                        v
        .---------------+------------------+---------------------- ... -------.
        |                                  |                                  |
aggregation job 1                   aggregation job 2          aggregation job j
        |                                  |                                  |
        |                                  '-------------------------.        |
+==+====+==========================================================+ |        |
║                  report 1         report 2 ... report k          ║=+=+      |
║                     |                  |        |                ║   ║      |
║  +==================+================+ |        |   aggregation  ║   ║      |
║  ║   Leader    Helper report  public ║=+=+      |    parameter   ║   ║      |
║  ║ report share 1  share 1   share 1 ║   ║      |        |       ║   ║ ... =++
║  ║      |            |           |   ║   ║      |        |       ║   ║       ║
║  ║  .---+---.    .---+---.       |   ║   ║      |        |       ║   ║       ║
║  ║ | decrypt |  | decrypt |      |   ║   ║ ... =++       |       ║   ║       ║
║  ║  '---+---'    '---+---'       |   ║   ║       ║       |       ║   ║       ║
║  ║      |            |           |   ║   ║       ║       |       ║   ║       ║
║  ║      v            v           |   ║   ║       ║       |       ║   ║       ║
║  ║ Leader input   Helper input   |   ║   ║       ║       |       ║   ║       ║
║  ║   share 1      share 1     .--'   ║   ║       ║       |       ║   ║       ║
║  ║      |            |        |      ║   ║       ║       |       ║   ║       ║
║  ║      v            v        v      ║   ║       ║       |       ║   ║       ║
║  ║  .---+------------+--------+.     ║   ║       ║       |       ║   ║       ║
║  ║ |    prepare input shares    |<---║---║-------║-------+       ║   ║       ║
║  ║  '----+---------------+-----'     ║   ║       ║       |       ║   ║       ║
║  ║       |               |           ║   ║       ║       |       ║   ║       ║
║  ║       v               v           ║   ║<------║-------+       ║   ║       ║
║  ║  Leader output   Helper output    ║   ║       ║       |       ║   ║       ║
║  ║    share 1         share 1        ║   ║       ║               ║   ║       ║
║  ║       |               |           ║   ║       ║      ...      ║   ║       ║
║  +=======+===============+===========+   ║       ║               ║   ║       ║
║    ║     | Leader output | Helper output ║       ║       |       ║   ║       ║
║    ║     | share 2       | share 2       ║       ║<------'       ║   ║       ║
║    ║     | |             | |             ║       ║               ║   ║       ║
║    +=====+=+=============+=+=============+       ║               ║   ║       ║
║      ... | |  Leader     | |   Helper            ║               ║   ║       ║
║          | |  output     | |   output            ║               ║   ║       ║
║       ║  | |  share k    | |   share k           ║               ║   ║       ║
║       ║  | |     |       | |     |               ║               ║   ║       ║
║       +==+=+=====+=======+=+=====+===============+               ║   ║       ║
║          v v ... v       v v ... v                               ║   ║       ║
║  .-------+-+-----+-.   .-+-+-----+-------.                       ║   ║       ║
║ | accumulate Leader | | accumulate Helper |                      ║   ║       ║
║ |   output shares   | |   output shares   |                      ║   ║       ║
║  '----+------------'   '--------------+--'                       ║   ║       ║
║       |                               |                          ║   ║       ║
║       v                               v                          ║   ║       ║
║  Leader batch bucket 1          Helper batch bucket 1            ║   ║       ║
║       |                               |                          ║   ║       ║
+=======+===============================+==========================+   ║       ║
  ║     |  Leader batch bucket 2        |  Helper batch bucket 2       ║       ║
  ║     |        |                      |     |                        ║       ║
  +=====+========+======================+=====+========================+       ║
   ...  | .------'                      | .---'                                ║
        | |  Leader batch bucket j      | |  Helper batch bucket j             ║
    ║   | |     |                       | |     |                              ║
    +===+=+=====+=======================+=+=====+==============================+
        v v ... v      query chosen     v v ... v
     .--+-+-----+--.   by Collector  .--+-+-----+--.
    |  merge Leader |       |       | merge Helper  |
    | batch buckets |<------+------>| batch buckets |
     '------+------'                 '------+------'
            |                               |
            v                               v
         Leader                          Helper
    aggregate share                  aggregate share
            |                               |
            '---------------+---------------'
                            |
                        .---+---.
                       | unshard |
                        '---+---'
                            |
                            v
                     aggregate result
]]></artwork>
          </artset>
        </figure>
        <section anchor="arity-of-protocol-objects">
          <name>Arity of Protocol Objects</name>
          <t>Reports are 1 to 1 to with measurements. In this illustration, <tt>i</tt> distinct
Clients upload a distinct report, but a single Client could upload multiple
reports to a task (see <xref target="sybil"/> for some implications of this). The process of
sharding measurements, constructing reports and uploading them is specified in
<xref target="upload-flow"/>.</t>
          <t>Reports are many to 1 with aggregation jobs. The Leader assigns each of the <tt>i</tt>
reports into one of <tt>j</tt> different aggregation jobs, which can be run in parallel
by the Aggregators. Each aggregation job contains <tt>k</tt> reports. <tt>k</tt> is roughly
<tt>i / j</tt>, but it is not necessary for aggregation jobs to have uniform size. See
<xref target="operational-capabilities"/> for some discussion of performance implications for
aggregation job scheduling strategies.</t>
          <t>Report shares, input shares and output shares have a 1 to 1 to 1 relationship.
Report shares are decrypted into input shares and then prepared into output
shares. The scheduling of aggregation jobs and their execution by the
Aggregators is specified in <xref target="aggregate-flow"/>.</t>
          <t>Output shares are accumulated into batch buckets, and so have a many to 1
relationship. In this example, we show one batch bucket for each aggregation
job, but aggregation jobs and batch buckets are not necessarily 1 to 1. Multiple
aggregation jobs could contribute to the same batch bucket, and a single
aggregation job could contribute to multiple batch buckets. The assignation of
output shares to batch buckets is specified in <xref target="batch-buckets"/>.</t>
          <t>Using the Collector's query, each Aggregator will merge one or more batch
buckets together into its aggregate share, meaning batch buckets are many to 1
with aggregate shares.</t>
          <t>The Leader and Helper's aggregate shares are finally delivered to the Collector
to be unsharded into the aggregate result. Since there are always exactly two
Aggregators, aggregate shares are 2 to 1 with aggregate results. The collection
interaction is specified in <xref target="collect-flow"/>.</t>
          <t>There can be many aggregate results for a single task. The Collection process
may occur multiple times for each task, with the Collector obtaining multiple
aggregate results. For example, imagine tasks where the Collector obtains
aggregate results once an hour, or every time 10,000,000 reports are uploaded.</t>
        </section>
      </section>
    </section>
    <section anchor="message-transport">
      <name>Message Transport</name>
      <t>Communications between participants are carried over HTTP <xref target="RFC9110"/>. Use of
HTTPS is <bcp14>REQUIRED</bcp14> to provide server authentication and confidentiality. TLS
certificates <bcp14>MUST</bcp14> be checked according to <xref section="4.3.4" sectionFormat="comma" target="RFC9110"/>.</t>
      <section anchor="http-status-codes">
        <name>HTTP Status Codes</name>
        <t>HTTP servers participating in DAP <bcp14>MAY</bcp14> use any status code from the applicable
class when constructing HTTP responses, but HTTP clients <bcp14>MAY</bcp14> treat any status
code as the most general code of that class. For example, 202 may be handled as
200, or 499 as 400.</t>
      </section>
      <section anchor="presentation-language">
        <name>Presentation 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 protocol. Encoding and decoding of these
messages as byte strings also follows <xref target="RFC8446"/>. We enumerate the exceptions
below.</t>
        <section anchor="variable-length-vectors">
          <name>Variable-Length Vectors</name>
          <t><xref section="3.4" sectionFormat="of" target="RFC8446"/> describes a syntax for variable-length vectors where
a range of permitted lengths is provided. This document always specifies the
lower length limit of variable-length vectors to be <tt>0</tt>.</t>
        </section>
        <section anchor="structure-variants">
          <name>Structure Variants</name>
          <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 that use an enumerated type
as a discriminator, 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 are 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 is not used as
a discriminant. For example, given the following structure containing an
enumerator:</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>
        </section>
      </section>
      <section anchor="request-authentication">
        <name>HTTPS Request Authentication</name>
        <t>The protocol is made up of several interactions in which different subsets of
participants interact with each other.</t>
        <t>In those cases where a channel between two participants is tunneled through
another protocol participant, Hybrid Public-Key Encryption (<xref target="HPKE"/>)
ensures that only the intended recipient can see a message in the clear.</t>
        <t>In other cases, HTTP client authentication is required 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
(<xref section="11.6.2" sectionFormat="comma" target="RFC9110"/>), which can be added to any 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>
          <li>
            <t><xref target="RFC9421"/> HTTP message signatures authenticate messages without
transmitting a secret.</t>
          </li>
        </ul>
        <t>This flexibility allows organizations deploying DAP to use authentication
mechanisms that they already support. Discovering what authentication mechanisms
are supported by a participant is outside of this document's scope.</t>
      </section>
      <section anchor="errors">
        <name>Errors</name>
        <t>Errors are reported as HTTP status codes. Any of the standard client or server
errors (the 4xx or 5xx classes, respectively, from <xref section="15" sectionFormat="of" target="RFC9110"/>)
are permitted.</t>
        <t>When the server responds with an error status code, it <bcp14>SHOULD</bcp14> provide additional
information using a problem detail object <xref target="RFC9457"/> in the response body. If
the response body does consist of a problem detail object, the status code <bcp14>MUST</bcp14>
indicate a client or server error.</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">invalidAggregationParameter</td>
              <td align="left">The aggregation parameter assigned to a batch is invalid.</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">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>These types are scoped to the errors sub-namespace of the DAP URN namespace,
e.g., urn:ietf:params:ppm:dap:error:invalidMessage.</t>
        <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 that the response's status code will indicate a client error unless
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>Clients upload reports to the Aggregators, specified in <xref target="upload-flow"/></t>
        </li>
        <li>
          <t>Aggregators jointly prepare reports and aggregate them together, specified in
<xref target="aggregate-flow"/></t>
        </li>
        <li>
          <t>The Collector collects aggregated results from the Aggregators, specified in
<xref target="collect-flow"/></t>
        </li>
      </ul>
      <t>Each of these interactions is defined in terms of HTTP resources. In this
section we define these resources and the messages used to act on them.</t>
      <section anchor="basic-definitions">
        <name>Basic Type Definitions</name>
        <t>A <tt>ReportID</tt> is used to uniquely identify a report in the context of a DAP task.</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque ReportID[16];
]]></sourcecode>
        <t><tt>Role</tt> enumerates the roles assumed by protocol participants.</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  collector(0),
  client(1),
  leader(2),
  helper(3),
  (255)
} Role;
]]></sourcecode>
        <t><tt>HpkeCiphertext</tt> is a message encrypted using <xref target="HPKE"/> and metadata
needed to decrypt it. <tt>HpkeConfigId</tt> identifies a server's HPKE configuration
(see <xref target="hpke-config"/>).</t>
        <sourcecode type="tls-presentation"><![CDATA[
uint8 HpkeConfigId;

struct {
  HpkeConfigId config_id;
  opaque enc<0..2^16-1>;
  opaque payload<0..2^32-1>;
} HpkeCiphertext;
]]></sourcecode>
        <t><tt>config_id</tt> identifies the HPKE configuration to which the message was
encrypted. <tt>enc</tt> and <tt>payload</tt> correspond to the values returned by the
<xref target="HPKE"/> <tt>SealBase()</tt> function. Later sections describe how to use <tt>SealBase()</tt>
in different situations.</t>
        <t><tt>Empty</tt> is a zero-length byte string.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {} Empty;
]]></sourcecode>
        <section anchor="timestamps">
          <name>Times, Durations and Intervals</name>
          <sourcecode type="tls-presentation"><![CDATA[
uint64 Time;
]]></sourcecode>
          <t>Times are represented by POSIX timestamps, defined to be integers containing a
number of seconds since the Epoch, defined in section 4.16 of <xref target="POSIX"/>. That
is, the number of seconds after 1970-01-01 00:00:00 UTC, excluding leap seconds.
One POSIX timestamp is said to be before (respectively, after) another POSIX
timestamp if it is less than (respectively, greater than) the other value.</t>
          <t>Every timestamp <bcp14>MUST</bcp14> be rounded down to the nearest multiple of the task's
<tt>time_precision</tt> (<xref target="task-configuration"/>). That is, the value is computed as:</t>
          <artwork><![CDATA[
rounded_timestamp = timestamp - (timestamp % time_precision)
]]></artwork>
          <t>A timestamp is malformed if <tt>received_timestamp % time_precision &gt; 0</tt>.</t>
          <sourcecode type="tls-presentation"><![CDATA[
uint64 Duration;
]]></sourcecode>
          <t>Durations of time are integers, representing a number of seconds not including
leap seconds. They can be added to POSIX timestamps to produce other POSIX
timestamps. The duration <bcp14>MUST</bcp14> be a multiple of <tt>time_precision</tt>. If <tt>duration %
time_precision &gt; 0</tt>, then the interval is malformed.</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  Time start;
  Duration duration;
} Interval;
]]></sourcecode>
          <t>Intervals of time consist of a start time and a duration. Intervals are
half-open; that is, <tt>start</tt> is included and <tt>(start + duration)</tt> is excluded. A
time that is before the <tt>start</tt> of an <tt>Interval</tt> is said to be before that
interval. A time that is equal to or after <tt>Interval.start + Interval.duration</tt>
is said to be after the interval. A time that is either before or after an
interval is said to be outside the interval. A time that is neither before nor
after an interval is said to be inside or fall within the interval.</t>
        </section>
        <section anchor="vdaf-types">
          <name>VDAF Types</name>
          <t>The 16-byte <tt>ReportID</tt> is used 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>
      <section anchor="task-configuration">
        <name>Task Configuration</name>
        <t>A task represents a single measurement process, though potentially aggregating
multiple, non-overlapping batches of measurements. Each participant in a task
must agree on its configuration prior to its execution. This document does not
specify a mechanism for distributing task parameters among participants.</t>
        <t>A task is uniquely identified by its task ID:</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque TaskID[32];
]]></sourcecode>
        <t>The task ID <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>The VDAF which determines the type of measurements and the aggregation
function. The VDAF itself may have further parameters (e.g., number of buckets
in a <tt>Prio3Histogram</tt>).</t>
          </li>
          <li>
            <t>A URL relative to which the Leader's API resources can be found.</t>
          </li>
          <li>
            <t>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-modes-overview"/>), which determines
how reports are grouped into batches.</t>
          </li>
          <li>
            <t><tt>task_interval</tt> (<tt>Interval</tt>): Reports whose timestamp is outside of this
interval will be rejected by the Aggregators.</t>
          </li>
          <li>
            <t><tt>time_precision</tt> (<tt>Duration</tt>): Used to compute timestamps in DAP. See
<xref target="timestamps"/>.</t>
          </li>
        </ul>
        <t>The Leader and Helper API URLs <bcp14>MAY</bcp14> include arbitrary path components.</t>
        <t>In order to facilitate the aggregation and collection interactions, each of the
Aggregators is configured with the following parameters:</t>
        <ul spacing="normal">
          <li>
            <t><tt>min_batch_size</tt> (<tt>uint64</tt>): The smallest number of reports the batch is
allowed to include. A larger minimum batch size will yield a higher degree of
privacy. However, this ultimately depends on the application and the nature of
the measurements and aggregation function.</t>
          </li>
          <li>
            <t><tt>collector_hpke_config</tt> (<tt>HpkeConfig</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> (opaque byte string): 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 anchor="batch-modes-overview">
          <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" and the Aggregators
use this query to select a batch for aggregation.</t>
          <t>The task's batch mode defines both how reports are assigned into batches, how
these batches are addressed and the semantics of the query used for collection.
Regardless of batch mode, each report can only ever be part of a single batch.</t>
          <t><xref target="batch-modes"/> defines the <tt>time-interval</tt> and <tt>leader-selected</tt> batch modes
and discusses how new batch modes may be defined by future documents.</t>
          <t>The query is issued to the Leader by the Collector during the collection
interaction (<xref target="collect-flow"/>). Information used to guide batch selection is
conveyed from the Leader to the Helper when initializing aggregation jobs
(<xref target="aggregate-flow"/>) and finalizing the aggregate shares.</t>
        </section>
      </section>
      <section anchor="resource-urls">
        <name>Resource URLs</name>
        <t>DAP is defined in terms of HTTP resources, such as reports (<xref target="upload-flow"/>),
aggregation jobs (<xref target="aggregate-flow"/>), and collection jobs (<xref target="collect-flow"/>).
Each resource has a URL. Resource URLs are specified as string literals
containing 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 API URL of the
Leader and Helper respectively.</t>
          </li>
          <li>
            <t>Variables <tt>{task-id}</tt>, <tt>{aggregation-job-id}</tt>, <tt>{aggregate-share-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"/>), aggregate share ID (<xref target="collect-aggregate"/>)
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 URL
<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="agg-param-validation">
        <name>Aggregation Parameter Validation</name>
        <t>For each batch it collects, the Collector chooses an aggregation parameter used
to prepare the measurements before aggregating them. Before accepting a
collection job from the Collector (<xref target="collect-init"/>), the Leader checks that the
indicated aggregation parameter is valid according to the following procedure.</t>
        <ol spacing="normal" type="1"><li>
            <t>Decode the byte string <tt>agg_param</tt> into an <tt>AggParam</tt> as specified by the
VDAF. If decoding fails, then the aggregation parameter is invalid.</t>
          </li>
          <li>
            <t>Run <tt>vdaf.is_valid(decoded_agg_param, [])</tt>, where <tt>decoded_agg_param</tt> is the
decoded <tt>AggParam</tt> and <tt>is_valid()</tt> is as defined in <xref section="5.3" sectionFormat="of" target="VDAF"/>. If the output is not <tt>True</tt>, then the aggregation parameter is
invalid.</t>
          </li>
        </ol>
        <t>If both steps succeed, then the aggregation parameter is valid.</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 a GET to
<tt>{aggregator}/hpke_config</tt>.</t>
          <t>An Aggregator responds with an <tt>HpkeConfigList</tt>, with media type
"application/dap-hpke-config-list". The <tt>HpkeConfigList</tt> contains one or more
<tt>HpkeConfig</tt>s in decreasing order of preference. This allows an Aggregator to
support multiple HPKE configurations and multiple sets of algorithms
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;
uint16 HpkeKemId;
uint16 HpkeKdfId;
]]></sourcecode>
          <t>The possible values for <tt>HpkeAeadId</tt>, <tt>HpkeKemId</tt> and <tt>HpkeKdfId</tt> are as defined
in <xref section="7" sectionFormat="comma" target="HPKE"/>.</t>
          <t>Aggregators <bcp14>MUST</bcp14> allocate distinct <tt>id</tt> values for each <tt>HpkeConfig</tt> in an
<tt>HpkeConfigList</tt>.</t>
          <t>The Client <bcp14>MUST</bcp14> abort if:</t>
          <ul spacing="normal">
            <li>
              <t>the response is not a valid <tt>HpkeConfigList</tt>;</t>
            </li>
            <li>
              <t>the <tt>HpkeConfigList</tt> is empty; or</t>
            </li>
            <li>
              <t>no HPKE config advertised by the Aggregator specifies a supported KEM, KDF and
AEAD algorithm triple.</t>
            </li>
          </ul>
          <t>Aggregators <bcp14>SHOULD</bcp14> use caching to permit client-side caching of this resource
<xref target="RFC9111"/>. Aggregators can control cache lifetime with the Cache-Control
header, using a value appropriate to the lifetime of their keys. Aggregators
<bcp14>SHOULD</bcp14> favor long cache lifetimes to avoid frequent cache revalidation, e.g., on
the order of days.</t>
          <t>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 anchor="example">
            <name>Example</name>
            <sourcecode type="http"><![CDATA[
GET /leader/hpke_config
Host: example.com

HTTP/1.1 200
Content-Type: application/dap-hpke-config-list
Cache-Control: max-age=86400

encoded([
  struct {
    id = 194,
    kem_id = 0x0010,
    kdf_id = 0x0001,
    aead_id = 0x0001,
    public_key = [0x01, 0x02, 0x03, 0x04, ...],
  } HpkeConfig,
  struct {
    id = 17,
    kem_id = 0x0020,
    kdf_id = 0x0001,
    aead_id = 0x0003,
    public_key = [0x04, 0x03, 0x02, 0x01, ...],
  } HpkeConfig,
])
]]></sourcecode>
          </section>
        </section>
        <section anchor="upload-request">
          <name>Upload Request</name>
          <t>Clients upload reports by sending a POST to <tt>{leader}/tasks/{task-id}/reports</tt>.
The body 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> uniquely identifies the report. The Client <bcp14>MUST</bcp14> generate this
 by sampling 16 random bytes from a cryptographically secure random number
 generator.</t>
                </li>
                <li>
                  <t><tt>time</tt> is the truncated (see <xref target="timestamps"/>) time at which the report was
generated.</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. 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, 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-15" || task_id,
    measurement,
    report_id,
    rand,
)
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>task_id</tt> is the task ID.</t>
            </li>
            <li>
              <t><tt>measurement</tt> is the plaintext measurement, represented as the VDAF's
<tt>Measurement</tt> associated type.</t>
            </li>
            <li>
              <t><tt>report_id</tt> is the corresponding value from <tt>ReportMetadata</tt>, used as the
nonce.</t>
            </li>
            <li>
              <t><tt>rand</tt> is a random byte string of length specified by the VDAF. Each report's
<tt>rand</tt> <bcp14>MUST</bcp14> be independently sampled from a cryptographically secure random
number generator.</t>
            </li>
          </ul>
          <t>The sharding algorithm will return two input shares. The first is the Leader's
input share, and the second is the Helper's.</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>
          <ul spacing="normal">
            <li>
              <t><tt>private_extensions</tt> is the list of private report extensions for the given
 Aggregator (see <xref target="report-extensions"/>).</t>
            </li>
            <li>
              <t><tt>payload</tt> is the Aggregator's input share.</t>
            </li>
          </ul>
          <t>Next, the Client encrypts each <tt>PlaintextInputShare</tt> as follows:</t>
          <sourcecode type="pseudocode"><![CDATA[
enc, payload = SealBase(pk,
  "dap-15 input share" || 0x01 || server_role,
  input_share_aad, plaintext_input_share)
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>pk</tt> is the public key from the Aggregator's HPKE configuration.</t>
            </li>
            <li>
              <t><tt>0x01</tt> represents the <tt>Role</tt> of the sender (always the Client).</t>
            </li>
            <li>
              <t><tt>server_role</tt> is the <tt>Role</tt> of the recipient (<tt>0x02</tt> for the Leader and <tt>0x03</tt>
 for the Helper).</t>
            </li>
            <li>
              <t><tt>plaintext_input_share</tt> is the Aggregator's <tt>PlaintextInputShare</tt>.</t>
            </li>
            <li>
              <t><tt>input_share_aad</tt> is an encoded <tt>InputShareAad</tt>, constructed from the
corresponding fields in the report per the definition below.</t>
            </li>
          </ul>
          <t>The <tt>SealBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the Aggregator's 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>If the upload request is malformed, the Leader aborts with error
<tt>invalidMessage</tt>.</t>
          <t>If the Leader does not recognize the task ID, then it aborts with error
<tt>unrecognizedTask</tt>.</t>
          <t>If the Leader does not recognize the <tt>config_id</tt> in the encrypted input share,
it aborts with an error of type <tt>outdatedConfig</tt>. When the Client receives an
<tt>outdatedConfig</tt> error, it <bcp14>SHOULD</bcp14> invalidate any cached <tt>HpkeConfigList</tt> and
retry with a freshly generated <tt>Report</tt>. 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="replay-protection"/> for details). The Leader <bcp14>MAY</bcp14> also abort
with error <tt>reportRejected</tt>.</t>
          <t>The Leader <bcp14>MUST</bcp14> ignore any report whose timestamp is outside of the task's
<tt>time_interval</tt>. When it does so, it <bcp14>SHOULD</bcp14> also abort with error
<tt>reportRejected</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 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>MUST</bcp14> ignore the report and <bcp14>MAY</bcp14> abort with error <tt>unsupportedExtension</tt>.
If the Leader does abort for this reason, it <bcp14>SHOULD</bcp14> indicate the unsupported
extensions in the resulting problem document via an extension member (<xref section="3.2" sectionFormat="of" target="RFC9457"/>) <tt>unsupported_extensions</tt> on the problem document. This member
<bcp14>MUST</bcp14> contain an array of numbers 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 JSON 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>MUST</bcp14>
ignore the report and <bcp14>MAY</bcp14> abort with error <tt>invalidMessage</tt>.</t>
          <t>Validation of anti-replay and extensions is not mandatory during the handling of
upload requests to avoid blocking on storage transactions or decryption of input
shares. The Leader also cannot validate the Helper's extensions because it
cannot decrypt the Helper's input share. Validation of report IDs and extensions
will occur before aggregation.</t>
          <section anchor="example-1">
            <name>Example</name>
            <sourcecode type="http"><![CDATA[
POST /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/reports
Host: example.com
Content-Type: application/dap-report

encoded(struct {
  report_metadata = struct {
    report_id = [0x0a, 0x0b, 0x0c, 0x0d, ...],
    time = 1741986088,
    public_extensions = [0x00, 0x00],
  } ReportMetadata,
  public_share = [0x0a, 0x0b, ...],
  leader_encrypted_input-share = struct {
    config_id = 1,
    enc = [0x0f, 0x0e, 0x0d, 0x0c, ...],
    payload = [0x0b, 0x0a, 0x09, 0x08, ...],
  } HpkeCiphertext,
  helper_encrypted_input-share = struct {
    config_id = 2,
    enc = [0x0c, 0x0d, 0x0e, 0x0f, ...],
    payload = [0x08, 0x00, 0x0a, 0x0b, ...],
  } HpkeCiphertext,
} Report)

HTTP/1.1 200
]]></sourcecode>
          </section>
        </section>
        <section anchor="report-extensions">
          <name>Report Extensions</name>
          <t>Clients use report extensions to convey additional information to the
Aggregators. 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. For example, Clients may need to
authenticate to the Helper by presenting a secret that must not be revealed to
the Leader.</t>
          <t>Each extension is a tag-length encoded value of the 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 <tt>extension_type</tt> indicates the type of extension, and <tt>extension_data</tt>
contains the opaque encoding of the extension.</t>
          <t>Extensions are mandatory to implement. Unrecognized extensions are handled as
specified in <xref target="input-share-validation"/>.</t>
        </section>
      </section>
      <section anchor="aggregate-flow">
        <name>Verifying and Aggregating Reports</name>
        <t>Once some 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 is parallelized
across many "aggregation jobs" in which subsets of the reports are processed
independently. Each aggregation job is associated with a single task, but a task
can have many aggregation jobs.</t>
        <t>An aggregation job runs 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 each pair of output shares, when combined, corresponds 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"/>)
proves 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>Aggregation jobs are identified by 16-byte job ID:</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque AggregationJobID[16];
]]></sourcecode>
        <t>An aggregation job is an HTTP resource served by the Helper at the
URL <tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt>. VDAF
preparation is mapped onto an aggregation job as illustrated in <xref target="agg-flow"/>.
The first request from the Leader to the Helper 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>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="544" width="496" viewBox="0 0 496 544" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,80 L 8,112" fill="none" stroke="black"/>
                <path d="M 32,48 L 32,72" fill="none" stroke="black"/>
                <path d="M 32,112 L 32,320" fill="none" stroke="black"/>
                <path d="M 32,384 L 32,512" fill="none" stroke="black"/>
                <path d="M 80,80 L 80,112" fill="none" stroke="black"/>
                <path d="M 416,80 L 416,112" fill="none" stroke="black"/>
                <path d="M 464,112 L 464,320" fill="none" stroke="black"/>
                <path d="M 464,384 L 464,512" fill="none" stroke="black"/>
                <path d="M 488,80 L 488,112" fill="none" stroke="black"/>
                <path d="M 8,80 L 80,80" fill="none" stroke="black"/>
                <path d="M 416,80 L 488,80" fill="none" stroke="black"/>
                <path d="M 8,112 L 80,112" fill="none" stroke="black"/>
                <path d="M 416,112 L 488,112" fill="none" stroke="black"/>
                <path d="M 40,160 L 456,160" fill="none" stroke="black"/>
                <path d="M 40,208 L 456,208" fill="none" stroke="black"/>
                <path d="M 40,256 L 456,256" fill="none" stroke="black"/>
                <path d="M 40,304 L 456,304" fill="none" stroke="black"/>
                <path d="M 40,432 L 456,432" fill="none" stroke="black"/>
                <path d="M 40,480 L 456,480" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="472,512 460,506.4 460,517.6" fill="black" transform="rotate(90,464,512)"/>
                <polygon class="arrowhead" points="464,432 452,426.4 452,437.6" fill="black" transform="rotate(0,456,432)"/>
                <polygon class="arrowhead" points="464,256 452,250.4 452,261.6" fill="black" transform="rotate(0,456,256)"/>
                <polygon class="arrowhead" points="464,160 452,154.4 452,165.6" fill="black" transform="rotate(0,456,160)"/>
                <polygon class="arrowhead" points="48,480 36,474.4 36,485.6" fill="black" transform="rotate(180,40,480)"/>
                <polygon class="arrowhead" points="48,304 36,298.4 36,309.6" fill="black" transform="rotate(180,40,304)"/>
                <polygon class="arrowhead" points="48,208 36,202.4 36,213.6" fill="black" transform="rotate(180,40,208)"/>
                <polygon class="arrowhead" points="40,512 28,506.4 28,517.6" fill="black" transform="rotate(90,32,512)"/>
                <polygon class="arrowhead" points="40,72 28,66.4 28,77.6" fill="black" transform="rotate(90,32,72)"/>
                <g class="text">
                  <text x="48" y="36">report,</text>
                  <text x="120" y="36">agg_param</text>
                  <text x="44" y="100">Leader</text>
                  <text x="452" y="100">Helper</text>
                  <text x="132" y="132">AggregationJobInitReq:</text>
                  <text x="100" y="148">agg_param,</text>
                  <text x="184" y="148">prep_init</text>
                  <text x="376" y="180">AggregationJobResp:</text>
                  <text x="360" y="196">prep_resp(continue)</text>
                  <text x="148" y="228">AggregationJobContinueReq:</text>
                  <text x="112" y="244">prep_continue</text>
                  <text x="376" y="276">AggregationJobResp:</text>
                  <text x="360" y="292">prep_resp(continue)</text>
                  <text x="32" y="356">...</text>
                  <text x="464" y="356">...</text>
                  <text x="148" y="404">AggregationJobContinueReq:</text>
                  <text x="112" y="420">prep_continue</text>
                  <text x="376" y="452">AggregationJobResp:</text>
                  <text x="324" y="468">prep_resp(continue|finished)</text>
                  <text x="84" y="532">leader_out_share</text>
                  <text x="412" y="532">helper_out_share</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![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>
          </artset>
        </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>The Helper can either process each step synchronously, meaning it computes each
preparation step before producing a response to the Leader's HTTP request, or
asynchronously, meaning it responds immediately and defers 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 to choose a
model that best fits its architecture and use case. For instance replay checks
across vast numbers of reports and preparation of large histograms, may be
better suited for the asynchronous model.</t>
        <t>Aggregation cannot begin until the Collector specifies a query and an
aggregation parameter, except where eager aggregation (<xref target="eager-aggregation"/>) is
possible.</t>
        <t>An aggregation job has three phases:</t>
        <ul spacing="normal">
          <li>
            <t>Initialization: Disseminate report shares and initialize the VDAF prep state
for each report.</t>
          </li>
          <li>
            <t>Continuation: Exchange prep shares and messages until preparation completes or
an error occurs.</t>
          </li>
          <li>
            <t>Completion: Yield an output share for each report share in the aggregation
job.</t>
          </li>
        </ul>
        <t>After an aggregation job is completed, each Aggregator commits to the output
shares by updating running-total aggregate shares and other values for each
batch bucket associated with a prepared output share, as described in
<xref target="batch-buckets"/>. These values are stored until a batch that includes the batch
bucket is collected as described in <xref target="collect-flow"/>.</t>
        <t>The aggregation interaction provides protection against including reports in
more than one batch and against adding reports to already collected batches,
both of which can violate privacy (<xref target="replay-protection"/>). Before committing to
an output share, the Aggregators check whether its report ID has already been
aggregated and whether the batch bucket being updated has been collected.</t>
        <section anchor="eager-aggregation">
          <name>Eager Aggregation</name>
          <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.</t>
          <t>For example, Prio3 has just one valid aggregation parameter (the empty string),
and so allows for eager aggregation. Both the time-interval and leader-selected
batch modes defined in this document (<xref target="batch-modes"/>) allow for eager
aggregation, but future batch modes might preclude it.</t>
          <t>Even when the VDAF uses a non-empty aggregation parameter, there still might be
some applications in which the Aggregators can anticipate the parameter the
Collector will choose and begin aggregation.</t>
          <t>For example, when using Poplar1 (<xref section="8" sectionFormat="of" target="VDAF"/>), the Collector and
Aggregators might agree ahead of time on the set of candidate prefixes to use.
In such cases, it is important that Aggregators ensure that the parameter
eventually chosen by the Collector matches what they used. Depending on the
VDAF, aggregating reports with multiple aggregation parameters may impact
privacy. Aggregators must therefore ensure they only ever use the aggregation
parameter chosen by the Collector.</t>
        </section>
        <section anchor="agg-init">
          <name>Aggregate Initialization</name>
          <t>Aggregation initialization accomplishes two tasks:</t>
          <ol spacing="normal" type="1"><li>
              <t>Determine which report shares are valid.</t>
            </li>
            <li>
              <t>For each valid report share, initialize VDAF preparation (see <xref section="5.2" sectionFormat="of" target="VDAF"/>).</t>
            </li>
          </ol>
          <t>The Leader and Helper initialization behavior is detailed below.</t>
          <section anchor="leader-init">
            <name>Leader Initialization</name>
            <t>The Leader begins an aggregation job by choosing a set of candidate reports that
belong to the same task and a job ID which <bcp14>MUST</bcp14> be unique within the task.</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 fails, the Leader rejects the report
and removes it from the candidate set.</t>
            <t>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-15" || 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><tt>ping_pong_leader_init</tt> is defined in <xref section="5.7.1" sectionFormat="of" target="VDAF"/>. This process
determines the initial per-report <tt>state</tt>, as well as the initial <tt>outbound</tt>
message to the Helper. If <tt>state</tt> is of type <tt>Rejected</tt>, then the report is
rejected and removed from the candidate set, and no message is sent to the
Helper for this report.</t>
            <t>If <tt>state</tt> is of type <tt>Continued</tt>, then the Leader constructs a <tt>PrepareInit</tt>
message.</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.</t>
            <sourcecode type="tls-presentation"><![CDATA[
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 chosen by the Collector. Before
initializing an aggregation job, the Leader <bcp14>MUST</bcp14> validate the parameter as
described in <xref target="agg-param-validation"/>.</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. This field is called the "partial" batch selector because
depending on the batch mode, it may only partially determine a batch. See
<xref target="batch-modes"/>.</t>
              </li>
              <li>
                <t><tt>prepare_inits</tt>: the sequence of <tt>PrepareInit</tt> messages constructed in the
previous step.</t>
              </li>
            </ul>
            <t>The Leader sends the <tt>AggregationJobInitReq</tt> in the body of a PUT request to the
aggregation job with a media type of "application/dap-aggregation-job-init-req".</t>
            <t>The Leader <bcp14>MUST</bcp14> authenticate its requests to the Helper using a scheme that
meets the requirements in <xref target="request-authentication"/>.</t>
            <t>If the Helper responds with an <tt>AggregationJobResp</tt> (see
<xref target="aggregation-helper-init"/>), then the Leader proceeds onward. If the request
succeeds but the response body is empty, the Leader polls the aggregation job by
resolving the Location header field (<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>) against the
<tt>{helper}</tt> URL and sending GET requests to that URL until it receives an
<tt>AggregationJobResp</tt>. The Leader <bcp14>SHOULD</bcp14> use each response's Retry-After header
field (<xref section="10.2.3" sectionFormat="comma" target="RFC9110"/>) to decide when to try again.</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>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-15" || 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 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 commits <tt>out_share</tt> as described in <xref target="batch-buckets"/>. If commitment
fails, then the Leader rejects the report and removes it from the candidate
set.</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>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> in 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 for the
Leader to use to continue preparing the report.</t>
            <t>The Helper <bcp14>MAY</bcp14> defer handling the initialization request. In this case, it
indicates that the job is not yet ready by immediately sending an empty response
body and sets a Location header field (<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>) set to the
relative reference
<tt>/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}?step=0</tt>. The response
<bcp14>SHOULD</bcp14> include a Retry-After header field (<xref section="10.2.3" sectionFormat="comma" target="RFC9110"/>) to
suggest a polling interval to the Leader. The Leader then polls the state of the
job by sending GET requests to the resolved URL. The Helper responds the same
way until either the job is ready, from which point it responds with the
<tt>AggregationJobResp</tt> (defined below), or the job fails, from which point it <bcp14>MUST</bcp14>
abort with the error that caused the failure.</t>
            <t>The Helper <bcp14>MAY</bcp14> instead handle the request immediately. It waits to respond to
the Leader's PUT until the aggregation job initialization is ready, in which
case it responds with the<tt>AggregationJobResp</tt>, or the job fails, in which case
the Helper <bcp14>MUST</bcp14> abort with the error that caused the failure.</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> fail the job with error <tt>unrecognizedTask</tt>.</t>
            <t>Next, it checks that the batch mode indicated by
<tt>part_batch_selector.batch_mode</tt> matches the task's batch mode. If not, the
Helper <bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
            <t>Next, the Helper checks that the aggregation parameter is valid as described in
<xref target="agg-param-validation"/>. If the aggregation parameter is invalid, then the
Helper <bcp14>MUST</bcp14> fail the job with error <tt>invalidAggregationParameter</tt>.</t>
            <t>Next, the Helper checks that the report IDs in
<tt>AggregationJobInitReq.prepare_inits</tt> are all distinct. If not, then the Helper
<bcp14>MUST</bcp14> fail the job 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>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:</t>
            <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_helper_init(
    vdaf_verify_key,
    "dap-15" || task_id,
    agg_param,
    report_id,
    public_share,
    plaintext_input_share.payload)
]]></sourcecode>
            <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>, then the Helper commits to <tt>out_share</tt> as
described in <xref target="batch-buckets"/>. If commitment fails with some <tt>ReportError</tt>
(e.g., the report was replayed or its batch bucket was collected), then instead
of the <tt>continue</tt> response above, the Helper responds with</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  ReportError report_error = commit_error;
} PrepareResp;
]]></sourcecode>
            <t>Once the Helper has constructed a <tt>PrepareResp</tt> for each report, the aggregation
job response is ready. Its results are represented by an <tt>AggregationJobResp</tt>,
which is structured as follows:</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  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>. The media type for
<tt>AggregationJobResp</tt> is "application/dap-aggregation-job-resp".</t>
            <t>Changing an aggregation job's parameters is illegal. If the Helper receives
further PUT requests to the aggregation job with a different
<tt>AggregationJobInitReq</tt> in the body, it <bcp14>MUST</bcp14> abort with a client error. 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>.</t>
            <t>It is illegal to rewind or reset the state of an aggregation job. If the Helper
receives requests to initialize an aggregation job once it has been continued at
least once (see <xref target="agg-continue-flow"/>), it <bcp14>MUST</bcp14> abort with a client error.</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 attempts
decryption of the payload with the following procedure:</t>
            <sourcecode type="pseudocode"><![CDATA[
plaintext_input_share = OpenBase(encrypted_input_share.enc, sk,
  "dap-15 input share" || 0x01 || server_role,
  input_share_aad, encrypted_input_share.payload)
]]></sourcecode>
            <ul spacing="normal">
              <li>
                <t><tt>sk</tt> is the secret key from the HPKE configuration indicated by
<tt>encrypted_input_share.config_id</tt></t>
              </li>
              <li>
                <t><tt>0x01</tt> represents the Role of the sender (always the Client)</t>
              </li>
              <li>
                <t><tt>server_role</tt> is the Role of the recipient Aggregator (<tt>0x02</tt> for the Leader
and <tt>0x03</tt> for the Helper).</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>
            <t>If the HPKE configuration ID is unrecognized or 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>Before initialization, Aggregators are required to perform the following checks
for each input share in the job:</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 that the report's timestamp is well-formed as specified in
<xref target="timestamps"/>. If not, the Aggregator <bcp14>MUST</bcp14> mark the input share as invalid
with error <tt>invalid_message</tt>.</t>
              </li>
              <li>
                <t>Check if the report's timestamp is more than a few minutes ahead of the
current time. If so, then the Aggregator <bcp14>SHOULD</bcp14> mark the input share as
invalid with error <tt>report_too_early</tt>.</t>
              </li>
              <li>
                <t>Check if the report's timestamp is before the task's <tt>task_interval</tt>. 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 after the task's <tt>task_interval</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 extensions have the same extension type across public and
private extension fields. If so, the Aggregator <bcp14>MUST</bcp14> mark the input share as
invalid with error <tt>invalid_message</tt>.</t>
              </li>
              <li>
                <t>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>.  </t>
                <t>
For example, the report timestamp may be so far in the past that the state
required to perform the check has been evicted from the Aggregator's storage.
See <xref target="sharding-storage"/> for details.</t>
              </li>
            </ol>
            <t>If all of the above checks succeed, the input share is valid.</t>
          </section>
          <section anchor="example-2">
            <name>Example</name>
            <t>The Helper handles the aggregation job initialization synchronously:</t>
            <sourcecode type="http"><![CDATA[
PUT /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/dap-aggregation-job-init-req
Authorization: Bearer auth-token

encoded(struct {
  agg_param = [0x00, 0x01, 0x02, 0x04, ...],
  part_batch_selector = struct {
    batch_mode = BatchMode.leader_selected,
    config = encoded(struct {
      batch_id = [0x1f, 0x1e, ..., 0x00],
    } LeaderSelectedPartialBatchSelectorConfig),
  } PartialBatchSelector,
  prepare_inits,
} AggregationJobInitReq)

HTTP/1.1 200
Content-Type: application/dap-aggregation-job-resp

encoded(struct { prepare_resps } AggregationJobResp)
]]></sourcecode>
            <t>Or asynchronously:</t>
            <sourcecode type="http"><![CDATA[
PUT /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/dap-aggregation-job-init-req
Authorization: Bearer auth-token

encoded(struct {
  agg_param = [0x00, 0x01, 0x02, 0x04, ...],
  part_batch_selector = struct {
    batch_mode = BatchMode.time_interval,
    config = encoded(Empty),
  },
  prepare_inits,
} AggregationJobInitReq)

HTTP/1.1 200
Location: /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA?step=0
Retry-After: 300

GET /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA?step=0
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
Location: /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA?step=0
Retry-After: 300

GET /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA?step=0
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
Content-Type: application/dap-aggregation-job-resp

encoded(struct { prepare_resps } AggregationJobResp)
]]></sourcecode>
          </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 set until the underlying VDAF moves into a terminal state,
yielding an output share for each Aggregator or a rejection.</t>
          <t>Continuation is only required for VDAFs that require more than one round. Single
round VDAFs like Prio3 will never reach this phase.</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 to the aggregation job 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 request to the
aggregation job, omitting any reports that were rejected.</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>If the Helper responds with an <tt>AggregationJobResp</tt> (see
<xref target="aggregation-helper-init"/>), then the Leader proceeds onward. If the request
succeeds but the response body is empty, the Leader polls the aggregation job by
resolving the Location header field (<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>) against the
<tt>{helper}</tt> URL and sending GET requests to that URL until it receives an
<tt>AggregationJobResp</tt>. The Leader <bcp14>SHOULD</bcp14> use each response's Retry-After header
field (<xref section="10.2.3" sectionFormat="comma" target="RFC9110"/>) to decide when to try again.</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 <tt>state</tt> is
<tt>Continued(prep_state)</tt>, then the Leader computes  </t>
                <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_continued(
    "dap-15" || 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 the Leader commits to
<tt>out_share</tt> as described in <xref target="batch-buckets"/>. If commitment fails, then the
Leader rejects the report and removes it from the candidate set.</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>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 continuation with a <tt>state</tt> object for each report in the
candidate set, which will all be of type <tt>Continued(prep_state)</tt>. The Helper
then waits for the Leader to POST an <tt>AggregationJobContinueReq</tt> to an
aggregation job.</t>
            <t>The Helper <bcp14>MAY</bcp14> defer handling the continuation request. In this case, it
indicates that the job continuation is not yet ready by immediately sending an
empty response body and sets the Location header field (<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>) to the relative reference
<tt>/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}?step={step}</tt>, where
<tt>step</tt> is set to <tt>AggregationJobContinueReq.step</tt>. The response <bcp14>SHOULD</bcp14> include a
Retry-After header field (<xref section="10.2.3" sectionFormat="comma" target="RFC9110"/>) to suggest a polling
interval to the Leader. The Leader then polls the state of the job by sending
GET requests to the resolved URL. The Helper responds the same way until either
the job is ready, from which point it responds with the <tt>AggregationJobResp</tt>, or
the job fails, from which point it <bcp14>MUST</bcp14> abort with the error that caused the
failure.</t>
            <t>The Helper <bcp14>MAY</bcp14> instead handle the request immediately. It waits to respond to
the Leader's POST until the aggregation job continuation is ready, in which
case it responds with the <tt>AggregationJobResp</tt>, or the job fails, in which case
it <bcp14>MUST</bcp14> abort with the error that caused the failure.</t>
            <t>Next, it checks that it recognizes the task ID. If not, then it <bcp14>MUST</bcp14> fail the
job with error <tt>unrecognizedTask</tt>.</t>
            <t>Next, it checks if it recognizes the indicated aggregation job ID. If not, it
<bcp14>MUST</bcp14> fail the job with error <tt>unrecognizedAggregationJob</tt>.</t>
            <t>Next, the Helper checks that:</t>
            <ol spacing="normal" type="1"><li>
                <t><tt>AggregationJobContinueReq.step</tt> is not equal to <tt>0</tt></t>
              </li>
              <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>
            </ol>
            <t>If any of these checks fail, then the Helper <bcp14>MUST</bcp14> fail the job 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> fail the job with error
<tt>invalidMessage</tt>. A report may be missing, in which case the Helper assumes the
Leader rejected it and removes it from the candidate set.</t>
            <t>Next, the Helper checks the continuation step indicated by the request. If the
<tt>step</tt> value is one greater than the job's current step, then the Helper
proceeds.</t>
            <t>If it is equal to the current step (e.g., the Leader has resent the previous
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"/>).</t>
            <t>If the Helper does not wish to attempt recovery, or if the step has some other
value, the Helper <bcp14>MUST</bcp14> fail the job 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-15" || 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 commits <tt>out_share</tt> as described
in <xref target="batch-buckets"/>. If commitment fails with some <tt>ReportError</tt> (e.g., the
report was replayed or its batch bucket was collected), then the Helper responds
with</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  ReportError report_error = commit_error;
} PrepareResp;
]]></sourcecode>
            <t>If commitment succeeds, 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>Once the Helper has computed a <tt>PrepareResp</tt> for every report, the aggregation
job response is ready. It is represented by 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>
          </section>
          <section anchor="batch-buckets">
            <name>Batch Buckets</name>
            <t>When aggregation refines an output share, it must be stored into an appropriate
"batch bucket", which is defined in this section. An output share cannot be
removed from a batch bucket once stored, so we say that the Aggregator <em>commits</em>
the output share. 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>An aggregate share, as defined by the <xref target="VDAF"/> in use.</t>
              </li>
              <li>
                <t>The number of reports included in the batch bucket.</t>
              </li>
              <li>
                <t>A 32-byte checksum value, as defined below.</t>
              </li>
            </ul>
            <t>Aggregators <bcp14>MUST</bcp14> check the following conditions before committing an output
share:</t>
            <ul spacing="normal">
              <li>
                <t>If the batch bucket has been collected, the Aggregator <bcp14>MUST</bcp14> mark the report
invalid with error <tt>batch_collected</tt>.</t>
              </li>
              <li>
                <t>If the report ID associated with <tt>out_share</tt> has been aggregated in the task,
the Aggregator <bcp14>MUST</bcp14> mark the report invalid with error <tt>report_replayed</tt>.</t>
              </li>
            </ul>
            <t>Aggregators may perform these checks at any time before commitment (i.e., during
either aggregation initialization or continuation).</t>
            <t>The following procedure is used to commit an output share <tt>out_share</tt> to a batch
bucket:</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>
              <li>
                <t>Store <tt>out_share</tt>'s report ID for future replay checks.</t>
              </li>
            </ul>
            <t>This section describes a single set of values associated with each batch bucket.
However, implementations are free to shard batch buckets, combining them back
into a single set of values when reading the batch bucket. The aggregate shares
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>
            <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
conveyed in these messages. Queries must satisfy the criteria defined by their
batch mode (<xref target="batch-modes"/>). 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>
          </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 preparation. 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 ofrecovery 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 aggregation step skew recovery, 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 achieve 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 anchor="example-3">
            <name>Example</name>
            <t>The Helper handles the aggregation job continuation synchronously:</t>
            <sourcecode type="http"><![CDATA[
POST /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/dap-aggregation-job-continue-req
Authorization: Bearer auth-token

encoded(struct {
  step = 1,
  prepare_continues,
} AggregationJobContinueReq)

HTTP/1.1 200
Content-Type: application/dap-aggregation-job-resp

encoded(struct { prepare_resps } AggregationJobResp)
]]></sourcecode>
            <t>Or asynchronously:</t>
            <sourcecode type="http"><![CDATA[
POST /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/dap-aggregation-job-continue-req
Authorization: Bearer auth-token

encoded(struct {
  step = 1,
  prepare_continues,
} AggregationJobContinueReq)

HTTP/1.1 200
Location: /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA?step=1
Retry-After: 300

GET /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA?step=1
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
Location: /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA?step=1
Retry-After: 300

GET /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA?step=1
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
Content-Type: application/dap-aggregation-job-resp

encoded(struct { prepare_resps } AggregationJobResp)
]]></sourcecode>
          </section>
        </section>
        <section anchor="aggregation-job-deletion">
          <name>Aggregation Job Deletion</name>
          <t>If for whatever reason, the Leader must abandon an aggregation job, it <bcp14>SHOULD</bcp14>
let the Helper know it can clean up its state by sending a DELETE request to the
job.</t>
          <section anchor="example-4">
            <name>Example</name>
            <sourcecode type="http"><![CDATA[
DELETE /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="collect-flow">
        <name>Collecting Results</name>
        <t>The Collector initiates this phase with a query to the Leader (<xref target="batch-modes"/>),
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 process is referred
to as a "collection job" and 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>Collection jobs are identified by a 16-byte job ID:</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque CollectionJobID[16];
]]></sourcecode>
        <t>A collection job is an HTTP resource served by the Leader at the URL
<tt>{leader}/tasks/{task-id}/collection_jobs/{collection-job-id}</tt>.</t>
        <section anchor="collect-init">
          <name>Collection Job Initialization</name>
          <t>First, the Collector chooses a collection job ID, which <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 the
collection job with media type "application/dap-collection-job-req", and a body
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>
          <ul spacing="normal">
            <li>
              <t><tt>query</tt>, the Collector's query. The content of this field depends on the
indicated batch mode (<xref target="batch-modes"/>).</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.</t>
          <t>The Leader <bcp14>MAY</bcp14> defer handling the collection request. In this case, it indicates
that the collection job is not yet ready by immediately sending an empty
response body. The Leader <bcp14>SHOULD</bcp14> include a Retry-After header field (<xref section="10.2.3" sectionFormat="comma" target="RFC9110"/>) to suggest a polling interval to the Collector. The Collector
then polls the state of the job by sending GET requests to the collection job.
The Collector <bcp14>SHOULD</bcp14> use each response's Retry-After header field to decide when
to try again. The Leader responds the same way until either the job is ready,
from which point it responds with a <tt>CollectionJobResp</tt> (defined below), or the
job fails, from which point the Leader <bcp14>MUST</bcp14> abort with the error that caused the
failure.</t>
          <t>The Leader <bcp14>MAY</bcp14> instead handle the request immediately. It waits to respond to
the Collector's PUT until the collection job is ready, in which case it responds
with the <tt>CollectionJobResp</tt>, or the job fails, in which case the Leader <bcp14>MUST</bcp14>
abort with the error that caused the failure.</t>
          <t>If the job fails with <tt>invalidBatchSize</tt>, then the Collector <bcp14>MAY</bcp14> retry it later,
once it believes enough new reports have been uploaded and aggregated to allow
the collection job to succeed.</t>
          <t>The Leader begins handling a <tt>CollectionJobReq</tt> by checking that it recognizes
the task ID. If not, it <bcp14>MUST</bcp14> fail the collection job with error
<tt>unrecognizedTask</tt>.</t>
          <t>Next, the Leader checks that the indicated batch mode matches the task's batch
mode. If not, it <bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
          <t>Next, the Leader checks that the aggregation parameter is valid as described in
<xref target="agg-param-validation"/>. If not, it <bcp14>MUST</bcp14> fail the job with error
<tt>invalidAggregationParameter</tt>.</t>
          <t>The Leader then checks whether the <tt>Query</tt> in the Collector's request determines
a batch that can be collected. If the query does not identify a valid set of
batch buckets according to the criteria defined by the batch mode in use
(<xref target="batch-modes"/>), then the Leader <bcp14>MUST</bcp14> fail the job with error <tt>batchInvalid</tt>.</t>
          <t>If any of the batch buckets identified by the query have already been collected,
then the Leader <bcp14>MUST</bcp14> fail the job with error <tt>batchOverlap</tt>.</t>
          <t>If aggregation is performed eagerly (<xref target="eager-aggregation"/>), then the Leader
checks that the aggregation parameter received in the <tt>CollectionJobReq</tt> matches
the aggregation parameter used in each aggregation job pertaining to the batch.
If not, the Leader <bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
          <t>Having validated the <tt>CollectionJobReq</tt>, the Leader begins working with the
Helper to aggregate the reports satisfying the query (or continues this process,
depending on whether the Leader is aggregating eagerly; <xref target="eager-aggregation"/>)
as described in <xref target="aggregate-flow"/>.</t>
          <t>If the Leader has a pending aggregation job that overlaps with the batch 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 batch mismatch
errors.</t>
          <t>If the number of validated reports in the batch is not equal to or greater than
the task's minimum batch size, then the Leader <bcp14>SHOULD</bcp14> wait for more reports to
be uploaded and aggregated and try the collection job again later. The Leader
<bcp14>MAY</bcp14> give up on the collection job (for example, if it decides that no new
reports satisfying the query are likely to ever arrive), in which case it <bcp14>MUST</bcp14>
fail the job with error <tt>invalidBatchSize</tt>.</t>
          <t>Once the Leader has validated the collection job and run to completion all the
aggregation jobs that pertain to it, it obtains the Helper's aggregate share
following the aggregate-share request flow described in <xref target="collect-aggregate"/>.
If obtaining the aggregate share fails, then the Leader <bcp14>MUST</bcp14> fail the collection
job with the error that caused the failure.</t>
          <t>Once the Leader has the Helper's aggregate share and has computed its own, the
collection job is ready. Its results are represented by a <tt>CollectionJobResp</tt>,
which is structured as follows:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  PartialBatchSelector part_batch_selector;
  uint64 report_count;
  Interval interval;
  HpkeCiphertext leader_encrypted_agg_share;
  HpkeCiphertext helper_encrypted_agg_share;
} CollectionJobResp;
]]></sourcecode>
          <t>A <tt>CollectionJobResp</tt>'s media type is "application/dap-collection-job-resp". The
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. 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>Once the <tt>Leader</tt> has constructed a <tt>CollectionJobResp</tt> for the Collector, the
Leader considers the batch to be collected, and further aggregation jobs <bcp14>MUST
NOT</bcp14> commit more reports to the batch (see <xref target="batch-buckets"/>).</t>
          <t>Changing a collection job's parameters is illegal, so if there are further PUT
requests to the collection job with a different <tt>CollectionJobReq</tt>, the Leader
<bcp14>MUST</bcp14> abort with error <tt>invalidMessage</tt>.</t>
          <section anchor="example-5">
            <name>Example</name>
            <t>The Leader handles the collection job request synchronously:</t>
            <sourcecode type="http"><![CDATA[
PUT /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/collection_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/dap-collection-job-req
Authorization: Bearer auth-token

encoded(struct {
  query = struct {
    batch_mode = BatchMode.leader_selected,
    query = encoded(Empty),
  } Query,
  agg_param = [0x00, 0x01, ...],
} CollectionJobReq)

HTTP/1.1 200
Content-Type: application/dap-collection

encoded(struct {
  part_batch_selector = struct {
    batch_mode = BatchMode.leader_selected,
    config = encoded(struct {
      batch_id = [0x1f, 0x1e, ..., 0x00],
    } LeaderSelectedPartialBatchSelectorConfig),
  } PartialBatchSelector,
  report_count = 1000,
  interval = struct {
    start = 1659544000,
    duration = 1000,
  } Interval,
  leader_encrypted_agg_share = struct { ... } HpkeCiphertext,
  helper_encrypted_agg_share = struct { ... } HpkeCiphertext,
} CollectionJobResp)
]]></sourcecode>
            <t>Or asynchronously:</t>
            <sourcecode type="http"><![CDATA[
PUT /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/collection_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/dap-collection-job-req
Authorization: Bearer auth-token

encoded(struct {
  query = struct {
    batch_mode = BatchMode.time_interval,
    query = encoded(struct {
      batch_interval = struct {
        start = 1659544000,
        duration = 10000,
      } Interval,
    } TimeIntervalQueryConfig),
  },
  agg_param = encoded(Empty),
} CollectionJobReq)

HTTP/1.1 200
Retry-After: 300

GET /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/collection_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
Retry-After: 300

GET /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/collection_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
Content-Type: application/dap-collection

encoded(struct {
  part_batch_selector = struct {
    batch_mode = BatchMode.time_interval,
    config = encoded(struct {
      interval = struct {
        start = 1659544000,
        duration = 10000,
      } Interval,
    } TimeIntervalBatchSelectorConfig)
  },
  report_count = 4000,
  interval = struct {
    start = 1659547000,
    duration = 1000,
  } Interval,
  leader_encrypted_agg_share = struct { ... } HpkeCiphertext,
  helper_encrypted_agg_share = struct { ... } HpkeCiphertext,
} CollectionJobResp)
]]></sourcecode>
          </section>
        </section>
        <section anchor="collection-job-deletion">
          <name>Collection Job Deletion</name>
          <t>The Collector can send a 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>
          <t>Collectors <bcp14>MUST</bcp14> authenticate their requests to Leaders using a scheme that meets
the requirements in <xref target="request-authentication"/>.</t>
          <section anchor="example-6">
            <name>Example</name>
            <sourcecode type="http"><![CDATA[
DELETE /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/collection_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
]]></sourcecode>
          </section>
        </section>
        <section anchor="collect-aggregate">
          <name>Obtaining Aggregate Shares</name>
          <t>The Leader must compute its own aggregate share and obtain 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 Leader 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>A Helper aggregate share is identified by a 16-byte ID:</t>
          <sourcecode type="tls-presentation"><![CDATA[
opaque AggregateShareID[16];
]]></sourcecode>
          <t>The Helper's aggregate share is an HTTP resource served by the Helper at the URL
<tt>{helper}/tasks/{task-id}/aggregate_shares/{aggregate-share-id}</tt>. To obtain it,
the Leader first chooses an aggregate share ID, which <bcp14>MUST</bcp14> be unique within the
scope of the corresponding DAP task.</t>
          <t>Then the Leader sends a PUT request to the aggregate share with the body:</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 <tt>AggregateShareReq</tt> is "application/dap-aggregate-share-req".
The structure 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 (see <xref target="batch-modes"/>.</t>
            </li>
            <li>
              <t><tt>agg_param</tt>: The encoded aggregation parameter for the VDAF being executed.</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>The Helper <bcp14>MAY</bcp14> defer handling the aggregate share request. In this case, it
indicates that the aggregate share is not yet ready by immediately sending an
empty response body. The Helper <bcp14>SHOULD</bcp14> include a Retry-After header field
(<xref section="10.2.3" sectionFormat="comma" target="RFC9110"/>) to suggest a polling interval to the Leader. The
Leader then polls the state of the job by sending GET requests to the aggregate
share. The Leader <bcp14>SHOULD</bcp14> use each response's Retry-After header field to decide
when to try again. The Helper responds the same way until either the share is
ready, from which point it responds with the <tt>AggregateShare</tt> (defined below),
or the job fails, from which point it <bcp14>MUST</bcp14> abort with the error that caused the
failure.</t>
          <t>The Helper <bcp14>MAY</bcp14> instead handle the request immediately. It waits to respond to
the Leader's PUT until the aggregate share is ready, in which case, it responds
with the <tt>AggregateShare</tt> (defined below), or the job fails, in which case it
<bcp14>MUST</bcp14> abort with the error that caused the failure.</t>
          <t>The Helper first ensures that it recognizes the task ID. If not, it <bcp14>MUST</bcp14> fail
the job with error <tt>unrecognizedTask</tt>.</t>
          <t>The indicated batch mode <bcp14>MUST</bcp14> match the task's batch mode. If not, the Helper
<bcp14>MUST</bcp14> fail the job with <tt>invalidMessage</tt>.</t>
          <t>The Helper then verifies that the <tt>BatchSelector</tt> in the Leader's request
determines a batch that can be collected. If the selector does not identify a
valid set of batch buckets according to the criteria defined by the batch mode
in use (<xref target="batch-modes"/>), then the Helper <bcp14>MUST</bcp14> fail the job with error
<tt>batchInvalid</tt>.</t>
          <t>If any of the batch buckets identified by the selector have already been
collected, then the Helper <bcp14>MUST</bcp14> fail the job with error <tt>batchOverlap</tt>.</t>
          <t>If the number of validated reports in the batch is not equal to or greater than
the task's minimum batch size, then the Helper <bcp14>MUST</bcp14> abort with
<tt>invalidBatchSize</tt>.</t>
          <t>The aggregation parameter <bcp14>MUST</bcp14> match the aggregation parameter used in
aggregation jobs pertaining to this batch. If not, the Helper <bcp14>MUST</bcp14> fail the job
with error <tt>invalidMessage</tt>.</t>
          <t>Next, the Helper retrieves and combines the batch buckets associated with the
request using the same process used by the Leader (described at the beginning of
this section), arriving at its 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> fail the job with error
<tt>batchMismatch</tt>.</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>Once the Helper has encrypted its aggregate share, the aggregate share job is
ready. Its results are represented by 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>After receiving the Helper's response, the Leader includes the HpkeCiphertext in
its response to the Collector (see <xref target="collect-finalization"/>).</t>
          <t>Once an <tt>AggregateShareReq</tt> has been constructed for the batch determined by a
given query, the Helper considers the batch to be collected. The Helper <bcp14>MUST NOT</bcp14>
commit any more output shares to the batch. It is an error for the Leader to
issue any more aggregation jobs for additional reports that satisfy the query.
These reports <bcp14>MUST</bcp14> be rejected by the Helper as described in <xref target="batch-buckets"/>.</t>
          <t>Changing an aggregate share's parameters is illegal, so if there are further PUT
requests to the aggregate share with a different <tt>AggregateShareReq</tt>, the Helper
<bcp14>MUST</bcp14> abort with error <tt>invalidMessage</tt>.</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 anchor="example-7">
            <name>Example</name>
            <t>The Helper handles the aggregate share request synchronously:</t>
            <sourcecode type="http"><![CDATA[
PUT /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregate_shares/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/dap-aggregate-share-req
Authorization: Bearer auth-token

encoded(struct {
  batch_selector = struct {
    batch_mode = BatchMode.time_interval,
    config = encoded(struct {
      batch_interval = struct {
        start = 1659544000,
        duration = 10000,
      } Interval,
    } TimeIntervalBatchSelectorConfig),
  } BatchSelector,
  agg_param = [0x00, 0x01, ...],
  report_count = 1000,
  checksum = [0x0a, 0x0b, ..., 0x0f],
} AggregateShareReq)

HTTP/1.1 200
Content-Type: application/dap-aggregate-share

encoded(struct {
  encrypted_aggregate_share = struct { ... } HpkeCiphertext,
} AggregateShare)
]]></sourcecode>
            <t>Or asynchronously:</t>
            <sourcecode type="http"><![CDATA[
PUT /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregate_shares/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/dap-aggregate-share-req
Authorization: Bearer auth-token

encoded(struct {
  batch_selector = struct {
    batch_mode = BatchMode.time_interval,
    config = encoded(struct {
      batch_interval = struct {
        start = 1659544000,
        duration = 10000,
      } Interval,
    } TimeIntervalBatchSelectorConfig),
  } BatchSelector,
  agg_param = [0x00, 0x01, ...],
  report_count = 1000,
  checksum = [0x0a, 0x0b, ..., 0x0f],
} AggregateShareReq)

HTTP/1.1 200
Retry-After: 300

GET /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregate_shares/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
Retry-After: 300

GET /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregate_shares/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
Content-Type: application/dap-aggregate-share

encoded(struct {
  encrypted_aggregate_share = struct { ... } HpkeCiphertext,
} AggregateShare)
]]></sourcecode>
          </section>
        </section>
        <section anchor="aggregate-share-deletion">
          <name>Aggregate Share Deletion</name>
          <t>The Leader can send a DELETE request to the aggregate share, which indicates to
the Helper that it can abandon the aggregate share and discard all state related
to it.</t>
          <t>Leaders <bcp14>MUST</bcp14> authenticate their requests to Helpers using a scheme that meets
the requirements in <xref target="request-authentication"/>.</t>
          <section anchor="example-8">
            <name>Example</name>
            <sourcecode type="http"><![CDATA[
DELETE /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregate_shares/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
]]></sourcecode>
          </section>
        </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.</t>
          <t>Let <tt>leader_agg_share</tt> denote the Leader's aggregate share, <tt>helper_agg_share</tt>
denote the Helper's aggregate share, <tt>report_count</tt> denote the report count sent
by the Leader, and <tt>agg_param</tt> denote 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-15 aggregate share" || server_role || 0x00,
    agg_share_aad,
    agg_share)
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>pk</tt> is the Collector's HPKE public key</t>
            </li>
            <li>
              <t><tt>server_role</tt> is the Role of the encrypting server (<tt>0x02</tt> for the Leader and
<tt>0x03</tt> for a Helper)</t>
            </li>
            <li>
              <t><tt>0x00</tt> represents the Role of the recipient (always the Collector)</t>
            </li>
            <li>
              <t><tt>agg_share_aad</tt> is an <tt>AggregateShareAad</tt> (defined below).</t>
            </li>
          </ul>
          <t>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-15 aggregate share" || server_role || 0x00,
    agg_share_aad,
    enc_share.payload)
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>sk</tt> is the HPKE secret key</t>
            </li>
            <li>
              <t><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)</t>
            </li>
            <li>
              <t><tt>0x00</tt> represents the Role of the recipient (always the Collector)</t>
            </li>
            <li>
              <t><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>
            </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>
    </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>In protocol messages, batch modes are identified with a <tt>BatchMode</tt> value:</t>
      <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0),
  time_interval(1),
  leader_selected(2),
  (255)
} BatchMode;
]]></sourcecode>
      <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</t>
        </li>
      </ol>
      <section anchor="time-interval-batch-mode">
        <name>Time Interval</name>
        <t>The time-interval batch mode is designed to support applications in which
reports are grouped by an interval of time. The Collector specifies a "batch
interval" into which report timestamps must fall.</t>
        <t>The Collector can issue queries whose batch intervals are continuous,
monotonically increasing, and have the same duration. For example, the following
sequence of batch intervals satisfies these conditions:</t>
        <sourcecode type="tls-presentation"><![CDATA[
[
  struct {
    start = 1659544000,
    duration = 1000,
  } Interval,
  struct {
    start = 1659545000,
    duration = 1000,
  } Interval,
  struct {
    start = 1659546000,
    duration = 1000,
  } Interval,
  struct {
    start = 1659547000,
    duration = 1000,
  } Interval,
]
]]></sourcecode>
        <t>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. The
interval <bcp14>MUST</bcp14> be well-formed as specified in <xref target="timestamps"/>. Otherwise, the
query does not specify a set of valid batch buckets.</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 <tt>Interval</tt> 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</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  start = 1729629000,
  duration = 1000,
} Interval
]]></sourcecode>
          <t>The <tt>Query</tt> received by the Leader or <tt>BatchSelector</tt> received by the Helper
determines a valid set of batch bucket identifiers if the batch interval's
duration is greater than or equal to the task's <tt>time_precision</tt>.</t>
          <t>A batch consists of a sequence of contiguous batch buckets. That is, the set of
batch bucket identifiers for the batch interval is</t>
          <sourcecode type="tls-presentation"><![CDATA[
[
  struct {
    start = batch_interval.start,
    duration = time_precision,
  } Interval,
  struct {
    start = batch_interval.start + time_precision,
    duration = time_precision,
  } Interval,
  ...
  struct {
    start = batch_interval.start + batch_interval.duration - time_precision,
    duration = time_precision,
  } Interval,
]
]]></sourcecode>
        </section>
      </section>
      <section anchor="leader-selected-batch-mode">
        <name>Leader-selected Batch Mode</name>
        <t>The leader-selected batch mode is used when it is acceptable for the Leader to
arbitrarily batch reports. Each batch is identified by an opaque "batch ID"
chosen by the Leader, which <bcp14>MUST</bcp14> be unique in the scope of the task.</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque BatchID[32];
]]></sourcecode>
        <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 for the next
available batch. The Leader selects a recent batch to aggregate which <bcp14>MUST NOT</bcp14>
yet have been associated with a collection job.</t>
        <t>The Aggregators can output batches of any size that is larger than or equal to
the task's minimum batch size. 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. 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>
            <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>
            <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="sharding-storage">
          <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 bucket i.e., the 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 for queries to respect bucket boundaries. See <xref target="batch-modes"/>.</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 is not after this task's <tt>task_interval</tt>. Aggregators <bcp14>MAY</bcp14> delete
the task and all data pertaining to this task after the <tt>task_interval</tt>.
Implementors <bcp14>SHOULD</bcp14> provide for some leeway so the Collector can collect the
batch after some delay.</t>
        </section>
        <section anchor="distributed-systems">
          <name>Distributed-systems and Synchronization Concerns</name>
          <t>Various parts of a DAP implementation will need to synchronize in order to
ensure correctness during concurrent operation. This section describes the
relevant concerns and makes suggestions as to potential implementation
tradeoffs.</t>
          <ul spacing="normal">
            <li>
              <t>The upload interaction requires the Leader to ignore uploaded reports with a
duplicated ID, including concurrently-uploaded reports. This might be
implemented by synchronization or via an eventually-consistent process. If the
Leader wishes to alert the Client with a <tt>reportRejected</tt> error,
synchronization will be necessary to ensure all but one concurrent request
receive the error.</t>
            </li>
            <li>
              <t>The Leader is responsible for generating aggregation jobs, and will generally
want to place each report in exactly one aggregation job. (The only event in
which a Leader will want to place a report in multiple aggregation jobs is if
the Helper rejects the report with <tt>report_too_early</tt>, in which case the
Leader can place the report into a later aggregation job.) This may require
synchronization between different components of the system which are
generating aggregation jobs. Note that placing a report into more than one
aggregation job will result in a loss of throughput, rather than a loss of
correctness, privacy, or robustness, so it is acceptable for implementations
to use an eventually-consistent scheme which may rarely place a report into
multiple aggregation jobs.</t>
            </li>
            <li>
              <t>Aggregation is implemented as a sequence of aggregation steps by both the
Leader and the Helper. The Leader must ensure that each aggregation job is
only processed once concurrently, which may require synchronization between
the components responsible for performing aggregation. The Helper must ensure
that concurrent requests against the same aggregation job are handled
appropriately, which requires synchronization between the components handling
aggregation requests.</t>
            </li>
            <li>
              <t>Aggregation requires checking and updating used-report storage as part of
implementing replay protection. This must be done while processing the
aggregation job, though which steps the checks are performed at is up to the
implementation. The checks and storage require synchronization, so that if two
aggregation jobs containing 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 may be transmitted alongside 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>
        <t>The report itself may contain deanonmyizing information that cannot be removed
by a proxy:</t>
        <ul spacing="normal">
          <li>
            <t>The report timestamp indicates when a report was generated and may help an
attacker to deduce which Client generated it. Truncating this timestamp as
described in <xref target="timestamps"/> can help.</t>
          </li>
          <li>
            <t>The public extensions may help the attacker to profile the Client's
configuration.</t>
          </li>
        </ul>
      </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="predictable-or-enumerable-task-ids">
          <name>Predictable or Enumerable Task IDs</name>
          <t>This specification imposes no requirements on task IDs except that they be
globally unique. One way to achieve this is to use random task IDs, but
deployments can also use schemes like <xref target="I-D.draft-ietf-ppm-dap-taskprov-01"/>
where task IDs are deterministically generated from some set of task parameters.</t>
          <t>In such settings, deployments should consider whether an Aggregator
acknowledging the existence of a task (by accepting report uploads or
aggregation jobs, for example) could unintentionally leak information such as a
label describing the task, the identities of participating Aggregators or the
fact that some measurement is being taken at all.</t>
          <t>Such enumeration attacks can be mitigated by incorporating unpredictable values
into the task ID derivation. They do not, however, affect the protocol goals of
privacy or robustness.</t>
        </section>
        <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:</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>Content-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-modes"/>). 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-modes"/> 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-modes"/>)</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="POSIX">
          <front>
            <title>IEEE Standard for Information Technology--Portable Operating System Interface (POSIX(TM)) Base Specifications, Issue 7</title>
            <author>
              <organization/>
            </author>
            <date month="January" year="2018"/>
          </front>
          <seriesInfo name="DOI" value="10.1109/ieeestd.2018.8277153"/>
          <seriesInfo name="ISBN" value="[&quot;9781504445429&quot;]"/>
          <refcontent>IEEE</refcontent>
        </reference>
        <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="10" month="January" year="2025"/>
            <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-14"/>
        </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="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="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="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="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="RFC9421">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Sporny" initials="M." surname="Sporny"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </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="I-D.draft-ietf-ppm-dap-taskprov-01">
          <front>
            <title>Task Binding and In-Band Provisioning for DAP</title>
            <author fullname="Shan Wang" initials="S." surname="Wang">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Christopher Patton" initials="C." surname="Patton">
              <organization>Cloudflare</organization>
            </author>
            <date day="2" month="November" year="2024"/>
            <abstract>
              <t>   An extension for the Distributed Aggregation Protocol (DAP) is
   specified that cryptographically binds the parameters of a task to
   the task's execution.  In particular, when a client includes this
   extension with its report, the servers will only aggregate the report
   if all parties agree on the task parameters.  This document also
   specifies an optional mechanism for in-band task provisioning that
   builds on the report extension.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-taskprov-01"/>
        </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:
H4sIAAAAAAAAA+y963Ybx5Uw+r+fooda3xIZARBBUTc6zpiWZJsTW9KIcjKZ
TD6iATSJNgE00t0gxUiad/h+nP/nWc6jnCc5+1q1q7pBUrJzmXXCldAi0F2X
Xbv2/dLv95OmaOb5Qbr1vKibqhivm3yaHp6dVflZ1hTlMn1dlU05KefpaVnB
H8VFNrmC/+Z1Xl0Uy7P0hzyr11W+yJfNVpKNx1V+cZA+P3ydTMvJMlvA0NMq
O236Rd6c9lerRX+arfrDh8kka/Kzsro6SOtmmtTr8aKoa5iwuVrBO0cv3n6T
JBf5cp0fJGl6VpXrFSzypvnTlF/f+n1ZneO33+KL+PkiK+bwOSzgK1zJoKzO
8OOsmszg41nTrOqD+/fxKfyouMgH+th9/OD+uCov6/w+vH8f3zsrmtl6DG/S
ti7PcGf32xvFR+ew0boxk5hXBjzOoCg7Xu74aDBrFvMtAMxB+iBJsnUzKyuA
Tx+moZ9iWR+kbwfpt3l5NoMTXOoXfBJvi0X7K9hitiz+QqcNgD9+861+kzPQ
mmJxBi/dw4V8dYafDSblIomnfTZIX2dNU0ZzPptVgFnlapZX0ffhxM/m5Xp6
CtDPo+knOMCK3rxpCV/DEopmEW/76ypbThGVg+9u3PcYXvsKfw3m8H5rsheD
9E1eT8pqnoXTvaiKSeuraLblNF/l8GvZRJPm59VXVXO62ATiw0H6+7KcboZx
9MBtgZxdfjXLsxXcmXHR1INl3iTJBG4jkYQQyXjOfyvrWXqY1WaiTij+BM99
lY3zpsmrYgm/YGi8Vkl7xPXyKoe95MtgzMPVah4v9yd8dPJVhl/FkOLBnmcX
xTR9VpbnNy1wOoGHvpoWFxfFetW9suM14E36bbZsshuXVp/hY3vXre1wkcNB
fTuDg7lpccUym51l16/ut3j4xTJPv12XNy7vXB4+OVuX163x2Syr5kWefpdV
8EYZHsm3ZXnWGnlSz+TZr+DKlotivehe7+scsCA9zgAb+ofLaQsX62aFT3Tf
czkQoNBwIsfZrBgHK4OrftEajx4+z9bzGp+/btzXs2I+L1ar9HgyK4HmZstb
bLx2z351Rt93j/1DVgHg07ezchHD84fyLzBvFo27aL5a8BebgAAg+H22PLsZ
J+HJk0t40p74sqwWQBYugMHC469fHR/9B1ybV0eD4e5gONx9ev/oxYsXx2+f
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
0CAaFJfhGXOXaVb7vn3xljR2B8MS2EystNumvO18HmPd+b6om5H2gM+nRcaR
jFvGzITMpW9g38dIWdZbWyN5NLTt0qw1ieyPGAcERJsqV1QSxbmiWEk0qIul
RdLDggbDuHMJrPau4TYY2erlHpB8T2MtwhoJ8G22zCmke5MX2K87DTcaxARt
DCjiSCL86Lf5Av4+zxcn5rPpKX42PTWfHQKWwocZ/Md8yo4pzAblDh5o23LR
RjQZLEIsXcHzwTLR5AmSjZ8m+IhWGH6C67OpxtoLXGwziP4jPxpK624god9u
mJHYC5R+J1w1Ak/O+yYfk+RpDb0k/yIeUHCoqxk4wkgqswq6LxbJOOUzibFT
VGwhFzz4mGL8TkkdsmGqyjO0fXU81hfyfOsGoG+aApaw8+CvMNbZ4GeaTS8w
I7SzcbGpW5KZdMTfvvihl/72+Tei9By+OHzuMRmoMaJ4BDcJ8F5TyvJkJnIG
5/xJVGCf/A/6rUZRqxSbuJpBQ+SmdmykslTArJzT68bw5+tC4ef9Z/xUMhPS
q6mArNvYCHuh0aEFEUvWAaLXwfQau36aXQDA5iW1g7eL4GDri7JAewV56Bp5
osq9UNpL2dkFd5zEBCVC0+wq7rQpE+KWi+U65xhUlCEdV6Ztl/MprZYtaw3G
WwGXaS6B/tMUEagK4x7h1QYNT6Xj5x3kiVKygUkUKgAJsoD7rK9byp98V9bN
QWp0A67jdH84GKZ7u7sJHggePQYhHKQ3kfgkOMWDdJG9AwU3//LJo30YKxGN
dPuPXGhFCSAITtP0y3T4dL9HfzHNg0923+3uDnflQyJ68uHukD8Uohd96ike
fPFH+GbYw+/36PcD+r3fw2q/f8LnLU3sdS/scce69j5hXQ82rGvfrIhXN9y0
rj/t+GBGFgxVykniSqmKY4EI8PrVMcoA3mjTUjPltdGACB6lzFIMpsSatDl+
2uL4PATIjq6OBpXhuKEUjAG4hrXIHoSfUTRVQ3GXWOhFU6MEnD4JKmBdH2Ww
HySkOOS54Xc63cI962N2eRKSZIPA3TQK3JVg6RMXcntCtTn5zY7HWdvf9Liu
XnjprzDQL1giMQ1pzqWfqR9IBWp+BWgC4J4fARlhO/6htm+kMcvTvE/1POMP
ohdSDZwN2L+0faaoBnVk0NbQ87+aiXJCPqzc9Ygm16mMJ3NQJnXKK8YzV50P
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
u7XKi6dh6Xw9rF2aoGpBu9ZnmzP5YQu3YFeFiSmLtlWECsVob8Do0oBZQMHH
1UXfJUxmLRsh3rgNaKNgqhtD/s2i75e7x96L4jJ3tptlRRcNWi9h60HBTUW8
zJz8ZEphlCukYd3rMf3IULtMDUTba+Jqfpzkp1ohXw4Uwc1C8M5LTrNQcXvu
WUbJEU1Gbbr40m6OBAx26uqgMlkOEW6dxAXGaVwZj3B+wHsixaQ2+bGdEfXs
pORM/bo1LkckO7iKPdy30NvengM1vgILPYbmLaeu8iDl1fsN9joDn6DbYA+j
ex/590Oh2/zqS61fI+Qpfnyg/rA6xvjhd8s31WPqX4Qde6Ti5XXs9WQw154v
S/Fw75c7gUyrgnvUt0KogWIIuK/JYCcKjD0GiRTTlrTo7+1OJQCHPWt1uA9r
EqtmtMzgqF70Z440gF1oyBWjOHmNEGUCNH7m5xNLfdq2PllYfisWCfk0gwLm
e/yLrLAucTEK+gpHbv3+H+5fp2CHf29dYPi3cBnBDqCvnddX8aFkxKa4PdZY
iOiT54jq3/7EQgmyUdMyF1dSIsbA3WJ7fdierbv8ShwEnrojgUBmCMqwrTsp
j46RNuG4O6/J8Pk49JDrrroZdfKa8PTokGfcBqKDx/IbC8YPnzh5/JC2+wSP
NwV7yO942NfStSdupLkBexor2A42PZ6RDBbOyR7tu9m5AelOfv7iRy0PyqwS
N668ZVawvpd0Ks2u46E+pVS+WWthD11usUFp2B4h7PQnvcQxCHnobNDr6CL5
7DKMSL5sMnrNb2+5wXJ/A4REngj9RBiwbk7wZsgvtgE/osWLDtDTMYMzg1pp
1NvRg7t4dJN+1wMFOpOp7x3/f29q4+85RPHdhfWlJKdcAtm7UpM0/N5XD755
8OWX8u2CgN10KuIQH8xmwv8a1v3uEfia8LvUUsJfD6vuy3/dY0xduVnO7cnt
bXWTn9t+IR4QoW1i1CNK9pdUnvC/f4SZ6WekLrzE56oj1zGX640BoOM/Xiau
CXf7V533P0lPX6WVUybA/1jR7lPqKuGZ+v7yWur71//a6rsH/xWRtWkeGV0Z
qs4aQLp2AFkScoj5/ATm6XCUBs0diEbN6naK5bgYg+J2ikRIyJ5Evf5FQHIu
Afj+4hWHScMLi6BFnOcrxulEKGAMuyVWPuGsJZyl0azesBeH6ZLwWIj+Yf4L
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

-->

</rfc>
