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

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

<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>16:</t>
        <ul spacing="normal">
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-13 to 15 <xref target="VDAF"/> and adopt changes to the
ping-pong API. (#705, #718)</t>
          </li>
          <li>
            <t>Allow many reports to be uploaded at once. (*) (#686)</t>
          </li>
          <li>
            <t>Remove TLS presentation language syntax extensions. (#707)</t>
          </li>
          <li>
            <t>Use HTTP message content length to determine length of vectors in
<tt>AggregationJobInitReq</tt>, <tt>AggregationJobResp</tt> and <tt>AggregationJobContinueReq</tt>
messages. (*) (#717)</t>
          </li>
          <li>
            <t>Represent the Time and Duration types as a number of time_precision
intervals, rather than seconds (*) (#720).</t>
          </li>
          <li>
            <t>Discuss the property of "verifiability" instead of "robustness" to match
recent VDAF changes (https://github.com/cfrg/draft-irtf-cfrg-vdaf/pull/558).
(#725)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-15" to "dap-16". (*)</t>
          </li>
        </ul>
        <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 set of measurements of an understood type which 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>
        <t>The basic unit of DAP operation is the <em>task</em> (<xref target="task-configuration"/>), which
corresponds to a set of measurements of a single type. A given task may result
in multiple aggregated reported results, for instance when measurements are
collected over a long time period and broken up into multiple batches according
to different time windows.</t>
        <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, 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 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>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"/>.</t>
      </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>
        <t>Request authentication is <bcp14>REQUIRED</bcp14> in the following interactions:</t>
        <ul spacing="normal">
          <li>
            <t>Leaders initializing or continuing aggregation jobs with Helpers
(<xref target="aggregate-flow"/>).</t>
          </li>
          <li>
            <t>Collectors initializing or polling collection jobs with Leaders
(<xref target="collect-init"/>).</t>
          </li>
          <li>
            <t>Leaders obtaining aggregate shares from Helpers (<xref target="collect-aggregate"/>).</t>
          </li>
        </ul>
      </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">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<1..2^16-1>;
  opaque payload<1..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>
        <t>Errors that occurred while handling individual reports in the upload or
aggregation interactions are represented by the following enum:</t>
        <sourcecode type="tls-presentation"><![CDATA[
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),
  outdated_config(11),
  (255)
} ReportError;
]]></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 representing
a number of <tt>time_precision</tt>s since the Epoch (<xref target="task-configuration"/>), 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, divided by the task's <tt>time_precision</tt>.
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>
          <sourcecode type="tls-presentation"><![CDATA[
uint64 Duration;
]]></sourcecode>
          <t>Durations of time are integers, representing a number of <tt>time_precision</tt>s.
They can be added to times to produce other times.</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="http-resources">
        <name>Resources</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>
        <t>Protocol participants act on resources using HTTP requests, which follow the
semantics laid out in <xref target="RFC9110"/>, in particular with regard to safety and
idempotence of HTTP methods (Sections <xref target="RFC9110" section="9.2.1" sectionFormat="bare"/> and <xref target="RFC9110" section="9.2.2" sectionFormat="bare"/> of <xref target="RFC9110"/>,
respectively).</t>
        <t>Many of the protocol's interactions may be handled asynchronously so that
servers can appropriately allocate resources for long-running transactions.</t>
        <t>In DAP, an HTTP server indicates that it is deferring the handling of a request
by immediately sending an empty response body with a successful status code
(<xref section="15.3" sectionFormat="comma" target="RFC9110"/>). The response <bcp14>SHOULD</bcp14> include a Retry-After field
(<xref section="10.2.3" sectionFormat="comma" target="RFC9110"/>) to suggest a polling interval to the HTTP client.
The HTTP client then polls the state of the resource by sending GET requests to
the resource URL. In some interactions, the HTTP server will include a Location
header field (<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>) that the HTTP client <bcp14>MUST</bcp14> resolve
against the HTTP server's base API URL to obtain the resource URL. Otherwise the
resource URL is the URL to which the HTTP client initially sent its request.</t>
        <t>The HTTP client <bcp14>SHOULD</bcp14> use each response's Retry-After header field to decide
when to try again. The HTTP server responds the same way as it did to the
initial request until either the resource is ready, from which point it responds
with the resource's representation (<xref section="3.2" sectionFormat="comma" target="RFC9110"/>), or handling the
request fails, in which case it <bcp14>MUST</bcp14> abort with the error that caused the
failure.</t>
        <t>The HTTP server may instead handle the request immediately. It waits to respond
to the HTTP client's request until the resource is ready, in which case it
responds with the resource's representation, or handling the request fails, in
which case it <bcp14>MUST</bcp14> abort with the error that caused the failure.</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<10..2^16-1>;

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

opaque HpkePublicKey<1..2^16-1>;
uint16 HpkeAeadId;
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 an <tt>UploadRequest</tt>, with media type "application/dap-upload-req",
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;

struct {
  Report reports[message_length];
} UploadRequest;
]]></sourcecode>
          <t>Here <tt>message_length</tt> is the length of the HTTP message content (<xref section="6.4" sectionFormat="comma" target="RFC9110"/>).</t>
          <t>Each upload request contains a sequence of <tt>Report</tt> with the following fields:</t>
          <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-16" || 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><tt>Vdaf.shard</tt> 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<1..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-16 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>Otherwise, the Leader responds with a body consisting of an <tt>UploadResponse</tt>
with the media type <tt>application/dap-upload-resp</tt>. The structure of the response
is as follows:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  ReportID id;
  ReportError error;
} ReportUploadStatus;

struct {
  ReportUploadStatus status[message_length];
} UploadResponse;
]]></sourcecode>
          <t>Here <tt>message_length</tt> denotes the length in bytes of the concatenated
<tt>ReportUploadStatus</tt> objects.</t>
          <t>The Leader only includes reports that failed processing in the response. Reports
that are accepted do not have a response.</t>
          <t>Reports in the response <bcp14>MUST</bcp14> appear in the same order as in the request.</t>
          <t>For each report that failed to upload, the Leader creates a <tt>ReportUploadStatus</tt>
