<?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.23 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-14" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.26.0 -->
  <front>
    <title abbrev="DAP">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-14"/>
    <author initials="T." surname="Geoghegan" fullname="Tim Geoghegan">
      <organization>ISRG</organization>
      <address>
        <email>timgeog+ietf@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Patton" fullname="Christopher Patton">
      <organization>Cloudflare</organization>
      <address>
        <email>chrispatton+ietf@gmail.com</email>
      </address>
    </author>
    <author initials="B." surname="Pitman" fullname="Brandon Pitman">
      <organization>ISRG</organization>
      <address>
        <email>bran@bran.land</email>
      </address>
    </author>
    <author initials="E." surname="Rescorla" fullname="Eric Rescorla">
      <organization>Independent</organization>
      <address>
        <email>ekr@rtfm.com</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2025" month="February" day="03"/>
    <abstract>
      <?line 126?>

<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, 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 (PPM) which can be used to collect aggregate data without
revealing any individual user'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 138?>

<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>14:</t>
        <ul spacing="normal">
          <li>
            <t>Enforce VDAF aggregation parameter validity. This is not relevant for Prio3,
which requires only that reports be aggregated at most once. It is relevant
for VDAFs for which validity depends on how many times a report might be
aggregated (at most once in DAP). (*)</t>
          </li>
          <li>
            <t>Require all timestamps to be truncated by <tt>time_precision</tt>. (*)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-13 to 14 <xref target="VDAF"/>. There are no functional or
breaking changes in this draft.</t>
          </li>
          <li>
            <t>Clarify conditions for rejecting reports based on the report metadata,
including the timestamp and public and private extensions.</t>
          </li>
          <li>
            <t>Clarify that the Helper responds with 202 Accepted to an aggregation
continuation request.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-13" to "dap-14". (*)</t>
          </li>
        </ul>
        <t>13:</t>
        <ul spacing="normal">
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-12 to 13 <xref target="VDAF"/> and adopt the streaming
aggregation interface. Accordingly, clarify that DAP is only compatible with
VDAFs for which aggregation is order insensitive.</t>
          </li>
          <li>
            <t>Add public extensions to report metadata. (*)</t>
          </li>
          <li>
            <t>Improve extension points for batch modes. (*)</t>
          </li>
          <li>
            <t>During the upload interaction, allow the Leader to indicate to the Client which
set of report extensions it doesn't support.</t>
          </li>
          <li>
            <t>Add a start time to task parameters and require rejection of reports outside
of the time validity window. Incidentally, replace the task end time with a
task duration parameter.</t>
          </li>
          <li>
            <t>Clarify underspecified behavior around aggregation skew recovery.</t>
          </li>
          <li>
            <t>Improve IANA considerations and add guidelines for extending DAP.</t>
          </li>
          <li>
            <t>Rename "upload extension" to "report extension", and "prepare error" to
"report error", to better align the names of these types with their
functionality.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-12" to "dap-13". (*)</t>
          </li>
        </ul>
        <t>12:</t>
        <ul spacing="normal">
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-08 to 12 <xref target="VDAF"/>, and specify the newly-defined
application context string to be a concatenation of the DAP version in use
with the task ID. (*)</t>
          </li>
          <li>
            <t>Add support for "asynchronous" aggregation, based on the Leader polling the
Helper for the result of each step of aggregation. (*)</t>
          </li>
          <li>
            <t>Update collection semantics to match the new aggregation semantics introduced
in support of asynchronous aggregation. (*)</t>
          </li>
          <li>
            <t>Clarify the requirements around report replay protection, defining when and
how report IDs must be checked and stored in order to correctly detect
replays.</t>
          </li>
          <li>
            <t>Remove support for per-task HPKE configurations. (*)</t>
          </li>
          <li>
            <t>Rename "query type" to "batch mode", to align the name of this configuration
value with its functionality.</t>
          </li>
          <li>
            <t>Rename the "fixed-size" batch mode to "leader-selected", to align the name
with the behavior of this query type.</t>
          </li>
          <li>
            <t>Remove the <tt>max_batch_size</tt> parameter of the "fixed-size" batch mode.</t>
          </li>
          <li>
            <t>Restore the <tt>part_batch_selector</tt> field of the <tt>Collection</tt> structure, which
was removed in draft 11, as it is required to decrypt collection results in
some cases. (*)</t>
          </li>
          <li>
            <t>Update <tt>PrepareError</tt> allocations in order to remove an unused value and to
reserve the zero value for testing. (*)</t>
          </li>
          <li>
            <t>Document distributed-system and synchronization concerns in the operational
considerations section.</t>
          </li>
          <li>
            <t>Document additional storage and runtime requirements in the operational
considerations section.</t>
          </li>
          <li>
            <t>Document deviations from the presentation language of <xref section="3" sectionFormat="of" target="RFC8446"/> for structures described in this specification.</t>
          </li>
          <li>
            <t>Clarify that differential privacy mitigations can help with privacy, rather
than robustness, in the operational considerations section.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-11" to "dap-12". (*)</t>
          </li>
        </ul>
        <t>11:</t>
        <ul spacing="normal">
          <li>
            <t>Remove support for multi-collection of batches, as well as the fixed-size
query type's <tt>by_batch_id</tt> query. (*)</t>
          </li>
          <li>
            <t>Clarify purpose of report ID uniqueness.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-10" to "dap-11". (*)</t>
          </li>
        </ul>
        <t>10:</t>
        <ul spacing="normal">
          <li>
            <t>Editorial changes from httpdir early review.</t>
          </li>
          <li>
            <t>Poll collection jobs with HTTP GET instead of POST. (*)</t>
          </li>
          <li>
            <t>Upload reports with HTTP POST instead of PUT. (*)</t>
          </li>
          <li>
            <t>Clarify requirements for problem documents.</t>
          </li>
          <li>
            <t>Provide guidance on batch sizes when running VDAFs with non-trivial
