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

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

<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>20:</t>
        <ul spacing="normal">
          <li>
            <t>Clarify nature of resource IDs (#794)</t>
          </li>
          <li>
            <t>Add idempotency key in leader selected query (*) (#798)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-19" to "dap-20". (*)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf to -22 (<xref target="VDAF"/>).</t>
          </li>
        </ul>
        <t>19:</t>
        <ul spacing="normal">
          <li>
            <t>Delete unused or redundant <tt>ReportError</tt> variants. (*) (#786)</t>
          </li>
          <li>
            <t>Define explicit <tt>unknown_verification_key_id</tt> error. (*) (#784)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-18" to "dap-19". (*)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf to -20 (<xref target="VDAF"/>).</t>
          </li>
        </ul>
        <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>Variable <tt>{task-id}</tt> is replaced with the task ID (<xref target="task-configuration"/>).
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>
        <li>
          <t>Variables <tt>{aggregation-job-id}</tt>, <tt>{aggregate-share-id}</tt>, and
<tt>{collection-job-id}</tt> are replaced with the aggregation job ID (<xref target="agg-init"/>),
aggregate share ID (<xref target="collect-aggregate"/>) and collection job ID
(<xref target="collect-init"/>) respectively.</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" (a 32 byte octet string, represented in hexadecimal) and an aggregation
job ID "lc7aUeGpdSNosNlh-UZhKA" (an ASCII string), 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. These identifiers <bcp14>MUST</bcp14> match the "path-rootless" rule of
<xref section="3.3" sectionFormat="comma" target="RFC3986"/>. That is, one or more path segments joined by slash
("/") characters.</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),
  invalid_message(7),
  report_too_early(8),
  unknown_verification_key_id(9),
  unsupported_extension(10),
  (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>An interval <tt>a</tt> is said to be inside or fall within another interval <tt>b</tt> if:</t>
          <ul spacing="normal">
            <li>
              <t><tt>a.start</tt> is not before <tt>b</tt> and</t>
            </li>
            <li>
              <t>the the end of <tt>a</tt> (<tt>a.start + a.duration</tt>) is not after <tt>b</tt>.</t>
            </li>
          </ul>
          <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<0..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-20" || 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-20" with "dap".)</t>
            <sourcecode type="pseudocode"><![CDATA[
enc, payload = SealBase(pk,
  "dap-20 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>hpke_unknown_config_id</tt>. When the
Client receives an <tt>hpke_unknown_config_id</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>If the Task Interval Task Extension (<xref target="task-interval-extension"/>) is in use,
then the Leader <bcp14>MUST</bcp14> discard any report whose timestamp is outside of the
<tt>task_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> set the corresponding error field to
<tt>unsupported_extension</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> set the corresponding error field to
<tt>invalid_message</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-20" || 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 identified by
<tt>verification_key_id</tt></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.
The Helper <bcp14>MUST</bcp14> use the verification key identified by this field when
initializing VDAF verification.</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
<tt>verification_key_id</tt> field and 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 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 <bcp14>MUST</bcp14> 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-20" || 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> or <tt>unknown_verification_key_id</tt>, in which case the
Leader <bcp14>MAY</bcp14> include the report in a subsequent aggregation job. If the report
error is <tt>unknown_verification_key_id</tt>, the Leader <bcp14>MAY</bcp14> retry the report after
selecting a verification key ID known to the Helper.</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 Helper <bcp14>MUST</bcp14>
fail the job with error <tt>invalidMessage</tt>.</t>
              </li>
              <li>
                <t>Whether <tt>AggregationJobInitReq.verification_key_id</tt> identifies a VDAF
verification key configured for the task. If not, the Helper <bcp14>MUST</bcp14> reject each
report with error <tt>unknown_verification_key_id</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-20" || 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 identified by
<tt>verification_key_id</tt></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-20 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, the Aggregator marks the report
share as invalid with the error <tt>hpke_unknown_config_id</tt>. If reports are
rejected for this reason, Clients <bcp14>MAY</bcp14> retry the report upload after fetching
current HPKE configurations for the Aggregators and re-encrypting the reports,
though this may not be possible in all deployments.</t>
            <t>If decryption fails, the Aggregator marks the report share as invalid with the
error <tt>hpke_decrypt_error</tt>. Otherwise, the Aggregator outputs the resulting
PlaintextInputShare <tt>plaintext_input_share</tt>.</t>
          </section>
          <section anchor="input-share-validation">
            <name>Input Share Validation</name>
            <t>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 outside the task's
<tt>task_interval</tt>. If so, the Aggregator <bcp14>MUST</bcp14> mark the input share as invalid
with the error <tt>report_dropped</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 {
  verification_key_id = 0,
  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 {
  verification_key_id = 0,
  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-20" || 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 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-20" || 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 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 Leader <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 for the task, it <bcp14>MUST</bcp14> return the
existing job's location and current state as described in <xref target="resource-creation"/>.
This existing-resource response takes precedence over the <tt>batchOverlap</tt> check
above, including when the existing collection job has completed.</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(struct {
      idempotency_key = [0x0a, 0x0b, 0x0c, ...],
    } LeaderSelectedQueryConfig),
  } 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"/>).</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-20 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-20 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>How to determine if a <tt>BatchSelector</tt> is consistent with a <tt>Query</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 an interval containing all of the reports in the
batch.</t>
          <t>A <tt>TimeIntervalBatchSelectorConfig</tt> is consistent with <tt>TimeIntervalQueryConfig</tt>
for this batch mode if the batch selector's interval is within the query's time
interval.</t>
        </section>
        <section anchor="time-interval-batch-buckets">
          <name>Batch Buckets</name>
          <t>Each batch bucket is identified by an <tt>Interval</tt> whose duration is equal to the
task's <tt>time_precision</tt>. The identifier associated with a given report is the
unique such interval containing the timestamp of the report. For example, if
the task's <tt>time_precision</tt> is 1000 seconds and the report was generated at
1729629081 seconds after the start of the UNIX epoch, the relevant batch
bucket identifier is</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  start = 1729629,
  duration = 1,
} Interval
]]></sourcecode>
          <t>The <tt>Query</tt> received by the Leader or <tt>BatchSelector</tt> received by the Helper
determines a valid set of batch bucket identifiers if the batch interval's
duration is greater than or equal to the task's <tt>time_precision</tt>.</t>
          <t>A batch consists of a sequence of contiguous batch buckets. That is, the set of
batch bucket identifiers for the batch interval is</t>
          <sourcecode type="tls-presentation"><![CDATA[
[
  struct {
    start = batch_interval.start,
    duration = 1,
  } Interval,
  struct {
    start = batch_interval.start + 1,
    duration = 1,
  } Interval,
  ...
  struct {
    start = batch_interval.start + batch_interval.duration - 1,
    duration = 1,
  } Interval,
]
]]></sourcecode>
        </section>
      </section>
      <section anchor="leader-selected-batch-mode">
        <name>Leader-selected Batch Mode</name>
        <t>The leader-selected batch mode is used when it is acceptable for the Leader to
arbitrarily batch reports. Each batch is identified by an opaque "batch ID"
chosen by the Leader, which <bcp14>MUST</bcp14> be unique in the scope of the task.</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque BatchID[32];
]]></sourcecode>
        <t>The Collector will not know the set of batch IDs available for collection. To
get the aggregate of a batch, the Collector issues a query for the next
available batch. The Leader selects a recent batch to aggregate which <bcp14>MUST NOT</bcp14>
yet have been associated with a collection job.</t>
        <t>The Aggregators can output batches of any size that is larger than or equal to
the task's minimum batch size. The target batch size, if any, is
implementation-specific, and may be equal to or greater than the minimum batch
size. Deciding how soon batches should be output is also
implementation-specific. Exactly sizing batches may be challenging for Leader
deployments in which multiple, independent nodes running the aggregate
interaction (see <xref target="aggregate-flow"/>) need to be coordinated.</t>
        <section anchor="query-configuration-1">
          <name>Query Configuration</name>
          <t>They payload of <tt>Query.config</tt> is:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque idempotency_key<1..2^8-1>;
} LeaderSelectedQueryConfig;
]]></sourcecode>
          <t>The request indicates the Collector would like the next batch selected by the
