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

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

<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>18:</t>
        <ul spacing="normal">
          <li>
            <t>Add verification key ID to aggregation jobs to enable but not require
verification key management. (*) (#766)</t>
          </li>
          <li>
            <t>Define collection job extensions. (*) (#769)</t>
          </li>
          <li>
            <t>Define extensible task configuration as a structure and include it in
InputShareAad and AggregateShareAad. (*) (#774)</t>
          </li>
          <li>
            <t>Make task interval an optional part of task configuration. (*) (#776)</t>
          </li>
          <li>
            <t>Require report extensions to be sorted by type. (*) (#775)</t>
          </li>
          <li>
            <t>Remove the partial batch selector from the collection job response. (*)
(#778)</t>
          </li>
          <li>
            <t>Replace the partial batch selector with aggregation job extensions. If a
batch mode needs to convey information to the Helper during aggregation, it
defines an aggregation job extension. For example, the leader-selected batch
mode defines an extension that conveys the batch ID. (*) (#762)</t>
          </li>
          <li>
            <t>Move resource creation from PUT to POST with server-selected identifiers for
aggregation jobs, collection jobs, and aggregate shares. (*) (#781)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-16" to "dap-18". (*)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf to -19 (<xref target="VDAF"/>).</t>
          </li>
        </ul>
        <t>17:</t>
        <ul spacing="normal">
          <li>
            <t>Bump version tag from "dap-16" to "dap-17". (*)</t>
          </li>
          <li>
            <t>Align IANA considerations with RFC 8126 and
https://www.iana.org/help/protocol-registration.</t>
          </li>
          <li>
            <t>Add RFC Editor notes to change domain separation tags from "dap-17" to "dap"
on RFC publication.</t>
          </li>
          <li>
            <t>Fix definitions of time types. (#759)</t>
          </li>
          <li>
            <t>Rename VDAF preparation to verification. (#752)</t>
          </li>
          <li>
            <t>Simplify media types. (*) (#748)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf to -18 (<xref target="VDAF"/>).</t>
          </li>
        </ul>
        <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?>

<t>All examples in this document wrap long lines using the Single Backslash
Strategy of <xref section="7" sectionFormat="comma" target="RFC8792"/>.</t>
        <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 refine 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 verification. 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>(RFC EDITOR: Please update the normative reference to VDAF in the next paragraph
to the VDAF RFC during AUTH48. We hope that VDAF will have been published by
then.)</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 "verification" and is specified by the VDAF itself
(<xref section="5.2" sectionFormat="of" target="VDAF"/>). The report generated by the Client includes
information used by the Aggregators to verify the report. 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 diagrams illustrate 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.</t>
        <t>The diagrams in this section do not necessarily illustrate how participants
communicate. In particular, the processing of aggregation jobs happens in
distinct, non-colluding parties.</t>
        <section anchor="the-upload-interaction">
          <name>The Upload Interaction</name>
          <t>Reports are 1 to 1 with measurements. In this illustration, <tt>i</tt> distinct Clients
upload <tt>i</tt> distinct reports, 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>
          <figure anchor="object-lifecycle-upload">
            <name>Lifecycles of protocol objects in the upload interaction</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="528" width="576" viewBox="0 0 576 528" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <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 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,496" fill="none" stroke="black"/>
                  <path d="M 216,448 L 216,496" fill="none" stroke="black"/>
                  <path d="M 264,464 L 264,496" 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 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 512,368 L 512,384" fill="none" stroke="black"/>
                  <path d="M 512,416 L 512,464" 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 408,320" fill="none" stroke="black"/>
                  <path d="M 328,384 L 368,384" fill="none" stroke="black"/>
                  <path d="M 488,384 L 528,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 488,416 L 528,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 512,464" 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 488,384 C 479.16936,384 472,391.16936 472,400" fill="none" stroke="black"/>
                  <path d="M 528,384 C 536.83064,384 544,391.16936 544,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 488,416 C 479.16936,416 472,408.83064 472,400" fill="none" stroke="black"/>
                  <path d="M 528,416 C 536.83064,416 544,408.83064 544,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"/>
                  <polygon class="arrowhead" points="416,272 404,266.4 404,277.6" fill="black" transform="rotate(90,408,272)"/>
                  <polygon class="arrowhead" points="272,496 260,490.4 260,501.6" fill="black" transform="rotate(90,264,496)"/>
                  <polygon class="arrowhead" points="224,496 212,490.4 212,501.6" fill="black" transform="rotate(90,216,496)"/>
                  <polygon class="arrowhead" points="208,496 196,490.4 196,501.6" fill="black" transform="rotate(90,200,496)"/>
                  <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)"/>
                  <g class="text">
                    <text x="192" y="36">measurement</text>
                    <text x="248" y="36">1</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="432" y="356">...</text>
                    <text x="476" y="356">Client</text>
                    <text x="512" y="356">i</text>
                    <text x="548" 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="508" y="404">upload</text>
                    <text x="196" y="420">upload</text>
                    <text x="240" y="500">...</text>
                    <text x="108" y="516">to</text>
                    <text x="168" y="516">aggregation</text>
                    <text x="232" y="516">job</text>
                    <text x="296" y="516">interaction</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
                  measurement 1
                        |
                     .--+--.
                    | 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
            to aggregation job interaction
]]></artwork>
            </artset>
          </figure>
        </section>
        <section anchor="agg-job-lifecycle">
          <name>The Aggregation Interaction</name>
          <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 verifies <tt>k</tt> reports, outputting <tt>k</tt>
output shares. <tt>k</tt> is roughly <tt>i / j</tt>, but it is not necessary for aggregation
jobs to have uniform size.</t>
          <t>See <xref target="aggregate-flow"/> for the specification of aggregation jobs and
<xref target="operational-capabilities"/> for some discussion of aggregation job scheduling
strategies and their performance implications.</t>
          <t>Output shares are accumulated into <tt>m</tt> batch buckets, and so have a many to 1
relationship. Aggregation jobs and batch buckets are not necessarily 1 to 1. A
single aggregation job may contribute to multiple batch buckets, and multiple
aggregation jobs may contribute to the same batch bucket.</t>
          <t>The assignation of output shares to batch buckets is specified in
<xref target="batch-buckets"/>.</t>
          <figure anchor="object-lifecycle-many-agg-job">
            <name>Lifecycles of protocol objects in the aggregation job interaction</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="720" width="512" viewBox="0 0 512 720" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,464 L 8,480" fill="none" stroke="black"/>
                  <path d="M 56,64 L 56,96" fill="none" stroke="black"/>
                  <path d="M 56,128 L 56,144" fill="none" stroke="black"/>
                  <path d="M 56,336 L 56,448" fill="none" stroke="black"/>
                  <path d="M 56,496 L 56,528" fill="none" stroke="black"/>
                  <path d="M 56,560 L 56,576" fill="none" stroke="black"/>
                  <path d="M 56,608 L 56,624" fill="none" stroke="black"/>
                  <path d="M 56,656 L 56,672" fill="none" stroke="black"/>
                  <path d="M 64,256 L 64,288" fill="none" stroke="black"/>
                  <path d="M 72,336 L 72,368" fill="none" stroke="black"/>
                  <path d="M 72,400 L 72,448" fill="none" stroke="black"/>
                  <path d="M 80,496 L 80,528" fill="none" stroke="black"/>
                  <path d="M 80,560 L 80,576" fill="none" stroke="black"/>
                  <path d="M 80,608 L 80,624" fill="none" stroke="black"/>
                  <path d="M 80,656 L 80,672" fill="none" stroke="black"/>
                  <path d="M 120,192 L 120,208" fill="none" stroke="black"/>
                  <path d="M 120,416 L 120,448" fill="none" stroke="black"/>
                  <path d="M 128,496 L 128,528" fill="none" stroke="black"/>
                  <path d="M 128,560 L 128,576" fill="none" stroke="black"/>
                  <path d="M 128,608 L 128,624" fill="none" stroke="black"/>
                  <path d="M 128,656 L 128,672" fill="none" stroke="black"/>
                  <path d="M 176,464 L 176,480" fill="none" stroke="black"/>
                  <path d="M 192,144 L 192,176" fill="none" stroke="black"/>
                  <path d="M 192,336 L 192,360" fill="none" stroke="black"/>
                  <path d="M 192,376 L 192,400" fill="none" stroke="black"/>
                  <path d="M 200,224 L 200,288" fill="none" stroke="black"/>
                  <path d="M 208,48 L 208,96" fill="none" stroke="black"/>
                  <path d="M 208,128 L 208,176" fill="none" stroke="black"/>
                  <path d="M 208,336 L 208,352" fill="none" stroke="black"/>
                  <path d="M 216,672 L 216,688" fill="none" stroke="black"/>
                  <path d="M 256,144 L 256,176" fill="none" stroke="black"/>
                  <path d="M 264,464 L 264,480" fill="none" stroke="black"/>
                  <path d="M 296,192 L 296,208" fill="none" stroke="black"/>
                  <path d="M 304,496 L 304,528" fill="none" stroke="black"/>
                  <path d="M 304,560 L 304,576" fill="none" stroke="black"/>
                  <path d="M 304,608 L 304,672" fill="none" stroke="black"/>
                  <path d="M 320,368 L 320,408" fill="none" stroke="black"/>
                  <path d="M 320,424 L 320,448" fill="none" stroke="black"/>
                  <path d="M 328,496 L 328,528" fill="none" stroke="black"/>
                  <path d="M 328,560 L 328,576" fill="none" stroke="black"/>
                  <path d="M 328,608 L 328,624" fill="none" stroke="black"/>
                  <path d="M 328,656 L 328,672" fill="none" stroke="black"/>
                  <path d="M 336,352 L 336,408" fill="none" stroke="black"/>
                  <path d="M 336,424 L 336,448" fill="none" stroke="black"/>
                  <path d="M 368,256 L 368,288" fill="none" stroke="black"/>
                  <path d="M 368,336 L 368,416" fill="none" stroke="black"/>
                  <path d="M 376,496 L 376,528" fill="none" stroke="black"/>
                  <path d="M 376,560 L 376,576" fill="none" stroke="black"/>
                  <path d="M 376,608 L 376,624" fill="none" stroke="black"/>
                  <path d="M 376,656 L 376,672" fill="none" stroke="black"/>
                  <path d="M 384,336 L 384,448" fill="none" stroke="black"/>
                  <path d="M 400,64 L 400,96" fill="none" stroke="black"/>
                  <path d="M 400,128 L 400,144" fill="none" stroke="black"/>
                  <path d="M 424,464 L 424,480" fill="none" stroke="black"/>
                  <path d="M 56,64 L 400,64" fill="none" stroke="black"/>
                  <path d="M 56,144 L 192,144" fill="none" stroke="black"/>
                  <path d="M 256,144 L 400,144" fill="none" stroke="black"/>
                  <path d="M 136,176 L 280,176" fill="none" stroke="black"/>
                  <path d="M 296,192 L 328,192" fill="none" stroke="black"/>
                  <path d="M 136,224 L 280,224" fill="none" stroke="black"/>
                  <path d="M 64,256 L 368,256" fill="none" stroke="black"/>
                  <path d="M 208,352 L 336,352" fill="none" stroke="black"/>
                  <path d="M 72,368 L 320,368" fill="none" stroke="black"/>
                  <path d="M 72,400 L 192,400" fill="none" stroke="black"/>
                  <path d="M 120,416 L 368,416" fill="none" stroke="black"/>
                  <path d="M 24,448 L 160,448" fill="none" stroke="black"/>
                  <path d="M 280,448 L 408,448" fill="none" stroke="black"/>
                  <path d="M 24,496 L 160,496" fill="none" stroke="black"/>
                  <path d="M 280,496 L 408,496" fill="none" stroke="black"/>
                  <path d="M 56,672 L 376,672" fill="none" stroke="black"/>
                  <path d="M 136,176 C 127.16936,176 120,183.16936 120,192" fill="none" stroke="black"/>
                  <path d="M 280,176 C 288.83064,176 296,183.16936 296,192" fill="none" stroke="black"/>
                  <path d="M 136,224 C 127.16936,224 120,216.83064 120,208" fill="none" stroke="black"/>
                  <path d="M 280,224 C 288.83064,224 296,216.83064 296,208" fill="none" stroke="black"/>
                  <path d="M 24,448 C 15.16936,448 8,455.16936 8,464" fill="none" stroke="black"/>
                  <path d="M 160,448 C 168.83064,448 176,455.16936 176,464" fill="none" stroke="black"/>
                  <path d="M 280,448 C 271.16936,448 264,455.16936 264,464" fill="none" stroke="black"/>
                  <path d="M 408,448 C 416.83064,448 424,455.16936 424,464" fill="none" stroke="black"/>
                  <path d="M 24,496 C 15.16936,496 8,488.83064 8,480" fill="none" stroke="black"/>
                  <path d="M 160,496 C 168.83064,496 176,488.83064 176,480" fill="none" stroke="black"/>
                  <path d="M 280,496 C 271.16936,496 264,488.83064 264,480" fill="none" stroke="black"/>
                  <path d="M 408,496 C 416.83064,496 424,488.83064 424,480" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="408,96 396,90.4 396,101.6" fill="black" transform="rotate(90,400,96)"/>
                  <polygon class="arrowhead" points="384,624 372,618.4 372,629.6" fill="black" transform="rotate(90,376,624)"/>
                  <polygon class="arrowhead" points="376,288 364,282.4 364,293.6" fill="black" transform="rotate(90,368,288)"/>
                  <polygon class="arrowhead" points="336,576 324,570.4 324,581.6" fill="black" transform="rotate(90,328,576)"/>
                  <polygon class="arrowhead" points="312,528 300,522.4 300,533.6" fill="black" transform="rotate(90,304,528)"/>
                  <polygon class="arrowhead" points="224,688 212,682.4 212,693.6" fill="black" transform="rotate(90,216,688)"/>
                  <polygon class="arrowhead" points="216,96 204,90.4 204,101.6" fill="black" transform="rotate(90,208,96)"/>
                  <polygon class="arrowhead" points="208,288 196,282.4 196,293.6" fill="black" transform="rotate(90,200,288)"/>
                  <polygon class="arrowhead" points="136,624 124,618.4 124,629.6" fill="black" transform="rotate(90,128,624)"/>
                  <polygon class="arrowhead" points="88,576 76,570.4 76,581.6" fill="black" transform="rotate(90,80,576)"/>
                  <polygon class="arrowhead" points="72,288 60,282.4 60,293.6" fill="black" transform="rotate(90,64,288)"/>
                  <polygon class="arrowhead" points="64,528 52,522.4 52,533.6" fill="black" transform="rotate(90,56,528)"/>
                  <polygon class="arrowhead" points="64,96 52,90.4 52,101.6" fill="black" transform="rotate(90,56,96)"/>
                  <g class="text">
                    <text x="132" y="36">from</text>
                    <text x="180" y="36">upload</text>
                    <text x="256" y="36">interaction</text>
                    <text x="28" y="116">Client</text>
                    <text x="84" y="116">report</text>
                    <text x="120" y="116">1</text>
                    <text x="180" y="116">Client</text>
                    <text x="236" y="116">report</text>
                    <text x="272" y="116">2</text>
                    <text x="312" y="116">...</text>
                    <text x="372" y="116">Client</text>
                    <text x="428" y="116">report</text>
                    <text x="464" y="116">i</text>
                    <text x="232" y="164">...</text>
                    <text x="180" y="196">assign</text>
                    <text x="240" y="196">reports</text>
                    <text x="384" y="196">aggregation</text>
                    <text x="472" y="196">parameter</text>
                    <text x="140" y="212">to</text>
                    <text x="200" y="212">aggregation</text>
                    <text x="268" y="212">jobs</text>
                    <text x="372" y="212">chosen</text>
                    <text x="412" y="212">by</text>
                    <text x="464" y="212">Collector</text>
                    <text x="64" y="308">aggregation</text>
                    <text x="200" y="308">aggregation</text>
                    <text x="288" y="308">...</text>
                    <text x="368" y="308">aggregation</text>
                    <text x="56" y="324">job</text>
                    <text x="80" y="324">1</text>
                    <text x="192" y="324">job</text>
                    <text x="216" y="324">2</text>
                    <text x="368" y="324">job</text>
                    <text x="392" y="324">j</text>
                    <text x="96" y="436">...</text>
                    <text x="360" y="436">...</text>
                    <text x="60" y="468">accumulate</text>
                    <text x="132" y="468">Leader</text>
                    <text x="316" y="468">accumulate</text>
                    <text x="388" y="468">Helper</text>
                    <text x="60" y="484">output</text>
                    <text x="116" y="484">shares</text>
                    <text x="316" y="484">output</text>
                    <text x="372" y="484">shares</text>
                    <text x="104" y="516">...</text>
                    <text x="352" y="516">...</text>
                    <text x="28" y="548">Leader</text>
                    <text x="80" y="548">batch</text>
                    <text x="132" y="548">bucket</text>
                    <text x="168" y="548">1</text>
                    <text x="292" y="548">Helper</text>
                    <text x="344" y="548">batch</text>
                    <text x="396" y="548">bucket</text>
                    <text x="432" y="548">1</text>
                    <text x="44" y="596">Leader</text>
                    <text x="96" y="596">batch</text>
                    <text x="148" y="596">bucket</text>
                    <text x="184" y="596">2</text>
                    <text x="308" y="596">Helper</text>
                    <text x="360" y="596">batch</text>
                    <text x="412" y="596">bucket</text>
                    <text x="448" y="596">2</text>
                    <text x="60" y="644">Leader</text>
                    <text x="112" y="644">batch</text>
                    <text x="164" y="644">bucket</text>
                    <text x="200" y="644">m</text>
                    <text x="340" y="644">Helper</text>
                    <text x="392" y="644">batch</text>
                    <text x="444" y="644">bucket</text>
                    <text x="480" y="644">m</text>
                    <text x="104" y="660">...</text>
                    <text x="352" y="660">...</text>
                    <text x="124" y="708">to</text>
                    <text x="180" y="708">collection</text>
                    <text x="272" y="708">interaction</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
              from upload interaction
                         |
      .------------------+-----------------------.
      |                  |                       |
      v                  v                       v
Client report 1    Client report 2   ...   Client report i
      |                  |                       |
      '----------------. |     .-----------------'
                       | | ... |
               .-------+-+-----+---.
              |    assign reports   +---- aggregation parameter
              | to aggregation jobs |      chosen by Collector
               '--------+----------'
                        |
       .----------------+--------------------.
       |                |                    |
       v                v                    v
  aggregation      aggregation    ...   aggregation
     job 1            job 2                 job j
      | |              | |                   | |
      | |              | '---------------.   | |
      | '------------------------------. |   | |
      |                |               | |   | |
      | .--------------'               | |   | |
      | |     .------------------------------' |
      | | ... |                        | | ... |
 .----+-+-----+-----.            .-----+-+-----+---.
| accumulate Leader  |          | accumulate Helper |
|   output shares    |          |   output shares   |
 '----+--+-----+----'            '---+--+-----+----'
      |  | ... |                     |  | ... |
      v  |     |                     v  |     |
Leader batch bucket 1            Helper batch bucket 1
      |  |     |                     |  |     |
      |  v     |                     |  v     |
  Leader batch bucket 2            Helper batch bucket 2
      |  |     |                     |  |     |
      |  |     v                     |  |     v
    Leader batch bucket m            | Helper batch bucket m
      |  | ... |                     |  | ... |
      '--+-----+----------+----------+--+-----'
                          v
              to collection interaction
]]></artwork>
            </artset>
          </figure>
          <t>Each aggregation job verifies <tt>k</tt> reports (each consisting of a public share,
Leader report share and Helper report share) into <tt>k</tt> Leader output shares and
<tt>k</tt> Helper output shares. The aggregation parameter is chosen by the Collector
(or in some settings it may be known prior to the Collector's involvement, as
discussed in <xref target="eager-aggregation"/>) and is used to verify all the reports in
one or more aggregation jobs.</t>
          <figure anchor="object-lifecycle-agg-job">
            <name>Detail of an individual aggregation job</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="496" viewBox="0 0 496 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 48,48 L 48,80" fill="none" stroke="black"/>
                  <path d="M 48,112 L 48,144" fill="none" stroke="black"/>
                  <path d="M 72,48 L 72,80" fill="none" stroke="black"/>
                  <path d="M 80,112 L 80,144" fill="none" stroke="black"/>
                  <path d="M 80,192 L 80,208" fill="none" stroke="black"/>
                  <path d="M 184,48 L 184,80" fill="none" stroke="black"/>
                  <path d="M 184,112 L 184,144" fill="none" stroke="black"/>
                  <path d="M 208,48 L 208,80" fill="none" stroke="black"/>
                  <path d="M 216,112 L 216,144" fill="none" stroke="black"/>
                  <path d="M 216,192 L 216,208" fill="none" stroke="black"/>
                  <path d="M 344,48 L 344,80" fill="none" stroke="black"/>
                  <path d="M 344,112 L 344,144" fill="none" stroke="black"/>
                  <path d="M 368,48 L 368,80" fill="none" stroke="black"/>
                  <path d="M 376,112 L 376,144" fill="none" stroke="black"/>
                  <path d="M 376,192 L 376,208" fill="none" stroke="black"/>
                  <path d="M 72,48 L 176,48" fill="none" stroke="black"/>
                  <path d="M 192,48 L 336,48" fill="none" stroke="black"/>
                  <path d="M 352,48 L 392,48" fill="none" stroke="black"/>
                  <path d="M 24,80 L 112,80" fill="none" stroke="black"/>
                  <path d="M 168,80 L 256,80" fill="none" stroke="black"/>
                  <path d="M 336,80 L 424,80" fill="none" stroke="black"/>
                  <path d="M 24,112 L 112,112" fill="none" stroke="black"/>
                  <path d="M 168,112 L 256,112" fill="none" stroke="black"/>
                  <path d="M 336,112 L 424,112" fill="none" stroke="black"/>
                  <path d="M 24,80 C 15.16936,80 8,87.16936 8,96" fill="none" stroke="black"/>
                  <path d="M 112,80 C 120.83064,80 128,87.16936 128,96" fill="none" stroke="black"/>
                  <path d="M 168,80 C 159.16936,80 152,87.16936 152,96" fill="none" stroke="black"/>
                  <path d="M 256,80 C 264.83064,80 272,87.16936 272,96" fill="none" stroke="black"/>
                  <path d="M 336,80 C 327.16936,80 320,87.16936 320,96" fill="none" stroke="black"/>
                  <path d="M 424,80 C 432.83064,80 440,87.16936 440,96" fill="none" stroke="black"/>
                  <path d="M 24,112 C 15.16936,112 8,104.83064 8,96" fill="none" stroke="black"/>
                  <path d="M 112,112 C 120.83064,112 128,104.83064 128,96" fill="none" stroke="black"/>
                  <path d="M 168,112 C 159.16936,112 152,104.83064 152,96" fill="none" stroke="black"/>
                  <path d="M 256,112 C 264.83064,112 272,104.83064 272,96" fill="none" stroke="black"/>
                  <path d="M 336,112 C 327.16936,112 320,104.83064 320,96" fill="none" stroke="black"/>
                  <path d="M 424,112 C 432.83064,112 440,104.83064 440,96" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="384,208 372,202.4 372,213.6" fill="black" transform="rotate(90,376,208)"/>
                  <polygon class="arrowhead" points="352,144 340,138.4 340,149.6" fill="black" transform="rotate(90,344,144)"/>
                  <polygon class="arrowhead" points="224,208 212,202.4 212,213.6" fill="black" transform="rotate(90,216,208)"/>
                  <polygon class="arrowhead" points="192,144 180,138.4 180,149.6" fill="black" transform="rotate(90,184,144)"/>
                  <polygon class="arrowhead" points="88,208 76,202.4 76,213.6" fill="black" transform="rotate(90,80,208)"/>
                  <polygon class="arrowhead" points="56,144 44,138.4 44,149.6" fill="black" transform="rotate(90,48,144)"/>
                  <g class="text">
                    <text x="44" y="36">report</text>
                    <text x="80" y="36">1</text>
                    <text x="180" y="36">report</text>
                    <text x="216" y="36">2</text>
                    <text x="264" y="36">...</text>
                    <text x="340" y="36">report</text>
                    <text x="376" y="36">k</text>
                    <text x="448" y="52">aggregation</text>
                    <text x="448" y="68">parameter</text>
                    <text x="68" y="100">verification</text>
                    <text x="212" y="100">verification</text>
                    <text x="296" y="100">...</text>
                    <text x="380" y="100">verification</text>
                    <text x="36" y="164">leader</text>
                    <text x="92" y="164">output</text>
                    <text x="172" y="164">leader</text>
                    <text x="228" y="164">output</text>
                    <text x="280" y="164">...</text>
                    <text x="332" y="164">leader</text>
                    <text x="388" y="164">output</text>
                    <text x="56" y="180">share</text>
                    <text x="88" y="180">1</text>
                    <text x="192" y="180">share</text>
                    <text x="224" y="180">2</text>
                    <text x="352" y="180">share</text>
                    <text x="384" y="180">k</text>
                    <text x="52" y="228">helper</text>
                    <text x="108" y="228">output</text>
                    <text x="188" y="228">helper</text>
                    <text x="244" y="228">output</text>
                    <text x="296" y="228">...</text>
                    <text x="348" y="228">helper</text>
                    <text x="404" y="228">output</text>
                    <text x="72" y="244">share</text>
                    <text x="104" y="244">1</text>
                    <text x="208" y="244">share</text>
                    <text x="240" y="244">2</text>
                    <text x="368" y="244">share</text>
                    <text x="400" y="244">k</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
  report 1         report 2    ...     report k
     |  .-------------|--+----------------|--+--- aggregation
     |  |             |  |                |  |     parameter
 .---+--+-----.    .--+--+------.       .-+--+-------.
| verification |  | verification | ... | verification |
 '---+---+----'    '--+---+-----'       '-+---+------'
     |   |            |   |               |   |
     v   |            v   |               v   |
 leader output    leader output  ...  leader output
    share 1          share 2             share k
         |                |                   |
         v                v                   v
   helper output    helper output  ...  helper output
      share 1          share 2             share k
]]></artwork>
            </artset>
          </figure>
          <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 refined into output
shares during VDAF verification.</t>
          <figure anchor="object-lifecycle-report-verify">
            <name>Detail of verification of an individual report</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="384" width="456" viewBox="0 0 456 384" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 48,64 L 48,80" fill="none" stroke="black"/>
                  <path d="M 48,128 L 48,144" fill="none" stroke="black"/>
                  <path d="M 48,176 L 48,208" fill="none" stroke="black"/>
                  <path d="M 48,256 L 48,272" fill="none" stroke="black"/>
                  <path d="M 56,304 L 56,336" fill="none" stroke="black"/>
                  <path d="M 176,48 L 176,80" fill="none" stroke="black"/>
                  <path d="M 176,128 L 176,144" fill="none" stroke="black"/>
                  <path d="M 176,176 L 176,208" fill="none" stroke="black"/>
                  <path d="M 176,256 L 176,272" fill="none" stroke="black"/>
                  <path d="M 184,304 L 184,336" fill="none" stroke="black"/>
                  <path d="M 280,64 L 280,80" fill="none" stroke="black"/>
                  <path d="M 280,128 L 280,272" fill="none" stroke="black"/>
                  <path d="M 368,48 L 368,288" fill="none" stroke="black"/>
                  <path d="M 48,64 L 280,64" fill="none" stroke="black"/>
                  <path d="M 24,144 L 72,144" fill="none" stroke="black"/>
                  <path d="M 152,144 L 200,144" fill="none" stroke="black"/>
                  <path d="M 24,176 L 72,176" fill="none" stroke="black"/>
                  <path d="M 152,176 L 200,176" fill="none" stroke="black"/>
                  <path d="M 24,272 L 280,272" fill="none" stroke="black"/>
                  <path d="M 296,288 L 368,288" fill="none" stroke="black"/>
                  <path d="M 24,304 L 280,304" fill="none" stroke="black"/>
                  <path d="M 24,144 C 15.16936,144 8,151.16936 8,160" fill="none" stroke="black"/>
                  <path d="M 72,144 C 80.83064,144 88,151.16936 88,160" fill="none" stroke="black"/>
                  <path d="M 152,144 C 143.16936,144 136,151.16936 136,160" fill="none" stroke="black"/>
                  <path d="M 200,144 C 208.83064,144 216,151.16936 216,160" fill="none" stroke="black"/>
                  <path d="M 24,176 C 15.16936,176 8,168.83064 8,160" fill="none" stroke="black"/>
                  <path d="M 72,176 C 80.83064,176 88,168.83064 88,160" fill="none" stroke="black"/>
                  <path d="M 152,176 C 143.16936,176 136,168.83064 136,160" fill="none" stroke="black"/>
                  <path d="M 200,176 C 208.83064,176 216,168.83064 216,160" fill="none" stroke="black"/>
                  <path d="M 24,272 C 15.16936,272 8,279.16936 8,288" fill="none" stroke="black"/>
                  <path d="M 280,272 C 288.83064,272 296,279.16936 296,288" fill="none" stroke="black"/>
                  <path d="M 24,304 C 15.16936,304 8,296.83064 8,288" fill="none" stroke="black"/>
                  <path d="M 280,304 C 288.83064,304 296,296.83064 296,288" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="192,336 180,330.4 180,341.6" fill="black" transform="rotate(90,184,336)"/>
                  <polygon class="arrowhead" points="184,208 172,202.4 172,213.6" fill="black" transform="rotate(90,176,208)"/>
                  <polygon class="arrowhead" points="64,336 52,330.4 52,341.6" fill="black" transform="rotate(90,56,336)"/>
                  <polygon class="arrowhead" points="56,208 44,202.4 44,213.6" fill="black" transform="rotate(90,48,208)"/>
                  <g class="text">
                    <text x="172" y="36">report</text>
                    <text x="328" y="36">aggregation</text>
                    <text x="416" y="36">parameter</text>
                    <text x="44" y="100">Leader</text>
                    <text x="148" y="100">Helper</text>
                    <text x="204" y="100">report</text>
                    <text x="284" y="100">public</text>
                    <text x="28" y="116">report</text>
                    <text x="80" y="116">share</text>
                    <text x="176" y="116">share</text>
                    <text x="280" y="116">share</text>
                    <text x="48" y="164">decrypt</text>
                    <text x="176" y="164">decrypt</text>
                    <text x="52" y="228">Leader</text>
                    <text x="180" y="228">Helper</text>
                    <text x="24" y="244">input</text>
                    <text x="72" y="244">share</text>
                    <text x="152" y="244">input</text>
                    <text x="200" y="244">share</text>
                    <text x="100" y="292">verify</text>
                    <text x="152" y="292">input</text>
                    <text x="200" y="292">share</text>
                    <text x="28" y="356">Leader</text>
                    <text x="84" y="356">output</text>
                    <text x="156" y="356">Helper</text>
                    <text x="212" y="356">output</text>
                    <text x="56" y="372">share</text>
                    <text x="184" y="372">share</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
                  report           aggregation parameter
                     |                       |
     .---------------+------------.          |
     |               |            |          |
  Leader       Helper report    public       |
report share       share        share        |
     |               |            |          |
 .---+---.       .---+---.        |          |
| decrypt |     | decrypt |       |          |
 '---+---'       '---+---'        |          |
     |               |            |          |
     v               v            |          |
   Leader          Helper         |          |
input share     input share       |          |
     |               |            |          |
 .---+---------------+------------+.         |
|        verify input share         +--------+
 '----+---------------+------------'
      |               |
      v               v
Leader output   Helper output
    share           share
]]></artwork>
            </artset>
          </figure>
        </section>
        <section anchor="the-collection-interaction">
          <name>The Collection Interaction</name>
          <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 finally deliver their encrypted aggregate shares to the
Collector to be decrypted and then 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>
          <figure anchor="object-lifecycle-collection">
            <name>Lifecycles of protocol objects in the collection interaction</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="752" width="488" viewBox="0 0 488 752" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 40,288 L 40,304" fill="none" stroke="black"/>
                  <path d="M 72,64 L 72,96" fill="none" stroke="black"/>
                  <path d="M 72,128 L 72,144" fill="none" stroke="black"/>
                  <path d="M 72,176 L 72,192" fill="none" stroke="black"/>
                  <path d="M 72,224 L 72,264" fill="none" stroke="black"/>
                  <path d="M 88,64 L 88,96" fill="none" stroke="black"/>
                  <path d="M 88,128 L 88,144" fill="none" stroke="black"/>
                  <path d="M 88,176 L 88,192" fill="none" stroke="black"/>
                  <path d="M 88,224 L 88,264" fill="none" stroke="black"/>
                  <path d="M 104,320 L 104,352" fill="none" stroke="black"/>
                  <path d="M 104,384 L 104,400" fill="none" stroke="black"/>
                  <path d="M 104,432 L 104,464" fill="none" stroke="black"/>
                  <path d="M 104,512 L 104,528" fill="none" stroke="black"/>
                  <path d="M 104,560 L 104,592" fill="none" stroke="black"/>
                  <path d="M 104,624 L 104,640" fill="none" stroke="black"/>
                  <path d="M 136,64 L 136,96" fill="none" stroke="black"/>
                  <path d="M 136,128 L 136,144" fill="none" stroke="black"/>
                  <path d="M 136,176 L 136,192" fill="none" stroke="black"/>
                  <path d="M 136,224 L 136,264" fill="none" stroke="black"/>
                  <path d="M 168,288 L 168,304" fill="none" stroke="black"/>
                  <path d="M 216,48 L 216,64" fill="none" stroke="black"/>
                  <path d="M 232,272 L 232,304" fill="none" stroke="black"/>
                  <path d="M 232,640 L 232,672" fill="none" stroke="black"/>
                  <path d="M 232,704 L 232,720" fill="none" stroke="black"/>
                  <path d="M 296,288 L 296,304" fill="none" stroke="black"/>
                  <path d="M 328,64 L 328,96" fill="none" stroke="black"/>
                  <path d="M 328,128 L 328,144" fill="none" stroke="black"/>
                  <path d="M 328,176 L 328,192" fill="none" stroke="black"/>
                  <path d="M 328,224 L 328,264" fill="none" stroke="black"/>
                  <path d="M 344,64 L 344,96" fill="none" stroke="black"/>
                  <path d="M 344,128 L 344,144" fill="none" stroke="black"/>
                  <path d="M 344,176 L 344,192" fill="none" stroke="black"/>
                  <path d="M 344,224 L 344,264" fill="none" stroke="black"/>
                  <path d="M 360,320 L 360,352" fill="none" stroke="black"/>
                  <path d="M 360,384 L 360,400" fill="none" stroke="black"/>
                  <path d="M 360,432 L 360,464" fill="none" stroke="black"/>
                  <path d="M 360,512 L 360,528" fill="none" stroke="black"/>
                  <path d="M 360,560 L 360,592" fill="none" stroke="black"/>
                  <path d="M 360,624 L 360,640" fill="none" stroke="black"/>
                  <path d="M 392,64 L 392,96" fill="none" stroke="black"/>
                  <path d="M 392,128 L 392,144" fill="none" stroke="black"/>
                  <path d="M 392,176 L 392,192" fill="none" stroke="black"/>
                  <path d="M 392,224 L 392,264" fill="none" stroke="black"/>
                  <path d="M 424,288 L 424,304" fill="none" stroke="black"/>
                  <path d="M 72,64 L 392,64" fill="none" stroke="black"/>
                  <path d="M 56,272 L 152,272" fill="none" stroke="black"/>
                  <path d="M 312,272 L 408,272" fill="none" stroke="black"/>
                  <path d="M 168,304 L 296,304" fill="none" stroke="black"/>
                  <path d="M 56,320 L 152,320" fill="none" stroke="black"/>
                  <path d="M 312,320 L 408,320" fill="none" stroke="black"/>
                  <path d="M 40,400 L 192,400" fill="none" stroke="black"/>
                  <path d="M 296,400 L 448,400" fill="none" stroke="black"/>
                  <path d="M 40,432 L 192,432" fill="none" stroke="black"/>
                  <path d="M 296,432 L 448,432" fill="none" stroke="black"/>
                  <path d="M 80,528 L 128,528" fill="none" stroke="black"/>
                  <path d="M 336,528 L 384,528" fill="none" stroke="black"/>
                  <path d="M 80,560 L 128,560" fill="none" stroke="black"/>
                  <path d="M 336,560 L 384,560" fill="none" stroke="black"/>
                  <path d="M 104,640 L 360,640" fill="none" stroke="black"/>
                  <path d="M 208,672 L 256,672" fill="none" stroke="black"/>
                  <path d="M 208,704 L 256,704" fill="none" stroke="black"/>
                  <path d="M 56,272 C 47.16936,272 40,279.16936 40,288" fill="none" stroke="black"/>
                  <path d="M 152,272 C 160.83064,272 168,279.16936 168,288" fill="none" stroke="black"/>
                  <path d="M 312,272 C 303.16936,272 296,279.16936 296,288" fill="none" stroke="black"/>
                  <path d="M 408,272 C 416.83064,272 424,279.16936 424,288" fill="none" stroke="black"/>
                  <path d="M 56,320 C 47.16936,320 40,312.83064 40,304" fill="none" stroke="black"/>
                  <path d="M 152,320 C 160.83064,320 168,312.83064 168,304" fill="none" stroke="black"/>
                  <path d="M 312,320 C 303.16936,320 296,312.83064 296,304" fill="none" stroke="black"/>
                  <path d="M 408,320 C 416.83064,320 424,312.83064 424,304" fill="none" stroke="black"/>
                  <path d="M 40,400 C 31.16936,400 24,407.16936 24,416" fill="none" stroke="black"/>
                  <path d="M 192,400 C 200.83064,400 208,407.16936 208,416" fill="none" stroke="black"/>
                  <path d="M 296,400 C 287.16936,400 280,407.16936 280,416" fill="none" stroke="black"/>
                  <path d="M 448,400 C 456.83064,400 464,407.16936 464,416" fill="none" stroke="black"/>
                  <path d="M 40,432 C 31.16936,432 24,424.83064 24,416" fill="none" stroke="black"/>
                  <path d="M 192,432 C 200.83064,432 208,424.83064 208,416" fill="none" stroke="black"/>
                  <path d="M 296,432 C 287.16936,432 280,424.83064 280,416" fill="none" stroke="black"/>
                  <path d="M 448,432 C 456.83064,432 464,424.83064 464,416" fill="none" stroke="black"/>
                  <path d="M 80,528 C 71.16936,528 64,535.16936 64,544" fill="none" stroke="black"/>
                  <path d="M 128,528 C 136.83064,528 144,535.16936 144,544" fill="none" stroke="black"/>
                  <path d="M 336,528 C 327.16936,528 320,535.16936 320,544" fill="none" stroke="black"/>
                  <path d="M 384,528 C 392.83064,528 400,535.16936 400,544" fill="none" stroke="black"/>
                  <path d="M 80,560 C 71.16936,560 64,552.83064 64,544" fill="none" stroke="black"/>
                  <path d="M 128,560 C 136.83064,560 144,552.83064 144,544" fill="none" stroke="black"/>
                  <path d="M 336,560 C 327.16936,560 320,552.83064 320,544" fill="none" stroke="black"/>
                  <path d="M 384,560 C 392.83064,560 400,552.83064 400,544" fill="none" stroke="black"/>
                  <path d="M 208,672 C 199.16936,672 192,679.16936 192,688" fill="none" stroke="black"/>
                  <path d="M 256,672 C 264.83064,672 272,679.16936 272,688" fill="none" stroke="black"/>
                  <path d="M 208,704 C 199.16936,704 192,696.83064 192,688" fill="none" stroke="black"/>
                  <path d="M 256,704 C 264.83064,704 272,696.83064 272,688" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="400,264 388,258.4 388,269.6" fill="black" transform="rotate(90,392,264)"/>
                  <polygon class="arrowhead" points="400,192 388,186.4 388,197.6" fill="black" transform="rotate(90,392,192)"/>
                  <polygon class="arrowhead" points="368,592 356,586.4 356,597.6" fill="black" transform="rotate(90,360,592)"/>
                  <polygon class="arrowhead" points="368,464 356,458.4 356,469.6" fill="black" transform="rotate(90,360,464)"/>
                  <polygon class="arrowhead" points="368,352 356,346.4 356,357.6" fill="black" transform="rotate(90,360,352)"/>
                  <polygon class="arrowhead" points="352,264 340,258.4 340,269.6" fill="black" transform="rotate(90,344,264)"/>
                  <polygon class="arrowhead" points="352,144 340,138.4 340,149.6" fill="black" transform="rotate(90,344,144)"/>
                  <polygon class="arrowhead" points="336,264 324,258.4 324,269.6" fill="black" transform="rotate(90,328,264)"/>
                  <polygon class="arrowhead" points="336,96 324,90.4 324,101.6" fill="black" transform="rotate(90,328,96)"/>
                  <polygon class="arrowhead" points="240,720 228,714.4 228,725.6" fill="black" transform="rotate(90,232,720)"/>
                  <polygon class="arrowhead" points="144,264 132,258.4 132,269.6" fill="black" transform="rotate(90,136,264)"/>
                  <polygon class="arrowhead" points="144,192 132,186.4 132,197.6" fill="black" transform="rotate(90,136,192)"/>
                  <polygon class="arrowhead" points="112,592 100,586.4 100,597.6" fill="black" transform="rotate(90,104,592)"/>
                  <polygon class="arrowhead" points="112,464 100,458.4 100,469.6" fill="black" transform="rotate(90,104,464)"/>
                  <polygon class="arrowhead" points="112,352 100,346.4 100,357.6" fill="black" transform="rotate(90,104,352)"/>
                  <polygon class="arrowhead" points="96,264 84,258.4 84,269.6" fill="black" transform="rotate(90,88,264)"/>
                  <polygon class="arrowhead" points="96,144 84,138.4 84,149.6" fill="black" transform="rotate(90,88,144)"/>
                  <polygon class="arrowhead" points="80,264 68,258.4 68,269.6" fill="black" transform="rotate(90,72,264)"/>
                  <polygon class="arrowhead" points="80,96 68,90.4 68,101.6" fill="black" transform="rotate(90,72,96)"/>
                  <g class="text">
                    <text x="116" y="36">from</text>
                    <text x="184" y="36">aggregation</text>
                    <text x="280" y="36">interaction</text>
                    <text x="28" y="116">Leader</text>
                    <text x="80" y="116">batch</text>
                    <text x="132" y="116">bucket</text>
                    <text x="168" y="116">1</text>
                    <text x="292" y="116">Helper</text>
                    <text x="344" y="116">batch</text>
                    <text x="396" y="116">bucket</text>
                    <text x="432" y="116">1</text>
                    <text x="44" y="164">Leader</text>
                    <text x="96" y="164">batch</text>
                    <text x="148" y="164">bucket</text>
                    <text x="184" y="164">2</text>
                    <text x="308" y="164">Helper</text>
                    <text x="360" y="164">batch</text>
                    <text x="412" y="164">bucket</text>
                    <text x="448" y="164">2</text>
                    <text x="60" y="212">Leader</text>
                    <text x="112" y="212">batch</text>
                    <text x="164" y="212">bucket</text>
                    <text x="200" y="212">m</text>
                    <text x="340" y="212">Helper</text>
                    <text x="392" y="212">batch</text>
                    <text x="444" y="212">bucket</text>
                    <text x="480" y="212">m</text>
                    <text x="200" y="244">query</text>
                    <text x="252" y="244">chosen</text>
                    <text x="112" y="260">...</text>
                    <text x="188" y="260">by</text>
                    <text x="240" y="260">Collector</text>
                    <text x="368" y="260">...</text>
                    <text x="80" y="292">merge</text>
                    <text x="132" y="292">Leader</text>
                    <text x="328" y="292">merge</text>
                    <text x="380" y="292">Helper</text>
                    <text x="72" y="308">batch</text>
                    <text x="128" y="308">buckets</text>
                    <text x="328" y="308">batch</text>
                    <text x="384" y="308">buckets</text>
                    <text x="44" y="372">Leader</text>
                    <text x="112" y="372">aggregate</text>
                    <text x="176" y="372">share</text>
                    <text x="300" y="372">Helper</text>
                    <text x="368" y="372">aggregate</text>
                    <text x="432" y="372">share</text>
                    <text x="64" y="420">encrypt</text>
                    <text x="108" y="420">to</text>
                    <text x="160" y="420">Collector</text>
                    <text x="320" y="420">encrypt</text>
                    <text x="364" y="420">to</text>
                    <text x="416" y="420">Collector</text>
                    <text x="80" y="484">encrypted</text>
                    <text x="148" y="484">Leader</text>
                    <text x="336" y="484">encrypted</text>
                    <text x="404" y="484">Helper</text>
                    <text x="88" y="500">aggregate</text>
                    <text x="152" y="500">share</text>
                    <text x="336" y="500">aggregate</text>
                    <text x="400" y="500">share</text>
                    <text x="104" y="548">decrypt</text>
                    <text x="360" y="548">decrypt</text>
                    <text x="44" y="612">Leader</text>
                    <text x="112" y="612">aggregate</text>
                    <text x="176" y="612">share</text>
                    <text x="300" y="612">Helper</text>
                    <text x="368" y="612">aggregate</text>
                    <text x="432" y="612">share</text>
                    <text x="232" y="692">unshard</text>
                    <text x="208" y="740">aggregate</text>
                    <text x="276" y="740">result</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
            from aggregation interaction
                          |
        .-+-----+---------+-------------+-+-----.
        | |     |                       | |     |
        v |     |                       v |     |
Leader batch bucket 1            Helper batch bucket 1
        | |     |                       | |     |
        | v     |                       | v     |
  Leader batch bucket 2            Helper batch bucket 2
        | |     |                       | |     |
        | |     v                       | |     v
    Leader batch bucket m              Helper batch bucket m
        | |     |                       | |     |
        | |     |     query chosen      | |     |
        v v ... v     by Collector      v v ... v
     .--+-+-----+--.        |        .--+-+-----+--.
    |  merge Leader |       |       | merge Helper  |
    | batch buckets +-------+-------+ batch buckets |
     '------+------'                 '------+------'
            |                               |
            v                               v
  Leader aggregate share          Helper aggregate share
            |                               |
   .--------+-----------.          .--------+-----------.
  | encrypt to Collector |        | encrypt to Collector |
   '--------+-----------'          '--------+-----------'
            |                               |
            v                               v
     encrypted Leader                encrypted Helper
      aggregate share                aggregate share
            |                               |
        .---+---.                       .---+---.
       | decrypt |                     | decrypt |
        '---+---'                       '---+---'
            |                               |
            v                               v
  Leader aggregate share          Helper aggregate share
            |                               |
            '---------------+---------------'
                            |
                        .---+---.
                       | unshard |
                        '---+---'
                            v
                     aggregate result
]]></artwork>
            </artset>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="http-usage">
      <name>HTTP Usage</name>
      <t>DAP is defined in terms of HTTP <xref target="RFC9110"/> resources. These are HPKE