aggregation parameters.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-09" to "dap-10". (*)</t>
          </li>
        </ul>
        <t>09:</t>
        <ul spacing="normal">
          <li>
            <t>Fixed-size queries: make the maximum batch size optional.</t>
          </li>
          <li>
            <t>Fixed-size queries: require current-batch queries to return distinct batches.</t>
          </li>
          <li>
            <t>Clarify requirements for compatible VDAFs.</t>
          </li>
          <li>
            <t>Clarify rules around creating and abandoning aggregation jobs.</t>
          </li>
          <li>
            <t>Recommend that all task parameters are visible to all parties.</t>
          </li>
          <li>
            <t>Revise security considerations section.</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-07 to 08 <xref target="VDAF"/>. (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-07" to "dap-09". (*)</t>
          </li>
        </ul>
        <t>08:</t>
        <ul spacing="normal">
          <li>
            <t>Clarify requirements for initializing aggregation jobs.</t>
          </li>
          <li>
            <t>Add more considerations for Sybil attacks.</t>
          </li>
          <li>
            <t>Expand guidance around choosing the VDAF verification key.</t>
          </li>
          <li>
            <t>Add an error type registry for the aggregation sub-protocol.</t>
          </li>
        </ul>
        <t>07:</t>
        <ul spacing="normal">
          <li>
            <t>Bump version tag from "dap-06" to "dap-07". This is a bug-fix revision: the
editors overlooked some changes we intended to pick up in the previous
version. (*)</t>
          </li>
        </ul>
        <t>06:</t>
        <ul spacing="normal">
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-06 to 07 <xref target="VDAF"/>. (*)</t>
          </li>
          <li>
            <t>Overhaul security considerations (#488).</t>
          </li>
          <li>
            <t>Adopt revised ping-pong interface in draft-irtf-cfrg-vdaf-07 (#494).</t>
          </li>
          <li>
            <t>Add aggregation parameter to <tt>AggregateShareAad</tt> (#498). (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-05" to "dap-06". (*)</t>
          </li>
        </ul>
        <t>05:</t>
        <ul spacing="normal">
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-05 to 06 <xref target="VDAF"/>. (*)</t>
          </li>
          <li>
            <t>Specialize the protocol for two-party VDAFs (i.e., one Leader and One
Helper). Accordingly, update the aggregation sub-protocol to use the new
"ping-pong" interface for two-party VDAFs introduced in
draft-irtf-cfrg-vdaf-06. (*)</t>
          </li>
          <li>
            <t>Allow the following actions to be safely retried: aggregation job creation,
collection job creation, and requesting the Helper's aggregate share.</t>
          </li>
          <li>
            <t>Merge error types that are related.</t>
          </li>
          <li>
            <t>Drop recommendation to generate IDs using a cryptographically secure
pseudorandom number generator wherever pseudorandomness is not required.</t>
          </li>
          <li>
            <t>Require HPKE config identifiers to be unique.</t>
          </li>
          <li>
            <t>Bump version tag from "dap-04" to "dap-05". (*)</t>
          </li>
        </ul>
        <t>04:</t>
        <ul spacing="normal">
          <li>
            <t>Introduce resource oriented HTTP API. (#278, #398, #400) (*)</t>
          </li>
          <li>
            <t>Clarify security requirements for choosing VDAF verify key. (#407, #411)</t>
          </li>
          <li>
            <t>Require Clients to provide nonce and random input when sharding inputs. (#394,
#425) (*)</t>
          </li>
          <li>
            <t>Add interval of time spanned by constituent reports to Collection message.
(#397, #403) (*)</t>
          </li>
          <li>
            <t>Update share validation requirements based on latest security analysis. (#408,
#410)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-03 to 05 <xref target="VDAF"/>. (#429) (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-03" to "dap-04". (#424) (*)</t>
          </li>
        </ul>
        <t>03:</t>
        <ul spacing="normal">
          <li>
            <t>Enrich the "fixed_size" query type to allow the Collector to request a
recently aggregated batch without knowing the batch ID in advance. ID
discovery was previously done out-of-band. (*)</t>
          </li>
          <li>
            <t>Allow Aggregators to advertise multiple HPKE configurations. (*)</t>
          </li>
          <li>
            <t>Clarify requirements for enforcing anti-replay. Namely, while it is sufficient
to detect repeated report IDs, it is also enough to detect repeated IDs and
timestamps.</t>
          </li>
          <li>
            <t>Remove the extensions from the Report and add extensions to the plaintext
payload of each ReportShare. (*)</t>
          </li>
          <li>
            <t>Clarify that extensions are mandatory to implement: If an Aggregator does not
recognize a ReportShare's extension, it must reject it.</t>
          </li>
          <li>
            <t>Clarify that Aggregators must reject any ReportShare with repeated extension
types.</t>
          </li>
          <li>
            <t>Specify explicitly how to serialize the Additional Authenticated Data (AAD)
string for HPKE encryption. This clarifies an ambiguity in the previous
version. (*)</t>
          </li>
          <li>
            <t>Change the length tag for the aggregation parameter to 32 bits. (*)</t>
          </li>
          <li>
            <t>Use the same prefix ("application") for all media types. (*)</t>
          </li>
          <li>
            <t>Make input share validation more explicit, including adding a new
ReportShareError variant, "report_too_early", for handling reports too far in
the future. (*)</t>
          </li>
          <li>
            <t>Improve alignment of problem details usage with <xref target="RFC7807"/>. Replace
"reportTooLate" problem document type with "repjortRejected" and clarify
handling of rejected reports in the upload sub-protocol. (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-02" to "dap-03". (*)</t>
          </li>
        </ul>
        <t>02:</t>
        <ul spacing="normal">
          <li>
            <t>Define a new task configuration parameter, called the "query type", that
allows tasks to partition reports into batches in different ways. In the
current draft, the Collector specifies a "query", which the Aggregators use to
guide selection of the batch. Two query types are defined: the "time_interval"
type captures the semantics of draft 01; and the "fixed_size" type allows the
Leader to partition the reports arbitrarily, subject to the constraint that
each batch is roughly the same size. (*)</t>
          </li>
          <li>
            <t>Define a new task configuration parameter, called the task "expiration", that
defines the lifetime of a given task.</t>
          </li>
          <li>
            <t>Specify requirements for HTTP request authentication rather than a concrete
scheme. (Draft 01 required the use of the <tt>DAP-Auth-Token</tt> header; this is now
optional.)</t>
          </li>
          <li>
            <t>Make "task_id" an optional parameter of the "/hpke_config" endpoint.</t>
          </li>
          <li>
            <t>Add report count to CollectResp message. (*)</t>
          </li>
          <li>
            <t>Increase message payload sizes to accommodate VDAFs with input and aggregate
shares larger than 2^16-1 bytes. (*)</t>
          </li>
          <li>
            <t>Bump draft-irtf-cfrg-vdaf-01 to 03 <xref target="VDAF"/>. (*)</t>
          </li>
          <li>
            <t>Bump version tag from "dap-01" to "dap-02". (*)</t>
          </li>
          <li>
            <t>Rename the report nonce to the "report ID" and move it to the top of the
structure. (*)</t>
          </li>
          <li>
            <t>Clarify when it is safe for an Aggregator to evict various data artifacts from
long-term storage.</t>
          </li>
        </ul>
      </section>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<section anchor="glossary-of-terms">
          <name>Glossary of Terms</name>
          <dl>
            <dt>Aggregate result:</dt>
            <dd>
              <t>The output of the aggregation function. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Aggregate share:</dt>
            <dd>
              <t>A secret share of the aggregate result computed by each Aggregator and
transmitted to the Collector. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Aggregation function:</dt>
            <dd>
              <t>The function computed over the measurements generated by the Clients and the
aggregation parameter selected by the Collector. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Aggregation parameter:</dt>
            <dd>
              <t>Parameter selected by the Collector used to prepare a batch of measurements
for aggregation. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Aggregator:</dt>
            <dd>
              <t>A server that receives report shares from Clients and validates and aggregates
them with the help of the other Aggregator. 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 duration:</dt>
            <dd>
              <t>The time difference between the oldest and newest report in a 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 DAP protocol role identifying a party that generates a measurement and
uploads a report. 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 computes the aggregate
result.</t>
            </dd>
            <dt>Helper:</dt>
            <dd>
              <t>The Aggregator that executes the aggregation and collection interactions
initiated by the Leader.</t>
            </dd>
            <dt>Input share:</dt>
            <dd>
              <t>An Aggregator's share of a measurement. The input shares are output by the
VDAF sharding algorithm. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Output share:</dt>
            <dd>
              <t>An Aggregator's share of the refined measurement resulting from successful
execution of VDAF preparation. Many output shares are combined into an
aggregate share during VDAF aggregation. As defined in <xref target="VDAF"/>.</t>
            </dd>
            <dt>Leader:</dt>
            <dd>
              <t>The Aggregator that coordinates aggregation and collection with the Helper.</t>
            </dd>
            <dt>Measurement:</dt>
            <dd>
              <t>A plaintext input emitted by a Client (e.g., a count, summand, or string),
before any encryption or secret sharing is applied. Depending on the VDAF in
use, multiple values may be grouped into a single measurement. As defined in
<xref target="VDAF"/>.</t>
            </dd>
            <dt>Minimum batch size:</dt>
            <dd>
              <t>The minimum number of reports that must be aggregated before a batch can be
collected.</t>
            </dd>
            <dt>Public share:</dt>
            <dd>
              <t>The 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 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>
          </dl>
        </section>
      </section>
      <section anchor="representation-language">
        <name>Representation Language</name>
        <t>With some exceptions, we use the presentation language defined in <xref section="3" sectionFormat="comma" target="RFC8446"/> to define messages in the DAP protocol. Encoding and decoding of
these messages as byte strings also follows <xref target="RFC8446"/>. We enumerate the
exceptions below.</t>
        <t><xref section="3.7" sectionFormat="of" target="RFC8446"/> defines a syntax for structure fields whose values
are constants. In this document, we do not use that notation, but use something
similar to describe specific variants of structures containing enumerated types,
described in <xref section="3.8" sectionFormat="comma" target="RFC8446"/>.</t>
        <t>For example, suppose we have an enumeration and a structure defined as follows:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  number(0),
  string(1),
  (255)
} ExampleEnum;

struct {
  uint32 always_present;
  ExampleEnum type;
  select (ExampleStruct.type) {
    case number: uint32 a_number;
    case string: opaque a_string<0..10>;
  };
} ExampleStruct;
]]></sourcecode>
        <t>Then we describe the specific variant of <tt>ExampleStruct</tt> where <tt>type == number</tt>
with a <tt>variant</tt> block as follows:</t>
        <sourcecode type="tls-presentation"><![CDATA[
variant {
  /* Field exists regardless of variant */
  uint32 always_present;
  ExampleEnum type = number;
  /* Only fields included in the `type == number`
     variant is described */
  uint32 a_number;
} ExampleStruct;
]]></sourcecode>
        <t>The protocol text accompanying this would explain how implementations should
handle the <tt>always_present</tt> and <tt>a_number</tt> fields, but not the <tt>type</tt> field.
This does not mean that the <tt>type</tt> field of <tt>ExampleStruct</tt> can only ever have
value <tt>number</tt>; it means only that it has this type in this instance.</t>
        <t>This notation can also be used in structures where the enum field does not
affect what fields are or are not present in the structure. For example:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  something(0),
  something_else(1),
  (255)
} FailureReason;

struct {
  FailureReason failure_reason;
  opaque another_field<0..256>;
} FailedOperation;
]]></sourcecode>
        <t>The protocol text might include a description like:</t>
        <sourcecode type="tls-presentation"><![CDATA[
variant {
  FailureReason failure_reason = something;
  opaque another_field<0..256>;
} FailedOperation;
]]></sourcecode>
        <t>Finally, by convention we do not specify the lower length limit of
variable-length vectors. Rather, the lower limit is always set to <tt>0</tt>.</t>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>The protocol is executed by a large set of Clients and a pair of servers
referred to as "Aggregators". Each Client's input to the protocol is its
measurement (or set of measurements, e.g., counts of some user behavior). Given
the input set of measurements <tt>meas_1, ..., meas_N</tt> held by the Clients, and an
"aggregation parameter" <tt>agg_param</tt> shared by the Aggregators, the goal of DAP
is to compute <tt>agg_result = F(agg_param, meas_1, ..., meas_N)</tt> for some
function <tt>F</tt> while revealing nothing else about the measurements. We call <tt>F</tt>
the "aggregation function" and <tt>agg_result</tt> the "aggregate result".</t>
      <t>DAP is extensible in that it allows for the addition of new cryptographic
schemes that compute different aggregation functions. In particular, the
aggregation function is determined by the Verifiable Distributed Aggregation
Function, or VDAF <xref target="VDAF"/>, used to securely
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 combined
into the aggregate result.</t>
        </li>
      </ul>
      <t>Note that some VDAFs allow measurements to be aggregated multiple times, each
time with a different aggregation parameter; however, DAP only allows each
measurement to be aggregated once. Similarly, some VDAFs produce aggregate
values which depend on the order in which the measurementas are aggregated;
however, 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"/>).</t>
      <section anchor="system-architecture">
        <name>System Architecture</name>
        <t>The overall system architecture is shown in <xref target="dap-topology"/>.</t>
        <figure anchor="dap-topology">
          <name>DAP architecture (who sends requests to whom).</name>
          <artwork><![CDATA[
+--------+
|        |
| Client +----+
|        |    |
+--------+    |
              |
+--------+    |     +------------+         +-----------+
|        |    +----->            |         |           |
| Client +---------->   Leader   <---------| Collector |
|        |    +----->            |         |           |
+--------+    |     +------------+         +-----------+
              |           |
+--------+    |           |
|        |    |           |
| Client +----+     +-----V------+
|        |          |            |
+--------+          |   Helper   |
                    |            |
                    +------------+
]]></artwork>
        </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 for the measurements
generated by the Clients. Any given measurement task will have a single
Collector.</t>
          </dd>
          <dt>Clients:</dt>
          <dd>
            <t>The parties which directly take the measurement(s) and report them to the
DAP protocol. 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 and aggregates them with the assistance of the Helper; and
it orchestrates the process of computing the aggregate result as requested by
the Collector.</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.</t>
          </dd>
        </dl>
        <t>The basic unit of DAP is the "task" which represents a single measurement
process (though potentially aggregating multiple, non-overlapping batches of
measurements). The definition of a task includes the following parameters:</t>
        <ul spacing="normal">
          <li>
            <t>The VDAF which determines the type of measurements and the aggregation
function (e.g., mean, standard deviation, etc.).</t>
          </li>
          <li>
            <t>The identities of the Leader and Helper. These are URLs that implement the
APIs for uploading, aggregation, and collection specified in <xref target="protocol"/>.</t>
          </li>
          <li>
            <t>Cryptographic assets involved in the computation (i.e., key material).</t>
          </li>
          <li>
            <t>Various parameters used to determine how reports are partitioned into batches
and the size of each batch.</t>
          </li>
        </ul>
        <t>These parameters are distributed to the Clients, Aggregators, and Collector
before the task begins. (Note that not all parameters are distributed to all
parties.) This document does not specify a distribution mechanism, but it is
important that all protocol participants agree on the task's configuration.
Each task is identified by a unique 32-byte ID which is used to refer to it in
protocol messages.</t>
        <t>During the lifetime of a task, each Client records its own measurement
value(s), packages them up into a report, and sends them to the Leader. Each
share is separately encrypted for each Aggregator so that even though they pass
through the Leader, the Leader is unable to see or modify them. 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 (see <xref target="validating-inputs"/>) and assembling them into a final
aggregate result for the Collector. Depending on the VDAF, it may be possible to
incrementally process each report as it is uploaded, or it may be necessary to
wait until the Collector transmits a collection request before processing can
begin.</t>
      </section>
      <section anchor="validating-inputs">
        <name>Validating Measurements</name>
        <t>An essential task of any data collection pipeline is ensuring that the data
being aggregated is "valid". For example, if each measurement is expected to be
an number between <tt>0</tt> and <tt>10</tt>, then the aggregator should reject measurements
larger than <tt>10</tt> or smaller than <tt>0</tt>. 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>In DAP, input validation is accomplished by an interactive computation between
the Leader and Helper. At the beginning of this computation, each Aggregator is
in possession of an input share uploaded by the Client. At the end of the
computation, each Aggregator is in possession of either an "output share" that
is ready to be aggregated or an indication that the underlying data is invalid,
in which case the report is rejected.</t>
        <t>This process is known as "preparation" and is specified by the VDAF itself
(<xref section="5.2" sectionFormat="of" target="VDAF"/>). To facilitate preparation, the report generated by
the Client include information used by the Aggregators. For example, Prio3
(<xref section="7" sectionFormat="of" target="VDAF"/>) includes a zero-knowledge proof of the measurement's
validity (<xref section="7.1" sectionFormat="of" target="VDAF"/>); the process of verifying this proof
reveals nothing about the underlying measurement beyond its validity.</t>
        <t>The specific properties attested to by the proof vary depending on the
measurement being taken. For instance, to measure the time the user took
performing a given task the proof might demonstrate that the value reported was
within a certain range (e.g., between <tt>0</tt> and <tt>60</tt> seconds). By contrast, to
report which of a set of <tt>N</tt> options the user select, the report might contain
<tt>N</tt> integers and the proof would demonstrate that <tt>N-1</tt> were <tt>0</tt> and the other
was <tt>1</tt>.</t>
        <t>It is important to recognize that "validity" is distinct from "correctness".
For instance, the user might have spent <tt>30</tt> seconds on a task but the Client
might report <tt>60</tt> seconds. This is a problem with any measurement system and
DAP does not attempt to address it; it merely ensures that the data is within
acceptable 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</name>
        <t>Another goal of DAP is to mitigate replay attacks in which a report is
aggregated multiple times within a batch or across multiple batches. 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 for a given task. To check whether a report has been replayed,
it checks whether the report's ID is in the set of stored IDs.</t>
        <t>Note that IDs do not need to be stored indefinitely. The protocol allows
Aggregators to enforce replay only for a sliding time window (e.g., within the
last two weeks of the current time) and reject reports that fall outside of the
replay window. This allows implementation to save resources by forgetting old
report IDs.</t>
      </section>
    </section>
    <section anchor="message-transport">
      <name>Message Transport</name>
      <t>Communications between DAP participants are carried over HTTP <xref target="RFC9110"/>. Use
of HTTPS is <bcp14>REQUIRED</bcp14> to provide server authentication and confidentiality.</t>
      <section anchor="request-authentication">
        <name>HTTPS Request Authentication</name>
        <t>DAP is made up of several interactions in which different subsets of the
protocol's participants interact with each other.</t>
        <t>In those cases where a channel between two participants is tunneled through
another protocol participant, DAP mandates the use of public-key encryption
using <xref target="HPKE"/> to ensure that only the intended recipient can see a
message in the clear.</t>
        <t>In other cases, DAP requires HTTP client authentication 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,
which can be added to any DAP protocol message.</t>
          </li>
          <li>
            <t>TLS client certificates can be used to authenticate the underlying transport.</t>
          </li>
          <li>
            <t>The <tt>DAP-Auth-Token</tt> HTTP header described in
<xref target="I-D.draft-dcook-ppm-dap-interop-test-design-04"/>.</t>
          </li>
        </ul>
        <t>This flexibility allows organizations deploying DAP to use existing well-known
HTTP authentication mechanisms that they already support. Discovering what
authentication mechanisms are supported by a DAP participant is outside of this
document's scope.</t>
      </section>
      <section anchor="errors">
        <name>Errors</name>
        <t>Errors can be reported in DAP both as HTTP status codes and as problem detail
objects <xref target="RFC9457"/> in the response body. For example, if the HTTP client sends
a request using a method not allowed in this document, then the server <bcp14>MAY</bcp14>
return HTTP status 405 Method Not Allowed.</t>
        <t>When the server responds with an error status code, it <bcp14>SHOULD</bcp14> provide additional
information using a problem detail object. If the response body does consist of
a problem detail object, the HTTP status code <bcp14>MUST</bcp14> indicate a client or server
error (the 4xx or 5xx classes, respectively, from <xref section="15" sectionFormat="of" target="RFC9110"/>).</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">outdatedConfig</td>
              <td align="left">The message was generated using an outdated configuration.</td>
            </tr>
            <tr>
              <td align="left">reportRejected</td>
              <td align="left">Report could not be processed for an unspecified reason.</td>
            </tr>
            <tr>
              <td align="left">reportTooEarly</td>
              <td align="left">Report could not be processed because its timestamp is too far in the future.</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">unauthorizedRequest</td>
              <td align="left">Authentication of an HTTP request failed (see <xref target="request-authentication"/>).</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>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 HTTP status code 400 Bad Request unless explicitly 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>Uploading reports from the Client to the Aggregators, specified in
<xref target="upload-flow"/></t>
        </li>
        <li>
          <t>Computing the results for a given measurement task, specified in
<xref target="aggregate-flow"/></t>
        </li>
        <li>
          <t>Collecting aggregated results, specified in <xref target="collect-flow"/></t>
        </li>
      </ul>
      <t>Each of these interactions is defined in terms of "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>The following are some basic type definitions used in other messages:</t>
        <sourcecode type="tls-presentation"><![CDATA[
/* ASCII encoded URL. e.g., "https://example.com" */
opaque Url<0..2^16-1>;

uint64 Duration; /* Number of seconds elapsed between two instants */

uint64 Time; /* seconds elapsed since start of UNIX epoch */

/* An interval of time of length duration, where start is included
  and (start + duration) is excluded. */
struct {
  Time start;
  Duration duration;
} Interval;

/* An ID used to uniquely identify a report in the context of a
   DAP task. */
opaque ReportID[16];

/* The various roles in the DAP protocol. */
enum {
  collector(0),
  client(1),
  leader(2),
  helper(3),
  (255)
} Role;

/* Identifier for a server's HPKE configuration */
uint8 HpkeConfigId;

/* An HPKE ciphertext. */
struct {
  HpkeConfigId config_id;    /* config ID */
  opaque enc<0..2^16-1>;     /* encapsulated HPKE key */
  opaque payload<0..2^32-1>; /* ciphertext */
} HpkeCiphertext;

/* Represent a zero-length byte string. */
struct {} Empty;
]]></sourcecode>
        <t>DAP uses the 16-byte <tt>ReportID</tt> as the nonce parameter for the VDAF <tt>shard</tt> and
<tt>prep_init</tt> methods (see <xref section="5" sectionFormat="comma" target="VDAF"/>). Additionally, DAP includes
messages defined in the VDAF specification encoded as opaque byte strings within
various DAP messages. Thus, for a VDAF to be compatible with DAP, it <bcp14>MUST</bcp14>
specify a <tt>NONCE_SIZE</tt> of 16 bytes, and <bcp14>MUST</bcp14> specify encodings for the following
VDAF types:</t>
        <ul spacing="normal">
          <li>
            <t>PublicShare</t>
          </li>
          <li>
            <t>InputShare</t>
          </li>
          <li>
            <t>AggParam</t>
          </li>
          <li>
            <t>AggShare</t>
          </li>
          <li>
            <t>PrepShare</t>
          </li>
          <li>
            <t>PrepMessage</t>
          </li>
        </ul>
      </section>
      <section anchor="batch-mode">
        <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"; the Aggregators
use this query to select a batch for aggregation.</t>
        <t>Each measurement task has a preconfigured "batch mode". The batch mode defines
both how reports may be partitioned into batches, as well as how these batches
are addressed and the semantics of the query used for collection.</t>
        <t>This document defines two batch modes:</t>
        <ul spacing="normal">
          <li>
            <t>time-interval (<xref target="time-interval-batch-mode"/>) in which the query specifies a
time interval, and the batch consists of all reports with a timestamp in that
interval.</t>
          </li>
          <li>
            <t>leader-selected (<xref target="leader-selected-batch-mode"/>) in which the Leader assigns
reports to batches itself, and the Collector's query simply requests the
aggregate result for the "next" batch of reports.</t>
          </li>
        </ul>
        <t>Future documents may define additional batch modes for DAP; see
<xref target="extending-this-doc"/>. Implementations are free to implement only a subset of
the available batch modes.</t>
        <t>Batch modes are identified with a single byte in serialized messages, as
follows:</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  reserved(0),
  (255)
} BatchMode;
]]></sourcecode>
        <t>The query is issued to the Leader by the Collector during the collection
interaction (<xref target="collect-flow"/>). In addition, information used to guide batch
selection is conveyed from the Leader to the Helper when initializing
aggregation (<xref target="aggregate-flow"/>) and finalizing the aggregate shares.</t>
      </section>
      <section anchor="task-configuration">
        <name>Task Configuration</name>
        <t>Prior to the start of execution of the protocol, each participant must agree on
the configuration for each task. A task is uniquely identified by its task ID:</t>
        <sourcecode type="tls-presentation"><![CDATA[
opaque TaskID[32];
]]></sourcecode>
        <t>The task ID value <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><tt>leader_aggregator_url</tt>: A URL relative to which the Leader's API resources
 can be found.</t>
          </li>
          <li>
            <t><tt>helper_aggregator_url</tt>: 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-mode"/>). This determines how reports
are grouped into batches and the properties that all batches for this task
must have. The party <bcp14>MUST NOT</bcp14> configure the task if it does not recognize the
batch mode.</t>
          </li>
          <li>
            <t><tt>task_start</tt>: The time from which the Clients will start uploading reports to
a task. Aggregators <bcp14>MUST</bcp14> reject reports with timestamps earlier than
<tt>task_start</tt> as described in <xref target="input-share-validation"/>.</t>
          </li>
          <li>
            <t><tt>task_duration</tt>: The duration of a task. The task is considered completed
after the end time <tt>task_start + task_duration</tt>. Aggregators <bcp14>MUST</bcp14> reject
reports that have timestamps later than the end time, and <bcp14>MAY</bcp14> choose to opt
out of the task if <tt>task_duration</tt> is too long.</t>
          </li>
          <li>
            <t><tt>time_precision</tt>: Used to compute timestamps in DAP. See <xref target="timestamps"/>.</t>
          </li>
          <li>
            <t>A unique identifier for the VDAF in use for the task, e.g., one of the VDAFs
defined in <xref section="10" sectionFormat="of" target="VDAF"/>.</t>
          </li>
          <li>
            <t><tt>min_batch_size</tt>: The smallest number of reports the batch is allowed to
include. In a sense, this parameter controls the degree of privacy that will
be obtained: the larger the minimum batch size, the higher degree of privacy.
However, this ultimately depends on the application and the nature of the
measurements and aggregation function.</t>
          </li>
        </ul>
        <t>Note that the <tt>leader_aggregator_url</tt> and <tt>helper_aggregator_url</tt> values may
include arbitrary path components.</t>
        <t>In addition, in order to facilitate the aggregation and collection
interactions, each of the Aggregators is configured with following parameters:</t>
        <ul spacing="normal">
          <li>
            <t><tt>collector_hpke_config</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>: 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>
      <section anchor="resource-uris">
        <name>Resource URIs</name>
        <t>DAP is defined in terms of "resources", such as reports (<xref target="upload-flow"/>),
aggregation jobs (<xref target="aggregate-flow"/>), and collection jobs (<xref target="collect-flow"/>).
Each resource has an associated URI. Resource URIs are specified by a sequence
of string literals and 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 URL of the
Leader and Helper respectively (the base URL is defined in
<xref target="task-configuration"/>).</t>
          </li>
          <li>
            <t>Variables <tt>{task-id}</tt>, <tt>{aggregation-job-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"/>), 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 URI
<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>
      </section>
      <section anchor="timestamps">
        <name>Timestamps and Time Intervals</name>
        <t>DAP uses timestamps in various places:</t>
        <ul spacing="normal">
          <li>
            <t>The task configuration includes a validity interval (<xref target="task-configuration"/>).
The interval includes a timestamp indicating when the interval begins.</t>
          </li>
          <li>
            <t>The Client's report includes a timestamp indicating when the report was
generated (<xref target="upload-flow"/>).</t>
          </li>
          <li>
            <t>The Collector's query may specify a time interval for reports it wants to
aggregate (<xref target="time-interval-batch-mode"/>).</t>
          </li>
          <li>
            <t>The result of a collection job indicates the range of timestamps of reports
included in the aggregate result (<xref target="collect-flow"/>).</t>
          </li>
        </ul>
        <t>A timestamp has type <tt>Time</tt> and its value is the number of seconds since the
UNIX epoch. In addition, every timestamp <bcp14>MUST</bcp14> be rounded down to the nearest
multiple of <tt>time_precision</tt> (<xref target="task-configuration"/>). That is, the value is
computed as</t>
        <artwork><![CDATA[
sent_timestamp = timestamp - (timestamp % time_precision)
]]></artwork>
        <t>A received timestamp is considered to be malformed if <tt>received_timestamp %
time_precision &gt; 0</tt>.</t>
        <t>A time interval has type <tt>Interval</tt> and consists of a timestamp indicating the
start of the interval and a duration. The duration has type <tt>Duration</tt> and its
value is a number of seconds. The duration <bcp14>MUST</bcp14> be a multiple of
<tt>time_precision</tt>: if <tt>duration % time_precision &gt; 0</tt>, then the interval is
considered to be malformed.</t>
        <t>Truncating timestamps has multiple purposes. Clients truncate their report
timestamp in order to avoid reducing the size of the anonymity set; see
<xref target="anon-proxy"/>. It also helps Aggregators manage resources; see
<xref target="sharding-storage"/>.</t>
      </section>
      <section anchor="agg-param-validation">
        <name>Aggregation Parameter Validation</name>
        <t>For each batch it collects, the Collector assigns an aggregation parameter used
to refine the measurements before aggregating them. The aggregation parameter
is subject to a validation procedure specified by the VDAF.</t>
        <t>Before accepting a collection job from the Collector (<xref target="collect-init"/>), the
Leader checks that the indicated aggregation parameter, <tt>agg_param</tt>, is valid
according to the following procedure. The Helper does the same before accepting
an aggregation job from the Leader (<xref target="aggregation-helper-init"/>).</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. (VDAFs compatible with this specification <bcp14>MUST</bcp14> specify an encoding of
the aggregation parameter as a byte string; see <xref target="basic-definitions"/>.)
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 deemed to be 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 an HTTP
GET request to <tt>{aggregator}/hpke_config</tt>.</t>
          <t>An Aggregator responds to well-formed requests with HTTP status code 200 OK and
an <tt>HpkeConfigList</tt> value, with media type "application/dap-hpke-config-list".
The <tt>HpkeConfigList</tt> structure contains one or more <tt>HpkeConfig</tt> structures in
decreasing order of preference. This allows an Aggregator to support multiple
HPKE configurations simultaneously.</t>
          <sourcecode type="tls-presentation"><![CDATA[
HpkeConfig HpkeConfigList<0..2^16-1>;

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

opaque HpkePublicKey<0..2^16-1>;
uint16 HpkeAeadId; /* Defined in [HPKE] */
uint16 HpkeKemId;  /* Defined in [HPKE] */
uint16 HpkeKdfId;  /* Defined in [HPKE] */
]]></sourcecode>
          <t>Aggregators <bcp14>MUST</bcp14> allocate distinct id values for each <tt>HpkeConfig</tt> in an
<tt>HpkeConfigList</tt>.</t>
          <t>The Client <bcp14>MUST</bcp14> abort if any of the following happen for any HPKE config
request:</t>
          <ul spacing="normal">
            <li>
              <t>the GET request did not return a valid HPKE config list;</t>
            </li>
            <li>
              <t>the HPKE config list is empty; or</t>
            </li>
            <li>
              <t>no HPKE config advertised by the Aggregator specifies a supported a KEM, KDF,
or AEAD algorithm triple.</t>
            </li>
          </ul>
          <t>Aggregators <bcp14>SHOULD</bcp14> use HTTP caching to permit client-side caching of this
resource <xref target="RFC5861"/>. Aggregators <bcp14>SHOULD</bcp14> favor long cache lifetimes to avoid
frequent cache revalidation, e.g., on the order of days. Aggregators can control
this cached lifetime with the Cache-Control header, as in this example:</t>
          <sourcecode type="http-message"><![CDATA[
  Cache-Control: max-age=86400
]]></sourcecode>
          <t>Servers should choose a <tt>max-age</tt> value appropriate to the lifetime of their
keys. Clients <bcp14>SHOULD</bcp14> follow the usual HTTP caching <xref target="RFC9111"/> semantics for
HPKE configurations.</t>
          <t>Note: Long cache lifetimes may result in Clients using stale HPKE
configurations; 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>
        <section anchor="upload-request">
          <name>Upload Request</name>
          <t>Clients upload reports by using an HTTP POST to
<tt>{leader}/tasks/{task-id}/reports</tt>. The payload is a <tt>Report</tt>, with media type
"application/dap-report", 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;
]]></sourcecode>
          <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> is used by the Aggregators to ensure the report is not
 replayed (<xref target="agg-flow"/>). The Client <bcp14>MUST</bcp14> generate this by generating 16
 random bytes using a cryptographically secure random number generator.</t>
                </li>
                <li>
                  <t><tt>time</tt> is the time at which the report was generated. The Client <bcp14>MUST</bcp14>
