<?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.17 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-02" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title abbrev="DAP-PPM">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-02"/>
    <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="2022" month="September" day="22"/>
    <abstract>
      <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>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes a distributed aggregation protocol 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>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>
        <t>The following terms are used:</t>
        <dl>
          <dt>Aggregate result:</dt>
          <dd>
            <t>The output of the aggregation function over a given set of reports.</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 final output.</t>
          </dd>
          <dt>Aggregation function:</dt>
          <dd>
            <t>The function computed over the users' inputs.</t>
          </dd>
          <dt>Aggregator:</dt>
          <dd>
            <t>An endpoint that runs the input-validation protocol and accumulates input
shares.</t>
          </dd>
          <dt>Batch:</dt>
          <dd>
            <t>A set of reports that are aggregated into an output.</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 the collect or aggregate-share request that specifies the time
range of the reports in the batch.</t>
          </dd>
          <dt>Client:</dt>
          <dd>
            <t>The endpoint from which a user sends data to be aggregated, e.g., a web
browser.</t>
          </dd>
          <dt>Collector:</dt>
          <dd>
            <t>The endpoint that receives the output of the aggregation function.</t>
          </dd>
          <dt>Helper:</dt>
          <dd>
            <t>Executes the protocol as instructed by the leader.</t>
          </dd>
          <dt>Input:</dt>
          <dd>
            <t>The measurement (or measurements) emitted by a client, before any encryption
or secret sharing scheme is applied.</t>
          </dd>
          <dt>Input share:</dt>
          <dd>
            <t>An aggregator's share of the output of the VDAF
<xref target="VDAF"/> sharding algorithm. This algorithm is
run by each client in order to cryptographically protect its measurement.</t>
          </dd>
          <dt>Leader:</dt>
          <dd>
            <t>A distinguished aggregator that coordinates input validation and data
 collection.</t>
          </dd>
          <dt>Measurement:</dt>
          <dd>
            <t>A single value (e.g., a count) being reported by a client. Multiple
measurements may be grouped into a single protocol input.</t>
          </dd>
          <dt>Minimum batch duration:</dt>
          <dd>
            <t>The minimum batch duration permitted for a DAP task, i.e., the minimum time
difference between the oldest and newest report in a batch.</t>
          </dd>
          <dt>Minimum batch size:</dt>
          <dd>
            <t>The minimum number of reports in a batch.</t>
          </dd>
          <dt>Output share:</dt>
          <dd>
            <t>An aggregator's share of the output of the VDAF
<xref target="VDAF"/> preparation step. Many output shares
are combined into an aggregate share via the VDAF aggregation algorithm.</t>
          </dd>
          <dt>Proof:</dt>
          <dd>
            <t>A value generated by the client and used by the aggregators to verify the
client's input.</t>
          </dd>
          <dt>Report:</dt>
          <dd>
            <t>Uploaded to the leader from the client. A report contains the secret-shared
and encrypted input and proof.</t>
          </dd>
          <dt>Server:</dt>
          <dd>
            <t>An aggregator.</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 small set of servers.
Servers are referred to as <em>aggregators</em>. Each client's input to the protocol is
a 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> users, the goal of a protocol for
privacy preserving measurement 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.</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, which allows for aggregate statistics such as sum, mean, histograms,
etc. This class of VDAFs is based on Prio <xref target="CGB17"/> and includes improvements
described in <xref target="BBCGGI19"/>.</li>
        <li>Poplar1, which allows for finding the most popular strings among a collection
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>This protocol is designed to work with schemes that use secret sharing. Rather
than sending its input in the clear, each client shards its measurements into a
sequence of <em>input shares</em> and sends an input share to each of the aggregators.
This provides two important properties:</t>
      <ul spacing="normal">
        <li>It is impossible to deduce the measurement without knowing <em>all</em> of the
shares.</li>
        <li>It allows the aggregators to compute the final output by first aggregating up
their measurements shares locally, then combining the results to obtain the
final output.</li>
      </ul>
      <section anchor="system-architecture">
        <name>System Architecture</name>
        <t>The overall system architecture is shown in <xref target="pa-topology"/>.</t>
        <figure anchor="pa-topology">
          <name>System Architecture</name>
          <artwork><![CDATA[
                    +------------+
                    |            |
+--------+          |   Helper   |
|        |          |            |
| Client +----+     +-----^------+
|        |    |           |
+--------+    |           |
              |           |
+--------+    |     +-----v------+         +-----------+
|        |    +----->            |         |           |
| Client +---------->   Leader   <---------> Collector |
|        |    +----->            |         |           |
+--------+    |     +-----^------+         +-----------+
              |           |
+--------+    |           |
|        |    |           |
| Client +----+     +-----V------+
|        |          |            |
+--------+          |   Helper   |
                    |            |
                    +------------+
]]></artwork>
        </figure>
        <t>[[OPEN ISSUE: This shows two helpers, but the document only allows one for now.
https://github.com/ietf-wg-ppm/draft-ietf-ppm-dap/issues/117]]</t>
        <t>The main participants in the protocol are as follows:</t>
        <dl>
          <dt>Collector:</dt>
          <dd>
            <t>The entity which wants to take the measurement and ultimately receives the
results. Any given measurement 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 the other
aggregators to compute the final aggregate. This protocol defines two types of
aggregators: Leaders and Helpers. For each measurement, there is a single
leader and helper.</t>
          </dd>
          <dt>Leader:</dt>
          <dd>
            <t>The leader is responsible for coordinating the protocol. It receives the
encrypted shares, distributes them to the helpers, and orchestrates the
process of computing the final measurement as requested by the collector.</t>
          </dd>
          <dt>Helper:</dt>
          <dd>
            <t>Helpers are responsible for executing the protocol as instructed by the
leader. The protocol is designed so that helpers can be relatively
lightweight, with most of the state held at the leader.</t>
          </dd>
        </dl>
        <t>The basic unit of DAP is the "task" which represents a single measurement
(though potentially taken over multiple time windows). 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 window".</li>
        </ul>
        <t>These parameters are distributed out of band to the clients and to the
aggregators. They are distributed by the collecting entity in some authenticated
form. Each task is identified by a unique 32-byte ID which is used to refer to
it in protocol messages.</t>
        <t>During the duration of the measurement, each client records its own 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
measurement, the client may only send one report or may send many reports over
time.</t>
        <t>The leader distributes the shares to the helpers and orchestrates the process of
verifying them (see <xref target="validating-inputs"/>) and assembling them into a final
measurement 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 the values for
individual clients.</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
distributed zero-knowledge proof of the input's validity <xref target="BBCGGI19"/> 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 N options the user select, the report might contain N integers and the
proof would demonstrate that N-1 were 0 and the other was 1.</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. Any authentication
scheme that is composable with HTTP is allowed. For example, <xref target="OAuth2"/>
credentials are presented in an Authorization HTTP header, which can be added to
any DAP protocol message, or TLS client certificates are another viable
solution. This 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">unrecognizedMessage</td>
              <td align="left">The message type for a response was incorrect or the payload was malformed.</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">reportTooLate</td>
              <td align="left">Report could not be processed because it arrived too late.</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">A collect or aggregate-share request was made with invalid batch parameters.</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">queryMismatch</td>
              <td align="left">Query type indicated by a message does not match the task's query type.</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"/>). Clients <bcp14>SHOULD</bcp14>
display the "detail" field of all errors. The "instance" value <bcp14>MUST</bcp14> be the
endpoint to which the request was targeted. The problem document <bcp14>MUST</bcp14> also
include a "taskid" member which contains the associated DAP task ID (this value
is always known, see <xref target="task-configuration"/>), encoded in Base 64 using the URL
and filename safe alphabet with no padding defined in sections 5 and 3.2 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
'unrecognizedMessage'" refers to an error document with "type" value
"urn:ietf:params:ppm:dap:error:unrecognizedMessage".</t>
        <t>This document uses the verbs "abort" and "alert with <tt>[some error message]</tt>" to
describe how protocol participants react to various error conditions.</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 of a given measurement, specified in <xref target="aggregate-flow"/></li>
        <li>Collecting aggregated results, specified in <xref target="collect-flow"/></li>
      </ul>
      <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>;

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

Time uint64; /* 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. */
ReportID uint8[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;
]]></artwork>
      <section anchor="query">
        <name>Queries</name>
        <t>Aggregated results are computed based on sets of report, 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 can 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];