configurations (<xref target="hpke-config"/>), reports (<xref target="upload-flow"/>), aggregation jobs
(<xref target="aggregate-flow"/>), collection jobs (<xref target="collect-flow"/>), and aggregate shares
(<xref target="collect-aggregate"/>).</t>
      <t>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>The 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="asynchronous-request-handling">
        <name>Asynchronous Request Handling</name>
        <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 resource's location will be
indicated by a Location header in the HTTP server's response (<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>); see <xref target="resource-creation"/>. 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 fetch the resource. 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>
        <t>Implementations are not required to support GET on resources if they are served
synchronously, but they could do so, as a way for other protocol participants to
retrieve the results of some transaction later on. The retention period for
job results is an implementation detail.</t>
      </section>
      <section anchor="resource-creation">
        <name>Resource Creation</name>
        <t>Several DAP interactions involve creating new resources on an HTTP server:
aggregation jobs (<xref target="agg-init"/>), collection jobs (<xref target="collect-init"/>), and
aggregate shares (<xref target="collect-aggregate"/>). In each case, the HTTP client sends a
POST request to a creation URL and the HTTP server assigns the new resource a
unique identifier.</t>
        <t>The server responds with a successful status code and a Location header field
(<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>) indicating the location of the newly created
resource. If the server handles the request synchronously, the response also
includes the resource's representation in the body. If the server defers
handling, the response body is empty and the HTTP client polls the resource at
the location indicated by the Location header, as described in <xref target="http-usage"/>.</t>
        <t>Resource creation <bcp14>MUST</bcp14> be idempotent: if the server receives a POST request