truncate their timestamp as described in <xref target="timestamps"/>.</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. Note
that 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, HTTP client authentication <bcp14>MUST</bcp14> use a scheme
that meets the requirements in <xref target="request-authentication"/>.</t>
          <t>The handling of the upload request by the Leader <bcp14>MUST</bcp14> be idempotent as discussed
in <xref section="9.2.2" sectionFormat="of" target="RFC9110"/>.</t>
          <t>To generate a report, the Client begins by sharding its measurement into input
shares and the public share using the VDAF's sharding algorithm (<xref section="5.1" sectionFormat="of" target="VDAF"/>), using the report ID as the nonce:</t>
          <sourcecode type="pseudocode"><![CDATA[
(public_share, input_shares) = Vdaf.shard(
    "dap-14" || task_id,
    measurement, /* plaintext measurement */
    report_id,   /* nonce */
    rand,        /* randomness for sharding algorithm */
)
]]></sourcecode>
          <t>where <tt>task_id</tt> is the task ID. The last input comprises the randomness
consumed by the sharding algorithm. The sharding randomness is a random byte
string of length specified by the VDAF. The Client <bcp14>MUST</bcp14> generate this using a
cryptographically secure random number generator.</t>
          <t>The sharding algorithm will return two input shares. The first input share
returned from the sharding algorithm is considered to be the Leader's input
share, and the second input share is considered to be the Helper's input share.</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<0..2^32-1>;
} PlaintextInputShare;
]]></sourcecode>
          <t>Field <tt>private_extensions</tt> is set to the list of private report extensions
intended to be consumed by the given Aggregator. (See <xref target="report-extensions"/>.)
Field <tt>payload</tt> is set to the Aggregator's input share output by the VDAF
sharding algorithm.</t>
          <t>Next, the Client encrypts each PlaintextInputShare <tt>plaintext_input_share</tt> as
follows:</t>
          <sourcecode type="pseudocode"><![CDATA[
enc, payload = SealBase(pk,
  "dap-14 input share" || 0x01 || server_role,
  input_share_aad, plaintext_input_share)
]]></sourcecode>
          <t>where <tt>pk</tt> is the Aggregator's public key; <tt>0x01</tt> represents the Role of the
sender (always the Client); <tt>server_role</tt> is the Role of the intended recipient
(<tt>0x02</tt> for the Leader and <tt>0x03</tt> for the Helper), <tt>plaintext_input_share</tt> is
the Aggregator's PlaintextInputShare, and <tt>input_share_aad</tt> is an encoded
message of type InputShareAad defined below, constructed from the same values as
the corresponding fields in the report. 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;
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
} InputShareAad;
]]></sourcecode>
          <t>The Leader responds to well-formed requests with HTTP status code 201
Created. Malformed requests are handled as described in <xref target="errors"/>.
Clients <bcp14>SHOULD NOT</bcp14> upload the same measurement value in more than one report if
the Leader responds with HTTP status code 201 Created.</t>
          <t>If the Leader does not recognize the task ID, then it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>. Note that indicating an unrecognized task might indicate
that the Client is misconfigured or the task has expired.</t>
          <t>The Leader responds to requests whose Leader encrypted input share uses an
out-of-date or unknown <tt>HpkeConfig.id</tt> value, indicated by
<tt>HpkeCiphertext.config_id</tt>, with error of type 'outdatedConfig'. When the Client
receives an 'outdatedConfig' error, it <bcp14>SHOULD</bcp14> invalidate any cached
HpkeConfigList and retry with a freshly generated Report. 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>
ignore it. In addition, it <bcp14>MAY</bcp14> alert the Client with error <tt>reportRejected</tt>.</t>
          <t>The Leader <bcp14>MUST</bcp14> ignore any report pertaining to a batch that has already been
collected (see <xref target="input-share-validation"/> for details). Otherwise, comparing
the aggregate result to the previous aggregate result may result in a privacy
violation. Note that this is also enforced by the Helper during the aggregation
interaction. The Leader <bcp14>MAY</bcp14> also abort the upload interaction and alert the
Client with error <tt>reportRejected</tt>.</t>
          <t>The Leader <bcp14>MUST</bcp14> ignore any report whose timestamp is before the task's
<tt>task_start</tt>, or is past the end time <tt>task_start + task_duration</tt>. When it does
so, it <bcp14>SHOULD</bcp14> also abort the upload interaction and alert the Client with error
<tt>reportRejected</tt>. Clients <bcp14>MUST NOT</bcp14> upload a report if its timestamp would be
earlier than <tt>task_start</tt> or later than <tt>task_start + task_duration</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> abort the upload interaction and alert the
Client with error <tt>reportTooEarly</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>MAY</bcp14> abort the upload request with error "unsupportedExtension." If the
Leader does abort for this reason, it <bcp14>MAY</bcp14> indicate the unsupported extensions in
the resulting problem document via an extension member (<xref section="3.2" sectionFormat="of" target="RFC9457"/>) "unsupported_extensions" on the problem document; this member <bcp14>MUST</bcp14>
contain an array of numeric values 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 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>MAY</bcp14>
abort the upload request with error "invalidMessage".</t>
          <t>(Note that validation of extensions is not mandatory here because it requires
the Leader to decrypt its input share. The Leader also cannot validate the
Helper's extensions because it cannot decrypt the Helper's input share.
Mandatory validation of extensions will occur during aggregation.)</t>
        </section>
        <section anchor="report-extensions">
          <name>Report Extensions</name>
          <t>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. Clients use these extensions to convey additional
information to the Aggregators. Some extensions might be intended for both
Aggregators; others may only be intended for a specific Aggregator. (For
example, a DAP deployment might use some out-of-band mechanism for an Aggregator
to verify that reports come from authenticated Clients. It will likely be useful
to bind the extension to the input share via HPKE encryption.)</t>
          <t>Each extension is a tag-length encoded value of the following 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 "extension_type" indicates the type of extension, and "extension_data"
contains information specific to the extension.</t>
          <t>Extensions are mandatory-to-implement: If an Aggregator receives a report
containing an extension it does not recognize, then it <bcp14>MUST</bcp14> reject the report.
(See <xref target="input-share-validation"/> for details.)</t>
        </section>
      </section>
      <section anchor="aggregate-flow">
        <name>Verifying and Aggregating Reports</name>
        <t>Once a set of 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 can be parallelized
across many "aggregation jobs" in which small subsets of the reports are
processed independently. Each aggregation job is associated with exactly one DAP
task, but a task can have many aggregation jobs.</t>
        <t>The primary objective of an aggregation job is to run the VDAF preparation
process described in <xref section="5.2" sectionFormat="comma" target="VDAF"/> for each report in the job.
Preparation has two purposes:</t>
        <ol spacing="normal" type="1"><li>
            <t>To "refine" the input shares into "output shares" that have the desired
aggregatable form. For some VDAFs, like Prio3, the mapping from input to
output shares is a fixed operation depending only on the input share, but in
general the mapping involves an aggregation parameter chosen by the
Collector.</t>
          </li>
          <li>
            <t>To verify that the output shares, when combined, correspond 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"/>) requires
that the output shares sum up to an integer in a specific range, while the
Prio3Histogram variant (<xref section="7.4.4" sectionFormat="of" target="VDAF"/>) proves that output shares
sum up to a one-hot vector representing a contribution to a single bucket of
the histogram.</t>
          </li>
        </ol>
        <t>In general, refinement and verification are not distinct computations, since for
some VDAFs, verification may only be achieved implicitly as a result of the
refinement process. We instead think of these as properties of the output shares
themselves: if preparation succeeds, then the resulting output shares are
guaranteed to combine into a valid, refined measurement.</t>
        <t>VDAF preparation is mapped onto an aggregation job as illustrated in
<xref target="agg-flow"/>. The protocol is comprised of a sequence of HTTP requests from the
Leader to the Helper, the first of which includes the aggregation parameter, the
Helper's report share for each report in the job, and for each report the
initialization step for preparation. The Helper's response, along with each
subsequent request and response, carries the remaining messages exchanged during
preparation.</t>
        <figure anchor="agg-flow">
          <name>Overview of the DAP aggregation interaction.</name>
          <artwork><![CDATA[
  report, agg_param
   |
   v
+--------+                                         +--------+
| Leader |                                         | Helper |
+--------+                                         +--------+
   | AggregationJobInitReq:                              |
   |   agg_param, prep_init                              |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                               prep_resp(continue)   |
   |<----------------------------------------------------|
   | AggregationJobContinueReq:                          |
   |   prep_continue                                     |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                               prep_resp(continue)   |
   |<----------------------------------------------------|
   |                                                     |
  ...                                                   ...
   |                                                     |
   | AggregationJobContinueReq:                          |
   |   prep_continue                                     |
   |---------------------------------------------------->|
   |                                 AggregationJobResp: |
   |                      prep_resp(continue|finished)   |
   |<----------------------------------------------------|
   |                                                     |
   v                                                     v
  leader_out_share                         helper_out_share
]]></artwork>
        </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>Normally, the Helper processes each step synchronously, meaning it computes
each step of the computation before producing a response to the Leader's HTTP
request. The Helper can optionally instead process each step asynchronously,
meaning the Helper responds to requests immediately, while deferring 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
flexibility in choosing a request model that best supports its architecture
and use case. For instance, resource-intensive use cases, such as replay checks
across vast numbers of reports and preparation of large histograms, may be
better suited for the asynchronous model. For use cases where datastore
performance is a concern, the synchronous model may be better suited.</t>
        <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. For
example, Prio3 has just one valid aggregation parameter (the empty string), and
thus allows for eager aggregation; and both the time-interval
(<xref target="time-interval-batch-mode"/>) and leader-selected
(<xref target="leader-selected-batch-mode"/>) batch modes defined in this document allow for
eager aggregation.</t>
        <t>An aggregation job can be thought of as having three phases, which are
described in the remaining subsections:</t>
        <ul spacing="normal">
          <li>
            <t>Initialization: Begin the aggregation flow by disseminating report shares and
initializing the VDAF prep state for each report.</t>
          </li>
          <li>
            <t>Continuation: Continue the aggregation flow by exchanging prep shares and
messages until preparation completes or an error occurs.</t>
          </li>
          <li>
            <t>Completion: Finish the aggregation flow, yielding an output share
corresponding to each report share in the aggregation job, and update the
appropriate aggregate shares with these output shares.</t>
          </li>
        </ul>
        <t>After an aggregation job is completed, each Aggregator updates running-total
aggregate shares and other values for each "batch bucket" associated with a
recovered output share, as described in <xref target="batch-buckets"/>. These values are
stored until the batch is collected as described in <xref target="collect-flow"/>.</t>
        <t>Apart from VDAF preparation, another important task of the aggregation
interaction is to provide replay protection (<xref target="replay-protection"/>). Along with
the output shares, each Aggregator records the IDs of all reports it is has
aggregated for a given task: before committing to an output share, it checks
whether the corresponding report ID is in the set of stored IDs.</t>
        <section anchor="agg-init">
          <name>Aggregate Initialization</name>
          <t>The Leader begins an aggregation job by choosing a set of candidate reports that
pertain to the same DAP task and a job ID which <bcp14>MUST</bcp14> be unique within the scope
of the task. The job ID is a 16-byte value, structured as follows:</t>
          <sourcecode type="tls-presentation"><![CDATA[
opaque AggregationJobID[16];
]]></sourcecode>
          <t>The Leader can run this process for many sets of candidate reports in parallel
as needed. After choosing a set of candidates, the Leader begins aggregation by
splitting each report into report shares, one for each Aggregator. The Leader
and Helper then run the aggregate initialization flow to accomplish two tasks:</t>
          <ol spacing="normal" type="1"><li>
              <t>Recover and determine which input report shares are valid.</t>
            </li>
            <li>
              <t>For each valid report share, initialize the VDAF preparation process (see
<xref section="5.2" sectionFormat="of" target="VDAF"/>).</t>
            </li>
          </ol>
          <t>The Leader and Helper initialization behavior is detailed below.</t>
          <t>Implementation note: the Leader will generally want to associate each report
