<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-19" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="DAP">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-19"/>
    <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="July" day="06"/>
    <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>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>Variables <tt>{task-id}</tt>, <tt>{aggregation-job-id}</tt>, <tt>{aggregate-share-id}</tt>, and
<tt>{collection-job-id}</tt> are replaced with the task ID (<xref target="task-configuration"/>),
aggregation job ID (<xref target="agg-init"/>), aggregate share ID (<xref target="collect-aggregate"/>)
and collection job ID (<xref target="collect-init"/>) respectively. The value <bcp14>MUST</bcp14> be
encoded in its URL-safe, unpadded Base 64 representation as specified in
Sections <xref target="RFC4648" section="5" sectionFormat="bare"/> and <xref target="RFC4648" section="3.2" sectionFormat="bare"/> of <xref target="RFC4648"/>.</t>
        </li>
      </ul>
      <t>For example, given a helper URL "https://example.com/api/dap", task ID "f0 16 34
47 36 4c cf 1b c0 e3 af fc ca 68 73 c9 c3 81 f6 4a cd f9 02 06 62 f8 3f 46 c0 72
19 e7" and an aggregation job ID "95 ce da 51 e1 a9 75 23 68 b0 d9 61 f9 46 61
28" (32 and 16 byte octet strings, represented in hexadecimal), resource URL
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt> would be
expanded into
<tt>https://example.com/api/dap/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA</tt>.</t>
      <t>Protocol participants act on resources using HTTP requests, which follow the
semantics laid out in <xref target="RFC9110"/>, in particular with regard to safety and
idempotence of HTTP methods (Sections <xref target="RFC9110" section="9.2.1" sectionFormat="bare"/> and <xref target="RFC9110" section="9.2.2" sectionFormat="bare"/> of <xref target="RFC9110"/>,
respectively).</t>
      <t>The use of HTTPS is <bcp14>REQUIRED</bcp14> to provide server authentication and
confidentiality. TLS certificates <bcp14>MUST</bcp14> be checked according to <xref section="4.3.4" sectionFormat="comma" target="RFC9110"/>.</t>
      <section anchor="asynchronous-request-handling">
        <name>Asynchronous Request Handling</name>
        <t>Many of the protocol's interactions may be handled asynchronously so that
servers can appropriately allocate resources for long-running transactions.</t>
        <t>In DAP, an HTTP server indicates that it is deferring the handling of a request
by immediately sending an empty response body with a successful status code
(<xref section="15.3" sectionFormat="comma" target="RFC9110"/>). The response <bcp14>SHOULD</bcp14> include a Retry-After field
(<xref section="10.2.3" sectionFormat="comma" target="RFC9110"/>) to suggest a polling interval to the HTTP client.
The HTTP client then polls the state of the resource by sending GET requests to
the resource URL. In some interactions, the resource's location will be
indicated by a Location header in the HTTP server's response (<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>); see <xref target="resource-creation"/>. Otherwise the resource URL is the
URL to which the HTTP client initially sent its request.</t>
        <t>The HTTP client <bcp14>SHOULD</bcp14> use each response's Retry-After header field to decide
when to fetch the resource. The HTTP server responds the same way as it did to
the initial request until either the resource is ready, from which point it
responds with the resource's representation (<xref section="3.2" sectionFormat="comma" target="RFC9110"/>), or
handling the request fails, in which case it <bcp14>MUST</bcp14> abort with the error that
caused the failure.</t>
        <t>The HTTP server may instead handle the request immediately. It waits to respond
to the HTTP client's request until the resource is ready, in which case it
responds with the resource's representation, or handling the request fails, in
which case it <bcp14>MUST</bcp14> abort with the error that caused the failure.</t>
        <t>Implementations are not required to support GET on resources if they are served
synchronously, but they could do so, as a way for other protocol participants to
retrieve the results of some transaction later on. The retention period for
job results is an implementation detail.</t>
      </section>
      <section anchor="resource-creation">
        <name>Resource Creation</name>
        <t>Several DAP interactions involve creating new resources on an HTTP server:
aggregation jobs (<xref target="agg-init"/>), collection jobs (<xref target="collect-init"/>), and
aggregate shares (<xref target="collect-aggregate"/>). In each case, the HTTP client sends a
POST request to a creation URL and the HTTP server assigns the new resource a
unique identifier.</t>
        <t>The server responds with a successful status code and a Location header field
(<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>) indicating the location of the newly created
resource. If the server handles the request synchronously, the response also
includes the resource's representation in the body. If the server defers
handling, the response body is empty and the HTTP client polls the resource at
the location indicated by the Location header, as described in <xref target="http-usage"/>.</t>
        <t>Resource creation <bcp14>MUST</bcp14> be idempotent: if the server receives a POST request
identical to one that created an existing resource (as defined by the interaction-
specific criteria below), it <bcp14>MUST</bcp14> indicate the existing resource's location
in the Location header rather than creating a duplicate. This allows HTTP clients
to safely retry requests without risking side effects.</t>
        <t>One way to achieve this is to derive the resource identifier deterministically
from the request content.</t>
      </section>
      <section anchor="http-status-codes">
        <name>HTTP Status Codes</name>
        <t>HTTP servers participating in DAP <bcp14>MAY</bcp14> use any status code from the applicable
class when constructing HTTP responses, but HTTP clients <bcp14>MAY</bcp14> treat any status
code as the most general code of that class. For example, 202 may be handled as
200, or 499 as 400.</t>
      </section>
      <section anchor="presentation-language">
        <name>Presentation Language</name>
        <t>We use the presentation language defined in <xref section="3" sectionFormat="comma" target="RFC8446"/> to define
messages in the protocol. Encoding and decoding of these messages as byte
strings also follows <xref target="RFC8446"/>.</t>
      </section>
      <section anchor="request-authentication">
        <name>Request Authentication</name>
        <t>The protocol is made up of several interactions in which different subsets of
participants interact with each other.</t>
        <t>In those cases where a channel between two participants is tunneled through
another protocol participant, Hybrid Public Key Encryption (<xref target="HPKE"/>)
ensures that only the intended recipient can see a message in the clear.</t>
        <t>In other cases, HTTP client authentication is required as well as server
authentication. Any authentication scheme that is composable with HTTP is
allowed. For example:</t>
        <ul spacing="normal">
          <li>
            <t><xref target="OAuth2"/> credentials are presented in an Authorization HTTP header
(<xref section="11.6.2" sectionFormat="comma" target="RFC9110"/>), which can be added to any protocol message.</t>
          </li>
          <li>
            <t>TLS client certificates can be used to authenticate the underlying transport.</t>
          </li>
          <li>
            <t><xref target="RFC9421"/> HTTP message signatures authenticate messages without
transmitting a secret.</t>
          </li>
        </ul>
        <t>This flexibility allows organizations deploying DAP to use authentication
mechanisms that they already support. Discovering what authentication mechanisms
are supported by a participant is outside of this document's scope.</t>
        <t>Request authentication is <bcp14>REQUIRED</bcp14> in the following interactions:</t>
        <ul spacing="normal">
          <li>
            <t>Leaders initializing or continuing aggregation jobs with Helpers