and includes the <tt>ReportId</tt> from the input and a <tt>ReportError</tt>
(<xref target="basic-definitions"/>) that describes the failure. The length of this sequence
is always less than or equal to the length of the upload sequence.</t>
          <t>If the Leader does not recognize the <tt>config_id</tt> in the encrypted input share,
it sets the corresponding error field to <tt>outdated_config</tt>. When the Client
receives an <tt>outdated_config</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>
discard it. In addition, it <bcp14>MAY</bcp14> set the corresponding error field to
<tt>report_replayed</tt>.</t>
          <t>The Leader <bcp14>MUST</bcp14> discard any report pertaining to a batch that has already been
collected (see <xref target="replay-protection"/> for details). The Leader <bcp14>MAY</bcp14> also set the
corresponding error field to <tt>report_replayed</tt>.</t>
          <t>The Leader <bcp14>MUST</bcp14> discard any report whose timestamp is outside of the task's
<tt>time_interval</tt>. When it does so, it <bcp14>SHOULD</bcp14> set the corresponding error field to
<tt>report_dropped</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> set the corresponding error field to
<tt>report_too_early</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> discard 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>
discard 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>
            <t>Successful upload</t>
            <sourcecode type="http"><![CDATA[
POST /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/reports
Host: example.com
Content-Type: application/dap-upload-req
Content-Length: 100

encoded(struct {
  reports = [
    struct {
      report_metadata = struct {
        report_id = [0x0a, 0x0b, 0x0c, 0x0d, ...],
        time = 17419860,
        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,
  ],
} UploadRequest)

HTTP/1.1 200
]]></sourcecode>
            <t>Failed upload of 1/2 reports submitted in one bulk upload</t>
            <sourcecode type="http"><![CDATA[
POST /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/reports
Host: example.com
Content-Type: application/dap-upload-req
Content-Length: 200

encoded(struct {
  reports = [
    struct {
      report_metadata = struct {
        report_id = [0x0a, 0x0b, 0x0c, 0x0d, ...],
        time = 20000000,
        public_extensions = [0x00, 0x01],
      } 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,
    struct {
      report_metadata = struct {
        report_id = [0x0z, 0x0y, 0x0x, 0x0w, ...],
        time = 20000000,
        public_extensions = [0x00, 0x01],
      } 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,
  ],
} UploadRequest)

HTTP/1.1 200
Content-Type: application/dap-upload-resp
Content-Length: 20

encoded(struct {
  reports = [
    struct {
      id = [0x0z, 0x0y, 0x0x, 0x0w, ...],
      error = report_replayed,
    },
  ],
} UploadResponse)
]]></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="332" y="468">prep_resp(continue|finish)</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|finish)   |
   |<----------------------------------------------------|
   |                                                     |
   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>Each Aggregator maintains some state for each report. A state transition is
triggered by receiving a message from the Aggregator's peer. Eventually this
process results in a terminal state, either rejecting the report or recovering
an output share. Once a report has reached a terminal state, no more messages
will be processed for it. There are four possible states (see <xref section="5.7" sectionFormat="of" target="VDAF"/>: <tt>Continued</tt>, <tt>FinishedWithOutbound</tt>, <tt>Finished</tt> and <tt>Rejected</tt>. The
first two states include an outbound message to be processed by the peer.</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>
            <figure anchor="leader-init-state">
              <name>Leader state transition triggered by aggregation initialization. (*) indicates a terminal state.</name>
              <artset>
                <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width="432" viewBox="0 0 432 160" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                    <path d="M 216,48 L 216,144" fill="none" stroke="black"/>
                    <path d="M 64,48 L 80,48" fill="none" stroke="black"/>
                    <path d="M 176,48 L 256,48" fill="none" stroke="black"/>
                    <path d="M 216,80 L 256,80" fill="none" stroke="black"/>
                    <path d="M 216,112 L 256,112" fill="none" stroke="black"/>
                    <path d="M 216,144 L 256,144" fill="none" stroke="black"/>
                    <polygon class="arrowhead" points="264,144 252,138.4 252,149.6" fill="black" transform="rotate(0,256,144)"/>
                    <polygon class="arrowhead" points="264,112 252,106.4 252,117.6" fill="black" transform="rotate(0,256,112)"/>
                    <polygon class="arrowhead" points="264,80 252,74.4 252,85.6" fill="black" transform="rotate(0,256,80)"/>
                    <polygon class="arrowhead" points="264,48 252,42.4 252,53.6" fill="black" transform="rotate(0,256,48)"/>
                    <polygon class="arrowhead" points="88,48 76,42.4 76,53.6" fill="black" transform="rotate(0,80,48)"/>
                    <g class="text">
                      <text x="216" y="36">PrepareResp</text>
                      <text x="28" y="52">Report</text>
                      <text x="128" y="52">Continued</text>
                      <text x="304" y="52">Continued</text>
                      <text x="348" y="84">FinishedWithOutbound</text>
                      <text x="300" y="116">Finished</text>
                      <text x="376" y="116">(*commit)</text>
                      <text x="300" y="148">Rejected</text>
                      <text x="376" y="148">(*reject)</text>
                    </g>
                  </svg>
                </artwork>
                <artwork type="ascii-art"><![CDATA[
                     PrepareResp
Report --> Continued -----+----> Continued
                          |
                          +----> FinishedWithOutbound
                          |
                          +----> Finished (*commit)
                          |
                          +----> Rejected (*reject)
]]></artwork>
              </artset>
            </figure>
            <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>First, the Leader <bcp14>MUST</bcp14> ensure each report in the candidate set can be committed
per the criteria detailed in <xref target="batch-buckets"/>. If a report cannot be committed,
then the Leader rejects it and removes it from the candidate set.</t>
            <t>Next, the Leader decrypts each of its report shares as described in
<xref target="input-share-decryption"/>, then checks input share validity as described in
<xref target="input-share-validation"/>. If either step 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 = Vdaf.ping_pong_leader_init(
    vdaf_verify_key,
    "dap-16" || 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>. If <tt>state</tt> is of type <tt>Rejected</tt>
(<xref section="5.7" sectionFormat="of" target="VDAF"/>, then the report is rejected and removed from the
candidate set, and no message is sent to the Helper for this report.</t>
            <t>Otherwise, if <tt>state</tt> is of type <tt>Continued</tt> (no other state is reachable at
this point), then the state includes an outbound message denoted
<tt>state.outbound</tt>. The Leader uses it to construct a <tt>PrepareInit</tt> structure for
that report.</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<1..2^32-1>;
} PrepareInit;
]]></sourcecode>
            <t>This message consists of:</t>
            <ul spacing="normal">
              <li>
                <t><tt>report_share.report_metadata</tt>: The report's metadata.</t>
              </li>
              <li>
                <t><tt>report_share.public_share</tt>: The report's public share.</t>
              </li>
              <li>
                <t><tt>report_share.encrypted_input_share</tt>: The Helper's encrypted input share.</t>
              </li>
              <li>
                <t><tt>payload</tt>: The outbound message, set to <tt>state.outbound</tt>.</t>
              </li>
            </ul>
            <t>Once all the report shares have been initialized, the Leader creates an
<tt>AggregationJobInitReq</tt> message containing the <tt>PrepareInit</tt> structures
for the relevant reports.</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[prepare_inits_length];
} 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. Here <tt>prepare_inits_length</tt> is the length of the HTTP message
content (<xref section="6.4" sectionFormat="comma" target="RFC9110"/>), minus the lengths in octets of the
encoded <tt>agg_param</tt> and <tt>part_batch_selector</tt> fields. That is, the remainder
of the HTTP message consists of <tt>prepare_inits</tt>.</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".
The Leader handles the response(s) as described in <xref target="http-resources"/> to obtain
an <tt>AggregationJobResp</tt>.</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 = Vdaf.ping_pong_leader_continued(
    "dap-16" || task_id,
    agg_param,
    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>state</tt> is the report's initial prep state</t>
                  </li>
                  <li>
                    <t><tt>inbound</tt> is the payload of the <tt>PrepareResp</tt></t>
                  </li>
                </ul>
                <t>
If the new <tt>state</tt> has type <tt>Continued</tt> or <tt>FinishedWithOutbound</tt>,
then there is at least one more outbound message to send before preparation
is complete. The Leader stores <tt>state</tt> and proceeds as in
<xref target="aggregation-leader-continuation"/>.  </t>
                <t>
Else if the new <tt>state</tt> has type <tt>Finished</tt>, then preparation is complete and
the state includes an output share, denoted <tt>state.out_share</tt>. The Leader
commits to <tt>state.out_share</tt> as described in <xref target="batch-buckets"/>.  </t>
                <t>
Else if <tt>state</tt> has type <tt>Rejected</tt>, then the Leader rejects the
report and removes it from the candidate set.  </t>
                <t>
Note on rejection agreement: rejecting at this point would result in a batch
mismatch if the Helper had already committed to its output share. This is
impossible due to the verifiability property of the VDAF: if the underlying
measurement were invalid, then the Helper would have indicated rejection in
its response.</t>
              </li>
              <li>
                <t>Else if the <tt>PrepareResp</tt> has type "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 report 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>Otherwise the inbound message type is invalid for the Leader's current
state, 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 preparation is complete for some of the reports in an
aggregation job but not others.</t>
          </section>
          <section anchor="aggregation-helper-init">
            <name>Helper Initialization</name>
            <figure anchor="helper-init-state">
              <name>Helper state transition triggered by aggregation initialization. (*) indicates a terminal state.</name>
              <artset>
                <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="112" width="400" viewBox="0 0 400 112" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                    <path d="M 120,32 L 120,96" fill="none" stroke="black"/>
                    <path d="M 104,32 L 144,32" fill="none" stroke="black"/>
                    <path d="M 120,64 L 144,64" fill="none" stroke="black"/>
                    <path d="M 120,96 L 144,96" fill="none" stroke="black"/>
                    <polygon class="arrowhead" points="152,96 140,90.4 140,101.6" fill="black" transform="rotate(0,144,96)"/>
                    <polygon class="arrowhead" points="152,64 140,58.4 140,69.6" fill="black" transform="rotate(0,144,64)"/>
                    <polygon class="arrowhead" points="152,32 140,26.4 140,37.6" fill="black" transform="rotate(0,144,32)"/>
                    <g class="text">
                      <text x="48" y="36">PrepareInit</text>
                      <text x="192" y="36">Continued</text>
                      <text x="236" y="68">FinishedWithOutbound</text>
                      <text x="360" y="68">(*commit)</text>
                      <text x="188" y="100">Rejected</text>
                      <text x="264" y="100">(*reject)</text>
                    </g>
                  </svg>
                </artwork>
                <artwork type="ascii-art"><![CDATA[
PrepareInit --+--> Continued
              |
              +--> FinishedWithOutbound (*commit)
              |
              +--> Rejected (*reject)
]]></artwork>
              </artset>
            </figure>
            <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 initialization request can be handled either asynchronously or synchronously
as described in <xref target="http-resources"/>. When indicating that the job is not yet
ready, the response <bcp14>MUST</bcp14> include 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>. When the job is
ready, the Helper responds with the <tt>AggregationJobResp</tt> (defined below).</t>
            <t>Upon receipt of an <tt>AggregationJobInitReq</tt>, the Helper checks the following
conditions:</t>
            <ul spacing="normal">
              <li>
                <t>Whether it recognizes the task ID. If not, then the Helper <bcp14>MUST</bcp14> fail the job
with error <tt>unrecognizedTask</tt>.</t>
              </li>
              <li>
                <t>Whether the <tt>AggregationJobInitReq</tt> is malformed. If so, the the Helper <bcp14>MUST</bcp14>
fail the job with error <tt>invalidMessage</tt>.</t>
              </li>
              <li>
                <t>Whether the batch mode indicated by <tt>part_batch_selector.batch_mode</tt> matches
the task's batch mode. If not, then the Helper <bcp14>MUST</bcp14> fail the job with error
<tt>invalidMessage</tt>.</t>
              </li>
              <li>
                <t>Whether 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>
              </li>
              <li>
                <t>Whether 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>
              </li>
            </ul>
            <t>The Helper then processes the aggregation job by computing a response for each
report share. This includes the following structures:</t>
            <sourcecode type="tls-presentation"><![CDATA[
enum {
  continue(0),
  finish(1)
  reject(2),
  (255)
} PrepareRespType;

struct {
  ReportID report_id;
  PrepareRespType prepare_resp_type;
  select (PrepareResp.prepare_resp_type) {
    case continue: opaque payload<1..2^32-1>;
    case finish:   Empty;
    case reject:   ReportError report_error;
  };
} PrepareResp;
]]></sourcecode>
            <t><tt>PrepareResp.report_id</tt> is always set to the ID of the report that the Helper is
preparing. The values of the other fields in different cases are discussed
below.</t>
            <t>The Helper processes each of the remaining report shares in turn.
First, the Helper decrypts each report share as described in
<xref target="input-share-decryption"/>, then checks input share validity as described in
<xref target="input-share-validation"/>. If either decryption of validation fails, the Helper
sets <tt>PrepareResp.prepare_resp_type</tt> to <tt>reject</tt> and <tt>PrepareResp.report_error</tt>
to the indicated error.</t>
            <t>For all other reports it initializes the VDAF prep state as follows:</t>
            <sourcecode type="pseudocode"><![CDATA[
state = Vdaf.ping_pong_helper_init(
    vdaf_verify_key,
    "dap-16" || task_id,
    agg_param,
    report_id,
    public_share,
    plaintext_input_share.payload,
    inbound,
)
]]></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>
              <li>
                <t><tt>inbound</tt> is the payload of the inbound <tt>PrepareInit</tt></t>
              </li>
            </ul>
            <t>This procedure determines the initial per-report <tt>state</tt>. If <tt>state</tt> is of type
<tt>Rejected</tt>, then the Helper sets <tt>PrepareResp.prepare_resp_type</tt> to <tt>reject</tt> and
<tt>PrepareResp.report_error</tt> to <tt>vdaf_prep_error</tt>.</t>
            <t>Otherwise <tt>state</tt> has type <tt>Continued</tt> or <tt>FinishedWithOutbound</tt> and
there is at least one more outbound message to process. State <tt>Finished</tt> is
not reachable at this point. The Helper sets <tt>PrepareResp.prepare_resp_type</tt> to
<tt>continue</tt> and <tt>PrepareResp.payload</tt> to <tt>state.outbound</tt>.</t>
            <t>If <tt>state</tt> has type <tt>Continued</tt>, then the Helper stores <tt>state</tt> for use in the
first continuation step in <xref target="aggregation-helper-continuation"/>.</t>
            <t>Else if <tt>state</tt> has type <tt>FinishedWithOutbound</tt>, then the Helper commits to
<tt>state.out_share</tt> as described in <xref target="batch-buckets"/>. If commitment fails with
some report error <tt>commit_error</tt> (e.g., the report was replayed or its batch
bucket was collected), then the Helper sets <tt>PrepareResp.prepare_resp_type</tt> to
<tt>reject</tt> and <tt>PrepareResp.report_error</tt> to <tt>commit_error</tt>.</t>
            <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[message_length];
} AggregationJobResp;
]]></sourcecode>
            <t>Here <tt>message_length</tt> is the length of the HTTP message content (<xref section="6.4" sectionFormat="comma" target="RFC9110"/>).</t>
            <t><tt>prepare_resps</tt> is the outbound <tt>PrepareResp</tt> messages for each report 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>The Helper may receive multiple copies of a given initialization request. The