with a single aggregation job, as otherwise the duplicated reports will
eventually be discarded as a replay. However, it is likely not appropriate to
directly use the used-ID storage used for replay protection to determine which
reports can be added to an aggregation job: certain errors (e.g.
<tt>report_too_early</tt>) allow the report to be added to another aggregation job in
the future; but storage into the used-ID storage is permanent.</t>
          <section anchor="leader-init">
            <name>Leader Initialization</name>
            <t>The Leader begins the aggregate initialization by sampling a fresh
AggregationJobID.</t>
            <t>Next, for each report in the candidate set, it checks if the report ID
corresponds to a report ID it has previously stored for this task. If so, it
marks the report as invalid 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 invalidates the report, the Leader
rejects the report and removes it from the set of candidate reports.</t>
            <t>Next, for each report the Leader executes the following procedure:</t>
            <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_init(
    vdaf_verify_key,
    "dap-14" || 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>The methods are defined in <xref section="5.8" sectionFormat="of" target="VDAF"/>. This process determines
the initial per-report <tt>state</tt>, as well as the initial <tt>outbound</tt> message to
send to the Helper. If <tt>state</tt> is of type <tt>Rejected</tt>, then the report is
rejected and removed from the set of candidate reports, and no message is sent
to the Helper.</t>
            <t>If <tt>state</tt> is of type <tt>Continued</tt>, then the Leader constructs a <tt>PrepareInit</tt>
message structured as follows:</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<0..2^32-1>;
} PrepareInit;
]]></sourcecode>
            <t>Each of these messages is constructed as follows:</t>
            <ul spacing="normal">
              <li>
                <t><tt>report_share.report_metadata</tt> is the report's metadata.</t>
              </li>
              <li>
                <t><tt>report_share.public_share</tt> is the report's public share.</t>
              </li>
              <li>
                <t><tt>report_share.encrypted_input_share</tt> is the Helper's encrypted input share.</t>
              </li>
              <li>
                <t><tt>payload</tt> is set to the <tt>outbound</tt> message computed by the previous step.</t>
              </li>
            </ul>
            <t>It is not possible for <tt>state</tt> to be of type <tt>Finished</tt> during Leader
initialization.</t>
            <t>Once all the report shares have been initialized, the Leader creates an
<tt>AggregationJobInitReq</tt> message structured as follows:</t>
            <sourcecode type="tls-presentation"><![CDATA[
opaque BatchID[32];

struct {
  BatchMode batch_mode;
  opaque config<0..2^16-1>;
} PartialBatchSelector;

struct {
  opaque agg_param<0..2^32-1>;
  PartialBatchSelector part_batch_selector;
  PrepareInit prepare_inits<0..2^32-1>;
} 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: for time-interval mode, the <tt>config</tt> field is empty
(<xref target="time-interval-batch-mode"/>); for leader-selected tasks, the Leader
specifies a "batch ID" that determines the batch to which each report for
this aggregation job belongs (<xref target="leader-selected-batch-mode"/>).  </t>
                <t>
Documents that define batch modes <bcp14>MUST</bcp14> specify the content this field; see
<xref target="extending-this-doc"/> for details.  </t>
                <t>
The indicated batch mode <bcp14>MUST</bcp14> match the task's batch mode. Otherwise, the
Helper <bcp14>MUST</bcp14> abort with error <tt>invalidMessage</tt>.  </t>
                <t>
This field is called the "partial" batch selector because, depending on the
batch mode, it may not determine a batch. In particular, if the batch mode is
<tt>time_interval</tt>, the batch is not determined until the Collector's query is
issued (see <xref target="batch-mode"/>).</t>
              </li>
              <li>
                <t><tt>prepare_inits</tt>: the sequence of <tt>PrepareInit</tt> messages constructed in the
previous step.</t>
              </li>
            </ul>
            <t>Finally, the Leader sends an HTTP PUT request to
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt> with a media
type of "application/dap-aggregation-job-init-req" and a body containing the
<tt>AggregationJobInitReq</tt>.</t>
            <t>The Leader <bcp14>MUST</bcp14> authenticate its requests to the Helper using a scheme that
meets the requirements in <xref target="request-authentication"/>.</t>
            <t>The Helper responds with HTTP status 201 Created with a body containing an
<tt>AggregationJobResp</tt> (see <xref target="aggregation-helper-init"/>). If the <tt>status</tt> field
is <tt>ready</tt>, the Leader proceeds onward. Otherwise, if the <tt>status</tt> field is
<tt>processing</tt>, the Leader polls the aggregation job by sending GET requests to
the URI indicated in the Location header field, until the <tt>status</tt> is <tt>ready</tt>.
The Helper's response when processing <bcp14>SHOULD</bcp14> include a Retry-After header to
suggest a polling interval to the Leader.</t>
            <t>The <tt>AggregationJobResp.prepare_resps</tt> field must include exactly the same
report IDs in the same order as the Leader's <tt>AggregationJobInitReq</tt>. Otherwise,
the Leader <bcp14>MUST</bcp14> abort the aggregation job.</t>
            <t>Otherwise, the Leader proceeds as follows with each report:</t>
            <ol spacing="normal" type="1"><li>
                <t>If the inbound prep response has type "continue", then the Leader computes  </t>
                <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_continued(
    "dap-14" || task_id,
    agg_param,
    prev_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>prev_state</tt> is the state computed earlier by calling
<tt>Vdaf.ping_pong_leader_init</tt> or <tt>Vdaf.ping_pong_leader_continued</tt></t>
                  </li>
                  <li>
                    <t><tt>inbound</tt> is the message payload in the <tt>PrepareResp</tt></t>
                  </li>
                </ul>
                <t>
If <tt>outbound != None</tt>, then the Leader stores <tt>state</tt> and <tt>outbound</tt> and
proceeds to <xref target="aggregation-leader-continuation"/>. If <tt>outbound == None</tt>, then
the preparation process is complete: either <tt>state == Rejected()</tt>, in which
case the Leader rejects the report and removes it from the candidate set; or
<tt>state == Finished(out_share)</tt>, in which case preparation is complete and the
Leader updates the relevant batch bucket with <tt>out_share</tt> as described in
<xref target="batch-buckets"/>.</t>
              </li>
              <li>
                <t>Else if the type is "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 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>Else the type is invalid, in which case the Leader <bcp14>MUST</bcp14> abort the
aggregation job.</t>
              </li>
            </ol>
            <t>When the Leader updates a batch bucket based on <tt>out_share</tt>, it <bcp14>MUST</bcp14> also store
the report ID for replay protection.</t>
            <t>(Note: Since VDAF preparation completes in a constant number of rounds, it will
never be the case that some reports are completed and others are not.)</t>
            <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-init">
            <name>Helper Initialization</name>
            <t>The Helper begins an aggregation job when it receives an <tt>AggregationJobInitReq</tt>
message from the Leader. For each <tt>PrepareInit</tt> conveyed by this message, the
Helper attempts to initialize VDAF preparation (see <xref section="5.1" sectionFormat="of" target="VDAF"/>)
just as the Leader does. If successful, it includes the result in its response
that the Leader will use to continue preparing the report.</t>
            <t>Upon receipt of an <tt>AggregationJobInitReq</tt>, the Helper checks if it recognizes
the task ID. If not, then it <bcp14>MUST</bcp14> abort with error <tt>unrecognizedTask</tt>.</t>
            <t>Next, the Helper checks that 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> abort with error <tt>invalidAggregationParameter</tt>.</t>
            <t>Next, the Helper checks that the report IDs in
<tt>AggregationJobInitReq.prepare_inits</tt> are all distinct. If two preparation
initialization messages have the same report ID, then the Helper <bcp14>MUST</bcp14> abort with
error <tt>invalidMessage</tt>.</t>
            <t>To process the aggregation job, the Helper computes an outbound prepare step
for each report share. This includes the following structures:</t>
            <sourcecode type="tls-presentation"><![CDATA[
enum {
  continue(0),
  finished(1)
  reject(2),
  (255)
} PrepareRespState;

enum {
  reserved(0),
  batch_collected(1),
  report_replayed(2),
  report_dropped(3),
  hpke_unknown_config_id(4),
  hpke_decrypt_error(5),
  vdaf_prep_error(6),
  task_expired(7),
  invalid_message(8),
  report_too_early(9),
  task_not_started(10),
  (255)
} ReportError;

struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state;
  select (PrepareResp.prepare_resp_state) {
    case continue: opaque payload<0..2^32-1>;
    case finished: Empty;
    case reject:   ReportError report_error;
  };
} PrepareResp;
]]></sourcecode>
            <t>First, for each report in the request, the Helper <bcp14>MAY</bcp14> check if the report ID
corresponds to a report ID it has previously stored for this task. If so, it
rejects the report by setting the outbound preparation response to</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  ReportError report_error = report_replayed;
} PrepareResp;
]]></sourcecode>
            <t>where <tt>report_id</tt> is the report ID. Note that the Helper must perform this
check before completing the aggregation job.</t>
            <t>Next the Helper decrypts each of its remaining report shares as described in
<xref target="input-share-decryption"/>, then checks input share validity as described in
<xref target="input-share-validation"/>. For any report that was rejected, the Helper sets
the outbound preparation response to</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  ReportError report_error;
} PrepareResp;
]]></sourcecode>
            <t>where <tt>report_id</tt> is the report ID and <tt>report_error</tt> is the indicated error.
For all other reports it initializes the VDAF prep state as follows (let
<tt>inbound</tt> denote the payload of the prep step sent by the Leader):</t>
            <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_helper_init(
    vdaf_verify_key,
    "dap-14" || 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 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>
            </ul>
            <t>This procedure determines the initial per-report <tt>state</tt>, as well as the
initial <tt>outbound</tt> message to send in response to the Leader. If <tt>state</tt> is of
type <tt>Rejected</tt>, then the Helper responds with</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  ReportError report_error = vdaf_prep_error;
} PrepareResp;
]]></sourcecode>
            <t>Otherwise the Helper responds with</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = continue;
  opaque payload<0..2^32-1> = outbound;
} PrepareResp;
]]></sourcecode>
            <t>If <tt>state == Continued(prep_state)</tt>, then the Helper stores <tt>state</tt> to
prepare for the next continuation step (<xref target="aggregation-helper-continuation"/>).</t>
            <t>If <tt>state == Finished(out_share)</tt>, the Helper <bcp14>MUST</bcp14> resolve replay of the
report. It does so by checking if the report ID was previously stored for this
task. If so, it responds with</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  Reporterror report_error = report_replayed;
} PrepareResp;
]]></sourcecode>
            <t>Otherwise it stores the report ID for replay protection and updates the relevant
batch bucket with <tt>out_share</tt> as described in <xref target="batch-buckets"/>.</t>
            <t>Finally, the Helper creates an <tt>AggregationJobResp</tt> to send to the Leader. This
message is structured as follows:</t>
            <sourcecode type="tls-presentation"><![CDATA[
enum {
  processing(0),
  ready(1),
  (255)
} AggregationJobStatus;

struct {
  AggregationJobStatus status;
  select (AggregationJobResp.status) {
    case processing: Empty;
    case ready:      PrepareResp prepare_resps<0..2^32-1>;
  };
} AggregationJobResp;
]]></sourcecode>
            <t>where <tt>prepare_resps</tt> are the outbound prep steps computed in the previous step.
The order <bcp14>MUST</bcp14> match <tt>AggregationJobInitReq.prepare_inits</tt>.</t>
            <t>The Helper responds to the Leader with HTTP status 201 Created, a body
consisting of the <tt>AggregationJobResp</tt>, and the media type
"application/dap-aggregation-job-resp".</t>
            <t>Depending on the task parameters, processing an aggregation job may take some
time, so the Helper <bcp14>MAY</bcp14> defer computation to a background process. It does so
by responding with the field <tt>status</tt> set to <tt>processing</tt> and a Location header
field set to the relative reference
<tt>/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}?step=0</tt>. The Leader
then polls the Helper by making HTTP GET requests to the aforementioned
Location. The Helper responds to GET requests with HTTP status 200 and the
<tt>status</tt> field reflecting the current state of the job. When the aggregation
job is <tt>processing</tt>, the response <bcp14>SHOULD</bcp14> include a Retry-After header field to
suggest a polling interval to the Leader.</t>
            <t>Changing an aggregation job's parameters is illegal, so further HTTP PUT
requests to <tt>/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt> for the
same <tt>aggregation-job-id</tt> but with a different <tt>AggregationJobInitReq</tt> in the
body <bcp14>MUST</bcp14> fail with an HTTP client error status code. For further requests with
the same <tt>AggregationJobInitReq</tt> in the body, the Helper <bcp14>SHOULD</bcp14> respond as it
did for the original <tt>AggregationJobInitReq</tt>, or otherwise fail with an HTTP
client error status code.</t>
            <t>Additionally, it is not possible to rewind or reset the state of an aggregation
job. Once an aggregation job has been continued at least once (see
<xref target="agg-continue-flow"/>), further requests to initialize that aggregation job <bcp14>MUST</bcp14>
fail with an HTTP client error status code.</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 looks up the HPKE
config and corresponding secret key indicated by
<tt>encrypted_input_share.config_id</tt> and attempts decryption of the payload with
the following procedure:</t>
            <sourcecode type="pseudocode"><![CDATA[
plaintext_input_share = OpenBase(encrypted_input_share.enc, sk,
  "dap-14 input share" || 0x01 || server_role,
  input_share_aad, encrypted_input_share.payload)
]]></sourcecode>
            <t>where <tt>sk</tt> is the HPKE secret key, <tt>0x01</tt> represents the Role of the sender
(always the Client), and <tt>server_role</tt> is the Role of the recipient Aggregator
(<tt>0x02</tt> for the Leader and <tt>0x03</tt> for the Helper). 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. If decryption fails, the Aggregator marks the report share as
invalid with the error <tt>hpke_decrypt_error</tt>. Otherwise, the Aggregator outputs
the resulting PlaintextInputShare <tt>plaintext_input_share</tt>.</t>
          </section>
          <section anchor="input-share-validation">
            <name>Input Share Validation</name>
            <t>Validating an input share will either succeed or fail. In the case of failure,
the input share is marked as invalid with a corresponding report error.</t>
            <t>Before beginning the preparation step, Aggregators are required to perform the
following checks:</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 that the report's timestamp is well-formed as specified in
<xref target="timestamps"/>. If not, the Aggregator <bcp14>MUST</bcp14> mark the input share as invalid
with error <tt>invalid_message</tt>.</t>
              </li>
              <li>
                <t>Check if the report's timestamp is too far in the future. If the report's
timestamp is more than a few minutes ahead of the current time, 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_start</tt> time. 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 past the task's end time, given by
<tt>task_start + task_duration</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 the report pertains to a batch that was previously collected, then the
input share <bcp14>MUST</bcp14> be marked as invalid with error <tt>batch_collected</tt>.  </t>
                <ul spacing="normal">
                  <li>
                    <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 (<xref target="batch-mode"/>) conveyed in these messages. Queries
must satisfy the criteria covered in <xref target="batch-validation"/>. 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>
                  </li>
                </ul>
              </li>
              <li>
                <t>Finally, if an Aggregator cannot determine if an input share is valid, it
<bcp14>MUST</bcp14> mark the input share as invalid with error <tt>report_dropped</tt>.
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
long-term storage. See <xref target="sharding-storage"/> for details.</t>
              </li>
            </ol>
            <t>If all of the above checks succeed, the input share is not marked as invalid.</t>
          </section>
        </section>
        <section anchor="agg-continue-flow">
          <name>Aggregate Continuation</name>
          <t>In the continuation phase, the Leader drives the VDAF preparation of each report
in the candidate report set until the underlying VDAF moves into a terminal
state, yielding an output share for both Aggregators or a rejection.</t>
          <t>Whether this phase is reached depends on the VDAF: for 1-round VDAFs, like
Prio3, processing has already completed. Continuation is required for VDAFs
that require more than one round.</t>
          <section anchor="aggregation-leader-continuation">
            <name>Leader Continuation</name>
            <t>The Leader begins each step of aggregation continuation with a prep state object
<tt>state</tt> and an outbound message <tt>outbound</tt> for each report in the candidate set.</t>
            <t>The Leader advances its aggregation job to the next step (step 1 if this is the
first continuation after initialization). Then it instructs the Helper to
advance the aggregation job to the step the Leader has just reached. For each
report the Leader constructs a preparation continuation message:</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  ReportID report_id;
  opaque payload<0..2^32-1>;
} PrepareContinue;
]]></sourcecode>
            <t>where <tt>report_id</tt> is the report ID associated with <tt>state</tt> and <tt>outbound</tt>, and
