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

<t>There are many situations in which it is desirable to take measurements of data
which people consider sensitive. In these cases, the entity taking the
measurement is usually not interested in people's individual responses but
rather in aggregated data. Conventional methods require collecting individual
responses and then aggregating them on some server, thus representing a threat
to user privacy and rendering many such measurements difficult and impractical.
This document describes a multi-party Distributed Aggregation Protocol (DAP) for
privacy preserving measurement which can be used to collect aggregate data
without revealing any individual contributor's data.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-ppm.github.io/draft-ietf-ppm-dap/draft-ietf-ppm-dap.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-ppm-dap/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Privacy Preserving Measurement Working Group mailing list (<eref target="mailto:ppm@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ppm/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ppm/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-ppm/draft-ietf-ppm-dap"/>.</t>
    </note>
  </front>
  <middle>
    <?line 152?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the Distributed Aggregation Protocol (DAP) for privacy
preserving measurement. The protocol is executed by a large set of clients and
two aggregation servers. The aggregators' goal is to compute some aggregate
statistic over measurements generated by clients without learning the
measurements themselves. This is made possible by distributing the computation
among the aggregators in such a way that, as long as at least one of them
executes the protocol honestly, no measurement is ever seen in the clear by any
aggregator.</t>
      <section anchor="change-log">
        <name>Change Log</name>
        <t>(RFC EDITOR: Remove this section.)</t>
        <t>(*) Indicates a change that breaks wire compatibility with the previous draft.</t>
        <t>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"/>). 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="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 upload request's extensions list includes an unknown extension.</td>
            </tr>
          </tbody>
        </table>
        <t>These types are scoped to the errors sub-namespace of the DAP URN namespace,
e.g., urn:ietf:params:ppm:dap:error:invalidMessage.</t>
        <t>This list is not exhaustive. The server <bcp14>MAY</bcp14> return errors set to a URI other
than those defined above. Servers <bcp14>MUST NOT</bcp14> use the DAP URN namespace for errors
not listed in the appropriate IANA registry (see <xref target="urn-space"/>). The "detail"
member of the Problem Details document includes additional diagnostic
information.</t>
        <t>When the task ID is known (see <xref target="task-configuration"/>), the problem document
<bcp14>SHOULD</bcp14> include an additional "taskid" member containing the ID encoded in Base
64 using the URL and filename safe alphabet with no padding defined in
Sections <xref target="RFC4648" section="5" sectionFormat="bare"/> and <xref target="RFC4648" section="3.2" sectionFormat="bare"/> of <xref target="RFC4648"/>.</t>
        <t>In the remainder of this document, the tokens in the table above are used to
refer to error types, rather than the full URNs. For example, an "error of type
'invalidMessage'" refers to an error document with "type" value
"urn:ietf:params:ppm:dap:error:invalidMessage".</t>
        <t>This document uses the verbs "abort" and "alert with [some error message]" to
describe how protocol participants react to various error conditions. This
implies that the response's status code will indicate a client error unless
specified otherwise.</t>
      </section>
    </section>
    <section anchor="protocol">
      <name>Protocol Definition</name>
      <t>DAP has three major interactions which need to be defined:</t>
      <ul spacing="normal">
        <li>
          <t>Clients upload reports to the Aggregators, specified in <xref target="upload-flow"/></t>
        </li>
        <li>
          <t>Aggregators jointly verify reports and aggregate them together, specified in
<xref target="aggregate-flow"/></t>
        </li>
        <li>
          <t>The Collector collects aggregated results from the Aggregators, specified in
<xref target="collect-flow"/></t>
        </li>
      </ul>
      <t>Each of these interactions is defined in terms of HTTP resources. In this
section we define these resources and the messages used to act on them.</t>
      <section anchor="basic-definitions">
        <name>Basic Type Definitions</name>
        <t>A <tt>ReportID</tt> is used to uniquely identify a report in the context of a DAP task.</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque ReportID[16];
]]></sourcecode>
        <t><tt>Role</tt> enumerates the roles assumed by protocol participants.</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  collector(0),
  client(1),
  leader(2),
  helper(3),
  (255)
} Role;
]]></sourcecode>
        <t><tt>HpkeCiphertext</tt> is a message encrypted using <xref target="HPKE"/> and metadata
needed to decrypt it. <tt>HpkeConfigId</tt> identifies a server's HPKE configuration
(see <xref target="hpke-config"/>).</t>
        <sourcecode type="tls-presentation"><![CDATA[
uint8 HpkeConfigId;

struct {
  HpkeConfigId config_id;
  opaque enc<1..2^16-1>;
  opaque payload<1..2^32-1>;
} HpkeCiphertext;
]]></sourcecode>
        <t><tt>config_id</tt> identifies the HPKE configuration to which the message was
encrypted. <tt>enc</tt> and <tt>payload</tt> correspond to the values returned by the
<xref target="HPKE"/> <tt>SealBase()</tt> function. Later sections describe how to use <tt>SealBase()</tt>
in different situations.</t>
        <t><tt>Empty</tt> is a zero-length byte string.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {} Empty;
]]></sourcecode>
        <t>Errors that occurred while handling individual reports in the upload or
aggregation interactions are represented by the following enum:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0),
  batch_collected(1),
  report_replayed(2),
  report_dropped(3),
  hpke_unknown_config_id(4),
  hpke_decrypt_error(5),
  vdaf_verify_error(6),
  task_expired(7),
  invalid_message(8),
  report_too_early(9),
  task_not_started(10),
  outdated_config(11),
  (255)
} ReportError;
]]></sourcecode>
        <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>
        </section>
      </section>
      <section anchor="task-configuration">
        <name>Task Configuration</name>
        <t>A task represents a single measurement process, though potentially aggregating
multiple, non-overlapping batches of measurements. Each participant in a task
must agree on its configuration prior to its execution. This document does not
specify a mechanism for distributing task parameters among participants.</t>
        <t>A task is uniquely identified by its task ID:</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque TaskID[32];
]]></sourcecode>
        <t>The task ID <bcp14>MUST</bcp14> be a globally unique sequence of bytes. Each task has the
following parameters associated with it:</t>
        <ul spacing="normal">
          <li>
            <t>The VDAF which determines the type of measurements and the aggregation
function. The VDAF itself may have further parameters (e.g., number of buckets
in a <tt>Prio3Histogram</tt>).</t>
          </li>
          <li>
            <t>A URL relative to which the Leader's API resources can be found.</t>
          </li>
          <li>
            <t>A URL relative to which the Helper's API resources can be found.</t>
          </li>
          <li>
            <t>The batch mode for this task (see <xref target="batch-modes-overview"/>), which determines
how reports are grouped into batches.</t>
          </li>
          <li>
            <t><tt>task_interval</tt> (<tt>Interval</tt>): Reports whose timestamp is outside of this
interval will be rejected by the Aggregators.</t>
          </li>
          <li>
            <t><tt>time_precision</tt> (<tt>TimePrecision</tt>): The time precision used in this task. See
<xref target="timestamps"/>.</t>
          </li>
        </ul>
        <t>The Leader and Helper API URLs <bcp14>MAY</bcp14> include arbitrary path components.</t>
        <t>In order to facilitate the aggregation and collection interactions, each of the
Aggregators is configured with the following parameters:</t>
        <ul spacing="normal">
          <li>
            <t><tt>min_batch_size</tt> (<tt>uint64</tt>): The smallest number of reports the batch is
allowed to include. A larger minimum batch size will yield a higher degree of
privacy. However, this ultimately depends on the application and the nature of
the measurements and aggregation function.</t>
          </li>
          <li>
            <t><tt>collector_hpke_config</tt> (<tt>HpkeConfig</tt>): The <xref target="HPKE"/> configuration of
the Collector (described in <xref target="hpke-config"/>); see <xref target="compliance"/> for
information about the HPKE configuration algorithms.</t>
          </li>
          <li>
            <t><tt>vdaf_verify_key</tt> (opaque byte string): The VDAF verification key shared by
the Aggregators. This key is used in the aggregation interaction
(<xref target="aggregate-flow"/>). The security requirements are described in
<xref target="verification-key"/>.</t>
          </li>
        </ul>
        <t>Finally, the Collector is configured with the HPKE secret key corresponding to
<tt>collector_hpke_config</tt>.</t>
        <t>A task's parameters are immutable for the lifetime of that task. The only way to
change parameters or to rotate secret values like collector HPKE configuration
or the VDAF verification key is to configure a new task.</t>
        <section anchor="batch-modes-overview">
          <name>Batch Modes, Batches, and Queries</name>
          <t>An aggregate result is computed from a set of reports, called a "batch". The
Collector requests the aggregate result by making a "query" and the Aggregators
use this query to select a batch for aggregation.</t>
          <t>The task's batch mode defines both how reports are assigned into batches, how
these batches are addressed and the semantics of the query used for collection.
Regardless of batch mode, each report can only ever be part of a single batch.</t>
          <t><xref target="batch-modes"/> defines the <tt>time-interval</tt> and <tt>leader-selected</tt> batch modes
and discusses how new batch modes may be defined by future documents.</t>
          <t>The query is issued to the Leader by the Collector during the collection
interaction (<xref target="collect-flow"/>). Information used to guide batch selection is
conveyed from the Leader to the Helper when initializing aggregation jobs
(<xref target="aggregate-flow"/>) and finalizing the aggregate shares.</t>
        </section>
      </section>
      <section anchor="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-17" || 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-17" with "dap".)</t>
            <sourcecode type="pseudocode"><![CDATA[
enc, payload = SealBase(pk,
  "dap-17 input share" || 0x01 || server_role,
  input_share_aad, plaintext_input_share)
]]></sourcecode>
            <ul spacing="normal">
              <li>
                <t><tt>pk</tt> is the public key from the Aggregator's HPKE configuration.</t>
              </li>
              <li>
                <t><tt>0x01</tt> represents the <tt>Role</tt> of the sender (always the Client).</t>
              </li>
              <li>
                <t><tt>server_role</tt> is the <tt>Role</tt> of the recipient (<tt>0x02</tt> for the Leader and <tt>0x03</tt>
 for the Helper).</t>
              </li>
              <li>
                <t><tt>plaintext_input_share</tt> is the Aggregator's <tt>PlaintextInputShare</tt>.</t>
              </li>
              <li>
                <t><tt>input_share_aad</tt> is an encoded <tt>InputShareAad</tt>, constructed from the
corresponding fields in the report per the definition below.</t>
              </li>
            </ul>
            <t>The <tt>SealBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the Aggregator's HPKE configuration.</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  TaskID task_id;
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
} InputShareAad;
]]></sourcecode>
            <t>Clients upload reports by sending an <tt>UploadRequest</tt> as the body of a POST to
the Leader's reports resource.</t>
          </section>
          <section anchor="leader-behavior">
            <name>Leader Behavior</name>
            <t>The handling of the upload request by the Leader <bcp14>MUST</bcp14> be idempotent as discussed
in <xref section="9.2.2" sectionFormat="of" target="RFC9110"/>.</t>
            <t>If the upload request is malformed, the Leader aborts with error
<tt>invalidMessage</tt>.</t>
            <t>If the Leader does not recognize the task ID, then it aborts with error
<tt>unrecognizedTask</tt>.</t>
            <t>If all the reports in the request are accepted, then the Leader sends a response
with an empty body.</t>
            <t>If some or all of the reports fail to upload for one of the reasons described in
the remainder of this section, the Leader responds with a body consisting of an
<tt>UploadErrors</tt> with the media type <tt>application/ppm-dap;message=upload-errors</tt>.
The structure of the response is as follows:</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  ReportID id;
  ReportError error;
} ReportUploadStatus;

struct {
  ReportUploadStatus status[message_length];
} UploadErrors;
]]></sourcecode>
            <t>Here <tt>message_length</tt> denotes the length in bytes of the concatenated
<tt>ReportUploadStatus</tt> objects.</t>
            <t>The Leader only includes reports that failed processing in the response. Reports
that are accepted do not have a response.</t>
            <t>Reports in the response <bcp14>MUST</bcp14> appear in the same order as in the request.</t>
            <t>For each report that failed to upload, the Leader creates a <tt>ReportUploadStatus</tt>
and includes the <tt>ReportId</tt> from the input and a <tt>ReportError</tt>
(<xref target="basic-definitions"/>) that describes the failure. The length of this sequence
is always less than or equal to the length of the upload sequence.</t>
            <t>If the Leader does not recognize the <tt>config_id</tt> in the encrypted input share,
it sets the corresponding error field to <tt>outdated_config</tt>. When the Client
receives an <tt>outdated_config</tt> error, it <bcp14>SHOULD</bcp14> invalidate any cached
<tt>HpkeConfigList</tt> and retry with a freshly generated <tt>Report</tt>. If this retried
upload does not succeed, the Client <bcp14>SHOULD</bcp14> abort and discontinue retrying.</t>
            <t>If a report's ID matches that of a previously uploaded report, the Leader <bcp14>MUST</bcp14>
discard it. In addition, it <bcp14>MAY</bcp14> set the corresponding error field to
<tt>report_replayed</tt>.</t>
            <t>The Leader <bcp14>MUST</bcp14> discard any report pertaining to a batch that has already been
collected (see <xref target="replay-protection"/> for details). The Leader <bcp14>MAY</bcp14> also set the
corresponding error field to <tt>report_replayed</tt>.</t>
            <t>The Leader <bcp14>MUST</bcp14> discard any report whose timestamp is outside of the task's
<tt>time_interval</tt>. When it does so, it <bcp14>SHOULD</bcp14> set the corresponding error field to
<tt>report_dropped</tt>.</t>
            <t>The Leader may need to buffer reports while waiting to aggregate them (e.g.,
while waiting for an aggregation parameter from the Collector; see
<xref target="collect-flow"/>). The Leader <bcp14>SHOULD NOT</bcp14> accept reports whose timestamps are too
far in the future. Implementors <bcp14>MAY</bcp14> provide for some small leeway, usually no
more than a few minutes, to account for clock skew. If the Leader rejects a
report for this reason, it <bcp14>SHOULD</bcp14> set the corresponding error field to
<tt>report_too_early</tt>. In this situation, the Client <bcp14>MAY</bcp14> re-upload the report later
on.</t>
            <t>If the report contains an unrecognized public report extension, or if the
Leader's input share contains an unrecognized private report extension, then the
Leader <bcp14>MUST</bcp14> discard the report and <bcp14>MAY</bcp14> abort with error <tt>unsupportedExtension</tt>.
If the Leader does abort for this reason, it <bcp14>SHOULD</bcp14> indicate the unsupported
extensions in the resulting problem document via an extension member (<xref section="3.2" sectionFormat="of" target="RFC9457"/>) <tt>unsupported_extensions</tt> on the problem document. This member
<bcp14>MUST</bcp14> contain an array of numbers indicating the extension code points which were
not recognized. For example, if the report upload contained two unsupported
extensions with code points <tt>23</tt> and <tt>42</tt>, the "unsupported_extensions" member
would contain the JSON value <tt>[23, 42]</tt>.</t>
            <t>If the same extension type appears more than once among the public extensions
and the private extensions in the Leader's input share, then the Leader <bcp14>MUST</bcp14>
discard the report and <bcp14>MAY</bcp14> abort with error <tt>invalidMessage</tt>.</t>
            <t>Validation of anti-replay and extensions is not mandatory during the handling of
upload requests to avoid blocking on storage transactions or decryption of input
shares. The Leader also cannot validate the Helper's extensions because it
cannot decrypt the Helper's input share. Validation of report IDs and extensions
will occur before aggregation.</t>
          </section>
          <section anchor="example-1">
            <name>Example</name>
            <t>Successful upload</t>
            <sourcecode type="http"><![CDATA[
POST /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/reports
Host: example.com
Content-Type: application/ppm-dap;message=upload-req
Content-Length: 100

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

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

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

HTTP/1.1 200
Content-Type: application/ppm-dap;message=upload-errors
Content-Length: 20

encoded(struct {
  reports = [
    struct {
      id = [0x0z, 0x0y, 0x0x, 0x0w, ...],
      error = report_replayed,
    },
  ],
} UploadErrors)
]]></sourcecode>
          </section>
        </section>
        <section anchor="report-extensions">
          <name>Report Extensions</name>
          <t>Clients use report extensions to convey additional information to the
