<?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.13 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-01" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.0 -->
  <front>
    <title abbrev="DAP-PPM">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-01"/>
    <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="July" day="11"/>
    <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/"/>.
      </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="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>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>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>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>Leader:</dt>
          <dd>
            <t>A distinguished aggregator that coordinates input validation and data
 collection.</t>
          </dd>
          <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>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.
We call the servers the <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 send 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's 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 posession 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 facilitiate 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, if we want 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, if we wanted 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 entities are carried over HTTPS <xref target="RFC2818"/>. HTTPS
provides server authentication and confidentiality. When client authenticaiton
is also required, the client uses the mechanism described in
<xref target="https-sender-auth"/>.</t>
      <section anchor="errors">
        <name>Errors</name>
        <t>Errors can be reported in DAP both at the HTTP layer and within challenge
objects as defined in <xref target="iana-considerations"/>. DAP servers can return responses
with an HTTP error response code (4XX or 5XX). For example, if the client
submits a request using a method not allowed in this document, then the server
<bcp14>MAY</bcp14> return HTTP status code 405 Method Not Allowed.</t>
        <t>When the server responds with an error status, it <bcp14>SHOULD</bcp14> provide additional
information using a problem document <xref target="RFC7807"/>. To facilitate automatic
response to errors, this document defines the following standard tokens for use
in the "type" field (within the DAP URN namespace
"urn:ietf:params:ppm:dap:error:"):</t>
        <table>
          <thead>
            <tr>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">unrecognizedMessage</td>
              <td align="left">The message type for a response was incorrect or the payload was malformed.</td>
            </tr>
            <tr>
              <td align="left">unrecognizedTask</td>
              <td align="left">An endpoint received a message with an unknown task ID.</td>
            </tr>
            <tr>
              <td align="left">unrecognizedAggregationJob</td>
              <td align="left">An endpoint received a message with an unknown aggregation job ID.</td>
            </tr>
            <tr>
              <td align="left">outdatedConfig</td>
              <td align="left">The message was generated using an outdated configuration.</td>
            </tr>
            <tr>
              <td align="left">reportTooLate</td>
              <td align="left">Report could not be processed because it arrived too late.</td>
            </tr>
            <tr>
              <td align="left">reportTooEarly</td>
              <td align="left">Report could not be processed because its timestamp is too far in the future.</td>
            </tr>
            <tr>
              <td align="left">batchInvalid</td>
              <td align="left">A collect or aggregate-share request was made with invalid batch parameters.</td>
            </tr>
            <tr>
              <td align="left">insufficientBatchSize</td>
              <td align="left">There are not enough reports in the batch interval to satisfy the task's minimum batch size.</td>
            </tr>
            <tr>
              <td align="left">batchLifetimeExceeded</td>
              <td align="left">The batch lifetime has been exceeded for one or more reports included in the batch interval.</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="https-sender-auth"/>).</td>
            </tr>
          </tbody>
        </table>
        <t>This list is not exhaustive. The server <bcp14>MAY</bcp14> return errors set to a URI other
than those defined above. Servers <bcp14>MUST NOT</bcp14> use the DAP URN namespace for errors
not listed in the appropriate IANA registry (see <xref target="urn-space"/>). Clients
<bcp14>SHOULD</bcp14> display the "detail" field of all errors. The "instance" value <bcp14>MUST</bcp14> be
the endpoint to which the request was targeted. The problem document <bcp14>MUST</bcp14> also
include a "taskid" member which contains the associated DAP task ID (this value
is always known, see <xref target="task-configuration"/>), encoded in Base 64 using the URL
and filename safe alphabet with no padding defined in sections 5 and 3.2 of
<xref target="RFC4648"/>.</t>
        <t>In the remainder of this document, we use the tokens in the table above to refer
to error types, rather than the full URNs. For example, an "error of type
'unrecognizedMessage'" refers to an error document with "type" value
"urn:ietf:params:ppm:dap:error:unrecognizedMessage".</t>
        <t>This document uses the verbs "abort" and "alert with <tt>[some error message]</tt>" to
describe how protocol participants react to various error conditions.</t>
      </section>
      <section anchor="https-sender-auth">
        <name>HTTPS Sender Authentication</name>
        <t>Some HTTP requests in the DAP protocol require the sender to authenticate its
request. It does so as described here.</t>
        <t>Prior to the start of the protocol, the sender and receiver arrange to share a
secret sender-specific API token, which <bcp14>MUST</bcp14> be suitable for representation in
an HTTP header.</t>
        <t>For requests requiring authentication, the sender includes a "DAP-Auth-Token"
header in its HTTP request containing the API token.</t>
        <t>To authenticate the request, the receiver looks up the token for the
sender as determined by the task configuration. (See <xref target="task-configuration"/>.) If
the value of the "DAP-Auth-Token" header does not match the token, then
the receiver <bcp14>MUST</bcp14> abort with error "unauthorizedRequest" and HTTP status code
403 Forbidden.</t>
        <t>[OPEN ISSUE: This simple bearer-token scheme is meant to unblock interop
testing. Eventually it should be replaced with a more secure authentication
mechanism, e.g., TLS client certificates. See
https://mailarchive.ietf.org/arch/msg/ppm/z65FK8kOU27Dt38WNhpI6apc2so/ for
details.]</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>We start with some basic type definitions used in other messages.</t>
      <artwork><![CDATA[
/* ASCII encoded URL. e.g., "https://example.com" */
opaque Url<1..2^16-1>;

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

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

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

/* A nonce used to uniquely identify a report in the context of a DAP task. It
includes the timestamp of the current batch and a random 16-byte value. */
struct {
  Time time;
  uint8 rand[16];
} Nonce;

/* The various roles in the DAP protocol. */
enum {
  collector(0),
  client(1),
  leader(2),
  helper(3),
} 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^16-1>; // ciphertext
} HpkeCiphertext;
]]></artwork>
      <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>
            <tt>max_batch_lifetime</tt>: The maximum number of times a batch of reports may be
