<?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.7.17 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wang-ppm-dap-taskprov-07" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title>Task Binding and In-Band Provisioning for DAP</title>
    <seriesInfo name="Internet-Draft" value="draft-wang-ppm-dap-taskprov-07"/>
    <author fullname="Shan Wang">
      <organization>Apple Inc.</organization>
      <address>
        <email>shan_wang@apple.com</email>
      </address>
    </author>
    <author fullname="Christopher Patton">
      <organization>Cloudflare</organization>
      <address>
        <email>chrispatton+ietf@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="July" day="08"/>
    <area>Security</area>
    <workgroup>Privacy Preserving Measurement</workgroup>
    <keyword>next generation</keyword>
    <keyword>unicorn</keyword>
    <keyword>sparkling distributed ledger</keyword>
    <abstract>
      <?line 46?>

<t>An extension for the Distributed Aggregation Protocol (DAP) is specified that
cryptographically binds the parameters of a task to the task's execution. In
particular, when a client includes this extension with its report, the servers
will only aggregate the report if all parties agree on the task parameters.
This document also specifies an optional mechanism for in-band task
provisioning that builds on the report extension.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://wangshan.github.io/draft-wang-ppm-dap-taskprov/draft-wang-ppm-dap-taskprov.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-wang-ppm-dap-taskprov/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Privacy Preserving Measurement Working Group mailing list (<eref target="mailto:ppm@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ppm/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ppm/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/wangshan/draft-wang-ppm-dap-taskprov"/>.</t>
    </note>
  </front>
  <middle>
    <?line 56?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The DAP protocol <xref target="DAP"/> enables secure aggregation
of a set of reports submitted by Clients. This process is centered around a
"task" that determines, among other things, the cryptographic scheme to use for
the secure computation (a Verifiable Distributed Aggregation Function
<xref target="VDAF"/>), how reports are partitioned into
batches, and privacy parameters such as the minimum size of each batch. See
<xref section="4.2" sectionFormat="of" target="DAP"/> for a complete listing.</t>
      <t>In order to execute a task securely, it is required that all parties agree on
all parameters associated with the task. However, the core DAP specification
does not specify a mechanism for accomplishing this. In particular, it is
possible that the parties successfully aggregate and collect a batch, but some
party does not know the parameters that were enforced.</t>
      <t>A desirable property for DAP to guarantee is that successful execution implies
agreement on the task parameters. On the other hand, disagreement between a
Client and the Aggregators should prevent reports uploaded by that Client from
being processed.</t>
      <t><xref target="definition"/> specifies a report extension (<xref section="4.4.3" sectionFormat="of" target="DAP"/>) that
endows DAP with this property. First, it specifies an encoding of all task
parameters that are relevant to all parties. This excludes cryptographic
assets, such as the secret VDAF verification key (<xref section="5" sectionFormat="of" target="VDAF"/>) or
the public HPKE configurations <xref target="RFC9180"/> of the aggregators or collector.
Second, the task ID is computed by hashing the encoded parameters. If a report
includes the extension, then each aggregator checks if the task ID was computed
properly: if not, it rejects the report. This cryptographic binding of the task
to its parameters ensures that the report is only processed if the client and
aggregator agree on the task parameters.</t>
      <t>One reason this task-binding property is desirable is that it makes the process
by which parties are provisioned with task parameters more robust. This is
because misconfiguration of a party would manifest in a server's telemetry as
report rejection. This is preferable to failing silently, as misconfiguration
could result in privacy loss.</t>
      <t><xref target="taskprov"/> specifies one possible mechanism for provisioning DAP tasks that
is built on top of the extension in <xref target="definition"/>. Its chief design goal is to
make task configuration completely in-band, via HTTP request headers. Note that
this mechanism is an optional feature of this specification; it is not required
to implement the protocol extension in <xref target="definition"/>.</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>
      <?line -18?>

<t>This document uses the same conventions for error handling as <xref target="DAP"/>. In
addition, this document extends the core specification by adding the following
error types:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Type</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">invalidTask</td>
            <td align="left">An Aggregator has opted out of the indicated task as described in <xref target="provisioning-a-task"/></td>
          </tr>
        </tbody>
      </table>
      <t>The terms used follow those described in <xref target="DAP"/>. The following new terms are