identical to one that created an existing resource (as defined by the interaction-
specific criteria below), it <bcp14>MUST</bcp14> indicate the existing resource's location
in the Location header rather than creating a duplicate. This allows HTTP clients
to safely retry requests without risking side effects.</t>
        <t>One way to achieve this is to derive the resource identifier deterministically
from the request content.</t>
      </section>
      <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>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><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 extensions list includes an unknown extension.</td>
            </tr>
            <tr>
              <td align="left">invalidExtension</td>
              <td align="left">An extensions list is out of order or contains an invalid extension encoding.</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 verify 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_verify_error(6),
  task_expired(7),
  invalid_message(8),
  report_too_early(9),
  task_not_started(10),
  outdated_config(11),
  (255)
} ReportError;
]]></sourcecode>
        <t>A <tt>Url</tt> is the encoding of a URL (<xref target="RFC3986"/>) as ASCII bytes. The encoding of
any particular URL into ASCII is agreed upon by participants out of band from
the protocol. Protocol participants <bcp14>MUST NOT</bcp14> re-encode or otherwise alter a
<tt>Url</tt> when including it in a network message or cryptographic digest.</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque Url<1..2^16-1>;
]]></sourcecode>
        <section anchor="timestamps">
          <name>Times, Durations and Intervals</name>
          <sourcecode type="tls-presentation"><![CDATA[
uint64 TimePrecision;

uint64 Time;
]]></sourcecode>
          <t>A <tt>TimePrecision</tt> is an integer number of seconds, used to compute times and