Aggregators. Each <tt>ReportMetadata</tt> contains a list of extensions public to both
aggregators, and each <tt>PlaintextInputShare</tt> contains a list of extensions
private to the relevant Aggregator. For example, Clients may need to
authenticate to the Helper by presenting a secret that must not be revealed to
the Leader.</t>
          <t>Each extension is a tag-length encoded value of the form:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  ExtensionType extension_type;
  opaque extension_data<0..2^16-1>;
} Extension;

enum {
  reserved(0),
  (65535)
} ExtensionType;
]]></sourcecode>
          <t>Field <tt>extension_type</tt> indicates the type of extension, and <tt>extension_data</tt>
contains the opaque encoding of the extension.</t>
          <t>Extensions are mandatory to implement. Unrecognized extensions are handled as
specified in <xref target="input-share-validation"/>.</t>
        </section>
      </section>
      <section anchor="aggregate-flow">
        <name>Verifying and Aggregating Reports</name>
        <t>Once some Clients have uploaded their reports to the Leader, the Leader can
begin the process of validating and aggregating them with the Helper. To enable
the system to handle large batches of reports, this process is parallelized
across many "aggregation jobs" in which subsets of the reports are processed
independently. Each aggregation job is associated with a single task, but a task
can have many aggregation jobs.</t>
        <t>An aggregation job runs the VDAF 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 16-byte job ID, chosen by the Leader:</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque AggregationJobID[16];
]]></sourcecode>
        <t>An aggregation job is an HTTP resource served by the Helper at the
URL <tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt>. VDAF
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="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 and a job ID which <bcp14>MUST</bcp14> be unique within the task.</t>
            <t>First, the Leader <bcp14>MUST</bcp14> ensure each report in the candidate set can be committed
per the criteria detailed in <xref target="batch-buckets"/>. If a report cannot be committed,
then the Leader rejects it and removes it from the candidate set.</t>
            <t>Next, the Leader decrypts each of its report shares as described in
<xref target="input-share-decryption"/>, then checks input share validity as described in
<xref target="input-share-validation"/>. If either step fails, the Leader rejects the report
and removes it from the candidate set.</t>
            <t>For each report the Leader executes the following procedure:</t>
            <sourcecode type="pseudocode"><![CDATA[
state = Vdaf.ping_pong_leader_init(
    vdaf_verify_key,
    "dap-17" || task_id,
    agg_param,
    report_id,
    public_share,
    plaintext_input_share.payload,
)
]]></sourcecode>
            <t>where:</t>
            <ul spacing="normal">
              <li>
                <t><tt>vdaf_verify_key</tt> is the VDAF verification key for the task</t>
              </li>
              <li>
                <t><tt>task_id</tt> is the task ID</t>
              </li>
              <li>
                <t><tt>agg_param</tt> is the VDAF aggregation parameter provided by the Collector (see
<xref target="collect-flow"/>)</t>
              </li>
              <li>
                <t><tt>report_id</tt> is the report ID, used as the nonce for VDAF sharding</t>
              </li>
              <li>
                <t><tt>public_share</tt> is the report's public share</t>
              </li>
              <li>
                <t><tt>plaintext_input_share</tt> is the Leader's <tt>PlaintextInputShare</tt></t>
              </li>
            </ul>
            <t><tt>ping_pong_leader_init</tt> is defined in <xref section="5.7.1" sectionFormat="of" target="VDAF"/>. This process
determines the initial per-report <tt>state</tt>. If <tt>state</tt> is of type <tt>Rejected</tt>
(<xref section="5.7" sectionFormat="of" target="VDAF"/>, then the report is rejected and removed from the
candidate set, and no message is sent to the Helper for this report.</t>
            <t>Otherwise, if <tt>state</tt> is of type <tt>Continued</tt> (no other state is reachable at
this point), then the state includes an outbound message denoted
<tt>state.outbound</tt>. The Leader uses it to construct a <tt>VerifyInit</tt> structure for
that report.</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
  HpkeCiphertext encrypted_input_share;
} ReportShare;

struct {
  ReportShare report_share;
  opaque payload<1..2^32-1>;
} VerifyInit;
]]></sourcecode>
            <t>This message consists of:</t>
            <ul spacing="normal">
              <li>
                <t><tt>report_share.report_metadata</tt>: The report's metadata.</t>
              </li>
              <li>
                <t><tt>report_share.public_share</tt>: The report's public share.</t>
              </li>
              <li>
                <t><tt>report_share.encrypted_input_share</tt>: The Helper's encrypted input share.</t>
              </li>
              <li>
                <t><tt>payload</tt>: The outbound message, set to <tt>state.outbound</tt>.</t>
              </li>
            </ul>
            <t>Once all the report shares have been initialized, the Leader creates an
<tt>AggregationJobInitReq</tt> message containing the <tt>VerifyInit</tt> structures
for the relevant reports.</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  BatchMode batch_mode;
  opaque config<0..2^16-1>;
} PartialBatchSelector;

struct {
  opaque agg_param<0..2^32-1>;
  PartialBatchSelector part_batch_selector;
  VerifyInit verify_inits[verify_inits_length];
} AggregationJobInitReq;
]]></sourcecode>
            <t>This message consists of:</t>
            <ul spacing="normal">
              <li>
                <t><tt>agg_param</tt>: The VDAF aggregation parameter chosen by the Collector. Before
initializing an aggregation job, the Leader <bcp14>MUST</bcp14> validate the parameter as
described in <xref target="agg-param-validation"/>.</t>
              </li>
              <li>
                <t><tt>part_batch_selector</tt>: The "partial batch selector" used by the Aggregators to
determine how to aggregate each report. Its contents depends on the indicated
batch mode. This field is called the "partial" batch selector because
depending on the batch mode, it may only partially determine a batch. See
<xref target="batch-modes"/>.</t>
              </li>
              <li>
                <t><tt>verify_inits</tt>: the sequence of <tt>VerifyInit</tt> messages constructed in the
previous step. Here <tt>verify_inits_length</tt> is the length of the HTTP message
content (<xref section="6.4" sectionFormat="comma" target="RFC9110"/>), minus the lengths in octets of the
encoded <tt>agg_param</tt> and <tt>part_batch_selector</tt> fields. That is, the remainder
of the HTTP message consists of <tt>verify_inits</tt>.</t>
              </li>
            </ul>
            <t>The Leader sends the <tt>AggregationJobInitReq</tt> in the body of a PUT request to the
aggregation job with a media type of
"application/ppm-dap;message=aggregation-job-init-req". The Leader handles the
response(s) as described in <xref target="http-usage"/> to obtain an <tt>AggregationJobResp</tt>.</t>
            <t>The <tt>AggregationJobResp.verify_resps</tt> field must include exactly the same
report IDs in the same order as the Leader's <tt>AggregationJobInitReq</tt>. Otherwise,
the Leader <bcp14>MUST</bcp14> abandon the aggregation job.</t>
            <t>The Leader proceeds as follows with each report:</t>
            <ol spacing="normal" type="1"><li>
                <t>If the inbound verification response has type "continue", then the Leader
computes  </t>
                <sourcecode type="pseudocode"><![CDATA[
state = Vdaf.ping_pong_leader_continued(
    "dap-17" || task_id,
    agg_param,
    state,
    inbound,
)
]]></sourcecode>
                <t>
where:  </t>
                <ul spacing="normal">
                  <li>
                    <t><tt>task_id</tt> is the task ID</t>
                  </li>
                  <li>
                    <t><tt>agg_param</tt> is the VDAF aggregation parameter provided by the Collector
(see <xref target="collect-flow"/>)</t>
                  </li>
                  <li>
                    <t><tt>state</tt> is the report's initial verification state</t>
                  </li>
                  <li>
                    <t><tt>inbound</tt> is the payload of the <tt>VerifyResp</tt></t>
                  </li>
                </ul>
                <t>
If the new <tt>state</tt> has type <tt>Continued</tt> or <tt>FinishedWithOutbound</tt>,
then there is at least one more outbound message to send before verification
is complete. The Leader stores <tt>state</tt> and proceeds as in
<xref target="aggregation-leader-continuation"/>.  </t>
                <t>
Else if the new <tt>state</tt> has type <tt>Finished</tt>, then verification is complete
and the state includes an output share, denoted <tt>state.out_share</tt>. The Leader
commits to <tt>state.out_share</tt> as described in <xref target="batch-buckets"/>.  </t>
                <t>
Else if <tt>state</tt> has type <tt>Rejected</tt>, then the Leader rejects the
report and removes it from the candidate set.  </t>
                <t>
Note on rejection agreement: rejecting at this point would result in a batch
mismatch if the Helper had already committed to its output share. This is
impossible due to the verifiability property of the VDAF: if the underlying
measurement were invalid, then the Helper would have indicated rejection in
its response.</t>
              </li>
              <li>
                <t>Else if the <tt>VerifyResp</tt> has type "reject", then the Leader rejects the
report and removes it from the candidate set. The Leader <bcp14>MUST NOT</bcp14> include
the report in a subsequent aggregation job, unless the report error is
<tt>report_too_early</tt>, in which case the Leader <bcp14>MAY</bcp14> include the report in a
subsequent aggregation job.</t>
              </li>
              <li>
                <t>Otherwise the inbound message type is invalid for the Leader's current
state, in which case the Leader <bcp14>MUST</bcp14> abandon the aggregation job.</t>
              </li>
            </ol>
            <t>Since VDAF verification completes in a constant number of rounds, it will never
be the case that verification is complete for some of the reports in an
aggregation job but not others.</t>
          </section>
          <section anchor="aggregation-helper-init">
            <name>Helper Initialization</name>
            <figure anchor="helper-init-state">
              <name>Helper state transition triggered by aggregation initialization. (*) indicates a terminal state.</name>
              <artset>
                <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="112" width="392" viewBox="0 0 392 112" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                    <path d="M 112,32 L 112,96" fill="none" stroke="black"/>
                    <path d="M 96,32 L 136,32" fill="none" stroke="black"/>
                    <path d="M 112,64 L 136,64" fill="none" stroke="black"/>
                    <path d="M 112,96 L 136,96" fill="none" stroke="black"/>
                    <polygon class="arrowhead" points="144,96 132,90.4 132,101.6" fill="black" transform="rotate(0,136,96)"/>
                    <polygon class="arrowhead" points="144,64 132,58.4 132,69.6" fill="black" transform="rotate(0,136,64)"/>
                    <polygon class="arrowhead" points="144,32 132,26.4 132,37.6" fill="black" transform="rotate(0,136,32)"/>
                    <g class="text">
                      <text x="44" y="36">VerifyInit</text>
                      <text x="184" y="36">Continued</text>
                      <text x="228" y="68">FinishedWithOutbound</text>
                      <text x="352" y="68">(*commit)</text>
                      <text x="180" y="100">Rejected</text>
                      <text x="256" y="100">(*reject)</text>
                    </g>
                  </svg>
                </artwork>
                <artwork type="ascii-art"><![CDATA[
VerifyInit --+--> Continued
             |
             +--> FinishedWithOutbound (*commit)
             |
             +--> Rejected (*reject)
]]></artwork>
              </artset>
            </figure>
            <t>The Helper begins an aggregation job when it receives an <tt>AggregationJobInitReq</tt>
message from the Leader. For each <tt>VerifyInit</tt> in this message, the Helper
attempts to initialize VDAF verification (see <xref section="5.1" sectionFormat="of" target="VDAF"/>) just as
the Leader does. If successful, it includes the result in its response for the
Leader to use to continue verifying the report.</t>
            <t>The initialization request can be handled either asynchronously or synchronously
as described in <xref target="http-usage"/>. When indicating that the job is not yet
ready, the response <bcp14>MUST</bcp14> include a Location header field (<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>) set to the relative reference
<tt>/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}?step=0</tt>. Subsequent GET
requests to the aggregation job <bcp14>MUST</bcp14> include the <tt>step</tt> query parameter so that
the Helper can figure out which step of preparation the Leader is on (see
<xref target="aggregation-step-skew-recovery"/>). When the job is ready, the Helper responds
with the <tt>AggregationJobResp</tt> (defined below).</t>
            <t>Upon receipt of an <tt>AggregationJobInitReq</tt>, the Helper checks the following
conditions:</t>
            <ul spacing="normal">
              <li>
                <t>Whether it recognizes the task ID. If not, then the Helper <bcp14>MUST</bcp14> fail the job
with error <tt>unrecognizedTask</tt>.</t>
              </li>
              <li>
                <t>Whether the <tt>AggregationJobInitReq</tt> is malformed. If so, the the Helper <bcp14>MUST</bcp14>
fail the job with error <tt>invalidMessage</tt>.</t>
              </li>
              <li>
                <t>Whether the batch mode indicated by <tt>part_batch_selector.batch_mode</tt> matches
the task's batch mode. If not, then the Helper <bcp14>MUST</bcp14> fail the job with error
<tt>invalidMessage</tt>.</t>
              </li>
              <li>
                <t>Whether the aggregation parameter is valid as described in
<xref target="agg-param-validation"/>. If the aggregation parameter is invalid, then the
Helper <bcp14>MUST</bcp14> fail the job with error <tt>invalidAggregationParameter</tt>.</t>
              </li>
              <li>
                <t>Whether the report IDs in <tt>AggregationJobInitReq.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-17" || task_id,
    agg_param,
    report_id,
    public_share,
    plaintext_input_share.payload,
    inbound,
)
]]></sourcecode>
            <ul spacing="normal">
              <li>
                <t><tt>vdaf_verify_key</tt> is the VDAF verification key for the task</t>
              </li>
              <li>
                <t><tt>task_id</tt> is the task ID</t>
              </li>
              <li>
                <t><tt>agg_param</tt> is the VDAF aggregation parameter sent in the
<tt>AggregationJobInitReq</tt></t>
              </li>
              <li>
                <t><tt>report_id</tt> is the report ID</t>
              </li>
              <li>
                <t><tt>public_share</tt> is the report's public share</t>
              </li>
              <li>
                <t><tt>plaintext_input_share</tt> is the Helper's <tt>PlaintextInputShare</tt></t>
              </li>
              <li>
                <t><tt>inbound</tt> is the payload of the inbound <tt>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>The Helper may receive multiple copies of a given initialization request. The
Helper <bcp14>MUST</bcp14> verify that subsequent requests have the same
<tt>AggregationJobInitReq</tt> value and abort with a client error if they do not. It
is illegal to rewind or reset the state of an aggregation job. If the Helper
receives requests to initialize an aggregation job once it has been continued at
least once, confirming that the Leader received the Helper's response (see
<xref target="agg-continue-flow"/>), it <bcp14>MUST</bcp14> abort with a client error.</t>
          </section>
          <section anchor="input-share-decryption">
            <name>Input Share Decryption</name>
            <t>Each report share has a corresponding task ID, report metadata (report ID,
timestamp, and public extensions), public share, and the Aggregator's encrypted
input share. Let <tt>task_id</tt>, <tt>report_metadata</tt>, <tt>public_share</tt>, and
<tt>encrypted_input_share</tt> denote these values, respectively. Given these values,
an Aggregator decrypts the input share as follows. First, it constructs an
<tt>InputShareAad</tt> message from <tt>task_id</tt>, <tt>report_metadata</tt>, and <tt>public_share</tt>.
Let this be denoted by <tt>input_share_aad</tt>. Then, the Aggregator attempts
decryption of the payload with the following procedure:</t>
            <sourcecode type="pseudocode"><![CDATA[
plaintext_input_share = OpenBase(encrypted_input_share.enc, sk,
  "dap-17 input share" || 0x01 || server_role,
  input_share_aad, encrypted_input_share.payload)
]]></sourcecode>
            <ul spacing="normal">
              <li>
                <t><tt>sk</tt> is the secret key from the HPKE configuration indicated by
<tt>encrypted_input_share.config_id</tt></t>
              </li>
              <li>
                <t><tt>0x01</tt> represents the Role of the sender (always the Client)</t>
              </li>
              <li>
                <t><tt>server_role</tt> is the Role of the recipient Aggregator (<tt>0x02</tt> for the Leader
and <tt>0x03</tt> for the Helper).</t>
              </li>
            </ul>
            <t>The <tt>OpenBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the HPKE configuration.</t>
            <t>If the HPKE configuration ID is unrecognized or decryption fails, the Aggregator