used:</t>
      <dl>
        <dt>Task configuration:</dt>
        <dd>
          <t>The non-secret parameters of a task.</t>
        </dd>
        <dt>Task author:</dt>
        <dd>
          <t>The entity that defines a task's configuration in the provisioning mechanism of <xref target="taskprov"/>.</t>
        </dd>
      </dl>
    </section>
    <section anchor="definition">
      <name>The Taskbind Extension</name>
      <t>To use the Taskbind extension, the Client includes the following extension in
the report extensions for each Aggregator as described in <xref section="4.4.3" sectionFormat="of" target="DAP"/>:</t>
      <t>[RFC EDITOR: Change this to the IANA-assigned codepoint.]</t>
      <artwork><![CDATA[
enum {
    taskbind(0xff00),
    (65535)
} ExtensionType;
]]></artwork>
      <t>The payload of the extension <bcp14>MUST</bcp14> be empty. If the payload is non-empty, then
the Aggregator <bcp14>MUST</bcp14> reject the report.</t>
      <t>When the client uses the Taskbind extension, it computes the task ID (<xref section="4.2" sectionFormat="of" target="DAP"/>) as follows:</t>
      <artwork><![CDATA[
task_id = SHA-256(task_config)
]]></artwork>
      <t>where <tt>task_config</tt> is a <tt>TaskConfig</tt> structure defined in <xref target="task-encoding"/>.
Function SHA-256() is as defined in <xref target="SHS"/>.</t>
      <t>The task ID is bound to each report share (via HPKE authenticated and
associated data, see <xref section="4.4.2" sectionFormat="of" target="DAP"/>). Binding the parameters to the
ID this way ensures, in turn, that the report is only aggregated if the Client
and Aggregator agree on the parameters. This is accomplished by the Aggregator
behavior below.</t>
      <t>During aggregation (<xref section="4.5" sectionFormat="of" target="DAP"/>), each Aggregator processes a
report with the Taskbind extension as follows.</t>
      <t>First, it looks up the ID and parameters associated with the task. Note the
task has already been configured; otherwise the Aggregator would have already
aborted the request due to not recognizing the task.</t>
      <t>Next, the Aggregator encodes the parameters as a <tt>TaskConfig</tt> defined in
<xref target="task-encoding"/> and computes the task ID as above. If the derived task ID
does not match the task ID of the request, then it <bcp14>MUST</bcp14> reject the report with
error "invalid_message".</t>
      <t>During the upload flow (<xref section="4.4" sectionFormat="of" target="DAP"/>), the Leader <bcp14>SHOULD</bcp14> abort the
request with "unrecognizedTask" if the derived task ID does not match the task
ID of the request.</t>
      <section anchor="task-encoding">
        <name>Task Encoding</name>
        <t>The task configuration is encoded as follows:</t>
        <artwork><![CDATA[
struct {
    /* Info specific for a task. */
    opaque task_info<1..2^8-1>;

    /* Leader API endpoint as defined in I-D.draft-ietf-ppm-dap-09. */
    Url leader_aggregator_endpoint;

    /* Helper API endpoint as defined in I-D.draft-ietf-ppm-dap-09. */
    Url helper_aggregator_endpoint;

    /* This determines the query type for batch selection and the
    properties that all batches for this task must have. */
    opaque query_config<1..2^16-1>;

    /* Time up to which Clients are allowed to upload to this task.
    Defined in I-D.draft-ietf-ppm-dap-09. */
    Time task_expiration;

    /* Determines the VDAF type and its config parameters. */
    opaque vdaf_config<1..2^16-1>;
} TaskConfig;
]]></artwork>
        <t>The purpose of <tt>TaskConfig</tt> is to define all parameters that are necessary for
configuring each party. It includes all the fields to be associated with a
task. In addition to the Aggregator endpoints, maximum batch query count, and
task expiration, the structure includes an opaque <tt>task_info</tt> field that is
specific to a deployment. For example, this can be a string describing the
purpose of this task. It does not include cryptographic assets shared by only a
subset of the parties, including the secret VDAF verification key <xref target="VDAF"/> or
public HPKE configurations <xref target="RFC9180"/>.</t>
        <t>The opaque <tt>query_config</tt> field defines the DAP query configuration used to