durations in DAP. The time precision is a parameter of a task
(<xref target="task-configuration"/>).</t>
          <t>Times are integers, representing a number of <tt>TimePrecision</tt>s since the Epoch,
defined in section 4.16 of <xref target="POSIX"/>. That is, the number of seconds after
1970-01-01 00:00:00 UTC, excluding leap seconds, divided by the task's
<tt>time_precision</tt>.</t>
          <t>One POSIX timestamp is said to be before (respectively, after) another POSIX
timestamp if it is less than (respectively, greater than) the other value.</t>
          <t>Times can only be meaningfully compared to one another if they use the same time
precision.</t>
          <sourcecode type="tls-presentation"><![CDATA[
uint64 Duration;
]]></sourcecode>
          <t>Durations of time are integers, representing a number of <tt>TimePrecision</tt>s. That
is, a number of seconds divided by the task's <tt>time_precision</tt>. A duration can
be added to a time to produce another time.</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>
          <t>Intervals can only be meaningfully compared to one another if they use the same
time precision.</t>
          <section anchor="examples">
            <name>Examples</name>
            <t>Suppose a task's <tt>time_precision</tt> is 10 seconds. A <tt>Time</tt> whose value is
123456789 represents the POSIX timestamp <tt>1234567890</tt>, or 2009-02-13 23:31:30
UTC. A <tt>Duration</tt> whose value is <tt>11</tt> represents a duration of 110 seconds.</t>
            <t>An <tt>Interval</tt> whose <tt>start</tt> is 123456789 and whose <tt>duration</tt> is 11 represents
the interval from time from POSIX timestamp <tt>1234567890</tt> to <tt>1234568000</tt>, or
2009-02-13 23:31:30 UTC to 2009-02-13 23:33:20 UTC.</t>
          </section>
        </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>verify_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>VerifierShare</t>
            </li>
            <li>
              <t>VerifierMessage</t>
            </li>
          </ul>
          <t>VDAFs compatible with DAP <bcp14>MUST</bcp14> specify an encoding of their configuration, which
is included into the task configuration to prevent cross protocol attacks or
parameter disagreement; see <xref target="task-configuration"/> and <xref target="task-binding"/>.
Encodings for the VDAFs defined in <xref target="VDAF"/> are provided in
<xref target="vdaf-configuration-encodings"/>.</t>
        </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. See
<xref target="sec-considerations"/> for some discussion of task parameter choices.</t>
        <t>To ensure that reports are only aggregated if the Client, Aggregators and
Collector agree on the parameters in use, protocol participants incorporate the
encoding of agreed-upon task parameters into <xref target="HPKE"/> authenticated data.</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 is described
by a <tt>TaskConfiguration</tt> structure:</t>
        <sourcecode type="tls-presentation"><![CDATA[
uint32 VdafType;

struct {
    opaque task_info<1..2^8-1>;
    Url leader_aggregator_endpoint;
    Url helper_aggregator_endpoint;
    TimePrecision time_precision;
    uint64 min_batch_size;
    BatchMode batch_mode;
    opaque batch_config<0..2^16-1>;
    VdafType vdaf_type;
    opaque vdaf_configuration<0..2^16-1>;
    TaskExtension extensions<0..2^16-1>;
} TaskConfiguration;
]]></sourcecode>
        <ul spacing="normal">
          <li>
            <t><tt>task_info</tt> is an opaque sequence of bytes. Deployments may use it to
differentiate two tasks that otherwise would have identical configurations.</t>
          </li>
          <li>
            <t><tt>leader_aggregator_endpoint</tt> is the URL relative to which the Leader's API
resources can be found.</t>
          </li>
          <li>
            <t><tt>helper_aggregator_endpoint</tt> is the URL relative to which the Helper's API
resources can be found.</t>
          </li>
          <li>
            <t><tt>time_precision</tt> is the time precision used in this task; see <xref target="timestamps"/>.</t>
          </li>
          <li>
            <t><tt>min_batch_size</tt> is the smallest number of reports a batch is allowed to
include.</t>
          </li>
          <li>
            <t><tt>batch_mode</tt> is the codepoint from the Batch Modes Registry
(<xref target="batch-mode-reg"/>) corresponding to the DAP batch mode the task uses; see
<xref target="batch-modes-overview"/>.</t>
          </li>
          <li>
            <t><tt>batch_config</tt> contains any parameters that are required for configuring the
batch mode. For the time-interval and leader-selected batch modes, the payload
is empty. Batch modes defined by future documents may specify a non-empty
payload; see <xref target="batch-modes"/> for details.</t>
          </li>
          <li>
            <t><tt>vdaf_type</tt> indicates which VDAF the task is using and corresponds to a
codepoint in the VDAF Identifiers registry (<xref section="10" sectionFormat="of" target="VDAF"/>).</t>
          </li>
          <li>
            <t><tt>vdaf_configuration</tt> is the encoding of the VDAF's configuration. Encodings
