<?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.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-03" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.3 -->
  <front>
    <title abbrev="DAP-PPM">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-03"/>
    <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="December" day="10"/>
    <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>03:</t>
        <ul spacing="normal">
          <li>Enrich the "fixed_size" query type to allow the Collector to request a
recently aggregated batch without knowing the batch ID in advance. ID
discovery was previously done out-of-band. (*)</li>
          <li>Allow Aggregators to advertise multiple HPKE configurations. (*)</li>
          <li>Clarify requirements for enforcing anti-replay. Namely, while it is sufficient
to detect repeated report IDs, it is also enough to detect repeated IDs and
timestamps.</li>
          <li>Remove the extensions from the Report and add extensions to the plaintext
payload of each ReportShare. (*)</li>
          <li>Clarify that extensions are mandatory to implement: If an Aggregator does not
recognize a ReportShare's extension, it must reject it.</li>
          <li>Clarify that Aggregators must reject any ReportShare with repeated extension
types.</li>
          <li>Specify explicitly how to serialize the Additional Authenticated Data (AAD)
string for HPKE encryption. This clarifies an ambiguity in the previous
version. (*)</li>
          <li>Change the length tag for the aggregation parameter to 32 bits. (*)</li>
          <li>Use the same prefix ("application") for all media types. (*)</li>
          <li>Make input share validation more explicit, including adding a new
ReportShareError variant, "report_too_early", for handling reports too far in
the future. (*)</li>
          <li>Improve alignment of problem details usage with <xref target="RFC7807"/>. Replace
"reportTooLate" problem document type with "repjortRejected" and clarify
handling of rejected reports in the upload sub-protocol. (*)</li>
          <li>Bump version tag from "dap-02" to "dap-03". (*)</li>
        </ul>
        <t>02:</t>
        <ul spacing="normal">
          <li>Define a new task configuration parameter, called the "query type", that
allows tasks to partition reports into batches in different ways. In the
current draft, the Collector specifies a "query", which the Aggregators use to
guide selection of the batch. Two query types are defined: the "time_interval"
type captures the semantics of draft 01; and the "fixed_size" type allows the
Leader to partition the reports arbitrarily, subject to the constraint that
each batch is roughly the same size. (*)</li>
          <li>Define a new task configuration parameter, called the task "expiration", that
defines the lifetime of a given task.</li>
          <li>Specify requirements for HTTP request authentication rather than a concrete
scheme. (Draft 01 required the use of the <tt>DAP-Auth-Token</tt> header; this is now
optional.)</li>
          <li>Make "task_id" an optional parameter of the "/hpke_config" endpoint.</li>
          <li>Add report count to CollectResp message. (*)</li>
          <li>Increase message payload sizes to accommodate VDAFs with input and aggregate
shares larger than 2^16-1 bytes. (*)</li>
          <li>Bump draft-irtf-cfrg-vdaf-01 to 03 <xref target="VDAF"/>. (*)</li>
          <li>Bump version tag from "dap-01" to "dap-02". (*)</li>
          <li>Rename the report nonce to the "report ID" and move it to the top of the
structure. (*)</li>
          <li>Clarify when it is safe for an Aggregator to evict various data artifacts from
long-term storage.</li>
        </ul>
      </section>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <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">reportRejected</td>
              <td align="left">Report could not be processed for an unspecified reason.</td>
            </tr>
            <tr>
              <td align="left">reportTooEarly</td>
              <td align="left">Report could not be processed because its timestamp is too far in the future.</td>
            </tr>
            <tr>
              <td align="left">batchInvalid</td>
              <td align="left">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"/>). The "detail"
member of the Problem Details document includes additional diagnostic
information.</t>
        <t>When the task ID is known (see <xref target="task-configuration"/>), the problem document