guide batch selection. Its content is structured as follows:</t>
        <artwork><![CDATA[
struct {
    Duration time_precision;
    uint16 max_batch_query_count;
    uint32 min_batch_size;
    QueryType query_type;
    select (QueryConfig.query_type) {
        case time_interval: Empty;
        case fixed_size:    uint32 max_batch_size;
    };
} QueryConfig;
]]></artwork>
        <t>The length prefix of the <tt>query_config</tt> ensures that the <tt>QueryConfig</tt> structure
can be decoded even if an unrecognized variant is encountered (i.e., an
unimplemented query type).</t>
        <t>The maximum batch size for <tt>fixed_size</tt> query is optional. If <tt>query_type</tt> is
<tt>fixed_size</tt> and <tt>max_batch_size</tt> is 0, then the task does not have maximum
batch size limit. In particular, during batch validation (<xref section="4.6.5.2.2" sectionFormat="of" target="DAP"/>), the Aggregator does not check <tt>len(X) &lt;= max_batch_size</tt>, where <tt>X</tt>
is the set of reports successfully aggregated into the batch.</t>
        <t>The <tt>vdaf_config</tt> defines the configuration of the VDAF in use for this task.
Its content is as follows (codepoints are as defined in <xref target="VDAF"/>):</t>
        <artwork><![CDATA[
enum {
    prio3_count(0x00000000),
    prio3_sum(0x00000001),
    prio3_sum_vec(0x00000002),
    prio3_histogram(0x00000003),
    poplar1(0x00001000),
    (2^32-1)
} VdafType;

struct {
    opaque dp_config<1..2^16-1>;  /* Encoded differential privacy parameters */
    VdafType vdaf_type;
    select (VdafConfig.vdaf_type) {
        case prio3_count:
            Empty;
        case prio3_sum:
            uint8;  /* bit length of the summand */
        case prio3_sum_vec:
            uint32; /* length of the vector */
            uint8;  /* bit length of each summand */
            uint32; /* size of each proof chunk */
        case prio3_histogram:
            uint32; /* number of buckets */
            uint32; /* size of each proof chunk */
        case poplar1:
            uint16; /* bit length of input string */
    };
} VdafConfig;
]]></artwork>
        <t>The length prefix of the <tt>vdaf_config</tt> ensures that the <tt>VdafConfig</tt> structure
can be decoded even if an unrecognized variant is encountered (i.e., an
unimplemented VDAF).</t>
        <t>Apart from the VDAF-specific parameters, this structure includes a mechanism for
differential privacy (DP). The opaque <tt>dp_config</tt> contains the following structure:</t>
        <artwork><![CDATA[
enum {
    reserved(0), /* Reserved for testing purposes */
    none(1),
    aggregator_discrete_gaussian(5),
    (255)
} DpMechanism;

struct {
    DpMechanism dp_mechanism;
    select (DpConfig.dp_mechanism) {
        case none: Empty;
        case aggregator_discrete_gaussian:
          RealNumber sigma;
          RealNumber sensititivity;
    };
} DpConfig;
]]></artwork>
        <ul empty="true">
          <li>
            <t>OPEN ISSUE: Should spell out definition of <tt>DpConfig</tt> for various differential
privacy mechanisms and parameters. See draft
<eref target="https://github.com/wangshan/draft-wang-ppm-differential-privacy">draft</eref> for discussion.</t>
          </li>
        </ul>
        <t>The length prefix of the <tt>dp_config</tt> ensures that the <tt>DpConfig</tt> structure can
be decoded even if an unrecognized variant is encountered (i.e., an
unimplemented DP mechanism).</t>
        <t>The definition of <tt>Time</tt>, <tt>Duration</tt>, <tt>Url</tt>, and <tt>QueryType</tt> follow those in
<xref target="DAP"/>.</t>
      </section>
    </section>
    <section anchor="taskprov">
      <name>In-band Task Provisioning with the Taskbind Extension</name>
      <t>Before a task can be executed, it is necessary to first provision the Clients,