for several VDAFs are specified in <xref target="vdaf-configuration-encodings"/>. Other
VDAFs will provide encodings of their configuration (<xref target="extending-this-doc"/>).</t>
          </li>
          <li>
            <t><tt>extensions</tt> is the extensions in use for this task, if any; see
<xref target="task-extensions"/>.</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, but not necessarily to
Clients or the Collector:</t>
        <ul spacing="normal">
          <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 (or keys)
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 anchor="task-extensions">
          <name>Task Extensions</name>
          <t>The <tt>TaskConfiguration</tt> structure includes a list of extensions. Extensions can
be used to bind additional, application-specific information to the task. For
example, an extension might be used to encode the identity of the Collector.</t>
          <t>Each extension is structured as follows:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  TaskExtensionType extension_type;
  opaque extension_data<0..2^16-1>;
} TaskExtension;

enum {
  reserved(0),
  task_interval(1),
  (2^16-1)
} TaskExtensionType;
]]></sourcecode>
          <t>The <tt>extension_type</tt> identifies the extension and <tt>extension_data</tt> is
structured as specified by the extension. Extension type values are defined in
<xref target="task-extensions-registry"/>.</t>
          <t>Extensions are mandatory to support. Protocol participants <bcp14>MUST NOT</bcp14> participate
in tasks containing unrecognized extensions.</t>
          <t>Extensions <bcp14>MUST</bcp14> be encoded in strictly increasing order of <tt>extension_type</tt>.
That is, each <tt>extension_type</tt> value must be greater than that of the extension
that precedes it.</t>
        </section>
        <section anchor="task-interval-extension">
          <name>Task Interval Task Extension</name>
          <t>The <tt>task_interval</tt> task extension (codepoint: 0x01)
constrains the period of time
over which reports can be generated for a task.
This extension can be included in task configuration
to ensure that tasks only run over a fixed period of time.</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  Interval task_interval;
} TaskIntervalTaskExtension;
]]></sourcecode>
          <t>The encoded value of this extension consists of a single <tt>Interval</tt>;
see <xref target="timestamps"/> for details.</t>
          <t>Reports with a timestamp that are outside of this interval
<bcp14>MUST</bcp14> be rejected by the Aggregators; see <xref target="input-share-validation"/>.</t>
        </section>
      </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 verify 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/ppm-dap;message=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/ppm-dap;message=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>Reports are uploaded using the reports resource, served by the Leader at
<tt>{leader}/tasks/{task-id}/reports</tt>. An upload is represented as an
<tt>UploadRequest</tt>, with media type "application/ppm-dap;message=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 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>
          <section anchor="client-behavior">
            <name>Client Behavior</name>
            <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-18" || 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>
            <t>(RFC EDITOR: Once the document becomes an RFC, we will stop including the draft
version in domain separation tags. In the remainder of this section, replace
"dap-18" with "dap".)</t>
            <sourcecode type="pseudocode"><![CDATA[
enc, payload = SealBase(pk,
  "dap-18 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>, 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 Aggregator's HPKE configuration.</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  TaskID task_id;
  TaskConfiguration task_configuration;
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
} InputShareAad;
]]></sourcecode>
            <ul spacing="normal">
              <li>
                <t><tt>task_id</tt>, <tt>report_metadata</tt> and <tt>public_share</tt> are the corresponding fields
from the <tt>Report</tt> structure.</t>
              </li>
              <li>
                <t><tt>task_configuration</tt> is the configuration of the task; see
<xref target="task-configuration"/>.</t>
              </li>
            </ul>
            <t>Clients upload reports by sending an <tt>UploadRequest</tt> as the body of a POST to
the Leader's reports resource.</t>
          </section>
          <section anchor="leader-behavior">
            <name>Leader Behavior</name>
            <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>If the upload request is malformed, the Leader aborts with error
<tt>invalidMessage</tt>.</t>
            <t>If the Leader does not recognize the task ID, then it aborts with error
<tt>unrecognizedTask</tt>.</t>
            <t>If all the reports in the request are accepted, then the Leader sends a response
with an empty body.</t>
            <t>If some or all of the reports fail to upload for one of the reasons described in
the remainder of this section, the Leader responds with a body consisting of an
<tt>UploadErrors</tt> with the media type <tt>application/ppm-dap;message=upload-errors</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];
} UploadErrors;
]]></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>
          <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/ppm-dap;message=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/ppm-dap;message=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/ppm-dap;message=upload-errors
Content-Length: 20

encoded(struct {
  reports = [
    struct {
      id = [0x0z, 0x0y, 0x0x, 0x0w, ...],
      error = report_replayed,
    },
  ],
} UploadErrors)
]]></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),
  (2^16-1)
} 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. Extension type values are defined
in <xref target="report-extensions-registry"/>.</t>
          <t>Extensions are mandatory to support. 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 verification process described in <xref section="5.2" sectionFormat="comma" target="VDAF"/> for each report in the job. Verification 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 verification succeeds, then the resulting output shares are
guaranteed to combine into a valid, refined measurement.</t>
        <t>Aggregation jobs are identified by a server-selected identifier, unique within the
scope of the task, assigned during resource creation (<xref target="resource-creation"/>).</t>
        <t>Aggregation jobs are created by POSTing to the creation URL served by the Helper at
<tt>{helper}/tasks/{task-id}/aggregation_jobs</tt>. An existing 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
verification 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 verification. The Helper's response, along
with each subsequent request and response, carries the remaining messages
exchanged during verification.</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="192" y="148">verify_init</text>
                  <text x="376" y="180">AggregationJobResp:</text>
                  <text x="352" y="196">verify_resp(continue)</text>
                  <text x="148" y="228">AggregationJobContinueReq:</text>
                  <text x="120" y="244">verify_continue</text>
                  <text x="376" y="276">AggregationJobResp:</text>
                  <text x="352" y="292">verify_resp(continue)</text>
                  <text x="32" y="356">...</text>
                  <text x="464" y="356">...</text>
                  <text x="148" y="404">AggregationJobContinueReq:</text>
                  <text x="120" y="420">verify_continue</text>
                  <text x="376" y="452">AggregationJobResp:</text>
                  <text x="324" y="468">verify_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, verify_init                            |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                             verify_resp(continue)   |
   |<----------------------------------------------------|
   | AggregationJobContinueReq:                          |
   |   verify_continue                                   |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                             verify_resp(continue)   |
   |<----------------------------------------------------|
   |                                                     |

  ...                                                   ...

   |                                                     |
   | AggregationJobContinueReq:                          |
   |   verify_continue                                   |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                      verify_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
verification 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 verification 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
verification state for each report.</t>
          </li>
          <li>
            <t>Continuation: Exchange verifier shares and messages until verification
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 verified 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="agg-job-extensions">
          <name>Aggregation Job Extensions</name>
          <t>The Leader may include extensions in the <tt>AggregationJobInitReq</tt> to convey
additional parameters for the aggregation job to the Helper. Extensions use
the following types:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  AggregationJobExtensionType extension_type;
  opaque extension_data<0..2^16-1>;
} AggregationJobExtension;

enum {
  reserved(0),
  (2^16-1)
} AggregationJobExtensionType;
]]></sourcecode>
          <t>Each extension is identified by an <tt>AggregationJobExtensionType</tt> codepoint.
Extension type values are defined in <xref target="agg-job-extensions-registry"/>.</t>
          <t>Extensions are mandatory to support. If the Helper does not recognize an
extension type, it <bcp14>MUST</bcp14> abort with error <tt>unsupportedExtension</tt>.</t>
          <t>Extensions <bcp14>MUST</bcp14> be encoded in strictly increasing order of <tt>extension_type</tt>.
That is, each <tt>extension_type</tt> value must be greater than that of the extension
that precedes it.</t>
        </section>
        <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 verification (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="212" y="36">VerifyResp</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[
                     VerifyResp
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.</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-18" || 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>VerifyInit</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>;
} VerifyInit;
]]></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>VerifyInit</tt> structures
for the relevant reports.</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint8 verification_key_id;
  opaque agg_param<0..2^32-1>;
  AggregationJobExtension extensions<0..2^16-1>;
  VerifyInit verify_inits[verify_inits_length];
} AggregationJobInitReq;
]]></sourcecode>
            <t>This message consists of:</t>
            <ul spacing="normal">
              <li>
                <t><tt>verification_key_id</tt>: An identifier for the shared VDAF verification key
that Aggregators use to verify report integrity;
see <xref section="5.2" sectionFormat="of" target="VDAF"/> and <xref target="verification-key"/>.
This allows a Leader to nominate a verification key
from a set of prearranged keys.
This might also allow for verification keys to be updated by Aggregators.</t>
              </li>
              <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>extensions</tt>: A list of aggregation job extensions (<xref target="agg-job-extensions"/>)
providing additional parameters for the aggregation job.</t>
              </li>
              <li>
                <t><tt>verify_inits</tt>: the sequence of <tt>VerifyInit</tt> messages constructed in the
previous step. Here <tt>verify_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>extensions</tt> fields. That is, the remainder
of the HTTP message consists of <tt>verify_inits</tt>.</t>
              </li>
            </ul>
            <aside>
              <t>IMPORTANT: this this does not change the security requirements
for verification keys; see <xref target="verification-key"/>.
The analysis in <xref target="DPRS23"/> depends on an assumption
that verification keys are selected prior to a report being generated;
a different analysis would be required
to enable selecting a verification key after a task has started.</t>
            </aside>
            <t>The Leader sends the <tt>AggregationJobInitReq</tt> in the body of a POST request to
<tt>{helper}/tasks/{task-id}/aggregation_jobs</tt> with a media type of
"application/ppm-dap;message=aggregation-job-init-req". The Helper creates the
aggregation job resource and indicates its location in the Location header, as
described in <xref target="resource-creation"/>. The Leader handles the response(s) as
described in <xref target="http-usage"/> to obtain an <tt>AggregationJobResp</tt>.</t>
            <t>Two <tt>AggregationJobInitReq</tt> messages are considered identical if they are
byte-for-byte identical when serialized. The Helper uses this to provide the
idempotency guarantee described in <xref target="resource-creation"/>. A Leader that retries a
request <bcp14>MUST</bcp14> replay the identical serialized body.</t>
            <t>The <tt>AggregationJobResp.verify_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> abandon the aggregation job.</t>
            <t>The Leader proceeds as follows with each report:</t>
            <ol spacing="normal" type="1"><li>
                <t>If the inbound verification response has type "continue", then the Leader