Helper <bcp14>MUST</bcp14> verify that subsequent requests have the same
<tt>AggregationJobInitReq</tt> value and abort with a client error if they do not. 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, confirming that the Leader received the Helper's response (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-16 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 <bcp14>MUST</bcp14> 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 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--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)--it <bcp14>MUST</bcp14> mark the input share as invalid
with error <tt>report_dropped</tt>.</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
Content-Length: 100
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
Content-Length: 100

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
Content-Length: 100
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
Content-Length: 100

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>
            <figure anchor="leader-cont-state">
              <name>Leader state transition triggered by aggregation continuation. (*) indicates a terminal state.</name>
              <artset>
                <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="344" viewBox="0 0 344 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                    <path d="M 128,48 L 128,144" fill="none" stroke="black"/>
                    <path d="M 216,192 L 216,224" fill="none" stroke="black"/>
                    <path d="M 88,48 L 168,48" fill="none" stroke="black"/>
                    <path d="M 128,80 L 168,80" fill="none" stroke="black"/>
                    <path d="M 128,112 L 168,112" fill="none" stroke="black"/>
                    <path d="M 128,144 L 168,144" fill="none" stroke="black"/>
                    <path d="M 176,192 L 256,192" fill="none" stroke="black"/>
                    <path d="M 216,224 L 256,224" fill="none" stroke="black"/>
                    <polygon class="arrowhead" points="264,224 252,218.4 252,229.6" fill="black" transform="rotate(0,256,224)"/>
                    <polygon class="arrowhead" points="264,192 252,186.4 252,197.6" fill="black" transform="rotate(0,256,192)"/>
                    <polygon class="arrowhead" points="176,144 164,138.4 164,149.6" fill="black" transform="rotate(0,168,144)"/>
                    <polygon class="arrowhead" points="176,112 164,106.4 164,117.6" fill="black" transform="rotate(0,168,112)"/>
                    <polygon class="arrowhead" points="176,80 164,74.4 164,85.6" fill="black" transform="rotate(0,168,80)"/>
                    <polygon class="arrowhead" points="176,48 164,42.4 164,53.6" fill="black" transform="rotate(0,168,48)"/>
                    <g class="text">
                      <text x="128" y="36">PrepareResp</text>
                      <text x="40" y="52">Continued</text>
                      <text x="216" y="52">Continued</text>
                      <text x="260" y="84">FinishedWithOutbound</text>
                      <text x="212" y="116">Finished</text>
                      <text x="288" y="116">(*commit)</text>
                      <text x="212" y="148">Rejected</text>
                      <text x="288" y="148">(*reject)</text>
                      <text x="216" y="180">PrepareResp</text>
                      <text x="84" y="196">FinishedWithOutbound</text>
                      <text x="304" y="196">(*commit)</text>
                      <text x="304" y="228">(*reject)</text>
                    </g>
                  </svg>
                </artwork>
                <artwork type="ascii-art"><![CDATA[
          PrepareResp
Continued -----+----> Continued
               |
               +----> FinishedWithOutbound
               |
               +----> Finished (*commit)
               |
               +----> Rejected (*reject)

                     PrepareResp
FinishedWithOutbound -----+----> (*commit)
                          |
                          +----> (*reject)
]]></artwork>
              </artset>
            </figure>
            <t>The Leader begins each step of aggregation continuation with a prep state
