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

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

<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 aggregator servers. The aggregators' goal is to compute some aggregate
statistic over the clients' inputs without learning the inputs 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
input is ever seen in the clear by any aggregator.</t>
      <section anchor="change-log">
        <name>Change Log</name>
        <t>(*) Indicates a change that breaks wire compatibility with the previous draft.</t>
        <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?>

<dl>
          <dt>Aggregate result:</dt>
          <dd>
            <t>The output of the aggregation function computed over a batch of measurements
and an aggregation parameter. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregate share:</dt>
          <dd>
            <t>A share of the aggregate result emitted by an Aggregator. Aggregate shares are
reassembled by the Collector into the aggregate result, which is the final
output of the aggregation function. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregation function:</dt>
          <dd>
            <t>The function computed over the Clients' measurements. As defined in <xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregation parameter:</dt>
          <dd>
            <t>Parameter used to prepare a set of measurements for aggregation. As defined in
<xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregator:</dt>
          <dd>
            <t>A server that receives input shares from Clients and validates and aggregates
them with the help of the other Aggregators.</t>
          </dd>
          <dt>Batch:</dt>
          <dd>
            <t>A set of reports (i.e., measurements) that are aggregated into an aggregate
result.</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 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 receives the aggregate
result.</t>
          </dd>
          <dt>Helper:</dt>
          <dd>
            <t>The Aggregator that executes the aggregation and collection interactions as
instructed 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 the VDAF preparation phase. Many output shares are combined into
an aggregate share during the VDAF aggregation phase. 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 in a batch.</t>
          </dd>
          <dt>Public share:</dt>
          <dd>
            <t>The output of the VDAF sharding algorithm broadcast 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.
Comprised of a set of report shares.</t>
          </dd>
          <dt>Report Share:</dt>
          <dd>
            <t>An encrypted input share comprising a piece of a report.</t>
          </dd>
        </dl>
        <t>This document uses the presentation language of <xref target="RFC8446"/> to define messages
in the DAP protocol. Encoding and decoding of these messages as byte strings
also follows <xref target="RFC8446"/>.</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>x_1, ..., x_n</tt> held by <tt>n</tt> Clients, and an
aggregation parameter <tt>p</tt> shared by the Aggregators, the goal of DAP is to
compute <tt>y = F(p, x_1, ..., x_n)</tt> for some function <tt>F</tt> while revealing nothing
else about the measurements. We call <tt>F</tt> the "aggregation function."</t>
      <t>This protocol is extensible and allows for the addition of new cryptographic
schemes that implement the VDAF interface specified in
<xref target="VDAF"/>. This protocol only supports VDAFs which
require a single collection to provide useful results.</t>
      <t>VDAFs rely on secret sharing to protect the privacy of the measurements. Rather
than sending its input 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
provides 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>It allows the Aggregators to compute the aggregation function by first
aggregating up their input shares locally into "aggregate shares", then
combining the aggregate shares into the aggregate result.</t>
        </li>
      </ul>
      <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>System Architecture</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 entity which wants to obtain the aggregate of the measurements generated
by the Clients. Any given measurement task will have a single Collector.</t>
          </dd>
          <dt>Client(s):</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>Aggregator:</dt>
          <dd>
            <t>A server which receives report shares. Each Aggregator works with its
co-Aggregator to compute the aggregate result. Any given measurement task
will have two Aggregators: a Leader and a Helper.</t>
          </dd>
          <dt>Leader:</dt>
          <dd>
            <t>The Aggregator responsible for coordinating the protocol. It receives the
reports, splits them into report shares, distributes the report shares to the
Helper, and 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 batches of measurements). The
definition of a task includes the following parameters:</t>
        <ul spacing="normal">
          <li>
            <t>The type of each measurement.</t>
          </li>
          <li>
            <t>The aggregation function to compute (e.g., sum, mean, etc.).</t>
          </li>
          <li>
            <t>The set of Aggregators and necessary cryptographic keying material to use.</t>
          </li>
          <li>
            <t>The VDAF to execute, which to some extent is dictated by the previous choices.</t>
          </li>
          <li>
            <t>The minimum "batch size" of reports which can be aggregated.</t>
          </li>
          <li>
            <t>The rate at which measurements can be taken, i.e., the "minimum batch
duration".</t>
          </li>
        </ul>
        <t>These parameters are distributed to the Clients, Aggregators, and Collector
before the task begins. 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 comes in, or may be necessary to wait
until the entire batch of reports is received.</t>
      </section>
      <section anchor="validating-inputs">
        <name>Validating Inputs</name>
        <t>An essential task of any data collection pipeline is ensuring that the data
being aggregated is "valid". 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.</t>
        <t>In order to address this problem, the Aggregators engage in a secure,
multi-party computation specified by the chosen VDAF <xref target="VDAF"/> in order to
prepare a report for aggregation. 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 a valid output share could
not be computed.</t>
        <t>To facilitate this computation, the input shares generated by the Client
include information used by the Aggregators during aggregation in order to
validate their corresponding output shares. For example, Prio3 includes a
zero-knowledge proof of the input's validity (see <xref section="7.1" sectionFormat="of" target="VDAF"/>).
which the Aggregators can jointly verify and reject the report if it cannot be
verified. However, they do not learn anything about the individual report other
than that it is valid.</t>
        <t>The specific properties attested to in 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., 0-60 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 30s on a task but the Client might report
60s. 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 10^6s or -20s.</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 (within the DAP URN namespace
"urn:ietf:params:ppm:dap:error:"):</t>
        <table>
          <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">batchQueriedMultipleTimes</td>
              <td align="left">A batch was queried with multiple distinct aggregation parameters.</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">missingTaskID</td>
              <td align="left">HPKE configuration was requested without specifying a task ID.</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>
          </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-definition">
      <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>
      <t>The following are some basic type definitions used in other messages:</t>
      <artwork><![CDATA[
/* ASCII encoded URL. e.g., "https://example.com" */
opaque Url<1..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<1..2^16-1>;     /* encapsulated HPKE key */
  opaque payload<1..2^32-1>; /* ciphertext */
} HpkeCiphertext;

/* Represent a zero-length byte string. */
struct {} Empty;
]]></artwork>
      <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 anchor="query">
        <name>Queries</name>
        <t>Aggregated results are computed based on sets of reports, called "batches". The