marks the report share as invalid with the error <tt>hpke_decrypt_error</tt>.
Otherwise, the Aggregator outputs the resulting PlaintextInputShare
<tt>plaintext_input_share</tt>.</t>
          </section>
          <section anchor="input-share-validation">
            <name>Input Share Validation</name>
            <t>Before initialization, Aggregators <bcp14>MUST</bcp14> perform the following checks for each
input share in the job, in any order:</t>
            <ol spacing="normal" type="1"><li>
                <t>Check that the input share can be decoded as specified by the VDAF. If not,
the input share <bcp14>MUST</bcp14> be marked as invalid with the error <tt>invalid_message</tt>.</t>
              </li>
              <li>
                <t>Check if the report's timestamp is more than a few minutes ahead of the
current time. If so, then the Aggregator <bcp14>SHOULD</bcp14> mark the input share as
invalid with error <tt>report_too_early</tt>.</t>
              </li>
              <li>
                <t>Check if the report's timestamp is before the task's <tt>task_interval</tt>. If so,
the Aggregator <bcp14>MUST</bcp14> mark the input share as invalid with the error
<tt>task_not_started</tt>.</t>
              </li>
              <li>
                <t>Check if the report's timestamp is after the task's <tt>task_interval</tt>. If so,
the Aggregator <bcp14>MUST</bcp14> mark the input share as invalid with the error
<tt>task_expired</tt>.</t>
              </li>
              <li>
                <t>Check if the public or private report extensions contain any unrecognized
report extension types. If so, the Aggregator <bcp14>MUST</bcp14> mark the input share as
invalid with error <tt>invalid_message</tt>.</t>
              </li>
              <li>
                <t>Check if any two extensions have the same extension type across public and
private extension fields. If so, the Aggregator <bcp14>MUST</bcp14> mark the input share as
invalid with error <tt>invalid_message</tt>.</t>
              </li>
              <li>
                <t>If an Aggregator cannot determine if an input share is valid--for example,
the report timestamp may be so far in the past that the state required to
perform the check has been evicted from the Aggregator's storage (see
<xref target="sharding-storage"/> for details)--it <bcp14>MUST</bcp14> mark the input share as invalid
with error <tt>report_dropped</tt>.</t>
              </li>
            </ol>
            <t>If all of the above checks succeed, the input share is valid.</t>
          </section>
          <section anchor="example-2">
            <name>Example</name>
            <t>The Helper handles the aggregation job initialization synchronously:</t>
            <sourcecode type="http"><![CDATA[
PUT /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/ppm-dap;message=aggregation-job-init-req
Content-Length: 100
Authorization: Bearer auth-token

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

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[
PUT /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregation_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/ppm-dap;message=aggregation-job-init-req
Content-Length: 100
Authorization: Bearer auth-token

encoded(struct {
  agg_param = [0x00, 0x01, 0x02, 0x04, ...],
  part_batch_selector = struct {
    batch_mode = BatchMode.time_interval,
    config = encoded(Empty),
  },
  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-17" || task_id,
    agg_param,
    state,
    inbound,
)
]]></sourcecode>
                <t>
where <tt>task_id</tt> is the task ID, <tt>inbound</tt> is the payload of the inbound
<tt>VerifyResp</tt>, and <tt>state</tt> is the report's verification state carried over
from the previous step. It then processes the next state transition:  </t>
                <ul spacing="normal">
                  <li>
                    <t>If the type of the new <tt>state</tt> is <tt>Continued</tt> or
<tt>FinishedWithOutbound</tt>, then the Leader stores <tt>state</tt> and proceeds
to the next continuation step.</t>
                  </li>
                  <li>
                    <t>Else if the new type is <tt>Rejected</tt>, then the Leader rejects the report and
removes it from the candidate set.      </t>
                    <t>
Note on rejection agreement: rejecting at this point would result in a
batch mismatch if the Helper had already committed to its output share.
This is impossible due to the verifiability property of the VDAF: if the
underlying measurement were invalid, then the Helper would have indicated
rejection in its response.</t>
                  </li>
                  <li>
                    <t>Else if the new type is <tt>Finished</tt>, then the Leader commits to
<tt>state.out_share</tt> as described in <xref target="batch-buckets"/>.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Else if <tt>state</tt> has type <tt>FinishedWithOutbound</tt> and the inbound
<tt>VerifyResp</tt> has type "finish", then verification is complete and the
Leader commits to <tt>state.out_share</tt> as described in
<xref target="batch-buckets"/>.</t>
              </li>
              <li>
                <t>Else if the inbound <tt>VerifyResp</tt> has type "reject", then the Leader rejects
the report and removes it from the candidate set. The Leader <bcp14>MUST NOT</bcp14>
include the report in a subsequent aggregation job, unless the report error
is <tt>report_too_early</tt>, in which case the Leader <bcp14>MAY</bcp14> include the report in a
subsequent aggregation job.</t>
              </li>
              <li>
                <t>Otherwise the inbound message is incompatible with the Leader's current
state, in which case the Leader <bcp14>MUST</bcp14> abandon the aggregation job.</t>
              </li>
            </ol>
            <t>If the Leader fails to process the response from the Helper, for example because
of a transient failure such as a network connection failure or process crash,
the Leader <bcp14>SHOULD</bcp14> re-send the original request unmodified in order to attempt
recovery (see <xref target="aggregation-step-skew-recovery"/>).</t>
          </section>
          <section anchor="aggregation-helper-continuation">
            <name>Helper Continuation</name>
            <figure anchor="helper-cont-state">
              <name>Helper state transition triggered by aggregation continuation. (*) indicates a terminal state.</name>
              <artset>
                <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width="424" viewBox="0 0 424 160" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                    <path d="M 128,48 L 128,144" fill="none" stroke="black"/>
                    <path d="M 88,48 L 168,48" fill="none" stroke="black"/>
                    <path d="M 128,80 L 168,80" fill="none" stroke="black"/>
                    <path d="M 128,112 L 168,112" fill="none" stroke="black"/>
                    <path d="M 128,144 L 168,144" fill="none" stroke="black"/>
                    <polygon class="arrowhead" points="176,144 164,138.4 164,149.6" fill="black" transform="rotate(0,168,144)"/>
                    <polygon class="arrowhead" points="176,112 164,106.4 164,117.6" fill="black" transform="rotate(0,168,112)"/>
                    <polygon class="arrowhead" points="176,80 164,74.4 164,85.6" fill="black" transform="rotate(0,168,80)"/>
                    <polygon class="arrowhead" points="176,48 164,42.4 164,53.6" fill="black" transform="rotate(0,168,48)"/>
                    <g class="text">
                      <text x="140" y="36">VerifyContinue</text>
                      <text x="40" y="52">Continued</text>
                      <text x="216" y="52">Continued</text>
                      <text x="260" y="84">FinishedWithOutbound</text>
                      <text x="384" y="84">(commit*)</text>
                      <text x="212" y="116">Finished</text>
                      <text x="288" y="116">(commit*)</text>
                      <text x="212" y="148">Rejected</text>
                      <text x="288" y="148">(reject*)</text>
                    </g>
                  </svg>
                </artwork>
                <artwork type="ascii-art"><![CDATA[
          VerifyContinue
Continued -----+----> Continued
               |
               +----> FinishedWithOutbound (commit*)
               |
               +----> Finished (commit*)
               |
               +----> Rejected (reject*)
]]></artwork>
              </artset>
            </figure>
            <t>The Helper begins continuation with a <tt>state</tt> object for each report in
the candidate set, each of which has type <tt>Continued</tt>. The Helper waits for the
Leader to POST an <tt>AggregationJobContinueReq</tt> to the aggregation job.</t>
            <t>The continuation request can be handled either asynchronously or synchronously
as described in <xref target="http-usage"/>. When indicating that the job is not yet ready,
the response <bcp14>MUST</bcp14> include a Location header field (<xref section="10.2.2" sectionFormat="comma" target="RFC9110"/>)
to the relative reference
<tt>/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}?step={step}</tt>, where
<tt>step</tt> is set to <tt>AggregationJobContinueReq.step</tt>. Subsequent GET requests to
the aggregation job <bcp14>MUST</bcp14> include the <tt>step</tt> query parameter so that the Helper
can figure out which step of preparation the Leader is on (see
<xref target="aggregation-step-skew-recovery"/>). The representation of the aggregation job
is an <tt>AggregationJobResp</tt>.</t>
            <t>To begin handling an <tt>AggregationJobContinueReq</tt>, the Helper checks the
following conditions:</t>
            <ul spacing="normal">
              <li>
                <t>Whether it recognizes the task ID. If not, then the Helper <bcp14>MUST</bcp14> fail the job
with error <tt>unrecognizedTask</tt>.</t>
              </li>
              <li>
                <t>Whether it recognizes the indicated aggregation job ID. If not, the Helper
<bcp14>MUST</bcp14> fail the job with error <tt>unrecognizedAggregationJob</tt>.</t>
              </li>
              <li>
                <t>Whether the <tt>AggregationJobContinueReq</tt> is malformed. If so, the the Helper
<bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
              </li>
              <li>
                <t>Whether <tt>AggregationJobContinueReq.step</tt> is equal to <tt>0</tt>. If so, the Helper
<bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
              </li>
              <li>
                <t>Whether the report IDs are all distinct and each report ID corresponds to one
of the <tt>state</tt> objects. If either of these checks fail, then the Helper <bcp14>MUST</bcp14>
fail the job with error <tt>invalidMessage</tt>.</t>
              </li>
            </ul>
            <t>Additionally, if any verification step appears out of order relative to the
previous request, then the Helper <bcp14>MAY</bcp14> fail the job with error <tt>invalidMessage</tt>.
A report may be missing, in which case the Helper assumes the Leader rejected
it and removes it from the candidate set.</t>
            <t>Next, the Helper checks the continuation step indicated by the request. If the
<tt>step</tt> value is one greater than the job's current step, then the Helper
proceeds.</t>
            <t>The Helper may receive multiple copies of a continuation request for a given
step. The Helper <bcp14>MAY</bcp14> attempt to recover by sending the same response as it did
for the previous <tt>AggregationJobContinueReq</tt>, without performing any additional
work on the aggregation job. It is illegal to rewind or reset the state of an
aggregation job, so in this case it <bcp14>MUST</bcp14> verify that the contents of the
<tt>AggregationJobContinueReq</tt> are identical to the previous message (see
<xref target="aggregation-step-skew-recovery"/>).</t>
            <t>If the Helper does not wish to attempt recovery, or if the step has some other
value, the Helper <bcp14>MUST</bcp14> fail the job with error <tt>stepMismatch</tt>.</t>
            <t>For each report, the Helper does the following:</t>
            <sourcecode type="pseudocode"><![CDATA[
state = Vdaf.ping_pong_helper_continued(
    "dap-17" || 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 as specified by the
task's batch mode:</t>
            <ul spacing="normal">
              <li>
                <t>For the time-interval batch mode (<xref target="time-interval-batch-mode"/>, the batch
bucket identifier is an interval of time and is determined by the report's
timestamp.</t>
              </li>
              <li>
                <t>For the leader-selected batch mode (<xref target="leader-selected-batch-mode"/>), the
batch bucket identifier is the batch ID and indicated in the aggregation job.</t>
              </li>
            </ul>
            <t>A few different pieces of information are associated with each batch bucket:</t>
            <ul spacing="normal">
              <li>
                <t>An aggregate share, as defined by the <xref target="VDAF"/> in use.</t>
              </li>
              <li>
                <t>The number of reports included in the batch bucket.</t>
              </li>
              <li>
                <t>A 32-byte checksum value, as defined below.</t>
              </li>
            </ul>
            <t>An output share is eligible to be committed if the following conditions are met:</t>
            <ul spacing="normal">
              <li>
                <t>If the batch bucket has been collected, the Aggregator <bcp14>MUST</bcp14> mark the report
invalid with error <tt>batch_collected</tt>.</t>
              </li>
              <li>
                <t>If the report ID associated with <tt>out_share</tt> has been aggregated in the task,
the Aggregator <bcp14>MUST</bcp14> mark the report invalid with error <tt>report_replayed</tt>.</t>
              </li>
            </ul>
            <t>Aggregators <bcp14>MUST</bcp14> check these conditions before committing an output share.
Helpers may perform these checks at any time before commitment (i.e., during
either aggregation initialization or continuation), but Leaders <bcp14>MUST</bcp14> perform
these checks before adding a report to an aggregation job.</t>
            <t>The following procedure is used to commit an output share <tt>out_share</tt> to a batch
bucket:</t>
            <ul spacing="normal">
              <li>
                <t>Look up the existing batch bucket for the batch bucket identifier
associated with the aggregation job and output share.
                </t>
                <ul spacing="normal">
                  <li>
                    <t>If there is no existing batch bucket, initialize a new one. The initial
aggregate share value is computed as <tt>Vdaf.agg_init(agg_param)</tt>, where
<tt>agg_param</tt> is the aggregation parameter associated with the aggregation job
(see <xref section="4.4" sectionFormat="comma" target="VDAF"/>). The initial count is <tt>0</tt> and the initial
checksum is 32 zero bytes.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Update the aggregate share <tt>agg_share</tt> to <tt>Vdaf.agg_update(agg_param,
agg_share, out_share)</tt>.</t>
              </li>
              <li>
                <t>Increment the count by 1.</t>
              </li>
              <li>
                <t>Update the checksum value to the bitwise XOR of the current checksum value
with the SHA256 <xref target="SHS"/> hash of the report ID
associated with the output share.</t>
              </li>
              <li>
                <t>Store <tt>out_share</tt>'s report ID for future replay checks.</t>
              </li>
            </ul>
            <t>This section describes a single set of values associated with each batch bucket.
However, implementations are free to shard batch buckets, combining them back
into a single set of values when reading the batch bucket. The aggregate shares
are combined using <tt>Vdaf.merge(agg_param, agg_shares)</tt> (see <xref section="4.4" sectionFormat="comma" target="VDAF"/>), the count values are combined by summing, and the checksum values are
combined by bitwise XOR.</t>
            <t>Implementation note: The Leader considers a batch to be collected once it has
completed a collection job for a CollectionJobReq message from the Collector;
the Helper considers a batch to be collected once it has responded to an
<tt>AggregateShareReq</tt> message from the Leader. A batch is determined by query
conveyed in these messages. Queries must satisfy the criteria defined by their
batch mode (<xref target="batch-modes"/>). These criteria are meant to restrict queries in a
way that makes it easy to determine whether a report pertains to a batch that
was collected. See <xref target="distributed-systems"/> for more information.</t>
          </section>
          <section anchor="aggregation-step-skew-recovery">
            <name>Recovering from Aggregation Step Skew</name>
            <t><tt>AggregationJobContinueReq</tt> messages contain a <tt>step</tt> field, allowing
Aggregators to ensure that their peer is on an expected step of 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 16-byte job ID, chosen by the Collector:</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque CollectionJobID[16];
]]></sourcecode>
        <t>A collection job is an HTTP resource served by the Leader at the URL
<tt>{leader}/tasks/{task-id}/collection_jobs/{collection-job-id}</tt>.</t>
        <section anchor="collect-init">
          <name>Collection Job Initialization</name>
          <t>First, the Collector chooses a collection job ID, which <bcp14>MUST</bcp14> be unique within
the scope of the corresponding DAP task.</t>
          <t>To initiate the collection job, the Collector issues a PUT request to the
collection job with media type "application/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>;
} CollectionJobReq;
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>query</tt>, the Collector's query. The content of this field depends on the
indicated batch mode (<xref target="batch-modes"/>).</t>
            </li>
            <li>
              <t><tt>agg_param</tt>, an aggregation parameter for the VDAF being executed. This is
the same value as in <tt>AggregationJobInitReq</tt> (see <xref target="leader-init"/>).</t>
            </li>
          </ul>
          <t>Depending on the VDAF scheme and how the Leader is configured, the Leader and
Helper may already have aggregated a sufficient number of reports satisfying the
query and be ready to return the aggregate shares right away. However, this is
not always the case. In fact, for some VDAFs, it is not be possible to begin
running aggregation jobs (<xref target="aggregate-flow"/>) until the Collector initiates a
collection job. This is because, in general (see <xref target="eager-aggregation"/>), the
aggregation parameter is not known until this point. In certain situations it is
possible to predict the aggregation parameter in advance. For example, for Prio3
the only valid aggregation parameter is the empty string.</t>
          <t>The collection request can be handled either asynchronously or synchronously as
described in <xref target="http-usage"/>. The representation of the collection job is a
<tt>CollectionJobResp</tt> (defined below).</t>
          <t>If the job fails with <tt>invalidBatchSize</tt>, then the Collector <bcp14>MAY</bcp14> retry it later,
once it believes enough new reports have been uploaded and aggregated to allow
the collection job to succeed.</t>
          <t>The Leader begins handling a <tt>CollectionJobReq</tt> by checking the following
conditions:</t>
          <ul spacing="normal">
            <li>
              <t>Whether it recognizes the task ID. If not, the Leader <bcp14>MUST</bcp14> fail the collection
job with error <tt>unrecognizedTask</tt>.</t>
            </li>
            <li>
              <t>Whether the indicated batch mode matches the task's batch mode. If not, the
Leader <bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
            </li>
            <li>
              <t>Whether the <tt>CollectionJobReq</tt> is malformed. If so, the the Helper <bcp14>MUST</bcp14> fail
the job with error <tt>invalidMessage</tt>.</t>
            </li>
            <li>
              <t>Whether the aggregation parameter is valid as described in
<xref target="agg-param-validation"/>. If not, the Leader <bcp14>MUST</bcp14> fail the job with error
<tt>invalidAggregationParameter</tt>.</t>
            </li>
            <li>
              <t>Whether the <tt>Query</tt> in the Collector's request determines a batch that can be
collected. If the query does not identify a valid set of batch buckets
according to the criteria defined by the batch mode in use (<xref target="batch-modes"/>),
then the Leader <bcp14>MUST</bcp14> fail the job with error <tt>batchInvalid</tt>.</t>
            </li>
            <li>
              <t>Whether any of the batch buckets identified by the query have already been
collected, then the Leader <bcp14>MUST</bcp14> fail the job with error <tt>batchOverlap</tt>.</t>
            </li>
            <li>
              <t>If aggregation was performed eagerly (<xref target="eager-aggregation"/>), then the Leader
checks that the aggregation parameter received in the <tt>CollectionJobReq</tt>
matches the aggregation parameter used in each aggregation job pertaining to
the batch. If not, the Leader <bcp14>MUST</bcp14> fail the job with error <tt>invalidMessage</tt>.</t>
            </li>
          </ul>
          <t>Having validated the <tt>CollectionJobReq</tt>, the Leader begins working with the
Helper to aggregate the reports satisfying the query (or continues this process,
depending on whether the Leader is aggregating eagerly; <xref target="eager-aggregation"/>)
as described in <xref target="aggregate-flow"/>.</t>
          <t>If the Leader has a pending aggregation job that overlaps with the batch for the
collection job, the Leader <bcp14>MUST</bcp14> first complete the aggregation job before
proceeding and requesting an aggregate share from the Helper. This avoids a race
condition between aggregation and collection jobs that can yield batch mismatch
errors.</t>
          <t>If the number of validated reports in the batch is not equal to or greater than
the task's minimum batch size, then the Leader <bcp14>SHOULD</bcp14> wait for more reports to
be uploaded and aggregated and try the collection job again later. Alternately,
the Leader <bcp14>MAY</bcp14> give up on the collection job (for example, if it decides that no
new reports satisfying the query are likely to ever arrive), in which case it
<bcp14>MUST</bcp14> fail the job with error <tt>invalidBatchSize</tt>. It <bcp14>MUST NOT</bcp14> fulfill any jobs
with an insufficient number of validated reports.</t>
          <t>Once the Leader has validated the collection job and run to completion all the
aggregation jobs that pertain to it, it obtains the Helper's aggregate share
following the aggregate-share request flow described in <xref target="collect-aggregate"/>.
If obtaining the aggregate share fails, then the Leader <bcp14>MUST</bcp14> fail the collection
job with the error that caused the failure.</t>
          <t>Once the Leader has the Helper's aggregate share and has computed its own, the
collection job is ready. Its results are represented by a <tt>CollectionJobResp</tt>,
which is structured as follows:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  PartialBatchSelector part_batch_selector;
  uint64 report_count;
  Interval interval;
  HpkeCiphertext leader_encrypted_agg_share;
  HpkeCiphertext helper_encrypted_agg_share;
} CollectionJobResp;
]]></sourcecode>
          <t>A <tt>CollectionJobResp</tt>'s media type is