object <tt>state</tt> for each report in the candidate set. Either all states
have type <tt>Continued</tt> or all states have type <tt>FinishedWithOutbound</tt>. In either
case, there is at least one more outbound message to process, denoted
<tt>state.outbound</tt>.</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<1..2^32-1>;
} PrepareContinue;
]]></sourcecode>
            <t>where <tt>report_id</tt> is the report ID associated with <tt>state</tt>, and
<tt>payload</tt> is set to <tt>state.outbound</tt>.</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[prepare_continues_length];
} 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. Here
<tt>prepare_continues_length</tt> is the length of the HTTP message content
(<xref section="6.4" sectionFormat="comma" target="RFC9110"/>), minus the length in octets of <tt>step</tt>. The
<tt>PrepareContinue</tt> elements <bcp14>MUST</bcp14> be in the same order as the previous request to
the aggregation job, omitting any reports that were previously rejected by
either Aggregator.</t>
            <t>The Leader handles the response(s) as described in <xref target="http-resources"/> to obtain
an <tt>AggregationJobResp</tt>.</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 <tt>state</tt> has type <tt>Continued</tt> and the inbound <tt>PrepareResp</tt> has
type "continue", then the Leader computes  </t>
                <sourcecode type="pseudocode"><![CDATA[
state = Vdaf.ping_pong_leader_continued(
    "dap-16" || task_id,
    agg_param,
    state,
    inbound,
)
]]></sourcecode>
                <t>