<tt>payload</tt> is set to the <tt>outbound</tt> message.</t>
            <t>Next, the Leader sends a POST request to
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt> with media
type "application/dap-aggregation-job-continue-req" and body structured as:</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint16 step;
  PrepareContinue prepare_continues<0..2^32-1>;
} AggregationJobContinueReq;
]]></sourcecode>
            <t>The <tt>step</tt> field is the step of DAP aggregation that the Leader just reached and
wants the Helper to advance to. The <tt>prepare_continues</tt> field is the sequence of
preparation continuation messages constructed in the previous step. The
<tt>PrepareContinue</tt>s <bcp14>MUST</bcp14> be in the same order as the previous aggregate request.</t>
            <t>The Leader <bcp14>MUST</bcp14> authenticate its requests to the Helper using a scheme that
meets the requirements in <xref target="request-authentication"/>.</t>
            <t>The Helper responds with HTTP status 202 Accepted with a body containing an
<tt>AggregationJobResp</tt> (see <xref target="aggregation-helper-init"/>). If the <tt>status</tt> field
is <tt>ready</tt>, the Leader proceeds onward. Otherwise, if the <tt>status</tt> field is
<tt>processing</tt>, the Leader polls the aggregation job by sending GET requests to
the URI indicated in the Location header field, until the <tt>status</tt> is
<tt>ready</tt>. The Helper's response when processing <bcp14>SHOULD</bcp14> include a Retry-After
header to suggest a polling interval to the Leader.</t>
            <t>The response's <tt>prepare_resps</tt> <bcp14>MUST</bcp14> include exactly the same report IDs in the
same order as the Leader's <tt>AggregationJobContinueReq</tt>. Otherwise, the Leader
<bcp14>MUST</bcp14> abort the aggregation job.</t>
            <t>Otherwise, the Leader proceeds as follows with each report:</t>
            <ol spacing="normal" type="1"><li>
                <t>If the inbound prep response type is "continue" and the state is
<tt>Continued(prep_state)</tt>, then the Leader computes  </t>
                <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_continued(
    "dap-14" || task_id,
    agg_param,
    state,
    inbound,
)
]]></sourcecode>
                <t>
where <tt>task_id</tt> is the task ID and <tt>inbound</tt> is the message payload. If
<tt>outbound != None</tt>, then the Leader stores <tt>state</tt> and <tt>outbound</tt> and
proceeds to another continuation step. If <tt>outbound == None</tt>, then the
preparation process is complete: either <tt>state == Rejected()</tt>, in which case
the Leader rejects the report and removes it from the candidate set; or
<tt>state == Finished(out_share)</tt>, in which case preparation is complete and
the Leader updates the relevant batch bucket with <tt>out_share</tt> as described in
<xref target="batch-buckets"/>.</t>
              </li>
              <li>
                <t>Else if the type is "finished" and <tt>state == Finished(out_share)</tt>, then
preparation is complete and the Leader stores the output share for use in
the collection interaction (<xref target="collect-flow"/>).</t>
              </li>
              <li>
                <t>Else if the type is "reject", then the Leader rejects the report and removes
it from the candidate set.</t>
              </li>
              <li>
                <t>Else the type is invalid, in which case the Leader <bcp14>MUST</bcp14> abort the
aggregation job.</t>
              </li>
            </ol>
            <t>When the Leader stores the <tt>out_share</tt>, it <bcp14>MUST</bcp14> also store the report ID for
replay protection.</t>
            <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>
            <t>The Helper begins each step of continuation with a sequence of <tt>state</tt> objects,
which will be <tt>Continued(prep_state)</tt>, one for each report in the candidate set.</t>
            <t>The Helper awaits an HTTP POST request to
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt> from the
Leader, the body of which is an <tt>AggregationJobContinueReq</tt> as specified in
<xref target="aggregation-leader-continuation"/>.</t>
            <t>Next, it checks that it recognizes the task ID. If not, then it <bcp14>MUST</bcp14> abort with
error <tt>unrecognizedTask</tt>.</t>
            <t>Next, it checks if it recognizes the indicated aggregation job ID. If not, it
<bcp14>MUST</bcp14> abort with error <tt>unrecognizedAggregationJob</tt>.</t>
            <t>Next, the Helper checks that:</t>
            <ol spacing="normal" type="1"><li>
                <t>the report IDs are all distinct</t>
              </li>
              <li>
                <t>each report ID corresponds to one of the <tt>state</tt> objects</t>
              </li>
              <li>
                <t><tt>AggregationJobContinueReq.step</tt> is not equal to <tt>0</tt></t>
              </li>
            </ol>
            <t>If any of these checks fail, then the Helper <bcp14>MUST</bcp14> abort with error
<tt>invalidMessage</tt>. Additionally, if any prep step appears out of order relative
to the previous request, then the Helper <bcp14>MAY</bcp14> abort with error <tt>invalidMessage</tt>.
(Note that a report may be missing, in which case the Helper should assume the
Leader rejected it.)</t>
            <t>Next, the Helper checks if the continuation step indicated by the request is
correct. (For the first <tt>AggregationJobContinueReq</tt> the value should be <tt>1</tt>; for
the second the value should be <tt>2</tt>; and so on.) If the Leader is one step behind
(e.g., the Leader has resent the previous HTTP request), then 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. In this case it <bcp14>SHOULD</bcp14> verify that the contents of the
<tt>AggregationJobContinueReq</tt> are identical to the previous message (see
<xref target="aggregation-step-skew-recovery"/>). Otherwise, if the step is incorrect or if
the Helper does not wish to attempt recovery, the Helper <bcp14>MUST</bcp14> abort with error
<tt>stepMismatch</tt>.</t>
            <t>Let <tt>inbound</tt> denote the payload of the prep step. For each report, the Helper
computes the following:</t>
            <sourcecode type="pseudocode"><![CDATA[
(state, outbound) = Vdaf.ping_pong_helper_continued(
    "dap-14" || task_id,
    agg_param,
    state,
    inbound,
)
]]></sourcecode>
            <t>where <tt>task_id</tt> is the task ID. If <tt>state == Rejected()</tt>, then the Helper's
response is</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  ReportError report_error = vdaf_prep_error;
} PrepareResp;
]]></sourcecode>
            <t>If <tt>state == Continued(prep_state)</tt>, then the Helper stores <tt>state</tt> to
prepare for the next continuation step (<xref target="aggregation-helper-continuation"/>).</t>
            <t>If <tt>state == Finished(out_share)</tt>, the Helper <bcp14>MUST</bcp14> resolve replay of the
report. It does so by checking if the report ID was previously stored for this
task. If so, it responds with</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  ReportError report_error = report_replayed;
} PrepareResp;
]]></sourcecode>
            <t>Otherwise it stores the report ID for replay protection and updates the relevant
batch bucket with <tt>out_share</tt> as described in <xref target="batch-buckets"/>.</t>
            <t>The Helper's response depends on the value of <tt>outbound</tt>. If <tt>outbound !=
None</tt>, then the Helper's response is</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = continue;
  opaque payload<0..2^32-1> = outbound;
} PrepareResp;
]]></sourcecode>
            <t>Otherwise, if <tt>outbound == None</tt>, then the Helper's response is</t>
            <sourcecode type="tls-presentation"><![CDATA[
variant {
  ReportID report_id;
  PrepareRespState prepare_resp_state = finished;
} PrepareResp;
]]></sourcecode>
            <t>The Helper constructs an <tt>AggregationJobResp</tt> message (see
<xref target="aggregation-helper-init"/>) with each prep step. The order of the prep steps
<bcp14>MUST</bcp14> match the Leader's <tt>AggregationJobContinueReq</tt>.</t>
            <t>The Helper responds to the Leader with HTTP status 202 Accepted, a body
consisting of the <tt>AggregationJobResp</tt>, and the media type
"application/dap-aggregation-job-resp".</t>
            <t>Depending on the task parameters, processing an aggregation job may take some
time, so the Helper <bcp14>MAY</bcp14> defer computation to a background process by responding
with the field <tt>status</tt> set to <tt>processing</tt> and Location header field set to the
relative reference
<tt>/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}?step={step}</tt>, where
<tt>step</tt> is the step indicated in the <tt>AggregationJobContinueReq</tt>. If so, the
Leader polls the Helper by making HTTP GET requests to the aforementioned
Location. The Helper responds to GET requests with HTTP status 200 and the
<tt>status</tt> field reflecting the current state of the job. When the aggregation
job is <tt>processing</tt>, the response <bcp14>SHOULD</bcp14> include a Retry-After header field to
suggest a polling interval to the Leader.</t>
            <t>If for whatever reason the Leader must abandon the aggregation job, it <bcp14>SHOULD</bcp14>
send an HTTP DELETE request to
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt> so that the
Helper knows it can clean up its state.</t>
          </section>
          <section anchor="batch-buckets">
            <name>Batch Buckets</name>
            <t>When aggregation recovers an output share, it must be stored into an appropriate
"batch bucket", which is defined in this section. 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>A VDAF-specific aggregate share, as defined in <xref target="VDAF"/>.</t>
              </li>
              <li>
                <t>A count of a number of reports included in the batch bucket.</t>
              </li>
              <li>
                <t>A 32-byte checksum value, as defined below.</t>
              </li>
            </ul>
            <t>When processing an output share <tt>out_share</tt>, the following procedure is used to
update the batch buckets:</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 checksum value with the
SHA256 <xref target="SHS"/> hash of the report ID associated
with the output share.</t>
              </li>
            </ul>
            <t>Implementation note: this section describes a single set of values associated
with each batch bucket. However, implementations are free to shard the aggregate
share/count/checksum values associated with the batch bucket, combining them
back into a single set of values when reading the batch bucket. This may be
useful to avoid write contention. The aggregate share values 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>
          </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 DAP
aggregation. In particular, the intent is to allow recovery from a scenario
where the Helper successfully advances from step <tt>n</tt> to <tt>n+1</tt>, but its
<tt>AggregationJobResp</tt> response to the Leader gets dropped due to something like
a transient network failure. The Leader could then resend the request to have
the Helper advance to step <tt>n+1</tt> and the Helper should be able to retransmit
the <tt>AggregationJobResp</tt> that was previously dropped. To make that kind of
recovery possible, Aggregator implementations <bcp14>SHOULD</bcp14> checkpoint the most recent
step's prep state and messages to durable storage such that the Leader can
re-construct continuation requests and the Helper can re-construct continuation
responses as needed.</t>
            <t>When implementing an aggregation step skew recovery strategy, 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 address 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>
      </section>
      <section anchor="collect-flow">
        <name>Collecting Results</name>
        <t>In this phase, the Collector requests aggregate shares from each Aggregator and
then locally combines them to yield a single aggregate result. In particular,
the Collector issues a query to the Leader (<xref target="batch-mode"/>), 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 entire process 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>This overall process is referred to as a "collection job".</t>
        <section anchor="collect-init">
          <name>Collection Job Initialization</name>
          <t>First, the Collector chooses a collection job ID:</t>
          <sourcecode type="tls-presentation"><![CDATA[
opaque CollectionJobID[16];
]]></sourcecode>
          <t>This ID value <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
<tt>{leader}/tasks/{task-id}/collection_jobs/{collection-job-id}</tt>. The body of the
request has media type "application/dap-collection-job-req", and it is 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>; /* VDAF aggregation parameter */
} CollectionJobReq;
]]></sourcecode>
          <t>The named parameters are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>query</tt>, the Collector's query. The content of this field depends on the
indicated batch mode: for time-interval mode, the <tt>config</tt> field contains the
requested time interval (<xref target="time-interval-batch-mode"/>); for leader-selected
mode, the <tt>config</tt> field is empty, and the Collector gets the aggregate
result for the next batch selected by the Leader
(<xref target="leader-selected-batch-mode"/>).  </t>
              <t>
Batch modes defined by future documents <bcp14>MUST</bcp14> specify the content of this field;
see <xref target="extending-this-doc"/> for details.  </t>
              <t>
The indicated batch mode <bcp14>MUST</bcp14> match the task's batch mode. Otherwise, the
Leader <bcp14>MUST</bcp14> abort with error "invalidMessage".</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"/>). The
aggregation parameter <bcp14>MUST</bcp14> be valid as defined in <xref target="agg-param-validation"/>.</t>
            </li>
          </ul>
          <t>Collectors <bcp14>MUST</bcp14> authenticate their requests to Leaders using a scheme that meets
the requirements in <xref target="request-authentication"/>.</t>
          <t>Depending on the VDAF scheme and how the Leader is configured, the Leader and
Helper may already have prepared a sufficient number of reports satisfying the
query and be ready to return the aggregate shares right away. However, this is
not always the case. In fact, for some VDAFs, it is not be possible to begin
running aggregation jobs (<xref target="aggregate-flow"/>) until the Collector initiates a
collection job. This is because, in general, 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. For these reasons, the collection job
is handled asynchronously. If aggregation is performed eagerly, the Leader <bcp14>MUST</bcp14>
validate that the aggregation parameter received in the <tt>CollectionJobReq</tt>
matches the aggregation parameter used in aggregations.</t>
          <t>Upon receipt of a <tt>CollectionJobReq</tt>, the Leader begins by checking that it
recognizes the task ID in the request path. If not, it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>Next, the Leader checks that the aggregation parameter is valid as described in
<xref target="agg-param-validation"/>. If the aggregation parameter is invalid, then the
Leader <bcp14>MUST</bcp14> abort with error <tt>invalidAggregationParameter</tt>.</t>
          <t>The Leader <bcp14>MAY</bcp14> further validate the request according to the requirements in
<xref target="batch-validation"/> and abort with the indicated error, though some conditions
such as the number of valid reports may not be verifiable while handling the
<tt>CollectionJobReq</tt> message, and the batch will have to be re-validated later on
regardless.</t>
          <t>Changing a collection job's parameters is illegal, so further requests to
<tt>PUT /tasks/{task-id}/collection_jobs/{collection-job-id}</tt> for the same
<tt>collection-job-id</tt> but with a different <tt>CollectionJobReq</tt> in the body <bcp14>MUST</bcp14>
fail with an HTTP client error status code.</t>
          <t>The Leader responds to <tt>CollectionJobReq</tt>s with a <tt>CollectionJobResp</tt>, which is
structured as follows:</t>
          <sourcecode type="tls-presentation"><![CDATA[
enum {
  processing(0),
  ready(1),
  (255)
} CollectionJobStatus;

struct {
  PartialBatchSelector part_batch_selector;
  uint64 report_count;
  Interval interval;
  HpkeCiphertext leader_encrypted_agg_share;
  HpkeCiphertext helper_encrypted_agg_share;
} Collection;

struct {
  CollectionJobStatus status;
  select (CollectionJob.status) {
    case processing: Empty;
    case ready:      Collection;
  }
} CollectionJobResp;
]]></sourcecode>
          <t>The body's media type is "application/dap-collection-job-resp". The <tt>Collection</tt>
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. Note that 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>If the Leader finds the <tt>CollectionJobReq</tt> to be valid, it immediately responds
with HTTP status 201 Created with a body containing a <tt>CollectionJobResp</tt> with
the <tt>status</tt> field set to <tt>processing</tt>. The Leader <bcp14>SHOULD</bcp14> include a Retry-After
header field to suggest a polling interval to the Collector.</t>
          <t>After receiving the response to its <tt>CollectionJobReq</tt>, the Collector
periodically makes HTTP GET requests
<tt>/tasks/{task-id}/collection_jobs/{collection-job-id}</tt> to check on the status
of the collection job and eventually obtain the result. The Leader responds to GET
requests with HTTP status 200 and the <tt>status</tt> field reflecting the current
state of the job. When the collection job is <tt>processing</tt>, the response <bcp14>SHOULD</bcp14>
include a Retry-After header field to suggest a polling interval to the
Collector.</t>
          <t>The Leader then begins working with the Helper to aggregate the reports
satisfying the query (or continues this process, depending on the VDAF) as
described in <xref target="aggregate-flow"/>.</t>
          <t>The Leader first checks whether it can construct a batch for the
collection job by applying the requirements in <xref target="batch-validation"/>. If so, then
the Leader obtains the Helper's aggregate share following the aggregate-share
request flow described in <xref target="collect-aggregate"/>. If not, it either aborts the
collection job or tries again later, depending on which requirement in
<xref target="batch-validation"/> was not met. If the Leader has a pending aggregation job
that overlaps with the batch and aggregation parameter 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 trivial batch mismatch
errors.</t>
          <t>Once both aggregate shares are successfully obtained, the Leader responds to
subsequent HTTP GET requests with the <tt>status</tt> field set to <tt>ready</tt> and the
<tt>Collection</tt> field populated with the encrypted aggregate shares. The Collector
stops polling once receiving this final request.</t>
          <t>If obtaining aggregate shares fails, then the Leader responds to subsequent HTTP
GET requests to the collection job with an HTTP error status and a problem
document as described in <xref target="errors"/>.</t>
          <t>The Leader <bcp14>MAY</bcp14> respond with HTTP status 204 No Content to requests to a
collection job if the results have been deleted.</t>
          <t>The Collector can send an HTTP DELETE request to the collection job, which