Aggregators, and Collector with the task's configuration. The core DAP
specification does not define a mechanism for provisioning tasks. This section
describes a mechanism whose key feature is that task configuration is
performed completely in-band, via HTTP request headers.</t>
      <t>This method presumes the existence of a logical "task author" (written as
"Author" hereafter) who is capable of pushing configurations to Clients. All
parameters required by downstream entities (the Aggregators and Collector) are
carried by HTTP headers piggy-backed on the protocol flow.</t>
      <t>This mechanism is designed with the same security and privacy considerations of
the core DAP protocol. The Author is not regarded as a trusted third party: it
is incumbent on all protocol participants to verify the task configuration
disseminated by the Author and opt-out if the parameters are deemed insufficient
for privacy. In particular, adopters of this mechanism should presume the
Author is under the adversary's control. In fact, we expect in a real-world
deployment that the Author may be co-located with the Collector.</t>
      <t>The DAP protocol also requires configuring the entities with a variety of assets
that are not task-specific, but are important for establishing
Client-Aggregator, Collector-Aggregator, and Aggregator-Aggregator
relationships. These include:</t>
      <ul spacing="normal">
        <li>
          <t>The Collector's HPKE <xref target="RFC9180"/> configuration used by the Aggregators to
encrypt aggregate shares.</t>
        </li>
        <li>
          <t>Any assets required for authenticating HTTP requests.</t>
        </li>
      </ul>
      <t>This section does not specify a mechanism for provisioning these assets; as in
the core DAP protocol; these are presumed to be configured out-of-band.</t>
      <t>Note that we consider the VDAF verification key <xref target="VDAF"/>, used by the
Aggregators to aggregate reports, to be a task-specific asset. This document
specifies how to derive this key for a given task from a pre-shared secret,
which in turn is presumed to be configured out-of-band.</t>
      <section anchor="overview">
        <name>Overview</name>
        <t>The process of provisioning a task begins when the Author disseminates the task
configuration to the Collector and each of the Clients. When a Client issues an
upload request to the Leader (as described in <xref section="4.3" sectionFormat="of" target="DAP"/>), it
includes in an HTTP header the task configuration it used to generate the
report. We refer to this process as "task advertisement". Before consuming the
report, the Leader parses the configuration and decides whether to opt-in; if
not, the task's execution halts.</t>
        <t>Otherwise, if the Leader does opt-in, it advertises the task to the Helper
during the aggregation protocol (<xref section="4.4" sectionFormat="of" target="DAP"/>). In particular, it
includes the task configuration in an HTTP header of each aggregation job
request for that task. Before proceeding, the Helper must first parse the
configuration and decide whether to opt-in; if not, the task's execution halts.</t>
      </section>
      <section anchor="task-advertisement">
        <name>Task Advertisement</name>
        <t>To advertise a task to its peer, a protocol participant includes a header
"dap-taskprov" with a request incident to the task execution. The value is the
<tt>TaskConfig</tt> structure defined <xref target="task-encoding"/>, expanded into its URL-safe,
unpadded Base 64 representation as specified in Sections <xref target="RFC4648" section="5" sectionFormat="bare"/> and <xref target="RFC4648" section="3.2" sectionFormat="bare"/> of <xref target="RFC4648"/>.</t>
      </section>
      <section anchor="vdaf-verify-key">
        <name>Deriving the VDAF Verification Key</name>
        <t>When a Leader and Helper implement this mechanism, they <bcp14>SHOULD</bcp14> compute the
shared VDAF verification key <xref target="VDAF"/> as described in this section.</t>
        <t>The Aggregators are presumed to have securely exchanged a pre-shared secret
out-of-band. The length of this secret <bcp14>MUST</bcp14> be 32 bytes. Let us denote this
secret by <tt>verify_key_init</tt>.</t>
        <t>Let <tt>VERIFY_KEY_SIZE</tt> denote the length of the verification key for the VDAF
indicated by the task configuration. (See <xref section="5" sectionFormat="comma" target="VDAF"/>.)</t>
        <t>The VDAF verification key used for the task is computed as follows:</t>
        <artwork><![CDATA[
verify_key = HKDF-Expand(
    HKDF-Extract(
        taskprov_salt,   # salt
        verify_key_init, # IKM
    ),
    task_id,             # info
    VERIFY_KEY_SIZE,     # L
)
]]></artwork>
        <t>where <tt>taskprov_salt</tt> is defined to be the SHA-256 hash of the octet string
