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

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

<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>07:</t>
        <ul spacing="normal">
          <li>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. (*)</li>
        </ul>
        <t>06:</t>
        <ul spacing="normal">
          <li>Bump draft-irtf-cfrg-vdaf-06 to 07 <xref target="VDAF"/>. (*)</li>
          <li>Overhaul security considerations (#488).</li>
          <li>Adopt revised ping-pong interface in draft-irtf-cfrg-vdaf-07 (#494).</li>
          <li>Add aggregation parameter to <tt>AggregateShareAad</tt> (#498). (*)</li>
          <li>Bump version tag from "dap-05" to "dap-06". (*)</li>
        </ul>
        <t>05:</t>
        <ul spacing="normal">
          <li>Bump draft-irtf-cfrg-vdaf-05 to 06 <xref target="VDAF"/>. (*)</li>
          <li>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. (*)</li>
          <li>Allow the following actions to be safely retried: aggregation job creation,
collection job creation, and requesting the Helper's aggregate share.</li>
          <li>Merge error types that are related.</li>
          <li>Drop recommendation to generate IDs using a cryptographically secure
pseudorandom number generator wherever pseudorandomness is not required.</li>
          <li>Require HPKE config identifiers to be unique.</li>
          <li>Bump version tag from "dap-04" to "dap-05". (*)</li>
        </ul>
        <t>04:</t>
        <ul spacing="normal">
          <li>Introduce resource oriented HTTP API. (#278, #398, #400) (*)</li>
          <li>Clarify security requirements for choosing VDAF verify key. (#407, #411)</li>
          <li>Require Clients to provide nonce and random input when sharding inputs. (#394,
#425) (*)</li>
          <li>Add interval of time spanned by constituent reports to Collection message.
(#397, #403) (*)</li>
          <li>Update share validation requirements based on latest security analysis. (#408,
#410)</li>
          <li>Bump draft-irtf-cfrg-vdaf-03 to 05 <xref target="VDAF"/>. (#429) (*)</li>
          <li>Bump version tag from "dap-03" to "dap-04". (#424) (*)</li>
        </ul>
        <t>03:</t>
        <ul spacing="normal">
          <li>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. (*)</li>
          <li>Allow Aggregators to advertise multiple HPKE configurations. (*)</li>
          <li>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.</li>
          <li>Remove the extensions from the Report and add extensions to the plaintext
payload of each ReportShare. (*)</li>
          <li>Clarify that extensions are mandatory to implement: If an Aggregator does not
recognize a ReportShare's extension, it must reject it.</li>
          <li>Clarify that Aggregators must reject any ReportShare with repeated extension
types.</li>
          <li>Specify explicitly how to serialize the Additional Authenticated Data (AAD)
string for HPKE encryption. This clarifies an ambiguity in the previous
version. (*)</li>
          <li>Change the length tag for the aggregation parameter to 32 bits. (*)</li>
          <li>Use the same prefix ("application") for all media types. (*)</li>
          <li>Make input share validation more explicit, including adding a new
ReportShareError variant, "report_too_early", for handling reports too far in
the future. (*)</li>
          <li>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. (*)</li>
          <li>Bump version tag from "dap-02" to "dap-03". (*)</li>
        </ul>
        <t>02:</t>
        <ul spacing="normal">
          <li>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. (*)</li>
          <li>Define a new task configuration parameter, called the task "expiration", that
defines the lifetime of a given task.</li>
          <li>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.)</li>
          <li>Make "task_id" an optional parameter of the "/hpke_config" endpoint.</li>
          <li>Add report count to CollectResp message. (*)</li>
          <li>Increase message payload sizes to accommodate VDAFs with input and aggregate
shares larger than 2^16-1 bytes. (*)</li>
          <li>Bump draft-irtf-cfrg-vdaf-01 to 03 <xref target="VDAF"/>. (*)</li>
          <li>Bump version tag from "dap-01" to "dap-02". (*)</li>
          <li>Rename the report nonce to the "report ID" and move it to the top of the
structure. (*)</li>
          <li>Clarify when it is safe for an Aggregator to evict various data artifacts from
long-term storage.</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>Prio3 (<xref section="7" sectionFormat="of" target="VDAF"/>), which allows for aggregate statistics such as
sum, mean, histograms, etc.</li>
        <li>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.</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>Given only one of the input shares, it is impossible to deduce the plaintext
measurement from which it was generated.</li>
        <li>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.</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>The type of each measurement.</li>
          <li>The aggregation function to compute (e.g., sum, mean, etc.).</li>
          <li>The set of Aggregators and necessary cryptographic keying material to use.</li>
          <li>The VDAF to execute, which to some extent is dictated by the previous choices.</li>
          <li>The minimum "batch size" of reports which can be aggregated.</li>
          <li>The rate at which measurements can be taken, i.e., the "minimum batch
duration".</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>
            <xref target="OAuth2"/> credentials are presented in an Authorization HTTP header,
which can be added to any DAP protocol message.</li>
          <li>TLS client certificates can be used to authenticate the underlying transport.</li>
          <li>The <tt>DAP-Auth-Token</tt> HTTP header described in
<xref target="I-D.draft-dcook-ppm-dap-interop-test-design-04"/>.</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 document <xref target="RFC7807"/>. 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>Uploading reports from the Client to the Aggregators, specified in
<xref target="upload-flow"/></li>
        <li>Computing the results for a given measurement task, specified in
<xref target="aggregate-flow"/></li>
        <li>Collecting aggregated results, specified in <xref target="collect-flow"/></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>measurement_to_input_shares</tt> and <tt>prep_init</tt> methods (see <xref section="5" sectionFormat="comma" target="VDAF"/>). Thus for a VDAF to be compatible with DAP, it <bcp14>MUST</bcp14> specify a <tt>NONCE_SIZE</tt>
of 16 bytes.</t>
      <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"/>).
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),
} FixedSizeQueryType;

struct {
  FixedSizeQueryType query_type;
  select (FixedSizeQuery.query_type) {
    by_batch_id: BatchID batch_id;
    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 parameters pertaining to each query type are described in one of the
subsections below. 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>
            <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.</li>
          <li>
            <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.)</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 sample 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>SHOULD</bcp14> select a batch which has not yet began collection.</t>
          <t>In addition to the minimum batch size common to all query types, the
configuration includes a parameter <tt>max_batch_size</tt> that determines maximum
number of reports per batch.</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.</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>
            <tt>leader_aggregator_endpoint</tt>: A URL relative to which the Leader's API
endpoints can be found.</li>
          <li>
            <tt>helper_aggregator_endpoint</tt>: A URL relative to which the Helper's API
endpoints can be found.</li>
          <li>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.</li>
          <li>
            <tt>max_batch_query_count</tt>: The maximum number of times a batch of reports may be
queried by the Collector.</li>
          <li>
            <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>.</li>
          <li>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"/>.</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>
            <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.</li>
          <li>
            <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"/>.</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>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"/>).</li>
          <li>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"/>.</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>the GET request failed or did not return a valid HPKE config list;</li>
            <li>the HPKE config list is empty; or</li>
            <li>no HPKE config advertised by the Aggregator specifies a supported a KEM, KDF,
or AEAD algorithm triple.</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>
                  <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.</li>
                <li>
                  <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.</li>
              </ul>
            </li>
            <li>
              <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.</li>
            <li>
              <tt>leader_encrypted_input_share</tt> is the Leader's encrypted input share.</li>
            <li>
              <tt>helper_encrypted_input_share</tt> is the Helper's encrypted input share.</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.measurement_to_input_shares(
    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 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-07 input share" || 0x01 || server_role,
  input_share_aad, plaintext_input_share)
]]></artwork>
          <t>where <tt>pk</tt> is the Aggregator's public key; <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>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.</li>
          <li>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.</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>Initialization: Begin the aggregation flow by disseminating report shares and
initializing the VDAF prep state for each report.</li>
          <li>Continuation: Continue the aggregation flow by exchanging prep shares and
messages until preparation completes or an error occurs.</li>
          <li>Completion: Finish the aggregate flow, yielding an output share corresponding
to each report share in the aggregation job.</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>Recover and determine which input report shares are valid.</li>
            <li>For each valid report share, initialize the VDAF preparation process (see
<xref section="5.2" sectionFormat="of" target="VDAF"/>).</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>Generate a fresh AggregationJobID.</li>
              <li>Decrypt the input share for each report share as described in
<xref target="input-share-decryption"/>.</li>
              <li>Check that the resulting input share is valid as described in
<xref target="input-share-validation"/>.</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>
                <tt>vdaf_verify_key</tt> is the VDAF verification key for the task</li>
              <li>
                <tt>agg_param</tt> is the VDAF aggregation parameter provided by the Collector (see
<xref target="collect-flow"/>)</li>
              <li>
                <tt>report_id</tt> is the report ID, used as the nonce for VDAF sharding</li>
              <li>
                <tt>public_share</tt> is the report's public share</li>
              <li>
                <tt>plaintext_input_share</tt> is the Leader's <tt>PlaintextInputShare</tt></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>
                <tt>report_share.report_metadata</tt> is the report's metadata.</li>
              <li>
                <tt>report_share.public_share</tt> is the report's public share.</li>
              <li>
                <tt>report_share.encrypted_input_share</tt> is the intended recipient's (i.e.
Helper's) encrypted input share.</li>
              <li>
                <tt>payload</tt> is set to the <tt>outbound</tt> message computed by the previous step.</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>
                <tt>agg_param</tt>: The VDAF aggregation parameter.</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>
                <tt>prepare_inits</tt>: the sequence of <tt>PrepareInit</tt> messages constructed in the
previous step.</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>
                    <tt>agg_param</tt> is the VDAF aggregation parameter provided by the Collector (see
<xref target="collect-flow"/>)</li>
                  <li>
                    <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></li>
                  <li>
                    <tt>inbound</tt> is the message payload in the <tt>PrepareResp</tt></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>Else if the type is "rejected", 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.</li>
              <li>Else the type is invalid, in which case the Leader <bcp14>MUST</bcp14> abort the
aggregation job.</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>Decrypt the input share for each report share as described in
<xref target="input-share-decryption"/>.</li>
              <li>Check that the resulting input share is valid as described in
<xref target="input-share-validation"/>.</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>
                <tt>vdaf_verify_key</tt> is the VDAF verification key for the task</li>
              <li>
                <tt>agg_param</tt> is the VDAF aggregation parameter sent in the
<tt>AggregationJobInitReq</tt></li>
              <li>
                <tt>report_id</tt> is the report ID</li>
              <li>
                <tt>public_share</tt> is the report's public share</li>
              <li>
                <tt>plaintext_input_share</tt> is the Helper's <tt>PlaintextInputShare</tt></li>
            </ul>
            <t>This procedure determines the initial per-report <tt>state</tt>, as well as the
initial <tt>outbound</tt> 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-07 input share" || 0x01 || server_role,
  input_share_aad, encrypted_input_share.payload)
]]></artwork>
            <t>where <tt>sk</tt> is the HPKE secret key, and <tt>server_role</tt> is the role of the
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>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>.</li>
              <li>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>.</li>
              <li>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>.</li>
              <li>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>.</li>
              <li>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>.</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>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.</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>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 both
checks succeed, the input share is not marked as invalid.</li>
                </ul>
              </li>
              <li>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.)</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>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"/>).</li>
              <li>Else if the type is "reject", then the Leader rejects the report and removes