used in collect requests.</li>
          <li>
            <tt>min_batch_size</tt>: The minimum number of reports that appear in a batch.</li>
          <li>
            <tt>min_batch_duration</tt>: The minimum time difference between the oldest and
newest report in a batch. This defines the boundaries with which the batch
interval of each collect request must be aligned. (See
<xref target="batch-parameter-validation"/>.)</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>The helper stores a bearer token used to authenticate HTTP requests from the
leader. Likewise, the leader stores a bearer token to authenticate HTTP request
from the collector. The authentication mechanism is described in
<xref target="https-sender-auth"/>.</t>
        <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?task_id=[task-id]</tt>, where
<tt>[aggregator]</tt> is the aggregator's endpoint URL, obtained from the task
parameters, and <tt>[task-id]</tt> is the task ID obtained from the task parameters,
encoded in Base 64 with URL and filename safe alphabet with no padding, as
specified in sections 5 and 3.2 of <xref target="RFC4648"/>. If the aggregator does not
recognize the task ID, then it responds with HTTP status code 404 Not Found and
an error of type <tt>unrecognizedTask</tt>. The aggregator responds to well-formed
requests with HTTP status code 200 OK and an <tt>HpkeConfig</tt> value:</t>
          <t>[TODO: Allow aggregators to return HTTP status code 403 Forbidden in deployments
that use authentication to avoid leaking information about which tasks exist.]</t>
          <artwork><![CDATA[
struct {
  HpkeConfigId id;
  HpkeKemId kem_id;
  HpkeKdfId kdf_id;
  HpkeAeadKdfId aead_id;
  HpkePublicKey public_key;
} HpkeConfig;

opaque HpkePublicKey<1..2^16-1>;
uint16 HpkeAeadId; // Defined in [HPKE]
uint16 HpkeKemId;  // Defined in [HPKE]
uint16 HpkeKdfId;  // Defined in [HPKE]
]]></artwork>
          <t>[OPEN ISSUE: Decide whether to expand the width of the id, or support multiple
cipher suites (a la OHTTP/ECH).]</t>
          <t>The client <bcp14>MUST</bcp14> abort if any of the following happen for any HPKE config
request:</t>
          <ul spacing="normal">
            <li>the client and aggregator failed to establish a secure,
aggregator-authenticated channel;</li>
            <li>the GET request failed or didn't return a valid HPKE configuration; or</li>
            <li>the HPKE configuration specifies a KEM, KDF, or AEAD algorithm the client
doesn't 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="RFC7234"/> 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 {
  TaskID task_id;
  Nonce nonce;
  Extension extensions<0..2^16-1>;
  HpkeCiphertext encrypted_input_shares<1..2^16-1>;
} Report;
]]></artwork>
          <t>This message is called the client's report. It contains the following fields:</t>
          <ul spacing="normal">
            <li>
              <tt>task_id</tt> is the task ID of the task for which the report is intended.</li>
            <li>
              <tt>nonce</tt> is the report nonce generated by the client. This field is used by the
aggregators to ensure the report appears in at most one batch. (See
<xref target="anti-replay"/>.)</li>
            <li>
              <tt>extensions</tt> is a list of extensions to be included in the Upload flow; see
<xref target="upload-extensions"/>.</li>
            <li>
              <tt>encrypted_input_shares</tt> contains the encrypted input shares of each of the
aggregators. The order in which the encrypted input shares appear <bcp14>MUST</bcp14> match
the order of the task's <tt>aggregator_endpoints</tt> (i.e., the first share should
be the leader's, the second share should be for the first helper, and so on).</li>
          </ul>
          <t>To generate the report, the client begins by initializing the report nonce.
Specifically, the client first sets <tt>Nonce.rand</tt> to 16 random bytes output from
a cryptographically secure random number generator. It then sets <tt>Nonce.time</tt>
to the number of seconds elapsed since the start of the UNIX epoch, rounded down to the nearest multiple of <tt>min_batch_duration</tt>.
This truncation is done to ensure that the report's timestamp cannot be used to
link the report back to the originating client.</t>
          <t>The client then finishes the report generation by sharding its measurement into
a sequence of input shares as specified by the VDAF in use. To encrypt an input
share, the client generates an <xref target="HPKE"/> ciphertext for the aggregator by running</t>
          <artwork><![CDATA[
enc, payload = SealBase(pk, "dap-01 input share" || 0x01 || server_role,
    task_id || nonce || extensions, input_share)
]]></artwork>
          <t>where <tt>pk</tt> is the aggregator's public key; <tt>server_role</tt> is the Role of the
intended recipient (<tt>0x02</tt> for the leader and <tt>0x03</tt> for the helper);
<tt>task_id</tt>, <tt>nonce</tt>, and <tt>extensions</tt> are the corresponding fields of <tt>Report</tt>;
and <tt>input_share</tt> is the aggregator's input share.</t>
          <t>The leader responds to well-formed requests to <tt>[leader]/upload</tt> with HTTP status