"dap-taskprov" and <tt>task_id</tt> is as defined in <xref target="definition"/>. Functions
HKDF-Extract() and HKDF-Expand() are as defined in <xref target="RFC5869"/>. Both functions
are instantiated with SHA-256.</t>
      </section>
      <section anchor="provisioning-a-task">
        <name>Opting into a Task</name>
        <t>Prior to participating in a task, each protocol participant must determine if
the <tt>TaskConfig</tt> disseminated by the Author can be configured. The participant
is said to "opt in" to the task if the derived task ID (see
<xref target="definition"/>) corresponds to an already configured task or the task ID
is unrecognized and therefore corresponds to a new task.</t>
        <t>A protocol participant <bcp14>MAY</bcp14> "opt out" of a task if:</t>
        <ol spacing="normal" type="1"><li>
            <t>The derived task ID corresponds to an already configured task, but the task
configuration disseminated by the Author does not match the existing
configuration.</t>
          </li>
          <li>
            <t>The VDAF, DP, or query configuration is deemed insufficient for privacy.</t>
          </li>
          <li>
            <t>A secure connection to one or both of the Aggregator endpoints could not be
established.</t>
          </li>
          <li>
            <t>The task lifetime is too long.</t>
          </li>
        </ol>
        <t>A protocol participant <bcp14>MUST</bcp14> opt out if the task has expired or if it does not
support an indicated task parameter (e.g., VDAF, DP mechanism, or query type).</t>
        <t>The behavior of each protocol participant is determined by whether or not they
opt in to a task.</t>
      </section>
      <section anchor="hpke-config-no-task-id">
        <name>Supporting HPKE Configurations Independent of Tasks</name>
        <t>In DAP, Clients need to know the HPKE configuration of each Aggregator before
sending reports. (See HPKE Configuration Request in <xref target="DAP"/>.) However, in a
DAP deployment that supports the task provisioning mechanism described in this
section, if a Client requests the Aggregator's HPKE configuration with the task
ID computed as described in <xref target="definition"/>, the task ID may not be configured
in the Aggregator yet, because the Aggregator is still waiting for the task to
be advertised by a Client.</t>
        <t>To mitigate this issue, each Aggregator <bcp14>SHOULD</bcp14> choose which HPKE configuration
to advertise to Clients independent of the task ID. It <bcp14>MAY</bcp14> continue to support
per-task HPKE configurations for other tasks that are configured out-of-band.</t>
        <t>In addition, if a Client intends to advertise a task via the Taskbind extension,
it <bcp14>SHOULD NOT</bcp14> specify the <tt>task_id</tt> parameter when requesting the HPKE
configuration from an Aggregator.</t>
      </section>
      <section anchor="client-behavior">
        <name>Client Behavior</name>
        <t>Upon receiving a <tt>TaskConfig</tt> from the Author, the Client decides whether to
opt into the task as described in <xref target="provisioning-a-task"/>. If the Client opts
out, it <bcp14>MUST</bcp14> not attempt to upload reports for the task.</t>
        <ul empty="true">
          <li>
            <t>OPEN ISSUE: In case of opt-out, would it be useful to specify how to report
this to the Author?</t>
          </li>
        </ul>
        <t>Once the client opts into a task, it may begin uploading reports for the task
to the Leader. The extension codepoint <tt>taskbind</tt> <bcp14>MUST</bcp14> be offered in the
<tt>extensions</tt> field of both Leader and Helper's <tt>PlaintextInputShare</tt>. In
addition, each report's task ID <bcp14>MUST</bcp14> be computed as described in <xref target="definition"/>.</t>
        <t>The Client <bcp14>SHOULD</bcp14> advertise the task configuration by specifying the encoded
<tt>TaskConfig</tt> described in <xref target="definition"/> in the "dap-taskprov" HTTP header, but
<bcp14>MAY</bcp14> choose to omit this header in order to save network bandwidth. However, the
Leader may respond with "unrecognizedTask" if it has not been configured with
this task. In this case, the Client <bcp14>MUST</bcp14> retry the upload request with the
"dap-taskprov" HTTP header.</t>
      </section>
      <section anchor="leader-behavior">
        <name>Leader Behavior</name>
        <section anchor="upload-protocol">
          <name>Upload Protocol</name>
          <t>Upon receiving a Client report, if the Leader does not support the <xref target="taskprov"/>