"application/ppm-dap;message=collection-job-resp". The structure includes the
following:</t>
          <ul spacing="normal">
            <li>
              <t><tt>part_batch_selector</tt>: Information used to bind the aggregate result to the
query. For leader-selected tasks, this includes the batch ID assigned to the
batch by the Leader. The indicated batch mode <bcp14>MUST</bcp14> match the task's batch
mode.</t>
            </li>
            <li>
              <t><tt>report_count</tt>: The number of reports included in the batch.</t>
            </li>
            <li>
              <t><tt>interval</tt>: The smallest interval of time that contains the timestamps of all
reports included in the batch. In the case of a time-interval query
(<xref target="time-interval-batch-mode"/>), this interval can be smaller than the one in
the corresponding <tt>CollectionJobReq.query</tt>.</t>
            </li>
            <li>
              <t><tt>leader_encrypted_agg_share</tt>: The Leader's aggregate share, encrypted to the
Collector (see <xref target="aggregate-share-encrypt"/>).</t>
            </li>
            <li>
              <t><tt>helper_encrypted_agg_share</tt>: The Helper's aggregate share, encrypted to the
Collector (see <xref target="aggregate-share-encrypt"/>).</t>
            </li>
          </ul>
          <t>Once the <tt>Leader</tt> has constructed a <tt>CollectionJobResp</tt> for the Collector, the
Leader considers the batch to be collected, and further aggregation jobs <bcp14>MUST
NOT</bcp14> commit more reports to the batch (see <xref target="batch-buckets"/>).</t>
          <t>Changing a collection job's parameters is illegal, so if there are further PUT
requests to the collection job with a different <tt>CollectionJobReq</tt>, the Leader
<bcp14>MUST</bcp14> abort with error <tt>invalidMessage</tt>.</t>
          <section anchor="example-5">
            <name>Example</name>
            <t>The Leader handles the collection job request synchronously:</t>
            <sourcecode type="http"><![CDATA[
PUT /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  collection_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/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, ...],
} CollectionJobReq)

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

encoded(struct {
  part_batch_selector = struct {
    batch_mode = BatchMode.leader_selected,
    config = encoded(struct {
      batch_id = [0x1f, 0x1e, ..., 0x00],
    } LeaderSelectedPartialBatchSelectorConfig),
  } PartialBatchSelector,
  report_count = 1000,
  interval = struct {
    start = 16595440,
    duration = 1,
  } Interval,
  leader_encrypted_agg_share = struct { ... } HpkeCiphertext,
  helper_encrypted_agg_share = struct { ... } HpkeCiphertext,
} CollectionJobResp)
]]></sourcecode>
            <t>Or asynchronously:</t>
            <sourcecode type="http"><![CDATA[
PUT /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  collection_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/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),
} CollectionJobReq)

HTTP/1.1 200
Retry-After: 300

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

HTTP/1.1 200
Retry-After: 300

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

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

encoded(struct {
  part_batch_selector = struct {
    batch_mode = BatchMode.time_interval,
    config = encoded(struct {
      interval = struct {
        start = 1659544,
        duration = 10,
      } Interval,
    } TimeIntervalBatchSelectorConfig)
  },
  report_count = 4000,
  interval = struct {
    start = 1659547,
    duration = 10,
  } Interval,
  leader_encrypted_agg_share = struct { ... } HpkeCiphertext,
  helper_encrypted_agg_share = struct { ... } HpkeCiphertext,
} CollectionJobResp)
]]></sourcecode>
          </section>
        </section>
        <section anchor="collection-job-deletion">
          <name>Collection Job Deletion</name>
          <t>The Collector can send a DELETE request to the collection job, which indicates
to the Leader that it can abandon the collection job and discard state related
to it.</t>
          <t>Aggregators <bcp14>MUST NOT</bcp14> delete information needed for replay or double collection
checks (<xref target="batch-buckets"/>).</t>
          <section anchor="example-6">
            <name>Example</name>
            <sourcecode type="http"><![CDATA[
DELETE /leader/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  collection_jobs/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Authorization: Bearer auth-token

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

struct {
  BatchSelector batch_selector;
  opaque agg_param<0..2^32-1>;
  uint64 report_count;
  opaque checksum[32];
} AggregateShareReq;
]]></sourcecode>
          <t>The media type of <tt>AggregateShareReq</tt> is
"application/ppm-dap;message=aggregate-share-req". The structure contains the
following parameters:</t>
          <ul spacing="normal">
            <li>
              <t><tt>batch_selector</tt>: The "batch selector", the contents of which depends on the
indicated batch mode (see <xref target="batch-modes"/>.</t>
            </li>
            <li>
              <t><tt>agg_param</tt>: The encoded aggregation parameter for the VDAF being executed.</t>
            </li>
            <li>
              <t><tt>report_count</tt>: The number number of reports included in the batch, as
computed above.</t>
            </li>
            <li>
              <t><tt>checksum</tt>: The batch checksum, as computed above.</t>
            </li>
          </ul>
          <t>The aggregate share request can be handled either asynchronously or
synchronously as described in <xref target="http-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>BatchSelector</tt> in the Leader's request
determines a batch that can be collected. If the selector does not identify a
valid set of batch buckets according to the criteria defined by the batch mode
in use (<xref target="batch-modes"/>), then the Helper <bcp14>MUST</bcp14> fail the job with error
<tt>batchInvalid</tt>.</t>
          <t>If any of the batch buckets identified by the selector have already been
collected, then the Helper <bcp14>MUST</bcp14> fail the job with error <tt>batchOverlap</tt>.</t>
          <t>If the number of validated reports in the batch is not equal to or greater than
the task's minimum batch size, then the Helper <bcp14>MUST</bcp14> abort with
<tt>invalidBatchSize</tt>.</t>
          <t>The aggregation parameter <bcp14>MUST</bcp14> match the aggregation parameter used in
aggregation jobs pertaining to this batch. If not, the Helper <bcp14>MUST</bcp14> fail the job
with error <tt>invalidMessage</tt>.</t>
          <t>Next, the Helper retrieves and combines the batch buckets associated with the
request using the same process used by the Leader (described at the beginning of
this section), arriving at its aggregate share, report count, and checksum
values. If the Helper's computed report count and checksum values do not match
the values provided in the <tt>AggregateShareReq</tt>, it <bcp14>MUST</bcp14> fail the job with error
<tt>batchMismatch</tt>.</t>
          <t>The Helper then encrypts <tt>agg_share</tt> under the Collector's HPKE public key as
described in <xref target="aggregate-share-encrypt"/>, yielding <tt>encrypted_agg_share</tt>.
Encryption prevents the Leader from learning the actual result, as it only has
its own aggregate share and cannot compute the Helper's.</t>
          <t>Once the Helper has encrypted its aggregate share, the aggregate share job is
ready. Its results are represented by an <tt>AggregateShare</tt>, with media type
"application/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>Changing an aggregate share's parameters is illegal, so if there are further PUT
requests to the aggregate share with a different <tt>AggregateShareReq</tt>, the Helper
<bcp14>MUST</bcp14> abort with error <tt>invalidMessage</tt>.</t>
          <t>Before completing the collection job, the Leader encrypts its aggregate share
under the Collector's HPKE public key as described in
<xref target="aggregate-share-encrypt"/>.</t>
          <section anchor="example-7">
            <name>Example</name>
            <t>The Helper handles the aggregate share request synchronously:</t>
            <sourcecode type="http"><![CDATA[
PUT /helper/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/\
  aggregate_shares/lc7aUeGpdSNosNlh-UZhKA
Host: example.com
Content-Type: application/ppm-dap;message=aggregate-share-req
Authorization: Bearer auth-token

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

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

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

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

HTTP/1.1 200
Retry-After: 300

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

HTTP/1.1 200
Retry-After: 300

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

HTTP/1.1 200
Content-Type: application/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-17 aggregate share" || server_role || 0x00,
    agg_share_aad,
    agg_share)
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>pk</tt> is the Collector's HPKE public key</t>
            </li>
            <li>
              <t><tt>server_role</tt> is the Role of the encrypting server (<tt>0x02</tt> for the Leader and
<tt>0x03</tt> for a Helper)</t>
            </li>
            <li>
              <t><tt>0x00</tt> represents the Role of the recipient (always the Collector)</t>
            </li>
            <li>
              <t><tt>agg_share_aad</tt> is an <tt>AggregateShareAad</tt> (defined below).</t>
            </li>
          </ul>
          <t>The <tt>SealBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the HPKE configuration.</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  TaskID task_id;
  opaque agg_param<0..2^32-1>;
  BatchSelector batch_selector;
} AggregateShareAad;
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>task_id</tt> is the ID of the task the aggregate share was computed in.</t>
            </li>
            <li>
              <t><tt>agg_param</tt> is the aggregation parameter used to compute the aggregate share.</t>
            </li>
            <li>
              <t><tt>batch_selector</tt> is the is the batch selector from the <tt>AggregateShareReq</tt>
(for the Helper) or the batch selector computed from the Collector's query
(for the Leader).</t>
            </li>
          </ul>
          <t>The Collector decrypts these aggregate shares using the opposite process.
Specifically, given an encrypted input share, denoted <tt>enc_share</tt>, for a given
batch selector, decryption works as follows:</t>
          <sourcecode type="pseudocode"><![CDATA[
agg_share = OpenBase(
    enc_share.enc,
    sk,
    "dap-17 aggregate share" || server_role || 0x00,
    agg_share_aad,
    enc_share.payload)
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>sk</tt> is the HPKE secret key</t>
            </li>
            <li>
              <t><tt>server_role</tt> is the Role of the server that sent the aggregate share (<tt>0x02</tt>
for the Leader and <tt>0x03</tt> for the Helper)</t>
            </li>
            <li>
              <t><tt>0x00</tt> represents the Role of the recipient (always the Collector)</t>
            </li>
            <li>
              <t><tt>agg_share_aad</tt> is an <tt>AggregateShareAad</tt> message constructed from the task ID
and the aggregation parameter in the collect request, and a batch selector.
The value of the batch selector used in <tt>agg_share_aad</tt> is determined by the
batch mode:  </t>
              <ul spacing="normal">
                <li>
                  <t>For time-interval (<xref target="time-interval-batch-mode"/>), the batch selector is the
batch interval specified in the query.</t>
                </li>
                <li>
                  <t>For leader-selected (<xref target="leader-selected-batch-mode"/>), the batch selector is
the batch ID sent in the response.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>The <tt>OpenBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the HPKE configuration.</t>
        </section>
      </section>
    </section>
    <section anchor="batch-modes">
      <name>Batch Modes</name>
      <t>This section defines an initial set of batch modes for DAP. New batch modes may
be defined by future documents following the guidelines in
<xref target="extending-this-doc"/>.</t>
      <t>In protocol messages, batch modes are identified with a <tt>BatchMode</tt> value:</t>
      <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0),
  time_interval(1),
  leader_selected(2),
  (255)
} BatchMode;
]]></sourcecode>
      <t>Each batch mode specifies the following:</t>
      <ol spacing="normal" type="1"><li>
          <t>The value of the <tt>config</tt> field of <tt>Query</tt>, <tt>PartialBatchSelector</tt>, and
<tt>BatchSelector</tt></t>
        </li>
        <li>
          <t>Batch buckets (<xref target="batch-buckets"/>): how reports are assigned to batch
buckets; how each bucket is identified; and how batch buckets are mapped to
batches</t>
        </li>
      </ol>
      <section anchor="time-interval-batch-mode">
        <name>Time Interval</name>
        <t>The time-interval batch mode is designed to support applications in which
reports are grouped by an interval of time. The Collector specifies a "batch
interval" into which report timestamps must fall.</t>
        <t>The Collector can issue queries whose batch intervals are continuous,