<bcp14>SHOULD</bcp14> include an additional "taskid" member containing the ID encoded in Base
64 using the URL and filename safe alphabet with no padding defined in sections
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. This
implies HTTP status code 400 Bad Request unless explicitly specified otherwise.</t>
      </section>
    </section>
    <section anchor="protocol-definition">
      <name>Protocol Definition</name>
      <t>DAP has three major interactions which need to be defined:</t>
      <ul spacing="normal">
        <li>Uploading reports from the client to the aggregators, specified in
<xref target="upload-flow"/></li>
        <li>Computing the results 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>;

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

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

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

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

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

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

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

/* Represent a zero byte empty data type. */
struct {} Empty;
]]></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];

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

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

struct {
  QueryType query_type;
  select (Query.query_type) {
    case time_interval: Interval batch_interval;
    case fixed_size: FixedSizeQuery fixed_size_query;
  }
} Query;
]]></artwork>
        <t>The parameters pertaining to each query type are described in one of the
subsections below. The query is issued in-band as part of the collect
sub-protocol (<xref target="collect-flow"/>). Its content is determined by the "query type",
which in turn is encoded by the "query configuration" configured out-of-band.
All query types have the following configuration parameters in common:</t>
        <ul spacing="normal">
          <li>
            <tt>min_batch_size</tt> - The smallest number of reports the batch is allowed to
include. In a sense, this parameter controls the degree of privacy that will
be obtained: The larger the minimum batch size, the higher degree of privacy.
However, this ultimately depends on the application and the nature of the
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.</t>
          <t>To get the aggregate of a batch, the Collector issues a query specifying the
batch ID of interest (see <xref target="query"/>). The Collector may not know which batch ID
it is interested in; in this case, it can also issue a query of type
<tt>current_batch</tt>, which allows the Leader to select a recent batch to aggregate.
The leader <bcp14>SHOULD</bcp14> select a batch which has not yet began collection.</t>
          <t>In addition to the minimum batch size common to all query types, the
configuration includes a "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>
        </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 <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>An aggregator is free to use different HPKE configurations for each task with
which it is configured. If the task ID is missing from 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>HpkeConfigList</tt> value. The <tt>HpkeConfigList</tt> structure contains one or more
<tt>HpkeConfig</tt> structures in decreasing order of preference. This allows a server
to support multiple HPKE configurations simultaneously.</t>
          <t>[TODO: Allow aggregators to return HTTP status code 403 Forbidden in deployments
that use authentication to avoid leaking information about which tasks exist.]</t>
          <artwork><![CDATA[
HpkeConfig HpkeConfigList<1..2^16-1>;

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

opaque HpkePublicKey<1..2^16-1>;
uint16 HpkeAeadId; /* Defined in [HPKE] */
uint16 HpkeKemId;  /* Defined in [HPKE] */
uint16 HpkeKdfId;  /* Defined in [HPKE] */
]]></artwork>
          <t>[OPEN ISSUE: Decide whether to expand the width of the id.]</t>
          <t>Aggregators <bcp14>SHOULD</bcp14> allocate distinct id values for each <tt>HpkeConfig</tt> in a
<tt>HpkeConfigList</tt>. The <bcp14>RECOMMENDED</bcp14> strategy for generating these values is via
rejection sampling, i.e., to randomly select an id value repeatedly until it
does not match any known <tt>HpkeConfig</tt>.</t>
          <t>The client <bcp14>MUST</bcp14> abort if any of the following happen for any HPKE config
request:</t>
          <ul spacing="normal">
            <li>the GET request failed or did not return a valid HPKE 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;
} 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="input-share-validation"/>.) 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>
          </ul>
          <t>To generate a report, the Client begins by sharding its measurement into input
shares as specified by the VDAF. It then wraps each input share in the following
structure:</t>
          <artwork><![CDATA[
struct {
  Extension extensions<0..2^16-1>;
  opaque payload<0..2^32-1>;
} PlaintextInputShare;
]]></artwork>
          <t>Field <tt>extensions</tt> is set to the list of extensions intended to be consumed by