Collector influences which reports are used in a batch via a "query." The
Aggregators use this query to carry out the aggregation flow and produce
aggregate shares encrypted to the Collector.</t>
        <t>This document defines the following query types:</t>
        <artwork><![CDATA[
enum {
  reserved(0), /* Reserved for testing purposes */
  time_interval(1),
  fixed_size(2),
  (255)
} QueryType;
]]></artwork>
        <t>The time_interval query type is described in <xref target="time-interval-query"/>; the
fixed_size query type is described in <xref target="fixed-size-query"/>. Future
specifications may introduce new query types as needed (see <xref target="query-type-reg"/>).
Implementations are free to implement only a subset of the available query
types.</t>
        <t>A query includes parameters used by the Aggregators to select a batch of
reports specific to the given query type. A query is defined as follows:</t>
        <artwork><![CDATA[
struct {
  QueryType query_type;
  select (Query.query_type) {
    case time_interval: Interval batch_interval;
    case fixed_size: Empty;
  }
} Query;
]]></artwork>
        <t>The query is issued in-band as part of the collect interaction
(<xref target="collect-flow"/>). Its content is determined by the "query type", which in turn
is encoded by the "query configuration" configured out-of-band. All query types
have the following configuration parameters in common:</t>
        <ul spacing="normal">
          <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>
          <li>
            <t><tt>time_precision</tt> - Clients use this value to truncate their report timestamps;
see <xref target="upload-flow"/>. Additional semantics may apply, depending on the query
type. (See <xref target="batch-validation"/> for details.)</t>
          </li>
        </ul>
        <t>The parameters pertaining to specific query types are described in
<xref target="time-interval-query"/> and <xref target="fixed-size-query"/>.</t>
        <section anchor="time-interval-query">
          <name>Time-interval Queries</name>
          <t>The first query type, <tt>time_interval</tt>, is designed to support applications in
which reports are collected over a long period 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>
        <section anchor="fixed-size-query">
          <name>Fixed-size Queries</name>
          <t>The <tt>fixed_size</tt> query type is used to support applications in which the
Collector needs the ability to strictly control the batch size. This is
particularly important for controlling the amount of noise added to reports by
Clients (or added to aggregate shares by Aggregators) in order to achieve
differential privacy.</t>
          <t>For this query type, the Aggregators group reports into arbitrary batches such
that each batch has roughly the same number of reports. These batches are
identified by opaque "batch IDs", 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="query"/>). 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>In addition to the minimum batch size common to all query types, the
configuration may include a parameter <tt>max_batch_size</tt> that determines maximum
number of reports per batch.</t>
          <t>If the configuration does not include <tt>max_batch_size</tt>, then the Aggregators
can output any batch size that is larger than or equal to <tt>min_batch_size</tt>.
This is useful for applications that are not concerned with sample size, i.e.,
the privacy guarantee is not affected by the sampling rate of the population,
therefore a larger than expected batch size does not weaken the designed privacy
guarantee.</t>
          <t>Implementation note: The goal for the Aggregators is to aggregate the same
number of reports in each batch. The target batch size is deployment-specific,
and may be equal to or greater than the minimum batch size. Deciding how soon
batches should be output is also deployment-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. The difference between the minimum batch size and maximum batch
size is in part intended to allow room for error, and allow a range of target
batch sizes.</t>
        </section>
      </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>
        <artwork><![CDATA[
opaque TaskID[32];
]]></artwork>
        <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 query configuration for this task (see <xref target="query"/>). This determines the
query type for batch selection 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 query type.</t>
          </li>
          <li>
            <t><tt>task_expiration</tt>: The time up to which Clients are expected to upload to this
task. The task is considered completed after this time. Aggregators <bcp14>MAY</bcp14> reject
reports that have timestamps later than <tt>task_expiration</tt>.</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>
        </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 collect protocols, 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="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>. Clients <bcp14>MAY</bcp14> specify a query parameter
<tt>task_id</tt> whose value is the task ID whose HPKE configuration they want. If the
Aggregator does not recognize the task ID, then it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>An Aggregator is free to use different HPKE configurations for each task with
which it is configured. If the task ID is missing from  the Client's request,
the Aggregator <bcp14>MAY</bcp14> abort with an error of type <tt>missingTaskID</tt>, in which case
the Client <bcp14>SHOULD</bcp14> retry the request with a well-formed task ID included.</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>
          <t>[TODO: Allow Aggregators to return HTTP status code 403 Forbidden in deployments
that use authentication to avoid leaking information about which tasks exist.]</t>
          <artwork><![CDATA[
HpkeConfig HpkeConfigList<1..2^16-1>;

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

opaque HpkePublicKey<1..2^16-1>;
uint16 HpkeAeadId; /* Defined in [HPKE] */
uint16 HpkeKemId;  /* Defined in [HPKE] */
uint16 HpkeKdfId;  /* Defined in [HPKE] */
]]></artwork>
          <t>[OPEN ISSUE: Decide whether to expand the width of the id.]</t>
          <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>
          <artwork><![CDATA[
  Cache-Control: max-age=86400
]]></artwork>
          <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>
          <artwork><![CDATA[
struct {
  ReportID report_id;
  Time time;
} ReportMetadata;

struct {
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
  HpkeCiphertext leader_encrypted_input_share;
  HpkeCiphertext helper_encrypted_input_share;
} Report;
]]></artwork>
          <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 appears in at