where <tt>task_id</tt> is the task ID, <tt>inbound</tt> is the payload of the inbound
<tt>PrepareResp</tt>, and <tt>state</tt> is the report's prep state carried over from the
previous step. It then processes the next state transition:  </t>
                <ul spacing="normal">
                  <li>
                    <t>If the type of the new <tt>state</tt> is <tt>Continued</tt> or
<tt>FinishedWithOutbound</tt>, then the Leader stores <tt>state</tt> and proceeds
to the next continuation step.</t>
                  </li>
                  <li>
                    <t>Else if the new type is <tt>Rejected</tt>, then the Leader rejects the report and
removes it from the candidate set.      </t>
                    <t>
Note on rejection agreement: rejecting at this point would result in a
batch mismatch if the Helper had already committed to its output share.
This is impossible due to the verifiability property of the VDAF: if the
underlying measurement were invalid, then the Helper would have indicated
rejection in its response.</t>
                  </li>
                  <li>
                    <t>Else if the new type is <tt>Finished</tt>, then the Leader commits to
<tt>state.out_share</tt> as described in <xref target="batch-buckets"/>.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Else if <tt>state</tt> has type <tt>FinishedWithOutbound</tt> and the inbound
<tt>PrepareResp</tt> has type "finish", then preparation is complete and the
Leader commits to <tt>state.out_share</tt> as described in
<xref target="batch-buckets"/>.</t>
              </li>
              <li>
                <t>Else if the inbound <tt>PrepareResp</tt> has type "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 report 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>Otherwise the inbound message is incompatible with the Leader's current
state, 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>
            <figure anchor="helper-cont-state">
              <name>Helper state transition triggered by aggregation continuation. (*) indicates a terminal state.</name>
              <artset>
                <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width="424" viewBox="0 0 424 160" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                    <path d="M 128,48 L 128,144" fill="none" stroke="black"/>
                    <path d="M 88,48 L 168,48" fill="none" stroke="black"/>
                    <path d="M 128,80 L 168,80" fill="none" stroke="black"/>
                    <path d="M 128,112 L 168,112" fill="none" stroke="black"/>
                    <path d="M 128,144 L 168,144" fill="none" stroke="black"/>
                    <polygon class="arrowhead" points="176,144 164,138.4 164,149.6" fill="black" transform="rotate(0,168,144)"/>
                    <polygon class="arrowhead" points="176,112 164,106.4 164,117.6" fill="black" transform="rotate(0,168,112)"/>
                    <polygon class="arrowhead" points="176,80 164,74.4 164,85.6" fill="black" transform="rotate(0,168,80)"/>
                    <polygon class="arrowhead" points="176,48 164,42.4 164,53.6" fill="black" transform="rotate(0,168,48)"/>
                    <g class="text">
                      <text x="144" y="36">PrepareContinue</text>
                      <text x="40" y="52">Continued</text>
                      <text x="216" y="52">Continued</text>
                      <text x="260" y="84">FinishedWithOutbound</text>
                      <text x="384" y="84">(commit*)</text>
                      <text x="212" y="116">Finished</text>
                      <text x="288" y="116">(commit*)</text>
                      <text x="212" y="148">Rejected</text>
                      <text x="288" y="148">(reject*)</text>
                    </g>
                  </svg>
                </artwork>
                <artwork type="ascii-art"><![CDATA[
          PrepareContinue
Continued -----+----> Continued
               |
               +----> FinishedWithOutbound (commit*)
               |
               +----> Finished (commit*)
               |
               +----> Rejected (reject*)
]]></artwork>
              </artset>
            </figure>
            <t>The Helper begins continuation with a <tt>state</tt> object for each report in
the candidate set, each of which has type <tt>Continued</tt>. The Helper waits for the
Leader to POST an <tt>AggregationJobContinueReq</tt> to the aggregation job.</t>
            <t>The continuation request can be handled either asynchronously or synchronously
as described in <xref target="http-resources"/>. When indicating that the job is not yet
ready, the response <bcp14>MUST</bcp14> include a 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 representation of the
aggregation job is an <tt>AggregationJobResp</tt>.</t>
            <t>To begin handling an <tt>AggregationJobContinueReq</tt>, the Helper checks the
following conditions:</t>
            <ul spacing="normal">
              <li>
                <t>Whether it recognizes the task ID. If not, then the Helper <bcp14>MUST</bcp14> fail the job