the given Aggregator. (See <xref target="upload-extensions"/>.) Field <tt>payload</tt> is set to the
Aggregator's input share output by the VDAF sharding algorithm.</t>
          <t>Next, the Client encrypts each PlaintextInputShare <tt>plaintext_input_share</tt> as
follows:</t>
          <artwork><![CDATA[
enc, payload = SealBase(pk,
  "dap-03 input share" || 0x01 || server_role,
  input_share_aad, plaintext_input_share)
]]></artwork>
          <t>where <tt>pk</tt> is the aggregator's public key; <tt>server_role</tt> is the Role of the
intended recipient (<tt>0x02</tt> for the leader and <tt>0x03</tt> for the helper),
<tt>plaintext_input_share</tt> is the Aggregator's PlaintextInputShare, and
<tt>input_share_aad</tt> is an encoded message of type <tt>InputShareAad</tt>, constructed
from the same values as the corresponding fields in the report. The <tt>SealBase()</tt>
function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the ciphersuite indicated
by the HPKE configuration.</t>
          <artwork><![CDATA[
struct {
  TaskID task_id;
  ReportMetadata metadata;
  opaque public_share<0..2^32-1>;
} InputShareAad;
]]></artwork>
          <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. 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.</t>
          <t>If the leader does not recognize the task ID, then it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
          <t>The leader responds to requests whose leader encrypted input share uses an
out-of-date or unknown <tt>HpkeConfig.id</tt> value, indicated by
<tt>HpkeCiphertext.config_id</tt>, with error of type 'outdatedConfig'. If the leader
supports multiple HPKE configurations, it can use trial decryption with each
configuration to determine if requests match a known HPKE configuration. When
clients receive an 'outdatedConfig' error, they <bcp14>SHOULD</bcp14> invalidate any cached
aggregator <tt>HpkeConfigList</tt> and retry with a freshly generated Report. If this
retried report does not succeed, clients <bcp14>SHOULD</bcp14> abort and discontinue retrying.</t>
          <t>If a report's ID matches that of a previously uploaded report, the leader <bcp14>MUST</bcp14>
ignore it and the leader <bcp14>MAY</bcp14> alert the client with error <tt>reportRejected</tt>. See
the implementation note in <xref target="input-share-validation"/>.</t>
          <t>The Leader <bcp14>MUST</bcp14> ignore any report pertaining to a batch that has already been
collected (see <xref target="input-share-validation"/> for details). Otherwise, comparing the
aggregate result to the previous aggregate result may result in a privacy
violation. Note that this is enforced by all Aggregators, not just the leader.
In addition, the leader <bcp14>MAY</bcp14> abort the upload protocol and alert the client with
error <tt>reportRejected</tt>.</t>
          <t>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 <tt>reportRejected</tt>. Client <bcp14>MAY</bcp14> choose to opt out
of the task if its own clock has passed <tt>task_expiration</tt>.</t>
          <t>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 <tt>reportTooEarly</tt>. In this
situation, clients <bcp14>MAY</bcp14> re-upload the report later on.</t>
          <t>If the Report contains an unrecognized extension, or of two extensions have the
same ExtensionType, then the Leader <bcp14>MAY</bcp14> abort the upload request with error
"unrecognizedMessage". Note that this behavior is not mandatory because it
requires the Leader to decrypt its input share.</t>
        </section>
        <section anchor="upload-extensions">
          <name>Upload Extensions</name>
          <t>Each PlaintextInputShare carries a list of extensions that Clients use to convey
additional information to the Aggregator. Some extensions might be intended for
all Aggregators; others may only be intended for a specific Aggregator. (For
example, a DAP deployment might use some out-of-band mechanism for an Aggregator
to verify that Reports come from authenticated Clients. It will likely be useful
to bind the extension to the input share via HPKE encryption.)</t>
          <t>Each extension is a tag-length encoded value of the following form:</t>
          <artwork><![CDATA[
struct {
  ExtensionType extension_type;
  opaque extension_data<0..2^16-1>;
} Extension;

enum {
  TBD(0),
  (65535)
} ExtensionType;
]]></artwork>
          <t>Field "extension_type" indicates the type of extension, and "extension_data"