most one batch (see <xref target="input-share-validation"/>). 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>SHOULD</bcp14>
round this value down to the nearest multiple of the task's
<tt>time_precision</tt> in order to ensure that that the timestamp cannot be used
to link a report back to the Client that generated it.</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>
          <artwork><![CDATA[
(public_share, input_shares) = Vdaf.shard(
    measurement, /* plaintext measurement */
    report_id,   /* nonce */
    rand,        /* randomness for sharding algorithm */
)
]]></artwork>
          <t>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>
          <artwork><![CDATA[
struct {
  Extension extensions<0..2^16-1>;
  opaque payload<0..2^32-1>;
} PlaintextInputShare;
]]></artwork>
          <t>Field <tt>extensions</tt> is set to the list of extensions intended to be consumed by
the given Aggregator. (See <xref target="upload-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>
          <artwork><![CDATA[
enc, payload = SealBase(pk,
  "dap-11 input share" || 0x01 || server_role,
  input_share_aad, plaintext_input_share)
]]></artwork>
          <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>
          <artwork><![CDATA[
struct {
  TaskID task_id;
  ReportMetadata report_metadata;
  opaque public_share<0..2^32-1>;
} InputShareAad;
]]></artwork>
          <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>.</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>. See
the implementation note in <xref target="input-share-validation"/>.</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 protocol and alert the
Client with error <tt>reportRejected</tt>.</t>
          <t>The Leader <bcp14>MAY</bcp14> ignore any report whose timestamp is past the task's
<tt>task_expiration</tt>. When it does so, it <bcp14>SHOULD</bcp14> also abort the upload protocol and
alert the Client with error <tt>reportRejected</tt>. Client <bcp14>MAY</bcp14> choose to opt out of
the task if its own clock has passed <tt>task_expiration</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 protocol 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 Leader's input share contains an unrecognized extension, or if two
extensions have the same ExtensionType, then the Leader <bcp14>MAY</bcp14> abort the upload
request with error "invalidMessage". Note that this behavior is not mandatory
because it requires the Leader to decrypt its input share.</t>
        </section>
        <section anchor="upload-extensions">
          <name>Upload Extensions</name>
          <t>Each PlaintextInputShare carries a list of extensions that Clients use to convey
additional information to the Aggregator. 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>
          <artwork><![CDATA[
struct {
  ExtensionType extension_type;
  opaque extension_data<0..2^16-1>;
} Extension;

enum {
  TBD(0),
  (65535)
} ExtensionType;
]]></artwork>
          <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>
          <sourcecode type="ladder"><![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
]]></sourcecode>
        </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>In general, reports cannot be aggregated until the Collector specifies an
aggregation parameter. However, in some situations it is possible to begin
aggregation as soon as reports arrive. For example, Prio3 has just one valid
aggregation parameter (the empty string).</t>
        <t>An aggregation job can be thought of as having three phases:</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 aggregate flow, yielding an output share corresponding
to each report share in the aggregation job.</t>
          </li>
        </ul>
        <t>These phases are described in the following subsections.</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>
          <artwork><![CDATA[
opaque AggregationJobID[16];
]]></artwork>
          <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>
          <section anchor="leader-init">
            <name>Leader Initialization</name>
            <t>The Leader begins the aggregate initialization phase with the set of candidate
reports as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Generate a fresh AggregationJobID.</t>
              </li>
              <li>
                <t>Decrypt the input share for each report share as described in
<xref target="input-share-decryption"/>.</t>
              </li>
              <li>
                <t>Check that the resulting input share is valid as described in
<xref target="input-share-validation"/>.</t>
              </li>
            </ol>
            <t>If any 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>
            <artwork><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_init(
    vdaf_verify_key,
    agg_param,
    report_id,
    public_share,
    plaintext_input_share.payload)
]]></artwork>
            <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>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>
            <artwork><![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;
]]></artwork>
            <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 intended recipient's (i.e.
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>
            <artwork><![CDATA[
opaque BatchID[32];

struct {
  QueryType query_type;
  select (PartialBatchSelector.query_type) {
    case time_interval: Empty;
    case fixed_size: BatchID batch_id;
  };
} PartialBatchSelector;

struct {
  opaque agg_param<0..2^32-1>;
  PartialBatchSelector part_batch_selector;
  PrepareInit prepare_inits<1..2^32-1>;
} AggregationJobInitReq;
]]></artwork>
            <t>This message consists of:</t>
            <ul spacing="normal">
              <li>
                <t><tt>agg_param</tt>: The VDAF aggregation parameter.</t>
              </li>
              <li>
                <t><tt>part_batch_selector</tt>: The "partial batch selector" used by the Aggregators to
determine how to aggregate each report:  </t>
                <ul spacing="normal">
                  <li>
                    <t>For <tt>fixed_size</tt> tasks, the Leader specifies a "batch ID" that determines
the batch to which each report for this aggregation job belongs.      </t>
                    <t>
[OPEN ISSUE: For fixed_size tasks, the Leader is in complete control over
which batch a report is included in. For time_interval tasks, the Client
has some control, since the timestamp determines which batch window it
falls in. Is this desirable from a privacy perspective? If not, it might
be simpler to drop the timestamp altogether and have the agg init request
specify the batch window instead.]</t>
                  </li>
                </ul>
                <t>
The indicated query type <bcp14>MUST</bcp14> match the task's query type. 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
query type, it may not determine a batch. In particular, if the query type is
<tt>time_interval</tt>, the batch is not determined until the Collector's query is
issued (see <xref target="query"/>).</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 a PUT request to
<tt>{helper}/tasks/{task-id}/aggregation_jobs/{aggregation-job-id}</tt>. The payload
is set to <tt>AggregationJobInitReq</tt> and the media type is set to
"application/dap-aggregation-job-init-req".</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's response will be an <tt>AggregationJobResp</tt> message (see
<xref target="aggregation-helper-init"/>. The response's <tt>prepare_resps</tt> 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>[[OPEN ISSUE: consider relaxing this ordering constraint. See issue#217.]]</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>
                <artwork><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_continued(agg_param,
                                                    prev_state,
                                                    inbound)
]]></artwork>
                <t>