mechanism, it will ignore the "dap-taskprov" HTTP header. In particular, if the
task ID is not recognized, then it <bcp14>MUST</bcp14> abort the upload request with
"unrecognizedTask".</t>
          <t>Otherwise, if the Leader does support this mechanism, it first checks if the
"dap-taskprov" HTTP header is specified. If not, that means the Client has
skipped task advertisement. If the Leader recognizes the task ID, it will
include the client report in the aggregation of that task ID. Otherwise, it
<bcp14>MUST</bcp14> abort with "unrecognizedTask". The Client will then retry with the task
advertisement.</t>
          <t>If the Client advertises the task, the Leader checks that the task ID indicated
by the upload request matches the task ID derived from the extension payload as
specified in <xref target="definition"/>. If the task ID does not match, then the Leader <bcp14>MUST</bcp14>
abort with "unrecognizedTask".</t>
          <t>The Leader then decides whether to opt in to the task as described in
<xref target="provisioning-a-task"/>. If it opts out, it <bcp14>MUST</bcp14> abort the upload request with
"invalidTask".</t>
          <ul empty="true">
            <li>
              <t>OPEN ISSUE: In case of opt-out, would it be useful to specify how to report
this to the Author?</t>
            </li>
          </ul>
          <t>Finally, once the Leader has opted in to the task, it completes the upload
request as usual.</t>
          <t>During the upload flow, if the Leader's report share does not present a
<tt>taskbind</tt> extension type, Leader <bcp14>MUST</bcp14> abort the upload request with
"invalidMessage".</t>
        </section>
        <section anchor="aggregate-protocol">
          <name>Aggregate Protocol</name>
          <t>When the Leader opts in to a task, it <bcp14>SHOULD</bcp14> derive the VDAF verification key
for that task as described in <xref target="vdaf-verify-key"/>. The Leader <bcp14>MUST</bcp14> advertise
the task to the Helper in every request incident to the task as described in
<xref target="definition"/>.</t>
        </section>
        <section anchor="collect-protocol">
          <name>Collect Protocol</name>
          <t>The Collector might issue a collect request for a task provisioned by this
mechanism prior to opting into the task. In this case, the Leader would need to
abort the collect request with "unrecognizedTask". When it does so, it is up to
the Collector to retry its request.</t>
          <ul empty="true">
            <li>
              <t>OPEN ISSUE: This semantics is awkward, as there's no way for the Leader to
distinguish between Collectors who support this mechanism and those that don't.</t>
            </li>
          </ul>
          <t>The Leader <bcp14>MUST</bcp14> advertise the task in every aggregate share request issued to
the Helper as described in <xref target="task-advertisement"/>.</t>
        </section>
      </section>
      <section anchor="helper-behavior">
        <name>Helper Behavior</name>
        <t>Upon receiving a task advertisement from the Leader, If the Helper does not
support this mechanism, it will ignore the "dap-taskprov" HTTP header and
process the aggregate request as usual. In particular, if the Helper does not
recognize the task ID, it <bcp14>MUST</bcp14> abort the aggregate request with error
"unrecognizedTask". Otherwise, if the Helper supports this mechanism, it
proceeds as follows.</t>
        <t>First, the Helper attempts to parse payload of the "dap-taskprov" HTTP header.
If this step fails, the Helper <bcp14>MUST</bcp14> abort with "invalidMessage".</t>
        <t>Next, the Helper checks that the task ID indicated in the upload request matches
the task ID derived from the <tt>TaskConfig</tt> as defined in <xref target="definition"/>.
If not, the Helper <bcp14>MUST</bcp14> abort with "unrecognizedTask".</t>
        <t>Next, the Helper decides whether to opt in to the task as described in
<xref target="provisioning-a-task"/>. If it opts out, it <bcp14>MUST</bcp14> abort the aggregation job
request with "invalidTask".</t>
        <ul empty="true">
          <li>
            <t>OPEN ISSUE: In case of opt-out, would it be useful to specify how to report
this to the Author?</t>
          </li>
        </ul>
        <t>Finally, the Helper completes the request as usual, deriving the VDAF