monotonically increasing, and have the same duration. For example, the following
sequence of batch intervals satisfies these conditions:</t>
        <sourcecode type="tls-presentation"><![CDATA[
[
  struct {
    start = 1659544,
    duration = 1,
  } Interval,
  struct {
    start = 1659545,
    duration = 1,
  } Interval,
  struct {
    start = 1659546,
    duration = 1,
  } Interval,
  struct {
    start = 1659547,
    duration = 1,
  } Interval,
]
]]></sourcecode>
        <t>However, this is not a requirement: the Collector may decide to issue queries
out-of-order. In addition, the Collector may need to vary the duration to adjust
to changing report upload rates.</t>
        <section anchor="query-configuration">
          <name>Query Configuration</name>
          <t>The payload of <tt>Query.config</tt> is</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  Interval batch_interval;
} TimeIntervalQueryConfig;
]]></sourcecode>
          <t>where <tt>batch_interval</tt> is the batch interval requested by the Collector. The
interval <bcp14>MUST</bcp14> be well-formed as specified in <xref target="timestamps"/>. Otherwise, the
query does not specify a set of valid batch buckets.</t>
        </section>
        <section anchor="partial-batch-selector-configuration">
          <name>Partial Batch Selector Configuration</name>
          <t>The payload of <tt>PartialBatchSelector.config</tt> is empty.</t>
        </section>
        <section anchor="batch-selector-configuration">
          <name>Batch Selector Configuration</name>
          <t>The payload of <tt>BatchSelector.config</tt> is</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  Interval batch_interval;
} TimeIntervalBatchSelectorConfig;
]]></sourcecode>
          <t>where <tt>batch_interval</tt> is the batch interval requested by the Collector.</t>
        </section>
        <section anchor="time-interval-batch-buckets">
          <name>Batch Buckets</name>
          <t>Each batch bucket is identified by an <tt>Interval</tt> whose duration is equal to the
task's <tt>time_precision</tt>. The identifier associated with a given report is the
unique such interval containing the timestamp of the report. For example, if
the task's <tt>time_precision</tt> is 1000 seconds and the report was generated at
1729629081 seconds after the start of the UNIX epoch, the relevant batch
bucket identifier is</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  start = 1729629,
  duration = 1,
} Interval
]]></sourcecode>
          <t>The <tt>Query</tt> received by the Leader or <tt>BatchSelector</tt> received by the Helper
determines a valid set of batch bucket identifiers if the batch interval's
duration is greater than or equal to the task's <tt>time_precision</tt>.</t>
          <t>A batch consists of a sequence of contiguous batch buckets. That is, the set of
batch bucket identifiers for the batch interval is</t>
          <sourcecode type="tls-presentation"><![CDATA[
[
  struct {
    start = batch_interval.start,
    duration = 1,
  } Interval,
  struct {
    start = batch_interval.start + 1,
    duration = 1,
  } Interval,
  ...
  struct {
    start = batch_interval.start + batch_interval.duration - 1,
    duration = 1,
  } Interval,
]
]]></sourcecode>
        </section>
      </section>
      <section anchor="leader-selected-batch-mode">
        <name>Leader-selected Batch Mode</name>
        <t>The leader-selected batch mode is used when it is acceptable for the Leader to
arbitrarily batch reports. Each batch is identified by an opaque "batch ID"
chosen by the Leader, which <bcp14>MUST</bcp14> be unique in the scope of the task.</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque BatchID[32];
]]></sourcecode>
        <t>The Collector will not know the set of batch IDs available for collection. To
get the aggregate of a batch, the Collector issues a query for the next
available batch. The Leader selects a recent batch to aggregate which <bcp14>MUST NOT</bcp14>
yet have been associated with a collection job.</t>
        <t>The Aggregators can output batches of any size that is larger than or equal to
the task's minimum batch size. The target batch size, if any, is
implementation-specific, and may be equal to or greater than the minimum batch
size. Deciding how soon batches should be output is also
implementation-specific. Exactly sizing batches may be challenging for Leader
deployments in which multiple, independent nodes running the aggregate
interaction (see <xref target="aggregate-flow"/>) need to be coordinated.</t>
        <section anchor="query-configuration-1">
          <name>Query Configuration</name>
          <t>They payload of <tt>Query.config</tt> is empty. The request merely indicates the
Collector would like the next batch selected by the Leader.</t>
        </section>
        <section anchor="partial-batch-selector-configuration-1">
          <name>Partial Batch Selector Configuration</name>
          <t>The payload of <tt>PartialBatchSelector.config</tt> is:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  BatchID batch_id;
} LeaderSelectedPartialBatchSelectorConfig;
]]></sourcecode>
          <t>where <tt>batch_id</tt> is the batch ID selected by the Leader.</t>
        </section>
        <section anchor="batch-selector-configuration-1">
          <name>Batch Selector Configuration</name>
          <t>The payload of <tt>BatchSelector.config</tt> is:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  BatchID batch_id;
} LeaderSelectedBatchSelectorConfig;
]]></sourcecode>
          <t>where <tt>batch_id</tt> is the batch ID selected by the Leader.</t>
        </section>
        <section anchor="leader-selected-batch-buckets">
          <name>Batch Buckets</name>
          <t>Each batch consists of a single bucket and is identified by the batch ID. A
report is assigned to the batch indicated by the <tt>PartialBatchSelector</tt> during
aggregation.</t>
        </section>
      </section>
    </section>
    <section anchor="operational-capabilities">
      <name>Operational Considerations</name>
      <t>The DAP protocol has inherent constraints derived from the tradeoff between
privacy guarantees and computational complexity. These tradeoffs influence how
applications may choose to utilize services implementing the specification.</t>
      <section anchor="entity-capabilities">
        <name>Protocol Participant Capabilities</name>
        <t>The design in this document has different assumptions and requirements for
different protocol participants, including Clients, Aggregators, and Collectors.
This section describes these capabilities in more detail.</t>
        <section anchor="client-capabilities">
          <name>Client Capabilities</name>
          <t>Clients have limited capabilities and requirements. Their only inputs to the
protocol are (1) the parameters configured out of band and (2) a measurement.
Clients are not expected to store any state across any upload flows, nor are
they required to implement any sort of report upload retry mechanism. By design,
the protocol in this document is robust against individual Client upload
failures since the protocol output is an aggregate over all inputs.</t>
        </section>
        <section anchor="aggregator-capabilities">
          <name>Aggregator Capabilities</name>
          <t>Leaders and Helpers have different operational requirements. The design in this
document assumes an operationally competent Leader, i.e., one that has no
storage or computation limitations or constraints, but only a modestly
provisioned Helper, i.e., one that has computation, bandwidth, and storage
constraints. By design, Leaders must be at least as capable as Helpers, where
Helpers are generally required to:</t>
          <ul spacing="normal">
            <li>
              <t>Support the aggregate interaction, which includes validating and aggregating
reports; and</t>
            </li>
            <li>
              <t>Publish and manage an HPKE configuration that can be used for the upload
interaction.</t>
            </li>
            <li>
              <t>Implement some form of batch-to-report index, as well as inter- and
intra-batch replay mitigation storage, which includes some way of tracking
batch report size. Some of this state may be used for replay attack
mitigation. The replay mitigation strategy is described in
<xref target="input-share-validation"/>.</t>
            </li>
          </ul>
          <t>Beyond the minimal capabilities required of Helpers, Leaders are generally
required to:</t>
          <ul spacing="normal">
            <li>
              <t>Support the upload interaction and store reports; and</t>
            </li>
            <li>
              <t>Track batch report size during each collect flow and request encrypted output
shares from Helpers.</t>
            </li>
            <li>
              <t>Implement and store state for the form of inter- and intra-batch replay
mitigation in <xref target="agg-flow"/>. This requires storing the report IDs of all
reports processed for a given task. Implementations may find it helpful to
track additional information, like the timestamp, so that the storage used
for anti-replay can be sharded efficiently.</t>
            </li>
          </ul>
        </section>
        <section anchor="collector-capabilities">
          <name>Collector Capabilities</name>
          <t>Collectors statefully interact with Aggregators to produce an aggregate output.
Their input to the protocol is the task parameters, configured out of band,
which include the corresponding batch window and size. For each collect
invocation, Collectors are required to keep state from the start of the protocol
to the end as needed to produce the final aggregate output.</t>
          <t>Collectors must also maintain state for the lifetime of each task, which
includes key material associated with the HPKE key configuration.</t>
        </section>
      </section>
      <section anchor="vdafs-and-compute-requirements">
        <name>VDAFs and Compute Requirements</name>
        <t>The choice of VDAF can impact the computation and storage required for a DAP
task:</t>
        <ul spacing="normal">
          <li>
            <t>The runtime of VDAF sharding and 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 must store data related to a task as long as the
current time is not after this task's <tt>task_interval</tt>. Aggregators <bcp14>MAY</bcp14> delete
the task and all data pertaining to this task after the <tt>task_interval</tt>.
Implementors <bcp14>SHOULD</bcp14> provide for some leeway so the Collector can collect the
batch after some delay.</t>
        </section>
        <section anchor="distributed-systems">
          <name>Distributed Systems and Synchronization Concerns</name>
          <t>Various parts of a DAP implementation will need to synchronize in order to
ensure correctness during concurrent operation. This section describes the
relevant concerns and makes suggestions as to potential implementation
tradeoffs.</t>
          <ul spacing="normal">
            <li>
              <t>The upload interaction requires the Leader to discard uploaded reports with a
duplicated ID, including concurrently-uploaded reports. This might be
implemented by synchronization or via an eventually-consistent process. If the
Leader wishes to alert the Client with a <tt>reportRejected</tt> error,
synchronization will be necessary to ensure all but one concurrent request
receive the error.</t>
            </li>
            <li>
              <t>The Leader is responsible for generating aggregation jobs, and will generally
want to place each report in exactly one aggregation job. (The only event in
which a Leader can place a report in multiple aggregation jobs is if the
Helper rejects the report with <tt>report_too_early</tt>, in which case the Leader
can place the report into a later aggregation job.) This may require
synchronization between different components of the system which are
generating aggregation jobs. Note that placing a report into more than one
aggregation job will result in a loss of throughput, rather than a loss of
correctness, privacy, or verifiability, so it is acceptable for
implementations to use an eventually-consistent scheme which may rarely place
a report into multiple aggregation jobs.</t>
            </li>
            <li>
              <t>Aggregation is implemented as a sequence of aggregation steps by both the
Leader and the Helper. The Leader must ensure that each aggregation job is
only processed once concurrently, which may require synchronization between
the components responsible for performing aggregation. The Helper must ensure
that concurrent requests against the same aggregation job are handled
appropriately, which requires synchronization between the components handling
aggregation requests.</t>
            </li>
            <li>
              <t>Aggregation requires checking and updating used-report storage as part of
implementing replay protection. This must be done while processing the
aggregation job, though which steps the checks are performed at is up to the
implementation. The checks and storage require synchronization, so that if two
aggregation jobs containing the same report are processed, at most one
instance of the report will be aggregated. However, the interaction with the
used-report storage does not necessarily have to be synchronized with the
processing and storage for the remainder of the aggregation process. For
example, used-report storage could be implemented in a separate datastore than
is used for the remainder of data storage, without any transactionality
between updates to the two datastores.</t>
            </li>
            <li>
              <t>The aggregation and collection interactions require synchronization to avoid
modifying the aggregate of a batch after it has already been collected. Any
reports being aggregated which pertain to a batch which has already been
collected must fail with a <tt>batch_collected</tt> error; correctly determining this
requires synchronizing aggregation with the completion of collection jobs (for
the Leader) or aggregate share requests (for the Helper). Also, the Leader
must complete all outstanding aggregation jobs for a batch before requesting
aggregate shares from the Helper, again requiring synchronization between the
Leader's collection and aggregation interactions. Further, the Helper must
determine the aggregated report count and checksum of aggregated report IDs
before responding to an aggregate share request, requiring synchronization
between the Helper's collection and aggregation interactions.</t>
            </li>
          </ul>
        </section>
        <section anchor="streaming-messages">
          <name>Streaming Messages</name>
          <t>Most messages in the protocol contain fixed-length or length-prefixed fields
such that they can be parsed independently of context. The exceptions are the
<tt>UploadReq</tt>, <tt>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 begin transmitting these messages before knowing
how long the message will ultimately be. This is useful if implementations wish
to avoid buffering exceptionally large messages in memory.</t>
        </section>
      </section>
    </section>
    <section anchor="compliance">
      <name>Compliance Requirements</name>
      <t>In the absence of an application or deployment-specific profile specifying