contains information specific to the extension.</t>
          <t>Extensions are mandatory-to-implement: If an Aggregator receives a Report
containing an extension it does not recognize, then it <bcp14>MUST</bcp14> reject the Report.
(See <xref target="input-share-validation"/> for details.)</t>
        </section>
        <section 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),
  unrecognized_message(8),
  report_too_early(9),
  (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="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^32-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 "application/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 if it recognizes the task ID, if
not then it <bcp14>MUST</bcp14> abort with error <tt>unrecognizedTask</tt>. Then the helper 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 <tt>unrecognizedMessage</tt>. 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="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="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
"application/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 and,
timestamp), 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, it constructs an
<tt>InputShareAad</tt> message from <tt>task_id</tt>, <tt>metadata</tt>, and <tt>public_share</tt>. Let this
be denoted by <tt>input_share_aad</tt>. Then, the aggregator looks up the HPKE config
and corresponding secret key indicated by <tt>encrypted_input_share.config_id</tt> and
attempts decryption of the payload with the following procedure:</t>
            <artwork><![CDATA[
plaintext_input_share = OpenBase(encrypted_input_share.enc, sk,
  "dap-03 input share" || 0x01 || server_role,
  input_share_aad, encrypted_input_share.payload)
]]></artwork>
            <t>where <tt>sk</tt> is the HPKE secret key, and <tt>server_role</tt> is the role of the
aggregator (<tt>0x02</tt> for the leader and <tt>0x03</tt> for the helper). The <tt>OpenBase()</tt>
function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the ciphersuite indicated
by the HPKE configuration. If the leader supports multiple HPKE configurations
with non-distinct configuration identifiers, it can use trial decryption with
each configuration. If decryption fails, the aggregator marks the report share
as invalid with the error <tt>hpke_decrypt_error</tt>. Otherwise, the aggregator
outputs the resulting PlaintextInputShare <tt>plaintext_input_share</tt>.</t>
          </section>
          <section anchor="input-share-validation">
            <name>Input Share Validation</name>
            <t>Validating an input share will either succeed or fail. In the case of failure,
the input share is marked as invalid with a corresponding 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 that the decrypted input share can be decoded. If not, the input share
<bcp14>MUST</bcp14> be marked as invalid with the error <tt>unrecognized_message</tt>.</li>
              <li>
                <t>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.
                </t>
                <ul spacing="normal">
                  <li>Implementation note: To detect replay attacks, each Aggregator is required
to keep track of the set of reports it has processed for a given task.
Because honest Clients choose the report ID at random, it is sufficient to
store the set of IDs of processed reports. However, implementations may
find it helpful to track additional information, like the timestamp, so
that the storage used for anti-replay can be sharded efficiently.</li>
                </ul>
              </li>
              <li>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>
                <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 is too far into the future. Implementors can provide for
some small leeway, usually no more than a few minutes, to account for clock
skew. If a report is rejected for this reason, the Aggregator <bcp14>SHOULD</bcp14> mark the
input share as invalid with the error <tt>report_too_early</tt>.</li>
              <li>Check if the report's timestamp has passed 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>Check if the PlaintextInputShare contains unrecognized extensions. If so,
then the Aggregator <bcp14>MUST</bcp14> mark the input share as invalid with error
"unrecognized_message".</li>
              <li>Check if the ExtensionType of any two extensions in PlaintextInputShare is
the same. If so, then the Aggregator <bcp14>MUST</bcp14> mark the input share as invalid
with error "unrecognized_message".</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,
                            plaintext_input_share.payload)
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>plaintext_input_share</tt> is the aggregator's
PlaintextInputShare.</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 <tt>failed</tt>, then the leader acts based on the value of
the <tt>ReportShareError</tt>:</t>
            <ul spacing="normal">
              <li>If the error is <tt>ReportShareError.report_too_early</tt>, then the leader <bcp14>MAY</bcp14> try