code 200 OK and an empty body. Malformed requests are handled as described in <xref target="errors"/>.
Clients <bcp14>SHOULD NOT</bcp14> upload the same measurement value in more than one report if
the leader responds with HTTP status code 200 OK and an empty body.</t>
          <t>The leader responds to requests whose leader encrypted input share uses an
out-of-date <tt>HpkeConfig.id</tt> value, indicated by <tt>HpkeCiphertext.config_id</tt>, with
HTTP status code 400 Bad Request and an error of type 'outdatedConfig'. Clients <bcp14>SHOULD</bcp14> invalidate any
cached aggregator <tt>HpkeConfig</tt> and retry with a freshly generated Report. If
this retried report does not succeed, clients <bcp14>MUST</bcp14> abort and discontinue
retrying.</t>
          <t>The leader <bcp14>MUST</bcp14> ignore any report whose nonce contains a timestamp that falls in
a batch interval for which it has received at least one collect request from the
collector. (See <xref target="collect-flow"/>.) Otherwise, comparing the aggregate result to
the previous aggregate result may result in a privacy violation. (Note that the
helpers enforce this as well; see <xref target="collect-flow"/>.) In addition, the
leader <bcp14>SHOULD</bcp14> abort the upload protocol and alert the client with error
"reportTooLate".</t>
          <t>Leaders can buffer reports while waiting to aggregate them. The leader <bcp14>SHOULD
NOT</bcp14> accept reports whose timestamps are too far in the future. Implementors <bcp14>MAY</bcp14>
provide for some small leeway, usually no more than a few minutes, to account
for clock skew. If the leader rejects a report for this reason, it <bcp14>SHOULD</bcp14> abort
the upload protocol and alert the client with error "reportTooEarly".</t>
        </section>
        <section anchor="upload-extensions">
          <name>Upload Extensions</name>
          <t>Each Report carries a list of extensions that clients may use to convey
additional, authenticated information in the report. [OPEN ISSUE: The extensions
aren't authenticated. It's probably a good idea to be a bit more clear about how
we envision extensions being used. Right now this includes client attestation
for defeating Sybil attacks. See issue#89.] Each extension is a tag-length
encoded value of the following form:</t>
          <artwork><![CDATA[
  struct {
      ExtensionType extension_type;
      opaque extension_data<0..2^16-1>;
  } Extension;

  enum {
      TBD(0),
      (65535)
  } ExtensionType;
]]></artwork>
          <t>"extension_type" indicates the type of extension, and "extension_data" contains
information specific to the extension.</t>
        </section>
      </section>
      <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, initializates 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),
} 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-batch-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 {
  Nonce nonce;
  Extension extensions<0..2^16-1>;
  HpkeCiphertext encrypted_input_share;
} ReportShare;

struct {
  TaskID task_id;
  AggregationJobID job_id;
  opaque agg_param<0..2^16-1>;
  ReportShare report_shares<1..2^16-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>The <tt>nonce</tt> and <tt>extensions</tt> fields of each ReportShare match that in the Report
uploaded by the client. The <tt>encrypted_input_share</tt> field 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.
The <tt>agg_param</tt> field is an opaque, VDAF-specific aggregation parameter provided during a collection flow.
The <tt>job_id</tt> parameter contains the leader's chosen AggregationJobID.</t>
            <t>[[OPEN ISSUE: Check that this handling of <tt>agg_param</tt> is appropriate when the definition of Poplar is done.]]</t>
            <t>Let <tt>[aggregator]</tt> denote the helper's API endpoint. The leader sends a POST
request to <tt>[aggregator]/aggregate</tt> with its AggregateInitializeReq message as
the payload. The media type is "message/dap-aggregate-initialize-req". In addition,
this request <bcp14>MUST</bcp14> be authenticated as described in <xref target="https-sender-auth"/>.</t>
          </section>
          <section anchor="helper-initialization">
            <name>Helper Initialization</name>
            <t>Each helper begins their portion of the aggregate initialization phase with the set
of candidate report shares obtained in an <tt>AggregateInitializeReq</tt> message from the leader.
It attempts to recover and validate the corresponding input shares similar to the leader,
and eventually returns a response to the leader carrying a VDAF-specific message for each
report share.</t>
            <t>To begin this process, the helper first checks that the nonces in <tt>AggregateInitializeReq.report_shares</tt>
are all distinct. If two ReportShare values have the same nonce, then the helper <bcp14>MUST</bcp14> abort with
error "unrecognizedMessage". If this check succeeds, the helper then attempts to recover each
input share in <tt>AggregateInitializeReq.report_shares</tt> as follows:</t>
            <ol spacing="normal" type="1"><li>Decrypt the input share for each report share as described in <xref target="input-share-decryption"/>.</li>
              <li>Check that the resulting input share is valid as described in <xref target="input-share-batch-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 nonce check into #input-share-batch-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),
} PrepareStepResult;

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

struct {
  PrepareStep prepare_steps<1..2^16-1>;
} AggregateInitializeResp;
]]></artwork>
            <t>The message is a sequence of PrepareStep values, the order of which
matches that of the ReportShare values in <tt>AggregateInitializeReq.report_shares</tt>. Each report
that was marked as invalid is assigned the PrepareStepResult <tt>failed</tt>. Otherwise, the
PrepareStep is either marked as continued with the output <tt>prep_msg</tt>, or is marked
as finished if the VDAF preparation process is finished for the report share.</t>
            <t>The helper's response to the leader is an HTTP status code 200 OK whose body is the
AggregateInitializeResp and media type is "message/dap-aggregate-initialize-resp".</t>
            <t>Upon receipt of a helper's AggregateInitializeResp message, the leader checks that the