where:  </t>
                <ul spacing="normal">
                  <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 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. 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>(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>
          </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>To begin this process, 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 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>The Helper is now ready to process each report share into an outbound prepare
step to return to the Leader. The responses will be structured as follows:</t>
            <artwork><![CDATA[
enum {
  continue(0),
  finished(1)
  reject(2),
  (255)
} PrepareRespState;

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

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:   PrepareError prepare_error;
  };
} PrepareResp;
]]></artwork>
            <t>First the Helper preprocesses each report as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Decrypt the input share for each report share as described in
<xref target="input-share-decryption"/>.</t>
              </li>
              <li>
                <t>Check that the resulting input share is valid as described in
<xref target="input-share-validation"/>.</t>
              </li>
            </ol>
            <t>For any report that was rejected, the Helper sets the outbound preparation
response to</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error;
} PrepareResp;
]]></artwork>
            <t>where <tt>report_id</tt> is the report ID and <tt>prepare_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>
            <artwork><![CDATA[
(state, outbound) = Vdaf.ping_pong_helper_init(vdaf_verify_key,
                                               agg_param,
                                               report_id,
                                               public_share,
                                               plaintext_input_share.payload)
]]></artwork>
            <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>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>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error = vdaf_prep_error;
} PrepareResp;
]]></artwork>
            <t>Otherwise the Helper responds with</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = continue;
  opaque payload<0..2^32-1> = outbound;
} PrepareResp;
]]></artwork>
            <t>Finally, the Helper creates an <tt>AggregationJobResp</tt> to send to the Leader. This
message is structured as follows:</t>
            <artwork><![CDATA[
struct {
  PrepareResp prepare_resps<1..2^32-1>;
} AggregationJobResp;
]]></artwork>
            <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 code 201 Created and a body
consisting of the <tt>AggregationJobResp</tt>, with media type
"application/dap-aggregation-job-resp".</t>
            <t>Changing an aggregation job's parameters is illegal, so further requests to
<tt>PUT /tasks/{tasks}/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.</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>
            <t>Finally, 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"/>).
Otherwise, if <tt>state == Finished(out_share)</tt>, then the Helper stores <tt>out_share</tt>
for use in the collection interaction (<xref target="collect-flow"/>).</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 and,
timestamp), 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>
            <artwork><![CDATA[
plaintext_input_share = OpenBase(encrypted_input_share.enc, sk,
  "dap-11 input share" || 0x01 || server_role,
  input_share_aad, encrypted_input_share.payload)
]]></artwork>
            <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 PrepareError.</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 if the report is too far into the future. Implementors can provide for
some small leeway, usually no more than a few minutes, to account for clock
skew. If a report is rejected for this reason, the Aggregator <bcp14>SHOULD</bcp14> mark the
input share as invalid with the error <tt>report_too_early</tt>.</t>
              </li>
              <li>
                <t>Check if the report's timestamp has passed the task's <tt>task_expiration</tt> time.
If so, the Aggregator <bcp14>MAY</bcp14> mark the input share as invalid with the error
<tt>task_expired</tt>.</t>
              </li>
              <li>
                <t>Check if the PlaintextInputShare contains unrecognized extensions. 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 the ExtensionType of any two extensions in PlaintextInputShare are
the same. 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 the report has been previously aggregated. If so, the input share
<bcp14>MUST</bcp14> be marked as invalid with the error <tt>report_replayed</tt>.  </t>
                <ul spacing="normal">
                  <li>
                    <t>Implementation note: To detect replay attacks, each Aggregator is required
to keep track of the set of reports it has processed for a given task.
Because honest Clients choose the report ID at random, it is sufficient to
store the set of IDs of processed reports. However, 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>
              </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 CollectionReq 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="query"/>) 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 make it easy to determine wither a
report pertains to a batch that was collected.      </t>
                    <t>
[TODO: If a section to clarify report and batch states is added this can be
removed. See Issue #384]</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Depending on the query type for the task, additional checks may be
applicable:  </t>
                <ul spacing="normal">
                  <li>
                    <t>For <tt>fixed_size</tt> tasks, the Aggregators need to ensure that each batch is
roughly the same size. If the number of reports aggregated for the current
batch exceeds the maximum batch size (per the task configuration), the
Aggregator <bcp14>MAY</bcp14> mark the input share as invalid with the error
<tt>batch_saturated</tt>. Note that this behavior is not strictly enforced here
but during the collect interaction. (See <xref target="batch-validation"/>.) If
maximum batch size is not provided, then Aggregators only need to ensure
the current batch exceeds the minimum batch size (per the task
configuration). If both checks succeed, the input share is not marked as
invalid.</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, if the Aggregator has evicted the state required to perform the
check from long-term storage. (See <xref target="reducing-storage-requirements"/> 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>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  opaque payload<0..2^32-1>;
} PrepareContinue;
]]></artwork>
            <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 the aggregation job URI used during
initialization (see <xref target="leader-init"/>) with media type
"application/dap-aggregation-job-continue-req" and body structured as:</t>
            <artwork><![CDATA[
struct {
  uint16 step;
  PrepareContinue prepare_continues<1..2^32-1>;
} AggregationJobContinueReq;
]]></artwork>
            <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's response will be an <tt>AggregationJobResp</tt> message (see
<xref target="aggregation-helper-init"/>). The response's <tt>prepare_resps</tt> must 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>[[OPEN ISSUE: consider relaxing this ordering constraint. See issue#217.]]</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>
                <artwork><![CDATA[
(state, outbound) = Vdaf.ping_pong_leader_continued(agg_param,
                                                    state,
                                                    inbound)
]]></artwork>
                <t>