with error <tt>unrecognizedTask</tt>.</t>
              </li>
              <li>
                <t>Whether it recognizes the indicated aggregation job ID. If not, the Helper
<bcp14>MUST</bcp14> fail the job with error <tt>unrecognizedAggregationJob</tt>.</t>
              </li>
              <li>
                <t>Whether the <tt>AggregationJobContinueReq</tt> is malformed. If so, the the Helper
<bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
              </li>
              <li>
                <t>Whether <tt>AggregationJobContinueReq.step</tt> is equal to <tt>0</tt>. If so, the Helper
<bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
              </li>
              <li>
                <t>Whether the report IDs are all distinct and each report ID corresponds to one
of the <tt>state</tt> objects. If either of these checks fail, then the Helper <bcp14>MUST</bcp14>
fail the job with error <tt>invalidMessage</tt>.</t>
              </li>
            </ul>
            <t>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>The Helper may receive multiple copies of a continuation request for a given
step. 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. It is illegal to rewind or reset the state of an
aggregation job, so in this case it <bcp14>MUST</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>For each report, the Helper does the following:</t>
            <sourcecode type="pseudocode"><![CDATA[
state = Vdaf.ping_pong_helper_continued(
    "dap-16" || task_id,
    agg_param,
    state,
    inbound,
)
]]></sourcecode>
            <t>where <tt>task_id</tt> is the task ID, <tt>inbound</tt> is the payload of the inbound
<tt>PrepareContinue</tt>, and <tt>state</tt> is the report's prep state carried over from the
previous step. If the new <tt>state</tt> has type <tt>Rejected</tt>, then the Helper sets
<tt>PrepareResp.prepare_resp_type</tt> to <tt>reject</tt> and <tt>PrepareResp.report_error</tt> to
<tt>vdaf_prep_error</tt>.</t>
            <t>If <tt>state</tt> has type <tt>Continued</tt>, then the Helper stores <tt>state</tt> for use in the
next continuation step.</t>
            <t>If <tt>state</tt> has type <tt>FinishedWithOutbound</tt> or <tt>Finished</tt>, then the Helper
commits to <tt>state.out_share</tt> as described in <xref target="batch-buckets"/>. If commitment
fails with some report error <tt>commit_error</tt> (e.g., the report was replayed or
its batch bucket was collected), then the Helper sets
<tt>PrepareResp.prepare_resp_type</tt> to <tt>reject</tt> and <tt>PrepareResp.report_error</tt> to
<tt>commit_error</tt>.</t>
            <t>If commitment succeeds, the Helper's response depends on whether the state
includes an outbound message that needs to be processed. If <tt>state</tt> has type
<tt>Continued</tt> or <tt>FinishedWithOutbound</tt> then the Helper sets
<tt>PrepareResp.prepare_resp_type</tt> to <tt>continue</tt> and <tt>PrepareResp.payload</tt> to
<tt>state.outbound</tt>.</t>
            <t>Otherwise, if <tt>state</tt> has type <tt>Finished</tt>, then the Helper sets
<tt>PrepareResp.prepare_resp_type</tt> to <tt>finish</tt>.</t>
            <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>An output share is eligible to be committed if the following conditions are met:</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 <bcp14>MUST</bcp14> check these conditions before committing an output share.
Helpers may perform these checks at any time before commitment (i.e., during
either aggregation initialization or continuation), but Leaders <bcp14>MUST</bcp14> perform
these checks before adding a report to an aggregation job.</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 current 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 of recovery possible, Aggregator
implementations <bcp14>SHOULD</bcp14> checkpoint the most recent step's prep state and messages
to durable storage such that the Leader can re-construct continuation requests
and the Helper can re-construct continuation responses as needed.</t>
            <t>When implementing 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
Content-Length: 100
Authorization: Bearer auth-token

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

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

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
Content-Length: 100
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
Content-Length: 100

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. Deletion of an aggregation job <bcp14>MUST NOT</bcp14> delete information needed for
replay or double collection checks (<xref target="batch-buckets"/>).</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>;
} 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>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 (see <xref target="eager-aggregation"/>), 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 collection request can be handled either asynchronously or synchronously as
described in <xref target="http-resources"/>. The representation of the collection job is a
<tt>CollectionJobResp</tt> (defined below).</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 the following
conditions:</t>
          <ul spacing="normal">
            <li>
              <t>Whether it recognizes the task ID. If not, the Leader <bcp14>MUST</bcp14> fail the collection
job with error <tt>unrecognizedTask</tt>.</t>
            </li>
            <li>
              <t>Whether the indicated batch mode matches the task's batch mode. If not, the
Leader <bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
            </li>
            <li>
              <t>Whether the <tt>CollectionJobReq</tt> is malformed. If so, the the Helper <bcp14>MUST</bcp14> fail
the job with error <tt>invalidMessage</tt>.</t>
            </li>
            <li>
              <t>Whether the aggregation parameter is valid as described in
<xref target="agg-param-validation"/>. If not, the Leader <bcp14>MUST</bcp14> fail the job with error
<tt>invalidAggregationParameter</tt>.</t>
            </li>
            <li>
              <t>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>
            </li>
            <li>
              <t>Whether 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>
            </li>
            <li>
              <t>If aggregation was 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>
            </li>
          </ul>
          <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. Alternately,
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>. It <bcp14>MUST NOT</bcp14> fulfill any jobs with an
insufficient number of validated reports.</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 = 16595440,
    duration = 1,
  } 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 = 16595440,
        duration = 1,
      } 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 = 1659544,
        duration = 10,
      } Interval,
    } TimeIntervalBatchSelectorConfig)
  },
  report_count = 4000,
  interval = struct {
    start = 1659547,
    duration = 10,
  } 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 state related
to it.</t>
          <t>Aggregators <bcp14>MUST NOT</bcp14> delete information needed for replay or double collection
checks (<xref target="batch-buckets"/>).</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>The aggregate share request can be handled either asynchronously or
synchronously as described in <xref target="http-resources"/>. The representation of the
share is an <tt>AggregateShare</tt> (defined below).</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 error <tt>invalidMessage</tt>.</t>
          <t>If the <tt>AggregateShareReq</tt> is malformed, the Helper <bcp14>MUST</bcp14> fail the job with error