sequence of PrepareStep messages corresponds to the ReportShare sequence of the
AggregateInitializeReq. If any message appears out of order, is missing, has an
unrecognized nonce, or if two messages have the same nonce, 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, nonce, list of extensions, and encrypted
input share. Let <tt>task_id</tt>, <tt>nonce</tt>, <tt>extensions</tt>, and <tt>encrypted_input_share</tt> denote these
values, respectively. Given these values, an aggregator decrypts the input
share as follows. First, the aggregator looks up the HPKE config and corresponding
secret key indicated by <tt>encrypted_input_share.config_id</tt>. If not found, then it
marks the report share as invalid with the error <tt>hpke-unknown-config-id</tt>.
Otherwise, it decrypts the payload with the following procedure:</t>
            <artwork><![CDATA[
input_share = OpenBase(encrypted_input_share.enc, sk, "dap-01 input share" ||
    0x01 || server_role, task_id || nonce || extensions,
    encrypted_input_share.payload)
]]></artwork>
            <t>where <tt>sk</tt> is the HPKE secret key, and <tt>server_role</tt> is the role of the
aggregator (<tt>0x02</tt> for the leader and <tt>0x03</tt> for the helper). If decryption
fails, the aggregator marks the report share as invalid with the error
<tt>hpke-decrypt-error</tt>. Otherwise, it outputs the resulting <tt>input_share</tt>.</t>
          </section>
          <section anchor="input-share-batch-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>The validation checks are as follows.</t>
            <ol spacing="normal" type="1"><li>Check if the report has never been aggregated but is contained by
a batch that has been collected. If this check fails, the input share
is marked as invalid with the error <tt>batch-collected</tt>. This prevents
additional reports from being aggregated after its batch has already
been collected.</li>
              <li>Check if the report has already been aggregated with this aggregation
parameter. If this check fails, the input share is 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. An aggregator may also
choose to mark an input share as invalid with the  error <tt>report-dropped</tt>
under the conditions prescribed in <xref target="anti-replay"/>.</li>
            </ol>
            <t>If both 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 nonce
as follows:</t>
            <artwork><![CDATA[
prep_state = VDAF.prep_init(vdaf_verify_key,
                            agg_id,
                            agg_param,
                            nonce,
                            input_share)
out = VDAF.prep_next(prep_state, None)
]]></artwork>
            <t><tt>vdaf_verify_key</tt> is the VDAF verification key shared by the aggregators;
<tt>agg_id</tt> is the aggregator ID (<tt>0x00</tt> for the Leader and <tt>0x01</tt> for the helper);
and <tt>agg_param</tt> is the opaque aggregation parameter distributed to the
aggregtors by the collector.</t>
            <t>If either step fails, the aggregator marks the report as invalid with error
<tt>vdaf-prep-error</tt>. Otherwise, the value <tt>out</tt> is interpreted as follows. If this
is the last round of the VDAF, then <tt>out</tt> is the aggregator's output share.
Otherwise, <tt>out</tt> is the pair <tt>(prep_state, prep_msg)</tt>.</t>
          </section>
        </section>
        <section anchor="agg-continue-flow">
          <name>Aggregate Continuation</name>
          <t>In the continuation phase, the leader drives the VDAF preparation of each share
in the candidate report set until the underlying VDAF moves into a terminal
state, yielding an output share for all aggregators or an error. This phase may
involve multiple rounds of interaction depending on the underlying VDAF. Each
round trip is initiated by the leader.</t>
          <section anchor="leader-continuation">
            <name>Leader Continuation</name>
            <t>The leader begins each round of continuation for a report share based on its locally computed
prepare message and the previous PrepareStep from the helper. If PrepareStep is of type "failed",
then the leader marks the report as failed and removes it from the candidate report set and does not
process it further. If the type is "finished", then the leader aborts with "unrecognizedMessage".
[[OPEN ISSUE: This behavior is not specified.]] If the type is "continued", then the leader proceeds as
follows.</t>
            <t>Let <tt>leader_outbound</tt> denote the leader's prepare message and <tt>helper_outbound</tt> denote the
helper's. The leader computes the next state transition as follows:</t>
            <artwork><![CDATA[
inbound = VDAF.prep_shares_to_prep(agg_param, [leader_outbound, helper_outbound])
out = VDAF.prep_next(prep_state, inbound)
]]></artwork>
            <t>where [leader_outbound, helper_outbound] is a vector of two elements.
If either of these operations fails, then the leader marks the report as invalid.
Otherwise it interprets <tt>out</tt> as follows. If this is the last round of the VDAF,
then <tt>out</tt> is the aggregator's output share, in which case the aggregator finishes
and stores its output share for further processing as described in <xref target="collect-flow"/>.
Otherwise, <tt>out</tt> is the pair <tt>(new_state, prep_msg)</tt>, where <tt>new_state</tt> is its updated
state and <tt>prep_msg</tt> is its next VDAF message (which will be <tt>leader_outbound</tt> in the next
round of continuation). For the latter case, the helper sets <tt>prep_state</tt> to <tt>new_state</tt>.</t>
            <t>The leader then sends each PrepareStep to the helper in an AggregateContinueReq message,
structured as follows:</t>
            <artwork><![CDATA[
struct {
  TaskID task_id;
  AggregationJobID job_id;
  PrepareStep prepare_shares<1..2^16-1>;
} AggregateContinueReq;
]]></artwork>
            <t>For each aggregator endpoint <tt>[aggregator]</tt> in <tt>AggregateContinueReq.task_id</tt>'s