Leader. The <tt>idempotency_key</tt> is chosen by the Collector and <bcp14>MUST</bcp14> be unique
within the scope of the task. Its purpose is to make it possible for
implementations of collection job creation in the leader-selected batch mode to
satisfy the requirements in <xref target="resource-creation"/>.</t>
          <t>The Collector <bcp14>SHOULD</bcp14> keep track of the <tt>idempotency_key</tt> values it uses so that
it can retry collection job creation requests without the risk of orphaning
batches. The Leader <bcp14>MUST</bcp14> associate <tt>idempotency_key</tt> values with the batch IDs
and collection job IDs it assigns, as well as the parameters of the collection
job so that it can successfully service collection job creation retries.</t>
          <t>If the Leader receives a <tt>LeaderSelectedQueryConfig</tt> containing an
<tt>idempotency_key</tt> it recognizes, then it <bcp14>MUST</bcp14> respond using the associated batch
ID and collection job ID. If any fields such a collection job request do not
match what the Leader previously associated with the idempotency key, then that
means responding with an error as described in <xref target="collect-init"/>.</t>
          <t>If the <tt>idempotency_key</tt> is unrecognized, then the Leader attempts to create a
new collection job.</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>
          <t>Since this batch mode's query does not contain the batch ID, batch selectors are