indicates to the Leader that it can abandon the collection job and discard all
state related to it.</t>
        </section>
        <section anchor="collect-aggregate">
          <name>Obtaining Aggregate Shares</name>
          <t>The Leader must compute its own aggregate share, as well as obtaining 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 final 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>Then the Leader sends a POST request to
<tt>{helper}/tasks/{task-id}/aggregate_shares</tt> with the following message:</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 the request is "application/dap-aggregate-share-req". The
message 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: for time-interval mode, the <tt>config</tt> field contains the
time interval selected by the Collector (<xref target="time-interval-batch-mode"/>); in
leader-selected mode, the field contains the batch ID selected by the Leader
(<xref target="leader-selected-batch-mode"/>).  </t>
              <t>
Future documents that new batch modes <bcp14>MUST</bcp14> specify the contents of the
<tt>config</tt> field; see <xref target="extending-this-doc"/> for details.  </t>
              <t>
The indicated batch mode <bcp14>MUST</bcp14> match the task's batch mode. Otherwise, the
Helper <bcp14>MUST</bcp14> abort with "invalidMessage".</t>
            </li>
            <li>
              <t><tt>agg_param</tt>: The opaque aggregation parameter for the VDAF being executed.
This value <bcp14>MUST</bcp14> match the <tt>AggregationJobInitReq</tt> message for each aggregation
job used to compute the aggregate shares (see <xref target="leader-init"/>) and the
aggregation parameter indicated by the Collector in the CollectionJobReq
message (see <xref target="collect-init"/>).</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>Leaders <bcp14>MUST</bcp14> authenticate their requests to Helpers using a scheme that meets
the requirements in <xref target="request-authentication"/>.</t>
          <t>To handle the Leader's request, the Helper first ensures that it recognizes the
task ID in the request path. If not, it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>. The Helper then verifies that the request meets the
requirements for batch parameters following the procedure in
<xref target="batch-validation"/>. The Helper <bcp14>MUST</bcp14> validate that the aggregation parameter
matches the aggregation parameter used during aggregation of this batch;
otherwise, it aborts with "invalidMessage".</t>
          <t>Next, the Helper retrieves and combines the batch buckets associated with the
request using the same process used by the Leader (as described at the beginning
of this section <xref target="collect-aggregate"/>), arriving at its final 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> abort with an error of type "batchMismatch".</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>The Helper responds to the Leader with HTTP status code 200 OK and a body
consisting of an <tt>AggregateShare</tt>, with media type
"application/dap-aggregate-share":</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  HpkeCiphertext encrypted_aggregate_share;
} AggregateShare;
]]></sourcecode>
          <t><tt>encrypted_aggregate_share.config_id</tt> is set to the Collector's HPKE config ID.
<tt>encrypted_aggregate_share.enc</tt> is set to the encapsulated HPKE context <tt>enc</tt>
computed above and <tt>encrypted_aggregate_share.ciphertext</tt> is the ciphertext
<tt>encrypted_agg_share</tt> computed above.</t>
          <t>The Helper's handling of this request <bcp14>MUST</bcp14> be idempotent. That is, if multiple
identical, valid <tt>AggregateShareReq</tt>s are received, they should all yield the
same response.</t>
          <t>After receiving the Helper's response, the Leader uses the HpkeCiphertext to
finalize a collection job (see <xref target="collect-finalization"/>).</t>
          <t>Once an <tt>AggregateShareReq</tt> has been issued for the batch determined by a given
query, it is an error for the Leader to issue any more aggregation jobs for
additional reports that satisfy the query. These reports will be rejected by the
Helper as described in <xref target="input-share-validation"/>.</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>
        <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. In
particular, let <tt>leader_agg_share</tt> denote the Leader's aggregate share,
<tt>helper_agg_share</tt> denote the Helper's aggregate share, let <tt>report_count</tt>
denote the report count sent by the Leader, and let <tt>agg_param</tt> be 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-14 aggregate share" || server_role || 0x00,
    agg_share_aad,
    agg_share)
]]></sourcecode>
          <t>where <tt>pk</tt> is the HPKE public key encoded by the Collector's HPKE key,
<tt>server_role</tt> is the Role of the encrypting server (<tt>0x02</tt> for the Leader and
<tt>0x03</tt> for a Helper), <tt>0x00</tt> represents the Role of the recipient (always the
Collector), and <tt>agg_share_aad</tt> is a value of type <tt>AggregateShareAad</tt>. 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-14 aggregate share" || server_role || 0x00,
    agg_share_aad,
    enc_share.payload)
]]></sourcecode>
          <t>where <tt>sk</tt> is the HPKE secret key, <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),
<tt>0x00</tt> represents the Role of the recipient (always the Collector), and
<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>
          <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 anchor="batch-validation">
          <name>Batch Validation</name>
          <t>When the Leader receives a <tt>Query</tt> in the request from the Collector during
collection initialization (<xref target="collect-init"/>), it must first check that the
batch determined by the query can be collected. It does so as described here.
The Helper performs the same check when it receives a <tt>BatchSelector</tt> in the
request from the Leader for its aggregate share (<xref target="collect-aggregate"/>).</t>
          <t>First, the Aggregator checks if the request (the <tt>CollectionJobReq</tt> for the
Leader and the <tt>AggregateShareReq</tt> for the Helper) identifies a valid set of
batch buckets (<xref target="batch-buckets"/>). If not, it <bcp14>MUST</bcp14> abort the request with
"batchInvalid".</t>
          <t>Next, the Aggregator checks that batch contains a valid number of reports. The
Aggregator checks that <tt>len(X) &gt;= min_batch_size</tt>, where <tt>X</tt> is the set of
reports successfully aggregated into the batch and <tt>min_batch_size</tt> is the
minimum batch size for the task. If this check fails, then Helpers <bcp14>MUST</bcp14> abort
with an error of type "invalidBatchSize". Leaders <bcp14>SHOULD</bcp14> wait for more reports
to be validated and try the collection job again later.</t>
          <t>Next, the Aggregator checks if the set of batch buckets identified by the
request overlaps with the batch buckets that have already been collected. If
so, it <bcp14>MUST</bcp14> abort with "batchOverlap".</t>
          <t>Finally, the batch mode may define additional batch validation rules.</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>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 and how batch buckets</t>
        </li>
      </ol>
      <section anchor="time-interval-batch-mode">
        <name>Time Interval</name>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  time_interval(1),
  (255)
} BatchMode;
]]></sourcecode>
        <t>The time-interval batch mode is designed to support applications in which
reports are collected into batches grouped by an interval of time. The Collector
specifies a "batch interval" that determines the time range for reports included
in the batch. For each report in the batch, the time at which that report was
generated (see <xref target="upload-flow"/>) <bcp14>MUST</bcp14> fall within the batch interval specified by
the Collector.</t>
        <t>Typically the Collector issues queries for which the batch intervals are
continuous, monotonically increasing, and have the same duration. For example,
the sequence of batch intervals <tt>(1659544000, 1000)</tt>, <tt>(1659545000, 1000)</tt>,
<tt>(1659546000, 1000)</tt>, <tt>(1659547000, 1000)</tt> satisfies these conditions. (The
first element of the pair denotes the start of the batch interval and the second
denotes the duration.) 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 interval of time whose beginning is a
multiple of the task's <tt>time_precision</tt> and 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's timestamp is
1729629081, the relevant batch bucket identifier is <tt>(1729629000, 1000)</tt>. The
first element of the pair denotes the start of the batch interval and the
second denotes the duration.</t>
          <t>The <tt>Query</tt> received by the Leader determines a valid set of batch bucket
identifiers if the following conditions hold (likewise for the <tt>BatchSelector</tt>
received by the Helper):</t>
          <ul spacing="normal">
            <li>
              <t><tt>batch_interval.duration &gt;= time_precision</tt> (this field determines,
effectively, the minimum batch duration)</t>
            </li>
            <li>
              <t>both <tt>batch_interval.start</tt> and <tt>batch_interval.duration</tt> are divisible by
<tt>time_precision</tt></t>
            </li>
          </ul>
          <t>A batch consists of a sequence of contiguous batch buckets. That is, the set of
batch buckets identifiers for the batch interval is
<tt>(batch_interval.start,
  batch_interval.start + time_precision)</tt>,
<tt>(batch_interval.start + time_precision,
  batch_interval.start + 2*time_precision)</tt>, ...,
<tt>(batch_interval.start + batch_interval.duration - time_precision) +
  batch_interval.start + batch_interval.duration)</tt>.</t>
        </section>
      </section>
      <section anchor="leader-selected-batch-mode">
        <name>Leader-selected Batch Mode</name>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  leader_selected(2),
  (255)
} BatchMode;
]]></sourcecode>
        <t>The leader-selected batch mode is used to support applications in which it is
acceptable for reports to be batched in an arbitrary fashion by the Leader. Each
batch of reports is identified by an opaque "batch ID". Both the reports
included in each batch and the ID for each batch are allocated in an arbitrary
fashion by the Leader.</t>
        <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, which does not
include any information specifying a particular batch (see <xref target="batch-mode"/>). The
Leader selects a recent batch to aggregate. The Leader <bcp14>MUST</bcp14> select a batch that
has not yet been associated with a collection job.</t>
        <t>The Aggregators can output batches of any size that is larger than or equal to
<tt>min_batch_size</tt>. 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
selected by the Leader. 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>
          </ul>
          <t>In addition, for each DAP task, the Helper is required to:</t>
          <ul spacing="normal">
            <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>
          </ul>
          <t>In addition, for each DAP task, the Leader is required to:</t>
          <ul spacing="normal">
            <li>
              <t>Implement and store state for the form of inter- and intra-batch replay
mitigation in <xref target="agg-flow"/>. This requires storing the report IDs of all
reports processed for a given task. Implementations may find it helpful to
track additional information, like the timestamp, so that the storage used
for anti-replay can be sharded efficiently.</t>
            </li>
          </ul>
        </section>
        <section anchor="collector-capabilities">
          <name>Collector Capabilities</name>
          <t>Collectors statefully interact with Aggregators to produce an aggregate output.
Their input to the protocol is the task parameters, configured out of band,
which include the corresponding batch window and size. For each collect
invocation, Collectors are required to keep state from the start of the protocol
to the end as needed to produce the final aggregate output.</t>
          <t>Collectors must also maintain state for the lifetime of each task, which
includes key material associated with the HPKE key configuration.</t>
        </section>
      </section>
      <section anchor="vdafs-and-compute-requirements">
        <name>VDAFs and Compute Requirements</name>
        <t>The choice of VDAF can impact the computation and storage required for a DAP
task:</t>
        <ul spacing="normal">
          <li>
            <t>The runtime of VDAF sharding and preparation is related to the "size" of the
underlying measurements. For example, the Prio3SumVec VDAF defined in
<xref section="7" sectionFormat="of" target="VDAF"/> requires each measurement to be a vector of the same
length, which all parties need to agree on prior to VDAF execution. The
computation required for such tasks increases linearly as a function of the
chosen length, as each vector element must be processed in turn.</t>
          </li>
          <li>
            <t>The runtime of VDAF preparation is related to the size of the aggregation
parameter. For example for Poplar1 defined in <xref section="8" sectionFormat="of" target="VDAF"/>,
preparation takes as input a sequence of so-called "candidate prefixes", and
the amount of computation is linear in the number of prefixes.</t>
          </li>
          <li>
            <t>The storage requirements for aggregate shares vary depending on the size of
the measurements and/or the aggregation parameter.</t>
          </li>
        </ul>
        <t>To account for these factors, care must be taken that a DAP deployment can
handle VDAF execution of all possible configurations for any tasks which the
deployment may be configured for. Otherwise, an attacker may deny service by
uploading many expensive reports to a suitably-configured VDAF.</t>
        <t>The varying cost of VDAF computation means that Aggregators should negotiate
reasonable limits for each VDAF configuration, out of band with the protocol.
For example, Aggregators may agree on a maximum size for an aggregation job or
on a maximum rate of incoming reports.</t>
        <t>Applications which require computationally-expensive VDAFs can mitigate the
computation cost of aggregation in a few ways, such as producing aggregates over
a sample of the data or choosing a representation of the data permitting a
simpler aggregation scheme.</t>
      </section>
      <section anchor="aggregation-utility-and-soft-batch-deadlines">
        <name>Aggregation Utility and Soft Batch Deadlines</name>
        <t>A soft real-time system should produce a response within a deadline to be
useful. This constraint may be relevant when the value of an aggregate decreases
over time. A missed deadline can reduce an aggregate's utility but not
necessarily cause failure in the system.</t>
        <t>An example of a soft real-time constraint is the expectation that input data can
be verified and aggregated in a period equal to data collection, given some
computational budget. Meeting these deadlines will require efficient
implementations of the VDAF. Applications might batch requests or utilize more
efficient serialization to improve throughput.</t>
        <t>Some applications may be constrained by the time that it takes to reach a
privacy threshold defined by a minimum number of reports. One possible solution
is to increase the reporting period so more samples can be collected, balanced
against the urgency of responding to a soft deadline.</t>
      </section>
      <section anchor="protocol-specific-optimizations">
        <name>Protocol-specific Optimizations</name>
        <t>Not all DAP tasks have the same operational requirements, so the protocol is
designed to allow implementations to reduce operational costs in certain cases.</t>
        <section anchor="sharding-storage">
          <name>Reducing Storage Requirements</name>
          <t>In general, the Aggregators are required to keep state for tasks and all valid
reports for as long as collection requests can be made for them. However, it is
not necessary to store the complete reports. Each Aggregator only needs to
store an aggregate share for each possible batch bucket i.e., the batch
interval for time-interval or batch ID for leader-selected, along with a flag
indicating whether the aggregate share has been collected. This is due to the
requirement for queries to respect bucket boundaries. See <xref target="batch-validation"/>.</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 has not passed this task's end time <tt>task_start + task_duration</tt>.
Aggregator <bcp14>MAY</bcp14> delete the task and all data pertaining to this task after the
end time. 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 ignore 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 will want to 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 robustness, 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 contianing 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>
    </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 robustness security goals defined in
<xref section="9" sectionFormat="of" target="VDAF"/>, even in the presence of an active attacker. It is
assumed that the attacker may control the network and have the ability to
control a subset of of Clients, one of the Aggregators, and the Collector for a
given task.</t>
      <t>In the presence of this adversary, there are some threats DAP does not defend
against and which are considered outside of DAP's threat model. These are
enumerated below, along with potential mitigations.</t>
      <t>Attacks on robustness:</t>
      <ol spacing="normal" type="1"><li>
          <t>Aggregators can defeat robustness by emitting incorrect aggregate shares, by
omitting reports from the aggregation process, or by manipulating the VDAF
preparation process for a single report. DAP follows VDAF in providing
robustness only if both Aggregators honestly follow 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 privacy or robustness involve malicious Clients uploading
reports that are valid under the chosen VDAF but incorrect.</t>
        <t>For example, a DAP deployment might be measuring the heights of a human
population and configure a variant of Prio3 to prove that measurements are
values in the range of 80-250 cm. A malicious Client would not be able to claim
a height of 400 cm, but they could submit multiple bogus reports inside the
acceptable range, which would yield incorrect averages. More generally, DAP
deployments are susceptible to Sybil attacks <xref target="Dou02"/>, especially when carried
out by the Leader.</t>
        <t>In this type of attack, the adversary adds to a batch a number of reports that
skew the aggregate result in its favor. For example, sending known measurements
to the Aggregators can allow a Collector to shrink the effective anonymity set
by subtracting the known measurements from the aggregate result. The result may
reveal additional information about the honest measurements, leading to a
privacy violation; or the result may have some property that is desirable to the
adversary ("stats poisoning").</t>
        <t>Depending on the deployment and the specific threat being mitigated, there are
different ways to address Sybil attacks, such as:</t>
        <ol spacing="normal" type="1"><li>
            <t>Implementing Client authentication, as described in <xref target="client-auth"/>, likely
paired with rate-limiting uploads from individual Clients.</t>
          </li>
          <li>
            <t>Removing Client-specific metadata on individual reports, such as through the
use of anonymizing proxies in the upload flow, as described in
<xref target="anon-proxy"/>.</t>
          </li>
          <li>
            <t>Some mechanisms for differential privacy (<xref target="dp"/>) can help mitigate Sybil
attacks against privacy to some extent.</t>
          </li>
        </ol>
      </section>
      <section anchor="batch-selection">
        <name>Batch-selection Attacks</name>
        <t>Depending on the batch mode, the privacy of an individual Client may be
infringed upon by selection of the batch. For example, in the leader-selected
batch mode, the Leader is free to select the reports that compose a given batch
almost arbitrarily; a malicious Leader might choose a batch composed of reports
arriving from a single client. The aggregate derived from this batch might then
reveal information about that Client.</t>
        <t>The mitigations for this attack are similar to those used for Sybil attacks
(<xref target="sybil"/>):</t>
        <ol spacing="normal" type="1"><li>
            <t>Implementing Client authentication, as described in <xref target="client-auth"/>, and