computes  </t>
                <sourcecode type="pseudocode"><![CDATA[
state = Vdaf.ping_pong_leader_continued(
    "dap-18" || 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 verification state</t>
                  </li>
                  <li>
                    <t><tt>inbound</tt> is the payload of the <tt>VerifyResp</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 verification
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 verification 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>VerifyResp</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> abandon the aggregation job.</t>
              </li>
            </ol>
            <t>Since VDAF verification completes in a constant number of rounds, it will never
be the case that verification 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="392" viewBox="0 0 392 112" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                    <path d="M 112,32 L 112,96" fill="none" stroke="black"/>
                    <path d="M 96,32 L 136,32" fill="none" stroke="black"/>
                    <path d="M 112,64 L 136,64" fill="none" stroke="black"/>
                    <path d="M 112,96 L 136,96" fill="none" stroke="black"/>
                    <polygon class="arrowhead" points="144,96 132,90.4 132,101.6" fill="black" transform="rotate(0,136,96)"/>
                    <polygon class="arrowhead" points="144,64 132,58.4 132,69.6" fill="black" transform="rotate(0,136,64)"/>
                    <polygon class="arrowhead" points="144,32 132,26.4 132,37.6" fill="black" transform="rotate(0,136,32)"/>
                    <g class="text">
                      <text x="44" y="36">VerifyInit</text>
                      <text x="184" y="36">Continued</text>
                      <text x="228" y="68">FinishedWithOutbound</text>
                      <text x="352" y="68">(*commit)</text>
                      <text x="180" y="100">Rejected</text>
                      <text x="256" y="100">(*reject)</text>
                    </g>
                  </svg>
                </artwork>
                <artwork type="ascii-art"><![CDATA[
VerifyInit --+--> 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>VerifyInit</tt> in this message, the Helper
attempts to initialize VDAF verification (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 verifying the report.</t>
            <t>The initialization request can be handled either asynchronously or synchronously
as described in <xref target="http-usage"/>. The response <bcp14>MUST</bcp14> include a Location header
field (<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>) indicating the location of the aggregation
job resource. When indicating that the job is not yet ready, the Location header
<bcp14>MUST</bcp14> include the query parameter <tt>step=0</tt>. Subsequent GET requests to the
aggregation job <bcp14>MUST</bcp14> include the <tt>step</tt> query parameter so that the Helper can
figure out which step of preparation the Leader is on (see
<xref target="aggregation-step-skew-recovery"/>). 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 extensions in <tt>AggregationJobInitReq.extensions</tt> are valid:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>If any extension type is unrecognized, the Helper <bcp14>MUST</bcp14> fail the job with
error <tt>unsupportedExtension</tt>.</t>
                  </li>
                  <li>
                    <t>If the extensions are not encoded in strictly increasing order of
<tt>extension_type</tt>, the Helper <bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
                  </li>
                </ul>
              </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.verify_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)
} VerifyRespType;

struct {
  ReportID report_id;
  VerifyRespType verify_resp_type;
  select (VerifyResp.verify_resp_type) {
    case continue: opaque payload<1..2^32-1>;
    case finish:   Empty;
    case reject:   ReportError report_error;
  };
} VerifyResp;
]]></sourcecode>
            <t><tt>VerifyResp.report_id</tt> is always set to the ID of the report that the Helper is
verifying. 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>VerifyResp.verify_resp_type</tt> to <tt>reject</tt> and <tt>VerifyResp.report_error</tt>
to the indicated error.</t>
            <t>For all other reports it initializes the VDAF verification state as follows:</t>
            <sourcecode type="pseudocode"><![CDATA[
state = Vdaf.ping_pong_helper_init(
    vdaf_verify_key,
    "dap-18" || 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>verification_key_id</tt> is the key identifier for the verification key
chosen by the Leader and included in the <tt>AggregationJobInitReq</tt> message</t>
              </li>
              <li>
                <t><tt>agg_param</tt> is the VDAF aggregation parameter sent in the
<tt>AggregationJobInitReq</tt> message</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>VerifyInit</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>VerifyResp.verify_resp_type</tt> to <tt>reject</tt> and
<tt>VerifyResp.report_error</tt> to <tt>vdaf_verify_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>VerifyResp.verify_resp_type</tt> to
<tt>continue</tt> and <tt>VerifyResp.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>VerifyResp.verify_resp_type</tt> to
<tt>reject</tt> and <tt>VerifyResp.report_error</tt> to <tt>commit_error</tt>.</t>
            <t>Once the Helper has constructed a <tt>VerifyResp</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 {
  VerifyResp verify_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>verify_resps</tt> is the outbound <tt>VerifyResp</tt> messages for each report computed
in the previous step. The order <bcp14>MUST</bcp14> match
<tt>AggregationJobInitReq.verify_inits</tt>. The media type for <tt>AggregationJobResp</tt>
is "application/ppm-dap;message=aggregation-job-resp".</t>
            <t>If the Helper receives a POST whose content matches an existing aggregation
job (per the identity criteria in <xref target="leader-init"/>), it <bcp14>MUST</bcp14> return the existing
job's location and current state as described in <xref target="resource-creation"/>. It is
illegal to rewind or reset the state of an aggregation job. If the Helper
receives a POST that matches an aggregation job which 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> return the existing job's location and current
state rather than reinitializing the job.</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>, <tt>public_share</tt> and
the task configuration; see <xref target="task-configuration"/>. 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-18 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, in any order:</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>If the <tt>task_interval</tt> task extension (<xref target="task-interval-extension"/>) is configured,
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>If the <tt>task_interval</tt> task extension (<xref target="task-interval-extension"/>) is configured,
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>Check that the public and private extension vectors are each encoded in
strictly increasing order. If any <tt>extension_type</tt> value is equal to or less
than that of the extension that precedes it, 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[
POST /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregation_jobs
Host: example.com
Content-Type: application/ppm-dap;message=aggregation-job-init-req
Content-Length: 100
Authorization: Bearer auth-token

encoded(struct {
  agg_param = [0x00, 0x01, 0x02, 0x04, ...],
  extensions = [
    struct {
      extension_type = AggregationJobExtensionType.leader_selected_batch_id,
      extension_data = encoded([0x1f, 0x1e, ..., 0x00] BatchID),
    } AggregationJobExtension,
  ],
  verify_inits,
} AggregationJobInitReq)

HTTP/1.1 200
Location: /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA
Content-Type: application/ppm-dap;message=aggregation-job-resp
Content-Length: 100

encoded(struct { verify_resps } AggregationJobResp)
]]></sourcecode>
            <t>Or asynchronously:</t>
            <sourcecode type="http"><![CDATA[
POST /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregation_jobs
Host: example.com
Content-Type: application/ppm-dap;message=aggregation-job-init-req
Content-Length: 100
Authorization: Bearer auth-token

encoded(struct {
  agg_param = [0x00, 0x01, 0x02, 0x04, ...],
  extensions = [],
  verify_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/ppm-dap;message=aggregation-job-resp
Content-Length: 100

encoded(struct { verify_resps } AggregationJobResp)
]]></sourcecode>
          </section>
        </section>
        <section anchor="agg-continue-flow">
          <name>Aggregate Continuation</name>
          <t>In the continuation phase, the Leader drives the VDAF verification 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="132" y="36">VerifyResp</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="212" y="180">VerifyResp</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[
           VerifyResp
Continued -----+----> Continued
               |
               +----> FinishedWithOutbound
               |
               +----> Finished (*commit)
               |
               +----> Rejected (*reject)

                     VerifyResp
FinishedWithOutbound -----+----> (*commit)
                          |
                          +----> (*reject)
]]></artwork>
              </artset>
            </figure>
            <t>The Leader begins each step of aggregation continuation with a verification
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 verification continuation message:</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  ReportID report_id;
  opaque payload<1..2^32-1>;
} VerifyContinue;
]]></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/ppm-dap;message=aggregation-job-continue-req" and body structured
as:</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint16 step;
  VerifyContinue verify_continues[verify_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>verify_continues</tt> field is the sequence of
verification continuation messages constructed in the previous step. Here
<tt>verify_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>VerifyContinue</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-usage"/> to obtain an
<tt>AggregationJobResp</tt>.</t>
            <t>The response's <tt>verify_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> abandon 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>VerifyResp</tt> has
type "continue", then the Leader computes  </t>
                <sourcecode type="pseudocode"><![CDATA[
state = Vdaf.ping_pong_leader_continued(
    "dap-18" || 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>VerifyResp</tt>, and <tt>state</tt> is the report's verification 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>VerifyResp</tt> has type "finish", then verification 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>VerifyResp</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> abandon 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="140" y="36">VerifyContinue</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[
          VerifyContinue
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-usage"/>. 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>. Subsequent GET requests to
the aggregation job <bcp14>MUST</bcp14> include the <tt>step</tt> query parameter so that the Helper
can figure out which step of preparation the Leader is on (see
<xref target="aggregation-step-skew-recovery"/>). 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 verification 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-18" || 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>VerifyContinue</tt>, and <tt>state</tt> is the report's verification state carried over
from the previous step. If the new <tt>state</tt> has type <tt>Rejected</tt>, then the Helper
sets <tt>VerifyResp.verify_resp_type</tt> to <tt>reject</tt> and <tt>VerifyResp.report_error</tt>
to <tt>vdaf_verify_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>VerifyResp.verify_resp_type</tt> to <tt>reject</tt> and <tt>VerifyResp.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>VerifyResp.verify_resp_type</tt> to <tt>continue</tt> and <tt>VerifyResp.payload</tt> to
<tt>state.outbound</tt>.</t>
            <t>Otherwise, if <tt>state</tt> has type <tt>Finished</tt>, then the Helper sets
<tt>VerifyResp.verify_resp_type</tt> to <tt>finish</tt>.</t>
            <t>Once the Helper has computed a <tt>VerifyResp</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 verification step. The order of the
verification 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 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 carried in the
<tt>leader_selected_batch_id</tt> aggregation job extension
(<xref target="leader-selected-batch-id-extension"/>).</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 verification.
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 verification 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/ppm-dap;message=aggregation-job-continue-req
Content-Length: 100
Authorization: Bearer auth-token

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

HTTP/1.1 200
Content-Type: application/ppm-dap;message=aggregation-job-resp
Content-Length: 100

encoded(struct { verify_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/ppm-dap;message=aggregation-job-continue-req
Content-Length: 100
Authorization: Bearer auth-token

encoded(struct {
  step = 1,
  verify_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/ppm-dap;message=aggregation-job-resp
Content-Length: 100

encoded(struct { verify_resps } AggregationJobResp)
]]></sourcecode>
          </section>
        </section>
        <section anchor="aggregation-job-abandonment-and-deletion">
          <name>Aggregation Job Abandonment and Deletion</name>
          <t>This document describes various error cases where a Leader is required to
abandon an aggregation job. This means the Leader should discontinue further
processing of the job and the reports included in it. Reports included in an
abandoned aggregation job <bcp14>MUST NOT</bcp14> be considered collected for purposes of
replay and double collection checks (<xref target="batch-buckets"/>) and <bcp14>MAY</bcp14> be
included in future aggregation jobs.</t>
          <t>If 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 a
completed aggregation job <bcp14>MUST NOT</bcp14> delete information needed for replay or double
collection checks.</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 server-selected identifier, unique within the
scope of the task, assigned during resource creation (<xref target="resource-creation"/>).</t>
        <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>. Collection jobs
are created by POSTing to the creation URL
<tt>{leader}/tasks/{task-id}/collection_jobs</tt>.</t>
        <section anchor="collect-init">
          <name>Collection Job Initialization</name>
          <t>To initiate a collection job, the Collector issues a POST request to
<tt>{leader}/tasks/{task-id}/collection_jobs</tt> with media type
"application/ppm-dap;message=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>;
  CollectionJobExtension extensions<0..2^16-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>
            <li>
              <t><tt>extensions</tt>, a set of extensions (see <xref target="collect-ext"/>).</t>
            </li>
          </ul>
          <t>Depending on the VDAF scheme and how the Leader is configured, the Leader and
Helper may already have aggregated 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="resource-creation"/> and <xref target="http-usage"/>. The response includes a
Location header indicating the location of the new collection job resource. 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>
            <li>
              <t>Whether all of the collection job extensions listed are supported.
If not, the Leader <bcp14>MUST</bcp14> fail the collection job
with the error <tt>unsupportedExtension</tt>.</t>
            </li>
            <li>
              <t>Whether each included collection job extension is valid
according to the definition of that extension.
If not, the Leader <bcp14>MUST</bcp14> fail the collection job
with the error indicated by the processing model for the extension.</t>
            </li>
          </ul>
          <t>The Leader then performs any configuration changes or processing
defined in the included extensions; see <xref target="collect-ext"/>.</t>
          <t>Having validated the <tt>CollectionJobReq</tt>, the Leader begins working with the
Helper to aggregate the reports satisfying the query (or continues this process,
depending on whether the Leader is aggregating eagerly; <xref target="eager-aggregation"/>)
as described in <xref target="aggregate-flow"/>.</t>
          <t>If the Leader has a pending aggregation job that overlaps with the batch for the
collection job, the Leader <bcp14>MUST</bcp14> first complete the aggregation job before
proceeding and requesting an aggregate share from the Helper. This avoids a race
condition between aggregation and collection jobs that can yield batch mismatch
errors.</t>
          <t>If the number of validated reports in the batch is not equal to or greater than
the task's minimum batch size, then the Leader <bcp14>SHOULD</bcp14> wait for more reports to
be uploaded and aggregated and try the collection job again later. 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 {
  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/ppm-dap;message=collection-job-resp". The structure includes the
following:</t>
          <ul spacing="normal">
            <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>Two <tt>CollectionJobReq</tt> messages are considered identical if their encodings are
byte-for-byte identical. If the Leader receives a POST whose
content matches an existing collection job, it <bcp14>MUST</bcp14> return the existing job's
location and current state as described in <xref target="resource-creation"/>.</t>
          <section anchor="example-5">
            <name>Example</name>
            <t>The Leader handles the collection job request synchronously:</t>
            <sourcecode type="http"><![CDATA[
POST /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  collection_jobs
Host: example.com
Content-Type: application/ppm-dap;message=collection-job-req
Authorization: Bearer auth-token

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

HTTP/1.1 200
Location: /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  collection_jobs/lc7aUeGpdSNosNlh-UZhKA
Content-Type: application/ppm-dap;message=collection-job-resp

encoded(struct {
  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[
POST /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  collection_jobs
Host: example.com
Content-Type: application/ppm-dap;message=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),
  extensions = [],
} CollectionJobReq)

HTTP/1.1 200
Location: /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  collection_jobs/lc7aUeGpdSNosNlh-UZhKA
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/ppm-dap;message=collection-job-resp

encoded(struct {
  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="collect-ext">
          <name>Collection Job Extensions</name>
          <t>A Collector can add extensions to the creation of a collection job
to pass additional information to Aggregators (primarily the Leader)
about how to handle the collection job.</t>
          <figure anchor="f-collect-ext">
            <name>Collection Job Extensions</name>
            <sourcecode type="tls-syntax"><![CDATA[
struct {
  CollectionJobExtensionType extension_type;
  opaque extension_data<0..2^16-1>;
} CollectionJobExtension;

enum {
  reserved(0),
  (2^16-1)
} CollectionJobExtensionType;
]]></sourcecode>
          </figure>
          <t>These extensions (shown in <xref target="f-collect-ext"/>) contain
a type identifier (<tt>extension_type</tt>)
and arbitrary data (<tt>extension_data</tt>).
The data is structured according to the definition of the extension.</t>
          <t>Extensions are mandatory to support by both Aggregators.
A collection job that contains an unrecognized or unsupported extension
<bcp14>MUST</bcp14> be aborted with an <tt>unsupportedExtension</tt> error; see <xref target="errors"/>.</t>
          <t>Extensions <bcp14>MUST</bcp14> be encoded in strictly increasing order.
If any <tt>extension_type</tt> value is equal to or less than that of the extension that precedes it,
the job <bcp14>MUST</bcp14> be failed with an <tt>invalidExtension</tt> error; see <xref target="errors"/>.</t>
          <t>Each collection job extension <bcp14>MUST</bcp14> define how Aggregators
alter their handling of collection jobs
when the extension is present,
including any validation of the included <tt>extension_data</tt>.</t>
          <t>An extension could limit its compatibility
to specific VDAFs, batch modes, or those with certain properties.
For instance, an extension might only apply
if the VDAF supports eager aggregation; see <xref target="eager-aggregation"/>.
In that case, jobs can be failed with an <tt>invalidExtension</tt> error
if the extension is incompatible.</t>
          <t>Collection job extensions are distinct from report and task extensions.
Collection job extensions are only agreed between Collector, Leader, and Helper;
they are not appropriate for use where the adjustment to protocol behavior
might also need to be agreed by Clients.</t>
        </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 server-selected identifier, unique within
the scope of the task, assigned during resource creation (<xref target="resource-creation"/>).
Since this resource corresponds to exactly one collection job, the Leader might use
the collection job ID as the aggregate share ID.</t>
          <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 an
aggregate share, the Leader sends a POST request to
<tt>{helper}/tasks/{task-id}/aggregate_shares</tt> with the body:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  BatchMode batch_mode;
  opaque config<0..2^16-1>;
} BatchSelector;

struct {
  CollectionJobReq collection_job_req;
  BatchSelector batch_selector;
  uint64 report_count;
  opaque checksum[32];
} AggregateShareReq;
]]></sourcecode>
          <t>The media type of <tt>AggregateShareReq</tt> is
"application/ppm-dap;message=aggregate-share-req". The structure contains the
following parameters:</t>
          <ul spacing="normal">
            <li>
              <t><tt>collection_job_req</tt>: The details of the collection job,
as provided by the Collector when initiating the job; see <xref target="collect-init"/>.</t>
            </li>
            <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>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-usage"/>. 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>batch_selector</tt> in the Leader's request
is consistent with the <tt>collection_job_req.query</tt>.
Each batch mode needs to define any consistency checks necessary.
The Helper also determines whether <tt>batch_selector</tt> identifies a set of batch buckets
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 in <tt>collection_job_req.agg_param</tt>
            <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>The Helper then validates any extensions in <tt>collection_job_req.extensions</tt>,
following the same logic as the Leader; see <xref target="collect-ext"/>.
Though invalid extension encoding should have been detected by the Leader,
the Helper <bcp14>MUST</bcp14> independently validate extensions
and fail the job if necessary.</t>
          <t>The Helper performs any configuration changes or processing
that are dictated by the extensions that are included; see <xref target="collect-ext"/>.</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/ppm-dap;message=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>Two <tt>AggregateShareReq</tt> messages are considered identical if their encodings are
byte-for-byte identical. Note that, within a task, a given batch can only be
collected once, so the batch selector is a natural key. If the Helper receives a
POST whose content matches an existing aggregate share, it <bcp14>MUST</bcp14> return the existing
resource's location and current state as described in <xref target="resource-creation"/>.</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[
POST /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregate_shares
Host: example.com
Content-Type: application/ppm-dap;message=aggregate-share-req
Authorization: Bearer auth-token

encoded(struct {
  collection_job_req = struct {
    query = struct {
      batch_mode = BatchMode.time_interval,
      query = encoded(struct {
        batch_interval = struct {
          start = 1659540,
          duration = 100,
        } Interval,
      } TimeIntervalQueryConfig),
    } Query,
    agg_param = [0x00, 0x01, ...],
    extensions = encoded(Empty)
  } CollectionJobReq,
  batch_selector = struct {
    batch_mode = BatchMode.time_interval,
    config = encoded(struct {
      batch_interval = struct {
        start = 1659544,
        duration = 10,
      } Interval,
    } TimeIntervalBatchSelectorConfig),
  } BatchSelector,
  report_count = 1000,
  checksum = [0x0a, 0x0b, ..., 0x0f],
} AggregateShareReq)

HTTP/1.1 200
Location: /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregate_shares/lc7aUeGpdSNosNlh-UZhKA
Content-Type: application/ppm-dap;message=aggregate-share

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

encoded(struct {
  collection_job_req = struct {
    query = struct {
      batch_mode = BatchMode.time_interval,
      query = encoded(struct {
        batch_interval = struct {
          start = 1659540,
          duration = 100,
        } Interval,
      } TimeIntervalQueryConfig),
    } Query,
    agg_param = [0x00, 0x01, ...],
    extensions = encoded(Empty)
  } CollectionJobReq,
  batch_selector = struct {
    batch_mode = BatchMode.time_interval,
    config = encoded(struct {
      batch_interval = struct {
        start = 1659544,
        duration = 10,
      } Interval,
    } TimeIntervalBatchSelectorConfig),
  } BatchSelector,
  report_count = 1000,
  checksum = [0x0a, 0x0b, ..., 0x0f],
} AggregateShareReq)

HTTP/1.1 200
Location: /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregate_shares/lc7aUeGpdSNosNlh-UZhKA
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/ppm-dap;message=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-18 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;
  TaskConfiguration task_configuration;
  CollectionJobReq collection_job_req;
} 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>task_configuration</tt> is the configuration of the task; see
<xref target="task-configuration"/>.</t>
            </li>
            <li>
              <t><tt>collection_job_req</tt> is the message that the Collector used
to initiate the associated collection job (see <xref target="collect-init"/>),
the value of which is passed by the Leader to the Helper.</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-18 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 collection job request (see <xref target="collect-init"/>).</t>
            </li>
          </ul>
          <t>The <tt>OpenBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the HPKE configuration.</t>
        </section>
      </section>
    </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> 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>
        <li>
          <t>Batch mode configuration: any configuration needed for the batch mode. New
batch modes <bcp14>MUST</bcp14> define a deterministic encoding of their configuration so it
can be incorporated into <tt>TaskConfiguration</tt> (<xref target="task-configuration"/>)
structures.</t>
        </li>
      </ol>
      <t>It may be necessary for the Leader to convey additional information to the
Helper during aggregation in order to assign reports to batch buckets. This may
be done with the aggregation job extension mechanism (see
<xref target="agg-job-extensions"/>). A batch mode that defines such an extension should
specify how it is used to assign reports to batch buckets. See the
leader-selected mode (<xref target="leader-selected-batch-mode"/>) for an example.</t>
      <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="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>
          <t>A <tt>TimeIntervalBatchSelectorConfig.config</tt> is consistent with <tt>Query.config</tt>
for this batch mode if the batch selector's interval is within the queried time
interval. That is, the values are consistent if:</t>
          <ul spacing="normal">
            <li>
              <t>The start time from the batch selector
(<tt>TimeIntervalBatchSelectorConfig.batch_interval.start</tt>) is not before the
query (<tt>TimeIntervalQueryConfig.batch_interval</tt>), and</t>
            </li>
            <li>
              <t>The end time from the batch selector
(<tt>TimeIntervalBatchSelectorConfig.batch_interval.{start+duration}</tt>)
is not after the query (<tt>TimeIntervalQueryConfig.batch_interval</tt>).</t>
            </li>
          </ul>
        </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="leader-selected-batch-id-extension">
          <name>Aggregation Job Extension</name>
          <t>During aggregation, the Leader needs to convey the batch ID of the reports
being aggregated to the Helper. An aggregation job extension is defined for
this purpose:</t>
          <sourcecode type="tls-presentation"><![CDATA[
enum {
  leader_selected_batch_id(1),
  (2^16-1)
} AggregationJobExtensionType;
]]></sourcecode>
          <t>The payload of this extension is a <tt>BatchID</tt> selected by the Leader. The
Helper <bcp14>MUST</bcp14> abort with error <tt>invalidMessage</tt> if this extension is absent or
the payload is not a valid batch ID.</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>leader_selected_batch_id</tt>
aggregation job extension (<xref target="leader-selected-batch-id-extension"/>) 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 verification 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 verification is related to the size of the aggregation
parameter. For example for Poplar1 defined in <xref section="8" sectionFormat="of" target="VDAF"/>,
verification 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 <bcp14>MUST</bcp14> store data related to a task.
Where the <tt>task_interval</tt> extension is configured, Aggregators <bcp14>MAY</bcp14> delete
all data for a task after the <tt>task_interval</tt>.
Aggregators that delete data <bcp14>SHOULD</bcp14> allow the Collector adequate time
to retrieve data from any final batches.</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 only fixed-length or length-prefixed
fields such that they can be parsed independently of context. The exceptions are
the <tt>UploadReq</tt>, <tt>UploadErrors</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 stream these messages, that is, to begin sending
them before knowing how long they will ultimately be. This is useful if
implementations wish to avoid buffering exceptionally large messages in memory,
or do not know how long a vector will be when they start sending.</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="http-usage"/>), 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 verification 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="RFC9576"/>) 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-03"/>
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 verification.
Therefore, the verification key for a task <bcp14>SHOULD</bcp14> be chosen before any reports
are generated. To achieve this, the current design and analysis assume that
the verification key is fixed for the lifetime of the task.
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[
vdaf_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.</t>
          <t>A larger minimum batch size will yield a higher degree of privacy, but since
this ultimately depends on the application, the nature of the measurements, the
aggregation function and whether and how differential privacy (<xref target="dp"/>) is used,
this document does not specify how to choose an appropriate minimum batch size.</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-binding">
          <name>Task Configuration Agreement and Consistency</name>
          <t><xref section="9.9" sectionFormat="of" target="VDAF"/> warns of cross protocol attacks, in which a message
recipient can be manipulated into handling a message intended for use in one
protocol as a message from another (i.e., evaluating a <tt>Prio3Count</tt> input share
as though it was a <tt>Prio3Sum</tt> input share).</t>
          <t>VDAF also calls out the risk of parameter disagreement, where both parties can
be running the same VDAF but with different parameters. For example, a malicious
Leader could manipulate the Helper into enforcing a minimum batch size that is
too small for the aggregates to protect client privacy.</t>
          <t>To rule out these attacks, DAP sets the goal of ensuring that protocol
participants have a consistent view of essential task configuration parameters.
This is achieved by including them into HPKE authenticated data when Clients
upload reports and when Aggregators deliver aggregate shares.</t>
          <t>Besides ensuring that no participant has been tricked into using the wrong
parameters, this also gives participants an opportunity to refuse to participate
in a task if the parameters are not acceptable. For example, a Client could
present the task parameters to a user and request consent before uploading
reports, allowing the user to decide whether they find the task's Aggregators
trustworthy.</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 a new media type (<xref target="iana-media-type"/>),
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-type">
        <name>Protocol Message Media Type</name>
        <t>This specification defines a new media type used for all protocol messages:
<tt>application/ppm-dap</tt>. Specific message types are distinguished using a
<tt>message</tt> parameter.</t>
        <t>This specification defines the following protocol messages, along with their
corresponding <tt>message</tt> value:</t>
        <ul spacing="normal">
          <li>
            <t>HpkeConfigList <xref target="hpke-config"/>: "hpke-config-list"</t>
          </li>
          <li>
            <t>UploadRequest <xref target="upload-request"/>: "upload-req"</t>
          </li>
          <li>
            <t>UploadErrors <xref target="upload-request"/>: "upload-errors"</t>
          </li>
          <li>
            <t>AggregationJobInitReq <xref target="leader-init"/>: "aggregation-job-init-req"</t>
          </li>
          <li>
            <t>AggregationJobResp <xref target="aggregation-helper-init"/>: "aggregation-job-resp"</t>
          </li>
          <li>
            <t>AggregationJobContinueReq <xref target="aggregation-leader-continuation"/>: "aggregation-job-continue-req"</t>
          </li>
          <li>
            <t>AggregateShareReq <xref target="collect-aggregate"/>: "aggregate-share-req"</t>
          </li>
          <li>
            <t>AggregateShare <xref target="collect-aggregate"/>: "aggregate-share"</t>
          </li>
          <li>
            <t>CollectionJobReq <xref target="collect-init"/>: "collection-job-req"</t>
          </li>
          <li>
            <t>CollectionJobResp <xref target="collect-init"/>: "collection-job-resp"</t>
          </li>
        </ul>
        <t>For example, a request whose body consists of an <tt>AggregationJobInitReq</tt> could
have the header
<tt>Content-Type: application/ppm-dap;message=aggregation-job-init-req</tt>.</t>
        <t>Protocol message format evolution is supported through the definition of new
formats that are identified by <tt>message</tt> values. 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 media type 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/ppm-dap;message=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 the
<tt>application/ppm-dap</tt> media type.</t>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>ppm-dap</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>message</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="sec-considerations"/> 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>PPM WG mailing list (ppm@ietf.org)</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>IETF</t>
          </dd>
        </dl>
      </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 "DAP Batch Mode Identifiers" (<xref target="batch-modes"/>). This registry contains
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 DAP 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="task-extensions-registry">
          <name>Task Extensions Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "DAP Task Extension Identifiers". This registry contains the following
columns:</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The two-byte identifier for the task extension</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the task extension</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the task extension is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are listed in <xref target="task-extension-id"/>.</t>
          <table anchor="task-extension-id">
            <name>Initial contents of the Task Extensions 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">
                  <xref target="task-extensions-registry"/> of RFC XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x0001</tt></td>
                <td align="left">
                  <tt>task_interval</tt></td>
                <td align="left">
                  <xref target="task-interval-extension"/> of RFC XXXX</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="agg-job-extensions-registry">
          <name>Aggregation Job Extensions Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "DAP Aggregation Job Extension Identifiers" for extensions included in
aggregation job initialization requests (<xref target="agg-job-extensions"/>). This registry
should contain the following columns:</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The two-byte identifier for the aggregation job extension</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the aggregation job extension</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the extension is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are listed in <xref target="agg-job-extension-id"/>.</t>
          <table anchor="agg-job-extension-id">
            <name>Initial contents of the DAP Aggregation Job 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">
                  <xref target="agg-job-extensions-registry"/> of RFC XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x0001</tt></td>
                <td align="left">
                  <tt>leader_selected_batch_id</tt></td>
                <td align="left">
                  <xref target="leader-selected-batch-id-extension"/> of RFC XXXX</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="report-extensions-registry">
          <name>Report Extensions Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "DAP Report Extension Identifiers" for extensions to the report structure
(<xref target="report-extensions"/>). This registry should contain the following columns:</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The two-byte identifier for the report extension</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the report extension</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the report extension is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are listed in <xref target="report-extension-id"/>.</t>
          <table anchor="report-extension-id">
            <name>Initial contents of the DAP 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">
                  <xref target="report-extensions-registry"/> of RFC XXXX</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="collection-job-extensions-registry">
          <name>Collection Job Extensions Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "DAP Collection Job Extension Identifiers" for extensions included in the
creation of collection jobs (<xref target="collect-ext"/>). This registry should contain the
following columns:</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The two-byte identifier for the collection job extension</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the collection job extension</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the extension is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are listed in <xref target="collect-extension-id"/>.</t>
          <table anchor="collect-extension-id">
            <name>Initial contents of the DAP Collection Job 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 Errors Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "DAP Report Error Identifiers".</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 DAP 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_verify_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 anchor="guidance-for-designated-experts">
          <name>Guidance for Designated Experts</name>
          <t>When reviewing requests to extend a DAP registry, experts should ensure that a
document exists that defines the newly registered items and review the document
to ensure it meets the criteria for extending DAP specified in
<xref target="extending-this-doc"/>.</t>
        </section>
      </section>
      <section anchor="urn-space">
        <name>URN Sub-namespace for DAP (urn:ietf:params:ppm:dap)</name>
        <t>The following value will be (RFC EDITOR: change "will be" to "has been")
registered in the "IETF URN Sub-namespace for Registered Protocol
Parameter Identifiers" registry, following the template in <xref target="RFC3553"/>:</t>
        <artwork><![CDATA[
Registry name:  dap

Specification:  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 task extension (<xref target="task-extensions"/>)</t>
        </li>
        <li>
          <t>a new report extension (<xref target="report-extensions"/>)</t>
        </li>
        <li>
          <t>a new aggregation job extension (<xref target="agg-job-extensions"/>)</t>
        </li>
        <li>
          <t>a new collection job extension (<xref target="collect-ext"/>)</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> and <tt>BatchSelector</tt></t>
            </li>
            <li>
              <t>Aggregation job extensions, if any, needed for batch mode operation
(<xref target="agg-job-extensions"/>), including how the extension is used to assign
reports to batch buckets.</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>
        <li>
          <t>When a document defines a new VDAF (<xref section="5" sectionFormat="comma" target="VDAF"/>), it <bcp14>MUST</bcp14> specify an
encoding of that VDAF's configuration like the ones in
<xref target="vdaf-configuration-encodings"/>. The encoding <bcp14>MUST</bcp14> be sufficient to prevent
attacks described in <xref target="task-binding"/>.</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="14" month="April" year="2026"/>
            <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-19"/>
        </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="RFC8792">
          <front>
            <title>Handling Long Lines in Content of Internet-Drafts and RFCs</title>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="E. Auerswald" initials="E." surname="Auerswald"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <author fullname="Q. Wu" initials="Q." surname="Wu"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>This document defines two strategies for handling long lines in width-bounded text content. One strategy, called the "single backslash" strategy, is based on the historical use of a single backslash ('\') character to indicate where line-folding has occurred, with the continuation occurring with the first character that is not a space character (' ') on the next line. The second strategy, called the "double backslash" strategy, extends the first strategy by adding a second backslash character to identify where the continuation begins and is thereby able to handle cases not supported by the first strategy. Both strategies use a self-describing header enabling automated reconstitution of the original content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8792"/>
          <seriesInfo name="DOI" value="10.17487/RFC8792"/>
        </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="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="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="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </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="DPRS23" target="https://ia.cr/2023/130/20240925:184929">
          <front>
            <title>Verifiable Distributed Aggregation Functions</title>
            <author initials="H." surname="Davis" fullname="Hannah Davis">
              <organization/>
            </author>
            <author initials="C." surname="Patton" fullname="Christopher Patton">
              <organization/>
            </author>
            <author initials="M." surname="Rosulek" fullname="Mike Rosulek">
              <organization/>
            </author>
            <author initials="P." surname="Schoppmann" fullname="Phillipp Schoppmann">
              <organization/>
            </author>
            <date year="2024" month="September" day="25"/>
          </front>
          <refcontent>Privacy Enhancing Technologies Symposium (PETS)</refcontent>
        </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="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="RFC9576">
          <front>
            <title>The Privacy Pass Architecture</title>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="J. Iyengar" initials="J." surname="Iyengar"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <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, to help ensure that the desired security and privacy goals are fulfilled.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9576"/>
          <seriesInfo name="DOI" value="10.17487/RFC9576"/>
        </reference>
        <reference anchor="I-D.draft-ietf-ppm-dap-taskprov-03">
          <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="5" month="September" year="2025"/>
            <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-03"/>
        </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>
    <?line 4978?>

<section anchor="http-resources-reference">
      <name>HTTP Resources Reference</name>
      <t>This appendix enumerates all the HTTP resources this document describes, the
HTTP methods that they support and media-types that may occur in requests and
responses. It is organized by the protocol role that serves the resource.</t>
      <t>This section is intended to act as a reference and checklist for implementers.
The HTTP methods and media-types described in this appendix are not
authoritative. See the section that each resource refers to for detailed
specifications.</t>
      <section anchor="aggregator">
        <name>Aggregator</name>
        <section anchor="hpke-configurations">
          <name>HPKE Configurations</name>
          <t>Aggregator HPKE configurations to which Clients will encrypt report shares.</t>
          <t>Resource URL: <tt>{aggregator}/hpke_config</tt></t>
          <t>HTTP methods: GET</t>
          <t>Request media-type <tt>message</tt> values: N/A</t>
          <t>Response media-type <tt>message</tt> values: <tt>hpke-config-list</tt></t>
          <t>Reference: <xref target="hpke-config"/></t>
        </section>
      </section>
      <section anchor="leader">
        <name>Leader</name>
        <section anchor="reports">
          <name>Reports</name>
          <t>Reports being uploaded to the Leader by the Client.</t>
          <t>Resource URL: <tt>{leader}/tasks/{task-id}/reports</tt></t>
          <t>HTTP methods: POST</t>
          <t>Request media-type <tt>message</tt> values: <tt>upload-req</tt></t>
          <t>Response media-type <tt>message</tt> values: <tt>upload-errors</tt></t>
          <t>Reference: <xref target="upload-request"/></t>
        </section>
        <section anchor="collection-jobs">
          <name>Collection Jobs</name>
          <t>A Collector's request to collect reports identified by some query.</t>
          <t>Creation URL: <tt>{leader}/tasks/{task-id}/collection_jobs</tt></t>
          <t>Resource URL: <tt>{leader}/tasks/{task-id}/collection_jobs/{collection-job-id}</tt></t>
          <t>HTTP methods: POST (creation URL), GET, DELETE (resource URL)</t>
          <t>Request media-type <tt>message</tt> values: <tt>collection-job-req</tt></t>
          <t>Response media-type <tt>message</tt> values: <tt>collection-job-resp</tt></t>
          <t>Reference: <xref target="collect-flow"/></t>
        </section>
      </section>
      <section anchor="helper">
        <name>Helper</name>
        <section anchor="aggregation-jobs">
          <name>Aggregation Jobs</name>
          <t>An aggregation job created by the Leader.</t>
          <t>Creation URL: <tt>{helper}/tasks/{task-id}/aggregation_jobs</tt></t>
          <t>Resource URL: <tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt></t>
          <t>HTTP methods: POST (creation URL), POST, GET, DELETE (resource URL)</t>
          <t>Request media-type <tt>message</tt> values: <tt>aggregation-job-init-req</tt>,
<tt>aggregation-job-continue-req</tt></t>
          <t>Response media-type <tt>message</tt> values: <tt>aggregation-job-resp</tt></t>
          <t>Reference: <xref target="aggregate-flow"/></t>
        </section>
        <section anchor="aggregate-shares">
          <name>Aggregate Shares</name>
          <t>The Helper's share of an aggregation over the reports identified by the
Collector's query.</t>
          <t>Creation URL: <tt>{helper}/tasks/{task-id}/aggregate_shares</tt></t>
          <t>Resource URL: <tt>{helper}/tasks/{task-id}/aggregate_shares/{aggregate-share-id}</tt></t>
          <t>HTTP methods: POST (creation URL), GET, DELETE (resource URL)</t>
          <t>Request media-type <tt>message</tt> values: <tt>aggregate-share-req</tt></t>
          <t>Response media-type <tt>message</tt> values: <tt>aggregate-share</tt></t>
          <t>Reference: <xref target="collect-aggregate"/></t>
        </section>
      </section>
    </section>
    <section anchor="vdaf-configuration-encodings">
      <name>VDAF Configuration Encodings</name>
      <t>This section provides encodings of configuration of the Prio3 family of VDAFs.
These are included in <tt>InputShareAad</tt> (<xref target="upload-request"/>) and
<tt>AggregateShareAad</tt> (<xref target="aggregate-share-encrypt"/>) structures to prevent attacks
described in <xref target="task-binding"/>.</t>
      <section anchor="prio3count">
        <name>Prio3Count</name>
        <t>There are no parameters for this VDAF so <tt>Empty</tt> (<xref target="basic-definitions"/>) is
used.</t>
      </section>
      <section anchor="prio3sum">
        <name>Prio3Sum</name>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
    uint64 max_measurement;
} Prio3SumConfig;
]]></sourcecode>
        <t><tt>max_measurement</tt> is the largest summand permitted in this instantiation of the
VDAF. The value <bcp14>MUST</bcp14> be less than the modulus of the field associated with the
circuit; see <xref section="6.1.4" sectionFormat="comma" target="VDAF"/>.</t>
      </section>
      <section anchor="prio3sumvec">
        <name>Prio3SumVec</name>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
    uint32 length;
    uint64 max_measurement;
    uint32 chunk_length;
} Prio3SumVecConfig;
]]></sourcecode>
        <ul spacing="normal">
          <li>
            <t><tt>length</tt> is the length of the vectors being summed.</t>
          </li>
          <li>
            <t><tt>max_measurement</tt> is the largest summand permitted in this instantiation of
the VDAF.</t>
          </li>
          <li>
            <t><tt>chunk_length</tt> is the size of each proof chunk.</t>
          </li>
        </ul>
      </section>
      <section anchor="prio3histogram">
        <name>Prio3Histogram</name>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
    uint32 length;
    uint32 chunk_length;
} Prio3HistogramConfig;
]]></sourcecode>
        <ul spacing="normal">
          <li>
            <t><tt>length</tt> is the number of buckets in the histogram.</t>
          </li>
          <li>
            <t><tt>chunk_length</tt> is the size of each proof chunk.</t>
          </li>
        </ul>
      </section>
      <section anchor="prio3multihotcountvec">
        <name>Prio3MultihotCountVec</name>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
    uint32 length;
    uint32 chunk_length;
    uint64 max_weight;
} Prio3MultihotCountVecConfig;
]]></sourcecode>
        <ul spacing="normal">
          <li>
            <t><tt>length</tt> is the length of the vectors being summed.</t>
          </li>
          <li>
            <t><tt>chunk_length</tt> is the size of each proof chunk.</t>
          </li>
          <li>
            <t><tt>max_weight</tt> is the largest weight allowed for measurements; the maximum
