<?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.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ppm-dap-taskprov-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title>Task Binding and In-Band Provisioning for DAP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-taskprov-00"/>
    <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="October" day="09"/>
    <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://ietf-wg-ppm.github.io/draft-ietf-ppm-dap-taskprov/draft-ietf-ppm-dap-taskprov.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-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/ietf-wg-ppm/draft-ietf-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/ietf-wg-ppm/draft-ietf-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) 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 "dap-taskprov" HTTP
header 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 aggregation 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 issue collect requests 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 provided 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 are 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>David Cook
ISRG
divergentdave@gmail.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:
H4sIAAAAAAAAA8Vd2Xocx3W+r6eogBcClJkhwS00aMkGCdBExAUmQCmKPweo
ma6ZabOne9ILhjBFP0uexU+Ws9XWPQCZREl4IQHd1bWcOuc/axXG47Fq87aw
B3rn3DQf9LO8zPJyoU2Z6ZNy/Az/f1pXV3mTVyW+mFe1Pjo83VEz09pFVV8f
6LycV0pl1aw0K+goq828Hee2nY/X69U4M+txC12voZfxvXuq6aarvMHu2us1
ND85Pn+h9R1tiqaCWcD4dm3hP2W7M9I7J4fP4H8w5s7Ju/MXO6rsVlNbH6gM
Rj9Qs6psbNl0zYFu686qqwP9QJnaGujozM66Om+vd9Smqj8s6qpbw9PTOr8y
s2tYk21sfYUrem1N09V2hSOqD/YammcHSo91aT+2emFLW5sWpouPujKfVTX9
2KxN/aHADrK8aet82rU204XNFrZWV7bsYH5af+24WjM1dn6CyeLbP+CH+Hxl
8gKeAyl/jzSdVPUCH5t6toTHy7ZdNwd372IrfJRf2Ylrdhcf3J3W1aaxd+H7
u/jdIm+X3RQJjRu0WeAe3b1ly/CbAojdtNFo0bcT7nCSV7f1ctu7ybJdFTtK
ma5dVjVSHobUet4VBTPU2dKU+idTLug5LMyU+V9pSw704XpdWODU2YReWqFW
A59cbOCT3xtsMJlVKxhh0PPzZQ17V62Xttanpm1xkwdDPC+qLpsDdW0yxAy/
XdNH/4jr+v0CX8hIZVWv4PMr4AH46Ozl2QF9q52sEXNa/dI0S33WgpCZOtvh
JsTZ+v69/Ufje0/G9x7yU2Ca3DYoaQf6xcnpmT59/0zvP7k3fqgUPg3DqfF4
rM0UWNLMWqUOSw1sDEICayHhbZdWH0Uce7hY1HZBa0VJb6tZVehdEPE9nTfA
5XaWz3No1y5Nq2b19bqtFrVZL/OZKYprPQWBbahTkAcgamvrRldzbTTur24r
eoc/f9PATGDdONIEtkzBB20+64CyI71Z2hK+mRU5iAMgyqzoMov95k00/w3w
ms7bRtd2XdXtiPpGeYJB1SYvCl2VMCcjS7L0ntvqHOYEDWhQ6NlAEwvN/fSi
+U/UOY4LiNahdBI0eUrAp6Wu1rgKU+iVnQGr5c2KaJuX4ykiJvan1jFsIvX0
tMsLIJYMKvPyq5vI3q3yLCusUneARm1dZd2M0AfmZBF59dpt0qdP/wC/f3cy
PppsEa97v/n8WdvSTAuYcsP8ZsJeK9qjxra4WTwVaIbY3CJXTK+B73Evmokm
YsCoM9s0yBMzeGxraGQAo2C1Ru3ggnd4kRmScJWXthlps6pg7VWL8gVbWS4a
3rKEjXQzWwIKIqt0jUU6Kt5WmjLI07prmT13jf4R5GCe46JuZOIXXckUA/r8
eHT4IiZQDQSazevF+Cozc5Cvz5/3RnpZbTwFQMqZRbAH6Dgv20pNTQtTxPXA
ateC5BG7N91sqQ1LAaw8X3Ur3eR/tUhaa+AddTDRZ9bCpED2aZ4PJ/exAe4h
7BSyj6HVFtCpLmBxQC/giRPgtjpDAlYiP9YJF5OouB6BTODG1Pbfu7wWWd3K
7UoeupmbpqlmuUESkmw5YZjol9XGgljJflU1854IwYxZKKug67Jq5TEIXk8e
zIwWlDdLloG8QcHXseDTzNW6AosAN5VmLmhCMwfaIt8hZseCjTsBMlAALWFU
ou8I5AumUq0sIcu19tP7UMIO9yCKBtoAG4OMwFRnNgNaHwL3NnlN7AUMv7bY
jVg8SP9FBx0A81ukNvUQphfATee4ZtsoojohyA04o9/yc5YQIFw2QmsifDe1
7cYiMiqWRlo3fuEYvkL2W1ZdgYwJGwZNHCt366IyGcsyzVW6mNfVSk0t7ogI
Na3906fMzoF5cQXAjxHcDZBK78Zc/HDyIPDxHusJMODA6iCyCV8xhBBFJ/pF
Xjct7X2CqracVWR9VozVDKO9PUMJBaa3V7ARuCcRmwtU2Y+iPRKYUcDrtgUh
jqUVJKgGCESY0FcELczaGuzAeJWPaIXYDJcoCLXupgXA18vTH46BF8t5vujY
UmwQmt+9eP4bUNBASvgUm5toy4ClhHureqJglAq33rPIyRHhLEEfb+DSOBmy
TCZ4HDPSydzvk4q0pw2bRt2XjEdhKhqAbfahQe0Yj74xYXjF+1agpT9HeaKN
q+1fYPZNpMmE+im2T8WfqEL/CjYNdXi0sWjD17YJ0u90dsMK3fOpm+fMS4OK
1nK7TldvS+zYNNQABRhajN0Evbij4vcg4MQcFrwyH4SkMhsF27KBNS4Dytb0
krW+h9R0HnqFWFpX065xFAP8m9qZQeUHnlHCSWxJMZxtSMpXgK5zsMZBM5H+
RtsHLKsWJAIGqAEjGyXU4y0ia0vGQYyYW14a7MIcDFZce5MXQE3UI7Dt/SmA
k4XjwvZ0BY3qFGABmE244Qz5BDWAANqjeqoVEsOIkBU6YEIrmCNaSYyY1drx
TYAemECKVMD7wEzg+dg5bdyi1IsKLDPcukrhrvEWpHR1ihaYS4y2kb7KjX55
fn5KehRJvLSAnyhdb6qWVZMixgnLyVNrcG5Ni0YLzTpYz4wpT0VLo0Zymppk
AWdCaC/MxdbdbUtG4/B5VSLcE9ygVjjyDRq2FRHC0Jdt9M7r92fn6E3j//Wb
t/Tzu+M/vj95d3yEP5+9PHz1yv+gpMXZy7fvXx2Fn8KXz9++fn385og/hqc6
eaR2Xh/+vMPW0s7b0/OTt28OX+3gMtrUrK6JC6cWrSxbA28i2AH/wjbOwLIj
80s/e3769//YfyiQen9/H+1a/uXJ/j89hF/Qd+DRCCz4V6DltQLnz5qaRAW0
xMys8xZseWJzUJqbEna4tkDNb/+ElPnzgf7tdLbef/i9PMAFJw8dzZKHRLPh
k8HHTMQtj7YM46mZPO9ROp3v4c/J747u0cPf/g6k3erx/pPffa9Uz8cB9BGV
CECFwuKZC0XW1nXFBgoBhmnE+SDxA6syy4jzRr0dJh4W95BsyEQgUK/hl6LW
5qAQqw38png0DIg04ND+os/hJy3/fgFGR+4gkdO/7r9f1C8H4+hf+tuv+w/G
Ar68MkWeUeDtFw2eerDqUOEjroAMVF3rYBB11YysdYI0Q6oqiMqnTzG0jg2F
WEBAfmFAQL+swY3OhNbQZwVKp9eH29fzeE90aTfSAQZCsBPYmvMBsB6oA/qw
rMqxGFfb4gIT+dbFfPgj5Lj22rmRc/Qhpf03TQ+/89KhZVAlAZZhnFgtEV7i
ADgmKnx97MH1050IWWFW7IS2cePUhHJmdGJlBTrFsK22ufkiUGiGRds93Mq+
ga14X4DqfwLo08dHJ+dv32EIy5QLKwYNB1tODt8cjsHaBVVo0UvKYAaAsJM/
K/W3v/0NbHNwTz9RWKmVJe7e+zif37u3N6Knu48fPXrwaE99DmRCCXxKXxMn
rc01+hZD7UyoCYBuV2u080/m4nZxc1J+5ZhesjmqUl+Gv2e7JbYslfoJbdfI
8vNwtW2XQM+K8dokVm0w6FXifO8h+XkLEXBwmfjJRZ7p7zSA+fj+o8e79ISZ
cI8psUHtoS+jF5dkEOhLnNRzedK0dTcjq4BZWraXjE/n8CCLurCFH5Dib8QX
0WdnL8+In89TV2FKgRiMECBfCcs1S9Swu2TWoI+CwoYixghCtnNw/zPTGvCN
wH5OWS8m08SnB/rONDGegrkQH27MtTPpRySpXU2ys9249069t+5ZwhRq9MMb
rPvY93HGbYg2OKc35i2wsZfmKoeOphY2Gmh41NWkzKLYUeLYPoqWPhpIrPNJ
YFxncPsQypApIw6DkYP/W1TVB3TVWXCPOML0NfEZMUktcSppC1OAc5Ndw/Js
6dHSZk85urDJBdaiJbBHAVSx7mNlprAQm8k+sRmcdWSnsd06qxZl/lfHA4Ll
b2Cdo37v7KYOYsNmICGBwdVALiTQs0WYsZ9pdWU9yoCpnl851XhyFKJTK4wO
Jd8KbskCxTOG3dgOP0R6MUp2RGdfrGDvzcLuBD7CDzjmoueoXNMgScJL2PQV
ORdaTECiO+2nozrt905XOpJbshN2nIz0VqtvWK0arBaV4R3iUH0sZI7gpKdl
Gx9sGCAk45ookrvfghk490HymYQzmVW/vctZlbX5946HucCUxW/3J5P7//Zk
vP/9U+U6EaIcnp7AwBmprR4E3hjt9uO8rwtdUD8XITZw4boLY720xfrXGGtJ
/dw+FtvaPjJO+wHEAHcdrVyiFsUwAYAL4RmJ9FEPEpzIXYgEvRkJSktOR8IZ
etWh32pQLFKy02iippjy+48T0p/nK0tAVElUQ+L/5KYZ3HlLGkZYnCBfRuXc
29F/hXA0GrGC/bjOmd3CXI5SSlF4jgiFRMHYEa8j0QLpcjG+v221n3VAntig
6eo1msIgKgk0sVHFLKF7sXMfjSwtKgJTU6hYOQkiY9BIdAhtochkpOAmmo25
xYQQO8F9rDeKxeek1M6/chZegrLMa6BpV+YjpR6Yk5i9ZmAYtOQcs6II1Jbk
mbdOwuRKR8RLL6uXPFUJhjXKyzkGYIE+wBPX6PFN9Auc00eDMQ3xBmfQIS4P
x6J0Odu5ApkqIn1gKKSWRzSZWS+yyOFcNnJI3bMxgfUFktWK0ggj6cTh9K1x
X8kbYeS2Vl8Z5BWTzBEuljZHO+fRtJLHcxsUAy45Z22lFl0OC+5BgkS6qrIl
/6MJm/cleD5y/bcgdhdrUCnkND2llx1wz/5j5J4LGvDCTb5DBHMtHtzH1Ja0
wOQWv/ojtiX/nL9qyVHgjDUlZ3apBcvTJLTZk5nhv5lB0wRnRnEg0K8H+hh9
hKdpk3n+0WY09kE8Kz/vMKvPKOjRwJGkF7ZcgHBhIDT/6Likt1+DcPRl1Fdk
0Sth7cyyjsT8C+WZYSMjva2vTJ0b3jJUp52kT3fziZ2gbKqu9EFAeB4Uw56w
VSrZlFpE2L8MFLmUr/LGRyPJMLoMJEc0U8kniKaXKf0I8u6JReRNJi+KZCvK
bFQ0myJf5e0gt5cxCnI7Mpu2WNmPJ48m9yf3Vd8+ijDOD0/JCn0Je7j7L3v6
t9/1Nv+S6gjQJ/uXS5W7DE8vw70tnch5XmrPqVom+2WkRS4T+R0E6b2aykuX
xY71Y09wg7TqXe+fi6btOXwu6XQwcN7XdV49YDEF//2e/BMfnl823Sq82u+/
uriys/D6fvJ6iXUxALXR9w9cg2oNu7svL/bDmLv3/+3B/fE+Bg5+BMJxzCAF
IsHHbL1FN5PmPxZzM8vnc9hJ8FZNsS3lLtrejcP6fgg++F6wx7cYQE9EyAP/
Bv9tAyFPvbQpgtETXsIU3TpGGWEMaL1CWZNJD/vCnRj29+D+U+wv7euKcoZx
V7cOTxbIlvF7YyTVCmBtwo+zZVd+uGHKnjtunDTX6WGX0272ARX1rzE4c95w
0P3HT4dLz8s11gOw0SFdkWIITPFFvZAAwFAthJ7+97UC4gDqg0NEWErie9AZ
e3MsSIgYX9vsuzQdp7aK2u7R6R6HgJ1J42X2kpDM5GU/9OnHGmIVVz3abBew
AnfqnfzOOGmp1sUZ4Z5Vyqq0uw61Ivcqyxu03uzFwnRNAzTcfeQR6BHFLY/W
r90S+wgUvUIYWoV2MW4crQU14iYD4MAJbjdVbpttzL7vrCnesKg0+WJlnt7w
DoNIWJN0lbuhiJPdNIWPv9dvT4/f6JOzs/fHWDZJ4R3gDayL6ySknjuNdek+
vqRNQG6suiYBXujQ8YMnQtMLUVFVE9f8QvM/0Q9/3nWFolIcOqtWd2+rN43G
HMuIezQrJF7XSHXczWIa8eZQSMM6gzCAiKpfX0SPTgOdnOnWIzr6vWCmXDqL
HH9+XxeXnL+89Ob0ZZqiodCYJGa4MpALDSmMk9RnD2OQca7D50SUembnmJGT
UjLBLCkwy1xFWXBtsVwAo5Yh5RKFapuRigqSeC3PXX1LGrnsZ3IYZFyBmUoT
hN7wcx74bZUEVEUg0eBGwvwup5Ki3oZoiq6eS9i7Oo+tMTC1tjVW2Nrsv1Y2
IClWkJNlReVZoId9VQ5oUGApyymxolpgOa3eaUNSbEfvbmosxsTYsdo5lIdo
34Lw2HoPl0FlQmZNBR3Q07rjKqGeowp754s5D4siLqnyJYNTrJfblCAi1qw4
E4fhpt1esdkeGakzU9c5f4QrV7Jivc4Xi2sgC2j8zEfqXUHDnKPu54MKCq7a
iEPclINupIA/qbrEin9wjd3KqrlK6hPdYMxVTLNQc7EwtYQyDZ4XaDjQndcZ
x2gOgOnRbQBNibDLZXsU9HFLYOcmXxu01oGqFDq4Dn5SWjgD4NVYcJpNG+Uj
eEpUrLBuxwjLuY9U+BA5JYvsinyAppuDPFBChFmeCDHwtUyG2WLOsfaKVEJ9
IDIgBV0CZbqSakuxPi3DMmqQdRbRtkYywihzM2vBsUKmXaNypMIj4JJivKnq
IlMh+vP3//CoKwOsDOYjoLtxUc3SNMbzUP82LG2mimvhzQAYoQBOuJPjZATT
FhgFZYmiQirE5ioWam8icZUovgLkBpcQ4Z0Ssk0LUsSVqlJsOQ58PwrTTZ6m
KarolaptwTy6zNeESrbxNhjYR98Sg/pOgeQUYUrqBreEhgZZLSpy0qidMDgW
FchSXAwx6Ft9WF67aJkXd4rPh3wgUjbGMA9eAqT6i6W+vWp3XC2P+RTlTXLh
Azl96ppS5RzxZybh0JDBQuNlXM0JbjHZ5IqxkCcdHgQH/OZw3iimoUppGFFO
QgUjF5ZN+YdXJWrGFbqoUPeGxeQUMsb0DEsiKRrKhyxyNDQIKsiAN7josYQw
OSY5Uhx9l7SpFO19FWHu3NFvr/Bwkd1IVFtq9lEzxNsjOn9qF2jEb1yoR2Q2
gq2QcVMpM0qwJOh4FATy36o4hQuM/xMf7HBFE03TUYhZSRrB6UzpUPI/u7eV
QzxIUml5VO+KyFQyH7NGugGZ0biRSKs732Ul98aFrD8hF8y55r6NTz/AvERH
I1i2ecPHtyZarClkx27lQtvxKRVZGUB2szWGhAQEczTHdcCOtEseHZVEjqWD
c0WVt5EZFerNl6YgiX3rEr0jp1RkVJJe7oosOz/7KKUqO8BZMZUFtI3z4x6g
b0xubinwTwuSt23HYN9cNCAe+y/V1CdHObwmBpunPu2SxSD/KFoL58TEeEXy
097cRP3txNdfJr5Lqh7GnEEFRZ7a0aEoKoC2eL7CbDUvYnedaaJ2kmN5Tvc5
ikD7PLOllyTJ9vjzVogHV6boxNa16gtFKoNM/Aj1P9DJBUtxBe/fvRo3Zm5H
4AitTYbvnqH7+/ghoig6/aUc3THxUbJYoBv9iKj/gCpNFKq/h48fPmE/544+
Qhx1nEj4/mOM7z8gvt+hwzxsi40BbD9LuZBx7I/9Cy/ExbaxkcQFoy4bLwUH
RCdB5y+livqI1UbaUyycWOP0FR4F1t15HjzBQGVd2TYNoWLU15FT7KuOObnl
arEe3AeV1+LpiFcWcQ/mWbIKxUQetwWdeMkEvIBlXaDHegmzxg8ufzx+d/Li
54sfjn++ODv51+PL8L0dxCZ75HHnDZFGKhQvTm8ymSd694wqkIiqI+2PXwA7
7DERt++DFDVGgB+fnxgkx8JS9Xf65Q9HL8bHxNu7FFqRB3SActcHZJzkXTQg
8CONR5bxJ/++R74RvD/54TW9luiU1JSN4ugltKLj0/hjj9Ajef9KDevN/EQu
2YFimWX7AEkgNWR0bMTtTjVrrYuH9sGEgg8yv8ttdWdpxb2rVWtUQqs9lrSI
nnvbcxog5I+ePP4NdvWsAv6Z+/7IMAcv1GAwyPsLshyxcdZkrhIIGcbcT3e2
Fb4qdVpjvRe088gqnwoSj3zMeQjApDV8yQYqYIomJYVLNzt4Ek8JthpLajQA
epqNyWnXdkDTwKx2EvC+odBnt6FThPGG7KFhDWCyrkquJjClrwaLrEXqIZaR
kyNFHmAU8ZKqk9qZM2m3XAXMNV+H28n2+vBnXg6g1E50EDifg+ztMxX6S/rq
2bPz5m1SjLYmavyWDdlSH0VBmJyPlacw5GfKMHR0SlcQbEvYk/QNPHUde+rU
2WE4z1qWgmpoYQBnYe1PFUB0W22H5jM4OP0pVQR5b5WO7slkiZxFPreYS+fS
lUoXFZ0ivWm3UEfIbiVnwLCgkGpF0Muo8VUeKjJU062pMM6U/ZJ0H8XQu3ay
mIw8BWNV62kZ57h9eWaUCdpiFkVlVLTFzlyDD8nXx2MfLE3MscKtgBtnPGly
ddHXfp4GyU7CxRM4hXM6k/TpznL9wY55z8dlRcAyzrPPdC4XLN6RL5MqLSOw
P2w6LBnxS4v2eEqSBnqYC2vF+RRFOJynfuftvVCqvxdO6yK0KfSwQ1RGy0HV
NWfA/RbfUDs/sGKUWDHkVHhPzgUKejzrAhnpupMIsDo5SlRzz9GLgS09EonB
JBaBCBeUnASISHoNXrR2J+p67yglhhcFbEzeuvtMIh8IswLeXicGcyuekC2/
gq/kZgEqOgZ3dlga7KzIZYVxZvbnh1TBs1/BNQgxWp2nnBiRgOqiEGExPpeX
XJcrO4tRamLPrbVKuEw5h+8P23Eo96ZoQlR2lu48Fuk4pO57NhgLT5IPoSpf
AYCE804+jkRK1VseAT4oKiFM5ux/XFjPceMwSnxyhoVd5vpMQEWp96BesHzZ
sjvRK0H26VTWFslBj6FXLgATK+uvPIrji5Wlb+ioQXt+5KuPkcFN2+IZiaja
0pWvxNw66Sf8YMco+Qg8I7HlkZR45yQ0IA54Tr2tPPElWCXnhr/X8SkSpsTv
8NjsjMVoFubsrC9WynQ69prjSTLjCMuSSask0MN6KxTJ+1oYZgnkoEvvx1SU
JBRYAv81nKhxFXZYbYCadOD2ASpdnhYGOfdje4J1AWfoUV32Dq9Fhye+aTzs
uPG/ErNEnckGu/LuIOfbQyAANLIpvVPeqlcqf+O47khUz7KPoipkPSmCD0Ym
NEAA0HjbJfKSR9dNNOiUlrbFC5Q0wsImz9plejeEEmIjA4gRd1vpet6SacEw
npxT4Cr7uARUnGjk6UQgpUofDzvj014k0emavosTEYIhQiYeIOIOPHzPnbmL
cLbghtd/HNvbEmijMLlYSPguPoqmIjMox8mCKsoXJRrbt2/eMK5GA6voEFB8
QMNmvVMN/oDBNnqp4WZ9MZwYVpjGUXIXa0tuFrhlN5JrhgggJdgGGmpljZSZ
CNmBeVTzIV+v/RnIONzm4VUm6teUHB3xlHeByRjd3OGkchD7JFXscsSoi2P6
gFwFKt/A/4x2shDa+ZaVHHJyaiKlqwJlnGiNLeHbJMgslPfJOM8jzlZX062i
s5IjBfE3zlfzGnLLRkr+d0uQr3dQP71kInXJQs2pg5SvoChj7Ssf7C9viKGL
O3CTula3qetcVF6ipr8gTtHJ3p3/Kz39AvzeAi9xqJzCFrqEo8QpFfxBSaxo
aKLF+DC7wePCnSluPOTUQ4Zv3M1ccvbQ77DEgsE3iRR70PvoB470cNu/RN/X
4RAWgvehz+EF/PYHR6V3sV50ar6ImvZZuxvijCrJO2wxBPqRaDlGnazMCa/a
nnrBjlC7Xt8e2h9ycP+GCLSC5YakQI7zJGu3yhdLScrR5VPcOk6ymJ6v6OIq
4BYGl3HtwmxVFJrzZuoWRS70YKYXx1mFLe9P5EY8/Uk0HCukylUt0SkmIm9Y
KokPAm0uaXA+CpdKpqS8Vxh9nPGZ0s2HjamzkVwYVNtvkKHphKszax36VNBZ
xhGlLm+W/u4mP4eGKna2600JvJFVRsffq/KbNoW3lHuiOKHjl17yP/AP7m/m
SCJcNuRdCm0kisclYeSTW5ypoSoOCuOVGJ+C/tLZIJa0xY74euuIDji5JG2s
uAMVPJZtN6QG8/LMNjAdegA1HIr4lc6LbjOs9NCukrGjGE2fFkpym/HZgXCQ
ON5X9h0biXo3g8P6t5nFJy6D1No13Q7UJH0PFPIQhsNJYPnmi7bINlNLCKm+
yiBJHKRb8xbqJErk3rSmbUbGYFX/51bGTYnwZB/+f8yNeLMTY6IveSPeuzib
q25MGX69gn1B5SfXKrE8BER7Jwh9sKlvgHAyveR7K5RIzJBPVgYcYV4ax78b
d4dLIvP9M+IE7nKsPJcD2EEz/c9iVL4bdrqEMdWAMf8HwSoVBhmyKMbyongV
2xI9BT6IW0UISMaqs077a8JYBUeVbu3aW1JRHgSQwt+z4hjRRXK+BCHq66iT
2lI3qedhdz1Dre+yxvm2rZYQ8OmW4Arx3kgNCRjMnn5vVEfsI+GYdlvjSfM6
pxs2V1jvjsfyMJ1EVefuSm1MSURVuGylDEO+5HjgfL66nJfbqy3lvEk0euul
m5RqdLfJfeEKzkEFursdD/ZZbsychptOkisoq1gZjfSgWG/rTSz+Kk4yqeVc
94uuRjHA+wDleHITHSbcQs48uTeYcE5xgCSpZWTkY9xLq11ivAPLanDRhTJp
QXh6G8pkPy30im6NuCGV5M1KuR0wvg6sXdYWAzxVZgvsFYv/p9fRMW1ONrvK
+LrC8+R45bRcTsIg2K/zZumhSwfJV4srh116xXsr/RKpFyFp2y8tdQXTXGHB
NdNSI+2v93Tl03zUX9wFSqPHBeXqa4rJtxx4DJl0zhiKr6VyzFYflpzbqXOu
fOmXYXP62MdaoaeuzN1lHHy0o1zgDXx0B4aUP+NZAfi6Wyx93KmsyuuVXIzu
Io7+TlxiGUqJ4h28urkGK3LVqP51jiiiGCxeVmuKQBu8utGVyvpbOKdY08Ns
AM8+XstNl4oA8O20AA2Jp5XIepWi6YePngCP4WKqGn22NFLrRddlHkS3eQoV
XG7n43DObaG9bVs808BlHYU1IOq0RtgbgxcnhSvYsdRtWkmRAk9gpDkTHgXw
Tk6pFhnvNMJfuSbHgQkQBzSGo7WNvosi7+7EUrTJhIroIeRYrk0H8qpRvEY5
B8DzR47Jo8u5DYMLFvsH9glB1wBhxpe1mibUusZN2aYTOd3Oyj7QmTCzKyzs
3SKRhyKSRhi3SEpDxLpQjt7RfGZ0rTBd8EyP3fXc0dl1PiWZz1rodMWuJny0
3xcrZ8LEWOtEzcCmFSDLyJKzCn50GslhDgVaVGQnrZHf6B7rNHmO5RpjrG+A
OVU1sAdJwraUGjhH5TWez4FBDaIqopetl2aNwxUFKtQ9nAPHJGatOyD10zIv
RNy8s5sB5BMBQGMY19SXyy+rEs0Fd9bLR1xCVO/Ilnh2r5qPz7AAHYh9I83g
91Vjiyt/XbOUSrnMOo6o6D4Bx1pUno3l/iQergSp6aWvezZCqH9olEvC1TXd
ledn5TE9yxd4Myisn+6P3W4ngDjRbiu3qTBxBEDobuHao07jAiKsUxO7BtTX
VxpMkcPCN/8jg1zTkquot9RqUnJB+X9DIceHr2R1DBjRfokp4cpbkC35Ikow
lcCp20KoiIsn6llUh7GFphhiC+UWeZka7GLxMP+PVOQEj+Ib4OPKdIlYREcf
GFvGuavyDi6oT57hixDwvSZHVNiytuO6K531OC+uB25FuMVZPGnCq8IgV4Rj
8LBssH9rssU89/KJKuRdSrInYKB82H6chqtxHvyhJ2EaXcl9cg5ICjZ8XmAA
iau5hhfwD2xH5jTri5gBZ0rnAKO3B3NSdCeppBmuuXjZ+XB8PvXwzeGA6b/H
z493Z3/hv5qyp4/xjtmO5G5jvwGLlDqib3uOwa6sj+KcoMAaDEvwN44x8Yqq
GSFFKCPYo3rBjXV625kZ08KUjE4lnUnEP7uBpxblXmX+sxJAEPXpgHfQZt/t
zE3R2J3PSv1zV16DgsHrK6M/P/MXfDoLf29GqSNw6/EcbPVBnZy9+wOALEwf
FX4GEwl/Lkapsw5orP8AVpSJe2wW+OR+3OUfctiMXJ8asDTjpgt6foEBPxO3
fw2IacDAPpvhSeb4i1VDj+LGP3QILuemAOspbvqhpUdx0/gP5xyCSqmqTEV/
J2dmNr9fWrMGOZuC4zkpbav+EzWuPsZragAA

-->

</rfc>