parameters except its own, the leader sends a POST request to
<tt>[aggregator]/aggregate</tt> with AggregateContinueReq as the payload and the media
type set to "message/dap-aggregate-continue-req". In addition, this request <bcp14>MUST</bcp14>
be authenticated as described in <xref target="https-sender-auth"/>.</t>
          </section>
          <section anchor="helper-continuation">
            <name>Helper Continuation</name>
            <t>The helper continues with preparation for a report share by combining the leader's input
message in <tt>AggregateContinueReq</tt> and its current preparation state (<tt>prep_state</tt>). This
step yields one of three outputs:</t>
            <ol spacing="normal" type="1"><li>An error, in which case the input report share is marked as invalid.</li>
              <li>An output share, in which case the helper stores the output share for future collection
as described in <xref target="collect-flow"/>.</li>
              <li>An updated VDAF state and preparation message, denoted <tt>(prep_state, prep_msg)</tt>.</li>
            </ol>
            <t>To carry out this step, for each PrepareStep in AggregateContinueReq.prepare_shares 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 preapre 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. 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.
Otherwise, the helper interpets <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.</t>
            <t>This output message for each report in AggregateContinueReq.prepare_shares is then sent
to the leader in an AggregateContinueResp message, structured as follows:</t>
            <artwork><![CDATA[
struct {
  PrepareStep prepare_shares<1..2^16-1>;
} AggregateContinueResp;
]]></artwork>
            <t>The order of AggregateContinueResp.prepare_shares <bcp14>MUST</bcp14> match that of the PrepareStep values in
<tt>AggregateContinueReq.prepare_shares</tt>. The helper's response to the leader is an HTTP status code
200 OK whose body is the AggregateContinueResp and media type is "message/dap-aggregate-continue-resp".
The helper then awaits the next message from the leader.</t>
            <t>[[OPEN ISSUE: consider relaxing this ordering constraint. See issue#217.]]</t>
          </section>
        </section>
      </section>
      <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 output. In particular,
the collector asks the leader to collect and return the results for a given
DAP task over a given time period. The aggregate shares are encrypted to the
collector so that it can decrypt and combine them to yield the aggregate output.
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 request <bcp14>MUST</bcp14> be authenticated
as described in <xref target="https-sender-auth"/>. 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;
  Interval batch_interval;
  opaque agg_param<0..2^16-1>; // VDAF aggregation parameter
} CollectReq;
]]></artwork>
          <t>The named parameters are:</t>
          <ul spacing="normal">
            <li>
              <tt>task_id</tt>, the DAP task ID.</li>
            <li>
              <tt>batch_interval</tt>, the request's batch interval.</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 all the reports falling within <tt>batch_interval</tt>
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-parameter-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 falling
into <tt>CollectReq.batch_interval</tt> (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 {
  HpkeCiphertext encrypted_agg_shares<1..2^16-1>;
} CollectResp;
]]></artwork>
          <t>The <tt>encrypted_agg_shares</tt> field is the vector of encrypted aggregate shares.
They <bcp14>MUST</bcp14> appear in the same order as the aggregator endpoints list of the task
parameters.</t>
          <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 leader <bcp14>MUST</bcp14> retain a collect job's results until the collector sends an HTTP
DELETE request to the collect job URI, in which case the leader responds with
HTTP status 204 No Content.</t>
          <t>[OPEN ISSUE: Allow the leader to drop aggregate shares after some reasonable
amount of time has passed, but it's not clear how to specify that. ACME doesn't
bother to say anything at all about this when describing how subscribers should
fetch certificates: https://datatracker.ietf.org/doc/html/rfc8555#section-7.4.2]</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 window identified
by the collect request. The checksum is computed by taking the SHA256 hash of
each nonce 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 {
  TaskID task_id;
  Interval batch_interval;
  opaque agg_param<0..2^16-1>;
  uint64 report_count;
  opaque checksum[32];
} AggregateShareReq;
]]></artwork>
          <ul spacing="normal">
            <li>
              <tt>task_id</tt> is the task ID associated with the DAP parameters.</li>
            <li>
              <tt>batch_interval</tt> is the batch interval of the request.</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"/>)
and in <tt>CollectReq</tt> (see <xref target="collect-init"/>).</li>
            <li>
              <tt>report_count</tt> is the number of reports included in the aggregation.</li>
            <li>
              <tt>checksum</tt> is the checksum computed over the set of client reports.</li>
          </ul>
          <t>This request <bcp14>MUST</bcp14> be authenticated as described in <xref target="https-sender-auth"/>. 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-parameter-validation"/>.</t>
          <t>Next, it computes a checksum based on its view of the output shares included in
the batch window, 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 error
"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-parameter-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 batch interval, it is an
error for the leader to issue any more aggregate or aggregate-init requests for
additional reports in the batch interval. 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, 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)
]]></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-01 aggregate share" || server_role || 0x00,
  AggregateShareReq.task_id || AggregateShareReq.batch_interval, agg_share)
]]></artwork>
          <t>where <tt>pk</tt> is the HPKE public key encoded by the collector's HPKE key,
<tt>server_role</tt> is <tt>0x02</tt> for the leader and <tt>0x03</tt> for a helper.</t>
          <t>The collector decrypts these aggregate shares using the opposite process.