it from the candidate set.</li>
              <li>Else the type is invalid, in which case the Leader <bcp14>MUST</bcp14> abort the
aggregation job.</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>the report IDs are all distinct</li>
              <li>each report ID corresponds to one of the <tt>state</tt> objects</li>
              <li>
                <tt>AggregationJobContinueReq.step</tt> is not equal to <tt>0</tt></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>
          </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>Collect request and response between the Collector and Leader, specified in
<xref target="collect-init"/></li>
          <li>Aggregate share request and response between the Leader and the Helper,
specified in <xref target="collect-aggregate"/></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>
              <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".</li>
            <li>
              <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"/>).</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
<tt>POST</tt> 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.</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>
              <tt>report_count</tt>: The number of reports included in the batch.</li>
            <li>
              <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>.</li>
            <li>
              <tt>leader_encrypted_agg_share</tt>: The Leader's aggregate share, encrypted to the
Collector.</li>
            <li>
              <tt>helper_encrypted_agg_share</tt>: The Helper's aggregate share, encrypted to the
Collector.</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 anchor="a-note-on-idempotence">
            <name>A Note on Idempotence</name>
            <t>The reason a POST is used to poll the state of a collection job instead of a
GET is because of the fixed-size query mode (see <xref target="fixed-size-query"/>).
Collectors may make a query against the current batch, and it is the Leader's
responsibility to keep track of what batch is current for some task. Polling a
collection job is the only point at which it is safe for the Leader to change
its set of current batches, since it constitutes acknowledgement on the
Collector's part that it received the response to some previous PUT request to
the collection jobs resource.</t>
            <t>This means that polling a collection job can have the side effect of changing