(<xref target="aggregate-flow"/>).</t>
          </li>
          <li>
            <t>Collectors initializing or polling collection jobs with Leaders
(<xref target="collect-init"/>).</t>
          </li>
          <li>
            <t>Leaders obtaining aggregate shares from Helpers (<xref target="collect-aggregate"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="errors">
        <name>Errors</name>
        <t>Errors are reported as HTTP status codes. Any of the standard client or server
errors (the 4xx or 5xx classes, respectively, from <xref section="15" sectionFormat="of" target="RFC9110"/>)
are permitted.</t>
        <t>When the server responds with an error status code, it <bcp14>SHOULD</bcp14> provide additional
information using a problem detail object <xref target="RFC9457"/> in the response body. If
the response body does consist of a problem detail object, the status code <bcp14>MUST</bcp14>
indicate a client or server error.</t>
        <t>To facilitate automatic response to errors, this document defines the following
standard tokens for use in the "type" field:</t>
        <table anchor="urn-space-errors">
          <thead>
            <tr>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">invalidMessage</td>
              <td align="left">A message received by a protocol participant could not be parsed or otherwise was invalid.</td>
            </tr>
            <tr>
              <td align="left">unrecognizedTask</td>
              <td align="left">A server received a message with an unknown task ID.</td>
            </tr>
            <tr>
              <td align="left">unrecognizedAggregationJob</td>
              <td align="left">A server received a message with an unknown aggregation job ID.</td>
            </tr>
            <tr>
              <td align="left">batchInvalid</td>
              <td align="left">The batch boundary check for Collector's query failed.</td>
            </tr>
            <tr>
              <td align="left">invalidBatchSize</td>
              <td align="left">There are an invalid number of reports in the batch.</td>
            </tr>
            <tr>
              <td align="left">invalidAggregationParameter</td>
              <td align="left">The aggregation parameter assigned to a batch is invalid.</td>
            </tr>
            <tr>
              <td align="left">batchMismatch</td>
              <td align="left">Aggregators disagree on the report shares that were aggregated in a batch.</td>
            </tr>
            <tr>
              <td align="left">stepMismatch</td>
              <td align="left">The Aggregators disagree on the current step of the DAP aggregation protocol.</td>
            </tr>
            <tr>
              <td align="left">batchOverlap</td>
              <td align="left">A request's query includes reports that were previously collected in a different batch.</td>
            </tr>
            <tr>
              <td align="left">unsupportedExtension</td>
              <td align="left">An extensions list includes an unknown extension.</td>
            </tr>
            <tr>
              <td align="left">invalidExtension</td>
              <td align="left">An extensions list is out of order or contains an invalid extension encoding.</td>
            </tr>
          </tbody>
        </table>
        <t>These types are scoped to the errors sub-namespace of the DAP URN namespace,
e.g., urn:ietf:params:ppm:dap:error:invalidMessage.</t>
        <t>This list is not exhaustive. The server <bcp14>MAY</bcp14> return errors set to a URI other
than those defined above. Servers <bcp14>MUST NOT</bcp14> use the DAP URN namespace for errors
not listed in the appropriate IANA registry (see <xref target="urn-space"/>). The "detail"
member of the Problem Details document includes additional diagnostic
information.</t>
        <t>When the task ID is known (see <xref target="task-configuration"/>), the problem document
<bcp14>SHOULD</bcp14> include an additional "taskid" member containing the ID encoded in Base
64 using the URL and filename safe alphabet with no padding defined in
Sections <xref target="RFC4648" section="5" sectionFormat="bare"/> and <xref target="RFC4648" section="3.2" sectionFormat="bare"/> of <xref target="RFC4648"/>.</t>
        <t>In the remainder of this document, the tokens in the table above are used to
refer to error types, rather than the full URNs. For example, an "error of type
'invalidMessage'" refers to an error document with "type" value
"urn:ietf:params:ppm:dap:error:invalidMessage".</t>
        <t>This document uses the verbs "abort" and "alert with [some error message]" to
describe how protocol participants react to various error conditions. This
implies that the response's status code will indicate a client error unless
specified otherwise.</t>
      </section>
    </section>
    <section anchor="protocol">
      <name>Protocol Definition</name>
      <t>DAP has three major interactions which need to be defined:</t>
      <ul spacing="normal">
        <li>
          <t>Clients upload reports to the Aggregators, specified in <xref target="upload-flow"/></t>
        </li>
        <li>
          <t>Aggregators jointly verify reports and aggregate them together, specified in
<xref target="aggregate-flow"/></t>
        </li>
        <li>
          <t>The Collector collects aggregated results from the Aggregators, specified in
<xref target="collect-flow"/></t>
        </li>
      </ul>
      <t>Each of these interactions is defined in terms of HTTP resources. In this
section we define these resources and the messages used to act on them.</t>
      <section anchor="basic-definitions">
        <name>Basic Type Definitions</name>
        <t>A <tt>ReportID</tt> is used to uniquely identify a report in the context of a DAP task.</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque ReportID[16];
]]></sourcecode>
        <t><tt>Role</tt> enumerates the roles assumed by protocol participants.</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  collector(0),
  client(1),
  leader(2),
  helper(3),
  (255)
} Role;
]]></sourcecode>
        <t><tt>HpkeCiphertext</tt> is a message encrypted using <xref target="HPKE"/> and metadata
needed to decrypt it. <tt>HpkeConfigId</tt> identifies a server's HPKE configuration
(see <xref target="hpke-config"/>).</t>
        <sourcecode type="tls-presentation"><![CDATA[
uint8 HpkeConfigId;

struct {
  HpkeConfigId config_id;
  opaque enc<1..2^16-1>;
  opaque payload<1..2^32-1>;
} HpkeCiphertext;
]]></sourcecode>
        <t><tt>config_id</tt> identifies the HPKE configuration to which the message was
encrypted. <tt>enc</tt> and <tt>payload</tt> correspond to the values returned by the
<xref target="HPKE"/> <tt>SealBase()</tt> function. Later sections describe how to use <tt>SealBase()</tt>
in different situations.</t>
        <t><tt>Empty</tt> is a zero-length byte string.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {} Empty;
]]></sourcecode>
        <t>Errors that occurred while handling individual reports in the upload or