verification key for the task as described in <xref target="vdaf-verify-key"/>. For any
report share that does not include the <tt>taskbind</tt> extension with an empty
payload, the Helper <bcp14>MUST</bcp14> mark the report as invalid with error
"invalid_message" and reject it.</t>
      </section>
      <section anchor="collector-behavior">
        <name>Collector Behavior</name>
        <t>Upon receiving a <tt>TaskConfig</tt> from the Author, the Collector first decides
whether to opt into the task as described in <xref target="provisioning-a-task"/>. If the
Collector opts out, it <bcp14>MUST NOT</bcp14> attempt to upload reports for the task.</t>
        <t>Otherwise, once opted in, the Collector <bcp14>MAY</bcp14> begin to issue collect requests for
the task. The task ID for each request <bcp14>MUST</bcp14> be derived from the <tt>TaskConfig</tt> as
described in <xref target="provisioning-a-task"/>. The Collector <bcp14>MUST</bcp14> advertise the task as
described in <xref target="definition"/>.</t>
        <t>If the Leader responds to a collect request with an "unrecognizedTask" error,
the Collector <bcp14>MAY</bcp14> retry its collect request after waiting an appropriate amount
of time.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The Taskbind extension has the same security and privacy considerations as the
core DAP protocol. In addition, successful execution of a DAP task implies
agreement on the task configuration. This is providing by binding the
parameters to the task ID, which in turn is bound to each report uploaded for a
task. Furthermore, inclusion of the Taskbind extension in the report share
means Aggregators that do not implement this extension will reject the report
as required by (<xref section="4.5.1.4" sectionFormat="of" target="DAP"/>).</t>
      <t>The task provisioning mechanism in <xref target="taskprov"/> extends the threat model of DAP
by including a new logical role, called the Author. The Author is responsible
for configuring Clients prior to task execution. For privacy we consider the
Author to be under control of the adversary. It is therefore incumbent on
protocol participants to verify the privacy parameters of a task before opting
in.</t>
      <t>Another risk is that the Author could configure a unique task to fingerprint a
Client. Although Client anonymization is not guaranteed by DAP, some systems
built on top of DAP may hope to achieve this property by using a proxy server
with Oblivious HTTP <xref target="RFC9458"/> to forward Client reports to the Leader. If the
Author colludes with the Leader, the attacker can learn some metadata
information about the Client, e.g., the Client IP, user agent string, which may
deanonymize the Client. However, even if the Author succeeds in doing so, the
Author should learn nothing other than the fact that the Client has uploaded a
report, assuming the Client has verified the privacy parameters of the task
before opting into it. For example, if a task is uniquely configured for the
Client, the Client can enforce the minimum batch size is strictly more than 1.</t>
      <t>Another risk for the Aggregators is that a malicious coalition of Clients might
attempt to pollute an Aggregator's long-term storage by uploading reports for
many (thousands or perhaps millions) of distinct tasks. While this does not
directly impact tasks used by honest Clients, it does present a
Denial-of-Service risk for the Aggregators themselves. This can be mitigated by
limiting the rate at which new tasks or configured. In addition, deployments
<bcp14>SHOULD</bcp14> arrange for the Author to digitally sign the task configuration so that
Clients cannot forge task creation.</t>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <t>The Taskbind extension does not introduce any new operational considerations
for DAP.</t>
      <t>The task provisioning mechanism in <xref target="taskprov"/> is designed so that the
Aggregators do not need to store individual task configurations long-term.
Because the task configuration is advertised in each request in the upload,
aggregation, and collection protocols, the process of opting-in and deriving the
task ID and VDAF verify key can be re-run on the fly for each request. This is
useful if a large number of concurrent tasks are expected. Once an Aggregator
has opted-in to a task, the expectation is that the task is supported until it
expires. In particular, Aggregators that operate in this manner <bcp14>MUST NOT</bcp14> opt
out once they have opted in.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <ul empty="true">
        <li>
          <t>NOTE(cjpatton) Eventually we'll have IANA considerations (at the very least