the set of current batches in the Leader, and thus using a GET is inappropriate.</t>
          </section>
        </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>For time_interval tasks, the request specifies the batch interval.</li>
                <li>For fixed_size tasks, the request specifies the batch ID.</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>
              <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"/>).</li>
            <li>
              <tt>report_count</tt>: The number number of reports included in the batch.</li>
            <li>
              <tt>checksum</tt>: The batch checksum.</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.out_shares_to_agg_share(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>agg_shares_to_result</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.agg_shares_to_result(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-07 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), 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>
              <tt>task_id</tt> is the ID of the task the aggregate share was computed in.</li>
            <li>
              <tt>agg_param</tt> is the aggregation parameter used to compute the aggregate share.</li>
            <li>
              <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).</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-07 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), 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>For time_interval tasks, the batch selector is the batch interval specified in
the query.</li>
            <li>For fixed_size tasks, the batch selector is the batch ID assigned sent in the
response.</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>Leaders should respond to subsequent HTTP POST requests to the collection job
with the indicated error.</li>
            <li>Helpers should respond to the AggregateShareReq with the indicated error.</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>
                  <tt>batch_interval.duration &gt;= time_precision</tt> (this field determines,
effectively, the minimum batch duration)</li>
                <li>both <tt>batch_interval.start</tt> and <tt>batch_interval.duration</tt> are divisible by
<tt>time_precision</tt></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>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.</li>
                <li>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.</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
maximum batch size, <tt>max_batch_size</tt>. The Aggregator checks that <tt>len(X) &gt;=
min_batch_size</tt> and <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>Support the aggregate sub-protocol, which includes validating and aggregating
reports; and</li>
            <li>Publish and manage an HPKE configuration that can be used for the upload
protocol.</li>
          </ul>
          <t>In addition, for each DAP task, the Helper is required to:</t>
          <ul spacing="normal">
            <li>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"/>.</li>
          </ul>
          <t>Beyond the minimal capabilities required of Helpers, Leaders are generally
required to:</t>
          <ul spacing="normal">
            <li>Support the upload protocol and store reports; and</li>
            <li>Track batch report size during each collect flow and request encrypted output
shares from Helpers.</li>
          </ul>
          <t>In addition, for each DAP task, the Leader is required to:</t>
          <ul spacing="normal">
            <li>Implement and store state for the form of inter- and intra-batch replay
mitigation in <xref target="input-share-validation"/>.</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="data-resolution-limitations">
        <name>Data resolution limitations</name>
        <t>Privacy comes at the cost of computational complexity. While affine-aggregatable
encodings (AFEs) can compute many useful statistics, they require more bandwidth
and CPU cycles to account for finite-field arithmetic during input-validation.
The increased work from verifying inputs decreases the throughput of the system
or the inputs processed per unit time. Throughput is related to the verification
circuit's complexity and the available compute-time to each Aggregator.</t>
        <t>Applications that utilize proofs with a large number of multiplication gates or