where <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 stores the output share for
use in the collection interaction <xref target="collect-flow"/>.</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 flow (<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>
          </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 the aggregation job URI 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>[OPEN ISSUE: Issue 438: It may be useful for the Leader to explicitly signal
rejection.]</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 re-sending the previous <tt>AggregationJobResp</tt>. 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, the Helper <bcp14>MUST</bcp14> abort with error
<tt>stepMismatch</tt>.</t>
            <t>The Helper is now ready to continue preparation for each report. Let <tt>inbound</tt>
denote the payload of the prep step. The Helper computes the following:</t>
            <artwork><![CDATA[
(state, outbound) = Vdaf.ping_pong_helper_continued(agg_param,
                                                    state,
                                                    inbound)
]]></artwork>
            <t>If <tt>state == Rejected()</tt>, then the Helper's response is</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = reject;
  PrepareError prepare_error = vdaf_prep_error;
} PrepareResp;
]]></artwork>
            <t>Otherwise, if <tt>outbound != None</tt>, then the Helper's response is</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = continue;
  opaque payload<0..2^32-1> = outbound;
} PrepareResp;
]]></artwork>
            <t>Otherwise, if <tt>outbound == None</tt>, then the Helper's response is</t>
            <artwork><![CDATA[
struct {
  ReportID report_id;
  PrepareRespState prepare_resp_state = finished;
} PrepareResp;
]]></artwork>
            <t>Next, the Helper constructs an <tt>AggregationJobResp</tt> message
(<xref target="aggregation-helper-init"/>) with each prep step. The order of the prep steps
<bcp14>MUST</bcp14> match the Leader's request. It responds to the Leader with HTTP status 200
OK, media type <tt>application/dap-aggregation-job-resp</tt>, and a body consisting of
the <tt>AggregationJobResp</tt>.</t>
            <t>Finally, 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"/>).
Otherwise, if <tt>state == Finished(out_share)</tt>, then the Helper stores <tt>out_share</tt>
for use in the collection interaction (<xref target="collect-flow"/>).</t>
            <t>If for whatever reason the Leader must abandon the aggregation job, it <bcp14>SHOULD</bcp14>