we'll need to allocate a codepoint) but we can leave this blank for now.</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="SHS">
        <front>
          <title>Secure Hash Standard</title>
          <author>
            <organization/>
          </author>
          <date year="2015" month="August" day="04"/>
        </front>
        <seriesInfo name="FIPS PUB 180-4" value=""/>
      </reference>
      <reference anchor="DAP">
        <front>
          <title>Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
          <author fullname="Tim Geoghegan" initials="T." surname="Geoghegan">
            <organization>ISRG</organization>
          </author>
          <author fullname="Christopher Patton" initials="C." surname="Patton">
            <organization>Cloudflare</organization>
          </author>
          <author fullname="Brandon Pitman" initials="B." surname="Pitman">
            <organization>ISRG</organization>
          </author>
          <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
            <organization>Mozilla</organization>
          </author>
          <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
            <organization>Cloudflare</organization>
          </author>
          <date day="18" month="December" year="2023"/>
          <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>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-09"/>
      </reference>
      <reference anchor="VDAF">
        <front>
          <title>Verifiable Distributed Aggregation Functions</title>
          <author fullname="Richard Barnes" initials="R." surname="Barnes">
            <organization>Cisco</organization>
          </author>
          <author fullname="David Cook" initials="D." surname="Cook">
            <organization>ISRG</organization>
          </author>
          <author fullname="Christopher Patton" initials="C." surname="Patton">
            <organization>Cloudflare</organization>
          </author>
          <author fullname="Phillipp Schoppmann" initials="P." surname="Schoppmann">
            <organization>Google</organization>
          </author>
          <date day="20" month="November" year="2023"/>
          <abstract>
            <t>   This document describes Verifiable Distributed Aggregation Functions
   (VDAFs), a family of multi-party protocols for computing aggregate
   statistics over user measurements.  These protocols are designed to
   ensure that, as long as at least one aggregation server executes the
   protocol honestly, individual measurements are never seen by any
   server in the clear.  At the same time, VDAFs allow the servers to
   detect if a malicious or misconfigured client submitted an
   measurement that would result in an invalid aggregate result.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vdaf-08"/>
      </reference>
      <reference anchor="RFC9180">
        <front>
          <title>Hybrid Public Key Encryption</title>
          <author fullname="R. Barnes" initials="R." surname="Barnes"/>
          <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
          <author fullname="B. Lipp" initials="B." surname="Lipp"/>
          <author fullname="C. Wood" initials="C." surname="Wood"/>
          <date month="February" year="2022"/>
          <abstract>
            <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
            <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9180"/>
        <seriesInfo name="DOI" value="10.17487/RFC9180"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC4648">
        <front>
          <title>The Base16, Base32, and Base64 Data Encodings</title>
          <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
          <date month="October" year="2006"/>
          <abstract>
            <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4648"/>
        <seriesInfo name="DOI" value="10.17487/RFC4648"/>
      </reference>
      <reference anchor="RFC5869">
        <front>
          <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
          <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
          <author fullname="P. Eronen" initials="P." surname="Eronen"/>
          <date month="May" year="2010"/>
          <abstract>
            <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5869"/>
        <seriesInfo name="DOI" value="10.17487/RFC5869"/>
      </reference>
      <reference anchor="RFC9458">
        <front>
          <title>Oblivious HTTP</title>
          <author fullname="M. Thomson" initials="M." surname="Thomson"/>
          <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
          <date month="January" year="2024"/>
          <abstract>
            <t>This document describes Oblivious HTTP, a protocol for forwarding encrypted HTTP messages. Oblivious HTTP allows a client to make multiple requests to an origin server without that server being able to link those requests to the client or to identify the requests as having come from the same client, while placing only limited trust in the nodes used to forward the messages.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9458"/>
        <seriesInfo name="DOI" value="10.17487/RFC9458"/>
      </reference>
    </references>
    <?line 641?>

<section numbered="false" anchor="contributors">
      <name>Contributors</name>
      <t>Junye Chen
Apple Inc.
junyec@apple.com</t>
      <t>Suman Ganta
Apple Inc.
sganta2@apple.com</t>
      <t>Gianni Parsa
Apple Inc.
gianni_parsa@apple.com</t>
      <t>Michael Scaria
Apple Inc.
mscaria@apple.com</t>
      <t>Kunal Talwar
Apple Inc.
ktalwar@apple.com</t>
      <t>Christopher A. Wood
Cloudflare
caw@heapingbits.net</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
UdcsXjFqAAA=

-->

</rfc>