having each aggregator verify that each batch contains reports from a
suitable number of distinct clients.</t>
          </li>
          <li>
            <t>Disassociating each report from the Client which generated it, via the use of
anonymizing proxies (<xref target="anon-proxy"/>) or similar techniques.</t>
          </li>
          <li>
            <t>Differential privacy (<xref target="dp"/>) can help mitigate the impact of this attack.</t>
          </li>
          <li>
            <t>Deployment-specific mitigations may also be possible: for example, if every
Client is sending reports at a given rate, it may be possible for aggregators
to bound the accepted age of reports such that the number of aggregatable
reports from a given Client is small enough to effectively mitigate this
attack.</t>
          </li>
        </ol>
      </section>
      <section anchor="client-auth">
        <name>Client Authentication</name>
        <t>In settings where it is practical for each Client to have an identity
provisioned (e.g., a user logged into a backend service or a hardware device
programmed with an identity), Client authentication can help Aggregators (or an
authenticating proxy deployed between Clients and the Aggregators; see
<xref target="anon-proxy"/>) ensure that all reports come from authentic Clients. Note that
because the Helper never handles messages directly from the Clients, reports
would need to include an extension (<xref target="report-extensions"/>) to convey
authentication information to the Helper. For example, a deployment might
include a Privacy Pass token (<xref target="I-D.draft-ietf-privacypass-architecture-16"/>)
in a report extension to allow both Aggregators to independently verify the
Client's identity.</t>
        <t>However, in some deployments, it will not be practical to require Clients to
authenticate, so Client authentication is not mandatory in DAP. For example, a
widely distributed application that does not require its users to log in to any
service has no obvious way to authenticate its report uploads.</t>
      </section>
      <section anchor="anon-proxy">
        <name>Anonymizing Proxies</name>
        <t>Client reports may be transmitted alongside auxiliary information such as
source IP, HTTP user agent, or Client authentication information (in
deployments which use it, see <xref target="client-auth"/>). This metadata can be used by
Aggregators to identify participating Clients or permit some attacks on
robustness. 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 deanonmyizing 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="verification-key">
          <name>VDAF Verification Key Requirements</name>
          <t>Knowledge of the verification key would allow a Client to forge a report with
invalid values that will nevertheless pass verification. Therefore, the
verification key must be kept secret from Clients.</t>
          <t>Furthermore, for a given report, it may be possible to craft a verification key
which leaks information about that report's measurement during VDAF preparation.
Therefore, the verification key for a task <bcp14>SHOULD</bcp14> be chosen before any reports
are generated. Moreover, it <bcp14>SHOULD</bcp14> be fixed for the lifetime of the task and not
be rotated. One way to ensure that the verification key is generated
independently from any given report is to derive the key based on the task ID
and some previously agreed upon secret (verify_key_seed) between Aggregators, as
follows:</t>
          <sourcecode type="pseudocode"><![CDATA[
verify_key = HKDF-Expand(
    HKDF-Extract(
        "verify_key",    # salt
        verify_key_seed, # IKM
    ),
    task_id,             # info
    VERIFY_KEY_SIZE,     # L
)
]]></sourcecode>
          <t>Here, VERIFY_KEY_SIZE is the length of the verification key, and HKDF-Extract
and HKDF-Expand are as defined in <xref target="RFC5869"/>.</t>
          <t>This requirement comes from current security analysis for existing VDAFs. In
particular, the security proofs for Prio3 require that the verification key is
chosen independently of the generated reports.</t>
        </section>
        <section anchor="batch-parameters">
          <name>Batch Parameters</name>
          <t>An important parameter of a DAP deployment is the minimum batch size. If a batch
includes too few reports, then the aggregate result can reveal information
about individual measurements. Aggregators enforce the agreed-upon minimum
batch size during collection, but implementations <bcp14>SHOULD</bcp14> also opt out of
participating in a DAP task if the minimum batch size is too small. This
document does not specify how to choose an appropriate minimum batch size, but
an appropriate value may be determined from the differential privacy (<xref target="dp"/>)
parameters in use, if any.</t>
        </section>
        <section anchor="task-configuration-agreement-and-consistency">
          <name>Task Configuration Agreement and Consistency</name>
          <t>In order to execute a DAP task, it is necessary for all parties to ensure they
agree on the configuration of the task. However, it is possible for a party to
participate in the execution of DAP without knowing all of the task's
parameters. For example, a Client can upload a report (<xref target="upload-flow"/>) without
knowing the minimum batch size that is enforced by the Aggregators during
collection (<xref target="collect-flow"/>).</t>
          <t>Depending on the deployment model, agreement can require that task parameters
are visible to all parties such that each party can choose whether to
participate based on the value of any parameter. This includes the parameters
enumerated in <xref target="task-configuration"/> and any additional parameters implied by
report extensions <xref target="report-extensions"/> used by the task. Since meaningful
privacy requires that multiple Clients contribute to a task, they should also
share a consistent view of the task configuration.</t>
        </section>
      </section>
      <section anchor="infrastructure-diversity">
        <name>Infrastructure Diversity</name>
        <t>DAP deployments should ensure that Aggregators do not have common dependencies
that would enable a single vendor to reassemble measurements. For example, if
all participating Aggregators stored unencrypted input shares on the same cloud
object storage service, then that cloud vendor would be able to reassemble all
the input shares and defeat privacy.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests registry of new media types (<xref target="iana-media-types"/>),
creation of new codepoint registries (<xref target="iana-codepoints"/>), and registration of
an IETF URN sub-namespace (<xref target="urn-space"/>).</t>
      <t>(RFC EDITOR: In the remainder of this section, replace "RFC XXXX" with the RFC
number assigned to this document.)</t>
      <section anchor="iana-media-types">
        <name>Protocol Message Media Types</name>
        <t>This specification defines the following protocol messages, along with their
corresponding media types:</t>
        <ul spacing="normal">
          <li>
            <t>HpkeConfigList <xref target="hpke-config"/>: "application/dap-hpke-config-list"</t>
          </li>
          <li>
            <t>Report <xref target="upload-request"/>: "application/dap-report"</t>
          </li>
          <li>
            <t>AggregationJobInitReq <xref target="leader-init"/>: "application/dap-aggregation-job-init-req"</t>
          </li>
          <li>
            <t>AggregationJobResp <xref target="aggregation-helper-init"/>: "application/dap-aggregation-job-resp"</t>
          </li>
          <li>
            <t>AggregationJobContinueReq <xref target="aggregation-leader-continuation"/>: "application/dap-aggregation-job-continue-req"</t>
          </li>
          <li>
            <t>AggregateShareReq <xref target="collect-aggregate"/>: "application/dap-aggregate-share-req"</t>
          </li>
          <li>
            <t>AggregateShare <xref target="collect-aggregate"/>: "application/dap-aggregate-share"</t>
          </li>
          <li>
            <t>CollectionJobReq <xref target="collect-init"/>: "application/dap-collection-job-req"</t>
          </li>
          <li>
            <t>CollectionJobResp <xref target="collect-init"/>: "application/dap-collection-job-resp"</t>
          </li>
        </ul>
        <t>Protocol message format evolution is supported through the definition of new
formats that are identified by new media types. The messages above are specific
to this specification. When a new major enhancement is proposed that results in
newer IETF specification for DAP, a new set of media types will be defined. In
other words, newer versions of DAP will not be backward compatible with this
version of DAP.</t>
        <t>(RFC EDITOR: Remove this paragraph.) HTTP requests with DAP media types <bcp14>MAY</bcp14>
express an optional parameter 'version', following <xref section="8.3" sectionFormat="of" target="RFC9110"/>.
Value of this parameter indicates current draft version of the protocol the
component is using. This <bcp14>MAY</bcp14> be used as a hint by the receiver of the request
to do compatibility checks between client and server.
For example, A report submission to leader from a client that supports
draft-ietf-ppm-dap-09 could have the header
<tt>Content-Type: application/dap-report;version=09</tt>.</t>
        <t>The "Media Types" registry at https://www.iana.org/assignments/media-types will
be (RFC EDITOR: replace "will be" with "has been") updated to include each of
these media types. The information required for each media type is listed in
the remaining subsections.</t>
        <section anchor="applicationdap-hpke-config-list-media-type">
          <name>"application/dap-hpke-config-list" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-hpke-config-list</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="upload-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-report-media-type">
          <name>"application/dap-report" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-report</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="upload-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregation-job-init-req-media-type">
          <name>"application/dap-aggregation-job-init-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregation-job-init-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="aggregate-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregation-job-resp-media-type">
          <name>"application/dap-aggregation-job-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregation-job-resp</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="aggregate-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregation-job-continue-req-media-type">
          <name>"application/dap-aggregation-job-continue-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregation-job-continue-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="aggregate-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregate-share-req-media-type">
          <name>"application/dap-aggregate-share-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregate-share-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregate-share-media-type">
          <name>"application/dap-aggregate-share" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregate-share</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-collection-job-req-media-type">
          <name>"application/dap-collection-job-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-collection-job-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-collection-job-resp-media-type">
          <name>"application/dap-collection-job-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-collection-job-resp</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/> of the published specification</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFC XXXX</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section of the published specification</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="iana-codepoints">
        <name>DAP Type Registries</name>
        <t>This document also requests creation of a new "Distributed Aggregation Protocol
(DAP)" page. This page will contain several new registries, described in the
following sections. All registries are administered under the Specification
Required policy <xref target="RFC8126"/>.</t>
        <section anchor="batch-mode-reg">
          <name>Batch Modes Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "Batch Mode Identifiers" for DAP batch modes (<xref target="batch-mode"/>). This
registry should contain the following columns:</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The one-byte identifier for the batch mode</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the batch mode</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the batch mode is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry listed in <xref target="batch-mode-id"/>.</t>
          <table anchor="batch-mode-id">
            <name>Initial contents of the Batch Mode Identifiers registry.</name>
            <thead>
              <tr>
                <th align="left">Value</th>
                <th align="left">Name</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>reserved</tt></td>
                <td align="left">
                  <xref target="batch-mode"/> of RFC XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">
                  <tt>time_interval</tt></td>
                <td align="left">
                  <xref target="time-interval-batch-mode"/> of RFC XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x02</tt></td>
                <td align="left">
                  <tt>leader_selected</tt></td>
                <td align="left">
                  <xref target="leader-selected-batch-mode"/> of RFC XXXX</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="report-extension-registry">
          <name>Report Extension Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "Report Extension Identifiers" for extensions to the upload interaction
(<xref target="upload-flow"/>). This registry should contain the following columns:</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The two-byte identifier for the upload extension</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the upload extension</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the upload extension is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are listed in <xref target="upload-extension-id"/>.</t>
          <table anchor="upload-extension-id">
            <name>Initial contents of the Report Extension Identifiers registry.</name>
            <thead>
              <tr>
                <th align="left">Value</th>
                <th align="left">Name</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>0x0000</tt></td>
                <td align="left">
                  <tt>reserved</tt></td>
                <td align="left">RFC XXXX</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="report-error-reg">
          <name>Report Error Registry</name>
          <t>A new registry will be (RFC EDITOR: change "will be" to "has been") created
called "Report Error Identifiers" for reasons for rejecting reports during the
aggregation interaction (<xref target="aggregation-helper-init"/>).</t>
          <dl>
            <dt>Value:</dt>
            <dd>
              <t>The one-byte identifier of the report error</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>The name of the report error</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>Where the report error is defined</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are listed below in <xref target="report-error-id"/>.</t>
          <table anchor="report-error-id">
            <name>Initial contents of the Report Error Identifiers registry.</name>
            <thead>
              <tr>
                <th align="left">Value</th>
                <th align="left">Name</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>reserved</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> 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="aggregation-helper-init"/> 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="aggregation-helper-init"/> 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="aggregation-helper-init"/> 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="aggregation-helper-init"/> 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="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x06</tt></td>
                <td align="left">
                  <tt>vdaf_prep_error</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> 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="aggregation-helper-init"/> 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="aggregation-helper-init"/> 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="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x10</tt></td>
                <td align="left">
                  <tt>task_not_started</tt></td>
                <td align="left">
                  <xref target="aggregation-helper-init"/> of RFX XXXX</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="urn-space">
        <name>URN Sub-namespace for DAP (urn:ietf:params:ppm:dap)</name>
        <t>The following value will be (RFC EDITOR: change "will be" to "has been")
registered in the "IETF URN Sub-namespace for Registered Protocol
Parameter Identifiers" registry, following the template in <xref target="RFC3553"/>:</t>
        <artwork><![CDATA[
Registry name:  dap

Specification:  RFC XXXX

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

Index value:  No transformation needed.
]]></artwork>
        <t>The initial contents of this namespace are the types and descriptions in
<xref target="urn-space-errors"/>, with the Reference field set to RFC XXXX.</t>
      </section>
    </section>
    <section anchor="extending-this-doc">
      <name>Extending this Document</name>
      <t>The behavior of DAP may be extended or modified by future documents defining
one or more of the following:</t>
      <ol spacing="normal" type="1"><li>
          <t>a new batch mode (<xref target="batch-mode"/>)</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="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="10" month="January" year="2025"/>
            <abstract>
              <t>   This document describes Verifiable Distributed Aggregation Functions
   (VDAFs), a family of multi-party protocols for computing aggregate
   statistics over user measurements.  These protocols are designed to
   ensure that, as long as at least one aggregation server executes the
   protocol honestly, individual measurements are never seen by any
   server in the clear.  At the same time, VDAFs allow the servers to
   detect if a malicious or misconfigured client submitted an invalid
   measurement.  Two concrete VDAFs are specified, one for general-
   purpose aggregation (Prio3) and another for heavy hitters (Poplar1).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vdaf-14"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC7807">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <date month="March" year="2016"/>
            <abstract>
              <t>This document defines a "problem detail" as a way to carry machine- readable details of errors in a HTTP response to avoid the need to define new error response formats for HTTP APIs.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7807"/>
          <seriesInfo name="DOI" value="10.17487/RFC7807"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="HPKE">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="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="RFC9457">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <author fullname="S. Dalal" initials="S." surname="Dalal"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>This document defines a "problem detail" to carry machine-readable details of errors in HTTP response content to avoid the need to define new error response formats for HTTP APIs.</t>
              <t>This document obsoletes RFC 7807.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9457"/>
          <seriesInfo name="DOI" value="10.17487/RFC9457"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5861">
          <front>
            <title>HTTP Cache-Control Extensions for Stale Content</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document defines two independent HTTP Cache-Control extensions that allow control over the use of stale responses by caches. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5861"/>
          <seriesInfo name="DOI" value="10.17487/RFC5861"/>
        </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="I-D.draft-dcook-ppm-dap-interop-test-design-04">
          <front>
            <title>DAP Interoperation Test Design</title>
            <author fullname="David Cook" initials="D." surname="Cook">
              <organization>ISRG</organization>
            </author>
            <date day="14" month="June" year="2023"/>
            <abstract>
              <t>   This document defines a common test interface for implementations of
   the Distributed Aggregation Protocol for Privacy Preserving
   Measurement (DAP) and describes how this test interface can be used
   to perform interoperation testing between the implementations.  Tests
   are orchestrated with containers, and new test-only APIs are
   introduced to provision DAP tasks and initiate processing.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-dcook-ppm-dap-interop-test-design-04"/>
        </reference>
        <reference anchor="I-D.draft-ietf-privacypass-architecture-16">
          <front>
            <title>The Privacy Pass Architecture</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="September" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for authorization
   based on privacy-preserving authentication mechanisms.  It describes
   the conceptual model of Privacy Pass and its protocols, its security
   and privacy goals, practical deployment models, and recommendations
   for each deployment model that helps ensure the desired security and
   privacy goals are fulfilled.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-architecture-16"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
      </references>
    </references>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="J." surname="Aas" fullname="Josh Aas">
        <organization>ISRG</organization>
        <address>
          <email>josh@abetterinternet.org</email>
        </address>
      </contact>
      <contact initials="J." surname="Chen" fullname="Junye Chen">
        <organization>Apple</organization>
        <address>
          <email>junyec@apple.com</email>
        </address>
      </contact>
      <contact initials="D." surname="Cook" fullname="David Cook">
        <organization>ISRG</organization>
        <address>
          <email>dcook@divviup.org</email>
        </address>
      </contact>
      <contact initials="S." surname="Ganta" fullname="Suman Ganta">
        <organization>Apple</organization>
        <address>
          <email>sganta2@apple.com</email>
        </address>
      </contact>
      <contact initials="A." surname="Ghani" fullname="Ameer Ghani">
        <organization>ISRG</organization>
        <address>
          <email>inahga@divviup.org</email>
        </address>
      </contact>
      <contact initials="K." surname="Guo" fullname="Kristine Guo">
        <organization>Apple</organization>
        <address>
          <email>kristine_guo@apple.com</email>
        </address>
      </contact>
      <contact initials="C." surname="Harrison" fullname="Charlie Harrison">
        <organization>Google</organization>
        <address>
          <email>csharrison@chromium.org</email>
        </address>
      </contact>
      <contact initials="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+y9+3Ybx5Uv/H89RQ+0zjLpABBJURdT44xpSbY5sS2NJMcn