aggregation interactions are represented by the following enum:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0),
  batch_collected(1),
  report_replayed(2),
  report_dropped(3),
  hpke_unknown_config_id(4),
  hpke_decrypt_error(5),
  vdaf_verify_error(6),
  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>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-19" || 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-19" with "dap".)</t>
            <sourcecode type="pseudocode"><![CDATA[
enc, payload = SealBase(pk,
  "dap-19 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-19" || 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-19" || 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-19" || 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-19 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-19" || 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-19" || 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, it <bcp14>MUST</bcp14> return the existing job's
location and current state as described in <xref target="resource-creation"/>.</t>
          <section anchor="example-5">
            <name>Example</name>
            <t>The Leader handles the collection job request synchronously:</t>
            <sourcecode type="http"><![CDATA[
POST /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  collection_jobs
Host: example.com
Content-Type: application/ppm-dap;message=collection-job-req
Authorization: Bearer auth-token

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

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

encoded(struct {
  report_count = 1000,
  interval = struct {
    start = 16595440,
    duration = 1,
  } Interval,
  leader_encrypted_agg_share = struct { ... } HpkeCiphertext,
  helper_encrypted_agg_share = struct { ... } HpkeCiphertext,
} CollectionJobResp)
]]></sourcecode>
            <t>Or asynchronously:</t>
            <sourcecode type="http"><![CDATA[
POST /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  collection_jobs
Host: example.com
Content-Type: application/ppm-dap;message=collection-job-req
Authorization: Bearer auth-token

encoded(struct {
  query = struct {
    batch_mode = BatchMode.time_interval,
    query = encoded(struct {
      batch_interval = struct {
        start = 16595440,
        duration = 1,
      } Interval,
    } TimeIntervalQueryConfig),
  },
  agg_param = encoded(Empty),
  extensions = [],
} CollectionJobReq)

HTTP/1.1 200
Location: /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  collection_jobs/lc7aUeGpdSNosNlh-UZhKA
Retry-After: 300

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

HTTP/1.1 200
Retry-After: 300

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

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

encoded(struct {
  report_count = 4000,
  interval = struct {
    start = 1659547,
    duration = 10,
  } Interval,
  leader_encrypted_agg_share = struct { ... } HpkeCiphertext,
  helper_encrypted_agg_share = struct { ... } HpkeCiphertext,
} CollectionJobResp)
]]></sourcecode>
          </section>
        </section>
        <section anchor="collect-ext">
          <name>Collection Job Extensions</name>
          <t>A Collector can add extensions to the creation of a collection job
to pass additional information to Aggregators (primarily the Leader)
about how to handle the collection job.</t>
          <figure anchor="f-collect-ext">
            <name>Collection Job Extensions</name>
            <sourcecode type="tls-syntax"><![CDATA[
struct {
  CollectionJobExtensionType extension_type;
  opaque extension_data<0..2^16-1>;
} CollectionJobExtension;

enum {
  reserved(0),
  (2^16-1)
} CollectionJobExtensionType;
]]></sourcecode>
          </figure>
          <t>These extensions (shown in <xref target="f-collect-ext"/>) contain
a type identifier (<tt>extension_type</tt>)
and arbitrary data (<tt>extension_data</tt>).
The data is structured according to the definition of the extension.</t>
          <t>Extensions are mandatory to support by both Aggregators.
A collection job that contains an unrecognized or unsupported extension
<bcp14>MUST</bcp14> be aborted with an <tt>unsupportedExtension</tt> error; see <xref target="errors"/>.</t>
          <t>Extensions <bcp14>MUST</bcp14> be encoded in strictly increasing order.
If any <tt>extension_type</tt> value is equal to or less than that of the extension that precedes it,
the job <bcp14>MUST</bcp14> be failed with an <tt>invalidExtension</tt> error; see <xref target="errors"/>.</t>
          <t>Each collection job extension <bcp14>MUST</bcp14> define how Aggregators
alter their handling of collection jobs
when the extension is present,
including any validation of the included <tt>extension_data</tt>.</t>
          <t>An extension could limit its compatibility
to specific VDAFs, batch modes, or those with certain properties.
For instance, an extension might only apply
if the VDAF supports eager aggregation; see <xref target="eager-aggregation"/>.
In that case, jobs can be failed with an <tt>invalidExtension</tt> error
if the extension is incompatible.</t>
          <t>Collection job extensions are distinct from report and task extensions.
Collection job extensions are only agreed between Collector, Leader, and Helper;
they are not appropriate for use where the adjustment to protocol behavior
might also need to be agreed by Clients.</t>
        </section>
        <section anchor="collection-job-deletion">
          <name>Collection Job Deletion</name>
          <t>The Collector can send a DELETE request to the collection job, which indicates
to the Leader that it can abandon the collection job and discard state related
to it.</t>
          <t>Aggregators <bcp14>MUST NOT</bcp14> delete information needed for replay or double collection
checks (<xref target="batch-buckets"/>).</t>
          <section anchor="example-6">
            <name>Example</name>
            <sourcecode type="http"><![CDATA[
DELETE /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  collection_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
]]></sourcecode>
          </section>
        </section>
        <section anchor="collect-aggregate">
          <name>Obtaining Aggregate Shares</name>
          <t>The Leader must compute its own aggregate share and obtain the Helper's
encrypted aggregate share before it can complete a collection job.</t>
          <t>First, the Leader retrieves all batch buckets (<xref target="batch-buckets"/>) associated
with this collection job. The batch buckets to retrieve depend on the batch mode
of this task:</t>
          <ul spacing="normal">
            <li>
              <t>For time-interval (<xref target="time-interval-batch-mode"/>), this is all batch buckets
whose batch bucket identifiers are contained within the batch interval
specified in the <tt>CollectionJobReq</tt>'s query.</t>
            </li>
            <li>
              <t>For leader-selected (<xref target="leader-selected-batch-mode"/>), this is the batch
bucket associated with the batch ID the Leader has chosen for this collection
job.</t>
            </li>
          </ul>
          <t>The Leader then combines the values inside the batch bucket as follows:</t>
          <ul spacing="normal">
            <li>
              <t>Aggregate shares are combined via <tt>Vdaf.merge(agg_param, agg_shares)</tt> (see
<xref section="4.4" sectionFormat="comma" target="VDAF"/>), where <tt>agg_param</tt> is the aggregation parameter
provided in the <tt>CollectionJobReq</tt>, and <tt>agg_shares</tt> are the (partial)
aggregate shares in the batch buckets. The result is the Leader aggregate
share for this collection job.</t>
            </li>
            <li>
              <t>Report counts are combined via summing.</t>
            </li>
            <li>
              <t>Checksums are combined via bitwise XOR.</t>
            </li>
          </ul>
          <t>A Helper aggregate share is identified by a server-selected identifier, unique within
the scope of the task, assigned during resource creation (<xref target="resource-creation"/>).
Since this resource corresponds to exactly one collection job, the Leader might use
the collection job ID as the aggregate share ID.</t>
          <t>The Helper's aggregate share is an HTTP resource served by the Helper at the URL
<tt>{helper}/tasks/{task-id}/aggregate_shares/{aggregate-share-id}</tt>. To obtain an
aggregate share, the Leader sends a POST request to
<tt>{helper}/tasks/{task-id}/aggregate_shares</tt> with the body:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  BatchMode batch_mode;
  opaque config<0..2^16-1>;
} BatchSelector;

struct {
  CollectionJobReq collection_job_req;
  BatchSelector batch_selector;
  uint64 report_count;
  opaque checksum[32];
} AggregateShareReq;
]]></sourcecode>
          <t>The media type of <tt>AggregateShareReq</tt> is
"application/ppm-dap;message=aggregate-share-req". The structure contains the
following parameters:</t>
          <ul spacing="normal">
            <li>
              <t><tt>collection_job_req</tt>: The details of the collection job,