<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 = 1659544,
        duration = 10,
      } 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 = 1659544,
        duration = 10,
      } 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 state related to
it.</t>
          <t>Aggregators <bcp14>MUST NOT</bcp14> delete information needed for replay or double collection
checks (<xref target="batch-buckets"/>).</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-16 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-16 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 = 1659544,
    duration = 1,
  } Interval,
  struct {
    start = 1659545,
    duration = 1,
  } Interval,
  struct {
    start = 1659546,
    duration = 1,
  } Interval,
  struct {
    start = 1659547,
    duration = 1,
  } 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 was generated at
1729629081 seconds after the start of the UNIX epoch, the relevant batch
bucket identifier is</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  start = 1729629,
  duration = 1,
} 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 = 1,
  } Interval,
  struct {
    start = batch_interval.start + 1,
    duration = 1,
  } Interval,
  ...
  struct {
    start = batch_interval.start + batch_interval.duration - 1,
    duration = 1,
  } 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 discard 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 can 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 verifiability, 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 anchor="streaming-messages">
          <name>Streaming Messages</name>
          <t>Most messages in the protocol contain fixed-length or length-prefixed fields
such that they can be parsed independently of context. The exceptions are the
<tt>UploadReq</tt>, <tt>UploadResp</tt> (<xref target="upload-request"/>), <tt>AggregationJobInitReq</tt>,
<tt>AggregationJobContinueReq</tt>, and <tt>AggregationJobResp</tt> (<xref target="aggregate-flow"/>)
messages, all of which contain vectors whose length is determined by the length
of the enclosing HTTP message.</t>
          <t>This allows implementations to begin transmitting these messages before knowing
how long the message will ultimately be. This is useful if implementations wish
to avoid buffering exceptionally large messages in memory.</t>
        </section>
      </section>
    </section>
    <section anchor="compliance">
      <name>Compliance Requirements</name>
      <t>In the absence of an application or deployment-specific profile specifying