k8khmkCTbBPoRtANUoyteZbzLN+Tfftatau6QVKKM5lZJ15ZsdnoruuuXfv6
26PRyLVlOy8OssHzsmlX5cm6LWbZ4dnZqjjL27Kusleruq2n9Tw7rVfwR3mZ
T6/h30VTrC7L6iz7rsib9apYFFU7cPnJyaq4PMieH75ys3pa5QtoerbKT9tR
WbSno+VyMZrly9HuvpvmbXFWr64PsqaduWZ9siibBjpsr5fwzdGLt185d1lU
6+LAZdnZql4vYZC39Z9l/Pngx3p1gb9+jR/i80VezuE5DOALHMm4Xp3h43w1
PYfH5227bA7u38e38FF5WYz1tfv44P7Jqr5qivvw/X387qxsz9cn8CVN6+oM
Z3a/O1F8dQ4TbVrTiflkzO2My7rn455H4/N2MR/AwhxkD5zL1+15vYL1GUE3
9E9ZNQfZ23H2dVGfncMOVvoD78TbctH9CaaYV+VfaLdh4d+8/lp/KXjR2nJx
Bh/9BgfyxRk+G0/rhUu7fTbOXuVtWyd9PjtfAWXVy/Nilfwed/xsXq9np7D6
RdL9FBtY0pe3DeFLGELZLtJpf7nKqxmScvTbrfM+gc++wP8bz+H7Tmcvxtnr
opnWq3ked/diVU47PyW9VbNiWcD/VW3SaXGx+mLVni42LfHhOPuxrmeb1zh5
4a6LnF99cV7kSzgzJ2XbjKuidW4Kp5FYQkxk3Oe/1s15dpg3pqPeVfwJ3vsi
PynatliVFfwfNI3HynVbXFfXBcylqKI2D5fLeTrcn/DV6Rc5/pSuFDf2PL8s
Z9mzur64bYCzKbz0xay8vCzXy/6RvVkD3WRf51Wb3zq05gxf27tpbIeLAjbq
63PYmNsGV1b5+Vl+8+h+h5tfVkX29bq+dXgX8vLx2bq+aYzPzvPVvCyyb/IV
fFHHW/J1XZ91Wp425/LuF3Bk60W5XvSP91UBVJC9yYEaRofVrEOLTbvEN/rP
uWwIcGjYkTf5eXkSjQyO+mWnPXr5Il/PG3z/pnZfnZfzeblcZm+m5zXw3Ly6
w8Qb/+4XZ/R7f9vf5StY+Ozteb1I1/O7+i/Qb560u2i/WPAPmxYBluDHvDq7
nSbhzeMreNPueFnBjb4AxnAJVyx88Lxe7+wd0JcqE7w9L7I31yflPDts23x6
MaBf/bVD/4w8PzivstdjbGZarFf066o4RR4CXA4aO6LDT4won2d4QTewbhny
ZTgOo7Ye4b+hv6YtFk22dfTq7as329zlDO7Qg2xvZ2ePx5evzgpoU2/UWV3S
Tb27M97d2Xl8/8Ho4f7OaP/h4/0noyfHe/s4vd/ns91H3ek9qxewIu/K9jqr
T7Pn5elpsYLxljBEETZumvSbfA6LA02fy72iA919FA3U3/1LbrOt63kzbkB0
GcOhucxXs3ExW98/LedFE70jj6Z+lPLj8e54OTsFSWA0GmX5CYhu+RQ4Nsxo
VYBQU4C8U11nTdmuacEbYCTZ1Xk5Pc/KNiubbFY05So/mRdZW8MoL+CDIEc1
uBQwk9zxJ8uiht4z2MqmnMEWNQX8B9LNGC6yrD0HWQwukKZohvhHhssHywmt
ogQGT5xpGztfN+t8Pr/Oqhr+RKoA+QikThgi9/QJDhdYXjmD94CImiX0XDQZ
3ERulbd4y8G7uQip8CWOdQxbWV1i30RfiwL2a9bA139elysc/HxeTFscUWjb
hbbhhsehhmZl7Auc0xrbWaLMWdHzHJ6tirzFxVuDIJrJrjhsZYX3+gpf4z1Y
wwpGizsDIiun63lLnZaLJe5dOc3nY2AOuDf1dI1vOtikKdy/OLpsAe+XoyXw
kGtoIIjquRHVlyqqb4H8vU0Cuw5sGQRmuxlbr159ty2EMQVuclLgfGY4L1mw
sMy0ytkVCKw17kNxWQDx42LAJM124XrABtKWMHkuytkMWJK7B9TSrurZeoqj
RWI1k83CZJGGbtVG7jpFXNMirAz0WLwrptTuyTWs6xxPKFB0izQ/hRsPd4iI
4ap2dnGx7WLVcHv6Q71qPsnO6pwapkVbLKHtrKkX4aXCNS20AdfuNKuhjZga
zoqqWOUyHh2ArHI2L/JV1XOKaJEWTTG/LBqhGvjfIp/BVGtQo/BgnxhCkSZk
fDQhly9qeWpmgweLKBZ2OoczfJ63wyxvsjm+C//OaUwNrBbIG7BiOAwnK8o7
55f6HF5p2vn1EM55lnCA4pLYCBy3suKB4UxpR6prF8YDFHTvHsoiFWzStzUI
E1uvv3qWvXh+9Pbl6wMQshewoNAANNkURFbjbXjnPz7dRhG7RB0TD8+UG8DZ
gFRf5Be4witeDlgMuOCQYeGiyxSKy7KGQ08KGIxhdx9uyFH2Am/MaZH9/vnh
V/HBy1dwHaBUcwlnYgaNhU1BJrcq5gWIIK3q0PWDIVwPfOyEQQHPrea84Mhr
6hXs8UlhmRz8sKhp5afIeGkdtWFoDZvGgTX0X9y2jiZjbQP7gG25YsYEah0t
DvcGp/TsHFYHRQfT6ZbtFTcLj904wxXGFXkt3BXYObfX5oslnQQYe7taV1Ol
7An+fAwrOy1Ry5+ENr5cL5ZqIwDNZzQ9XZ2NLmf56Wj3Aba0u5/9/PM/4dTe
v6fTJzccUNUpdCD8vkaJg/YWaZ03vGHqKsNGjkADylfl6TVeZrAydDXieq2K
n+R28IufIyOsmTx1jYo2R8aGu1dW0/l6pgfLT554x3J9MofDTv+J3Ak4QvGu
xVsT+ouGQfuNDXxTzJfFSi67GXMAkCP2ssPptFi2zJPzypIdDAKlq7LiO54o
CQYx9ouK/Ap/aPOz7BQk8mxAtpcHA2yL/3t/oBux++Dglt3Yo914EHaDJpjP
6iVPAXhNkS9Kkkft6aAr/jRHqoXJ1CtcNGQLU7sGQFdI0HQI9FgCE8NlQOEt
IeyoefhqNSOZIAgmOJXDmd+JsPo4h2Q3AykewV2MDMW/Dty0RG6LPZ/kLd7k
9QxZrn7xfL1SElgv53U+49nmRJZDPBdw3PDXb4scxwi9l8KYSPJCCZR4Pk8M
pipXkYzRDBwEt1ldNNUnLXDoJf7qZ5nD2oNkQFTIAl1zEZgS32cqCAmlw9x8
L7CA6xZFO+ieeTq35NnHFYy5vkJpb1qizQKltyF+PIdd5fexxwKvTfyQiBfV
GXo8W68SNhkdgTWKS80SGMNpibyiOAfVHdY7X9XrKhZwmoviCrqd4i16PbY7
dnT4/aEXUEXkZeqcZWdreAiiSsH7SEtKBxdobsxcDKX5bCA76Necz0m6E4Mh
tTwAXrZEPlSsVvUKX4X5+pfp2ZAZIVo+gBLKM+Yl2Fcj6wyCMxosG3/3lMjG
AlvDm+S247xnjvODcJz3bjnOO0/oOO+F48zz4p245qEWV/Pr0aw4hcVDixJq
j0i7OApS7N61eOrpBBDLz/ExEjfreUpNeLh19MCSQUTE60+vWyKSo+fhUCFJ
C4nTjg3y5rpCm0IFl/LAUsQwZtNyyJYguqrQlClnxYaYlTcoesPIihzOM2ge
S/zDNBoG8sMS9TmvO5AUCHcnCHLERxbEEWShYkL1r5Ui8tL6kXDF88Iuzaz6
+w+3RKHnl6U/ORtCbXQQr0nyKoTx0J7hGlyRTlNh73jzyxdHz0FaXDd438Nd
WUwvUL7AzQeZizUxZqkk0q7gxIEcB21i8y6T/ho5OySC2e1aojaPe/rNq9+9
QII4Lc+EBTRWdOBDB3fW6ppOAdNxYLN8fuKDwxQFLD9qFsYEvGotjKdEht05
QtIfNjQ4Ld8Vs1FT/gX6DP1R93MioRGI1jDXYtY3Bku7nlvpuMJ07PLgq5NF
/u6YejvGnidGapRjsmFc0hDtDbeEaqA2RQOtV5MMuOd8pk1NnnmaneARBZ0L
xO+hv2WuchQecWy028Qhst1dkvVLES2J3kjumBXT1TXc8uYg8DFC+sY7C9Ud
sgB0zs7kFbPJF8gRJ3QhToNJwlMZjwUFnHVFGijvJyliNZEc6V80t78Uq1p+
p0NdoEHzzNzJXqUMSuSoIbMSE7kcO7GKE8sqVlWjuki9lCskn7OIZS8VVTOi
juCWKUUOxV3Kz3jkIP/SdRgd3Y/uZAZKifxO3F80FbRJ8DzmIPOusW+ggZ9/
fiMb9QD+hB7+CfSmJ/v7j0Bqw0XzJNF4xXvmpWW5jHmfuuLqzBrJRPsG9aEt
z2R4aEk4B67Lx0TeAHmBTDcoFaDhclWfAAOCS7kZ9qzJTSty02W4ay7DvXAZ
7h5s4FVsVjF0DWtHBwuNWXAWrgrQbHLWbMPphDmEc/5Jk01OruU4lrMJ/9Rl
4sv1CnTzwgh3R8+B2kt4HVfh1qntmKnthqntsGoKBFivcENU9aEv0ew4K0Hm
yVfAwFGtLa6oo1cwY3ucf6pPRAj55u3bV9nXL96iON0CM8Txvnr55q092SQm
qewYvsLXos9+eNtdhugwsP2mBkl/4S1BvBKvQKyD/SfhLUfdEwbJLBE3oOF7
DQ4YXXKsHtBAqroawaGHozJP1JAgD9+21DufmaXe8Uu98xkt9VeeDGiny6I5
AEnggnkT8PhysV6YoQJVM0mPN33sTZTrFZ6qEX8rPzNzhJNaETsDrbNVAh3f
uKxGiaLlid9ezwsvRUzRlMmWPJACTshXSn+axUP6kHsIGl6QpI+8gBT/VNuA
uVyWbISiy3OOv7ZloS3Aj2hyg/micnHbSe+XXh9j0yDDGtNAZFDYsLOPw87C
LvudfXJw41qCKIXMrvzLxmVBkXVRr4p0Nvg1e1By8qDw2y/eLXGtPW3rRpzX
daPqJBmZYBaeEWcXxXXQ+CrWMYgDwYDP8Kq79kJuJIuuT0ZqlIPvdx4f3LZI
j8wiPR4EU1aenazPRsAGiZM05FFmGbsg9tOQeXNe1yhOskwgzOiqIL0YND2S
J5bl9AL0ZeX7am9DMY5H5Dfm0W1azCOig8d9dPASGjvP1/ONpLZ1b//Jk21Z
U7Ri0LRgiOgGHy1r8hWI7cJLST2UCO18tr8d9qbXMgjDnKglu3hzDofkMIfL
Ar99sn034n1o9uVRIN6Ht63RQ1qjR31r9AaveqTsIjbeEiFd1eJwYP66VY6L
8ZAsv6JoIRG/rIKStZ1YeNYsA95EkeJCUS0KdWi/+gOz/H0DCroVi6EbKMQo
lt4cc1rjf9JxnrZqFwJlqMlPC7op4Q4pZgfpYRdeCRoWCW32+gw/eXMLC6bG
vPdJY9wp6C5n2f67An0Q4Tw3wlvJWoPhQzOWBFf1kqwfxH95TDBqdSCQUrdu
2D9F8np9tsqX5+hZginRIcCtWjbFelZTSMwiq9aLE9hIaYPsa8WKrPP2NZRP
gi2b9YKxtf8aTS8jCxHacla6qCzk3Hrr7hvyfhjIm23v6joiBb5eoxke5B3o
CTafhI/DV0fwyb29x0+G2b0Hn+H/7+/sbHfkD88Mujemst/Aeq+J6eIh3XmM
De7uRmbvZ+KuQZYm8kpFhnKiAF7hslquWxZXcMdn7IGEZ6grwUD3kZTu7e89
3I7sH0T5l2jYPmWbWgNXRiVeIqDXtmzXqBWoFAZDCCpftoANA01gDE1jHzT2
nQfbqXJGJMhmvmBC9mviTSscwRZWLgdp5ropG16YJzyB3Z1brPk7ZM0HZmTZ
EEz8s+07MT9jtd4hqzV8uq+f7jwQB82qFIsM69LHrEsHYV0EEuECsmK1qKB0
YsluCacMlgBOjXGFsFimnrmLitkHGQHoF5Dm0Ss9u8zZQfMcOVLZsLGSFG69
59CWQv6zdTuqT0cocaU86tC45HDIM2ikRbGJFBb0xt9oXNkoyRTkwmJhDxQf
tuSMs+/hkkKGfXVeQtNsAGjW6KYuOUSNjABo/kGCK2g9gilpKF/k86aGHur1
2XnfB8if2BIVXEWpkcTYu72S+5o7UnNubMunW2uOsUTwHLlbfk3aidr3+GO6
b/vsanlkYpfAiRmu+zXZ6jHsYkHxK0enKHSFfSFjPHJEJpf6rMJLNLcdftKE
xmmNyOTGBnj4s6tZ212376K7zrTLmo5fV9+HhL/yor4RO27xDm22JRIzGgBh
Uk2xMlf+YbBdHK4xAqIt2Wn3HN39W4eHz7fRwsNWXiQhIryiohuGRDUSD9mZ
U1IkRZYvToAqkVXcKuGN1LuLr82L6gwNa/lZryQbCVMP9jKKVAw8TaSIBs18
0CHKqVsDY7IecLwA6iMLEFhzWSzfwHeoxDG77jBGku11KYfG+YemH7pxWXgx
u0QWL2gDFruCT8Q1cNzW9TGp44MhDQdmP5tbxyO8kJ3mKxZpSFZZo6Gm66Ui
qySZhoDYvRZdtHk5R0EALUFEKMBvX3/17PGTncfIcl+z1yY4K97W9bew4YOO
Is4Mk5rAV3+Cd18TPRazAZ1GceChaVknQcYNfsdPSGhAvCuROnInzm8cHDvB
wbHDDo7n5Jzg9WdNNOKJgWaGGcpBxYxvB2N1HtLZQ2MBct6GGuErHZVWuRZ1
JijQsPZNCoFawjBYotFoKBQNWZXni3CY3DXq60KFigcyEMMsH0jDBEgyRvsn
+bAyNvYaxwqNBU7gVW3uOOZj4rU54PmS911lCo2ThxVZsg2Qzo33WWD0FxmE
d3afamBUfKHS17peNOPg3wzLFjznOCQ4rSugF7xmgAaIrwn/JnlmhTxct4JY
N1+raIrGG2V+HU43DsLYez+KBOjFARzpkl8LdMArx4syL08LEr/QX5OdlZdF
RV9GLLZzy5JA6uWJwFWJljiAjWyg7C4DZQNXsAGqWuC0nsvaGxP8OcVleeP+
88NXI2TWo7egaleT7JwW/ylbb0lOR17kDU+Buw1w7MclnV//e48j4v758qI4
5mUcoF+X/OBew5Wrf1qvq9ZInq+LZulFz8CucIY5ii78i7+i2ZCH0s0UdZqa
RFJjymNWnBsfMC0T8taG47ZkGff+z+6j0S5Ixq1l5zdIorskiT74UOORMS7v
BONy5FqSlWEtQMh74CUlZpsk7JSe+tt6KevO9yzb5bvCCqkQIpqBlsp3WSSR
QINwzcK5wkuH4pfwCsfjCCp0yxIV9IGxXCPY7YU6KyTKyodPsuucjhWHyFBg
KapC2RUo9002+O6HN2/hwNC/s+9f0n+/fvFvPxy9fvEc//vNN4fffuv/w8kb
b755+cO3z8N/hS+fvfzuuxffP+eP4WkWPXKD7w7/oG73l6/eHr38/vDbQQju
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

-->

</rfc>