as provided by the Collector when initiating the job; see <xref target="collect-init"/>.</t>
            </li>
            <li>
              <t><tt>batch_selector</tt>: The "batch selector", the contents of which depends on the
indicated batch mode; see <xref target="batch-modes"/>.</t>
            </li>
            <li>
              <t><tt>report_count</tt>: The number number of reports included in the batch, as
computed above.</t>
            </li>
            <li>
              <t><tt>checksum</tt>: The batch checksum, as computed above.</t>
            </li>
          </ul>
          <t>The aggregate share request can be handled either asynchronously or
synchronously as described in <xref target="http-usage"/>. The representation of the share is
an <tt>AggregateShare</tt> (defined below).</t>
          <t>The Helper first ensures that it recognizes the task ID. If not, it <bcp14>MUST</bcp14> fail
the job with error <tt>unrecognizedTask</tt>.</t>
          <t>The indicated batch mode <bcp14>MUST</bcp14> match the task's batch mode. If not, the Helper
<bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
          <t>If the <tt>AggregateShareReq</tt> is malformed, the Helper <bcp14>MUST</bcp14> fail the job with error
<tt>invalidMessage</tt>.</t>
          <t>The Helper then verifies that the <tt>batch_selector</tt> in the Leader's request
is consistent with the <tt>collection_job_req.query</tt>.
Each batch mode needs to define any consistency checks necessary.
The Helper also determines whether <tt>batch_selector</tt> identifies a set of batch buckets
that can be collected. If the selector does not identify a
valid set of batch buckets according to the criteria defined by the batch mode
in use (<xref target="batch-modes"/>), then the Helper <bcp14>MUST</bcp14> fail the job with error
<tt>batchInvalid</tt>.</t>
          <t>If any of the batch buckets identified by the selector have already been
collected, then the Helper <bcp14>MUST</bcp14> fail the job with error <tt>batchOverlap</tt>.</t>
          <t>If the number of validated reports in the batch is not equal to or greater than
the task's minimum batch size, then the Helper <bcp14>MUST</bcp14> abort with
<tt>invalidBatchSize</tt>.</t>
          <t>The aggregation parameter in <tt>collection_job_req.agg_param</tt>
            <bcp14>MUST</bcp14> match the aggregation parameter used in
aggregation jobs pertaining to this batch. If not, the Helper <bcp14>MUST</bcp14> fail the job
with error <tt>invalidMessage</tt>.</t>
          <t>The Helper then validates any extensions in <tt>collection_job_req.extensions</tt>,
following the same logic as the Leader; see <xref target="collect-ext"/>.
Though invalid extension encoding should have been detected by the Leader,
the Helper <bcp14>MUST</bcp14> independently validate extensions
and fail the job if necessary.</t>
          <t>The Helper performs any configuration changes or processing
that are dictated by the extensions that are included; see <xref target="collect-ext"/>.</t>
          <t>Next, the Helper retrieves and combines the batch buckets associated with the
request using the same process used by the Leader (described at the beginning of
this section), arriving at its aggregate share, report count, and checksum
values. If the Helper's computed report count and checksum values do not match
the values provided in the <tt>AggregateShareReq</tt>, it <bcp14>MUST</bcp14> fail the job with error
<tt>batchMismatch</tt>.</t>
          <t>The Helper then encrypts <tt>agg_share</tt> under the Collector's HPKE public key as
described in <xref target="aggregate-share-encrypt"/>, yielding <tt>encrypted_agg_share</tt>.
Encryption prevents the Leader from learning the actual result, as it only has
its own aggregate share and cannot compute the Helper's.</t>
          <t>Once the Helper has encrypted its aggregate share, the aggregate share job is
ready. Its results are represented by an <tt>AggregateShare</tt>, with media type
"application/ppm-dap;message=aggregate-share":</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  HpkeCiphertext encrypted_aggregate_share;
} AggregateShare;
]]></sourcecode>
          <t><tt>encrypted_aggregate_share.config_id</tt> is set to the Collector's HPKE config ID.
<tt>encrypted_aggregate_share.enc</tt> is set to the encapsulated HPKE context <tt>enc</tt>
computed above and <tt>encrypted_aggregate_share.ciphertext</tt> is the ciphertext
<tt>encrypted_agg_share</tt> computed above.</t>
          <t>After receiving the Helper's response, the Leader includes the HpkeCiphertext in
its response to the Collector (see <xref target="collect-finalization"/>).</t>
          <t>Once an <tt>AggregateShareReq</tt> has been constructed for the batch determined by a
given query, the Helper considers the batch to be collected. The Helper <bcp14>MUST NOT</bcp14>
commit any more output shares to the batch. It is an error for the Leader to
issue any more aggregation jobs for additional reports that satisfy the query.
These reports <bcp14>MUST</bcp14> be rejected by the Helper as described in <xref target="batch-buckets"/>.</t>
          <t>Two <tt>AggregateShareReq</tt> messages are considered identical if their encodings are
byte-for-byte identical. Note that, within a task, a given batch can only be
collected once, so the batch selector is a natural key. If the Helper receives a
POST whose content matches an existing aggregate share, it <bcp14>MUST</bcp14> return the existing
resource's location and current state as described in <xref target="resource-creation"/>.</t>
          <t>Before completing the collection job, the Leader encrypts its aggregate share
under the Collector's HPKE public key as described in
<xref target="aggregate-share-encrypt"/>.</t>
          <section anchor="example-7">
            <name>Example</name>
            <t>The Helper handles the aggregate share request synchronously:</t>
            <sourcecode type="http"><![CDATA[
POST /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregate_shares
Host: example.com
Content-Type: application/ppm-dap;message=aggregate-share-req
Authorization: Bearer auth-token

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

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

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

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

HTTP/1.1 200
Location: /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregate_shares/lc7aUeGpdSNosNlh-UZhKA
Retry-After: 300

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

HTTP/1.1 200
Retry-After: 300

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

HTTP/1.1 200
Content-Type: application/ppm-dap;message=aggregate-share

encoded(struct {
  encrypted_aggregate_share = struct { ... } HpkeCiphertext,
} AggregateShare)
]]></sourcecode>
          </section>
        </section>
        <section anchor="aggregate-share-deletion">
          <name>Aggregate Share Deletion</name>
          <t>The Leader can send a DELETE request to the aggregate share, which indicates to
the Helper that it can abandon the aggregate share and discard state related to
it.</t>
          <t>Aggregators <bcp14>MUST NOT</bcp14> delete information needed for replay or double collection
checks (<xref target="batch-buckets"/>).</t>
          <section anchor="example-8">
            <name>Example</name>
            <sourcecode type="http"><![CDATA[
DELETE /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregate_shares/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Authorization: Bearer auth-token

HTTP/1.1 200
]]></sourcecode>
          </section>
        </section>
        <section anchor="collect-finalization">
          <name>Collection Job Finalization</name>
          <t>Once the Collector has received a collection job from the Leader, it can decrypt