otherwise, a compliant DAP application <bcp14>MUST</bcp14> implement the following HPKE cipher
suite:</t>
      <ul spacing="normal">
        <li>
          <t>KEM: DHKEM(X25519, HKDF-SHA256) (see <xref section="7.1" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
        <li>
          <t>KDF: HKDF-SHA256 (see <xref section="7.2" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
        <li>
          <t>AEAD: AES-128-GCM (see <xref section="7.3" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>DAP aims to achieve the privacy and verifiability security goals defined in
<xref section="9" sectionFormat="of" target="VDAF"/>. That is, an active attacker that controls a subset of
the Clients, one of the Aggregators, and the Collector learns nothing about the
honest Clients' measurements beyond their aggregate result. At the same time,
an attacker that controls a subset of Clients cannot force the Collector to
compute anything but the aggregate result over the honest Clients'
measurements.</t>
      <t>Since DAP requires HTTPS (<xref target="message-transport"/>), the attacker cannot tamper
with messages delivered by honest parties or forge messages from honest,
authenticated parties; but it can drop messages or forge messages from
unauthenticated parties. Thus there are some threats that DAP does not defend
against and which are considered outside of its threat model. These and others
are enumerated below, along with potential mitigations.</t>
      <t>Attacks on verifiability:</t>
      <ol spacing="normal" type="1"><li>
          <t>Aggregators can change the result by an arbitrary amount by emitting
incorrect aggregate shares, by omitting reports from the aggregation process,
or by manipulating the VDAF preparation process for a single report. Like the
underlying VDAF, DAP only ensures correct computation of the aggregate result
if both Aggregators honestly execute 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 the security of the VDAF (<xref section="9" sectionFormat="of" target="VDAF"/>) 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
verifiability. 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 deanonymizing 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 core security
goals of VDAFs (<xref section="9" sectionFormat="of" target="VDAF"/>).</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="relaxing-report-processing-rules">
          <name>Relaxing Report Processing Rules</name>
          <t>DAP Aggregators enforce several rules for report processing related to the
privacy of individual measurements:</t>
          <ol spacing="normal" type="1"><li>
              <t>Each report may be aggregated at most once (<xref target="batch-buckets"/>)</t>
            </li>
            <li>
              <t>A batch bucket may be collected at most once (reports pertaining to
collected buckets are rejected; see <xref target="batch-buckets"/>)</t>
            </li>
            <li>
              <t>A batch may only be collected if the number of reports aggregated exceeds
the minimum batch size (<xref target="collect-flow"/>)</t>
            </li>
          </ol>
          <t>It may be desirable to relax these rules in some applications. It may also be
safe to do so when DAP is combined with other privacy enhancements such as
differential privacy. When applications wish to relax any of one of these
requirements, they:</t>
          <ol spacing="normal" type="1"><li>
              <t><bcp14>MUST</bcp14> adhere to the VDAF's requirements for aggregating a report more than
once. See <xref section="5.3" sectionFormat="of" target="VDAF"/> for details.</t>
            </li>
            <li>
              <t><bcp14>SHOULD</bcp14> define a mechanism by which each party explicitly opts into the
change in report processing rules, e.g., via a report extension
(<xref target="report-extensions"/>). This helps prevent an implementation from
relaxing the rules by mistake.</t>
            </li>
          </ol>
        </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>UploadRequest <xref target="upload-request"/>: "application/dap-upload-req"</t>
          </li>
          <li>
            <t>UploadResponse <xref target="upload-request"/>: "application/dap-upload-resp"</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-upload-req;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-upload-req-media-type">
          <name>"application/dap-upload-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-upload-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="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-upload-resp-media-type">
          <name>"application/dap-upload-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-upload-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="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="basic-definitions"/> 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="basic-definitions"/> 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="basic-definitions"/> 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="basic-definitions"/> 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="basic-definitions"/> 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="basic-definitions"/> 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="basic-definitions"/> 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="basic-definitions"/> 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="basic-definitions"/> 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="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x0A</tt></td>
                <td align="left">
                  <tt>task_not_started</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x0B</tt></td>
                <td align="left">
                  <tt>outdated_config</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> 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="17" month="June" 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-15"/>
        </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="J.C." surname="Jones" fullname="J.C. Jones">
        <organization>ISRG</organization>
        <address>
          <email>ietf@insufficient.coffee</email>
        </address>
      </contact>
      <contact initials="A." surname="Koshelev" fullname="Alex Koshelev">
        <organization>Meta</organization>
        <address>
          <email>koshelev@meta.com</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+y9234b15U3eF9PUU1diIwAiCed6Dgxbck2O5alFuWk0+58
RAEoEmUBKHRVgRQjqd9hLuZ+nmUeZZ5k1nHvtXcVQEpW8mV6wl9Ci0DVPq69
9jr+V7/fT5qimeVH6dbTom6qYrRq8kl6fHFR5RdZU5SL9GVVNuW4nKXnZQV/
FJfZ+Br+m9d5dVksLtLneVavqnyeL5qtJBuNqvzyKH16/DKZlONFNoemJ1V2
3vSLvDnvL5fz/iRb9vceJuOsyS/K6voorZtJUq9G86KuocPmegnvnDx7/W2S
XOaLVX6UpOlFVa6WMMib+k9Tfn3rT2X1Br/9Dl/Ez+dZMYPPYQBf4UgGZXWB
H2fVeAofT5tmWR/dv49P4UfFZT7Qx+7jB/dHVXlV5/fh/fv43kXRTFcjeJOm
dXWBM7vfnig+OoOJ1o3pxLwy4HYGRdnxcsdHg2kzn23BwhylB0mSrZppWcH6
9KEb+ikW9VH6epB+l5cXU9jBhX7BO/G6mLe/gilmi+KvtNuw8KevvtNvcl60
pphfwEv3cCBfXeBng3E5T+JuvxmkL7OmKaM+v5lWQFnlcppX0fdhx9/MytXk
HFY/j7ofYwNLevOmIXwNQyiaeTztr6tsMUFSDr67cd4jeO0r/DWYwfutzp4N
0ld5PS6rWRZ296wqxq2vot4Wk3yZw69FE3Wav6m+qprz+bolPh6kfyrLyfo1
jh647SJnV19N82wJZ2ZUNPVgkTdJMobTSCwhJDLu81/LepoeZ7XpqHMVf4Hn
vspGedPkVbGAX9A0Hquk3eJqcZ3DXPJF0ObxcjmLh/sLPjr+KsOv4pXixp5m
l8Uk/aYs39w0wMkYHvpqUlxeFqtl98hOV0A36XfZosluHFp9gY/tbxrb8TyH
jfpuChtz0+CKRTa9yDaP7g+4+cUiT79blTcO7408fHaxKjeN8ZtpVs2KPP0+
q+CNMtyS78ryotXyuJ7Ks1/BkS3nxWq+Zp8HQMf/Wi7yG2mHjjtQ/ur8vBgX
cFhgrOfned6xpLP8bfoHILV8ll8GzT7P/abpGshzX83hu+7pv8yBUtPTDCi2
f7yYtM5L3SzxiW5eJEQDtwhQzWk2LUbBiIAdXbbao4ffZKtZjc9vavfltJjN
iuUyPR1PS7gXssUtNqd2z351Qd93t/08q4A40tfTch7v+fPyr9BvvJTz5qs5
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
Ew7m0GxW4PjOZgYwF85fFBck0k3hfgr7zy0UzZdmYntayNCqZ8nAsiMLjcUI
64QbXLKFhFOFrcZzLmYZZRKr6lLXuaWEFeIft2JdPQfCwEiPy3+Ljlg1bbkh
JH6RThVaHPrGXmgp3iP5FkLQRPbx1Ldhbvo1+QOk3g4+rY56fz8qTTjA+yIa
j5T6ODTdTNjYDSv+jLEj9F8/cnG3Tkt0eXJVMhrbDupOki4Pb468pxspIjXP
6+Jy1p5jvMyzzsQCqvUY/otBgZJms6Iq03NrFo73IpdkMEMxWci96ZhmbUDF
Xc7HVDyQWiNraXzv/vv3wjBsA2cjSADU3VoqGsW7APsSeoTgrPLdwfbcBrTT
bNSNEtkrNCGK8rHs8fAhcf2LsKnk0OrmyEJ26PaQ7kfYvr2KOYil9bPmnIF+
JMGLsBp9PMGAHhg04Vl1Xs/0rrMSH2ArgzeB9XmJmafKmJf7Uk3ugrnFKtHL
MhHD3mTmK2LzjsBlNBTFOMFlJcrc0MlCICVMiWTOLJZuu3OQqIBNrB9B2f9w
nMUUFaqeQxJnRATFbKA4RM4E3BYiVQrGJAqpULczJidnD9G0P0D/lGP129Bb
hlF97f4+flWTWv9bJ8sxCP8M6N/4zrUYiHkMGM8W1aNg15PYQrBPYmZYDMnz
De2G5mfkoyejMOkHc7MC7pcrDfUGoRlGr0gKSP1MHB1zqafZ4J5ykQc46Agi
S5kONMjY0i6FSJB2b7fLq8ktU6UAt9ckPzmHjYHl0H1jf6J5zNg5kud9bsFS
AUWT8hwduHWUIxzSa5UxI74vaPcBakDbpnQV0i1IenK75tacKPVOkcFxN04v
TlUfUbbCoHv1flrxKXNUjAR6xal//vgUyFLiCFQNU2Ym/FXio5edcMjegJeh
nZfB/JsemQsoRdh2xc7asbGF8teMan72NhgmU64fKz8glMe/oHRsfOlgRD98
ErRMRurhn2xUo/D3099+iz8fcQEVKWU8SgqHf4Lthr//4dnz06//8+Vvn/3n
yxen//fZSP7+u0KKy35T027KnlJuJE1+GD7XrBL6DyvcD0skZ6BoYkqj96/B
hnz45RdfgRrEE6My5Vs7V6SsZkuallSF62DbNcJs9hYucD4mlGe+KCImZ5Sq
V+FubS/4NQ7YR/1/95bUAi2DiJZ4/Ubyssjv7zXNE1ZPVmtCDMQitMZp4Pxk
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
Eovs/+L/AW8PFI090AIA

-->

</rfc>