to re-send the report in a later <tt>AggregateInitializeReq</tt>.</li>
              <li>For any other error, the leader marks the report as failed, removes it from
the candidate report set and does not process it further.</li>
            </ul>
            <t>If the type is <tt>finished</tt>, then the leader aborts with <tt>unrecognizedMessage</tt>. If
the type is <tt>continued</tt>, 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 "application/dap-aggregate-continue-req".</t>
          </section>
          <section anchor="helper-continuation">
            <name>Helper Continuation</name>
            <t>If the helper does not recognize the task ID, then it <bcp14>MUST</bcp14> abort with error
<tt>unrecognizedTask</tt>.</t>
            <t>Otherwise, 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
"application/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^32-1>; /* VDAF aggregation parameter */
} CollectReq;
]]></artwork>
          <t>The named parameters are:</t>
          <ul spacing="normal">
            <li>
              <tt>task_id</tt>, the DAP task ID. If the Leader does not recognize the task ID, it
<bcp14>MUST</bcp14> abort with error <tt>unrecognizedTask</tt>.</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^32-1>;
  uint64 report_count;
  opaque checksum[32];
} AggregateShareReq;
]]></artwork>
          <t>The message contains the following parameters:</t>
          <ul spacing="normal">
            <li>The DAP task ID. If the Helper does not recognize the task ID, it <bcp14>MUST</bcp14> abort
with error <tt>unrecognizedTask</tt>.</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-03 aggregate share" || server_role || 0x00,
  agg_share_aad, agg_share)
]]></artwork>
          <t>where <tt>pk</tt> is the HPKE public key encoded by the collector's HPKE key,
<tt>server_role</tt> is <tt>0x02</tt> for the leader and <tt>0x03</tt> for a helper, and
<tt>agg_share_aad</tt> is a value of type <tt>AggregateShareAad</tt> with its values set from
the corresponding fields of the <tt>AggregateShareReq</tt>. The <tt>SealBase()</tt> function
is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the ciphersuite indicated by the
HPKE configuration.</t>
          <artwork><![CDATA[
struct {
  TaskID task_id;
  BatchSelector batch_selector;
} AggregateShareAad;
]]></artwork>
          <t>The collector decrypts these aggregate shares using the opposite process.
Specifically, given an encrypted input share, denoted <tt>enc_share</tt>, for a given
batch selector, decryption works as follows:</t>
          <artwork><![CDATA[
agg_share = OpenBase(enc_share.enc, sk, "dap-03 aggregate share" ||
  server_role || 0x00, agg_share_aad, enc_share.payload)
]]></artwork>
          <t>where <tt>sk</tt> is the HPKE secret key, <tt>server_role</tt> is the role of the server that
sent the aggregate share (<tt>0x02</tt> for the leader and <tt>0x03</tt> for the helper), and
<tt>agg_share_aad</tt> is an <tt>AggregateShareAad</tt> message constructed from the task ID
in the collect request and a batch selector. The value of the batch selector
used in <tt>agg_share_aad</tt> is computed by the Collector from its query and the
response to its query as follows:</t>
          <ul spacing="normal">
            <li>For time_interval tasks, the batch selector is the batch interval specified in
the query.</li>
            <li>For fixed_size tasks, the batch selector is the batch ID assigned sent in the
response.</li>
          </ul>
          <t>The <tt>OpenBase()</tt> function is as specified in <xref section="6.1" sectionFormat="comma" target="HPKE"/> for the
ciphersuite indicated by the HPKE configuration.</t>
        </section>
        <section anchor="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 a CollectReq containing a query of type <tt>by_batch_id</tt>, the Leader checks
that the provided batch ID corresponds to a batch ID it returned in a previous
CollectResp for the task.</li>
                <li>For an AggregateShareReq, the Helper checks that the batch ID provided by the
Leader corresponds to a batch ID used in a previous 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>
    </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="input-share-validation"/>.</li>
          </ul>
          <t>Beyond the minimal capabilities required of helpers, leaders are generally