the aggregate shares and produce an aggregate result. The Collector decrypts
each aggregate share as described in <xref target="aggregate-share-encrypt"/>. Once the
Collector successfully decrypts all aggregate shares, it unshards the aggregate
shares into an aggregate result using the VDAF's <tt>unshard</tt> algorithm.</t>
          <t>Let <tt>leader_agg_share</tt> denote the Leader's aggregate share, <tt>helper_agg_share</tt>
denote the Helper's aggregate share, <tt>report_count</tt> denote the report count sent
by the Leader, and <tt>agg_param</tt> denote the opaque aggregation parameter. The
final aggregate result is computed as follows:</t>
          <sourcecode type="pseudocode"><![CDATA[
agg_result = Vdaf.unshard(agg_param,
                          [leader_agg_share, helper_agg_share],
                          report_count)
]]></sourcecode>
        </section>
        <section anchor="aggregate-share-encrypt">
          <name>Aggregate Share Encryption</name>
          <t>Encrypting an aggregate share <tt>agg_share</tt> for a given <tt>AggregateShareReq</tt> is
done as follows:</t>
          <sourcecode type="pseudocode"><![CDATA[
(enc, payload) = SealBase(
    pk,
    "dap-19 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-19 aggregate share" || server_role || 0x00,
    agg_share_aad,
    enc_share.payload)
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>sk</tt> is the HPKE secret key</t>
            </li>
            <li>
              <t><tt>server_role</tt> is the Role of the server that sent the aggregate share (<tt>0x02</tt>
for the Leader and <tt>0x03</tt> for the Helper)</t>
            </li>
            <li>
              <t><tt>0x00</tt> represents the Role of the recipient (always the Collector)</t>
            </li>
            <li>
              <t><tt>agg_share_aad</tt> is an <tt>AggregateShareAad</tt> message constructed from the task ID
and the collection job request (see <xref target="collect-init"/>).</t>
            </li>
          </ul>
          <t>The <tt>OpenBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the HPKE configuration.</t>
        </section>
      </section>
    </section>
    <section anchor="batch-modes">
      <name>Batch Modes</name>
      <t>This section defines an initial set of batch modes for DAP. New batch modes may
be defined by future documents following the guidelines in
<xref target="extending-this-doc"/>.</t>
      <t>In protocol messages, batch modes are identified with a <tt>BatchMode</tt> value:</t>
      <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0),
  time_interval(1),
  leader_selected(2),
  (255)
} BatchMode;
]]></sourcecode>
      <t>Each batch mode specifies the following:</t>
      <ol spacing="normal" type="1"><li>
          <t>The value of the <tt>config</tt> field of <tt>Query</tt> and <tt>BatchSelector</tt></t>
        </li>
        <li>
          <t>Batch buckets (<xref target="batch-buckets"/>): how reports are assigned to batch
buckets; how each bucket is identified; and how batch buckets are mapped to
batches</t>
        </li>
        <li>
          <t>Batch mode configuration: any configuration needed for the batch mode. New
batch modes <bcp14>MUST</bcp14> define a deterministic encoding of their configuration so it
can be incorporated into <tt>TaskConfiguration</tt> (<xref target="task-configuration"/>)
structures.</t>
        </li>
      </ol>
      <t>It may be necessary for the Leader to convey additional information to the
Helper during aggregation in order to assign reports to batch buckets. This may
be done with the aggregation job extension mechanism (see
<xref target="agg-job-extensions"/>). A batch mode that defines such an extension should
specify how it is used to assign reports to batch buckets. See the
leader-selected mode (<xref target="leader-selected-batch-mode"/>) for an example.</t>
      <section anchor="time-interval-batch-mode">
        <name>Time Interval</name>
        <t>The time-interval batch mode is designed to support applications in which
reports are grouped by an interval of time. The Collector specifies a "batch
interval" into which report timestamps must fall.</t>
        <t>The Collector can issue queries whose batch intervals are continuous,
monotonically increasing, and have the same duration. For example, the following
sequence of batch intervals satisfies these conditions:</t>
        <sourcecode type="tls-presentation"><![CDATA[
[
  struct {
    start = 1659544,
    duration = 1,
  } Interval,
  struct {
    start = 1659545,
    duration = 1,
  } Interval,
  struct {
    start = 1659546,
    duration = 1,
  } Interval,
  struct {
    start = 1659547,
    duration = 1,
  } Interval,
]
]]></sourcecode>
        <t>However, this is not a requirement: the Collector may decide to issue queries
out-of-order. In addition, the Collector may need to vary the duration to adjust
to changing report upload rates.</t>
        <section anchor="query-configuration">
          <name>Query Configuration</name>
          <t>The payload of <tt>Query.config</tt> is</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  Interval batch_interval;
} TimeIntervalQueryConfig;
]]></sourcecode>
          <t>where <tt>batch_interval</tt> is the batch interval requested by the Collector. The
interval <bcp14>MUST</bcp14> be well-formed as specified in <xref target="timestamps"/>. Otherwise, the
query does not specify a set of valid batch buckets.</t>
        </section>
        <section anchor="batch-selector-configuration">
          <name>Batch Selector Configuration</name>
          <t>The payload of <tt>BatchSelector.config</tt> is</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  Interval batch_interval;
} TimeIntervalBatchSelectorConfig;
]]></sourcecode>
          <t>where <tt>batch_interval</tt> is the batch interval requested by the Collector.</t>
          <t>A <tt>TimeIntervalBatchSelectorConfig.config</tt> is consistent with <tt>Query.config</tt>
for this batch mode if the batch selector's interval is within the queried time
interval. That is, the values are consistent if:</t>
          <ul spacing="normal">
            <li>
              <t>The start time from the batch selector
(<tt>TimeIntervalBatchSelectorConfig.batch_interval.start</tt>) is not before the
query (<tt>TimeIntervalQueryConfig.batch_interval</tt>), and</t>
            </li>
            <li>
              <t>The end time from the batch selector
(<tt>TimeIntervalBatchSelectorConfig.batch_interval.{start+duration}</tt>)
is not after the query (<tt>TimeIntervalQueryConfig.batch_interval</tt>).</t>
            </li>
          </ul>
        </section>
        <section anchor="time-interval-batch-buckets">
          <name>Batch Buckets</name>
          <t>Each batch bucket is identified by an <tt>Interval</tt> whose duration is equal to the
task's <tt>time_precision</tt>. The identifier associated with a given report is the
unique such interval containing the timestamp of the report. For example, if
the task's <tt>time_precision</tt> is 1000 seconds and the report was generated at
1729629081 seconds after the start of the UNIX epoch, the relevant batch
bucket identifier is</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  start = 1729629,
  duration = 1,
} Interval
]]></sourcecode>
          <t>The <tt>Query</tt> received by the Leader or <tt>BatchSelector</tt> received by the Helper
determines a valid set of batch bucket identifiers if the batch interval's
duration is greater than or equal to the task's <tt>time_precision</tt>.</t>
          <t>A batch consists of a sequence of contiguous batch buckets. That is, the set of