Specifically, given an encrypted input share, denoted <tt>enc_share</tt>, for a
given batch interval, denoted <tt>batch_interval</tt>, decryption works as follows:</t>
          <artwork><![CDATA[
agg_share = OpenBase(enc_share.enc, sk, "dap-01 aggregate share" ||
    server_role || 0x00, task_id || batch_interval, enc_share.payload)
]]></artwork>
          <t>where <tt>sk</tt> is the HPKE secret key, <tt>task_id</tt> is the task ID for the collect
request, and <tt>server_role</tt> is the role of the server that sent the aggregate
share (<tt>0x02</tt> for the leader and <tt>0x03</tt> for the helper).</t>
        </section>
        <section anchor="batch-parameter-validation">
          <name>Validating Batch Parameters</name>
          <t>Before an aggregator responds to a collect request or aggregate-share request,
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 request's batch interval respects the
boundaries defined by the DAP task's parameters. Namely, it checks that both
<tt>batch_interval.start</tt> and <tt>batch_interval.duration</tt> are divisible by
<tt>min_batch_duration</tt> and that <tt>batch_interval.duration &gt;= min_batch_duration</tt>.
Unless both these conditions are true, the aggregator <bcp14>MUST</bcp14> abort and alert its
peer with error "batchInvalid".</t>
          <t>Next, the aggregator checks that the request respects the generic privacy
parameters of the DAP task. Let <tt>X</tt> denote the set of reports for which the
aggregator has recovered a valid output share and which fall in the batch
interval of the request.</t>
          <ul spacing="normal">
            <li>If <tt>len(X) &lt; min_batch_size</tt>, then the aggregator <bcp14>MUST</bcp14> abort and alert its
peer with "insufficientBatchSize".</li>
            <li>The aggregator keeps track of the number of times each report was added to the
batch of an AggregateShareReq. If any report in <tt>X</tt> was added to at least
<tt>max_batch_lifetime</tt> previous batches, then the aggregator <bcp14>MUST</bcp14> abort and
alert the peer with "batchLifetimeExceeded".</li>
          </ul>
          <t>Finally, the aggregator checks that the batch interval defined by the collect
request satisfies one of the conditions:</t>
          <ol spacing="normal" type="1"><li>The batch interval does not overlap with the batch interval of any prior
completed collect requests.</li>
            <li>The batch interval, including its start and duration values, match a prior
completed collect request.</li>
          </ol>
          <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>
        <section anchor="anti-replay">
          <name>Anti-replay</name>
          <t>Using a client-provided report multiple times within a single batch, or using
the same report in multiple batches, may allow a server to learn information
about the client's measurement, violating the privacy goal of DAP. To
prevent such replay attacks, this specification requires the aggregators to
detect and filter out replayed reports.</t>
          <t>To detect replay attacks, each aggregator keeps track of the set of nonces
pertaining to reports that were previously aggregated for a given task. If the
leader receives a report from a client whose nonce is in this set, it simply
ignores it. A helper who receives an encrypted input share whose nonce is
in this set replies to the leader with an error as described in
<xref target="input-share-batch-validation"/>.</t>
          <t>[OPEN ISSUE: This has the potential to require aggreagtors to store nonce sests
indefinitely. See issue#180.]</t>
          <t>A malicious aggregator may attempt to force a replay by replacing the nonce
generated by the client with a nonce its peer has not yet seen. To prevent this,
clients incorporate the nonce into the AAD for HPKE encryption, ensuring that
the output share is only recovered if the aggregator is given the correct nonce.
(See <xref target="upload-request"/>.)</t>
          <t>Aggregators prevent the same report from being used in multiple batches (except
as required by the protocol) by only responding to valid collect requests, as
described in <xref target="batch-parameter-validation"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="operational-capabilities">
      <name>Operational Considerations</name>
      <t>The DAP protocol has inherent constraints derived from the tradeoff between
privacy guarantees and computational complexity. These tradeoffs influence how
applications may choose to utilize services implementing the specification.</t>
      <section anchor="entity-capabilities">
        <name>Protocol participant capabilities</name>
        <t>The design in this document has different assumptions and requirements for
different protocol participants, including clients, aggregators, and collectors.
This section describes these capabilities in more detail.</t>
        <section anchor="client-capabilities">
          <name>Client capabilities</name>
          <t>Clients have limited capabilities and requirements. Their only inputs to the
protocol are (1) the parameters configured out of band and (2) a measurement.
Clients are not expected to store any state across any upload flows, nor are
they required to implement any sort of report upload retry mechanism. By
design, the protocol in this document is robust against individual client upload
failures since the protocol output is an aggregate over all inputs.</t>
        </section>
        <section anchor="aggregator-capabilities">
          <name>Aggregator capabilities</name>
          <t>Helpers and leaders have different operational requirements. The design in this
document assumes an operationally competent leader, i.e., one that has no
storage or computation limitations or constraints, but only a modestly
provisioned helper, i.e., one that has computation, bandwidth, and storage
constraints. By design, leaders must be at least as capable as helpers, where
helpers are generally required to:</t>
          <ul spacing="normal">
            <li>Support the collect protocol, which includes validating and aggregating
reports; and</li>
            <li>Publish and manage an HPKE configuration that can be used for the upload
protocol.</li>
          </ul>
          <t>In addition, for each DAP task, helpers are required to:</t>
          <ul spacing="normal">
            <li>Implement some form of batch-to-report index, as well as inter- and
intra-batch replay mitigation storage, which includes some way of tracking
batch report size. Some of this state may be used for replay attack
mitigation. The replay mitigation strategy is described in <xref target="anti-replay"/>.</li>
          </ul>
          <t>Beyond the minimal capabilities required of helpers, leaders are generally
required to:</t>
          <ul spacing="normal">
            <li>Support the upload protocol and store reports; and</li>
            <li>Track batch report size during each collect flow and request encrypted output
shares from helpers.</li>
          </ul>
          <t>In addition, for each DAP task, leaders are required to:</t>
          <ul spacing="normal">
            <li>Implement and store state for the form of inter- and intra-batch replay
mitigation in <xref target="anti-replay"/>; and</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 all valid reports for
as long as collect requests can be made for them. In particular, the aggregators
must store a batch as long as the batch has not been queried more than
<tt>max_batch_lifetime</tt> times. However, it is not always necessary to store the
reports themselves. For schemes like Prio in which the input-validation protocol
is only run once per report, 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-parameter-validation"/>.)</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 following high-level
secure aggregation goals:</t>
      <ol spacing="normal" type="1"><li>Privacy. Clients trust that some aggregator is honest. That is, as long as at
least one aggregator executes the protocol faithfully, the parties learn nothing
beyond the aggregate result (i.e., the output of the aggregation function computed over
the honest measurements).</li>
        <li>Correctness. The collector trusts that the aggregators execute the protocol
correctly. That is, as long as the aggregators execute the protocol faithfully,
a malicious client can skew the aggregate result only by reporting
a false (untruthful) measurement. The result cannot be influenced in any
other way.</li>
      </ol>
      <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>
        <li>Attacks may also come from the network. Thus, it is required that the
aggregators and collector communicate with one another over mutually
authenticated and confidential channels.</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 coalitions of clients from compromising the robustness
property.</li>
              <li>If aggregator output satisifes 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
soundness) <strong>or</strong> a malicious subset of aggregators (attacking privacy). In
particular, soundness 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 soundness. 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
Oblivous HTTP <xref target="I-D.thomson-http-oblivious"/> to forward inputs to the DAP
leader, without requiring any server participating in DAP to be aware of
whatever client authentication or attestation scheme is in use.</t>
      </section>
      <section anchor="batch-parameters">
        <name>Batch parameters</name>
        <t>An important parameter of a DAP deployment is the minimum batch size. If an