always consistent with queries.</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>report_replayed</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>invalid_message</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>report_too_early</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>unknown_verification_key_id</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFC XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x0A</tt></td>
                <td align="left">
                  <tt>unsupported_extension</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFC 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="24" month="June" 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-20"/>
        </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="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="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="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 5043?>

<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="Ulbrych" fullname="Stan Ulbrych">
        <organization>Independent</organization>
        <address>
          <email>stanulbrych@gmail.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+y963rbVpYg+h9PgZZ/WKqQNCnJkqxUqqPYTqKuOHbbTtVU
p6tFkIQoxCTBJkDJiu1+lvMs58lmXfdeewOk5KTmmzNzWl+VIwHY97XX/dLt
dpO6qGf5abrzrKjqVTFa1/kkPZtOV/k0q4tykb5alXU5LmfpZbmCP4rrbHwL
/82rfHVdLKbpizyr1qt8ni/qnSQbjVb59Wn67OxVMinHi2wOXU9W2WXdLfL6
srtczruTbNnd7yfjrM6n5er2NK3qSVKtR/OiqmDA+nYJbc6fv/02Sa7zxTo/
TdJ0uirXS5jkXeOnKTff+Wu5eodvv8OG+HyeFTN4DhP4GmfSK1dTfJytxlfw
+Kqul9Xpo0f4FT4qrvOefvYIHzwarcqbKn8E7R9hu2lRX61H0JKWdTPFlT1q
LhQ/ncFCq9oMYpr0uJ9eUbY0bnnUu6rnsx3YmNP0IEmydX1VrmB/ujAM/RSL
6jR920u/y8vpFZzgQl/wSbwt5s1XsMRsUfxKpw0b/+b1d/om502ri/kUGn2B
E/l6is9643KexMM+7aWvsrouozGfXq0AssrlVb6K3ocDP52V68kl7H4eDT/G
DpbU8q4pfANTKOp5vOxvVtligqAcvLtz3SNo9jX+05tB+8Zgz3vp67wal6tZ
Fg73fFWMG6+i0RaTfJnDP4s6GjR/t/p6VV/ON23xWS/9a1lONu9x9MF9Nzm7
+foqz5ZwZ0ZFXfUWeZ0kY7iNhBJCIOMx/6WsrtKzrDIDte7iL/Dd19kor+t8
VSzgH+gar1XS7HG9uM1hLfki6PNsuZzF0/0FPx1/neGreKe4s2fZdTFJn5bl
u7smOBnDR19PiuvrYr1sn9mbNcBN+l22qLM7p1ZN8bP9bXM7m+dwUN9dwcHc
NblikV1Ns+2z+zMefrHI0+/W5Z3TeycfX0zX5bY5Pr3KVrMiT7/PVtCiDI/k
u7KcNnoeV1fy7ddwZct5sZ5vOOcewPG/lIv8Ttih6w6Qv768LMYFXBaY6+Vl
nrds6Sx/n/4ZQC2f5ddBty9yf2i6B/Ld13N41778VzlAavomA4jtni0mjftS
1Uv8oh0XCdAAFQGoeZNdFaNgRoCOrhv90cfvsvWswu+39fvqqpjNiuUyfTO+
KoEuZIt7HE7lvv16Su/b+36RrQA40rdX5Tw+8xflrzBuvJXz+us5v9iwCTVs
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
+Ovt/wLN5Po5YCADAA==

-->

</rfc>