send an HTTP DELETE request to the aggregation job URI so that the Helper knows
it can clean up its state.</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 the DAP
aggregation protocol. 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>AggregationJobContinueReq</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>[[OPEN ISSUE: Allowing the Leader to "rewind" aggregation job state of the
Helper may allow an attack on privacy. For instance, if the VDAF verification
key changes, the prep shares in the Helper's response would change even if the
consistency check is made. Security analysis is required. See #401.]]</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="query"/>), 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>
          <artwork><![CDATA[
opaque CollectionJobID[16];
]]></artwork>
          <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-collect-req", and it is structured as
follows:</t>
          <artwork><![CDATA[
struct {
  Query query;
  opaque agg_param<0..2^32-1>; /* VDAF aggregation parameter */
} CollectionReq;
]]></artwork>
          <t>The named parameters are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>query</tt>, the Collector's query. The indicated query type <bcp14>MUST</bcp14> match the task's
query type. 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"/>).</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.</t>
          <t>Upon receipt of a <tt>CollectionReq</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>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
CollectionReq message, and the batch will have to be re-validated later on
regardless.</t>
          <t>If the Leader finds the CollectionReq to be valid, it immediately responds with
HTTP status 201.</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>Changing a collection job's parameters is illegal, so further requests to
<tt>PUT /tasks/{tasks}/collection_jobs/{collection-job-id}</tt> for the same
<tt>collection-job-id</tt> but with a different <tt>CollectionReq</tt> in the body <bcp14>MUST</bcp14> fail
with an HTTP client error status code.</t>
          <t>After receiving the response to its <tt>CollectionReq</tt>, the Collector makes an HTTP
GET request to the collection job URI to check on the status of the collect job
and eventually obtain the result. If the collection job is not finished yet, the
Leader responds with HTTP status 202 Accepted. The response <bcp14>MAY</bcp14> include a
Retry-After header field to suggest a polling interval to the Collector.</t>
          <t>Asynchronously from any request from the Collector, the Leader attempts to run
the collection job. It 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 to the collection job with HTTP status code 200 OK
and a body consisting of a <tt>Collection</tt>:</t>
          <artwork><![CDATA[
struct {
  uint64 report_count;
  Interval interval;
  HpkeCiphertext leader_encrypted_agg_share;
  HpkeCiphertext helper_encrypted_agg_share;
} Collection;
]]></artwork>
          <t>The body's media type is "application/dap-collection". The <tt>Collection</tt>
structure includes the following:</t>
          <ul spacing="normal">
            <li>
              <t><tt>report_count</tt>: The number of reports included in the batch.</t>
            </li>
            <li>
              <t><tt>interval</tt>: The smallest interval of time that contains the timestamps of all
reports included in the batch, such that the interval's start and duration are
both multiples of the task's <tt>time_precision</tt> parameter. Note that in the case
of a <tt>time_interval</tt> type query (see <xref target="query"/>), this interval can be smaller
than the one in the corresponding <tt>CollectionReq.query</tt>.</t>
            </li>
            <li>
              <t><tt>leader_encrypted_agg_share</tt>: The Leader's aggregate share, encrypted to the
Collector.</t>
            </li>
            <li>
              <t><tt>helper_encrypted_agg_share</tt>: The Helper's aggregate share, encrypted to the
Collector.</t>
            </li>
          </ul>
          <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 obtain the Helper's encrypted aggregate share before it can
complete a collection job. To do this, the Leader first computes a checksum
over the reports included in the batch. The checksum is computed by taking the
SHA256 <xref target="SHS"/> hash of each report ID from the
Client reports included in the aggregation, then combining the hash values with
a bitwise-XOR operation.</t>
          <t>Then the Leader sends a POST request to
<tt>{helper}/tasks/{task-id}/aggregate_shares</tt> with the following message:</t>
          <artwork><![CDATA[
struct {
  QueryType query_type;
  select (BatchSelector.query_type) {
    case time_interval: Interval batch_interval;
    case fixed_size: BatchID batch_id;
  };
} BatchSelector;

struct {
  BatchSelector batch_selector;
  opaque agg_param<0..2^32-1>;
  uint64 report_count;
  opaque checksum[32];
} AggregateShareReq;
]]></artwork>
          <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", which encodes parameters used to
determine the batch being aggregated. The value depends on the query type for
the task:  </t>
              <ul spacing="normal">
                <li>
                  <t>For time_interval tasks, the request specifies the batch interval.</t>
                </li>
                <li>
                  <t>For fixed_size tasks, the request specifies the batch ID.</t>
                </li>
              </ul>
              <t>
The indicated query type <bcp14>MUST</bcp14> match the task's query type. 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 AggregationJobInitReq 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 CollectionReq message
(see <xref target="collect-init"/>).</t>
            </li>
            <li>
              <t><tt>report_count</tt>: The number number of reports included in the batch.</t>
            </li>
            <li>
              <t><tt>checksum</tt>: The batch checksum.</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"/>.</t>
          <t>Next, it computes a checksum based on the reports that satisfy the query, and
checks that the <tt>report_count</tt> and <tt>checksum</tt> included in the request match its
computed values. If not, then it <bcp14>MUST</bcp14> abort with an error of type
"batchMismatch".</t>
          <t>Next, it computes the aggregate share <tt>agg_share</tt> corresponding to the set of
output shares, denoted <tt>out_shares</tt>, for the batch interval, as follows:</t>
          <artwork><![CDATA[
agg_share = Vdaf.aggregate(agg_param, out_shares)
]]></artwork>
          <t>Implementation note: For most VDAFs, it is possible to aggregate output shares
as they arrive rather than wait until the batch is collected. To do so however,
it is necessary to enforce the batch parameters as described in
<xref target="batch-validation"/> so that the Aggregator knows which aggregate share to
update.</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>
          <artwork><![CDATA[
struct {
  HpkeCiphertext encrypted_aggregate_share;
} AggregateShare;
]]></artwork>
          <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 AggregateShareReq 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 also computes its own aggregate
share <tt>agg_share</tt> by aggregating all of the prepared output shares that fall
within the batch interval. Finally, it 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>
          <artwork><![CDATA[
agg_result = Vdaf.unshard(agg_param,
                          [leader_agg_share, helper_agg_share],
                          report_count)
]]></artwork>
        </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>
          <artwork><![CDATA[
enc, payload = SealBase(pk, "dap-11 aggregate share" || server_role || 0x00,
  agg_share_aad, agg_share)
]]></artwork>
          <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>
          <artwork><![CDATA[
struct {
  TaskID task_id;
  opaque agg_param<0..2^32-1>;
  BatchSelector batch_selector;
} AggregateShareAad;
]]></artwork>
          <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>
          <artwork><![CDATA[
agg_share = OpenBase(enc_share.enc, sk, "dap-11 aggregate share" ||
  server_role || 0x00, agg_share_aad, enc_share.payload)
]]></artwork>
          <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 computed by the Collector
from its query and the response to its query as follows:</t>
          <ul spacing="normal">
            <li>
              <t>For time_interval tasks, the batch selector is the batch interval specified in
the query.</t>
            </li>
            <li>
              <t>For fixed_size tasks, the batch selector is the batch ID assigned 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>Before a Leader runs a collection job or a Helper responds to an
AggregateShareReq, it must first check that the job or request does not violate
the parameters associated with the DAP task. It does so as described here. Where
we say that an Aggregator <bcp14>MUST</bcp14> abort with some error, then:</t>
          <ul spacing="normal">
            <li>
              <t>Leaders should respond to subsequent HTTP GET requests to the collection job
with the indicated error.</t>
            </li>
            <li>
              <t>Helpers should respond to the AggregateShareReq with the indicated error.</t>
            </li>
          </ul>
          <t>First the Aggregator checks that the batch respects any "boundaries" determined
by the query type. These are described in the subsections below. If the boundary
check fails, then the Aggregator <bcp14>MUST</bcp14> abort with an error of type
"batchInvalid".</t>
          <t>Next, the Aggregator checks that batch contains a valid number of reports, as
determined by the query type. If the size 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 that the batch has not been queried with multiple
distinct aggregation parameters. If the batch has been queried with more than
one distinct aggregation parameter, the Aggregator <bcp14>MUST</bcp14> abort with error of type
"batchQueriedMultipleTimes".</t>
          <t>Finally, the Aggregator checks that the batch does not contain a report that was
included in any previous batch. If this batch overlap check fails, then the
Aggregator <bcp14>MUST</bcp14> abort with error of type "batchOverlap". For time_interval
tasks, it is sufficient (but not necessary) to check that the batch interval
does not overlap with the batch interval of any previous query. If this batch
interval check fails, then the Aggregator <bcp14>MAY</bcp14> abort with error of type
"batchOverlap".</t>
          <t>[[OPEN ISSUE: #195 tracks how we might relax this constraint to allow for more
collect query flexibility. As of now, this is quite rigid and doesn't give the
Collector much room for mistakes.]]</t>
          <section anchor="time-interval-batch-validation">
            <name>Time-interval Queries</name>
            <section anchor="boundary-check">
              <name>Boundary Check</name>
              <t>The batch boundaries are determined by the <tt>time_precision</tt> field of the query
configuration. For the <tt>batch_interval</tt> included with the query, the Aggregator
checks that:</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>These measures ensure that Aggregators can efficiently "pre-aggregate" output
shares recovered during the aggregation interaction.</t>
            </section>
            <section anchor="size-check">
              <name>Size Check</name>
              <t>The query configuration specifies the minimum batch size, <tt>min_batch_size</tt>. 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.</t>
            </section>
          </section>
          <section anchor="fixed-size-batch-validation">
            <name>Fixed-size Queries</name>
            <section anchor="boundary-check-1">
              <name>Boundary Check</name>
              <t>For fixed_size tasks, the batch boundaries are defined by opaque batch IDs. Thus
the Aggregator needs to check that the query is associated with a known batch
ID; specifically, for an AggregateShareReq, the Helper checks that the batch ID
provided by the Leader corresponds to a batch ID used in a previous
<tt>AggregationJobInitReq</tt> for the task.</t>
            </section>
            <section anchor="size-check-1">
              <name>Size Check</name>
              <t>The query configuration specifies the minimum batch size, <tt>min_batch_size</tt>, and
optionally the maximum batch size, <tt>max_batch_size</tt>. The Aggregator checks that
<tt>len(X) &gt;= min_batch_size</tt>. And if <tt>max_batch_size</tt> is specified, also
<tt>len(X) &lt;= max_batch_size</tt>, where <tt>X</tt> is the set of reports successfully
aggregated into the batch.</t>
            </section>
          </section>
        </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
protocol.</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 protocol 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="input-share-validation"/>.</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 required for a DAP task. For
instance, the Prio3SumVec VDAF <xref target="VDAF"/> requires each measurement to be vectors
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>
        <t>Therefore, care must be taken that a DAP deployment can handle VDAF execution of
all possible VDAF 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>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>
        <t>[[TODO: Discuss explicit key performance indicators, here or elsewhere.]]</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 input-validation protocol. 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="reducing-storage-requirements">
          <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 interval (for time-interval) or batch
ID (for fixed-size), along with a flag indicating whether the aggregate share
has been collected. This is due to the requirement that in the time-interval
case, the batch interval respect the boundaries defined by the DAP parameters;
and that in fixed-size case, a batch is determined entirely by a batch ID. (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 <tt>task_expiration</tt>. Aggregator <bcp14>MAY</bcp14> delete
the task and all data pertaining to this task after <tt>task_expiration</tt>.
Implementors <bcp14>SHOULD</bcp14> provide for some leeway so the Collector can collect the
batch after some delay.</t>
        </section>
      </section>
    </section>
    <section anchor="compliance">
      <name>Compliance Requirements</name>
      <t>In the absence of an application or deployment-specific profile specifying
otherwise, a compliant DAP application <bcp14>MUST</bcp14> implement the following HPKE cipher
suite:</t>
      <ul spacing="normal">
        <li>
          <t>KEM: DHKEM(X25519, HKDF-SHA256) (see <xref section="7.1" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
        <li>
          <t>KDF: HKDF-SHA256 (see <xref section="7.2" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
        <li>
          <t>AEAD: AES-128-GCM (see <xref section="7.3" sectionFormat="comma" target="HPKE"/>)</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>DAP aims to achieve the privacy and 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>Differential privacy (<xref target="dp"/>) can help mitigate Sybil attacks to some extent.</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="upload-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 an 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 can contain 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>
      </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>
          <artwork><![CDATA[
verify_key = HKDF-Expand(
    HKDF-Extract(
        "verify_key",    # salt
        verify_key_seed, # IKM
    ),
    task_id,             # info
    VERIFY_KEY_SIZE,     # L
)
]]></artwork>
          <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 the collection protocol, 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
upload extensions <xref target="upload-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-considerations">
      <name>IANA Considerations</name>
      <section anchor="protocol-message-media-types">
        <name>Protocol Message Media Types</name>
        <t>This specification defines the following protocol messages, along with their
corresponding media types 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-flow"/>: "application/dap-aggregate-share-req"</t>
          </li>
          <li>
            <t>AggregateShare <xref target="collect-flow"/>: "application/dap-aggregate-share"</t>
          </li>
          <li>
            <t>CollectionReq <xref target="collect-flow"/>: "application/dap-collect-req"</t>
          </li>
          <li>
            <t>Collection <xref target="collect-flow"/>: "application/dap-collection"</t>
          </li>
        </ul>
        <t>The definition for each media type is in the following subsections.</t>
        <t>Protocol message format evolution is supported through the definition of new
formats that are identified by new media types.</t>
        <t>IANA [shall update / has updated] the "Media Types" registry at
https://www.iana.org/assignments/media-types with the registration information
in this section for all media types listed above.</t>
        <t>[OPEN ISSUE: Solicit review of these allocations from domain experts.]</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="task-configuration"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</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</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</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-request"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</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</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</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="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</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</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</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="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</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</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</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="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</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</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</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"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</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</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</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"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</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</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</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-collect-req-media-type">
          <name>"application/dap-collect-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-collect-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"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</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</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</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-collection-media-type">
          <name>"application/dap-collection" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-collection</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"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</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</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</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="dap-type-registries">
        <name>DAP Type Registries</name>
        <t>This document also requests creation of a new "Distributed Aggregation Protocol
Parameters" page. This page will contain several new registries, described in the
following sections.</t>
        <section anchor="query-type-reg">
          <name>Query Types Registry</name>
          <t>This document requests creation of a new registry for Query Types. This registry
should contain the following columns:</t>
          <t>[TODO: define how we want to structure this registry when the time comes]</t>
        </section>
        <section anchor="upload-extension-registry">
          <name>Upload Extension Registry</name>
          <t>This document requests creation of a new registry for extensions to the Upload
protocol. This registry should contain the following columns:</t>
          <t>[TODO: define how we want to structure this registry when the time comes]</t>
        </section>
        <section anchor="prepare-error-reg">
          <name>Prepare Error Registry</name>
          <t>This document requests creation of a new registry for PrepareError values. This
registry should contain the following columns:</t>
          <dl>
            <dt>Name:</dt>
            <dd>
              <t>The name of the PrepareError value</t>
            </dd>
            <dt>Value:</dt>
            <dd>
              <t>The 1-byte value of the PrepareError value</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>A reference to where the PrepareError type is defined.</t>
            </dd>
          </dl>
          <t>The initial contents of this registry are as defined in <xref target="aggregation-helper-init"/>,
with this document as the reference.</t>
        </section>
      </section>
      <section anchor="urn-space">
        <name>URN Sub-namespace for DAP (urn:ietf:params:ppm:dap)</name>
        <t>The following value [will be/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:  [[THIS DOCUMENT]]

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

Index value:  No transformation needed.
]]></artwork>
        <t>Initial contents: The types and descriptions in the table in <xref target="errors"/> above,
with the Reference field set to point to this specification.</t>
      </section>
    </section>
    <section numbered="false" anchor="contributors">
      <name>Contributors</name>
      <artwork><![CDATA[
    Josh Aas
    ISRG
    josh@abetterinternet.org

    Junye Chen
    Apple
    junyec@apple.com

    David Cook
    ISRG
    dcook@divviup.org

    Charlie Harrison
    Google
    csharrison@chromium.org

    Peter Saint-Andre
    stpeter@gmail.com

    Shivan Sahib
    Brave
    shivankaulsahib@gmail.com

    Phillipp Schoppmann
    Google
    schoppmann@google.com

    Martin Thomson
    Mozilla
    mt@mozilla.com

    Shan Wang
    Apple
    shan_wang@apple.com
]]></artwork>
    </section>
  </middle>
  <back>
    <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="20" month="November" year="2023"/>
            <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
   measurement that would result in an invalid aggregate result.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vdaf-08"/>
        </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="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="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="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="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 fullname="Quynh H. Dang" initials="Q." surname="Dang">
              <organization/>
            </author>
            <date month="July" year="2015"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.180-4"/>
          <refcontent>National Institute of Standards and Technology</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="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="CGB17" target="https://crypto.stanford.edu/prio/paper.pdf">
          <front>
            <title>Prio: Private, Robust, and Scalable Computation of Aggregate Statistics</title>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <date year="2017" month="March" day="14"/>
          </front>
        </reference>
        <reference anchor="BBCGGI19" target="https://eprint.iacr.org/2019/188">
          <front>
            <title>Zero-Knowledge Proofs on Secret-Shared Data via Fully Linear PCPs</title>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <author initials="E." surname="Boyle">
              <organization/>
            </author>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2021" month="January" day="05"/>
          </front>
        </reference>
        <reference anchor="BBCGGI21" target="https://eprint.iacr.org/2021/017">
          <front>
            <title>Lightweight Techniques for Private Heavy Hitters</title>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <author initials="E." surname="Boyle">
              <organization/>
            </author>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2021" month="January" day="05"/>
          </front>
        </reference>
        <reference anchor="Dou02" target="https://link.springer.com/chapter/10.1007/3-540-45748-8_24">
          <front>
            <title>The Sybil Attack</title>
            <author initials="J." surname="Douceur">
              <organization/>
            </author>
            <date year="2022" month="October" day="10"/>
          </front>
        </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">
              <organization/>
            </author>
            <date year="2016" month="August" day="09"/>
          </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>
  </back>
  <!-- ##markdown-source:
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
Hsyy2SI7nmazo6y4D0pItoBP8uzRk+zx/Wz2RTa7nz05zhbwyzybzbPFF9nR
Peyx+uhetniS3V9kDx7hs4/vueMvsuLxoK91hezz4IuH2QyLibOHx1lxnOVf
ZI8fZvfu48umR9n8i+zRMb4ARnx07O49GWQH9+/ReJLXkVWgZLV6fYZhZ3kf
L2Dp6ONd5cvDYbjscJmdvyt3qevVXU+ld8083yL3uNtLs1JUDoZedJPd5Jpd
l1c9+fqPR6/+9p8//O395emDR2+f7FYXf9vNXnz9xbv6x9G/n337x8vzt6+a
r3ffFrPuZJazx/lPxbeb+esfq+bH5cXop/+8+N3phJlvSNZ8JXz0wx3LRp13
rXKURyIO27iteQ8gUOh7RInOhKPqtLuPBw5FbVBFlwWhk4pg/Uog6UiMqQni
7FgkZLBENCCgmyENmPseJcHts8/Fz04yLzZ3Ndf2wx2rOjn3dYCp0kp2LLDh
DStbjwIY7VnoeOidrPhK11HjEoASTM2/UU+rOFPOBSBzDxrmT5eb+ErYqEeZ
oxTeFB1luvMIvlIM4r59/sYXhKCj7kPQwj/ejbQab/ygXRLSsdiQ8oqJm0gX
LoR6xsoE5qCCUqccib/qmXaL9bSIdKk1kxZGxrvaYlNOBhWnpSSMZZT2LYXw
6C9xk7QQjRS1dYIeo2kvaA6FAo6efqSxF4Ne5Dz6b6RR+vJPU7Qg5TR8TIb2
PvNVM+zTNJPDbTeL8pn0knaPPlZTojMZBk8YJqA4Q99S+IAkxNdOCUD83lQD
jeSIxq3OWaK5nT3zZbRoJJsHZczGlL3bDPh7R0fZi99RAiNarSH18/uyacX2
U9RE388ysx0vkd2OzFUeYenKYMyhs3Q833os8DcybGtufml+b35LQfV5obFa
sSgpW6MQP594QKTQvNOxTONz6ot0fYTUlPh1vi6oigg2+E9vXjx7cdLfLLen
4lkqCu5juHhazhFHEts3Bp8oR6+QopM6dHQtXlblHPOB33Hv5tRaFFcStY2k
Ivnxn9kFF3Ysizc7ziPfl95bzr+Uj35XrODf74rVW/PZfIGfzRfms1NgvPBh
Dv8xn3Le5u8QhY7+hqbql5q3Sy+DSYi7MPp9NE3MWQZ9I7yGcoGfBZPmT3hw
f9b0ZvkpzfzL7FY/xQVd81PyXv7pxcvnP2Znr1//9PyEHeoF5rWTZCXMyY16
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
o/JL9k9Jt7Ru1+sBAA==

-->

</rfc>