aggregation includes too few inputs, then the outputs can reveal information
about individual participants. Aggregators use the batch size field of the
shared task parameters to enforce minimum batch size during the collect
protocol, but server implementations may also opt out of participating in a DAP
task if the minimum batch size is too small. This document does not specify how
to choose minimum batch sizes.</t>
        <t>The DAP parameters also specify the maximum number of times a report can be
used. Some protocols, such as Poplar <xref target="BBCGGI21"/>, require reports to be used in
multiple batches spanning multiple collect requests.</t>
      </section>
      <section anchor="dp">
        <name>Differential privacy</name>
        <t>Optionally, DAP deployments can choose to ensure their output F achieves
differential privacy <xref target="Vad16"/>. A simple approach would require the aggregators
to add two-sided noise (e.g. sampled from a two-sided geometric distribution) to
outputs. Since each aggregator is adding noise independently, privacy can be
guaranteed even if all but one of the aggregators is malicious. Differential
privacy is a strong privacy definition, and protects users in extreme
circumstances: Even if an adversary has prior knowledge of every input in a
batch except for one, that one record is still formally protected.</t>
        <t>[OPEN ISSUE: While parameters configuring the differential privacy noise (like
specific distributions / variance) can be agreed upon out of band by the
aggregators and collector, there may be benefits to adding explicit protocol
support by encoding them into task parameters.]</t>
      </section>
      <section anchor="robustness-in-the-presence-of-malicious-servers">
        <name>Robustness in the presence of malicious servers</name>
        <t>Most DAP protocols, including Prio and Poplar, are robust against malicious
clients, but are not robust against malicious servers. Any aggregator can simply
emit bogus aggregate shares and undetectably spoil aggregates. If enough
aggregators were available, this could be mitigated by running the protocol
multiple times with distinct subsets of aggregators chosen so that no aggregator
appears in all subsets and checking all the outputs against each other. If all
the protocol runs do not agree, then participants know that at least one
aggregator is defective, and it may be possible to identify the defector (i.e.,
if a majority of runs agree, and a single aggregator appears in every run that
disagrees). See
<eref target="https://github.com/ietf-wg-ppm/draft-ietf-ppm-dap/issues/22">#22</eref> for
discussion.</t>
      </section>
      <section anchor="infrastructure-diversity">
        <name>Infrastructure diversity</name>
        <t>Prio deployments should ensure that aggregators do not have common dependencies
that would enable a single vendor to reassemble inputs. For example, if all
participating aggregators stored unencrypted input shares on the same cloud
object storage service, then that cloud vendor would be able to reassemble all
the input shares and defeat privacy.</t>
      </section>
      <section anchor="operational-requirements">
        <name>System requirements</name>
        <section anchor="data-types">
          <name>Data types</name>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="protocol-message-media-types">
        <name>Protocol Message Media Types</name>
        <t>This specification defines the following protocol messages, along with their
