<?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.8 (Ruby 3.0.4) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-00" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.5 -->
  <front>
    <title abbrev="DAP-PPM">Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-00"/>
    <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="May" day="03"/>
    <area>SEC</area>
    <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>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    mailing list (),
  which is archived at <eref target=""/>.</t>
      <t>Source for this draft and an issue tracker can be found at
  <eref target="https://github.com/ietf-wg-ppm/ppm-specification"/>.</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="disclaimer">
        <name>DISCLAIMER</name>
        <t>This document is a work in progress. We have not yet settled on the design of
the protocol framework or the set of features we intend to support.</t>
      </section>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>The following terms are used:</t>
        <dl>
          <dt>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 PPM 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 PPM 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 <em>privacy
preserving measurement (PPM) protocol</em> 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>
          <tt>prio3</tt>, 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>
          <tt>poplar1</tt>, 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/ppm-specification/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
 PPM system. 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 PPM 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.) and an optional
aggregation parameter.</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. 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 PPM, 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, <tt>prio3</tt> 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 PPM 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 PPM entities are carried over HTTPS <xref target="RFC2818"/>. HTTPS
provides server authentication and confidentiality. In addition, report shares
are encrypted directly to the aggregators using HPKE <xref target="I-D.irtf-cfrg-hpke"/>.</t>
      <section anchor="errors">
        <name>Errors</name>
        <t>Errors can be reported in PPM both at the HTTP layer and within challenge
objects as defined in <xref target="iana-considerations"/>. PPM 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 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 PPM URN namespace "urn:ietf:params:ppm: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">outdatedConfig</td>
              <td align="left">The message was generated using an outdated configuration.</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">batchMismatch</td>
              <td align="left">Aggregators disagree on the report shares that were aggregated in a batch.</td>
            </tr>
          </tbody>
        </table>
        <t>This list is not exhaustive. The server <bcp14>MAY</bcp14> return errors set to a URI other