required to:</t>
          <ul spacing="normal">
            <li>Support the upload protocol and store reports; and</li>
            <li>Track batch report size during each collect flow and request encrypted output
shares from helpers.</li>
          </ul>
          <t>In addition, for each DAP task, 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="input-share-validation"/>.</li>
          </ul>
        </section>
        <section anchor="collector-capabilities">
          <name>Collector capabilities</name>
          <t>Collectors statefully interact with aggregators to produce an aggregate output.
Their input to the protocol is the task parameters, configured out of band,
which include the corresponding batch window and size. For each collect
invocation, collectors are required to keep state from the start of the protocol
to the end as needed to produce the final aggregate output.</t>
          <t>Collectors must also maintain state for the lifetime of each task, which
includes key material associated with the HPKE key configuration.</t>
        </section>
      </section>
      <section anchor="data-resolution-limitations">
        <name>Data resolution limitations</name>
        <t>Privacy comes at the cost of computational complexity. While affine-aggregatable
encodings (AFEs) can compute many useful statistics, they require more bandwidth
and CPU cycles to account for finite-field arithmetic during input-validation.
The increased work from verifying inputs decreases the throughput of the system
or the inputs processed per unit time. Throughput is related to the verification
circuit's complexity and the available compute-time to each aggregator.</t>
        <t>Applications that utilize proofs with a large number of multiplication gates or
a high frequency of inputs may need to limit inputs into the system to meet
bandwidth or compute constraints. Some methods of overcoming these limitations
include choosing a better representation for the data or introducing sampling
into the data collection methodology.</t>
        <t>[[TODO: Discuss explicit key performance indicators, here or elsewhere.]]</t>
      </section>
      <section anchor="aggregation-utility-and-soft-batch-deadlines">
        <name>Aggregation utility and soft batch deadlines</name>
        <t>A soft real-time system should produce a response within a deadline to be
useful. This constraint may be relevant when the value of an aggregate decreases
over time. A missed deadline can reduce an aggregate's utility but not
necessarily cause failure in the system.</t>
        <t>An example of a soft real-time constraint is the expectation that input data can
be verified and aggregated in a period equal to data collection, given some
computational budget. Meeting these deadlines will require efficient
implementations of the input-validation protocol. Applications might batch
requests or utilize more efficient serialization to improve throughput.</t>
        <t>Some applications may be constrained by the time that it takes to reach a
privacy threshold defined by a minimum number of reports. One possible solution
is to increase the reporting period so more samples can be collected, balanced
against the urgency of responding to a soft deadline.</t>
      </section>
      <section anchor="protocol-specific-optimizations">
        <name>Protocol-specific optimizations</name>
        <t>Not all DAP tasks have the same operational requirements, so the protocol is
designed to allow implementations to reduce operational costs in certain cases.</t>
        <section anchor="reducing-storage-requirements">
          <name>Reducing storage requirements</name>
          <t>In general, the aggregators are required to keep state for tasks and all valid
reports for as long as collect requests can be made for them. In particular,
aggregators must store a batch as long as the batch has not been queried more
than <tt>max_batch_query_count</tt> times. However, it is not always necessary to store
the reports themselves. For schemes like Prio3 <xref target="VDAF"/> in which reports are
verified only once, each aggregator only needs to store its aggregate share for
each possible batch interval, along with the number of times the aggregate share
was used in a batch. This is due to the requirement that the batch interval
respect the boundaries defined by the DAP parameters. (See
<xref target="batch-validation"/>.)</t>
          <t>However, Aggregators are also required to implement several per-report checks
that require retaining a number of data artifacts. For example, to detect replay
attacks, it is necessary for each Aggregator to retain the set of report IDs of
reports that have been aggregated for the task so far. Depending on the task
lifetime and report upload rate, this can result in high storage costs. To
alleviate this burden, DAP allows Aggregators to drop this state as needed, so
long as reports are dropped properly as described in <xref target="input-share-validation"/>.
Aggregators <bcp14>SHOULD</bcp14> take steps to mitigate the risk of dropping reports (e.g., by
evicting the oldest data first).</t>
          <t>Furthermore, the aggregators must store data related to a task as long as the
