<?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.4 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-09" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="DAP-PPM">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-09"/>
    <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="2023" month="December" day="18"/>
    <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 a
small set of servers. The servers' 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 servers 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 server.</t>
      <section anchor="change-log">
        <name>Change Log</name>
        <t>(*) Indicates a change that breaks wire compatibility with the previous draft.</t>
        <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 (e.g., the
candidate prefixes for Poplar1 from <xref section="8" sectionFormat="of" target="VDAF"/>). As defined in
<xref target="VDAF"/>.</t>
          </dd>
          <dt>Aggregator:</dt>
          <dd>
            <t>An endpoint 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>A party that uploads a report.</t>
          </dd>
          <dt>Collector:</dt>
          <dd>
            <t>The endpoint 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 sub-protocols 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"/>. Candidates include:</t>
      <ul spacing="normal">
        <li>
          <t>Prio3 (<xref section="7" sectionFormat="of" target="VDAF"/>), which allows for aggregate statistics such as
sum, mean, histograms, etc.</t>
        </li>
        <li>
          <t>Poplar1 (<xref section="8" sectionFormat="of" target="VDAF"/>), which allows for finding the most popular
strings uploaded by a set of Clients (e.g., the URL of their home page) as
well as counting the number of Clients that hold a given string. This VDAF is
the basis of the Poplar protocol of <xref target="BBCGGI21"/>, which is designed to solve
the heavy hitters problem in a privacy preserving manner.</t>
        </li>
      </ul>
      <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 endpoints 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>An endpoint 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 burdern born 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 HTTPS <xref target="RFC9110"/>.
HTTPS provides server authentication and confidentiality. Use of HTTPS is
<bcp14>REQUIRED</bcp14>.</t>
      <section anchor="request-authentication">
        <name>HTTPS Request Authentication</name>
        <t>DAP is made up of several sub-protocols 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 HTTPS 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 at the HTTP layer and within challenge
objects as defined in <xref target="iana-considerations"/>. DAP servers can return responses
with an HTTP error response code (4XX or 5XX). For example, if the Client
submits a request using a method not allowed in this document, then the server
<bcp14>MAY</bcp14> return HTTP status code 405 Method Not Allowed.</t>
        <t>When the server responds with an error status, it <bcp14>SHOULD</bcp14> provide additional
information using a problem detail object <xref target="RFC9457"/>. 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">An endpoint received a message with an unknown task ID.</td>
            </tr>
            <tr>
              <td align="left">unrecognizedAggregationJob</td>
              <td align="left">An endpoint 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">batchQueriedTooManyTimes</td>
              <td align="left">The maximum number of batch queries has been exceeded for one or more reports included in the batch.</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[
opaque BatchID[32];

enum {
  by_batch_id(0),
  current_batch(1),
  (255)
} FixedSizeQueryType;

struct {
  FixedSizeQueryType query_type;
  select (FixedSizeQuery.query_type) {
    case by_batch_id: BatchID batch_id;
    case current_batch: Empty;
  }
} FixedSizeQuery;

struct {
  QueryType query_type;
  select (Query.query_type) {
    case time_interval: Interval batch_interval;
    case fixed_size: FixedSizeQuery fixed_size_query;
  }
} Query;
]]></artwork>
        <t>The query is issued in-band as part of the collect sub-protocol
(<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 the relevant
subsection below.</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.) Of course, there are cases in which Collector may need to
issue queries out-of-order. For example, a previous batch might need to be
queried again with a different aggregation parameter (e.g, for Poplar1). 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>To get the aggregate of a batch, the Collector issues a query specifying the
batch ID of interest (see <xref target="query"/>). The Collector may not know which batch ID
it is interested in; in this case, it can also issue a query of type
<tt>current_batch</tt>, which allows the Leader to select 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 precisely
<tt>min_batch_size</tt> reports per batch. Doing so, however, may be challenging for
Leader deployments in which multiple, independent nodes running the aggregate
sub-protocol (see <xref target="aggregate-flow"/>) need to be coordinated. The maximum batch
size is intended to allow room for error. Typically the difference between the
minimum and maximum batch size will be a small fraction of the target batch size
for each batch. If <tt>max_batch_size</tt> is not specified, the goal for Aggregators
is to output the batch once it meets <tt>min_batch_size</tt>. How soon the batch should
be output is deployment specific.</t>
          <t>[OPEN ISSUE: It may be feasible to require a fixed batch size, i.e.,
<tt>min_batch_size == max_batch_size</tt>. We should know better once we've had some
implementation/deployment experience.]</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_endpoint</tt>: A URL relative to which the Leader's API
endpoints can be found.</t>
          </li>
          <li>
            <t><tt>helper_aggregator_endpoint</tt>: A URL relative to which the Helper's API