than those defined above. Servers <bcp14>MUST NOT</bcp14> use the PPM URN namespace for errors
not listed in the appropriate IANA registry (see <xref target="ppm-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 PPM task ID, encoded
with base64 using the standard alphabet <xref target="RFC4648"/> (this value is always
known, see <xref target="task-configuration"/>).</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:error:unrecognizedMessage".</t>
        <t>This document uses the verbs "abort" and "alert with <tt>[some error message]</tt>" to
describe how protocol participants react to various error conditions.</t>
      </section>
    </section>
    <section anchor="protocol-definition">
      <name>Protocol Definition</name>
      <t>PPM 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 PPM task. It
includes the time at which the report was generated and a random, 64-bit
integer. */
struct {
  Time time;
  uint64 rand;
} Nonce;

/* The various roles in the PPM 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 context
  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 HPKE configuration of the collector (described in
<xref target="key-config"/>).</li>
          <li>
            <tt>vdaf_verify_param</tt>: The aggregator's VDAF verification parameter output by
the setup algorithm computed jointly by the aggregators before the start of the
PPM protocol <xref target="VDAF"/>). [OPEN ISSUE: This is yet to be
specified. See issue#161.]</li>
        </ul>
        <t>Finally, the collector is configured with the HPKE secret key corresponding to
<tt>collector_hpke_config</tt>.</t>
      </section>
      <section anchor="upload-flow">
        <name>Uploading Reports</name>
        <t>Clients periodically upload reports to the leader, which then distributes the
individual shares to each helper.</t>
        <section anchor="key-config">
          <name>Key Configuration Request</name>
          <t>Before the client can upload its report to the leader, it must know the public
key of each of the aggregators. These are retrieved from each aggregator by
sending a request to <tt>[aggregator]/key_config</tt>, where <tt>[aggregator]</tt> is the
aggregator's endpoint URL, obtained from the task parameters. The aggregator
responds to well-formed requests with status 200 and an <tt>HpkeConfig</tt> value:</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 I-D.irtf-cfrg-hpke
uint16 HpkeKemId;  // Defined in I-D.irtf-cfrg-hpke
uint16 HpkeKdfId;  // Defined in I-D.irtf-cfrg-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 <tt>key_config</tt>
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 key config; or</li>
            <li>the key config 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 keys;
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 <em>report</em>. 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 sharding its measurement into a
sequence of input shares as specified by the VDAF in use. To encrypt an input
share, the client first generates an HPKE <xref target="I-D.irtf-cfrg-hpke"/> context for
the aggregator by running</t>
          <artwork><![CDATA[
enc, context = SetupBaseS(pk, Report.task_id || "ppm-00 input share" ||
                              0x01 || server_role)
]]></artwork>
          <t>where <tt>pk</tt> is the aggregator's public key and <tt>server_role</tt> is the Role of the
intended recipient (<tt>0x02</tt> for the leader and <tt>0x03</tt> for the helper). In
general, the info string for computing the HPKE context is suffixed by two
bytes, the first of which identifies the role of the sender and the second of
which identifies the role of the intended recipient.</t>
          <t><tt>enc</tt> is the HPKE encapsulated key and <tt>context</tt> is the HPKE context used by the
client for encryption. The payload is encrypted as</t>
          <artwork><![CDATA[
payload = context.Seal(nonce || extensions, input_share)
]]></artwork>
          <t>where <tt>input_share</tt> is the aggregator's input share and <tt>nonce</tt> and <tt>extensions</tt>
are the corresponding fields of <tt>Report</tt>. Clients <bcp14>MUST NOT</bcp14> use the same <tt>enc</tt>
for multiple reports.</t>
          <t>The leader responds to well-formed requests to <tt>[leader]/upload</tt> with status 200
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 status 200 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
status 400 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
"staleReport".</t>
        </section>
        <section anchor="upload-extensions">
          <name>Upload Extensions</name>
          <t>Each Report carries a list of extensions that clients may use to convey
additional, authenticated information in the report. [OPEN ISSUE: The extensions
aren't authenticated. It's probably a good idea to be a bit more clear about how
we envision extensions being used. Right now this includes client attestation
for defeating Sybil attacks. See issue#89.] Each extension is a tag-length
encoded value of the following form:</t>
          <artwork><![CDATA[
  struct {
      ExtensionType extension_type;
      opaque extension_data<0..2^16-1>;
  } Extension;

  enum {
      TBD(0),
      (65535)
  } ExtensionType;
]]></artwork>
          <t>"extension_type" indicates the type of extension, and "extension_data" contains
information specific to the extension.</t>
        </section>
        <section anchor="leader-state">
          <name>Leader State</name>
          <t>The leader <bcp14>MUST</bcp14> 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.</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. To aggregate a set of reports, the leader sends a message to each
helper containing those report shares. 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 flow depends on the VDAF. Specifically:</t>
        <ul spacing="normal">
          <li>Some VDAFs (e.g., <tt>prio3</tt>) allow the leader to start aggregating reports
proactively before all the reports in a batch are received. Others (e.g.,
<tt>poplar1</tt>) 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>
        <t>In order to allow the helpers to retain minimal state, the helper can attach a
state parameter to its response, with the leader returning the state value in
the next request, thus offloading the state to the leader. This state value <bcp14>MUST</bcp14>
be cryptographically protected as described in <xref target="agg-init"/>.</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) ------------------------>  \
<----------------------------- Aggregate response (State 1) | Reports
Aggregate request (continued, State 1) ------------------>  | 1-10
<----------------------------- Aggregate response (State 1) /


Aggregate request (Reports 11-20, State 1) -------------->  \
<----------------------------- Aggregate response (State 1) | Reports
Aggregate request (continued, State 2) ------------------>  | 11-20
<----------------------------- Aggregate response (State 2) /
]]></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 aggregation by choosing a set of candidate reports that pertain
to the same PPM task. 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-initialization">
            <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>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 AggregateInitReq message for each helper to
initialize the preparation of this candidate set. The AggregateInitReq 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;
  opaque agg_param<0..2^16-1>;
  opaque helper_state<0..2^16>;
  ReportShare report_shares<1..2^16-1>;
} AggregateInitReq;
]]></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 AggregateInitReq is being sent.
The <tt>agg_param</tt> field is an opaque, VDAF-specific aggregation parameter. The
<tt>helper_state</tt> parameter contains the helper's state. This is an optional parameter
of an aggregate request that the helper can use to carry state across requests and across aggregate flows.</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 AggregateInitReq message as
the payload. The media type is "message/ppm-aggregate-init-req".</t>
          </section>
          <section anchor="helper-initialization">
            <name>Helper Initialization</name>
            <t>Each helper begins their portion of the aggregate initialization phase with the set
of candidate report shares obtained in an <tt>AggregateInitReq</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>AggregateInitReq.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>AggregateInitReq.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>AggregateInitReq.report_shares</tt>, the
helper then creates an AggregateInitResp 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 {
  opaque helper_state<0..2^16>;
  PrepareStep prepare_steps<1..2^16-1>;
} AggregateInitResp;
]]></artwork>
            <t>The <tt>helper_state</tt> parameter contains the helper's initial state. This is an
optional parameter of an aggregate request that the helper can use to carry
state across requests. At least part of the state will usually need to be
encrypted in order to protect user privacy. However, the details of precisely
how the state is encrypted and the information that it carries is up to the
helper implementation.</t>
            <t>[[OPEN ISSUE: we may end up removing helper_state. See #185]]</t>
            <t>The rest of the message is a sequence of PrepareStep values, the order of which
matches that of the ReportShare values in <tt>AggregateInitReq.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 200 OK whose body is the
AggregateInitResp and media type is "message/ppm-aggregate-init-resp".</t>
            <t>Upon receipt of a helper's AggregateInitResp message, the leader checks that the
sequence of PrepareStep messages corresponds to the ReportShare sequence of the
AggregateInitReq. 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[
context = SetupBaseR(encrypted_input_share.enc, sk, task_id ||
                     "ppm-00 input share" || 0x01 || server_role)

input_share = context.Open(nonce || extensions,
                           encrypted_input_share.payload)
]]></artwork>
            <t>where <tt>sk</tt> is the HPKE secret key, <tt>task_id</tt> is the task ID, <tt>nonce</tt> and
<tt>extensions</tt> are the nonce and extensions of the report share respectively,
and <tt>server_role</tt> is 0x02 if the aggregator is the leader and 0x03 otherwise.
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. 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_param, agg_param, nonce, input_share)
out = VDAF.prep_next(prep_state, None)
]]></artwork>
            <t><tt>vdaf_verify_param</tt> is the public VDAF parameter, and <tt>agg_param</tt> is the opaque aggregation
parameter. If either step fails, the aggregator marks the report as invalid with error
<tt>vdaf-prep-error</tt>.</t>
            <t>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 parameters. 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 {
  opaque helper_state<0..2^16>;
  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/ppm-aggregate-continue-req".</t>
          </section>
          <section anchor="helper-continuation">
            <name>Helper Continuation</name>
            <t>The helper continues with preparation for a report share by combining the leader's input
message in <tt>AggregateContinueReq</tt> and its current preparation state (<tt>prep_state</tt>). This
step yields one of three outputs:</t>
            <ol spacing="normal" type="1"><li>An error, in which case the input report share is marked as invalid.</li>
              <li>An output share, in which case the helper stores the output share for future collection
as described in <xref target="collect-flow"/>.</li>
              <li>An updated VDAF state and preparation message, denoted <tt>(prep_state, prep_msg)</tt>.</li>
            </ol>
            <t>To carry out this step, for each PrepareStep in AggregateContinueReq.prepare_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 {
  opaque helper_state<0..2^16>;
  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 200 OK whose body
is the AggregateContinueResp and media type is "message/ppm-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
PPM 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 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 PPM 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.</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 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;
  uint64 report_count;
  opaque checksum[32];
  opaque helper_state<0..2^16>;
} AggregateShareReq;
]]></artwork>
          <ul spacing="normal">
            <li>
              <tt>task_id</tt> is the task ID associated with the PPM parameters.</li>
            <li>
              <tt>batch_interval</tt> is the batch interval of the request.</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>
            <li>
              <tt>helper_state</tt> is the helper's state, which is carried across requests from
the leader.</li>
          </ul>
          <t>To handle the leader's request, the helper first ensures that the request meets
the requirements for batch parameters following the procedure in
<xref target="batch-parameter-validation"/>. If the batch parameters are invalid, then it
<bcp14>MUST</bcp14> abort with error "batchInvalid".</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 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, context = SetupBaseS(pk, AggregateShareReq.task_id ||
                              "ppm-00 aggregate share" || server_role || 0x00)

encrypted_agg_share = context.Seal(AggregateShareReq.batch_interval,
                                   agg_share)
]]></artwork>
          <t>where <tt>pk</tt> is the HPKE public key encoded by the collector's HPKE key,
and server_role is 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[
context = SetupBaseR(enc_share.enc, sk,
                     "ppm-00 aggregate share" ||
                     task_id || server_role || 0x00)
agg_share = context.Open(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 a given 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 PPM 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 PPM 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, it aborts and alerts the peer with
"invalid batch interval".</t>
          <t>Next, the aggregator checks that the request respects the generic privacy
parameters of the PPM 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 aborts and alerts the peer
with "insufficient batch size".</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 helper aborts and alerts the
peer with "request exceeds the batch's privacy budget".</li>
          </ul>
        </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 PPM. 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="collect-flow"/>.</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>PPM protocols have 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 PPM 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 with optional support for state offloading. 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 PPM 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>
            <li>Store helper state.</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 PPM 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. (The helper may store its aggregate
shares in its encrypted state, thereby offloading this state to the leader.)
This is due to the requirement that the batch interval respect the boundaries
defined by the PPM parameters. (See <xref target="batch-parameter-validation"/>.)</t>
        </section>
      </section>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>Prio assumes a powerful adversary with the ability to compromise an unbounded
number of clients. In doing so, the adversary can provide malicious (yet
truthful) inputs to the aggregation function. Prio also assumes that all but one
server operates honestly, where a dishonest server does not execute the protocol
faithfully as specified. The system also assumes that servers communicate over
secure and mutually authenticated channels. In practice, this can be done by TLS
or some other form of application-layer authentication.</t>
      <t>In the presence of this adversary, Prio provides two important properties for
computing an aggregation function F:</t>
      <ol spacing="normal" type="1"><li>Privacy. The aggregators and collector learn only the output of F computed
over all client inputs, and nothing else.</li>
        <li>Robustness. As long as the aggregators execute the input-validation protocol
correctly, a malicious client can skew the output of F only by reporting
false (untruthful) input. The output cannot be influenced in any other way.</li>
      </ol>
      <t>There are several additional constraints that a Prio deployment must satisfy in
order to achieve these goals:</t>
      <ol spacing="normal" type="1"><li>Minimum batch size. The aggregation batch size has an obvious impact on
privacy. (A batch size of one hides nothing of the input.)</li>
        <li>Aggregation function choice. Some aggregation functions leak slightly more
than the function output itself.</li>
      </ol>
      <t>[TODO: discuss these in more detail.]</t>
      <section anchor="threat-model">
        <name>Threat model</name>
        <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 PPM
leader, without requiring any server participating in PPM 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 PPM 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 PPM
task if the minimum batch size is too small. This document does not specify how
to choose minimum batch sizes.</t>
        <t>The PPM 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, PPM 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 PPM 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/ppm-specification/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="task-configuration"/>: "application/ppm-hpke-config"</li>
          <li>Report <xref target="upload-request"/>: "message/ppm-report"</li>
          <li>AggregateInitReq <xref target="collect-flow"/>: "message/ppm-aggregate-init-req"</li>
          <li>AggregateInitResp <xref target="collect-flow"/>: "message/ppm-aggregate-init-resp"</li>
          <li>AggregateContinueReq <xref target="collect-flow"/>: "message/ppm-aggregate-continue-req"</li>
          <li>AggregateContinueResp <xref target="collect-flow"/>: "message/ppm-aggregate-continue-resp"</li>
          <li>AggregateShareReq <xref target="collect-flow"/>: "message/ppm-aggregate-share-req"</li>
          <li>AggregateShareResp <xref target="collect-flow"/>: "message/ppm-aggregate-share-resp"</li>
          <li>CollectReq <xref target="collect-flow"/>: "message/ppm-collect-req"</li>
          <li>CollectResp <xref target="collect-flow"/>: "message/ppm-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="applicationppm-hpke-config-media-type">
          <name>"application/ppm-hpke-config" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>ppm-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="messageppm-report-media-type">
          <name>"message/ppm-report" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>ppm-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="messageppm-aggregate-continue-req-media-type">
          <name>"message/ppm-aggregate-continue-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>ppm-aggregate-init-req</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="collect-flow"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="messageppm-aggregate-init-resp-media-type">
          <name>"message/ppm-aggregate-init-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>ppm-aggregate-init-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="messageppm-aggregate-continue-req-media-type-1">
          <name>"message/ppm-aggregate-continue-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>ppm-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="messageppm-aggregate-continue-resp-media-type">
          <name>"message/ppm-aggregate-continue-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>init</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>ppm-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="messageppm-aggregate-share-req-media-type">
          <name>"message/ppm-aggregate-share-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>ppm-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="messageppm-aggregate-share-resp-media-type">
          <name>"message/ppm-aggregate-share-resp" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>ppm-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="messageppm-collect-req-media-type">
          <name>"message/ppm-collect-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>ppm-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="messageppm-collect-req-media-type-1">
          <name>"message/ppm-collect-req" media type</name>
          <dl>
            <dt>Type name:</dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>ppm-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="ppm-urn-space">
        <name>URN Sub-namespace for PPM (urn:ietf:params:ppm)</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:  ppm

Specification:  [[THIS DOCUMENT]]

Repository:  http://www.iana.org/assignments/ppm

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="I-D.irtf-cfrg-hpke">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="Richard L. Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Karthik Bhargavan">
              <organization>Inria</organization>
            </author>
            <author fullname="Benjamin Lipp">
              <organization>Inria</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="2" month="September" year="2021"/>
            <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.

 This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.
              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-hpke-12"/>
        </reference>
        <reference anchor="RFC7807">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="E. Wilde" initials="E." surname="Wilde">
              <organization/>
            </author>
            <date month="March" year="2016"/>
            <abstract>
              <t>This document defines a "problem detail" as a way to carry machine- readable details of errors in a HTTP response to avoid the need to define new error response formats for HTTP APIs.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7807"/>
          <seriesInfo name="DOI" value="10.17487/RFC7807"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes.  It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5861">
          <front>
            <title>HTTP Cache-Control Extensions for Stale Content</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document defines two independent HTTP Cache-Control extensions that allow control over the use of stale responses by caches.  This  document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5861"/>
          <seriesInfo name="DOI" value="10.17487/RFC5861"/>
        </reference>
        <reference anchor="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 L. Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Christopher Patton">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Phillipp Schoppmann">
              <organization>Google</organization>
            </author>
            <date day="27" month="April" 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-00"/>
        </reference>
        <reference anchor="RFC8555">
          <front>
            <title>Automatic Certificate Management Environment (ACME)</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes">
              <organization/>
            </author>
            <author fullname="J. Hoffman-Andrews" initials="J." surname="Hoffman-Andrews">
              <organization/>
            </author>
            <author fullname="D. McCarney" initials="D." surname="McCarney">
              <organization/>
            </author>
            <author fullname="J. Kasten" initials="J." surname="Kasten">
              <organization/>
            </author>
            <date month="March" year="2019"/>
            <abstract>
              <t>Public Key Infrastructure using X.509 (PKIX) certificates are used for a number of purposes, the most significant of which is the authentication of domain names.  Thus, certification authorities (CAs) in the Web PKI are trusted to verify that an applicant for a certificate legitimately represents the domain name(s) in the certificate.  As of this writing, this verification is done through a collection of ad hoc mechanisms.  This document describes a protocol that a CA and an applicant can use to automate the process of verification and certificate issuance.  The protocol also provides facilities for other certificate management functions, such as certificate revocation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8555"/>
          <seriesInfo name="DOI" value="10.17487/RFC8555"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+296Xrb2Jkw+P9cBVr+YckhacllVzlyllZ5qdKX8jKWKklP
jdsCCVBETAIMAEpmXO5rmWuZK5t3Pec9ACi70tXfk3nGeiqxRAJnffd1PB67
tmiX+XGy96Ro2rqYbto8S04uL+v8Mm2Lqkxe1VVbzaplMq9q+KO4Smdb+Ddv
8vqqKC+T53nabOp8lZftnkun0zq/Ok6enLwav3r13GXVrExXMHxWp/N2XOTt
fLxer8ZZuh4fHrpZ2uaXVb09Tpo2c8W6Pk7aetO09w4Pf3t4z6V1nh4nZ08f
O9e0aZm9TZdVCYNt88ati+PkJ1jYKGmquq3zeQO/bVf8C0y7StdrWN4b59JN
u6jqY5eMXcI/RdkcJ+eT5Lu8ulzAPkv9gtd6Xqz6X1U1/FH8g87kODk9e/2d
fpOv0mIJCy9Wl/DSb3CP/36Jn01m1cp1p308SV6lbVt15ny8qOH8q/Uirzvf
xxM/XlabbL6Ek+lMP8MB1vTmp5bwdJK8zptZVS/TeBFP62LW+yqe/3n1j2IZ
vpTJ83f1v9ftfLVrxyeT5C9Vle3ecueBz91zev3vizzFe54WbTMp89Y5V5QA
qSt49yo/hsUkj7/79uibY3pVYR3AuDpmYG7zUfK6mgLQjRIAseRsli7T6TJP
Hler9aZlHKjmHiXy5Aw/bNpi1uzRoBl8eJzcOzz6Znz41fjoPs+U1pd5C1Mt
2nbdHN+9O6u367aaIBzD8rJJnm3urmEZd9fpOq8n62zOo3lopZ8xH+H3E1hO
XRdwKuPvium0ib9+Mkm+BcRY4G6//fbxd9+dHv023vD/mdfV+E9ldb3Ms8sc
cbqaNwns7Cyf1Xk7PlvA6WbJk7RNk6siTZ5tlstt8kNR5inA4+NXna3eOxof
wn8Phreaw77KdlKks3oCN3kXjua3d48ePrxhg34H0adP8dPtMv9Fh/EC8LpY
Tqs0/vg/Jslps0iLcEb3juIz+qG4XLTXOf5/cp7PFmXx903eBLIHV/99nl5t
k++Lts3r/+aR3Du6CxDzL3MkT6rN4b34PM4XAOvbabFMTto2nb3r7Pfe+OgQ
/hve77Io300a3PQlADdQhbuzRbqGU7t7dDg5Ojz85u5X4wf3D8f3H3xz/+H4
4dt79284if81weXN8k2NK/1zmh193V8pousyf1+0W8TWJ8V8ntfAkop0qUyr
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
N4RAWQEA

-->

</rfc>