corresponding media types types:</t>
        <ul spacing="normal">
          <li>HpkeConfig <xref target="hpke-config"/>: "application/dap-hpke-config"</li>
          <li>Report <xref target="upload-request"/>: "application/dap-report"</li>
          <li>AggregateInitializeReq <xref target="collect-flow"/>: "application/dap-aggregate-initialize-req"</li>
          <li>AggregateInitializeResp <xref target="collect-flow"/>: "application/dap-aggregate-initialize-resp"</li>
          <li>AggregateContinueReq <xref target="collect-flow"/>: "application/dap-aggregate-continue-req"</li>
          <li>AggregateContinueResp <xref target="collect-flow"/>: "application/dap-aggregate-continue-resp"</li>
          <li>AggregateShareReq <xref target="collect-flow"/>: "application/dap-aggregate-share-req"</li>
          <li>AggregateShareResp <xref target="collect-flow"/>: "application/dap-aggregate-share-resp"</li>
          <li>CollectReq <xref target="collect-flow"/>: "application/dap-collect-req"</li>
          <li>CollectResp <xref target="collect-flow"/>: "application/dap-collect-resp"</li>
        </ul>
        <t>The definition for each media type is in the following subsections.</t>
        <t>Protocol message format evolution is supported through the definition of new
formats that are identified by new media types.</t>
        <t>IANA [shall update / has updated] the "Media Types" registry at
https://www.iana.org/assignments/media-types with the registration information
in this section for all media types listed above.</t>
        <t>[OPEN ISSUE: Solicit review of these allocations from domain experts.]</t>
        <section anchor="applicationdap-hpke-config-media-type">
          <name>"application/dap-hpke-config" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-hpke-config</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="task-configuration"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-report-media-type">
          <name>"application/dap-report" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>dap-report</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="upload-request"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationdap-aggregate-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-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-1">
          <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="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="acknowledgements">
      <name>Acknowledgements</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="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="RFC2818">
          <front>
            <title>HTTP Over TLS</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="May" year="2000"/>
            <abstract>
              <t>This memo describes how to use Transport Layer Security (TLS) to secure Hypertext Transfer Protocol (HTTP) connections over the Internet.  This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2818"/>
          <seriesInfo name="DOI" value="10.17487/RFC2818"/>
        </reference>
        <reference anchor="RFC7807">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="E. Wilde" initials="E." surname="Wilde">
              <organization/>
            </author>
            <date month="March" year="2016"/>
            <abstract>
              <t>This document defines a "problem detail" as a way to carry machine- readable details of errors in a HTTP response to avoid the need to define new error response formats for HTTP APIs.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7807"/>
          <seriesInfo name="DOI" value="10.17487/RFC7807"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes.  It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="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="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="RFC7234">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): 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="2014"/>
            <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>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7234"/>
          <seriesInfo name="DOI" value="10.17487/RFC7234"/>
        </reference>
        <reference anchor="I-D.thomson-http-oblivious">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. 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="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="26" month="May" 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-01"/>
        </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:
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
yuxjMfX6lHcaUTTXKo2UTPiJdMZ4Sz7/KiMsW0RCIYcNnTj9pnzSqlAKF20T
ZitGhlFjG/kkaF5U65X66HjSxwckRKfWjL8sIBA62ZXRjpDCq45UI8G6jXjq
ddZjFZqyofLj04GqJ53S5t3WcNRO9GSeJVemJ7jrGXI0ELHCUjVkX3Uhki0u
yJa+lhHUv2FKva6jTbhZ2xHbleQITCSepYvMt561VYf1emNG+ZtXx7VU58Fo
rDSJQiCwqFNOy791W4B0HRHaPZRhBO9y30z06rQ1D8ntjRWBCBU6Ci4J3GJs
QTON0sUIq3TLgs5w40x3eaogHs/tdGDP6GbdKrw5kj6HEtuKwGVxRCsKRrPd
o0U9uCpCcAcSrJBDTOlVEFvfWtBmIn/CWt5H7UAFm53cmNlSTZDeodrEoMVO
FHrOYAXGbxAEUu22Tj0mrFOKL5dk4/aWktCivmM4VGhg0/RJgoqqE6ZUqNJn
7PkK2O5sDTsMA0sxuRmw6UGoc0mVrAZSfUlS/GwRJk5L4XUgTI+cCrUJRwXW
InlmsRs2PmJ2MLrTQI6n3qNIpT6w/mU96DRWbNUfviwm86oswEKi6kxdLK59
QV+dBCo2AfY4qy8+VYObQiyzzOO+qHwVucOVFzF1m0vja5WY6Dwx9iubHSKf
qUve+CUpdJT/yT67llx0Xpp1Sh/f2btDWhaZKVL64odSwthzjWD4Vu8psiun
vYd13padMX+T+oAltXFox5IHpr+D22rxwq0e/65s+kVZvVeat8YU1aHiUA3d
bdHl+IY4Cmya8xy1rkqyXVqfXpxA1Q5HOiT3nR6XVNCbvROBa3Cwy8d0A/eq
PWrPYVptObukklum05lNMGxvOuwbaY3kIhJ+JAccd3OkXyPDMVlpnD9n9Esf
47MPye32vpnLrLEXw22urn1773ZySKV2s6nKeNmFZ4d/l2o/COB6heWch7Rt
TkiPU1axEN767Ix0s2S1Zs7nCzPH+6FQBXNnCUYIc7/EPHxNFowhyiFjv6vZ
Rdbrefm+xaDa2qOUAux1WBpVMPIMUMpqHE2PsqsRJlbXs3U4rpYM0d13tFXj
WjoTtbvk1T3EAwIXyeeqouiO+QJpVAIakzRcyynr1WnXRt+YmY8SvddYN+MZ
VeO078lWvnYIQwa7pi3syI69lKxD0+rXNjBWb0xPsKX2EHxy18Sd/5jw+Hwi
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
D+7duwc8HxOqx9jX+v8DmYkKfbFxAQA=

-->

</rfc>