otherwise, a compliant DAP application <bcp14>MUST</bcp14> implement the following HPKE cipher
suite:</t>
      <ul spacing="normal">
        <li>
          <t>KEM: DHKEM(X25519, HKDF-SHA256) (see <xref section="7.1" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
        <li>
          <t>KDF: HKDF-SHA256 (see <xref section="7.2" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
        <li>
          <t>AEAD: AES-128-GCM (see <xref section="7.3" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>DAP aims to achieve the privacy and verifiability security goals defined in
<xref section="9" sectionFormat="of" target="VDAF"/>. That is, an active attacker that controls a subset of
the Clients, one of the Aggregators, and the Collector learns nothing about the
honest Clients' measurements beyond their aggregate result. At the same time,
an attacker that controls a subset of Clients cannot force the Collector to
compute anything but the aggregate result over the honest Clients'
measurements.</t>
      <t>Since DAP requires HTTPS (<xref target="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. Moreover, it <bcp14>SHOULD</bcp14> be fixed for the lifetime of the task and
not be rotated. One way to ensure that the verification key is generated
independently from any given report is to derive the key based on the task ID
and some previously agreed upon secret (verify_key_seed) between Aggregators,
as follows:</t>
          <sourcecode type="pseudocode"><![CDATA[
verify_key = HKDF-Expand(
    HKDF-Extract(
        "verify_key",    # salt
        verify_key_seed, # IKM
    ),
    task_id,             # info
    VERIFY_KEY_SIZE,     # L
)
]]></sourcecode>
          <t>Here, VERIFY_KEY_SIZE is the length of the verification key, and HKDF-Extract
and HKDF-Expand are as defined in <xref target="RFC5869"/>.</t>
          <t>This requirement comes from current security analysis for existing VDAFs. In
particular, the security proofs for Prio3 require that the verification key is
chosen independently of the generated reports.</t>
        </section>
        <section anchor="batch-parameters">
          <name>Batch Parameters</name>
          <t>An important parameter of a DAP deployment is the minimum batch size. If a batch
includes too few reports, then the aggregate result can reveal information
about individual measurements. Aggregators enforce the agreed-upon minimum
batch size during collection, but implementations <bcp14>SHOULD</bcp14> also opt out of
participating in a DAP task if the minimum batch size is too small. This
document does not specify how to choose an appropriate minimum batch size, but
an appropriate value may be determined from the differential privacy (<xref target="dp"/>)
parameters in use, if any.</t>
        </section>
        <section anchor="relaxing-report-processing-rules">
          <name>Relaxing Report Processing Rules</name>
          <t>DAP Aggregators enforce several rules for report processing related to the
privacy of individual measurements:</t>
          <ol spacing="normal" type="1"><li>
              <t>Each report may be aggregated at most once (<xref target="batch-buckets"/>)</t>
            </li>
            <li>
              <t>A batch bucket may be collected at most once (reports pertaining to
collected buckets are rejected; see <xref target="batch-buckets"/>)</t>
            </li>
            <li>
              <t>A batch may only be collected if the number of reports aggregated exceeds
the minimum batch size (<xref target="collect-flow"/>)</t>
            </li>
          </ol>
          <t>It may be desirable to relax these rules in some applications. It may also be
safe to do so when DAP is combined with other privacy enhancements such as
differential privacy. When applications wish to relax any of one of these
requirements, they:</t>
          <ol spacing="normal" type="1"><li>
              <t><bcp14>MUST</bcp14> adhere to the VDAF's requirements for aggregating a report more than
once. See <xref section="5.3" sectionFormat="of" target="VDAF"/> for details.</t>
            </li>
            <li>
              <t><bcp14>SHOULD</bcp14> define a mechanism by which each party explicitly opts into the
change in report processing rules, e.g., via a report extension
(<xref target="report-extensions"/>). This helps prevent an implementation from
relaxing the rules by mistake.</t>
            </li>
          </ol>
        </section>
        <section anchor="task-configuration-agreement-and-consistency">
          <name>Task Configuration Agreement and Consistency</name>
          <t>In order to execute a DAP task, it is necessary for all parties to ensure they
agree on the configuration of the task. However, it is possible for a party to
participate in the execution of DAP without knowing all of the task's
parameters. For example, a Client can upload a report (<xref target="upload-flow"/>) without
knowing the minimum batch size that is enforced by the Aggregators during
collection (<xref target="collect-flow"/>).</t>
          <t>Depending on the deployment model, agreement can require that task parameters
are visible to all parties such that each party can choose whether to
participate based on the value of any parameter. This includes the parameters
enumerated in <xref target="task-configuration"/> and any additional parameters implied by
report extensions <xref target="report-extensions"/> used by the task. Since meaningful
privacy requires that multiple Clients contribute to a task, they should also
share a consistent view of the task configuration.</t>
        </section>
      </section>
      <section anchor="infrastructure-diversity">
        <name>Infrastructure Diversity</name>
        <t>DAP deployments should ensure that Aggregators do not have common dependencies
that would enable a single vendor to reassemble measurements. For example, if
all participating Aggregators stored unencrypted input shares on the same cloud
object storage service, then that cloud vendor would be able to reassemble all
the input shares and defeat privacy.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests registry of 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 should
contain the following columns:</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The one-byte identifier for the batch mode</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the batch mode</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the batch mode is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry listed in <xref target="batch-mode-id"/>.</t>
          <table anchor="batch-mode-id">
            <name>Initial contents of the 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="report-extension-registry">
          <name>Report Extension 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 upload extension</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the upload extension</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the upload extension is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are listed in <xref target="upload-extension-id"/>.</t>
          <table anchor="upload-extension-id">
            <name>Initial contents of the 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">RFC XXXX</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="report-error-reg">
          <name>Report Error Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "DAP Report Error Identifiers" for reasons for rejecting reports during
the aggregation interaction (<xref target="aggregation-helper-init"/>).</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The one-byte identifier of the report error</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the report error</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the report error is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are listed below in <xref target="report-error-id"/>.</t>
          <table anchor="report-error-id">
            <name>Initial contents of the DAP Report Error Identifiers registry.</name>
            <thead>
              <tr>
                <th align="left">Value</th>
                <th align="left">Name</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>reserved</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">
                  <tt>batch_collected</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x02</tt></td>
                <td align="left">
                  <tt>report_replayed</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x03</tt></td>
                <td align="left">
                  <tt>report_dropped</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x04</tt></td>
                <td align="left">
                  <tt>hpke_unknown_config_id</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x05</tt></td>
                <td align="left">
                  <tt>hpke_decrypt_error</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x06</tt></td>
                <td align="left">
                  <tt>vdaf_verify_error</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x07</tt></td>
                <td align="left">
                  <tt>task_expired</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x08</tt></td>
                <td align="left">
                  <tt>invalid_message</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x09</tt></td>
                <td align="left">
                  <tt>report_too_early</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x0A</tt></td>
                <td align="left">
                  <tt>task_not_started</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x0B</tt></td>
                <td align="left">
                  <tt>outdated_config</tt></td>
                <td align="left">
                  <xref target="basic-definitions"/> of RFX XXXX</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="guidance-for-designated-experts">
          <name>Guidance for Designated Experts</name>
          <t>When reviewing requests to extend a DAP registry, experts should ensure that a
document exists that defines the newly registered items and review the document
to ensure it meets the criteria for extending DAP specified in
<xref target="extending-this-doc"/>.</t>
        </section>
      </section>
      <section anchor="urn-space">
        <name>URN Sub-namespace for DAP (urn:ietf:params:ppm:dap)</name>
        <t>The following value will be (RFC EDITOR: change "will be" to "has been")
registered in the "IETF URN Sub-namespace for Registered Protocol
Parameter Identifiers" registry, following the template in <xref target="RFC3553"/>:</t>
        <artwork><![CDATA[
Registry name:  dap

Specification:  RFC XXXX

Repository:  http://www.iana.org/assignments/dap

Index value:  No transformation needed.
]]></artwork>
        <t>The initial contents of this namespace are the types and descriptions in
<xref target="urn-space-errors"/>, with the Reference field set to RFC XXXX.</t>
      </section>
    </section>
    <section anchor="extending-this-doc">
      <name>Extending this Document</name>
      <t>The behavior of DAP may be extended or modified by future documents defining
one or more of the following:</t>
      <ol spacing="normal" type="1"><li>
          <t>a new batch mode (<xref target="batch-modes"/>)</t>
        </li>
        <li>
          <t>a new report extension (<xref target="report-extensions"/>)</t>
        </li>
        <li>
          <t>a new report error (<xref target="aggregation-helper-init"/>)</t>
        </li>
        <li>
          <t>a new entry in the URN sub-namespace for DAP (<xref target="urn-space-errors"/>)</t>
        </li>
      </ol>
      <t>Each of these requires registration of a codepoint or other value; see
<xref target="iana"/>. No other considerations are required except in the following cases:</t>
      <ul spacing="normal">
        <li>
          <t>When a document defines a new batch mode, it <bcp14>MUST</bcp14> include a section titled
"DAP Batch Mode Considerations" specifying the following:  </t>
          <ul spacing="normal">
            <li>
              <t>The value of the <tt>config</tt> field of <tt>Query</tt>, <tt>PartialBatchSelector</tt>, and
<tt>BatchSelector</tt></t>
            </li>
            <li>
              <t>Batch buckets (<xref target="batch-buckets"/>): how reports are assigned to batch
buckets; how each bucket is identified; and how batch buckets are mapped
to batches.</t>
            </li>
          </ul>
          <t>
See <xref target="batch-modes"/> for examples.</t>
        </li>
        <li>
          <t>When a document defines a new report extension, it <bcp14>SHOULD</bcp14> include in its
"Security Considerations" section some discussion of how the extension
impacts the security of DAP with respect to the threat model in
<xref target="sec-considerations"/>.</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="POSIX">
          <front>
            <title>IEEE Standard for Information Technology--Portable Operating System Interface (POSIX(TM)) Base Specifications, Issue 7</title>
            <author>
              <organization/>
            </author>
            <date month="January" year="2018"/>
          </front>
          <seriesInfo name="DOI" value="10.1109/ieeestd.2018.8277153"/>
          <seriesInfo name="ISBN" value="[&quot;9781504445429&quot;]"/>
          <refcontent>IEEE</refcontent>
        </reference>
        <reference anchor="VDAF">
          <front>
            <title>Verifiable Distributed Aggregation Functions</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="David Cook" initials="D." surname="Cook">
              <organization>ISRG</organization>
            </author>
            <author fullname="Christopher Patton" initials="C." surname="Patton">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Phillipp Schoppmann" initials="P." surname="Schoppmann">
              <organization>Google</organization>
            </author>
            <date day="30" month="January" 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-18"/>
        </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="RFC9111">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="SHS">
          <front>
            <title>Secure hash standard</title>
            <author>
              <organization/>
            </author>
            <date year="2015"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.180-4"/>
          <refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
        </reference>
        <reference anchor="RFC9458">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="January" year="2024"/>
            <abstract>
              <t>This document describes Oblivious HTTP, a protocol for forwarding encrypted HTTP messages. Oblivious HTTP allows a client to make multiple requests to an origin server without that server being able to link those requests to the client or to identify the requests as having come from the same client, while placing only limited trust in the nodes used to forward the messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9458"/>
          <seriesInfo name="DOI" value="10.17487/RFC9458"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="RFC3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <author fullname="T. Hardie" initials="T." surname="Hardie"/>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <date month="June" year="2003"/>
            <abstract>
              <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items. The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="73"/>
          <seriesInfo name="RFC" value="3553"/>
          <seriesInfo name="DOI" value="10.17487/RFC3553"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="Dou02" target="https://doi.org/10.1007/3-540-45748-8_24">
          <front>
            <title>The Sybil Attack</title>
            <author initials="J. R." surname="Douceur" fullname="John R. Douceur">
              <organization/>
            </author>
            <date year="2002"/>
          </front>
          <refcontent>International Workshop on Peer-to-Peer Systems (IPTPS)</refcontent>
        </reference>
        <reference anchor="Vad16" target="https://privacytools.seas.harvard.edu/files/privacytools/files/complexityprivacy_1.pdf">
          <front>
            <title>The Complexity of Differential Privacy</title>
            <author initials="S." surname="Vadhan" fullname="Salil Vadhan">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
        </reference>
        <reference anchor="OAuth2">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="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 4554?>

<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>Resource URL: <tt>{leader}/tasks/{task-id}/collection_jobs/{collection-job-id}</tt></t>
          <t>HTTP methods: PUT, GET</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>Resource URL: <tt>/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt></t>
          <t>HTTP methods: PUT, POST, GET</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>Resource URL: <tt>{helper}/tasks/{task-id}/aggregate_shares/{aggregate-share-id}</tt></t>
          <t>HTTP methods: PUT, GET</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="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="J." surname="Aas" fullname="Josh Aas">
        <organization>ISRG</organization>
        <address>
          <email>josh@abetterinternet.org</email>
        </address>
      </contact>
      <contact initials="J." surname="Chen" fullname="Junye Chen">
        <organization>Apple</organization>
        <address>
          <email>junyec@apple.com</email>
        </address>
      </contact>
      <contact initials="D." surname="Cook" fullname="David Cook">
        <organization>ISRG</organization>
        <address>
          <email>dcook@divviup.org</email>
        </address>
      </contact>
      <contact initials="S." surname="Ganta" fullname="Suman Ganta">
        <organization>Apple</organization>
        <address>
          <email>sganta2@apple.com</email>
        </address>
      </contact>
      <contact initials="A." surname="Ghani" fullname="Ameer Ghani">
        <organization>ISRG</organization>
        <address>
          <email>inahga@divviup.org</email>
        </address>
      </contact>
      <contact initials="K." surname="Guo" fullname="Kristine Guo">
        <organization>Apple</organization>
        <address>
          <email>kristine_guo@apple.com</email>
        </address>
      </contact>
      <contact initials="C." surname="Harrison" fullname="Charlie Harrison">
        <organization>Google</organization>
        <address>
          <email>csharrison@chromium.org</email>
        </address>
      </contact>
      <contact initials="J.C." surname="Jones" fullname="J.C. Jones">
        <organization>ISRG</organization>
        <address>
          <email>ietf@insufficient.coffee</email>
        </address>
      </contact>
      <contact initials="A." surname="Koshelev" fullname="Alex Koshelev">
        <organization>Meta</organization>
        <address>
          <email>koshelev@meta.com</email>
        </address>
      </contact>
      <contact initials="P." surname="Saint-Andre" fullname="Peter Saint-Andre">
        <organization/>
        <address>
          <email>stpeter@gmail.com</email>
        </address>
      </contact>
      <contact initials="S." surname="Sahib" fullname="Shivan Sahib">
        <organization>Brave</organization>
        <address>
          <email>shivankaulsahib@gmail.com</email>
        </address>
      </contact>
      <contact initials="P." surname="Schoppmann" fullname="Phillipp Schoppmann">
        <organization>Google</organization>
        <address>
          <email>schoppmann@google.com</email>
        </address>
      </contact>
      <contact initials="M." surname="Thomson" fullname="Martin Thomson">
        <organization>Mozilla</organization>
        <address>
          <email>mt@mozilla.com</email>
        </address>
      </contact>
      <contact initials="S." surname="Wang" fullname="Shan Wang">
        <organization>Apple</organization>
        <address>
          <email>shan_wang@apple.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y9634bx5Uv+r2foob+IDIGIIKkSImOM6Yl2ebEtjSinOyM
J0M0gSbZFoDGoBukGEnzLOdZzpOdda1aVd0gKdmZnb3P8JfQItBd11Wr1vW/
+v1+1pTNtDh0G8/KulmWZ6ummLiji4tlcZE3ZTV3L5dVU42rqTuvlvBHeZWP
b+C/RV0sr8r5hfuhyOvVspgV82Yjy8/OlsXVoXt29DKbVON5PoOmJ8v8vOmX
RXPeXyxm/Um+6A8PsnHeFBfV8ubQ1c0kq1dns7KuocPmZgHvHD9//U2WXRXz
VXGYOXexrFYLGORd/TvHr2/8uVq+wW+/xRfx81leTuFzGMBXOJJBtbzAj/Pl
+BI+vmyaRX348CE+hR+VV8VAH3uIHzw8W1bXdfEQ3n+I712UzeXqDN6kaV1f
4MwetieKj05honVjOjGvDLidQVl1vNzx0eCymU03YGEO3W6W5avmslrC+vSh
G/op5/Whez1w3xbVxSXs4Fy/4J14Xc7aX8EU83n5N9ptWPiTV9/qNwUvWlPO
LuClz3EgX13gZ4NxNcvSbp8O3Mu8aaqkz6eXS6CsanFZLJPv446fTqvV5BxW
v0i6H2MDC3rzriF8DUMom1k67a+X+XyCpBx9d+e8z+C1r/DXYArvtzp7PnCv
inpcLad53N3zZTlufZX0Np8UiwJ+zZuk0+LN8qtlcz5bt8RHA/fnqpqsX+Pk
gfsucn791WWRL+DMnJVNPZgXTZaN4TQSS4iJjPv8l6q+dEd5bTrqXMVf4Lmv
8rOiaYplOYdf0DQeq6zd4mp+U8BcinnU5tFiMU2H+ws+Ov4qx6/SleLGnuVX
5cQ9rao3dw1wMoaHvpqUV1flatE9spMV0I37Np83+Z1Dqy/wsZ3bxnY0K2Cj
vr2EjblrcOU8v7zIbx/dH3Hzy3nhvl1Vdw7vjTx8erGqbhvj08t8OS0L912+
hDeqeEu+raqLVsvj+lKe/QqObDUrV7M1+zwAOv6Xal7cSTt03IHyV+fn5biE
wwJjPT8vio4lnRZv3R+B1IppcRU1+0MRNk3XQJ77agbfdU//ZQGU6k5yoNj+
0XzSOi91s8AnunmREA3cIkA1J/lleRaNCNjRVas9evhNvprW+Pxt7b68LKfT
crFwJ+PLCu6FfH6Pzan9s19d0Pfdbf+QL4E43OvLapbu+Q/V36DfdClnzVcz
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
Z/O+vdAF7bHHwU/JwngV4kgIrmbB1W5H+MJmwVdT9VEmLi84dcUkC7OOfPWU
4h2v8bI4Z8nHTE25+Jkijt2EqdGyk6syrBHcZ/JHHwFlGVUajt73CodL8Cxq
WHhB2TgS5R8y4xX81mjynEJIjJ8zDBhmt9MEl9mQNtRXMG7FBxig7kjn2L8i
TcH2YNrzvJpILBUIBmd4IDPN1BdjAks5vdCuY9QTDLxilVT8L2GMpLD6L4Tl
a788/TBpBUMSbjSpiJ2qFlSiKyxeF2uDQGfKbDUnMZ7Eff5yNc1FxTU6UIw+
x1A8l5hpQJBUmV49PcK2wW3lzMOAqYKR8Dh2AeY5DoF8GkDDK0lpL0OxBUWO
2GOZbIBQRhFgVI7CxSf2ONEO4++EStlNFOyc9naQ1zxT1TNL+i1dg+htc+/e
1YiWoihVKJOUM5/BWasIv+VNY2rN00CpqNBAL4RV2gzLEB0bFG0rDMOiv3vH
D8jxiZworvVj7+Fhx/fdlnv5GfT7n6NdvvMVnte6Vx/Qq6lD4c4eHXoKfOfJ
z+etT4LrQAfVHub6EURRYN4dYz3v+qNWzPDVJ3WYPDFoTWyw/pvk5fcaYIYH
R0b+vv2NDLzV9YNWBw/Wf/NbzNX/XK195yp9R6YVxcDxj4ckDt/8ikFGnp87
KO2TKNr8WzjPjo4dXWmqlspn7XbkgaG+dPvk1g8keXrAMx10fdbZRvuF98o9
33d91tVI1xsPuN0H9jn9rHMgXS+058ef3bIaLRaTNnhXAx1ezI8iGT2yt5DO
FZHIVfRERxUCEyIvrkuEPmEBou9LDfR57TOnnszvQxECztSPBJ4kP970sZF9
CJe7jeQyNzxoSTDKPowuDOBDfO0z2ru/+Vv4Zc4YttE3dTGvbSgUXvXeHh5k
KFDcfxmtiS8hpP+4QNNyRdC/GHkCcuk068pxIAUkXXM2XMHSjd6MgqDBdjO6
1eHzLIrAH9CjJm98VLqH7pdRT4wwGm0UDNpJxlhGIhhMlPy2IMWRdElJ51l2
QlKKVwJEQPAW+Qg7s1O0QxPlu3fG+9Yf5wsu5QHTtJLPhMt/dDdE8WiTFfoK
MhZCL8pQGqxcqm+K/KNWhkpSJiTqaTxegWwWcr9Gs5FoG5IqJS6iSp3Znqoy
W1RjENGpL+8QtSTo/bEszbIpvJ6J9JhOF70QvkoXOTFipT0ep36XtZa/3Q5t
GyZw23ZEHeDz4DczzvRQMAg/sbYUSd/35ftb5UgyLLV5wFqm5flZB2Ncd7Ou
l+DWXuDaS4dEsU7IuMq8O5Iu0iF+GH+04zS+Jf68/PQBtuSLwdqLY+1dgVcF
Dqt1VWgbn8vSft5v397UG9OL1zQcR9B0B9+13m/fOLVOW+xvwDW9qy0dY1um
vJcg1VqeTuLxk21tQ+e++NZbNNJJNFdJmjH9JB8wucTlL+AHWcPQtoUf7LR6
wE9/8cSVjLn1gX66/oWU2gbJC21pt4M236+X4NMP3rdeSPatLaWlL9xPjIpe
oLPQsTTxAxk3as9Gh7ybHp735s7xQXqRgGu+9xoWPhAzYZe81f4eBvhA+jUj
7JKD7ddhZ25bh/B14JMdIXX+J3ydaf6UuUFiSpZJxw/YYa3vJnwdnr+6/fkr
/3zXwKIT1TWwnU8f2HtdmdueZ9m8a2iz+Pmuwc0+cTMfRCTR7/gn/7WezbpE
qXCcTNGVdHubRoHCVl/k/I/VK25RYkjBuLfU7TZJK5AyYGq5jNL8elmXOQEF
sg5jwpZImtCDvJUk0oKgjF/Kq4mM/zqZWsjERg+/vy6j6JRskzx1WiKX9Ifa
hLiwu3yxLBlMJ3qXUs8ovJ/CqQhWhuVzTa8s8oti2TdjQr+0eNo1j0a83ASb
fWnz/TNrse6AmLZio5Wr6MdIVT5sWD57kylpx5z/fcdFL5+1L9n36XFufWA/
MwLOwJ4SGtfAfGAsceEzuhoi3GtqOPmED3H8YaZs3DD4B+YDY30Ln+nZfe/S
+OX0A/2Mn79Kv259oJ9lbhpRN/wkH9CWRZ9RH3x4zJXAH8TCDX/2JjCZewlo
RsC9l4RGTOwyOoftD2ga0WeZHeM9J3ILF2wxwGcEdugji3w15+T8EJuzmcR1
z8VIBBhVEfEeUXLFY0K/IjU3bk4A9zQukthaq4OGKhb4fGy0o/AiyTMWECAC
Gbjd99CyVt5H17iFNOhzfjyVFSOGMWg93nVauv4wMgb/xHcD/MiVoo932KYj
z0H0x8cPZqAyqXyU/h0//t5Xw1E5J/47bV15kjX927/Tlfm4seNPemCjv9PH
o4V3JqWj4/HUSdN22vyqsQ9Skkr//nxgHvfvyhXa5UHyb38eRP71za9zuawz
eVxl3yeM/LsWs4vHI3/fxtOYtvs8qS7OFt1xLU7Hr0eGYhNBE3mCf/KAa1am
IdiidhQkpa1Q+mbkSmf4JA+eVF0U5EJnhte00O0p55xCL9sGwGA/jKzSvgBs
FG9tJEjgn5SHiiX9JCkHC9z4oPRWrDQLciEHSAIrA7v2zHk1J2+rsueutJAB
otWNi6zxZUjzKWK/rkvj7LXHw1eft8dnaRci23YrCamJ0aWBHrxuCEHDdnda
5lYXUT4DgzqktCO+9Yxi5kETbwVEecAODrP3CSxhoTnOlYKbUnOsmWwU5VnO
8guM32AQXipG0Nlo3W7JCfK+u6xWS4pdLwh5nZIhh9u97W36v0GkDXG9a+9Y
DmQ2N+q9TLNGvhq0NMjPE44kwrF/w/ur1rXd8mdd3fGG//7X2Rw+ZWjvbzU7
mO9/rd3h0wZ3m+nBfH8/20P3AGe/wQD5NyPMiWq75g3vyqS/rLk4+d5LeMYq
1xZ4ku8z+ZIvhiggwpn/8tcqWbyXt+Ir4PPkNHyefC9TehA91fYcJ99HR3J9
TIJLVo1X5vafq0ChKZSX/9HEn/j7jx9UOzKlHwnc3d9n2LoJSzFJzqH37u+x
0y7/QWfqbvT933nF4Sdc7ans6pLvefmlj7Wb1Pn1J06jpSokP/774D5JtYWk
6fC976SlMSQ//vv/S6jf/6ROlFSav83smrZlf1q70npVRcFbGule9fQntf7K
Tyq83KYhBEHwYy2/3SIkKwucAvsTAbK/+wzrRPapZMQHD8hioOMQbIh6opcY
kvnJcLj94YOvxsRSa80yMcKrZXFtGgxJRlB5weogkA5vV06iLbd6LQsoJv6k
MRdbvVYFy3bccy8GkBchPDMP+u84Svo5p0RKjSlOef7p1fdYOEM+g79YegyC
OOJ/c4WUaYkLPcUA4LlKv1QD5IySgv+k/6QGCqoDqPoGt2BAPVR1CSHZVLeR
UIZCQ6N3bDr8wLkso3dsgsM/l5ILMVboXY4hh106enmM8wjZ4G1FC+PSizEn
kw+SHgl1pZx8GPXgD7NXFIeUfl70adHlc87NH70LW+dfWjNgqQ++Hu0l8R6j
/4IfR4MhJqRGJKV8ix/pogJsLwbNDE3q89JsvEqkQ3FOFMG9E+gj3E8V7zGp
yLDqfcTv7wGPWVBugPsad2R/D6du6/nmSTSJC1V9a/eIhrgriXlwHvf29x6T
+hfpUxcCYydmWdzyDTzs9eHDh/LQYFzNHuaL8uEkX2ARDFntjfNtN9x3u3vZ
3oHb3Xd7Yzc+d8MzN952xa7Lz905fJK7/cfuYNeNn7jxrns8dOfwZO7GE3f+
xG3vYNXB/R13/tjtnru9fXz3YCcbPnHFwYZi43Vs3caTR26MeUju0dAVQ5c/
cQeP3M4udna27SZP3P4QO4AW94fZzuMNt7m7w8m1+1QGAjTWptDa9HUvrCzv
wyVMHe5ZUDanxIbCwc788XlIKuhDT+oPzThPkdk87CR8STyBnY8Odza6ZdWl
q8df/2X71d/+7Ye/vb062ts/fXwzu/zbzfjF10/eLH/s/+vxt3+5ujh9VX99
820xbg9mOj7Ifyq+XUxOfqzqH6eX/Z/+7fKPR5jI5tM8IowEzCimyjbCviXb
1lYu8SF8zH+IUYQiMdO8JKO5QIv6G6HnSpvtoLWqLvA2RSYHpE8l5CZZOSlm
i6opBMBDcCCay2pSm4TM2j0Z7AyGtLv4L0/w0l1mT+CWmI2kWAo2eYJ3mdZZ
sGgoDP+QlmfBgRGDmXBeOaZqutffnwA9Yh0NSuio9XSDMlaMsdhpxLLDavSy
gB22O9iTsgXuSCuQYwbNKykT852UUMoyxhQ+jxJqyPsY8JnVYUl1l+j+CS0i
vAHnO2WKcIG2oHyBKaZLhDEVGK+xyB9CAGjPodIgWlWZEmukQ0ajoJx1xc2W
9UNj5FjgDXINr5wgOKNPq7LVoXKlLowALWdUiItGpPh/WNl2tqD6jJQXBRdW
NblRPLMAzkxo7StM5p4UeJ37NfdlIoaPBrsmW1lakxIZki9MBdua5U3/6Lwh
42IxnaxpbRuID9sjKl5dXFBtH7eAs1FqoVhMXFIMCAst/jr+gK2N+KagRyju
PLuEhRudhTXBctx6KBFcIHqOhJNjcWpbIulF7T1gCD/BgCaM2Uz3ToBZv9fv
LzVJI0yFd/tBHRZys4vOaZV2aNV9lp1Lh6sobvhPxJLwpa+wp2ys+eMEJMGU
wbnTsgRyxu2CyqbisRdICx7kgzraXpkX7TJDLo7hnGeE0AZ/AmeSgehomXYs
uQc8OY0avcZUU4oimJQT3R0ZvS8CxVAZkv8frYfm+/csuiOVW8KUSt+dl4bM
fibyQifZ7tJuEOSnP4bcDA/sHKvF9UKO7BhlEZgLcbj8jDK1tWupUIucZZxz
RAMmDEILq2Vhd0XWiiERuRw8c6qoa3P6CXQHMUWk3jlNOmsfpQd1sqJrljKd
zsesI5mOb1+r7GPWynWu1bFWlhT1SGOiQ82vSqEu6fhHdzVng96wEoJrPcmi
C4Aj3ekRzr6bQGMVlUzIiV6R1yfpl5F0AFTMJZCv/OllE7vgBJirQdA+Fa0K
ay7N2YHAMIbQFcbT+yZKBteIpi9VC/l2pO0+Yeb+FLNAsyyCa/IDbZjvUgb4
D0d/odOPV6e5GEzBBa4DCfoLMJi8rhmWMUoPFNmHOYckM0bwU9hJg1WeTTcZ
dSO1KAhgixOvp9w/MXWkAewz8XXsgHzcusezne1tosC9J0+w2b3tbV6Wl/ao
f5/PL1agrWfZnwtfPjtiBlN5IkGAx1pKe3v7hj+ADk+cEJ/KFIYrzecduOeo
xfD9jNgK8gffWaG2GxXWQAE888ospnYLEp8ZgIpCKv0cxVIYpv7TF/1YPOvA
Fp8BS0c8KyRNdPjk01hS8qwgpKrUq7O6IGrOEhxBfo9PMafA4CFRKC5EmsUz
r46pnOrbz4tpQKK5rhJoQiCMFT5CDIASUrJ8vv7o9dx3N2dLuEekPMAf4Qg/
D4UTNgW7/kvi84+3UVmN4BsoV54voKYg7WMJd9yCE3EJZZlyN6QSn8VW5kny
yGiSveiGTcTksg6cCrb8ugCBAvVVOqNZ/PDAHaEPMm5A0JQV8gbz8Ks699iz
1DXCNCDhYFEIc3LI/vHu3T+/QKLZwaXYP9jDIm5jGA1L7cxPI50PwY3g+WpZ
/o1HQF2wRACqNazsP7dlvuFgX+7PKJmJ1Xaq7HETttEX3YbhkcYg+c9WcZAG
NBzQLEqRAkIQj5VyAjRfHN7ezhAmaiHzHCeoEAlEzfkjKSWrM1NpjEvWMjyT
wgadT4u3JaUheZTfanmRz2W9UKhfTCsaGnJcGD0x3GhbgYHgkSjrWYATwdYY
0UjuswEilFNZbGzrmvAeYuIIrWR0xfF7Kqaa40LwEKumLpXVmopzCAw3rhYF
VZHoLMVpFUM5CsHUZpkIURxbyOqAcEYMcEnJROV8ZeHDvD2SaZkMCjUTWcuI
SbvrXTHt5lXBSE2d1LSMiZtOTFMDO+jgim9jyRHMIo9xnUWMmTVVNIbrmP+r
1jreGTj8fEuHy7fmgy96DcLjTNAIIMeCqjMQtyi4uU18au/tW/zmEfyHrsyC
jDdBwRcpOcA1DR/F9oAtopgFouM3DItOkCk0gkSCFxgdEdXMwAlERVQKtRbk
vkx2AmjFRykuvyyGeLUE7D06QDxMLYhr1FqQe8+z1qcM3iNx1hJk3dV+z2uP
Ku6gJOq1OryfkrXmueKJxxrTYzzs9OCqqXBC4zAOhMOnfenFpyqqjutPS+Z3
t0HAajYmIHuQSW9QpWVWvOAwvXevseDJWu/LM6rXuQi5QL/lz/vs/WH/lp/b
v/3VPxjJJoBtPwgHT2Z/5Fm7LeOSd8oLAXuJIB7zZc1gKx4ziBCtFCCOwuhW
c1+ufoJlatLO/TGRvoO4oAdmNedAeTEVt5s1OaD/AqL/RzbbNghzDxQgcCz4
gS2aee3hcc6qFdLiDVvniBRbEW+kiRWyIrI8VOTvBMbfalhDvQJ8YbsWVFSy
zzZrFiOUuXx/S/4C5xCKgBBgkKJNpE9/gBuSvm1RkIEYmpSwyFSOwBbk9sFx
hJVUpMUftV/uDDT4xZq+ZCK3dai10LEVvQwI29tO3usZfnJYWWiaL9r9Hak+
7vfSY/9FdbloVoraFCFI0fyCOmBmupp7WeM513YJHOg9Fp+SBN0wgkIfq90U
uXXAIQwE7Z/BThDufLWc9+tFPi76cveRW9d96Qj0nD8TuPO6MDXdSZ7xBbjk
XdBm+lh/mhq0C/zTqx+d/0LLHkHXh2XRnB8SvdWHi8XscJIvDqmxw5gxqWTI
E+Ok+eLtZb6q8TJmfV+ONarGIEtC635YBWPOwTCOmR1lglCKapRqpflZhS2d
iG6vRZK9TtuaB4cdsiCC48GxhYpVxsjtjo9+RFK5QKjeG0UX8ivvDcMbfKVu
gOiqRxpbeikXLgfimvsvbLCXCAg0ag66fzm2woGVPdSr5jE5ZTxryleI7s1X
vvScpZbruR0CVXbHwu4yDeN+bgiszfoh0eGY7e+ZGsxoikXN/hy4IhUzpxLj
+XRxmYNuyyx6jrrthPR+U0XvXj7JY+U9CN4/0VU2YgVPWYSHUtcM1UGiEA7W
ZKUpo8pPXkDh4wFSYt5EKLjnK1BJgXRSqwtW4+IXcQzwbvYgpvoHG4564JIh
Kh6GOta4FCLPkKs32/iYM7Whh8o3uKpFmmKgsw0yJLJ3dCOfFmpU/PefyfLG
o5Gr89//ihXpfXlzRiHrNOiBAjam86jAbdwOojJyiXdGM8wIKMJiQRpLuhU0
yYPQFjS51dV8ipHDwXltEQw/C7hzocK8e/eZjlsCUKjMEpXRmeW/UNaesemw
Mj4vBCPVsxPS07SinGfVcie0yiT00kjqKAglKaf0C1rk4RaR7AMLJRY0qobr
MXBUfK/tvU+VPzQUXMbA8FOuMxuVl5GQbTVlrp0C9RHHv0g8i7fTxaaxW4J8
TFyPgMNlioR3restbQa7tOKwetODt3OwtxnXh1XJr6nGD2kBgQoQ55uK//Qn
4TOE/HQjTrc6fjayyZSreQnXMALxkdkH8yo9kIRGQDHSNelQZLXg+oUY7N1M
6741mWbVIofmnHb183D/r19QYFY2elVNixFwUDixAcqdcP5RWlvNWETvPHrr
esPG3LvMV2KslpvbFMrCR2lzSH9waM/mDv3BkQmbu/TH5s6jR1vZB4dD02F+
t3hTPC0XQHw46xGjxqqYbWplEttvmRIZOAXuOwJEx9NVqJeMIhIRNpa7oPvq
eDLShSfgmeAipAqc0aWWyXUXR4CtW5oVUOljZ3v6IsvYTk8rZr+Rfk5LeAZr
WtAWwlR/PxwMdv5juN8f/sF8schv8Ijzl7s79OUHFy+bLqZvOJomOaRa84vd
mF6xyU21BFg7+LfEaMk4Ri5UqFIGJUVtWZgKEPC+aKkbnRT5FG/wTSzlKDX9
Bu57csPUehdHd4LY6uybWMzKWMTLZuXRgUbP0f8u1ENg2iATXMAVRJE1bNhf
t3W6Sx8cNSJrKQYjtlCPSSGYcL3J4GhrJTWlwFiIANqdiOFNUd7eK4nfwZqH
p+3wrpOIH6IzTQ4i6QWnXm2QE8mDO1U4Wzma8ukEpE+Q0OWIIrWfihJw6slp
cy98KUfrlO7NzUf0BVZfPOVrRj7fp8+p5FnxdoE2980D+khEi1MhuM3HdixN
VZ0W+XJ6s/kkvA8i8ync40uaD0+zWjUIuz+REW4OhzF/odZoB2U3KdEMU4B6
7pkP70SyPpYYCOTjlCPUgMyFDHztKQcZFFt6iU4KVJDgnJuPpT9g/9FDI/Uh
Mvy30cUFZrpdtlIqv88n2cSPmD2HrARw3TXtQNC2vUJOtwcuX7YuBBGFOu5i
Wei4bNgZGwnDQJMJ1ZiJJbUfny+q8WUvMxdz7WOIhvv48rt3L1+cHP8vEKxh
7OQ+Yem5tQ4ux6iHbPjkYLu/PYT/ue3tQ/qf++n10x6W4BEsWbhmFmH16CCG
U4QzflBnI1ykU79IGFr2AmQAGovz200JanmpgplU/NiMbbg0LsRGYHcTNZGZ
Js4ljAjFSJbokwYu0Asr0v4WDZJbIubpNwOdLeQQo1KUlIiIWsGNoD5rBZvC
D0T96qp9UnwHjivz077tzgKy1QMhpBvOB0pgSGSfSCC81Rludd6x0Z075lo7
5o6c0j8uTha5snh8HCBHlUh1VaT8za38HhgGjtgRb8ELV2fuO8SLVhmErE7g
F7o6kc2b2pJVo+rQ2tTAcBrMMLjMp+f9alHMv1B/Ys+N6O0RG85IYeZEz9Em
N/u5b21rxKV8+SFEoOOFEM+kUDAuq7bJWbgjHcSom+YpTkbDwqgenG22+M8V
B4thIiYFJ/n2BjpC/4EOdZTFPfGL6u7t7odDjmRMvjPYfB+xFrep7rRbW53H
zc7xbpZ23Zp2yzl76ZaMXG5qC/heLEX8Jmc3i/k6Q2V/5p6zLaDOshO09qEX
c92RwUkMQw0LJ3fRSOrOcqw36EbDnd29R/sHj5+EI82yYsoeR/7J7RHFeexs
bz/pb4Mouut2dg93h4e72xlwZ+pKD1HaHbQyHNmewtlA4hyaEVOVJEOq3JA5
HWHkeDzka09w9MTQdJXZHROdFBeZ/nXbZHG/5O/H29s8+axj8ng14bPJV7uH
O/SVwJ0TSgaqj4JaD4I+SacdiqLE5lDxA3OpK2AntTSibJ8RQw6J7IUK6CgE
JLMC809cVcsXxiEz4pE3w+HdROkzWvzGa8JW0dZeY6xQtc/BeEVbMfK2FuPI
1H7D9Tu0aN7ry5WUnc25aT5zaUVfrjnFAWtinkGdefTjix+fPj89Of6358Tc
JIheoDTJJqsPFxIGFEqQBR8gd4x7QnYYjmA5oRyw3wEvA0FM/zi6uCBXCP9T
P+US5sUy/VssZ2Q3IIfV00j1AlmzLZKh1Eg21+iQSL67hWsPZQS4OB0FpEvg
qa2GrRnsjMJfsXNi4aENOBErBtUny0sUrKAlXzKueqFeEgx7jNVJD0FVUqXE
Yrziey+2HGqNF7OVPnKC9seXqSMzLy6Hp39YjlmlVQSCqeLIFwpKjStSJYpC
NNmYvU6fEurFrTp+9vPujlpRXhs7uAbQ5+5iWp3RanOHwLjgt6QEEBWmFSib
KCPKTqiuq3FJNjOi9rIhOnytx03CwPDhmXdhI722SkKrHSsGwgq6tm+SS2VR
FB8hBp2vlhzaFUa1yX6XILNJhjOpb3j4qLDVd7BTFRaeGG1hrtURGeS1mGds
XeCQDrirMIcr2N4ksugcnZ93NeErJ97eRHCpziiWkk58WUflGhjgFr+v6VRc
lcW1CZgKq40qbxUKmqAcfLGsVgvNfpNjhP2OSFUt/Z21Ge6vrUOn0NZ8VUWK
RxIKREssN5WEvDsuSNNZhYy7Tu7/zUQS3zrsUhhXtbJ2WR50aRVkjzWK8Ie1
oCaSjschpt7BszwrmyU6soGJX3KI3FwK8NryviaQIyHaNI0tzg4wGN9RUZoy
cCObhtd15uiAjWB/T9lYghjZuGasDeli1TPE/AaO1/aae5c5V7eVcD/ifLwK
KAdRJWKspzUvZ6uZPI9d8a7eUDh/7i7LCzx7k4L56jm0J6V4Bu47aPaKy4si
bwNePuO0E66pVquzWsKE/eKR5EDRddwgm/cSVmFX3DMJXBhv2j0law+vKq5P
sGDqGrWtsfGN4HsPzoJNtfGJ+yI2rn7h+IByOUlEAWdocToUXbWoOqya+fSi
WsL+z/hsWMvUm+IGJtIWVGQ6LRQzBy9w0IGpphyhv9Pdhk+p4NaBXxmjr3SG
04lXerxalpREREGqsleE0hbWjM6nHWQfuuccylKEuXjF15wMWjmpdfmGYu7V
qMsZYdkaQvD37YM6usfQRDCbrdj/qXIWJoQT19GQ8oDaQ3oShvVDV1JU2TTH
gsSyIgYhoxQj87R8UwT/Q5fd3grJre3ksmt+RdAyUVyri+Uz8vLgSf0BL4ce
/6FC5b+uoLGCHT4dFwhpLa1CW750Jyy+rzDaGHbia5vlboPa3aAFMthPIYvK
UJbvAO6EWf6GbTEbFFuy4bmAodWMdcxS40+oOjF24MN1koICgyD8wFabK1WD
6agkcno9+jggez/28LGMHW8qedLDXNsvwFm5kKopIQ08WDpa58HXSMN7RfmZ
U6mlFAbYiyoEe52cSstyvJnaamxhvCyL5ALgOzZokK7YfrjdySrDfq6+Fn4c
mTHUGaUcCNZqTcuEdGae0DQKVbJgH89XxLRVVlY8MQkYwkuuXoVQGsX2SfBi
FZORXYkehsHicXVUWgNdJ6l4Cr1crFAwkaur8Bcy4QRcFTdK0WYwcTFpSleJ
YoPvBZEgQR1zfSkmew+1hkmpprkQp/anUJqYC40QY+mHisUfJOEcyUQu8sa7
sVt1zy+rqubYqO7QN1ytLC4GG922Ym8yihn7lN3X8sV4XCzYmJrWnvbLay7Q
Vsx0VH6cwgdDKITJllyLO8zBgSmAgxWdUN2ccArYcOCeFRRNQVJQuEPdCDo4
pYZHfPjR3KhK8ygGBhD/oHPEpDGgOKTnSMJao1FIa8cdKgjDoF6t5nzXD8r6
lD7fpBaLyakfV8/9/NetUU8SYUat70eS44njki+jGeCZ962zBTav41ylUHx4
l6UfrclLcySbP+MwSmTa6PVyVYzuMVtsKkwY2iLui+GJNecXS+HZO9ZMG4Cz
85MvJqfKybvPbDBJlmlQCifFlWPWeDsjVJj6ROtVzsvRXDUmGPminXx6N3pk
BlUxwegWahnVr7Qu9mujAcbYqrhnmiISVCSteR944TqRTHTCrhwHFAdIvoiN
N5qZ8e4zK71m2dfB6q5lBHMffcm5wDTuaM242j2aVtDl6kWzLJWkU7RLUtY6
ROVIUMaMIWzMy8TIzcoxsU/d3ShnskOeJh6UQm2aPO+cUj1RYPRrWC0/PExl
RlumvZ3OYJSL78u6GfW04OOkzDngbcNoOQ8Xi1l/ki++EGPil2Yf+hhcySJU
q1VPkhFwuVVsyMOKDm5g4JzLIoF/CwqvQxuPCP2SbZTPjRpq81898GR7Seuo
2o/TtL6guIBkgt/m84KigNf5scK4XTzR3w+3TSDJ2igUDj/Bj/5YzODvN8Xs
1Hw2OcfPJufmsyMgWfgwh/+YT9loill/jIGMepYPUaHOYBCidUXPR/EuqH4P
90030Uc0wvgTHJ+x0i2qmuvRip6AZ2EUWkN0H9+QMHPfzEhkV2XmGSee4tYF
u/kBaVnW6MA51IpK4SuLjjD8xoyCDo+lMk7ty1LyFHFPeIdJ0C7PyWZhQxv1
Asnl+k7b+kKebx0BdK9RlAu6Mn6H8bGGQEEiv8LMv86K9/7+Jqu0T2/74/Mf
eu6Pz74RkKSj50fPgg4OrBlpPFk3g3wwhrURoYPznySUrE82Mf1WI2/V7Jd5
1IAhXq22bWS5VCqrmtLrRgkNaK/4ef8pP5VdCh/WtCh2WNmobGHYsTaLCL5A
6HXUvcY7n+dXgkySDIIDdK+qEmVnsho38sSyCAIqqDBkgIVDTjKDcqFJfpNW
Y5YOJaGv4MBFFCj9FU3TrqYTGi1reQ0GT8CV01yXjAucLlVpTHU82qgotlSF
to5J5lEIGJThffCQlSN7DWTfVXVz6AyWECfJPxwOhug5y3BDcOvRRXboPobf
Z9GOHoJq9baPzz3e34N2M/FSbf4M9GmYIUhUE/elGz7Z69FfzP/gk+2329sI
EEIfEgOUD7eH/KEwwOTTwP3gi5/hm2EPv9+h37v0e6+HSKZ/xectf+x1D+yg
Y1w7HzGu3TXj2jMj4tEN143rr1shfkpKNYv4E9drVFBiE56v9KeHtiewD4mI
ljeZR4Nr4VdJGxgFEiQpA37BrkfkpTw4GVtbfnC3yg8i98KB3OjJdbmSLHGB
AVjnNzK7pl5cjWXjC5IiTBoKDHMu5OfInoRMnN/bK1sj2H6QwNb4Eo+/0+5m
/tkQOcqdkJzM7Uv4qEvCRyVk99QHfp4SUj2/2fE4B/Wue1xH3zVqpYqfZelP
OUzzr/hWtIVys39Hqlr8sOppTkI8xVQUJZiPmZd0A/7sI6yVx02M06OC2pJH
bj1x0o+6fAuUIip+hWQ3aKxSGkI/U3tufFBgOHBWQwsoRLT9mbV9w6XiAsN4
NIV6kvAHRXXkuNgbiE6gKk1AoCcvpRokaRfRk7e4FC2PbNGFPswuEGlP+qCM
XMcjbii6RDaFY58a47kTtQeTOnWAk/By6ySE7ZWoKlk+aSY8SN4CGdW7d1KU
IHxN4lrogIjTtx1V+BadXPgShzlIafYgyrBV1sVvzsqLS8piJZmqJ54ZEllC
zAQP47Yj5ofl/aQh8N3UjOCGbjt8viHvLV3XUCTHUiIcOR18JkoK9EC2vFCA
3sOg4haAFspCG77B1kSNhkTjWG8NHgeRLOExWGSNbFYUjZK5cYSQSL4GYeWD
CiNyGL4uLvOrEgRczBn3h0JZZc+q6GfFBR72s5uw5aiq23CLUBpHy96ouTqi
hXDz4aZj7lGLhgxEoHs0GGaYcsb2oa1e6+bEkAMbByRX0KIuVpOKEeQsaUt5
IP6j3oKr/k9oDqNBbNIp2YArrz882HDv33NgdTlhAcFMlj/wLEj+hPn2MpEE
vKt7Eo685FSzYzU0Fk7bNC85qcV2lV7jYekQbPUH244Jk8DbfGBZrRlI7MRi
QZ543Ci+M0c9G2YFvdECS6swWckjMLxSrZywY3LrpNZMMWUaCxjPg9vT2BHM
JEQWUVBiFjHm4Bi6gw/jONkZbXnwKGzzyFAaeZkluxURfmxpJ744zsslp8ha
xmPr5/SMWwYD81LeEuurZHy8hrFLIW5b66YFVOJlrHvIVUZoQs94U6yTmu7I
mHmpRBjCur7wJN1uun0N8SPte8gbKwm4Fk+MUZrFvNhxO23J9aRpNdJdeJfw
My3P/hFej5iXMHdZ8VHHDEexDLsJspB7/uz49YtXh+6Fhu/74Kwz2GdOOnDw
YA+z5oiO6qZaSHCD8qjJMj9vMkyAZoMqNIJ5skAqaHDm/KL8QjPxutJoJUWA
2ACiJ2eeP3G6KkL7DrZaTA/m3NMdBibn04MWb5BZSRt24YjfoY6D/+V8r1NM
g+NkFM8yT/McbirPqeytGjjf4k0qQaBW1ZHl2JlRRgEJOJIoDpbMNJysp7Az
BS3UppTpCRtOcVYjMwc/mriBgJ+1if3tjLpM7fjN7gjJNTa2cyedC9FNpJ10
R40ky6tJMBo1OgrPH+VoofPQdsa1SNmGlq2ztB2gaeg0LiSmPCRhAjED0QuP
6sw/EwdOklCbWP32B0MxrONYxqQD1auyKVwERHqv3b87HYHCD/Vy/uI30fU+
uGiVheWtSTg+izBtE6Va72iC+yEP+ssXJ68VPdSLrqner7KZkJ6RzS5jmF1s
JVHGYlOBv0QVhLkhm61WNM0iF1wH7jJ7zjq6IUi+KfpNxI3mz8lZMKFRXls2
ilPjR6FNdTlJgKvz0DJWRhInHQjHHU2nKDfSeLvwqpeOCSDM+5AjH6AMp6ZI
sdwbjjOPIEWAxQToRL1Qpj4aB6fTwEa4Q3TJUj4mrxoBcc4N+G9e2+xNilK6
g+WbASa+IKaupF6vt+9wUqZRwo2FZ3QPCw+DcIwY3dgLIQbG2BvXP830Yw8t
jZW3NthEeBqMFNplH7HfC3jBelMJr8atlhIQNCvN/RbBtZyL9i+zhrVGNjZH
VpaN2sMYaYmOOBKUgmq6UWwYp0jD1AXx1C7wQH3OGT1vKRhhX/H0SDFT/0Yw
N6aYZOwoWSyK3KM/Uw4cG7Dz9LwMTPCHOmTNoD2Zx2EVlLuH56hrgSjYxy8F
X8dMEXDleeGARRLOChsZEhlhEEwbQgBBu3FceqwEvUzAeEmCt/YvOl1srsrI
PUmiQ0hGxClr+lbbdiYnW1u4L1OL8s15lTvtDb0MGF6tan18nTP8hoe3HiWp
vaOB84A0fGllAsdFokTrcW7PouEJwyYLwPyGPR2TlvONNgZ94R62/RwGeQk0
7m1W3gYowRylOs8nmayfXyYbkqHCugyHXXoaHqZuG+qZc9SPz72lAm5TYCoz
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

-->

</rfc>