batch bucket identifiers for the batch interval is</t>
          <sourcecode type="tls-presentation"><![CDATA[
[
  struct {
    start = batch_interval.start,
    duration = 1,
  } Interval,
  struct {
    start = batch_interval.start + 1,
    duration = 1,
  } Interval,
  ...
  struct {
    start = batch_interval.start + batch_interval.duration - 1,
    duration = 1,
  } Interval,
]
]]></sourcecode>
        </section>
      </section>
      <section anchor="leader-selected-batch-mode">
        <name>Leader-selected Batch Mode</name>
        <t>The leader-selected batch mode is used when it is acceptable for the Leader to
arbitrarily batch reports. Each batch is identified by an opaque "batch ID"
chosen by the Leader, which <bcp14>MUST</bcp14> be unique in the scope of the task.</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque BatchID[32];
]]></sourcecode>
        <t>The Collector will not know the set of batch IDs available for collection. To
get the aggregate of a batch, the Collector issues a query for the next
available batch. The Leader selects a recent batch to aggregate which <bcp14>MUST NOT</bcp14>
yet have been associated with a collection job.</t>
        <t>The Aggregators can output batches of any size that is larger than or equal to
the task's minimum batch size. The target batch size, if any, is
implementation-specific, and may be equal to or greater than the minimum batch
size. Deciding how soon batches should be output is also
implementation-specific. Exactly sizing batches may be challenging for Leader
deployments in which multiple, independent nodes running the aggregate
interaction (see <xref target="aggregate-flow"/>) need to be coordinated.</t>
        <section anchor="query-configuration-1">
          <name>Query Configuration</name>
          <t>They payload of <tt>Query.config</tt> is empty. The request merely indicates the
Collector would like the next batch selected by the Leader.</t>
        </section>
        <section anchor="leader-selected-batch-id-extension">
          <name>Aggregation Job Extension</name>
          <t>During aggregation, the Leader needs to convey the batch ID of the reports
being aggregated to the Helper. An aggregation job extension is defined for
this purpose:</t>
          <sourcecode type="tls-presentation"><![CDATA[
enum {
  leader_selected_batch_id(1),
  (2^16-1)
} AggregationJobExtensionType;
]]></sourcecode>
          <t>The payload of this extension is a <tt>BatchID</tt> selected by the Leader. The
Helper <bcp14>MUST</bcp14> abort with error <tt>invalidMessage</tt> if this extension is absent or
the payload is not a valid batch ID.</t>
        </section>
        <section anchor="batch-selector-configuration-1">
          <name>Batch Selector Configuration</name>
          <t>The payload of <tt>BatchSelector.config</tt> is:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  BatchID batch_id;
} LeaderSelectedBatchSelectorConfig;
]]></sourcecode>
          <t>where <tt>batch_id</tt> is the batch ID selected by the Leader.</t>
        </section>
        <section anchor="leader-selected-batch-buckets">
          <name>Batch Buckets</name>
          <t>Each batch consists of a single bucket and is identified by the batch ID. A
report is assigned to the batch indicated by the <tt>leader_selected_batch_id</tt>
aggregation job extension (<xref target="leader-selected-batch-id-extension"/>) during
aggregation.</t>
        </section>
      </section>
    </section>
    <section anchor="operational-capabilities">
      <name>Operational Considerations</name>
      <t>The DAP protocol has inherent constraints derived from the tradeoff between
privacy guarantees and computational complexity. These tradeoffs influence how
applications may choose to utilize services implementing the specification.</t>
      <section anchor="entity-capabilities">
        <name>Protocol Participant Capabilities</name>
        <t>The design in this document has different assumptions and requirements for
different protocol participants, including Clients, Aggregators, and Collectors.
This section describes these capabilities in more detail.</t>
        <section anchor="client-capabilities">
          <name>Client Capabilities</name>
          <t>Clients have limited capabilities and requirements. Their only inputs to the
protocol are (1) the parameters configured out of band and (2) a measurement.
Clients are not expected to store any state across any upload flows, nor are
they required to implement any sort of report upload retry mechanism. By design,
the protocol in this document is robust against individual Client upload
failures since the protocol output is an aggregate over all inputs.</t>
        </section>
        <section anchor="aggregator-capabilities">
          <name>Aggregator Capabilities</name>
          <t>Leaders and Helpers have different operational requirements. The design in this
document assumes an operationally competent Leader, i.e., one that has no
storage or computation limitations or constraints, but only a modestly
provisioned Helper, i.e., one that has computation, bandwidth, and storage
constraints. By design, Leaders must be at least as capable as Helpers, where
Helpers are generally required to:</t>
          <ul spacing="normal">
            <li>
              <t>Support the aggregate interaction, which includes validating and aggregating
reports; and</t>
            </li>
            <li>
              <t>Publish and manage an HPKE configuration that can be used for the upload
interaction.</t>
            </li>
            <li>
              <t>Implement some form of batch-to-report index, as well as inter- and
intra-batch replay mitigation storage, which includes some way of tracking
batch report size. Some of this state may be used for replay attack
mitigation. The replay mitigation strategy is described in
<xref target="input-share-validation"/>.</t>
            </li>
          </ul>
          <t>Beyond the minimal capabilities required of Helpers, Leaders are generally
required to:</t>
          <ul spacing="normal">
            <li>
              <t>Support the upload interaction and store reports; and</t>
            </li>
            <li>
              <t>Track batch report size during each collect flow and request encrypted output
shares from Helpers.</t>
            </li>
            <li>
              <t>Implement and store state for the form of inter- and intra-batch replay
mitigation in <xref target="agg-flow"/>. This requires storing the report IDs of all
reports processed for a given task. Implementations may find it helpful to
track additional information, like the timestamp, so that the storage used
for anti-replay can be sharded efficiently.</t>
            </li>
          </ul>
        </section>
        <section anchor="collector-capabilities">
          <name>Collector Capabilities</name>
          <t>Collectors statefully interact with Aggregators to produce an aggregate output.
Their input to the protocol is the task parameters, configured out of band,
which include the corresponding batch window and size. For each collect
invocation, Collectors are required to keep state from the start of the protocol
to the end as needed to produce the final aggregate output.</t>
          <t>Collectors must also maintain state for the lifetime of each task, which
includes key material associated with the HPKE key configuration.</t>
        </section>
      </section>
      <section anchor="vdafs-and-compute-requirements">
        <name>VDAFs and Compute Requirements</name>
        <t>The choice of VDAF can impact the computation and storage required for a DAP
task:</t>
        <ul spacing="normal">
          <li>
            <t>The runtime of VDAF sharding and verification is related to the "size" of the
underlying measurements. For example, the Prio3SumVec VDAF defined in
<xref section="7" sectionFormat="of" target="VDAF"/> requires each measurement to be a vector of the same
length, which all parties need to agree on prior to VDAF execution. The
computation required for such tasks increases linearly as a function of the
chosen length, as each vector element must be processed in turn.</t>
          </li>
          <li>
            <t>The runtime of VDAF verification is related to the size of the aggregation
parameter. For example for Poplar1 defined in <xref section="8" sectionFormat="of" target="VDAF"/>,
verification takes as input a sequence of so-called "candidate prefixes", and
the amount of computation is linear in the number of prefixes.</t>
          </li>
          <li>
            <t>The storage requirements for aggregate shares vary depending on the size of