a high frequency of inputs may need to limit inputs into the system to meet
bandwidth or compute constraints. Some methods of overcoming these limitations
include choosing a better representation for the data or introducing sampling
into the data collection methodology.</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>KEM: DHKEM(X25519, HKDF-SHA256) (see <xref section="7.1" sectionFormat="comma" target="HPKE"/>)</li>
        <li>KDF: HKDF-SHA256 (see <xref section="7.2" sectionFormat="comma" target="HPKE"/>)</li>
        <li>AEAD: AES-128-GCM (see <xref section="7.3" sectionFormat="comma" target="HPKE"/>)</li>
      </ul>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>DAP assumes an active attacker that controls the network and has the ability to
statically corrupt any number of Clients, Aggregators, and Collectors. That is,
the attacker can learn the secret state of any party prior to the start of its
attack. For example, it may coerce a Client into providing malicious input
shares for aggregation or coerce an Aggregator into diverting from the protocol
specified (e.g., by divulging its input shares to the attacker).</t>
      <t>In the presence of this adversary, DAP aims to achieve the privacy and
robustness security goals described in <xref target="VDAF"/>'s Security Considerations
section. Even if DAP achieves those goals, there are still some threats it does
not defend against:</t>
      <ol spacing="normal" type="1"><li>Even benign collect requests may leak information beyond what one might
expect intuitively. 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 of the Prio3Sum
VDAF could leak information about outlier values. Note that this leakage can
be mitigated using differential privacy (<xref target="dp"/>).</li>
        <li>On its own, DAP does not defend against Sybil attacks. See <xref target="sybil"/> for
discussion and potential mitigations.</li>
      </ol>
      <section anchor="threat-model">
        <name>Threat model</name>
        <t>In this section, we enumerate the actors participating in a Distributed
Aggregation Protocol deployment, enumerate their assets (secrets that are
either inherently valuable or which confer some capability that enables further
attack on the system), the capabilities that a malicious or compromised actor
has, and potential mitigations for attacks enabled by those capabilities.</t>
        <t>This model assumes that all participants have previously agreed upon and
exchanged all shared parameters over some unspecified secure channel.</t>
        <section anchor="clientuser">
          <name>Client/user</name>
          <section anchor="assets">
            <name>Assets</name>
            <ol spacing="normal" type="1"><li>Unsharded measurements. Clients are the only actor that can ever see the
original measurements.</li>
              <li>Unencrypted input shares.</li>
            </ol>
          </section>
          <section anchor="capabilities-and-mitigations">
            <name>Capabilities and mitigations</name>
            <ol spacing="normal" type="1"><li>Individual users can reveal their own measurement and compromise their own
privacy.</li>
              <li>
                <t>Clients may affect the quality of aggregate results by reporting false
measurements.
                </t>
                <ul spacing="normal">
                  <li>Prio can only prove that a submitted measurement is valid, not that it is
true. False measurements can be mitigated orthogonally to the Prio
protocol (e.g., by requiring that batches include a minimum number of
contributions) and so these attacks are considered to be outside of the
threat model.</li>
                </ul>
              </li>
              <li>
                <t>Clients may upload reports to a task multiple times. The VDAF will prove that
each report is valid, but the results of a VDAF like Prio3Sum can be skewed
if a Client submits many valid reports. Attackers may also attempt ballot
stuffing attacks, trying to produce aggregations over batches containing
nothing but synthetic reports with a known value and a single, legitimate
report whose privacy is then compromised.
                </t>
                <ul spacing="normal">
                  <li>This attack can be mitigated if DAP deployments require Clients to
authenticate when uploading (see <xref target="client-auth"/>), which would allow
enforcing policy like a maximum number of uploads per day.</li>
                  <li>Applying differential privacy to either measurements before sharding them
into reports or to aggregate shares (<xref target="dp"/>) can protect isolated
legitimate measurements.</li>
                </ul>
              </li>
            </ol>
          </section>
        </section>
        <section anchor="aggregator">
          <name>Aggregator</name>
          <section anchor="assets-1">
            <name>Assets</name>
            <ol spacing="normal" type="1"><li>Unencrypted input shares.</li>
              <li>Input share decryption keys.</li>
              <li>Client identifying information.</li>
              <li>Aggregate shares.</li>
              <li>Aggregator identity.</li>
            </ol>
          </section>
          <section anchor="capabilities-and-mitigations-1">
            <name>Capabilities and mitigations</name>
            <ol spacing="normal" type="1"><li>
                <t>Aggregators may defeat the robustness of the system by emitting incorrect
aggregate shares.
                </t>
                <ul spacing="normal">
                  <li>There is no way for aggregators to detect a fraudulent aggregate shares
except by applying heuristics to aggregate results that are outside of
DAP's scope. For instance it may be apparent from the aggregate result
that one or more aggregators have emitted an incorrect aggregate share.</li>
                </ul>
              </li>
              <li>
                <t>If Clients reveal identifying information to Aggregators (such as a trusted
identity during Client authentication), Aggregators can learn which Clients
are contributing reports.
                </t>
                <ol spacing="normal" type="1"><li>Aggregators may reveal that a particular Client contributed reports.</li>
                  <li>
                    <t>Aggregators may attack robustness by selectively omitting reports from
certain Clients.
                    </t>
                    <ul spacing="normal">
                      <li>For example, omitting submissions from a particular geographic