number of true entries in the bit vector. The value <bcp14>MUST</bcp14> be less than the
modulus of the field associated with the circuit; see <xref section="6.1.4" sectionFormat="comma" target="VDAF"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="poplar1">
        <name>Poplar1</name>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
    uint16 bits;
} Poplar1Config;
]]></sourcecode>
        <t><tt>bits</tt> is the number of bits in input strings.</t>
      </section>
    </section>
    <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+y97XrbRpYu+h9XgZF/WOqQNCnJsqx0eqLYTqLuOPbYTvfu
yfSIIAlRiEmCQ4CSFdtzLftazpWd9Vm1qgBSspN5zux9Rk+3I5FAfa5atT7f
1e12k7qoZ/lJuvO0qOpVMVrX+SQ9nU5X+TSri3KRvlyVdTkuZ+lFuYI/iqts
fAP/zat8dVUspunzPKvWq3yeL+qdJBuNVvnVSfr09GUyKceLbA5NT1bZRd0t
8vqiu1zOu5Ns2R0cJ+Oszqfl6uYkrepJUq1H86KqoMP6ZgnvnD17822SXOWL
dX6SpOl0Va6XMMjb+k9Tfn3nb+XqLX77Hb6In8+zYgafwwC+xpH0ytUUP85W
40v4+LKul9XJgwf4FH5UXOU9fewBfvBgtCqvq/wBvP8A35sW9eV6BG/StK6n
OLMHzYniozOYaFWbTswrPW6nV5QtL7d81Lus57MdWJiT9CBJsnV9Wa5gfbrQ
Df0Ui+okfdNLv8vL6SXs4EK/4J14U8ybX8EUs0XxK+02LPzrV9/pNzkvWl3M
p/DSFziQr6f4WW9czpO42ye99GVW12XU55PLFVBWubzMV9H3YcdPZuV6cgGr
n0fdj7GBJb152xC+gSEU9Tye9jerbDFBUg6+u3XeI3jta/ynN4P3G50966Wv
8mpcrmZZ2N2zVTFufBX1tpjkyxz+WdRRp/nb1der+mK+aYlPe+nfynKyeY2j
B+66yNn115d5toQzMyrqqrfI6yQZw2kklhASGff557K6TE+zynTUuoq/wHNf
Z6O8rvNVsYB/oGk8VkmzxfXiJoe55IugzdPlchYP9xd8dPx1hl/FK8WNPc2u
ikn6pCzf3jbAyRge+npSXF0V62X7yF6vgW7S77JFnd06tGqKj+1vG9vpPIeN
+u4SNua2wRWL7HKabR/dX3Dzi0Wefrcubx3eW3n4fLout43xyWW2mhV5+n22
gjfKcEu+K8tpo+VxdSnPfg1HtpwX6/mGfe4BHf+5XOS30g4dd6D89cVFMS7g
sMBYLy7yvGVJZ/m79C9AavksvwqafZ77TdM1kOe+nsN37dN/mQOlpq8zoNju
6WLSOC9VvcQn2nmREA3cIkA1r7PLYhSMCNjRVaM9evhttp5V+Py2dl9eFrNZ
sVymr8eXJdwL2eIOm1O5Z7+e0vftbT/PVkAc6ZvLch7v+fPyV+g3Xsp5/fWc
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
lOkT1kAT4q+3/wdgJCzcxBcDAA==

-->

</rfc>