endpoints 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>max_batch_query_count</tt>: The maximum number of times a batch of reports may be
queried by the Collector.</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>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 sub-protocol (<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, resource URI <tt>{leader}/tasks/{task-id}/reports</tt> might be expanded
into
<tt>https://example.com/tasks/8BY0RzZMzxvA46_8ymhzycOB9krN-QIGYvg_RsByGec/reports</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 sub-protocol
(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 failed or 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 follows:</t>
          <artwork><![CDATA[
  Cache-Control: max-age=86400
]]></artwork>
          <t>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 PUT 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, Client authentication <bcp14>MUST</bcp14> use a scheme that
meets the requirements in <xref target="request-authentication"/>.</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-09 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
sub-protocol. 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 some fixed, linear operation, but in general the mapping is
controlled dynamically by the Collector and can be non-linear. In
Poplar1, for example, the refinement process involves a sequence of
"candidate prefixes" and the output consists of a sequence of zeros and ones,
each indicating whether the corresponding candidate is a prefix of the
measurement from which the input shares were generated.</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; for Poplar1,
the output shares are required to sum up to a vector that is non-zero in at
most one position.</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 sub-protocol.</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). And there are use cases for Poplar1
in which aggregation can begin immediately (i.e., those for which the candidate
prefixes/strings are fixed in advance).</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[
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>[[OPEN ISSUE: Consider sending report shares separately (in parallel) to the
aggregate instructions. Right now, aggregation parameters and the corresponding
report shares are sent at the same time, but this may not be strictly
necessary.]]</t>
            <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 sub-protocol
<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 server. 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 sub-protocol (<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-09 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 may still be aggregated with the current aggregation
parameter. This can be done by looking up all aggregation parameters
previously used for this report and calling  </t>
                <artwork><![CDATA[
Vdaf.is_valid(current_agg_param, previous_agg_params)
]]></artwork>
                <t>
If this returns false, 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 make
sure the report was already included in all previous collections for the
batch. If not, the input share <bcp14>MUST</bcp14> be marked as invalid with error
<tt>batch_collected</tt>. This prevents Collectors from learning anything about
small numbers of reports that are uploaded between two collections of a
batch.  </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 sub-protocol. (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 sub-protocol <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 resposne 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 sub-protocol (<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
POST 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 POST requests to the collection job with HTTP status code 200 OK
and a body consisting of a <tt>Collection</tt>:</t>
          <artwork><![CDATA[
struct {
  PartialBatchSelector part_batch_selector;
  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>part_batch_selector</tt>: Information used to bind the aggregate result to the
query. For fixed_size tasks, this includes the batch ID assigned to the batch
by the Leader. The indicated query type <bcp14>MUST</bcp14> match the task's query type.  </t>
              <t>
[OPEN ISSUE: What should the Collector do if the query type doesn't match?]</t>
            </li>
            <li>
              <t><tt>report_count</tt>: The number of reports included in the batch.</t>
            </li>
            <li>
              <t><tt>interval</tt>: The smallest interval of time that contains the timestamps of all
reports included in the batch, 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
POST 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 while only consuming one unit of the task's
<tt>max_batch_query_count</tt> (see <xref target="batch-validation"/>).</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-09 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-09 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 POST 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 too many times.
This is determined by the maximum number of times a batch can be queried,
<tt>max_batch_query_count</tt>. If the batch has been queried with more than
<tt>max_batch_query_count</tt> distinct aggregation parameters, the Aggregator <bcp14>MUST</bcp14>
abort with error of type "batchQueriedTooManyTimes".</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 sub-protocol.</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:</t>
              <ul spacing="normal">
                <li>
                  <t>For a CollectionReq containing a query of type <tt>by_batch_id</tt>, the Leader
checks that the provided batch ID corresponds to a batch ID it returned in a
previous collection for the task.</t>
                </li>
                <li>
                  <t>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>
                </li>
              </ul>
            </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 sub-protocol, 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 Poplar1 VDAF <xref target="VDAF"/> when configured to compute a set of heavy
hitters requires each measurement to be of the same bit-length which all parties
need to agree on prior to VDAF execution. The computation required for such
tasks increases superlinearly as a function of the chosen bit-length, as
multiple rounds of collection are needed for each bit of the measurement value,
and each bit of the measurement value requires computation which scales with the
chosen bit-length.</t>
        <t>When dealing with variable length measurements (e.g domain names), it is
necessary to pad them to convert into fixed-length measurements. When computing
the heavy hitters from a batch of such measurements, VDAF execution can be
terminated early once once the padding region is reached for a given
measurement: at this point, the padded measurement can be included in the last
set of candidate prefixes. For smaller length measurements, this significantly
reduces the cost of communication between Aggregators and the steps required for
the computation. However, malicious Clients can still generate maximum length
measurements forcing the system to always operate at worst-case performance.</t>
        <t>Therefore, care must be taken that a DAP deployment can handle VDAF execution of
all possible measurement values for any tasks that the deployment is configured
for. Otherwise, an attacker may deny service by uploading many expensive
reports.</t>
        <t>Applications which require computationally-expensive VDAFs can mitigate the
computation cost of aggregation in a few ways, such as producing aggregates over
a sample of the data or choosing a representation of the data permitting a
simpler aggregation scheme.</t>
        <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 collect requests can be made for them. In particular,
Aggregators must store a batch as long as the batch has not been queried more
than <tt>max_batch_query_count</tt> times. However, it is not always necessary to store
the reports themselves. For schemes like Prio3 <xref target="VDAF"/> in which reports are
verified only once, each Aggregator only needs to store its aggregate share for
each possible batch interval, along with the number of times the aggregate share
was used in a batch. This is due to the requirement that the batch interval
respect the boundaries defined by the DAP parameters. (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 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>Collection requests may leak information beyond the collection results. For
example, the Poplar1 VDAF <xref target="VDAF"/> can be used to compute the set of heavy
hitters among a set of arbitrary bit strings uploaded by Clients. This
requires multiple evaluations of the VDAF, the results of which reveal
information to the Aggregators and Collector beyond what follows from the
heavy hitters themselves. Or the result could leak information about outlier
values. This leakage can be mitigated 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="I-D.draft-ietf-ohai-ohttp-10"/> 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="I-D.draft-ietf-ohai-ohttp-10">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="August" year="2023"/>
            <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="Internet-Draft" value="draft-ietf-ohai-ohttp-10"/>
        </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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
SGJmQxLRHYxyAVvMNhi2gGJjfGGzZ5r8cMxcuB0Zc3wuXpFl0pFJrZGrvWyV
PdnQuyFffyJj0FVJzCq6uPiCd8oYB1bOZEMYdkL+Inv1xHdrfLPiHjjxtDcY
DoIHCS6kHLqDx+uCosyI8onZsf0mhB1Gsq56LbGJxkerAZ1hkEHqVrQTI4nU
xz6jY1dDMOZ0Ck5bYxpPPbnK6faaQoDIF+WmaY1ugRuxXQthR+L6smbRgdZ6
kEixDZm0i4pCVVDkVbJP39tvnWDL4Otd0wIlPsHELiQlWAi4NRt6OsrNU7lA
8T6lSFf+zr5B1kuylJFohKbUtl7Xy/psR/fy/w1/3G9G8uc37mdJtcl+hr8K
vf0m/Yl/D1/xv7PoT+d3euqf+eedx2lH/NvvorZ7/tYd8ch/KCJclv3WPA7q
8M+/vMf9c/yvq+eYLNa1jYYp2k+umv5vTK9/6F/abued3sMrrBdl3Z3ubaXv
lXjzmfQ+nGS3LFFycseXg54jMBBqX+VlxU6vWbnOq2Cg8FcBGWkalURPeg0R
lOHATOUyl5iietrm0lY4mD2sO/AfVOV21pYH2gjodHyTWR5G3q/LEg4piIdF
0MP8yLxh5aA5TM0ljQx0Xm7g3eWO8z2SUcF3Yi8hnYNMYcxlMM8nku9PUdVU
76HEUaE1ta4ooWQJ4t2yYSc3XV/E1jBUA0MkpmSFEdG8c6FfaeXjWXiDTqwt
sYxutPfLevNOPVNkjJ7Vo9j50sfbPSe9YiNQPPFbgbeauTNOYG4m2jIP9oC9
ZgbJQaEbjSPBxeKg/N+sfJvas0RnHoIUuiwlX4Dvh2h5hiZnpLGeL7lR/E7z
cMWbskHHebvJTdw/mnUoU4LWrntDiTWeZDjxqPaYEK+yuuVwuYdATFlLb14x
mQ2dzA7yBYus1tQsGwaTDHmmMTwTVg/OwDLk7Q25eRJnvYkApZNcHK7TLZI7
3PX1puqY8rxmzQLmDMMnW6sunYsfd+AJWNTtptee4nSVDzBy7ewcJOyWU9JM
fBtJlGqw0QiHRDk8pAVyc+8XZJsAsRJROsSJ4YNrQ1YACWVkb8bQAY3OsmYf
+b1XKDKHSwR+o4mg9nGon4t6YKUuNl/jEuSbXayVoU+ThemWgqIkGlkbI3Ef
BVK2AvgojZpVUVIHOfutnLW5IUyfOzI7r8sZ2l4+i2xUg2C+GlhLVZQ4Fez6
+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
mQW0+lEveXIJjJdmtcwreerk+PzZBlHV/fuTBFTa+M2LZdea2YrkViR/iyK5
0SD+JCHd1OpvXmxz43IrtFuh/f8gtDhoflaB5Ra3wroV1q2wfnZhzbw1n1Vo
fctb4d0K71Z4P5vweq/oZ5FZ1+BWVLeiuhXVzy2qn1VMtyK6FdGtiH6yiPqw
3ieJp2toK5pb0dyK5ucSTfrnZ5FM3LAVzK1gbgXznxFM4EohcmcCv6gjsCuV
KTMyWmFBZgaAWtAlJcAjO0cu5dQTyhuKJSTc9w5J36xSpCT/VTJXLOXTyG0X
gG9bh/Z6deWDA84k1Azrmf9EnUyAUuyTOKsPxMlAnNAWPnvf/cQPfF0EtvBM
u9b1G+xyUFiifUmO7qFBWF9BjJS9X3ByViv6tpRsn4R/XPm2Ewu+UsuTjCg4
5UeBgR7HXGf75n/1Cx2gVBM35RWxOGHnu4v/m+9+jZyfqjhGlW430ZIMVI1Q
vvuT5lpfIW/wdD/hn/32l9ivDkAasihTYlD/DSH8xH/YzQ9H47uVgxtveuis
Aop+ggcPmbhK/sljKyQNvScNiKYpKFJRpAByrBR5lCzli86UDGWubIQs7gVF
d2XqpFW4l3ZS8L8/nr0saH8fYQO4LicCkGfttLteLg442fgAG3d7cH19dUA7
/z2abbo0wt1aejSNvozZz9Au4+o+o9eYbPpv+iVgFNUp2zk5/uFpvwOMm9OV
hbt9UVRNVjmJ+6VDwO25XmDtVlfXzI8cMFb/dvb0ydePHn39/v2BpEfFtQur
pmCbhmyJbJsvip9//uH5yXlx9OrJj6fHL3/g4h0MY21rJgSg64y4+xDgDo2e
cDVAGRh65GXDaZ2LNmW9CIX1vuQ/nXRWgixIAdsJiJg1stZvrS2hjHHH+EyI
H+PPgciL64C3GVubUkmdicaY5omLCEXW5m5JWlAoK/qccz3fHYhpUU3/uAO+
0J336DXncP0Hb/OHJbjIipPzs2f4y9/p18fluGL6L9DQLaoVj1KQZ9aLO1Rb
BtsKylhU8hhfmDxmK7TaJ/0jtx+VNzUnlzRv8pdMJ/TT42l9c1Ovr1PrtAMv
53VVPGf6JTIo8OOzppnpSybs8cGVx5NLJrtcX6WHX2OhnXMhkdHhYirci6Qw
uT7o8vGMzZLUsfPL+qZc0N2X9Rg//HlZ3ugTuPSmXM9bvtp98vUlCUp9fV2c
Ty4bErBy0etmG688nuHX9PQpI+AXtEKaK/u+0+Yf1CKYHYur1eMr+afvKnX0
v0phnnUjTmOx+IX2hZkbdCzI0WgEOpjwv9vsrpxD9gEA

-->

</rfc>