the measurements and/or the aggregation parameter.</t>
          </li>
        </ul>
        <t>To account for these factors, care must be taken that a DAP deployment can
handle VDAF execution of all possible configurations for any tasks which the
deployment may be configured for. Otherwise, an attacker may deny service by
uploading many expensive reports to a suitably-configured VDAF.</t>
        <t>The varying cost of VDAF computation means that Aggregators should negotiate
reasonable limits for each VDAF configuration, out of band with the protocol.
For example, Aggregators may agree on a maximum size for an aggregation job or
on a maximum rate of incoming reports.</t>
        <t>Applications which require computationally-expensive VDAFs can mitigate the
computation cost of aggregation in a few ways, such as producing aggregates over
a sample of the data or choosing a representation of the data permitting a
simpler aggregation scheme.</t>
      </section>
      <section anchor="aggregation-utility-and-soft-batch-deadlines">
        <name>Aggregation Utility and Soft Batch Deadlines</name>
        <t>A soft real-time system should produce a response within a deadline to be
useful. This constraint may be relevant when the value of an aggregate decreases
over time. A missed deadline can reduce an aggregate's utility but not
necessarily cause failure in the system.</t>
        <t>An example of a soft real-time constraint is the expectation that input data can
be verified and aggregated in a period equal to data collection, given some
computational budget. Meeting these deadlines will require efficient
implementations of the VDAF. Applications might batch requests or utilize more
efficient serialization to improve throughput.</t>
        <t>Some applications may be constrained by the time that it takes to reach a
privacy threshold defined by a minimum number of reports. One possible solution
is to increase the reporting period so more samples can be collected, balanced
against the urgency of responding to a soft deadline.</t>
      </section>
      <section anchor="protocol-specific-optimizations">
        <name>Protocol-specific Optimizations</name>
        <t>Not all DAP tasks have the same operational requirements, so the protocol is
designed to allow implementations to reduce operational costs in certain cases.</t>
        <section anchor="sharding-storage">
          <name>Reducing Storage Requirements</name>
          <t>In general, the Aggregators are required to keep state for tasks and all valid
reports for as long as collection requests can be made for them. However, it is
not necessary to store the complete reports. Each Aggregator only needs to
store an aggregate share for each possible batch bucket i.e., the batch
interval for time-interval or batch ID for leader-selected, along with a flag
indicating whether the aggregate share has been collected. This is due to the
requirement for queries to respect bucket boundaries. See <xref target="batch-modes"/>.</t>
          <t>However, Aggregators are also required to implement several per-report checks
that require retaining a number of data artifacts. For example, to detect replay
attacks, it is necessary for each Aggregator to retain the set of report IDs of
reports that have been aggregated for the task so far. Depending on the task
lifetime and report upload rate, this can result in high storage costs. To
alleviate this burden, DAP allows Aggregators to drop this state as needed, so
long as reports are dropped properly as described in <xref target="input-share-validation"/>.
Aggregators <bcp14>SHOULD</bcp14> take steps to mitigate the risk of dropping reports (e.g., by
evicting the oldest data first).</t>
          <t>Furthermore, the Aggregators <bcp14>MUST</bcp14> store data related to a task.
Where the <tt>task_interval</tt> extension is configured, Aggregators <bcp14>MAY</bcp14> delete
all data for a task after the <tt>task_interval</tt>.
Aggregators that delete data <bcp14>SHOULD</bcp14> allow the Collector adequate time
to retrieve data from any final batches.</t>
        </section>
        <section anchor="distributed-systems">
          <name>Distributed Systems and Synchronization Concerns</name>
          <t>Various parts of a DAP implementation will need to synchronize in order to
ensure correctness during concurrent operation. This section describes the
relevant concerns and makes suggestions as to potential implementation
tradeoffs.</t>
          <ul spacing="normal">
            <li>
              <t>The upload interaction requires the Leader to discard uploaded reports with a
duplicated ID, including concurrently-uploaded reports. This might be
implemented by synchronization or via an eventually-consistent process. If the
Leader wishes to alert the Client with a <tt>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="RFC9457">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <author fullname="S. Dalal" initials="S." surname="Dalal"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>This document defines a "problem detail" to carry machine-readable details of errors in HTTP response content to avoid the need to define new error response formats for HTTP APIs.</t>
              <t>This document obsoletes RFC 7807.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9457"/>
          <seriesInfo name="DOI" value="10.17487/RFC9457"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC9111">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="SHS">
          <front>
            <title>Secure hash standard</title>
            <author>
              <organization/>
            </author>
            <date year="2015"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.180-4"/>
          <refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
        </reference>
        <reference anchor="RFC9458">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="January" year="2024"/>
            <abstract>
              <t>This document describes Oblivious HTTP, a protocol for forwarding encrypted HTTP messages. Oblivious HTTP allows a client to make multiple requests to an origin server without that server being able to link those requests to the client or to identify the requests as having come from the same client, while placing only limited trust in the nodes used to forward the messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9458"/>
          <seriesInfo name="DOI" value="10.17487/RFC9458"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="RFC3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <author fullname="T. Hardie" initials="T." surname="Hardie"/>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <date month="June" year="2003"/>
            <abstract>
              <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items. The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="73"/>
          <seriesInfo name="RFC" value="3553"/>
          <seriesInfo name="DOI" value="10.17487/RFC3553"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="Dou02" target="https://doi.org/10.1007/3-540-45748-8_24">
          <front>
            <title>The Sybil Attack</title>
            <author initials="J. R." surname="Douceur" fullname="John R. Douceur">
              <organization/>
            </author>
            <date year="2002"/>
          </front>
          <refcontent>International Workshop on Peer-to-Peer Systems (IPTPS)</refcontent>
        </reference>
        <reference anchor="Vad16" target="https://privacytools.seas.harvard.edu/files/privacytools/files/complexityprivacy_1.pdf">
          <front>
            <title>The Complexity of Differential Privacy</title>
            <author initials="S." surname="Vadhan" fullname="Salil Vadhan">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
        </reference>
        <reference anchor="DPRS23" target="https://ia.cr/2023/130/20240925:184929">
          <front>
            <title>Verifiable Distributed Aggregation Functions</title>
            <author initials="H." surname="Davis" fullname="Hannah Davis">
              <organization/>
            </author>
            <author initials="C." surname="Patton" fullname="Christopher Patton">
              <organization/>
            </author>
            <author initials="M." surname="Rosulek" fullname="Mike Rosulek">
              <organization/>
            </author>
            <author initials="P." surname="Schoppmann" fullname="Phillipp Schoppmann">
              <organization/>
            </author>
            <date year="2024" month="September" day="25"/>
          </front>
          <refcontent>Privacy Enhancing Technologies Symposium (PETS)</refcontent>
        </reference>
        <reference anchor="OAuth2">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC9421">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Sporny" initials="M." surname="Sporny"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </reference>
        <reference anchor="RFC9576">
          <front>
            <title>The Privacy Pass Architecture</title>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="J. Iyengar" initials="J." surname="Iyengar"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <abstract>
              <t>This document specifies the Privacy Pass architecture and requirements for its constituent protocols used for authorization based on privacy-preserving authentication mechanisms. It describes the conceptual model of Privacy Pass and its protocols, its security and privacy goals, practical deployment models, and recommendations for each deployment model, to help ensure that the desired security and privacy goals are fulfilled.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9576"/>
          <seriesInfo name="DOI" value="10.17487/RFC9576"/>
        </reference>
        <reference anchor="I-D.draft-ietf-ppm-dap-taskprov-03">
          <front>
            <title>Task Binding and In-Band Provisioning for DAP</title>
            <author fullname="Shan Wang" initials="S." surname="Wang">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Christopher Patton" initials="C." surname="Patton">
              <organization>Cloudflare</organization>
            </author>
            <date day="5" month="September" year="2025"/>
            <abstract>
              <t>   An extension for the Distributed Aggregation Protocol (DAP) is
   specified that cryptographically binds the parameters of a task to
   the task's execution.  In particular, when a client includes this
   extension with its report, the servers will only aggregate the report
   if all parties agree on the task parameters.  This document also
   specifies an optional mechanism for in-band task provisioning that
   builds on the report extension.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-taskprov-03"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
      </references>
    </references>
    <?line 4998?>