region to falsely suggest that a particular localization is not
being used.
       * Exposing metadata to Aggregators can be mitigated by deploying an
anonymizing proxy (see <xref target="anon-proxy"/>).</li>
                    </ul>
                  </li>
                </ol>
              </li>
              <li>
                <t>Individual Aggregators may compromise availability of the system by refusing
to emit aggregate shares.
                </t>
                <ul spacing="normal">
                  <li>The DAP and VDAF threat model already assumes that robustness only holds
if both aggregators are honest, so a loss of availability is no worse.</li>
                </ul>
              </li>
              <li>
                <t>Violate robustness. Any Aggregator can collude with a malicious Client to
craft a proof that will fool honest Aggregators into accepting invalid
measurements.
                </t>
                <ul spacing="normal">
                  <li>The VDAF threat model already assumes that robustness only holds if both
aggregators are honest.</li>
                </ul>
              </li>
              <li>
                <t>Aggregators (and the Collector) can count the total number of input shares,
which could compromise user privacy (and differential privacy <xref target="dp"/>) if the
presence or absence of a share for a given user is sensitive.
                </t>
                <ul spacing="normal">
                  <li>Clients can ensure that aggregate counts are non-sensitive by generating
reports independently of user behavior (see <xref target="network-attacker"/>.</li>
                  <li>Clients, especially in deployments that cannot schedule report uploads at a
fixed time (e.g., an application that does not run persistently) can also
apply local differential privacy to measurements before constructing
reports.</li>
                </ul>
              </li>
            </ol>
            <t>[[TODO: link to the Shan et al. I-D on differential privacy in DAP once it is
published.]]</t>
          </section>
        </section>
        <section anchor="leader">
          <name>Leader</name>
          <t>The Leader is also an Aggregator, and so all the assets, capabilities and
mitigations available to Aggregators also apply to the Leader.</t>
          <section anchor="capabilities-and-mitigations-2">
            <name>Capabilities and mitigations</name>
            <ol spacing="normal" type="1"><li>
                <t>Shrinking the anonymity set. The Leader instructs the Helper to construct
aggregate shares and so could request aggregations over dangerously few
reports.
                </t>
                <ol spacing="normal" type="1"><li>This capability is particularly strong in the case of fixed-size queries
(<xref target="fixed-size-query"/>), because in that setting, the Leader is responsible
for assigning reports to batches and so can craft batches to target
certain contributions.
* This is mitigated by choosing a sufficient minimum batch size for the task.
* If aggregate shares emitted by Aggregators satisfy differential privacy
  <xref target="dp"/>, then genuine records are protected regardless of the size of the
  anonymity set.</li>
                </ol>
              </li>
              <li>
                <t>Relaying messages between Helper and Collector in the collect sub-protocol.
These messages are not authenticated, meaning the leader can:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Send collect parameters to the Helper that do not reflect the parameters
chosen by the Collector
                    </t>
                    <ul spacing="normal">
                      <li>This is mitigated by including the <tt>BatchSelector</tt> and aggregation
parameter in the AAD used to encrypt aggregate shares.</li>
                    </ul>
                  </li>
                  <li>Discard the aggregate share computed by the Helper and then fabricate
aggregate shares that combine into an arbitrary aggregate result
* These are attacks on robustness, which we already assume to hold only if
  both Aggregators are honest, putting these malicious-Leader attacks out of
  scope.</li>
                </ol>
              </li>
            </ol>
            <t>[[OPEN ISSUE: Should we have authentication in either direction between the
Helper and the Collector? #155]]</t>
          </section>
        </section>
        <section anchor="aggregator-collusion">
          <name>Aggregator collusion</name>
          <t>If all Aggregators collude (e.g. by promiscuously sharing unencrypted input
shares), then none of the properties of the system hold. Accordingly, such
scenarios are outside of the threat model.</t>
        </section>
        <section anchor="network-attacker">
          <name>Attacker on the network</name>
          <t>We assume the existence of attackers on the network links between participants.
Most passive network attacks are mitigated by DAP's requirement of HTTPS for all
traffic and mutual authentication for key protocol interactions (see
<xref target="message-transport"/>). Nonetheless, there remain information leaks that
deployments should be aware of.</t>
          <section anchor="capabilities">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>
                <t>Attackers may observe messages exchanged between participants at the IP
layer.
                </t>
                <ol spacing="normal" type="1"><li>The attacker can observe source and destination IP addresses, potentially
revealing the existence of Clients and Aggregators.</li>
                  <li>The time of upload of reports by Clients could reveal information about
user activity. For example, if a user opts into a new feature, and the
Client immediately reports this to Aggregators, then just by observing
network traffic, the attacker can infer what the user did.</li>
                  <li>Observation of message size could allow the attacker to learn how many
reports are being uploaded by a Client. For example, if the attacker
observes an encrypted message of some size, they can infer the size of the
plaintext, plus or minus the cipher block size. From this they may be able
to infer which VDAF is in use and perhaps which task the Client is
uploading reports for.
* These attacks can be mitigated by requiring Clients to submit reports at
  regular intervals and independently of whether the event that the task is
  tracking has not occurred, so that the absence of reports cannot be
  distinguished from their presence.</li>
                </ol>
              </li>
              <li>
                <t>Tampering with network traffic. Attackers may drop messages or inject new
messages into communications between participants.
                </t>
                <ul spacing="normal">
                  <li>DAP mitigates this by using standard HTTP semantics to allow requests to be
retried. However attacks that completely deny network access to
participants are outside of DAP's scope.</li>
                </ul>
              </li>
            </ol>
            <t>[[OPEN ISSUE: The threat model for Prio --- as it's described in the original
paper and <xref target="BBCGGI19"/> --- considers <strong>either</strong> a malicious Client (attacking
robustness) <strong>or</strong> a malicious subset of Aggregators (attacking privacy). In
particular, robustness isn't guaranteed if any one of the Aggregators is
malicious; in theory it may be possible for a malicious Client and Aggregator to
collude and break robustness. Is this a contingency we need to address? There
are techniques in <xref target="BBCGGI19"/> that account for this; we need to figure out if
they're practical.]]</t>
          </section>
        </section>
      </section>
      <section anchor="sybil">
        <name>Sybil attacks</name>
        <t>Several attacks on privacy involve malicious clients uploading reports that are
valid under the chosen VDAF but incorrect. For example, a DAP deployment might
be measuring the heights of a human population and configure a VDAF 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"/>.</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>
        <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 is a highly effective way
for the Aggregators (or an authenticating proxy deployed between clients and the
Aggregators; see <xref target="anon-proxy"/>) to ensure that all reports come from authentic
Clients and to enforce policy on things like upload rates. Note that because the
Helper never handles messages directly from the Clients, reports would have to
use an extension (<xref target="upload-extensions"/>) to convey authentication information to
the Helper.</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>
      <section anchor="anon-proxy">
        <name>Anonymizing proxies</name>
        <t>Client reports can contain auxiliary information such as source IP, HTTP user
agent or in deployments which use it, Client authentication information, which
could be used by Aggregators to identify participating Clients or permit some
attacks on robustness. This auxiliary information could 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-08"/> to forward reports to the
DAP Leader, without requiring any server participating in DAP to be aware of
whatever Client authentication or attestation scheme is in use.</t>
      </section>
      <section anchor="task-parameters">
        <name>Task parameters</name>
        <t>Selection and distribution of DAP task parameters is out of band from DAP itself
and thus not discussed in this document, but we must nonetheless discuss the
security implications of some task parameter choices. Generally, attacks
involving crafted DAP task parameters can be mitigated by having the the
Aggregators refuse shared parameters that are trivially insecure (e.g., a
minimum batch size of 1 report).</t>
        <section anchor="verification-key">
          <name>Verification key requirements</name>
          <t>The verification key for a task <bcp14>SHOULD</bcp14> be chosen before any reports are
generated. It <bcp14>SHOULD</bcp14> be fixed for the lifetime of the task and not be rotated.
One way to ensure this is to include the verification key in a derivation of the
task ID.</t>
          <t>This consideration comes from current security analysis for existing VDAFs. For
example, to ensure that the security proofs for Prio3 hold, the verification key
<bcp14>MUST</bcp14> be chosen independently of the generated reports. This can be achieved as
recommended above.</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 participants. Aggregators must enforce the agreed-upon minimum
batch size during the collect protocol, but implementations may 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 minimum batch sizes.</t>
        </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 can increase superlinearly as multiple rounds of evaluation are needed for
each bit of the measurement value.</t>
          <t>When dealing with variable length measurements (e.g domain names), it is
necessary to pad them to convert into fixed-size measurements. When computing
the heavy hitters from a batch of such measurements, we can early-abort the
Poplar1 execution once we have reached the padding region for a candidate
measurement. 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>[[TODO: Revisit this paragraph once https://github.com/cfrg/draft-irtf-cfrg-vdaf/issues/273
is resolved.]]</t>
          <t>Therefore, care must be taken that a DAP deployment can comfortably handle
computation of measurements for arbitrarily large sizes, otherwise, it may
result in a DoS possibility for the entire system.</t>
        </section>
      </section>
      <section anchor="dp">
        <name>Differential privacy</name>
        <t>Optionally, 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 record is still formally
protected.</t>
      </section>
      <section anchor="robustness-in-the-presence-of-malicious-servers">
        <name>Robustness in the presence of malicious servers</name>
        <t>Most DAP protocols, including Prio and Poplar, are robust against malicious
clients, but are not robust against malicious servers. Any Aggregator can simply
emit bogus aggregate shares and undetectably spoil aggregates. If enough
Aggregators were available, this could be mitigated by running the protocol
multiple times with distinct subsets of Aggregators chosen so that no Aggregator
appears in all subsets and checking all the aggregate results against each
other. If all the protocol runs do not agree, then participants know that at
least one Aggregator is defective, and it may be possible to identify the
defector (i.e., if a majority of runs agree, and a single Aggregator appears in
every run that disagrees). See
<eref target="https://github.com/ietf-wg-ppm/draft-ietf-ppm-dap/issues/22">#22</eref> for
discussion.</t>
      </section>
      <section anchor="infrastructure-diversity">
        <name>Infrastructure diversity</name>
        <t>Prio 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 anchor="operational-requirements">
        <name>System requirements</name>
        <section anchor="data-types">
          <name>Data types</name>
        </section>
      </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>HpkeConfigList <xref target="hpke-config"/>: "application/dap-hpke-config-list"</li>
          <li>Report <xref target="upload-request"/>: "application/dap-report"</li>
          <li>AggregationJobInitReq <xref target="leader-init"/>: "application/dap-aggregation-job-init-req"</li>
          <li>AggregationJobResp <xref target="aggregation-helper-init"/>: "application/dap-aggregation-job-resp"</li>
          <li>AggregationJobContinueReq <xref target="aggregation-leader-continuation"/>: "application/dap-aggregation-job-continue-req"</li>
          <li>AggregateShareReq <xref target="collect-flow"/>: "application/dap-aggregate-share-req"</li>
          <li>AggregateShare <xref target="collect-flow"/>: "application/dap-aggregate-share"</li>
          <li>CollectionReq <xref target="collect-flow"/>: "application/dap-collect-req"</li>
          <li>Collection <xref target="collect-flow"/>: "application/dap-collection"</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="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="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 anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The text in <xref target="message-transport"/> is based extensively on <xref target="RFC8555"/></t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <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="31" month="August" 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-07"/>
        </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="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-08">
          <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="15" month="March" year="2023"/>
            <abstract>
              <t>   This document describes a system for forwarding encrypted HTTP
   messages.  This 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-08"/>
        </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>
        <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="RFC8555">
          <front>
            <title>Automatic Certificate Management Environment (ACME)</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="J. Hoffman-Andrews" initials="J." surname="Hoffman-Andrews"/>
            <author fullname="D. McCarney" initials="D." surname="McCarney"/>
            <author fullname="J. Kasten" initials="J." surname="Kasten"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>Public Key Infrastructure using X.509 (PKIX) certificates are used for a number of purposes, the most significant of which is the authentication of domain names. Thus, certification authorities (CAs) in the Web PKI are trusted to verify that an applicant for a certificate legitimately represents the domain name(s) in the certificate. As of this writing, this verification is done through a collection of ad hoc mechanisms. This document describes a protocol that a CA and an applicant can use to automate the process of verification and certificate issuance. The protocol also provides facilities for other certificate management functions, such as certificate revocation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8555"/>
          <seriesInfo name="DOI" value="10.17487/RFC8555"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y963obx5U2+r+uogf6ITIBIFIny1ScGVoHmxPb0khykpls
j9AEmmRHQDfS3RCFyNrXsq9lX9lex6pV1Q2Scjyz53u+T0+eWALQ1XVYtc7r
XZPJxHVltyyOstHTsu2a8nTTFYvs+Py8Kc7zrqyr7GVTd/W8XmZndQP/KN/n
8y38t2iL5n1ZnWffF3m7aYpVUXUjl5+eNsX7o+zp8cvJy5ffu0U9r/IVDL9o
8rNuUhbd2WS9Xk0W+Xpy8IWb511xXjfbo6ztFs69L6pNceSy7LypN2uY03Wv
y7Juu8bJ/6lu3uG33+CD+PkqL5fwObzrX/Cl07o5x4/zZn4BH1903bo9unMH
f4Ufle+Lqf7sDn5w57SpL9viDjx/B587L7uLzSk8SSu4PMdF3OmvCX+6hDW1
nXmJeWTK40zLeuDhgY+mF91qOYKNOcruOZdvuou6gf2ZwGvoT1m1R9mbafZN
UZ9fwIFV+gVv+pty1f8KlphX5d/pcI+yk9evvtFvCt60rlydw0O/xYn8yzl+
Np3XK5e+9sk0e5l3XZ2888lFA4RUry+KJvk+fvGTZb1ZnMHuF8nr5zjAmp68
bgrPptmrop3XzTKPJ/GsKee9r+L3f1//vVyGL+XlxbvmX5rubLVrxcfT7E91
vdi95OQHN11zfvkvF0W+BhI+Lbt2WhWdc66s4Mqt4Nn3cCngiSfffH34xRE9
qpcWLkh9xLeyK8bZq/p003bjLK8W2et5vsxPl0X2pF6tNx1f5vrM3+0ie40f
tl05b0c06AI+PMruHhx+MTm4Nzm8z2/Km/PCkvO82a67etp2OU5vMS0Wmztr
mMaddb4umul6ccajeWqlPxPewm+nMJ2mKWFXJt+Up6dt/PXTafZ1XRUXuNqv
v37yzTcnh1/GC/6Poqknf6jqy2WxOC+QOdVnbQYre13Mm6KbvL6A3V1kT/Mu
z96XefZ8s1xus+/KqsiBHp+8TJZ693ByAP97MLzUAtZVddMynzfEGWBrvrxz
+OjRFQv0K4g+fYafbpfFZ23GD3Cvy+Vpnccf//s0O2kv8jLs0d3DeI++K88v
ussC/z97U8wvqvJvm6IN/BuO/tsif7/Nvi27rmj+wS25e3gHKOZ/zJY8rTcH
d+P9eHMBtL49LZfZcdfl83fJeu9ODg/gf8PrXZbVu2mLiz4H4gaucGd+ka9h
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
FlUzyqv0rCpDh/uyiKnyKp79Peikq81KNAQ0IXSjV/KNhDQM+4y41cvN6bKc
B9Lsayg76D07bYChzDEEjIp2zgoKXxHLyK+gDPYO8en1IzR429lzYm8C8zEW
ouHK20NGLz9m7DQUu6RLHskPoX3//uy1uZZy3DTX4Pma83Ds2VqXxVyYh2el
7uPRafMpTVbYtD4UTkkhTNlLYOMbNPxgCNGz799/CHo2+YjJdhfTsHXC28HA
zYKT6Fk1r/ks4I4sCvkHb36wK5FJkg0ohN068kdzpK+FN/sXo71D0eH3ZXGZ
fbxVy18/sZ1zw6wIqwPAJuVlYxIiHDC1omn42GBeI0MhYDk+Q+rhAW6rfqHO
bPP2EpTeKC+FbmRPfRpnfMvpjpP7hoLvlIJzWlzk78saQ7PfoPfCdYHlDyhi
sw9vD8fZdAqjfXhLnoUlrX0Gf5cFj0ULd8MycraeMRF5IWWWzq4wSg/BxDI4
ZcoScZolMttmX2XP99b4djOP/RlpfLQqr7/Ons8kXhGSbirQq+C/rlgCXeSn
GKjBF8b67J8K8gPRAGSfD6rXIyHumBrI0475JbQHTFneVS2edFwauqKiG+7Y
vSOhXR9XsIxTQ92qCRH3E/bx1cnk6XRH/gG6L56ojtyKbxrTdX+D2Xr1vWwv
aMdfWO1YbQ+zjoEMnVbSYlADAfFBaijYwxeYbwyLWyH5dfMpvU5U8r0d6vjA
C89KliF0TDXw1nW93sAgPubQBg5IdzC5fcFSyH589Z0wBbiKF0gra2AL+zzz
ywJOHC4i3RF9YRAVPpKLp3MBeq/39vEsJMrBJ9WKY/40b8tWpQavPZALMTtN
jv30ydh5mGR4XjFraOvl+0KGu6CE2AtOiPXeeBJeksyV2WQuDAejXsAeswbT
FlBtjAU2R6YpDsfMhceROcf34hV5Jh251FoR7WWn7MkmLY1Z/ImOQaKSmFUk
uFjAO2WMI6tnsiMMX0LxIit6YtkaS1Y8AyeR9hbTQfAigUDK4XXw8RpjpEVL
lE/Mjv03IWEr0nU1aolDSNIYCSRKMkjDinZhpJH6rFEM7GoKxoJuwUlnXONp
JFc53U5XCBD5Wdm0nbEt8CA2ayHsSF1f1qw60F6PEi22JZd2UVGqCqq8Svbp
73Z7J9gz+HrbdkCJx1ilgqQEGwFSs6VPJ7n5VAQoylPKEeTn7C/Ie0meMlKN
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
P7EkATZLSHEg/o+Eo4mpMe3hs7sPcMpatvhbgGZyig3NDmYeA9Ljl8msMSPj
2ko4bWCcVsJlSU4nvyLUZmBXkBxdHNTXU7QyVI0wNU3R6rwCLEQ+MBvfKfFK
GJa94J30mQbsEs5WJXk/hniQJixe1JslmkfY297co5CoUFI9bKTusfP6/r1H
R9iKT97FLfjSxCb0KH/wvWLa8hz9RcHr89NuuhLW3U/k7DUTVy4BmhwRFNZJ
7j2XebCv4arLj7/ijn6yGcjbDmePnU8jhlsh0qr3u7uzxyQoWqRedtaa1aMO
XLHF506LCwxfcpfV1CGBab9VF9OFbfmy36MOR9TByXgcKGEo3VOMTUwUBSwa
cMhi8T1FHVFGaFuadn7CcyDDaThzPGanTeHKBRtUy17HYmsjJQgJuFETzJuZ
yHK2Azm53oZmGCk+8fENrjE+9H3ZUgr+NeWsSb0xU18KOk45m15bdjeo2rIN
b7wlwWSqCVifXcT1q5kU/4A94Y0JsiROznYp2AkNW8saKPB/fC0Op4RfBRTy
X76uX6dQZ9eKBqyqeEVt9auvSM2K4Zn2pUOchH2FE8YNZ/xHTka6zsn1ZHGd
Xt3WJYBqHm1J3VYoC29apXP34MC9+MPYAmfNblJkI8njXM+jIIhcz+MGuDKz
+P9TcvG5JReCS+8bWZpdzV7jyl6DjEpMsAHZ5a5yvUVOVup/kEfuYuyCJl1V
YrDJKETfUevYdaHKBrfGXbPqpoYebgJ2QI1y73zsOcHSY0uio1JU9srgNFS/
2AoyomvnRZU3ZS1OI3sgHvoDuwNqvIgeownNKqr6m1W/PZxJo8+u56Tkmzxc
9Zmdo0dXosjZYkNfY/IuZxtR0lfuuiaH24HLqIrusm7eaRb2NE4MQk2OaIp0
sEWkUVJHXEbR8Ngp3uGuq4FleG9GrFWjo9hXeNF8ViXb+lfro/18MVks9eSk
xBf60TsqGjtz/my0pmwc5Qwm+XSi4JGava5LUTupySQi0lQdIXPcbqNa9RA/
JJpYbBgmU1Pn4MwvegEMbFcMuqjn2DGH8C78ZO+okcaupzycALmFpVkGhY6r
sM6BAkQumcdL6/eKuzKex9WqvDcuuWE7kfWG7jPYuwuyQ7nlIKH9YO8Axk+Y
kJ7vu/cUlN/md5ac/hg1UeV5P022MxYa3SgYEUsHh2suxYU1aTZVtWNTHImm
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
kyfuggP5Eggusv8Ff9E3PekAAgA=

-->

</rfc>