struct {
  QueryType query_type;
  select (Query.query_type) {
    case time_interval: Interval batch_interval;
    case fixed_size: BatchID batch_id;
  }
} 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
reports 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"/>) must 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>(1659545000, 1000)</tt>, <tt>(1659546000, 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. To get the aggregate of a batch, the Collector issues a query specifying
the batch ID of interest (see <xref target="query"/>).</t>
          <t>In addition to the minimum batch size common to all query types, the
configuration includes a "maximum batch size", <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>
          <t>[OPEN ISSUE: It may be desirable to allow Collectors to query for a current/
recent batch ID. How important this is will be determined by 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>A <tt>TaskID</tt> is a globally unique sequence of bytes. It is <bcp14>RECOMMENDED</bcp14> that this
be set to a random string output by a cryptographically secure pseudorandom
number generator. Each task has the following parameters associated with it:</t>
        <ul spacing="normal">
          <li>
            <tt>aggregator_endpoints</tt>: A list of URLs relative to which an aggregator's API
endpoints can be found. Each endpoint's list <bcp14>MUST</bcp14> be in the same order. The
leader's endpoint <bcp14>MUST</bcp14> be the first in the list. The order of the
<tt>encrypted_input_shares</tt> in a <tt>Report</tt> (see <xref target="upload-flow"/>) <bcp14>MUST</bcp14> be the same
as the order in which aggregators appear in this list.</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 instance used for the task, including the
type of measurement associated with the task.</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_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"/>). [OPEN ISSUE:
The manner in which this key is distributed may be relevant to the VDAF's
security. See issue#161.]</li>
        </ul>
        <t>Finally, the collector is configured with the HPKE secret key corresponding to
<tt>collector_hpke_config</tt>.</t>
      </section>
      <section anchor="upload-flow">
        <name>Uploading Reports</name>
        <t>Clients periodically upload reports to the leader, which then distributes the
individual shares to each helper.</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>, where <tt>[aggregator]</tt> is the
aggregator's endpoint URL, obtained from the task parameters. Clients <bcp14>MAY</bcp14>
specify a query parameter <tt>task_id</tt> when sending an HTTP GET request to
<tt>[aggregator]/hpke_config?task_id=[task-id]</tt>, where <tt>[task-id]</tt> is the task ID
obtained from the task parameters, encoded in Base 64 with URL and filename safe
alphabet with no padding, as specified in sections 5 and 3.2 of <xref target="RFC4648"/>. If
the aggregator does not recognize the task ID, then it responds with HTTP status
code 404 Not Found and an error of type <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 a 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>HpkeConfig</tt> value:</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[
struct {
  HpkeConfigId id;
  HpkeKemId kem_id;
  HpkeKdfId kdf_id;
  HpkeAeadKdfId 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, or support multiple
cipher suites (a la OHTTP/ECH).]</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 configuration; or</li>
            <li>the HPKE configuration specifies a KEM, KDF, or AEAD algorithm the client does
not recognize.</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 key
configurations.</t>
          <t>Note: Long cache lifetimes may result in clients using stale HPKE
configurations; aggregators <bcp14>SHOULD</bcp14> continue to accept reports with old keys for
at least twice the cache lifetime in order to avoid rejecting reports.</t>
        </section>
        <section anchor="upload-request">
          <name>Upload Request</name>
          <t>Clients upload reports by using an HTTP POST to <tt>[leader]/upload</tt>, where
<tt>[leader]</tt> is the first entry in the task's aggregator endpoints. The payload is
structured as follows:</t>
          <artwork><![CDATA[
struct {
  ReportID report_id;
  Time time;
  Extension extensions<0..2^16-1>;
} ReportMetadata;

struct {
  TaskID task_id;
  ReportMetadata metadata;
  opaque public_share<0..2^32-1>;
  HpkeCiphertext encrypted_input_shares<1..2^32-1>;
} Report;
]]></artwork>
          <t>This message is called the Client's report. It consists of the task ID, report
metadata, the "public share" output by the VDAF's input-distribution algorithm,
and the encrypted input share of each of the Aggregators. (Note that the public
share might be empty, depending on the VDAF. For example, Prio3 has an empty
public share, but Poplar1 does not. See <xref target="VDAF"/>.) The header consists of the
task ID and report "metadata". The metadata consists of the following fields:</t>
          <ul spacing="normal">
            <li>A report ID used by the Aggregators to ensure the report appears in at most
one batch. (See <xref target="anti-replay"/>.) The Client <bcp14>MUST</bcp14> generate this by generating
16 random bytes using a cryptographically secure random number generator.</li>
            <li>A timestamp representing the time at which the report was generated.
Specifically, the <tt>time</tt> field is set to the number of seconds elapsed since
the start of the UNIX epoch. The client <bcp14>SHOULD</bcp14> round this value down to the
nearest multiple of <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>
            <li>A list of extensions to be included with the report. (See
<xref target="upload-extensions"/>.)</li>
          </ul>
          <t>To generate a report, the Client first shards its measurement into input shares
as specified by the VDAF. It then encrypts each input share as follows:</t>
          <artwork><![CDATA[
enc, payload = SealBase(pk,
  "dap-02 input share" || 0x01 || server_role,
  task_id || metadata || public_share, 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>task_id</tt>
is the task ID, <tt>metadata</tt> is the report metadata, and <tt>input_share</tt> is the
Aggregator's input share.</t>
          <t>The order of the encrypted input shares appear <bcp14>MUST</bcp14> match the order of the
task's <tt>aggregator_endpoints</tt>. That is, the first share should be the leader's,
the second share should be for the first helper, and so on.</t>
          <t>The leader responds to well-formed requests to <tt>[leader]/upload</tt> with HTTP
status code 200 OK and an empty body. 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 200 OK and an
empty body.</t>
          <t>The leader responds to requests whose leader encrypted input share uses an
out-of-date <tt>HpkeConfig.id</tt> value, indicated by <tt>HpkeCiphertext.config_id</tt>, with
HTTP status code 400 Bad Request and an error of type 'outdatedConfig'. Clients
<bcp14>SHOULD</bcp14> invalidate any cached aggregator <tt>HpkeConfig</tt> and retry with a freshly
generated Report. If this retried report does not succeed, clients <bcp14>MUST</bcp14> abort
and discontinue retrying.</t>
          <t>The Leader <bcp14>MUST</bcp14> ignore any report pertaining to a batch that has already been
collected. (See <xref target="early-input-share-validation"/> for details.) Otherwise,
comparing the aggregate result to the previous aggregate result may result in a
privacy violation. (Note that the Helpers enforce this as well.) The Leader <bcp14>MAY</bcp14>
ignore any reports whose timestamp is past the task's <tt>task_expiration</tt>. When it
does so, the leader <bcp14>SHOULD</bcp14> abort the upload protocol and alert the client with
error "reportTooLate". Client <bcp14>MAY</bcp14> choose to opt out of the task if its own clock
has passed <tt>task_expiration</tt>.</t>
          <t>Leaders can buffer reports while waiting to aggregate them. 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 "reportTooEarly".</t>
        </section>
        <section anchor="upload-extensions">
          <name>Upload Extensions</name>
          <t>Each Report carries a list of extensions that clients may use to convey
additional, authenticated information in the report. [OPEN ISSUE: The extensions
aren't authenticated. It's probably a good idea to be a bit more clear about how
we envision extensions being used. Right now this includes client attestation
for defeating Sybil attacks. See issue#89.] 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>"extension_type" indicates the type of extension, and "extension_data" contains
information specific to the extension.</t>
        </section>
        <section anchor="upload-message-security">
          <name>Upload Message Security</name>
          <t>The contents of each input share must be kept confidential from everyone but the
client and the aggregator it is being sent to. In addition, clients must be able
to authenticate the aggregator they upload to.</t>
          <t>HTTPS provides confidentiality between the DAP client and the leader, but this
is not sufficient since the helper's report shares are relayed through the
leader. Confidentiality of report shares is achieved by encrypting each report
share to a public key held by the respective aggregator using <xref target="HPKE"/>. Clients
fetch the public keys from each aggregator over HTTPS, allowing them to
authenticate the server.</t>
          <t>Aggregators <bcp14>MAY</bcp14> require clients to authenticate when uploading reports. This is
an effective mitigation against Sybil <xref target="Dou02"/> attacks in deployments where it
is practical for each client to have an identity provisioned (e.g., a user
logged into an online service or a hardware device programmed with an identity).
If it is used, client authentication <bcp14>MUST</bcp14> use a scheme that meets the
requirements in <xref target="request-authentication"/>.</t>
          <t>In some deployments, it will not be practical to require clients to authenticate
(e.g., a widely distributed application that does not require its users to login
to any service), so client authentication is not mandatory in DAP.</t>
          <t>[[OPEN ISSUE: deployments that don't have client auth will need to do something
about Sybil attacks. Is there any useful guidance or <bcp14>SHOULD</bcp14> we can provide?
Sort of relevant: issue #89]]</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
send them to the helpers to be verified and aggregated. In order to enable the
system to handle very large batches of reports, this process can be performed
incrementally. Verification of a set of reports is referred to as an aggregation
job. Each aggregation job is associated with exactly one DAP task, and a DAP
task can have many aggregation jobs. Each job is associated with an ID that is
unique within the context of a DAP task in order to distinguish different jobs
from one another. Each aggregator uses this ID as an index into per-job storage,
e.g., to keep track of report shares that belong to a given aggregation job.</t>
        <t>To run an aggregation job, the leader sends a message to each helper containing
the report shares in the job. The helper then processes them (verifying the
proofs and incorporating their values into the ongoing aggregate) and replies to
the leader.</t>
        <t>The exact structure of the aggregation job flow depends on the VDAF.
Specifically:</t>
        <ul spacing="normal">
          <li>Some VDAFs (e.g., Prio3) allow the leader to start aggregating reports
proactively before all the reports in a batch are received. Others (e.g.,
Poplar1) require all the reports to be present and must be initiated by the
collector.</li>
          <li>Processing the reports -- especially validating them -- may require multiple
round trips.</li>
        </ul>
        <t>Note that it is possible to aggregate reports from one batch while reports from
the next batch are coming in. This is because each report is validated
independently.</t>
        <t>This process is illustrated below in <xref target="aggregation-flow-illustration"/>. In this
example, the batch size is 20, but the leader opts to process the reports in
sub-batches of 10. Each sub-batch takes two round-trips to process.</t>
        <figure anchor="aggregation-flow-illustration">
          <name>Aggregation Flow (batch size=20). Multiple aggregation flows can be executed at the same time.</name>
          <artwork><![CDATA[
Leader                                                 Helper

Aggregate request (Reports 1-10, Job = N) --------------->  \
<----------------------------- Aggregate response (Job = N) | Reports
Aggregate request (continued, Job = N) ------------------>  | 1-10
<----------------------------- Aggregate response (Job = N) /


Aggregate request (Reports 11-20, Job = M) -------------->  \
<----------------------------- Aggregate response (Job = M) | Reports
Aggregate request (continued, Job = M) ------------------>  | 11-20
<----------------------------- Aggregate response (Job = M) /
]]></artwork>
        </figure>
        <t>[OPEN ISSUE: Should there be an indication of whether a given aggregate request
is a continuation of a previous sub-batch?]</t>
        <t>The aggregation flow can be thought of as having three phases for transforming
each valid input report share into an output share:</t>
        <ul spacing="normal">
          <li>Initialization: Begin the aggregation flow by sharing report shares with each
helper. Each aggregator, including the leader, initializes the underlying
VDAF instance using these report shares and the VDAF configured for the
corresponding measurement task.</li>
          <li>Continuation: Continue the aggregation flow by exchanging messages produced by
the underlying VDAF instance until aggregation completes or an error occurs.
These messages do not replay the shares.</li>
          <li>Completion: Finish the aggregate flow, yielding an output share corresponding
for each input report share in the batch.</li>
        </ul>
        <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 unique job ID. The job ID is a 32-byte value,
structured as follows:</t>
          <artwork><![CDATA[
opaque AggregationJobID[32];
]]></artwork>
          <t>The leader can run this process for many candidate reports in parallel as
needed. After choosing the set of candidates, the leader begins aggregation by
splitting each report into "report shares", one for each aggregator. The leader
and helpers 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 invalid.</li>
            <li>For each valid report share, initialize the VDAF preparation process.</li>
          </ol>
          <t>An invalid report share is marked with one of the following errors:</t>
          <artwork><![CDATA[
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),
  (255)
} ReportShareError;
]]></artwork>
          <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
report shares as follows:</t>
            <ol spacing="normal" type="1"><li>Generate a fresh AggregationJobID. This ID <bcp14>MUST</bcp14> be unique within the context
of the corresponding DAP task. It is <bcp14>RECOMMENDED</bcp14> that this be set to a random
string output by a cryptographically secure pseudorandom number generator.</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="early-input-share-validation"/>.</li>
              <li>Initialize VDAF preparation as described in <xref target="input-share-prep"/>.</li>
            </ol>
            <t>If any step yields an invalid report share, the leader removes the report share
from the set of candidate reports. Once the leader has initialized this state
for all valid candidate report shares, it then creates an AggregateInitializeReq
message for each helper to initialize the preparation of this candidate set. The
AggregateInitializeReq message is structured as follows:</t>
            <artwork><![CDATA[
struct {
  ReportMetadata metadata;
  opaque public_share<0..2^32-1>;
  HpkeCiphertext encrypted_input_share;
} ReportShare;

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

struct {
  TaskID task_id;
  AggregationJobID job_id;
  opaque agg_param<0..2^16-1>;
  PartialBatchSelector part_batch_selector;
  ReportShare report_shares<1..2^32-1>;
} AggregateInitializeReq;
]]></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>The ID of the task for which the reports will be aggregated.</li>
              <li>The aggregation job ID.</li>
              <li>
                <t>The opaque, VDAF-specific aggregation parameter provided during the collection
flow (<tt>agg_param</tt>),  </t>
                <t>
[[OPEN ISSUE: Check that this handling of <tt>agg_param</tt> is appropriate when the
definition of Poplar is done.]]</t>
              </li>
              <li>
                <t>Information used by the Aggregators to determine how to aggregate each report:  </t>
                <ul spacing="normal">
                  <li>
                    <t>For fixed_size 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 "queryMismatch".</t>
              </li>
              <li>The sequence of report shares to aggregate. The <tt>encrypted_input_share</tt> field
of the report share is the <tt>HpkeCiphertext</tt> whose index in
<tt>Report.encrypted_input_shares</tt> is equal to the index of the aggregator in the
task's <tt>aggregator_endpoints</tt> to which the AggregateInitializeReq is being
sent.</li>
            </ul>
            <t>Let <tt>[aggregator]</tt> denote the helper's API endpoint. The leader sends a POST
request to <tt>[aggregator]/aggregate</tt> with its AggregateInitializeReq message as
the payload. The media type is "message/dap-aggregate-initialize-req".</t>
          </section>
          <section anchor="helper-initialization">
            <name>Helper Initialization</name>
            <t>Each helper begins their portion of the aggregate initialization phase with the
set of candidate report shares obtained in an <tt>AggregateInitializeReq</tt> message
from the leader. It attempts to recover and validate the corresponding input
shares similar to the leader, and eventually returns a response to the leader
carrying a VDAF-specific message for each report share.</t>
            <t>To begin this process, the helper first checks that the report IDs in
<tt>AggregateInitializeReq.report_shares</tt> are all distinct. If two ReportShare
values have the same report ID, then the helper <bcp14>MUST</bcp14> abort with error
"unrecognizedMessage". If this check succeeds, the helper then attempts to
recover each input share in <tt>AggregateInitializeReq.report_shares</tt> 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="early-input-share-validation"/>.</li>
              <li>Initialize VDAF preparation and initial outputs as described in
<xref target="input-share-prep"/>.</li>
            </ol>
            <t>[[OPEN ISSUE: consider moving the helper report ID check into
<xref target="early-input-share-validation"/>]]</t>
            <t>Once the helper has processed each valid report share in
<tt>AggregateInitializeReq.report_shares</tt>, the helper then creates an
AggregateInitializeResp message to complete its initialization. This message is
structured as follows:</t>
            <artwork><![CDATA[
enum {
  continued(0),
  finished(1),
  failed(2),
  (255)
} PrepareStepResult;

struct {
  ReportID report_id;
  PrepareStepResult prepare_step_result;
  select (PrepareStep.prepare_step_result) {
    case continued: opaque prep_msg<0..2^32-1>; /* VDAF preparation message */
    case finished:  Empty;
    case failed:    ReportShareError;
  };
} PrepareStep;

struct {
  PrepareStep prepare_steps<1..2^32-1>;
} AggregateInitializeResp;
]]></artwork>
            <t>The message is a sequence of PrepareStep values, the order of which matches that
of the ReportShare values in <tt>AggregateInitializeReq.report_shares</tt>. Each report
that was marked as invalid is assigned the PrepareStepResult <tt>failed</tt>.
Otherwise, the PrepareStep is either marked as continued with the output
<tt>prep_msg</tt>, or is marked as finished if the VDAF preparation process is finished
for the report share.</t>
            <t>The helper's response to the leader is an HTTP status code 200 OK whose body is
the AggregateInitializeResp and media type is
"message/dap-aggregate-initialize-resp".</t>
            <t>Upon receipt of a helper's AggregateInitializeResp message, the leader checks
that the sequence of PrepareStep messages corresponds to the ReportShare
sequence of the AggregateInitializeReq. If any message appears out of order, is
missing, has an unrecognized report ID, or if two messages have the same report
ID, then the leader <bcp14>MUST</bcp14> abort with error "unrecognizedMessage".</t>
            <t>[[OPEN ISSUE: the leader behavior here is sort of bizarre -- to whom does it
abort?]]</t>
          </section>
          <section anchor="input-share-decryption">
            <name>Input Share Decryption</name>
            <t>Each report share has a corresponding task ID, report metadata (report ID,
timestamp, and extensions), the public share sent to each Aggregator, and the
recipient's encrypted input share. Let <tt>task_id</tt>, <tt>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, the aggregator
looks up the HPKE config and corresponding secret key indicated by
<tt>encrypted_input_share.config_id</tt>. If not found, then it marks the report share
as invalid with the error <tt>hpke_unknown_config_id</tt>. Otherwise, it decrypts the
payload with the following procedure:</t>
            <artwork><![CDATA[
input_share = OpenBase(encrypted_input_share.enc, sk,
  "dap-02 input share" || 0x01 || server_role,
  task_id || metadata || public_share,
  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). If decryption
fails, the aggregator marks the report share as invalid with the error
<tt>hpke_decrypt_error</tt>. Otherwise, it outputs the resulting <tt>input_share</tt>.</t>
          </section>
          <section anchor="early-input-share-validation">
            <name>Early 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 ReportShareError
error.</t>
            <t>Before beginning the preparation step, Aggregators are required to perform the
following generic checks.</t>
            <ol spacing="normal" type="1"><li>Check if the report has never been aggregated but is contained by a batch
that has been collected. If this check fails, the input share <bcp14>MUST</bcp14> be marked
as invalid with the error <tt>batch_collected</tt>. This prevents additional reports
from being aggregated after its batch has already been collected.</li>
              <li>Check if the report has already been aggregated with this aggregation
parameter. If this check fails, the input share <bcp14>MUST</bcp14> be marked as invalid
with the error <tt>report_replayed</tt>. This is the case if the report was used in
a previous aggregate request and is therefore a replay.</li>
              <li>
                <t>Depending on the query type for the task, additional checks may be
applicable:
                </t>
                <ul spacing="normal">
                  <li>For fixed_size 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
"batch_saturated". 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>Check if the report's timestamp has passed its task's <tt>task_expiration</tt> time,
if so the Aggregator <bcp14>MAY</bcp14> mark the input share as invalid with the error
"task_expired".</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>. This
situation arises if, for example, the Aggregator has evicted from long-term
storage the state required to perform the check. (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 anchor="input-share-prep">
            <name>Input Share Preparation</name>
            <t>Input share preparation consists of running the preparation-state initialization
algorithm for the VDAF associated with the task and computes the first state
transition. This produces three possible values:</t>
            <ol spacing="normal" type="1"><li>An error, in which case the input report share is marked as invalid.</li>
              <li>An output share, in which case the aggregator stores the output share for
future collection as described in <xref target="collect-flow"/>.</li>
              <li>An initial VDAF state and preparation message, denoted <tt>(prep_state,
prep_msg)</tt>.</li>
            </ol>
            <t>Each aggregator runs this procedure for a given input share with corresponding report ID as follows:</t>
            <artwork><![CDATA[
prep_state = VDAF.prep_init(vdaf_verify_key,
                            agg_id,
                            agg_param,
                            report_id,
                            public_share,
                            input_share)
out = VDAF.prep_next(prep_state, None)
]]></artwork>
            <t><tt>vdaf_verify_key</tt> is the VDAF verification key shared by the aggregators;
<tt>agg_id</tt> is the aggregator ID (<tt>0x00</tt> for the Leader and <tt>0x01</tt> for the helper);
<tt>agg_param</tt> is the opaque aggregation parameter distributed to the aggregators by
the collector; <tt>public_share</tt> is the public share generated by the client and
distributed to each aggregator; and <tt>input_share</tt> is the aggregator's input
share.</t>
            <t>If either step fails, the aggregator marks the report as invalid with error
<tt>vdaf_prep_error</tt>. Otherwise, the value <tt>out</tt> is interpreted as follows. If this
is the last round of the VDAF, then <tt>out</tt> is the aggregator's output share.
Otherwise, <tt>out</tt> is the pair <tt>(prep_state, prep_msg)</tt>.</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 share
in the candidate report set until the underlying VDAF moves into a terminal
state, yielding an output share for all aggregators or an error. This phase may
involve multiple rounds of interaction depending on the underlying VDAF. Each
round trip is initiated by the leader.</t>
          <section anchor="leader-continuation">
            <name>Leader Continuation</name>
            <t>The leader begins each round of continuation for a report share based on its
locally computed prepare message and the previous PrepareStep from the helper.
If PrepareStep is of type "failed", then the leader marks the report as failed
and removes it from the candidate report set and does not process it further. If
the type is "finished", then the leader aborts with "unrecognizedMessage".
[[OPEN ISSUE: This behavior is not specified.]] If the type is "continued", then
the leader proceeds as follows.</t>
            <t>Let <tt>leader_outbound</tt> denote the leader's prepare message and <tt>helper_outbound</tt>
denote the helper's. The leader computes the next state transition as follows:</t>
            <artwork><![CDATA[
inbound = VDAF.prep_shares_to_prep(agg_param, [leader_outbound, helper_outbound])
out = VDAF.prep_next(prep_state, inbound)
]]></artwork>
            <t>where [leader_outbound, helper_outbound] is a vector of two elements. If either
of these operations fails, then the leader marks the report as invalid.
Otherwise it interprets <tt>out</tt> as follows: If this is the last round of the VDAF,
then <tt>out</tt> is the aggregator's output share, in which case the aggregator
finishes and stores its output share for further processing as described in
<xref target="collect-flow"/>. Otherwise, <tt>out</tt> is the pair <tt>(new_state, prep_msg)</tt>, where
<tt>new_state</tt> is its updated state and <tt>prep_msg</tt> is its next VDAF message (which
will be <tt>leader_outbound</tt> in the next round of continuation). For the latter
case, the helper sets <tt>prep_state</tt> to <tt>new_state</tt>.</t>
            <t>The leader then sends each PrepareStep to the helper in an AggregateContinueReq
message, structured as follows:</t>
            <artwork><![CDATA[
struct {
  TaskID task_id;
  AggregationJobID job_id;
  PrepareStep prepare_steps<1..2^32-1>;
} AggregateContinueReq;
]]></artwork>
            <t>For each aggregator endpoint <tt>[aggregator]</tt> in <tt>AggregateContinueReq.task_id</tt>'s
parameters except its own, the leader sends a POST request to
<tt>[aggregator]/aggregate</tt> with AggregateContinueReq as the payload and the media
type set to "message/dap-aggregate-continue-req".</t>
          </section>
          <section anchor="helper-continuation">
            <name>Helper Continuation</name>
            <t>The helper continues with preparation for a report share by combining the
leader's input message in <tt>AggregateContinueReq</tt> and its current preparation
state (<tt>prep_state</tt>). This step yields one of three outputs:</t>
            <ol spacing="normal" type="1"><li>An error, in which case the input report share is marked as invalid.</li>
              <li>An output share, in which case the helper stores the output share for future
collection as described in <xref target="collect-flow"/>.</li>
              <li>An updated VDAF state and preparation message, denoted <tt>(prep_state,
prep_msg)</tt>.</li>
            </ol>
            <t>To carry out this step, for each PrepareStep in
AggregateContinueReq.prepare_steps received from the leader, the helper performs
the following check to determine if the report share should continue being
prepared:</t>
            <ul spacing="normal">
              <li>If failed, then mark the report as failed and reply with a failed PrepareStep
to the leader.</li>
              <li>If finished, then mark the report as finished and reply with a finished
PrepareStep to the leader. The helper then stores the output share and awaits
for collection; see <xref target="collect-flow"/>.</li>
            </ul>
            <t>Otherwise, preparation continues. In this case, the helper computes its updated
state and output message as follows:</t>
            <artwork><![CDATA[
out = VDAF.prep_next(prep_state, inbound)
]]></artwork>
            <t>where <tt>inbound</tt> is the previous VDAF prepare message sent by the leader and
<tt>prep_state</tt> is the helper's current preparation state. If this operation fails,
then the helper fails with error <tt>vdaf_prep_error</tt>. Otherwise, it interprets
<tt>out</tt> as follows:</t>
            <ul spacing="normal">
              <li>If this is the last round of VDAF preparation phase, then <tt>out</tt> is the
helper's output share, in which case the helper stores the output share for
future collection.</li>
              <li>Otherwise, the helper interprets <tt>out</tt> as the tuple <tt>(new_state, prep_msg)</tt>,
where <tt>new_state</tt> is its updated preparation state and <tt>prep_msg</tt> is its next
VDAF message.</li>
            </ul>
            <t>This output message for each report in AggregateContinueReq.prepare_steps is
then sent to the leader in an AggregateContinueResp message, structured as
follows:</t>
            <artwork><![CDATA[
struct {
  PrepareStep prepare_steps<1..2^32-1>;
} AggregateContinueResp;
]]></artwork>
            <t>The order of AggregateContinueResp.prepare_steps <bcp14>MUST</bcp14> match that of the
PrepareStep values in <tt>AggregateContinueReq.prepare_steps</tt>. The helper's
response to the leader is an HTTP status code 200 OK whose body is the
AggregateContinueResp and media type is "message/dap-aggregate-continue-resp".
The helper then awaits the next message from the leader.</t>
            <t>[[OPEN ISSUE: consider relaxing this ordering constraint. See issue#217.]]</t>
          </section>
        </section>
        <section anchor="aggregate-message-security">
          <name>Aggregate Message Security</name>
          <t>Aggregate sub-protocol messages must be confidential and mutually authenticated.</t>
          <t>The aggregate sub-protocol is driven by the leader acting as an HTTPS client,
making requests to the helper's HTTPS server. HTTPS provides confidentiality and
authenticates the helper to the leader.</t>
          <t>Leaders <bcp14>MUST</bcp14> authenticate their requests to helpers using a scheme that meets
the requirements in <xref target="request-authentication"/>.</t>
        </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 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 each aggregator,
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>
        <section anchor="collect-init">
          <name>Collection Initialization</name>
          <t>To initiate collection, the collector issues a POST request to
<tt>[leader]/collect</tt>, where <tt>[leader]</tt> is the leader's endpoint URL. The body of
the request is structured as follows:</t>
          <t>[OPEN ISSUE: Decide if and how the collector's request is authenticated. If not,
then we need to ensure that collect job URIs are resistant to enumeration
attacks.]</t>
          <artwork><![CDATA[
struct {
  TaskID task_id;
  Query query;
  opaque agg_param<0..2^16-1>; /* VDAF aggregation parameter */
} CollectReq;
]]></artwork>
          <t>The named parameters are:</t>
          <ul spacing="normal">
            <li>
              <tt>task_id</tt>, the DAP task ID.</li>
            <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 "queryMismatch".</li>
            <li>
              <tt>agg_param</tt>, an aggregation parameter for the VDAF being executed. This is the
same value as in <tt>AggregateInitializeReq</tt> (see <xref target="leader-init"/>).</li>
          </ul>
          <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, but this cannot be
guaranteed. In fact, for some VDAFs, it is not be possible to begin preparing
inputs until the collector provides the aggregation parameter in the
<tt>CollectReq</tt>. For these reasons, collect requests are handled asynchronously.</t>
          <t>Upon receipt of a <tt>CollectReq</tt>, the leader begins by checking that the request
meets the requirements of the batch parameters using the procedure in
<xref target="batch-validation"/>. If so, it immediately sends the collector a response with
HTTP status 303 See Other and a Location header containing a URI identifying the
collect job that can be polled by the collector, called the "collect job URI".</t>
          <t>The leader then begins working with the helper to prepare the shares satisfying
the query (or continues this process, depending on the VDAF) as described in
<xref target="aggregate-flow"/>.</t>
          <t>After receiving the response to its CollectReq, the collector makes an HTTP GET
request to the collect job URI to check on the status of the collect job and
eventually obtain the result. If the collect 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 pulling interval to the collector.</t>
          <t>If the leader has not yet obtained an aggregator share from each aggregator, the
leader invokes the aggregate share request flow described in
<xref target="collect-aggregate"/>. Otherwise, when all aggregator shares are successfully
obtained, the leader responds to subsequent HTTP GET requests to the collect
job's URI with HTTP status code 200 OK and a body consisting of a <tt>CollectResp</tt>:</t>
          <artwork><![CDATA[
struct {
  PartialBatchSelector part_batch_selector;
  uint64 report_count;
  HpkeCiphertext encrypted_agg_shares<1..2^32-1>;
} CollectResp;
]]></artwork>
          <t>This structure includes the following:</t>
          <ul spacing="normal">
            <li>
              <t>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>The number of reports included in the batch.</li>
            <li>The vector of encrypted aggregate shares. They <bcp14>MUST</bcp14> appear in the same order
as the aggregator endpoints list of the task parameters.</li>
          </ul>
          <t>If obtaining aggregate shares fails, then the leader responds to subsequent HTTP
GET requests to the collect job URI with an HTTP error status and a problem
document as described in <xref target="errors"/>.</t>
          <t>The collector can send an HTTP DELETE request to the collect job URI, to which
the leader <bcp14>MUST</bcp14> respond with HTTP status 204 No Content. The leader <bcp14>MAY</bcp14> respond
with HTTP status 204 No Content for requests to a collect job URI which has not
received a DELETE request, for example if the results have been deleted due to
age. The leader <bcp14>MUST</bcp14> respond to subsequent requests to the collect job URI with
HTTP status 204 No Content.</t>
          <t>[OPEN ISSUE: Describe how intra-protocol errors yield collect errors (see
issue#57). For example, how does a leader respond to a collect request if the
helper drops out?]</t>
        </section>
        <section anchor="collect-aggregate">
          <name>Collection Aggregation</name>
          <t>The leader obtains each helper's encrypted aggregate share in order to respond
to the collector's collect response. To do this, the leader first computes a
checksum over the set of output shares 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, for each aggregator endpoint <tt>[aggregator]</tt> in the parameters associated
with <tt>CollectReq.task_id</tt> (see <xref target="collect-flow"/>) except its own, the leader
sends a POST request to <tt>[aggregator]/aggregate_share</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 {
  TaskID task_id;
  BatchSelector batch_selector;
  opaque agg_param<0..2^16-1>;
  uint64 report_count;
  opaque checksum[32];
} AggregateShareReq;
]]></artwork>
          <t>The message contains the following parameters:</t>
          <ul spacing="normal">
            <li>The task ID.</li>
            <li>
              <t>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 "queryMismatch".</t>
            </li>
            <li>The opaque aggregation parameter for the VDAF being executed. This value <bcp14>MUST</bcp14>
match the same value in the the <tt>AggregateInitializeReq</tt> message sent in at
least one run of the aggregate sub-protocol. (See <xref target="leader-init"/>). and in
<tt>CollectReq</tt> (see <xref target="collect-init"/>).</li>
            <li>The number number of reports included in the batch.</li>
            <li>The batch checksum.</li>
          </ul>
          <t>To handle the leader's request, the helper first ensures 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>Note that 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>AggregateShareResp</tt>:</t>
          <artwork><![CDATA[
struct {
  HpkeCiphertext encrypted_aggregate_share;
} AggregateShareResp;
]]></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>After receiving the helper's response, the leader uses the HpkeCiphertext to
respond to a collect request (see <xref target="collect-flow"/>).</t>
          <t>After issuing an aggregate-share request for 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 helpers as described
<xref target="agg-init"/>.</t>
          <t>Before completing the collect request, 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 it under the
collector's HPKE public key as described in <xref target="aggregate-share-encrypt"/>.</t>
        </section>
        <section anchor="collect-finalization">
          <name>Collection Finalization</name>
          <t>Once the collector has received a successful collect response 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"/>. If the collector successfully decrypts all
aggregate shares, the collector then unshards the aggregate shares into an
aggregate result using the VDAF's <tt>agg_shares_to_result</tt> algorithm. In
particular, let <tt>agg_shares</tt> denote the ordered sequence of aggregator shares,
ordered by aggregator index, 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,
                                       agg_shares,
                                       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-02 aggregate share" || server_role || 0x00,
  AggregateShareReq.task_id || AggregateShareReq.batch_selector, 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 <tt>0x02</tt> for the leader and <tt>0x03</tt> for a helper.</t>
          <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, denoted <tt>batch_selector</tt>, decryption works as follows:</t>
          <artwork><![CDATA[
agg_share = OpenBase(enc_share.enc, sk, "dap-02 aggregate share" ||
  server_role || 0x00, task_id || batch_selector, enc_share.payload)
]]></artwork>
          <t>where <tt>sk</tt> is the HPKE secret key, <tt>task_id</tt> is the task ID for the collect
request, and <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). The value of
<tt>batch_selector</tt> is computed by the Collector from its query and the response to
its query:</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>
        </section>
        <section anchor="collect-message-security">
          <name>Collect Message Security</name>
          <t>Collect sub-protocol messages must be confidential and mutually authenticated.</t>
          <t>HTTPS provides confidentiality and authenticates the leader to the collector.
Additionally, the leader encrypts its aggregate share to a public key held by
the collector using <xref target="HPKE"/>.</t>
          <t>Collectors <bcp14>MUST</bcp14> authenticate their requests to leaders using a scheme that meets
the requirements in <xref target="request-authentication"/>.</t>
          <t>[[OPEN ISSUE: collector public key is currently in the task parameters, but this
will have to change #102]]</t>
          <t>The collector and helper never directly communicate with each other, but the
helper does transmit an aggregate share to the collector through the leader, as
detailed in <xref target="collect-aggregate"/>. The aggregate share must be confidential from
everyone but the helper and the collector.</t>
          <t>Confidentiality is achieved by having the helper encrypt its aggregate share to
a public key held by the collector using <xref target="HPKE"/>.</t>
          <t>There is no authentication between the collector and the helper. This allows the
leader to:</t>
          <ul spacing="normal">
            <li>Send collect parameters to the helper that do not reflect the parameters
chosen by the collector</li>
            <li>Discard the aggregate share computed by the helper and then fabricate
aggregate shares that combine into an arbitrary aggregate result</li>
          </ul>
          <t>These are attacks on robustness, which we already assume to hold only if both
aggregators are honest, which puts these malicious-leader attacks out of scope
(see <xref target="sec-considerations"/>).</t>
          <t>[[OPEN ISSUE: Should we have authentication in either direction between the
helper and the collector? #155]]</t>
        </section>
        <section anchor="batch-validation">
          <name>Batch Validation</name>
          <t>Before an Aggregator responds to a CollectReq or AggregateShareReq, it must
first check that the request does not violate the parameters associated with the
DAP task. It does so as described here.</t>
          <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 the Aggregator <bcp14>MUST</bcp14>
abort with error of type "invalidBatchSize".</t>
          <t>Next, the Aggregator checks that the batch has not been aggregated too many
times. This is determined by the maximum number of times a batch can be queried,
<tt>max_batch_query_count</tt>. Unless the query has been issued less than
<tt>max_batch_query_count</tt> times, 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 in 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 an AggregateShareReq, the Helper checks that the batch ID provided by the
Leader in its corresponds to a batch ID used in a previous
AggregateInitializeReq 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
in the batch.</t>
            </section>
          </section>
        </section>
        <section anchor="anti-replay">
          <name>Anti-replay</name>
          <t>Using a client-provided report multiple times within a single batch, or using
the same report in multiple batches, may allow a server to learn information
about the client's measurement, violating the privacy goal of DAP. To prevent
such replay attacks, this specification requires the aggregators to detect and
filter out replayed reports.</t>
          <t>To detect replay attacks, each aggregator keeps track of the set of report IDs
pertaining to reports that were previously aggregated for a given task. If the
leader receives a report from a client whose report ID is in this set, it
either ignores it or aborts the upload sub-protocol as described in
<xref target="upload-flow"/>. A Helper who receives an encrypted input share whose report ID
is in this set rejects the report as described in
<xref target="early-input-share-validation"/>.</t>
          <t>[OPEN ISSUE: This has the potential to require aggregators to store report ID
sets indefinitely. See issue#180.]</t>
          <t>A malicious aggregator may attempt to force a replay by replacing the report ID
generated by the client with a report ID its peer has not yet seen. To prevent
this, clients incorporate the report ID into the AAD for HPKE encryption,
ensuring that the output share is only recovered if the aggregator is given the
correct report ID. (See <xref target="upload-request"/>.)</t>
          <t>Aggregators prevent the same report from being used in multiple batches (except
as required by the protocol) by only responding to valid collect requests, as
described in <xref target="batch-validation"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="operational-capabilities">
      <name>Operational Considerations</name>
      <t>The DAP protocol has inherent constraints derived from the tradeoff between
privacy guarantees and computational complexity. These tradeoffs influence how
applications may choose to utilize services implementing the specification.</t>
      <section anchor="entity-capabilities">
        <name>Protocol participant capabilities</name>
        <t>The design in this document has different assumptions and requirements for
different protocol participants, including clients, aggregators, and collectors.
This section describes these capabilities in more detail.</t>
        <section anchor="client-capabilities">
          <name>Client capabilities</name>
          <t>Clients have limited capabilities and requirements. Their only inputs to the
protocol are (1) the parameters configured out of band and (2) a measurement.
Clients are not expected to store any state across any upload flows, nor are
they required to implement any sort of report upload retry mechanism. By design,
the protocol in this document is robust against individual client upload
failures since the protocol output is an aggregate over all inputs.</t>
        </section>
        <section anchor="aggregator-capabilities">
          <name>Aggregator capabilities</name>
          <t>Helpers and leaders 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, helpers are 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="anti-replay"/>.</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, leaders are required to:</t>
          <ul spacing="normal">
            <li>Implement and store state for the form of inter- and intra-batch replay
mitigation in <xref target="anti-replay"/>.</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="early-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.</t>
      <t>Currently, the specification does not achieve these goals. In particular, there
are several open issues that need to be addressed before these goals are met.
Details for each issue are below.</t>
      <ol spacing="normal" type="1"><li>When crafted maliciously, collect requests may leak more information about
the measurements than the system intends. For example, the spec currently
allows sequences of collect requests to reveal an aggregate result for a
batch smaller than the minimum batch size. [OPEN ISSUE: See issue#195. This
also has implications for how we solve issue#183.]</li>
        <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. Note that this leakage can be mitigated using
differential privacy. [OPEN ISSUE: We have yet not specified how to add DP.]</li>
        <li>The core DAP spec does not defend against Sybil attacks. 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: 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"). The upload sub-protocol includes an extensions mechanism that
can be used to prevent --- or at least mitigate --- these types of attacks.
See <xref target="upload-extensions"/>. [OPEN ISSUE: No such extension has been
implemented, so we're not yet sure if the current mechanism is sufficient.]</li>
      </ol>
      <section anchor="threat-model">
        <name>Threat model</name>
        <t>[OPEN ISSUE: This subsection is a bit out-of-date.]</t>
        <t>In this section, we enumerate the actors participating in the Prio system and
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>Unshared inputs. Clients are the only actor that can ever see the original
inputs.</li>
              <li>Unencrypted input shares.</li>
            </ol>
          </section>
          <section anchor="capabilities">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>Individual users can reveal their own input and compromise their own privacy.</li>
              <li>Clients (that is, software which might be used by many users of the system)
can defeat privacy by leaking input outside of the Prio system.</li>
              <li>
                <t>Clients may affect the quality of aggregations by reporting false input.
                </t>
                <ul spacing="normal">
                  <li>Prio can only prove that submitted input is valid, not that it is true.
False input can be mitigated orthogonally to the Prio protocol (e.g., by
requiring that aggregations include a minimum number of contributions)
and so these attacks are considered to be outside of the threat model.</li>
                </ul>
              </li>
              <li>Clients can send invalid encodings of input.</li>
            </ol>
          </section>
          <section anchor="mitigations">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>The input validation protocol executed by the aggregators prevents either
individual clients or a coalition of clients from compromising the robustness
property.</li>
              <li>If aggregator output satisfies differential privacy <xref target="dp"/>, then all records
not leaked by malicious clients are still protected.</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-1">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>Aggregators may defeat the robustness of the system by emitting bogus output
shares.</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 input.
                </t>
                <ol spacing="normal" type="1"><li>Aggregators may reveal that a particular client contributed input.</li>
                  <li>
                    <t>Aggregators may attack robustness by selectively omitting inputs 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.</li>
                    </ul>
                  </li>
                </ol>
              </li>
              <li>Individual aggregators may compromise availability of the system by refusing
to emit aggregate shares.</li>
              <li>Input validity proof forging. Any aggregator can collude with a malicious
client to craft a proof that will fool honest aggregators into accepting
invalid input.</li>
              <li>Aggregators 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.</li>
            </ol>
          </section>
          <section anchor="mitigations-1">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>The linear secret sharing scheme employed by the client ensures that privacy
is preserved as long as at least one aggregator does not reveal its input
shares.</li>
              <li>If computed over a sufficient number of reports, aggregate shares reveal
nothing about either the inputs or the participating clients.</li>
              <li>Clients can ensure that aggregate counts are non-sensitive by generating
input independently of user behavior. For example, a client should
periodically upload a report even if the event that the task is tracking has
not occurred, so that the absence of reports cannot be distinguished from
their presence.</li>
              <li>
                <t>Bogus inputs can be generated that encode "null" shares that do not affect
the aggregate output, but mask the total number of true inputs.
                </t>
                <ul spacing="normal">
                  <li>Either leaders or clients can generate these inputs to mask the total
number from non-leader aggregators or all the aggregators, respectively.</li>
                  <li>In either case, care must be taken to ensure that bogus inputs are
indistinguishable from true inputs (metadata, etc), especially when
constructing timestamps on reports.</li>
                </ul>
              </li>
            </ol>
            <t>[OPEN ISSUE: Define what "null" shares are. They should be defined such that
inserting null shares into an aggregation is effectively a no-op. See issue#98.]</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-2">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>
                <t>Input validity proof verification. The leader can forge proofs and collude
with a malicious client to trick aggregators into aggregating invalid inputs.
                </t>
                <ul spacing="normal">
                  <li>This capability is no stronger than any aggregator's ability to forge
validity proof in collusion with a malicious client.</li>
                </ul>
              </li>
              <li>
                <t>Relaying messages between aggregators. The leader can compromise availability
by dropping messages.
                </t>
                <ul spacing="normal">
                  <li>This capability is no stronger than any aggregator's ability to refuse to
emit aggregate shares.</li>
                </ul>
              </li>
              <li>Shrinking the anonymity set. The leader instructs aggregators to construct
output parts and so could request aggregations over few inputs.</li>
            </ol>
          </section>
          <section anchor="mitigations-2">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>Aggregators enforce agreed upon minimum aggregation thresholds to prevent
deanonymizing.</li>
              <li>If aggregator output satisfies differential privacy <xref target="dp"/>, then genuine
records are protected regardless of the size of the anonymity set.</li>
            </ol>
          </section>
        </section>
        <section anchor="collector">
          <name>Collector</name>
          <section anchor="capabilities-3">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>Advertising shared configuration parameters (e.g., minimum thresholds for
aggregations, joint randomness, arithmetic circuits).</li>
              <li>Collectors may trivially defeat availability by discarding aggregate shares
submitted by aggregators.</li>
              <li>Known input injection. Collectors may collude with clients to send known
input to the aggregators, allowing collectors to shrink the effective
anonymity set by subtracting the known inputs from the final output. Sybil
attacks <xref target="Dou02"/> could be used to amplify this capability.</li>
            </ol>
          </section>
          <section anchor="mitigations-3">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>Aggregators should refuse shared parameters that are trivially insecure
(i.e., aggregation threshold of 1 contribution).</li>
              <li>If aggregator output satisfies differential privacy <xref target="dp"/>, then genuine
records are protected regardless of the size of the anonymity set.</li>
            </ol>
          </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="attacker-on-the-network">
          <name>Attacker on the network</name>
          <t>We assume the existence of attackers on the network links between participants.</t>
          <section anchor="capabilities-4">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>
                <t>Observation of network traffic. Attackers may observe messages exchanged
between participants at the IP layer.
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>The time of transmission of input shares by clients could reveal
information about user activity.
                    </t>
                    <ul spacing="normal">
                      <li>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>
                    </ul>
                  </li>
                  <li>
                    <t>Observation of message size could allow the attacker to learn how much
  input is being submitted by a client.
                    </t>
                    <ul spacing="normal">
                      <li>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
aggregations the user has opted into or out of.</li>
                    </ul>
                  </li>
                </ol>
              </li>
              <li>Tampering with network traffic. Attackers may drop messages or inject new
messages into communications between participants.</li>
            </ol>
          </section>
          <section anchor="mitigations-4">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>All messages exchanged between participants in the system should be
encrypted.</li>
              <li>All messages exchanged between aggregators, the collector and the leader
should be mutually authenticated so that network attackers cannot impersonate
participants.</li>
              <li>Clients should be required to submit inputs at regular intervals so that the
timing of individual messages does not reveal anything.</li>
              <li>Clients should submit dummy inputs even for aggregations the user has not
opted into.</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="client-authentication-or-attestation">
        <name>Client authentication or attestation</name>
        <t>[TODO: Solve issue#89]</t>
      </section>
      <section anchor="anon-proxy">
        <name>Anonymizing proxies</name>
        <t>Client reports can contain auxiliary information such as source IP, HTTP user
agent or 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.thomson-http-oblivious"/> to forward inputs 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="batch-parameters">
        <name>Batch parameters</name>
        <t>An important parameter of a DAP deployment is the minimum batch size. If an
aggregation includes too few inputs, then the outputs can reveal information
about individual participants. Aggregators use the batch size field of the
shared task parameters to enforce minimum batch size during the collect
protocol, but server 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>
        <t>The DAP parameters also specify the maximum number of times a report can be
used. Some protocols, such as Poplar <xref target="BBCGGI21"/>, require reports to be used in
multiple batches spanning multiple collect requests.</t>
      </section>
      <section anchor="dp">
        <name>Differential privacy</name>
        <t>Optionally, DAP deployments can choose to ensure their output F achieves
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
outputs. 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 input in a
batch except for one, that one record is still formally protected.</t>
        <t>[OPEN ISSUE: While parameters configuring the differential privacy noise (like
specific distributions / variance) can be agreed upon out of band by the
aggregators and collector, there may be benefits to adding explicit protocol
support by encoding them into task parameters.]</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 outputs 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 inputs. 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>HpkeConfig <xref target="hpke-config"/>: "application/dap-hpke-config"</li>
          <li>Report <xref target="upload-request"/>: "application/dap-report"</li>
          <li>AggregateInitializeReq <xref target="collect-flow"/>: "application/dap-aggregate-initialize-req"</li>
          <li>AggregateInitializeResp <xref target="collect-flow"/>: "application/dap-aggregate-initialize-resp"</li>
          <li>AggregateContinueReq <xref target="collect-flow"/>: "application/dap-aggregate-continue-req"</li>
          <li>AggregateContinueResp <xref target="collect-flow"/>: "application/dap-aggregate-continue-resp"</li>
          <li>AggregateShareReq <xref target="collect-flow"/>: "application/dap-aggregate-share-req"</li>
          <li>AggregateShareResp <xref target="collect-flow"/>: "application/dap-aggregate-share-resp"</li>
          <li>CollectReq <xref target="collect-flow"/>: "application/dap-collect-req"</li>
          <li>CollectResp <xref target="collect-flow"/>: "application/dap-collect-resp"</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-media-type">
          <name>"application/dap-hpke-config" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-hpke-config</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-aggregate-initialize-req-media-type">
          <name>"application/dap-aggregate-initialize-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregate-initialize-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-initialize-resp-media-type">
          <name>"application/dap-aggregate-initialize-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregate-initialize-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-aggregate-continue-req-media-type">
          <name>"application/dap-aggregate-continue-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregate-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-continue-resp-media-type">
          <name>"application/dap-aggregate-continue-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregate-continue-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-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-resp-media-type">
          <name>"application/dap-aggregate-share-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-aggregate-share-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-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-collect-req-media-type-1">
          <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>
      <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="Christopher Patton" initials="C." surname="Patton">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Phillipp Schoppmann" initials="P." surname="Schoppmann">
              <organization>Google</organization>
            </author>
            <date day="24" month="August" year="2022"/>
            <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 input that
   would result in an incorrect aggregate result.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vdaf-03"/>
        </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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan">
              <organization/>
            </author>
            <author fullname="B. Lipp" initials="B." surname="Lipp">
              <organization/>
            </author>
            <author fullname="C. Wood" initials="C." surname="Wood">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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="RFC7807">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="E. Wilde" initials="E." surname="Wilde">
              <organization/>
            </author>
            <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="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <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="National Institute of Standards and Technology" value="report"/>
          <seriesInfo name="DOI" value="10.6028/nist.fips.180-4"/>
        </reference>
        <reference anchor="I-D.thomson-http-oblivious">
          <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="24" month="August" year="2021"/>
            <abstract>
              <t>   This document describes a system for the forwarding of encrypted HTTP
   messages.  This allows a client to make multiple requests of a server
   without the server being able to link those requests to the client or
   to identify the requests as having come from the same client.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-thomson-http-oblivious-02"/>
        </reference>
        <reference anchor="RFC3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <author fullname="T. Hardie" initials="T." surname="Hardie">
              <organization/>
            </author>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <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="RFC8555">
          <front>
            <title>Automatic Certificate Management Environment (ACME)</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes">
              <organization/>
            </author>
            <author fullname="J. Hoffman-Andrews" initials="J." surname="Hoffman-Andrews">
              <organization/>
            </author>
            <author fullname="D. McCarney" initials="D." surname="McCarney">
              <organization/>
            </author>
            <author fullname="J. Kasten" initials="J." surname="Kasten">
              <organization/>
            </author>
            <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+S963YbR5Iu+j+fojb8Q6QagEhZkm2qPT20KNncbVkaie7L
8fYIBaBAVAtAYaoKpDiyzrOcZzlPduKaGZlVoCT3zF57raM105YAVFZeIuP6
RcRoNHJt2a6Kk2xwVjZtXU53bTHPTi8v6+Iyb8tqk72sq7aaVatsUdXwj/Iq
n93Af4umqK/KzWX2vMibXV2si007cPl0WhdXJ9nZ6cvRy5fP3byabfI1DD+v
80U7Kot2Mdpu16N5vh0d3XezvC0uq/rmJGvauXNXxWZXnLgsu6yr3Rbm9LHX
ZVl7s8XJ/7Wq3+K33+OD+Pk6L1fwObzrX/Gl46q+xI/zeraEj5dtu21O7t3D
X+FH5VUx1p/dww/uTevquinuwfP38LnLsl3upvAkreD6Ehdxr7sm/OkK1tS0
5iXmkTGPMy6rnod7Phov2/VqABtzkn3pXL5rl1UN+zOC19CfctOcZBfj7Pui
ulzCgW30C970i3Ld/QqWmG/K/6TDPcnOX7/6Xr8peNPacn0JD/0BJ/Kvl/jZ
eFatXfraJ+PsZd62VfLOJ8saCKnaLos6+T5+8ZNVtZsvYPeL5PUzHGBLT35s
Ck/H2auimVX1Ko8n8bQuZ52v4vc/r/6zXIUv5eXF2/pf63ax3rfi03H216qa
719y8oNPXXN+/a/LIt8CCU/LthlvitY5V27gyq3h2Su4FPDEk++/O/7qhB7V
SwsXpDrhW9kWw+xVNd017TDLN/Ps9Sxf5dNVkT2p1ttdy5e5Wvi7XWSv8cOm
LWfNgAadw4cn2f2j469GR1+Ojh/wm/L6srDkPKtvtm01btocpzcfF/PdvS1M
49423xb1eDtf8GieWunPiLfwhzFMp65L2JXR9+V02sRfn42z76pNscTVfvfd
k++/Pz/+Jl7w/1XU1ejPm+p6VcwvC2RO1aLJYGWvi1ldtKPXS9jdeXaWt3l2
VebZs91qdZP9WG6KHOjxyctkqfePR0fwfw/7l1rAujbtuMxnNXEG2Jpv7h1/
/fUtC/QriD59ip/erIrP2oyf4F6Xq2mVxx//fZydN8u8DHt0/zjeox/Ly2V7
XeD/ZhfFbLkp/2NXNIF/w9H/UORXN9kPZdsW9T+5JfeP7wHF/B+zJWfV7uh+
vB8XS6D1m2m5yk7bNp+9TdZ7f3R8BP/Xv95VuXk7bnDRl0DcwBXuzZb5Fnbt
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
rwEA

-->

</rfc>