<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+y963rbVpYo+B9PgaP8sFQhaVKSJVmpVEexnURdcey2napT
na4WQRISEZMEmwAlq2z3s8yzzJPNuu699gZIyU7OTJ8zra/KkQDs+9rrful2
u0ld1LP8NN15WlT1qhit63ySnl1drfKrrC7KRfpyVdbluJyll+UK/iius/Et
/Dev8tV1sbhKn+dZtV7l83xR7yTZaLTKr0/Tp2cvk0k5XmRz6Hqyyi7rbpHX
l93lct6dZMvu4HEyzur8qlzdnqZVPUmq9WheVBUMWN8uoc35szffJcl1vljn
p0maXq3K9RImedf4acrNd/5art7i2++xIT6fZ8UMnsMEvsGZ9MrVFT7OVuMp
PJ7W9bI6ffgQv8JHxXXe088e4oOHo1V5U+UPof1DbHdV1NP1CFrSsm6ucGUP
mwvFT2ew0Ko2g5gmPe6nV5QtjVse9ab1fLYDG3OaHiRJtq6n5Qr2pwvD0E+x
qE7TN730+7y8msIJLvQFn8SbYt58BUvMFsU/6LRh41+/+l7f5LxpdTG/gkZf
4kS+ucJnvXE5T+Jhn/TSl1ldl9GYT6YrgKxyOc1X0ftw4Cezcj25hN3Po+HH
2MGSWt41hW9hCkU9j5f97SpbTBCUg3d3rnsEzb7Bf3ozaN8Y7FkvfZVX43I1
y8Lhnq2KceNVNNpiki9z+GdRR4Pmb1ffrOrL+aYtPuulfy3LyeY9jj647yZn
N99M82wJd2ZU1FVvkddJMobbSCghBDIe85/LapqeZZUZqHUXf4XvvslGeV3n
q2IB/0DXeK2SZo/rxW0Oa8kXQZ9ny+Usnu6v+On4mwxfxTvFnT3NrotJ+qQs
3941wckYPvpmUlxfF+tl+8xerwFu0u+zRZ3dObXqCj/b3za3s3kOB/X9FA7m
rskVi2x6lW2f3Z/x8ItFnn6/Lu+c3lv5+OJqXW6b45NptpoVefpDtoIWZXgk
35flVaPncTWVb7+BK1vOi/V8wzn3AI7/uVzkd8IOXXeA/PXlZTEu4LLAXC8v
87xlS2f5u/TPAGr5LL8Oun2e+0PTPZDvvpnDu/blv8wBUtPXGUBs92wxadyX
ql7iF+24SIAGqAhAzetsWoyCGQE6um70Rx+/zdazCr/f1u/LaTGbFctl+no8
LYEuZIt7HE7lvv3mit639/08WwFwpG+m5Tw+8+flP2DceCvn9TdzfrFhE2rY
gp9no9XteBqe9kYMWEGTNbfYvr3Q81+zxdXdNxK+vLiBLy28L8rVHJDiNbAX
8PnLF6/P/ycgjRfnvUG/Nxj0Hz88f/bs2es3T3v7/cFJ72T/+HjwCEhusbgM
Gj4t1/39UxpQGak30zx9fTsqZulZXWfjtzv01tFq+uk6JDpdpK962M04X6/o
7Sq/RMQLGwOdnRPGJOydzVLkaio4yBSJGeCQbl128b8wXlXn8yrdPX/55uXr
PR5yAozHabrf7+/z/LLVVQ59KhsyKQtib3DB/f7xw4Puo8N+9/DR8eFJ9+Ri
/xCX95dsMjhqLu9JOYeNfFfUt2l5mT4t4E6uYL4FTFE4tG2Lfp3NYHOg66kQ
Y53o4CiYqGOYltxnXZazqlcBv9cDTHOdrSa9fLJ+eFnM8ir4Rh6N3Szl5cWg
t5xc7tC5vXz1ev8gXNlfgEBdFtlolqebmOHv1osx/lJtW98PcMuyKVGgKnq1
kRnSD54Xb/P0VVmtZ/nb6NWme6+7t3/Y7T/u7j9qApFyzc8WsONjZIvf5OPp
opyVV0VeAfDMl2UF6DrdffnsjUJPDC4F3PDVQxjm4OHgoI+/HPYf7z86HZwc
Pt5/nCTdbjfNRrBt2RhYB4CSVQ7cdQ6M9+I2rYp6TTtYAUVLb6bFeJoWdVpU
6SSvihXteV3CmLD6uWfoKwQvWF+WcJNlXsKJprCyqpjAFlY5/IJ3sQf4JK2n
IBQAJ1PlVQf/SBEkAUShV1wzPElM3zj4ulpns9ltuijhT7xpwKjDicMUeaQH
OF2gvcUEvoM9rZYwMuwYAEayymo8Rfg2EwCBljjXHlyPxTWOTXcWaMy0nFTQ
+j/WxQonP5vlAEQwI9934vsGVhOn6ruVuc/x0lflPE9R8slXuMQ1drtEWWhB
n2XwbJVndQJ7uYbPUgF86nSF2HaFn/GRrGFDg72eFEhm17OaPi/mSzzKYpzN
enCceFTleE07B2c2htuBk03n8H3RXQLduN14a5wIuQty4R4KkolObOkFOXs2
fNxjwPCjHFcyQeiQnfP7LaABIlS5rmF91zlgFtwGWJ45N8PGwoHSETG4zovJ
BKhF8gVAT70qJ2u628nG1SJM3X+NuvlJ+xp7KWLSpTaDEfN3+Zj6HcGBgdgI
9w/OusY7MJ4VdEQoh9Q3pYcNhAkCh4r70xflqnqQXpUZdUx7N19C3wxAbgMT
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

-->

</rfc>