current time has not passed this task's <tt>task_expiration</tt>. Aggregator <bcp14>MAY</bcp14> delete
the task and all data pertaining to this task after <tt>task_expiration</tt>.
Implementors <bcp14>SHOULD</bcp14> provide for some leeway so the collector can collect the
batch after some delay.</t>
        </section>
      </section>
    </section>
    <section anchor="compliance">
      <name>Compliance Requirements</name>
      <t>In the absence of an application or deployment-specific profile specifying
otherwise, a compliant DAP application <bcp14>MUST</bcp14> implement the following HPKE cipher
suite:</t>
      <ul spacing="normal">
        <li>KEM: DHKEM(X25519, HKDF-SHA256) (see <xref section="7.1" sectionFormat="comma" target="HPKE"/>)</li>
        <li>KDF: HKDF-SHA256 (see <xref section="7.2" sectionFormat="comma" target="HPKE"/>)</li>
        <li>AEAD: AES-128-GCM (see <xref section="7.3" sectionFormat="comma" target="HPKE"/>)</li>
      </ul>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>DAP assumes an active attacker that controls the network and has the ability to
statically corrupt any number of clients, aggregators, and collectors. That is,
the attacker can learn the secret state of any party prior to the start of its
attack. For example, it may coerce a client into providing malicious input
shares for aggregation or coerce an aggregator into diverting from the protocol
specified (e.g., by divulging its input shares to the attacker).</t>
      <t>In the presence of this adversary, DAP aims to achieve the privacy and
robustness security goals described in <xref target="VDAF"/>'s Security Considerations
section.</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>HpkeConfigList <xref target="hpke-config"/>: "application/dap-hpke-config-list"</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-list-media-type">
          <name>"application/dap-hpke-config-list" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-hpke-config-list</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="task-configuration"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-report-media-type">
          <name>"application/dap-report" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-report</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="upload-request"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-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="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="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="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:
H4sIAAAAAAAAA9y963rbVpY2+B9XgVF+WEqRtORTErnS1YplJ/rKid22U1U9
9aVNkIQklEmCBYCS1SnPtcy1zJXNOu+1N0DZrkM/84yf7opNEhv7sPY6r3eN
x+Osq7pleZzvnVZt11SzbVcu8pOLi6a8KLqqXucvm7qr5/UyP68b+Ed1Vcxv
4L9lWzZX1foi/7Es2m1Trsp1t5cVs1lTXh3npycvxy9f/pgt6vm6WMHwi6Y4
78ZV2Z2PN5vVeFFsxof3s3nRlRd1c3Oct90iy67K9bY8zvL8oqm3G5jTx16X
593NBif/x7p5h99+jw/i56uiWsLn8K5/x5dO6uYCPy6a+SV8fNl1m/b47l38
FX5UXZUT/dld/ODurKmv2/IuPH8Xn7uousvtDJ6kFVxf4CLu9teEP13CmtrO
vcQ9MuFxJlU98PDAR5PLbrXcg405zu9nWbHtLusG9mcMr6E/1bo9zt9M8u/L
+uISDmytX/Cmv6lW/a9gicW6+m863OP87PWr7/Wbkjetq1YX8NBvcCL/foGf
Teb1Kktf+2SSvyy6rk7e+eSyAUKqN5dlk3wfv/jJst4uzmH3y+T1cxxgQ09+
bApPJ/mrsp3XzbKIJ/G0qea9r+L3/1j/d7UMX8rLy3fNvzfd+WrXik8m+R/r
erF7yckPPnXNxfW/X5bFBkh4VnXtZF12WZZVa7hyK3j2Ci4FPPHk+++Ovjqm
R/XSwgWpj/lWduUof1XPtm03yov1In89L5bFbFnmT+rVZtvxZa7P7W6X+Wv8
sO2qebtHgy7gw+P83uHRV3A3x0cP+E1Fc1F6cp43N5uunrRdgdNbTMrF9u4G
pnF3U2zKZrJZnPNoRq30Z8xb+MMEptM0FezK+PtqNmvjr08n+Xf1urzE1X73
3ZPvvz87+iZe8P9ZNvX49+v6elkuLkpkTvV5m8PKXpfzpuzGry9hdxf5adEV
+VVV5M+2y+VN/rxalwXQ45OXyVLvHY0P4f8eDi+1hHWtu0lVzBviDLA139w9
+vrrWxZoK4g+fYqf3izLz9qMn+BeV8tZXcQf/+ckP2sviyrs0b2jeI+eVxeX
3XWJ/5u/KeeX6+qv27IN/BuO/oeyuLrJf6i6rmz+wS25d3QXKOb/M1tyWm8P
78X78eYSaP1mVi3zk64r5u+S9d4bHx3C/w2vd1mt301aXPQFEDdwhbvzy2ID
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
u3I9zS9p8x/Dl6w1gm4CA9Yb5uuTwN32cO5vK7q/9r3jq/KCvbuXm3flW97G
PWD2i02NXgnSTxYm+uf1dk2HKLT9CiwrYK0tsh7HrnCFBaou/I2JaDxF1m7m
oOetajS48z+cnjxjNVlYMYl91cJwm5C3tqzLyzbe+y+w0Y9A6ew8OyeWIi7f
pjsfz8+bi/HVojgfw9bCWw/vI2fE9yFb/BRGdOQY0b298MyrEv2UjtzhAEAH
VPLeM02J2SYpO5VRf1dvZN9ZzoKptB1SVq7RUhXVrDgvWZZFGgkMCGIW7hUK
HVKPUYTjdTwHa5M1KnSgg/I/htNewdvqBs+KFXQzpdkoomtFF7klJ0P+roRJ
1A0Y2Hs//vz6DVwY+m/+0wv6+6un//Hz2aunp/j31z+cPH9uf8nkF69/ePHz
89Pwt/Dkkxc//vj0p1N+GD7No4+yvR9P/nOPva57L16+OXvx08nzPZYr3pxE
tocMumQPwwYvFhBPa0Y1+Ru+e/Ly//m/jx6IWLx3dPTNhw/yj6+PvnoA/8Cd
5rfV6+WN/BPOB2z9zaYs2BMBWgSwz6oDpXeEplQL2tU6R18MbOeXf8ad+eU4
/+1svjl68G/yAS44+lD3LPqQ9qz/Se9h3sSBjwZeY7sZfZ7sdDzfk/+M/q37
7j5ksjivUQ6QLQQ0xcIHHQognoMrHK4sGC7H2THZ1GD44NUWbuNVvPPtWgQc
WtDKccUuF1ky8QMTO8BxT0RpSwbVV+flCp2x7AkIHp+6meTJYLQCUuqLFmTi
bMkPsaBSGU6aAClnFXJQXpCbmF+LrtrWJu6DRW5uAnSgmJPADYNeQFja2lgw
2wnNdt0Gz8HY6almrhPbnMPF2FK8jH9p7BNe8R1KV9m4aHv5FbiVzvil9aLM
0IXS4/lCZKwukUSlakXAAWdld43OAZxrvVyQOISJgaAuybohvoi3STQZHVc1
FZ5fTz6pnwo5oM5xzMevUpcWETStTiaH50rmhoyU6Kg6iyfkttFV2eaTLGBN
rWAnYAvfCZ9lzhP2bJSXk4vJCF0v5QzeyxFP9IaYKth7AZ9uOS+B7HnSH78q
MOAP5XJT0mhPB303BS6QRUsg5iUpDfD0GZKGTiXyFML+ei/mQXSJxLc1glWf
o3WERmowC1H/wO1B7YaIDhkEqzjkKkCzrFzo29019nfzThtf6ngzUHTDa0SI
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
AQA=

-->

</rfc>
