<?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-rfc2629 version 1.6.6 (Ruby 3.0.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-privacypass-rate-limit-tokens-02" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.4 -->
  <front>
    <title abbrev="Rate-Limited Tokens">Rate-Limited Token Issuance Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-privacypass-rate-limit-tokens-02"/>
    <author initials="S." surname="Hendrickson" fullname="Scott Hendrickson">
      <organization>Google LLC</organization>
      <address>
        <email>scott@shendrickson.com</email>
      </address>
    </author>
    <author initials="J." surname="Iyengar" fullname="Jana Iyengar">
      <organization>Fastly</organization>
      <address>
        <email>jri@fastly.com</email>
      </address>
    </author>
    <author initials="T." surname="Pauly" fullname="Tommy Pauly">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <author initials="S." surname="Valdez" fullname="Steven Valdez">
      <organization>Google LLC</organization>
      <address>
        <email>svaldez@chromium.org</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2022" month="May" day="02"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document specifies a variant of the Privacy Pass issuance protocol
that allows for tokens to be rate-limited on a per-origin basis. This
enables origins to use tokens for use cases that need to restrict access
from anonymous clients.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
  <eref target="https://github.com/tfpauly/privacy-proxy"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies a variant of the Privacy Pass issuance protocol
(as defined in <xref target="ARCH"/>) that allows
for tokens to be rate-limited on a per-origin basis. This enables origins
to use tokens for use cases that need to restrict access from anonymous clients.</t>
      <t>The base Privacy Pass issuance protocol <xref target="ISSUANCE"/>
defines stateless anonymous tokens, which can either be publicly verifiable
or not.</t>
      <t>This variant build upon the publicly verifiable issuance protocol that uses
RSA Blind Signatures <xref target="BLINDSIG"/>, and
allows tokens to be rate-limited on a per-origin basis. This means that
a client will only be able to receive a limited number of tokens associated
with a given origin server within a fixed period of time.</t>
      <t>This issuance protocol registers the Rate-Limited Blind RSA token type
(<xref target="iana-token-type"/>), to be used with the PrivateToken HTTP authentication
scheme defined in <xref target="AUTHSCHEME"/>.</t>
      <section anchor="motivation">
        <name>Motivation</name>
        <t>A client that wishes to keep its IP address private can hide its IP address
using a proxy service or a VPN. However, doing so severely limits the client's
ability to access services and content, since servers might not be able to
enforce their policies without a stable and unique client identifier.</t>
        <t>Privacy Pass tokens in general allow clients to provide anonymous attestation
of various properties. The tokens generated by the base issuance
protocol (<xref target="ISSUANCE"/>) can be used to verify that a client meets a particular
bar for attestation, but cannot be used by a redeeming server to rate-limit
specific clients.</t>
        <t>There are several use cases for rate-limiting anonymous clients that
are common on the Internet. These routinely use client IP address tracking,
among other characteristics, to implement rate-limiting.</t>
        <t>One example of this use case is rate-limiting website accesses to a client to
help prevent fraud. Operations that are sensitive to fraud, such as account
creation on a website or logging into an account, often employ rate-limiting
as a defense-in-depth strategy. Additional verification can be required by these
pages when a client exceeds a set rate-limit.</t>
        <t>Another example of this use case is a metered paywall, where an origin limits the
number of page requests from each unique user over a period of time before the
user is required to pay for access. The origin typically resets this state
periodically, say, once per month. For example, an origin may serve ten (major
content) requests in a month before a paywall is enacted. Origins may want to
differentiate quick refreshes from distinct accesses.</t>
        <t>For some applications, the basic issuance protocol from <xref target="BASIC-ISSUANCE"/>
could be used to implement rate limits. In particular, the 'Joint Attester and Issuer' model from <xref target="ARCH"/> could
be used to restrict the number of tokens issued to individual clients over a time window. However, in this deployment model, the Attester and Issuer would learn all
origins used by a participating client. In some cases this might be a significant portion of
browsing history. The issuance protocol defined in this document employs the 'Split Origin, Attester, Issuer'
model to combat this, where the issuer would know all per-origin policies, and the
attester would mantain per-client state without knowing all origins a client visits.</t>
      </section>
      <section anchor="properties">
        <name>Properties and Requirements</name>
        <t>For rate-limited token issuance, the Attester, Issuer, and Origin as defined in
<xref target="ARCH"/> each have partial knowledge of the Client's identity and actions,
and each entity only knows enough to serve its function (see <xref target="terms"/> for more
about the pieces of information):</t>
        <ul spacing="normal">
          <li>The Attester knows the Client's identity and learns the Client's public key
(Client Key), the Issuer being targeted (Issuer Name), the period of time
for which the Issuer's policy is valid (Issuer Policy Window), the number of
tokens the Issuer is willing to issue within the current policy window, and the
number of tokens issued to a given Client for the claimed Origin in the policy
window. The Attester does not know the identity of the Origin the Client is
trying to access (Origin Name), but knows a Client-anonymized identifier for
it (Anonymous Origin ID).</li>
          <li>The Issuer knows the Origin's secret (Issuer Origin Secret) and policy about client
access, and learns the Origin's identity (Origin Name) during issuance. The Issuer
does not learn the Client's identity or information about the Client's access
pattern.</li>
          <li>The Origin knows the Issuer to which it will delegate an incoming Client
(Issuer Name), and can verify that any tokens presented by the Client were
signed by the Issuer. The Origin does not learn which Attester was used by a
Client for issuance.</li>
        </ul>
        <t>Since an Issuer enforces policies on behalf of Origins, a Client is required to
reveal the Origin's identity to the delegated Issuer. It is a requirement of
this protocol that the Attester not learn the Origin's identity so that,
despite knowing the Client's identity, an Attester cannot track and concentrate
information about Client activity.</t>
        <t>An Issuer expects an Attester to verify its Clients' identities correctly, but an
Issuer cannot confirm an Attester's efficacy or the Attester-Client relationship
directly without learning the Client's identity. Similarly, an Origin does not
know the Attester's identity, but ultimately relies on the Attester to correctly
verify or authenticate a Client for the Origin's policies to be correctly
enforced. An Issuer therefore chooses to issue tokens to only known and
reputable Attesters; the Issuer can employ its own methods to determine the
reputation of a Attester.</t>
        <t>An Attester is expected to employ a stable Client identifier, such as an IP
address, a device identifier, or an account at the Attester, that can serve as a
reasonable proxy for a user with some creation and maintenance cost on the user.</t>
        <t>For the Issuance protocol, a Client is expected to create and maintain stable
and explicit secrets for time periods that are on the scale of Issuer policy
windows. Changing these secrets arbitrarily during a policy window can result in
token issuance failure for the rest of the policy window; see <xref target="client-state"/>
for more details. A Client can use a service offered by its Attester or a
third-party to store these secrets, but it is a requirement of this protocol
that the Attester not be able to learn these secrets.</t>
        <t>The privacy guarantees of this issuance protocol, specifically those around
separating the identity of the Client from the names of the Origins that it
accesses, are based on the expectation that there is not collusion between
the entities that know about Client identity and those that know about Origin
identity. Clients choose and share information with Attesters, and Origins
choose and share policy with Issuers; however, the Attester is generally
expected to not be colluding with Issuers or Origins. If this occurs, it
can become possible for an Attester to learn or infer which Origins a
Client is accessing, or for an Origin to learn or infer the Client
identity. For further discussion, see <xref target="collusion"/>.</t>
      </section>
    </section>
    <section anchor="terms">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <t>Unless otherwise specified, this document encodes protocol messages in TLS notation
from <xref target="TLS13"/>, Section 3.</t>
      <t>This draft includes pseudocode that uses the functions and conventions defined
in <xref target="HPKE"/>.</t>
      <t>Encoding an integer to a sequence of bytes in network byte order is described
using the function "encode(n, v)", where "n" is the number of bytes and "v" is
the integer value. The function "len()" returns the length of a sequence of bytes.</t>
      <t>The following terms are defined in <xref target="ARCH"/> and are used throughout this
document:</t>
      <ul spacing="normal">
        <li>Client: An entity that provides authorization tokens to services
across the Internet, in return for authorization.</li>
        <li>Issuer: An entity that produces Privacy Pass tokens to clients.</li>
        <li>Attester: An entity that can attest to properties about the client,
including previous patterns of access.</li>
        <li>Origin: The server from which the client can redeem tokens.</li>
        <li>Issuance Protocol: The protocol exchange that involves the client,
attester, and issuer, used to generate tokens.</li>
      </ul>
      <t>The following terms are defined in <xref target="AUTHSCHEME"/>, which defines the
interactions between clients and origins:</t>
      <ul spacing="normal">
        <li>Issuer Name: The name that identifies the Issuer, which is an entity
that can generate tokens for a Client using one or more issuance protocols.</li>
        <li>Token Key: Keying material that can be used with an issuance protocol
to create a signed token.</li>
        <li>Origin Name: The name that identifies the Origin, as included in a
TokenChallenge.</li>
      </ul>
      <t>Additionally, this document defines several terms that are unique to the
rate-limited issuance protocol:</t>
      <ul spacing="normal">
        <li>Issuer Policy Window: The period over which an Issuer will track access
policy, defined in terms of seconds and represented as a uint64. The state
that the Attester keeps for a Client is specific to a policy window.
The effective policy window for a specific Client starts when the Client
first sends a request associated with an Issuer.</li>
        <li>Issuer Encapsulation Key: The public key used to encrypt values such as
Origin Name in requests from Clients to the Issuer, so that Attesters cannot learn
the Origin Name value. Each Issuer Encapsulation Key is used across all requests on the
Issuer, for different Origins.</li>
        <li>Anonymous Origin ID: An identifier that is generated by the Client and marked
on requests to the Attester, which represents a specific Origin anonymously. The Client
generates a stable Anonymous Origin ID for each Origin Name, to allow the Attester
to count token access without learning the Origin Name.</li>
        <li>Client Key: A public key chosen by the Client and shared only with the Attester;
see <xref target="issuance-unlinkability"/> for more details about this restriction.</li>
        <li>Client Secret: The secret key used by the Client during token issuance, whose public key
(Client Key) is shared with the Attester.</li>
        <li>Issuer Origin Secret: A per-origin secret key used by the Issuer during token issuance,
whose public key is not shared with anyone.</li>
        <li>Anonymous Issuer Origin ID: An identifier that is generated by Issuer based on an
Issuer Origin Secret that is per-Client and per-Origin. See <xref target="response-two"/> for details
of derivation.</li>
      </ul>
    </section>
    <section anchor="setup">
      <name>Configuration</name>
      <t>Issuers MUST provide three parameters for configuration:</t>
      <ol spacing="normal" type="1"><li>Issuer Policy Window: a uint64 of seconds as defined in <xref target="terms"/>.</li>
        <li>Issuer Request URI: a token request URL for generating access tokens.
For example, an Issuer URL might be https://issuer.example.net/token-request. This parameter
uses resource media type "text/plain".</li>
        <li>Issuer Encapsulation Key: a <tt>EncapsulationKey</tt> structure as defined below to use when encapsulating
information, such as the origin name, to the Issuer in issuance requests. This parameter uses resource media type
"application/issuer-encap-key". The Npk parameter corresponding to the HpkeKdfId can be found in <xref target="HPKE"/>.</li>
      </ol>
      <artwork><![CDATA[
opaque HpkePublicKey[Npk]; // defined in RFC9180
uint16 HpkeKemId;          // defined in RFC9180
uint16 HpkeKdfId;          // defined in RFC9180
uint16 HpkeAeadId;         // defined in RFC9180

struct {
  uint8 key_id;
  HpkeKemId kem_id;
  HpkePublicKey public_key;
  HpkeKdfId kdf_id;
  HpkeAeadId aead_id;
} EncapsulationKey;
]]></artwork>
      <t>The Issuer parameters can be obtained from an Issuer via a directory object, which is a JSON
object whose field names and values are raw values and URLs for the parameters.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Field Name</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">issuer-policy-window</td>
            <td align="left">Issuer Policy Window as a JSON number</td>
          </tr>
          <tr>
            <td align="left">issuer-request-uri</td>
            <td align="left">Issuer Request URI resource URL as a JSON string</td>
          </tr>
          <tr>
            <td align="left">issuer-encap-key-uri</td>
            <td align="left">Issuer Encapsulation Key URI resource URL as a JSON string</td>
          </tr>
        </tbody>
      </table>
      <t>As an example, the Issuer's JSON directory could look like:</t>
      <artwork><![CDATA[
 {
    "issuer-token-window": 86400,
    "issuer-request-uri": "https://issuer.example.net/token-request"
    "issuer-encap-key-uri": "https://issuer.example.net/encap-key",
 }
]]></artwork>
      <t>Issuer directory resources have the media type "application/json"
and are located at the well-known location /.well-known/token-issuer-directory.</t>
    </section>
    <section anchor="token-challenge-requirements">
      <name>Token Challenge Requirements</name>
      <t>Clients receive challenges for tokens, as described in <xref target="AUTHSCHEME"/>.</t>
      <t>For the rate-limited token issuance protocol described in this document,
the name of the origin is sent in an encrypted message from the Client
to the Issuer. If the TokenChallenge.origin_info field contains a single
origin name, that origin name is used. If the origin_info field contains
multiple origin names, the client selects the single origin name that
presented the challenge. If the origin_info field is empty, the
encrypted message is the empty string "".</t>
      <t>The HTTP authentication challenge also SHOULD contain the following
additional attribute:</t>
      <ul spacing="normal">
        <li>"issuer-encap-key", which contains a base64url encoding of a <tt>EncapsulationKey</tt> as defined
in <xref target="setup"/> to use when encrypting the Origin Name in issuance requests.</li>
      </ul>
    </section>
    <section anchor="issuance">
      <name>Issuance Protocol</name>
      <t>This section describes the Issuance protocol for a Client to request and receive
a token from an Issuer. Token issuance involves a Client, Attester, and Issuer,
with the following steps:</t>
      <ol spacing="normal" type="1"><li>The Client sends a token request containing a token request, encrypted origin
name, and one-time-use public key and signature to the Attester</li>
        <li>The Attester validates the request contents, specifically checking the request
signature, and proxies the request to the Issuer</li>
        <li>The Issuer validates the request against the signature, and processes its contents,
and produces a token response sent back to the Attester</li>
        <li>The Attester verifies the response and proxies the response to the Client</li>
      </ol>
      <t>The Issuance protocol is designed such that Client, Attester, and Issuer learn only
what is necessary for completing the protocol; see <xref target="info-disclosure"/> for more details.</t>
      <t>The Issuance protocol has a number of underlying cryptographic dependencies for
operation:</t>
      <ul spacing="normal">
        <li>RSA Blind Signatures <xref target="BLINDSIG"/>, for issuing and constructing Tokens. This support
is the same as used in the base publicly verifiable token issuance protocol <xref target="ISSUANCE"/></li>
        <li>
          <xref target="HPKE"/>, for encrypting the origin server name in transit between Client and Issuer across the Attester.</li>
        <li>Signatures with key blinding, as described in <xref target="KEYBLINDING"/>, for verifying
correctness of Client requests.</li>
      </ul>
      <t>Clients and Issuers are required to implement all of these dependencies, whereas Attesters are required
to implement signature with key blinding support.</t>
      <section anchor="state-requirements">
        <name>State Requirements</name>
        <t>The Issuance protocol requires each participating endpoint to maintain some
necessary state, as described in this section.</t>
        <section anchor="client-state">
          <name>Client State</name>
          <t>A Client is required to have the following information, derived from a given TokenChallenge:</t>
          <ul spacing="normal">
            <li>Origin Name, a hostname referring to the Origin <xref target="RFC6454"/>. This is the name
of the Origin that issued the token challenge. One or more names can be listed
in the TokenChallenge.origin_info field. Rate-limited token issuance relies on the
client selecting a single origin name from this list if multiple are present.</li>
            <li>Token Key, a blind signature public key corresponding to the Issuer
identified by the TokenChallenge.issuer_name.</li>
            <li>Issuer Encapsulation Key, a public key used to encrypt request information corresponding
to the Issuer identified by TokenChallenge.issuer_name.</li>
          </ul>
          <t>Clients maintain a stable Client Key that they use for all communication with
a specific Attester. Client Key is a public key, where the corresponding private key
Client Secret is known only to the client.</t>
          <t>If the client loses this (Client Key, Client Secret), they may generate a new tuple. The
Attester will enforce if a client is allowed to use this new Client Key. See <xref target="attester-state"/>
for details on this enforcement.</t>
          <t>Clients also need to be able to generate an Anonymous Origin ID value that corresponds
to the Origin Name, to send in requests to the Attester.</t>
          <t>Anonymous Origin ID MUST be a stable and unpredictable 32-byte value computed by the Client.
Clients MUST NOT change this value across token requests for the same Origin Name. Doing
so will result in token issuance failure (specifically, when an Attester rejects a request
upon detecting two Anonymous Origin ID values that map to the same Origin).</t>
          <t>One possible mechanism for implementing this identifier is for the Client to store a mapping
between the Origin Name and a randomly generated Anonymous Origin ID for future requests. Alternatively,
the Client can compute a PRF keyed by a per-client secret (Client Secret) over the Origin Name,
e.g., Anonymous Origin ID = HKDF(secret=Client Secret, salt="", info=Origin Name).</t>
        </section>
        <section anchor="attester-state">
          <name>Attester State</name>
          <t>An Attester is required to maintain state for every authenticated Client. The mechanism
of identifying a Client is specific to each Attester, and is not defined in this document.
As examples, the Attester could use device-specific certificates or account authentication
to identify a Client.</t>
          <t>Attesters must enforce that Clients don't change their Client Key frequently, to ensure Clients can't
regularly evade the per-client policy as seen by the issuer. Attesters MUST NOT allow Clients to
change their Client Key more than once within a policy window, or in the subsequent policy window
after a previous Client Key change. Alternative schemes where the Attester stores the encrypted
(Client Key, Client Secret) tuple on behalf of the client are possible but not described here.</t>
          <t>Attesters are expected to know the Issuer Policy Window for any Issuer Name to which
they allow access. This information can be retrieved using the URIs defined in <xref target="setup"/>.</t>
          <t>For each Client-Issuer pair, an Attester maintains a policy window
start and end time for each Issuer from which a Client requests a token.</t>
          <t>For each tuple of (Client Key, Anonymous Origin ID, policy window), the Attester maintains the
following state:</t>
          <ul spacing="normal">
            <li>A counter of successful tokens issued</li>
            <li>Whether or not a previous request was rejected by the Issuer</li>
            <li>The last received Anonymous Issuer Origin ID value for this Anonymous Origin ID, if any</li>
          </ul>
        </section>
        <section anchor="issuer-state">
          <name>Issuer State</name>
          <t>Issuers maintain a stable Issuer Origin Secret that they use in calculating values returned
to the Attester for each origin. If this value changes, it will open up a possibility
for Clients to request extra tokens for an Origin without being limited, within a
policy window. See <xref target="token-key-management"/> for details about generating and rotating
the Issuer Origin Secret.</t>
          <t>Issuers are expected to have the private key that corresponds to Issuer Encapsulation Key,
which allows them to decrypt the Origin Name values in requests.</t>
          <t>Issuers also need to know the set of valid Token Key public keys and corresponding
private key, for each Origin Name that is served by the Issuer. Origins SHOULD update
their view of the Token Key regularly to ensure that Client requests do not fail
after Token Key rotation.</t>
        </section>
      </section>
      <section anchor="issuance-http-headers">
        <name>Issuance HTTP Headers</name>
        <t>The Issuance protocol defines four new HTTP headers that are used in requests
and responses between Clients, Attesters, and Issuers (see <xref target="iana-headers"/>).</t>
        <t>The "Sec-Token-Origin" is an Item Structured Header <xref target="RFC8941"/>. Its
value MUST be a Byte Sequence. This header is sent both on Client-to-Attester
requests (<xref target="request-one"/>) and on Issuer-to-Attester responses (<xref target="response-one"/>).
Its ABNF is:</t>
        <artwork><![CDATA[
    Sec-Token-Origin = sf-binary
]]></artwork>
        <t>The "Sec-Token-Client" is an Item Structured Header <xref target="RFC8941"/>. Its
value MUST be a Byte Sequence. This header is sent on Client-to-Attester
requests (<xref target="request-one"/>), and contains the bytes of Client Key.
Its ABNF is:</t>
        <artwork><![CDATA[
    Sec-Token-Client = sf-binary
]]></artwork>
        <t>The "Sec-Token-Request-Blind" is an Item Structured Header <xref target="RFC8941"/>. Its
value MUST be a Byte Sequence. This header is sent on Client-to-Attester
requests (<xref target="request-one"/>), and contains a per-request nonce value.
Its ABNF is:</t>
        <artwork><![CDATA[
    Sec-Token-Request-Blind = sf-binary
]]></artwork>
        <t>The "Sec-Token-Request-Key" is an Item Structured Header <xref target="RFC8941"/>. Its
value MUST be a Byte Sequence. This header is sent on Client-to-Attester
requests (<xref target="request-one"/>), and contains a per-request public key.
Its ABNF is:</t>
        <artwork><![CDATA[
    Sec-Token-Request-Key = sf-binary
]]></artwork>
        <t>The "Sec-Token-Limit" is an Item Structured Header <xref target="RFC8941"/>. Its
value MUST be an Integer. This header is sent on Issuer-to-Attester
responses (<xref target="response-one"/>), and contains the number of times a
Client can retrieve a token for the requested Origin within a policy window,
as set by the Issuer. Its ABNF is:</t>
        <artwork><![CDATA[
    Sec-Token-Limit = sf-integer
]]></artwork>
      </section>
      <section anchor="request-one">
        <name>Client-to-Attester Request</name>
        <t>The Client and Attester MUST use a secure and Attester-authenticated HTTPS
connection. They MAY use mutual authentication or mechanisms such as TLS
certificate pinning, to mitigate the risk of channel compromise; see
<xref target="sec-considerations"/> for additional about this channel.</t>
        <t>Requests to the Attester need to indicate the Issuer Name to which issuance
requests will be forwarded. Attesters SHOULD provide Clients with a URI template
that contains one variable that contains the Issuer Name, "issuer", using
Level 3 URI template encoding as defined in Section 1.2 of <xref target="RFC6570"/>.</t>
        <t>An example of an Attester URI templates is shown below:</t>
        <artwork><![CDATA[
https://attester.net/token-request{?issuer}
]]></artwork>
        <t>Attesters and Clients MAY agree on other mechanisms to specify the Issuer Name
in requests.</t>
        <t>The Client first creates an issuance request message for a random value <tt>nonce</tt>
using the input TokenChallenge <tt>challenge</tt> and the Issuer key identifier <tt>key_id</tt>
as follows:</t>
        <artwork><![CDATA[
nonce = random(32)
context = SHA256(challenge)
token_input = concat(0x0003, nonce, context, key_id)
blinded_msg, blind_inv = rsabssa_blind(pkI, token_input)
]]></artwork>
        <t>The Client then uses Client Key to generate its one-time-use request public
key <tt>request_key</tt> and blind <tt>request_blind</tt> as described in <xref target="client-anon-issuer-origin-id"/>.</t>
        <t>The Client then constructs a InnerTokenRequest value, denoted <tt>origin_token_request</tt>,
combining <tt>blinded_msg</tt>,  <tt>request_key</tt>, and the origin name as follows:</t>
        <artwork><![CDATA[
struct {
  uint8_t blinded_msg[Nk];
  uint8_t request_key[Npk];
  uint8_t padded_origin_name<0..2^16-1>;
} InnerTokenRequest;
]]></artwork>
        <t>This structure is initialized and then encrypted using Issuer Encryption Key, producing
<tt>encrypted_token_request</tt>, as described in <xref target="encrypt-origin"/>.</t>
        <t>Finally, the Client uses Client Secret to produce <tt>request_signature</tt>
as described in <xref target="index-proof"/>.</t>
        <t>The Client then constructs a TokenRequest structure. This TokenRequest
structure is based on the publicly verifiable token issuance path in
<xref target="ISSUANCE"/>, adding fields for the encrypted origin name and request signature.</t>
        <artwork><![CDATA[
struct {
   uint16_t token_type = 0x0003;
   uint8_t token_key_id;
   uint8_t issuer_encap_key_id[32];
   uint8_t encrypted_token_request<1..2^16-1>;
   uint8_t request_signature[Nsig];
} TokenRequest;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>"token_type" is a 2-octet integer, which matches the type in the challenge.</li>
          <li>"token_key_id" is the least significant byte of the Token Key key ID, which is
generated as SHA256(public_key), where public_key is a DER-encoded SubjectPublicKeyInfo
object carrying Token Key.</li>
          <li>"issuer_encap_key_id" is a collision-resistant hash that identifies the Issuer
Encryption Key, generated as SHA256(EncapsulationKey).</li>
          <li>"encrypted_token_request" is an encrypted structure that contains an InnerTokenRequest
value, calculated as described in <xref target="encrypt-origin"/>.</li>
          <li>"request_signature" is computed as described in <xref target="index-proof"/>.</li>
        </ul>
        <t>The Client then generates an HTTP POST request to send through the Attester to
the Issuer, with the TokenRequest as the body. The media type for this request
is "message/token-request". The Client includes the "Sec-Token-Origin" header,
whose value is Anonymous Origin ID; the "Sec-Token-Client" header, whose value is
Client Key; the "Sec-Token-Request-Blind" header, whose value is request_blind; and
the "Sec-Token-Request-Key" header, whose value is <tt>request_key</tt>. The Client
sends this request to the Attester's proxy URI. An example request is shown below,
where the Issuer Name is "issuer.net" and the Attester URI template is
"https://attester.net/token-request{?issuer}"</t>
        <artwork><![CDATA[
:method = POST
:scheme = https
:authority = attester.net
:path = /token-request?issuer=issuer.net
accept = message/token-response
cache-control = no-cache, no-store
content-type = message/token-request
content-length = <Length of TokenRequest>
sec-token-origin = Anonymous Origin ID
sec-token-client = Client Key
sec-token-request-blind = request_blind
sec-token-request-key = request_key

<Bytes containing the TokenRequest>
]]></artwork>
        <t>If the Attester detects a token_type in the TokenRequest that it does not recognize
or support, it MUST reject the request with an HTTP 400 error.</t>
        <t>The Attester also checks to validate that the issuer_encap_key_id in the client's TokenRequest
matches a known Issuer Encapsulation Key public key for the Issuer. For example, the Attester can
fetch this key using the API defined in <xref target="setup"/>. This check is done to help ensure that
the Client has not been given a unique key that could allow the Issuer to fingerprint or target
the Client. If the key does not match, the Attester rejects the request with an HTTP
400 error. Note that this can lead to failures in the event of Issuer Issuer Encapsulation Key
rotation; see <xref target="privacy-considerations"/> for considerations.</t>
        <t>The Attester finally validates the Client's stable mapping request as described in
<xref target="attester-anon-issuer-origin-id"/>. If this fails, the Attester MUST return an HTTP 400
error to the Client.</t>
        <t>If the Attester accepts the request, it will look up the state stored for this Client.
It will look up the count of previously generate tokens for this Client using the same
Anonymous Origin ID. See <xref target="attester-state"/> for more details.</t>
        <t>If the Attester has stored state that a previous request for this Anonymous Origin ID was
rejected by the Issuer in the current policy window, it SHOULD reject the request without
forwarding it to the Issuer.</t>
        <t>If the Attester detects this Client has changed their Client Key more frequently than allowed
as described in <xref target="attester-state"/>, it SHOULD reject the request without forwarding it to
the Issuer.</t>
      </section>
      <section anchor="request-two">
        <name>Attester-to-Issuer Request</name>
        <t>Assuming all checks in <xref target="request-one"/> succeed, the Attester generates an HTTP POST request
to send to the Issuer with the Client's TokenRequest as the body. The Attester MUST NOT
add information that will uniquely identify a Client, or associate the request with a small
set of possible Clients. Extensions to this protocol MAY allow Attesters to add information
that can be used to separate large populations, such as providing information about the country
or region to which a Client belongs. An example request is shown below.</t>
        <artwork><![CDATA[
:method = POST
:scheme = https
:authority = issuer.net
:path = /token-request
accept = message/token-response
cache-control = no-cache, no-store
content-type = message/token-request
content-length = <Length of TokenRequest>

<Bytes containing the TokenRequest>
]]></artwork>
        <t>The Attester and the Issuer MUST use a secure and Issuer-authenticated HTTPS
connection. Also, Issuers MUST authenticate Attesters, either via mutual
TLS or another form of application-layer authentication. They MAY additionally use
mechanisms such as TLS certificate pinning, to mitigate the risk of channel
compromise; see <xref target="sec-considerations"/> for additional about this channel.</t>
        <t>Upon receipt of the forwarded request, the Issuer validates the following conditions:</t>
        <ul spacing="normal">
          <li>The TokenRequest contains a supported token_type</li>
          <li>The TokenRequest.token_key_id and TokenRequest.issuer_encap_key_id correspond to known
Token Keys and Issuer Encapsulation Keys held by the Issuer.</li>
          <li>The TokenRequest.encrypted_token_request can be decrypted using the
Issuer's private key (the private key associated with Issuer Encapsulation Key), and contains
a valid InnerTokenRequest whose unpadded origin name matches an Origin Name that is served by
the Issuer. The Origin name associated with the InnerTokenRequest value might be the empty string "",
as described in <xref target="encrypt-origin"/>, in which case the Issuer applies a cross-origin
policy if supported. If a cross-origin policy is not supported, this condition is not met.</li>
        </ul>
        <t>If any of these conditions is not met, the Issuer MUST return an HTTP 400 error to the Attester,
which will forward the error to the client.</t>
        <t>The Issuer determines the correct Issuer Key by using the decrypted Origin Name value and
TokenRequest.token_key_id. If there is no Token Key whose truncated key ID matches
TokenRequest.token_key_id, the Issuer MUST return an HTTP 401 error to Attester, which will
forward the error to the client. The Attester learns that the client's view of the Origin key
was invalid in the process.</t>
      </section>
      <section anchor="response-one">
        <name>Issuer-to-Attester Response</name>
        <t>If the Issuer is willing to give a token to the Client, the Issuer decrypts
TokenRequest.encrypted_token_request to discover a InnerTokenRequest value. If this fails,
the Issuer rejects the request with a 400 error. Otherwise, the Issuer validates and
processes the token request with Issuer Origin Secret corresponding to the designated
Origin as described in <xref target="issuer-anon-issuer-origin-id"/>. If this fails, the Issuer
rejects the request with a 400 error. Otherwise, the output is
index_key.</t>
        <t>The Issuer completes the issuance flow by computing a blinded response as follows:</t>
        <artwork><![CDATA[
blind_sig = rsabssa_blind_sign(skP, InnerTokenRequest.blinded_msg)
]]></artwork>
        <t><tt>skP</tt> is the private key corresponding to Token Key, known only to the Issuer.
The Issuer then encrypts <tt>blind_sig</tt> to the Client as described in <xref target="encap-issuer-to-client"/>,
yielding <tt>encrypted_token_response</tt>.</t>
        <t>The Issuer generates an HTTP response with status code 200 whose body consists of
blind_sig, with the content type set as "message/token-response", the
index_key set in the "Sec-Token-Origin" header, and the limit of tokens
allowed for a Client for the Origin within a policy window set in the
"Sec-Token-Limit" header. This limit SHOULD NOT be unique to a specific
Origin, such that the Attester could use the value to infer which Origin
the Client is accessing (see <xref target="privacy-considerations"/>).</t>
        <artwork><![CDATA[
:status = 200
content-type = message/token-response
content-length = <Length of blind_sig>
sec-token-origin = index_key
sec-token-limit = Token limit

<Bytes containing the encrypted_token_response>
]]></artwork>
      </section>
      <section anchor="response-two">
        <name>Attester-to-Client Response</name>
        <t>Upon receipt of a successful response from the Issuer, the Attester extracts the
"Sec-Token-Origin" header, and uses the value to determine Anonymous Issuer Origin ID
as described in <xref target="attester-output-anon-issuer-origin-id"/>.</t>
        <t>If the "Sec-Token-Origin" is missing, or if the same Anonymous Issuer Origin ID was previously
received in a response for a different Anonymous Origin ID within the same policy window,
the Attester MUST drop the token and respond to the client with an HTTP 400 status.
If there is not an error, the Anonymous Issuer Origin ID is stored alongside the state
for the Anonymous Origin ID.</t>
        <t>The Attester also extracts the "Sec-Token-Limit" header, and compares the limit against the
previous count of accesses for this Client for the Anonymous Origin ID. If the count is greater
than or equal to the limit, the Attester drops the token and responds to the client with an
HTTP 429 (Too Many Requests) error.</t>
        <t>For all other cases, the Attester forwards all HTTP responses unmodified to the Client
as the response to the original request for this issuance.</t>
        <t>When the Attester detects successful token issuance, it MUST increment the counter
in its state for the number of tokens issued to the Client for the Anonymous Origin ID.</t>
        <t>Upon receipt, the Client decrypts the <tt>blind_sig</tt> from <tt>encrypted_token_response</tt> as
described in <xref target="encap-issuer-to-client"/>. If successful, the Client then processes
the response as follows:</t>
        <artwork><![CDATA[
authenticator = rsabssa_finalize(pkI, token_input, blind_sig, blind_inv)
]]></artwork>
        <t>If this succeeds, the Client then constructs a token as described in
<xref target="AUTHSCHEME"/> as follows:</t>
        <artwork><![CDATA[
struct {
    uint16_t token_type = 0x0003
    uint8_t nonce[32];
    uint8_t context[32];
    uint8_t token_key_id[Nid];
    uint8_t authenticator[Nk]
} Token;
]]></artwork>
      </section>
    </section>
    <section anchor="encrypt-origin">
      <name>Encrypting Origin Token Requests and Responses</name>
      <t>Clients encapsulate token request information to the Issuer using the Issuer Encapsulation Key.
Issuers decrypt the token request using their corresponding private key. This process yields
the decrypted token request as well as a shared encryption context between Client and Issuer.
Issuers encapsulate their token response to the Client using an ephemeral key derived from this
shared encryption context. This process ensures that the Attester learns neither the token
request or response information.</t>
      <t>Client to Issuer encapsulation is described in <xref target="encap-client-to-issuer"/>, and Issuer to
Client encapsulation is described in <xref target="encap-issuer-to-client"/>.</t>
      <section anchor="encap-client-to-issuer">
        <name>Client to Issuer Encapsulation</name>
        <t>Given a <tt>EncapsulationKey</tt> (Issuer Encapsulation Key), Clients produce encrypted_token_request
using the following values:</t>
        <ul spacing="normal">
          <li>the one octet key identifier from the Name Key, keyID, with the corresponding KEM identified by kemID,
the public key from the configuration, pkI, and;</li>
          <li>a selected combination of KDF, identified by kdfID, and AEAD, identified by aeadID.</li>
        </ul>
        <t>Beyond the key configuration inputs, Clients also require the following inputs defined
in <xref target="request-one"/>: <tt>token_key_id</tt>, <tt>blinded_msg</tt>, <tt>request_key</tt>, <tt>origin_name</tt>, and
<tt>issuer_encap_key_id</tt>.</t>
        <t>Together, these are used to encapsulate an InnerTokenRequest and produce an encrypted token
request (<tt>encrypted_token_request</tt>).</t>
        <t><tt>origin_name</tt> contains the name of the origin that initiated the challenge, as
taken from the TokenChallenge.origin_info field. If the TokenChallenge.origin_info field
is empty, <tt>origin_name</tt> is set to the empty string "".</t>
        <t>The process for generating <tt>encrypted_token_request</tt> from <tt>blinded_msg</tt>, <tt>request_key</tt>, and
<tt>origin_name</tt> values is as follows:</t>
        <ol spacing="normal" type="1"><li>Compute an <xref target="HPKE"/> context using pkI, yielding context and encapsulation key enc.</li>
          <li>Construct associated data, aad, by concatenating the values of keyID, kemID, kdfID,
aeadID, and all other values of the TokenRequest structure.</li>
          <li>Pad origin_name with N zero bytes, where N = 31 - ((L - 1) % 32) and L is the length
of origin_name. If L is 0, N = 32. Denote this padding process as the function <tt>pad</tt>.</li>
          <li>Encrypt (seal) the padded origin_name with aad as associated data using context, yielding ciphertext ct.</li>
          <li>Concatenate the values of aad, enc, and ct, yielding encrypted_token_request.</li>
        </ol>
        <t>Note that enc is of fixed-length, so there is no ambiguity in parsing this structure.</t>
        <t>In pseudocode, this procedure is as follows:</t>
        <artwork><![CDATA[
enc, context = SetupBaseS(pkI, "InnerTokenRequest")
aad = concat(encode(1, keyID),
             encode(2, kemID),
             encode(2, kdfID),
             encode(2, aeadID),
             encode(2, token_type),
             encode(1, token_key_id),
             encode(32, issuer_encap_key_id))
padded_origin_name = pad(origin_name)
input = concat(encode(Nk, blinded_msg),
               encode(49, request_key),
               encode(len(padded_origin_name), padded_origin_name))
ct = context.Seal(aad, input)
encrypted_token_request = concat(enc, ct)
]]></artwork>
        <t>Issuers reverse this procedure to recover the InnerTokenRequest value by computing the AAD as
described above and decrypting encrypted_token_request with their private key skI (the private
key corresponding to pkI). The <tt>origin_name</tt> value is recovered from InnerTokenRequest.padded_origin_name
by stripping off padding bytes. In pseudocode, this procedure is as follows:</t>
        <artwork><![CDATA[
enc, ct = parse(encrypted_token_request)
aad = concat(encode(1, keyID),
             encode(2, kemID),
             encode(2, kdfID),
             encode(2, aeadID),
             encode(2, token_type),
             encode(1, token_key_id),
             encode(32, issuer_encap_key_id))
context = SetupBaseR(enc, skI, "TokenRequest")
origin_token_request, error = context.Open(aad, ct)
]]></artwork>
        <t>The <tt>InnerTokenRequest.blinded_msg</tt> and <tt>InnerTokenRequest.request_key</tt> values, along
with the unpadded <tt>origin_name</tt> value, are used by the Issuer as described in <xref target="request-two"/>.</t>
      </section>
      <section anchor="encap-issuer-to-client">
        <name>Issuer to Client Encapsulation</name>
        <t>Given an HPKE context <tt>context</tt> computed in <xref target="encap-client-to-issuer"/>, Issuers encapsulate
their token response <tt>blind_sig</tt>, yielding an encrypted token response <tt>encrypted_token_response</tt>,
to the Client as follows:</t>
        <ol spacing="normal" type="1"><li>Export a secret <tt>secret</tt> from <tt>context</tt>, using the string "OriginTokenResponse" as context.
The length of this secret is <tt>max(Nn, Nk)</tt>, where <tt>Nn</tt> and <tt>Nk</tt> are the length of AEAD
key and nonce associated with <tt>context</tt>.</li>
          <li>Generate a random value of length <tt>max(Nn, Nk)</tt> bytes, called <tt>response_nonce</tt>.</li>
          <li>Extract a pseudorandom key <tt>prk</tt> using the <tt>Extract</tt> function provided by
the KDF algorithm associated with <tt>context</tt>. The <tt>ikm</tt> input to this
function is <tt>secret</tt>; the <tt>salt</tt> input is the concatenation of <tt>enc</tt> (from
<tt>enc_request</tt>) and <tt>response_nonce</tt></li>
          <li>Use the <tt>Expand</tt> function provided by the same KDF to extract an AEAD key
<tt>key</tt>, of length <tt>Nk</tt> - the length of the keys used by the AEAD associated
with <tt>context</tt>. Generating <tt>key</tt> uses a label of "key".</li>
          <li>Use the same <tt>Expand</tt> function to extract a nonce <tt>nonce</tt> of length <tt>Nn</tt> -
the length of the nonce used by the AEAD. Generating <tt>nonce</tt> uses a label of
"nonce".</li>
          <li>Encrypt <tt>blind_sig</tt>, passing the AEAD function Seal the values of <tt>key</tt>,
<tt>nonce</tt>, empty <tt>aad</tt>, and a <tt>pt</tt> input of <tt>request</tt>, which yields <tt>ct</tt>.</li>
          <li>Concatenate <tt>response_nonce</tt> and <tt>ct</tt>, yielding an Encapsulated Response
<tt>enc_response</tt>. Note that <tt>response_nonce</tt> is of fixed-length, so there is no
ambiguity in parsing either <tt>response_nonce</tt> or <tt>ct</tt>.</li>
        </ol>
        <t>In pseudocode, this procedure is as follows:</t>
        <artwork><![CDATA[
secret = context.Export("OriginTokenResponse", Nk)
response_nonce = random(max(Nn, Nk))
salt = concat(enc, response_nonce)
prk = Extract(salt, secret)
aead_key = Expand(prk, "key", Nk)
aead_nonce = Expand(prk, "nonce", Nn)
ct = Seal(aead_key, aead_nonce, "", blind_sig)
encrypted_token_response = concat(response_nonce, ct)
]]></artwork>
        <t>Clients decrypt <tt>encrypted_token_response</tt> by reversing this process. That is,
they first parse <tt>enc_response</tt> into <tt>response_nonce</tt> and <tt>ct</tt>. They then
follow the same process to derive values for <tt>aead_key</tt> and <tt>aead_nonce</tt>.</t>
        <t>The client uses these values to decrypt <tt>ct</tt> using the Open function provided by
the AEAD. Decrypting might produce an error, as follows:</t>
        <artwork><![CDATA[
blind_sig, error = Open(aead_key, aead_nonce, "", ct)
]]></artwork>
      </section>
    </section>
    <section anchor="anon-issuer-origin-id">
      <name>Anonymous Issuer Origin ID Computation</name>
      <t>This section describes the Client, Attester, and Issuer behavior in computing
Anonymous Issuer Origin ID, the stable mapping based on client identity and
origin name. At a high level, this functionality computes y = F(x, k), where x
is a per-Client secret and k is a per-Origin secret, subject to the following constraints:</t>
      <ul spacing="normal">
        <li>The Attester only learns y if the Client in possession of x engages with the protocol;</li>
        <li>The Attester prevents a Client with private input x from running the protocol for input x' that is not equal to x;</li>
        <li>The Issuer does not learn x, nor does it learn when two requests correspond to the same private value x; and</li>
        <li>Neither the Client nor Attester learn k.</li>
      </ul>
      <t>The interaction between Client, Attester, and Issuer in computing this
functionality is shown below.</t>
      <artwork><![CDATA[
Client               Attester                Issuer
    (request, signature)
  ---------------------->
                           (request, signature)
                         ---------------------->
                                (response)
                         <----------------------
]]></artwork>
      <t>The protocol for computing this functionality is divided into sections for
each of the participants. <xref target="client-anon-issuer-origin-id"/> describes Client behavior
for initiating the computation with its per-Client secret, <xref target="attester-anon-issuer-origin-id"/>
describes Attester behavior for verifying Client requests, <xref target="issuer-anon-issuer-origin-id"/>
describes Issuer behavior for computing the mapping with its per-Origin secret,
and <xref target="attester-output-anon-issuer-origin-id"/> describes the final Attester step for
computing the client-origin index.</t>
      <t>The index computation is based on a signature scheme with key blinding and unblinding
support, denoted BKS, as described in <xref target="KEYBLINDING"/>. Such a scheme has the following
functions:</t>
      <ul spacing="normal">
        <li>BKS-KeyGen(): Generate a random private and public key pair (sk, pk).</li>
        <li>BKS-BlindKeyGen(): Generate a random blinding key bk.</li>
        <li>BKS-BlindPublicKey(pk, bk): Produce a blinded public key based on the input public
key pk and blind key bk according to <xref target="KEYBLINDING"/>, Section 6.1.</li>
        <li>BKS-Verify(pk, msg, sig): Verify signature sig over input message msg against the
public key pk, producing a boolean value indicating success.</li>
        <li>BKS-BlindKeySign(sk_sign, sk_blind, msg): Sign input message msg with signing key sk_sign and
blind key sk_blind according to <xref target="KEYBLINDING"/>, Section 6.2, and produce a signature of size
<tt>Nsig</tt> bytes.</li>
        <li>BKS-SerializePrivatekey(sk): Serialize a private key to a byte string of length <tt>Nsk</tt>.</li>
        <li>BKS-DeserializePrivatekey(buf): Attempt to deserialize a private key from an <tt>Nsk</tt>-byte
string buf. This function can fail if buf does not represent a valid private key.</li>
        <li>BKS-SerializePublicKey(pk): Serialize a public key to a byte string of length <tt>Npk</tt>.</li>
        <li>BKS-DeserializePublicKey(buf): Attempt to deserialize a public key of length <tt>Npk</tt>.
This function can fail if buf does not represent a valid public key.</li>
      </ul>
      <t>Additionally, each BKS scheme has a corresponding hash function, denoted <tt>Hash</tt>.
The implementation of each of these functions depends on the issuance protocol
token type. See <xref target="iana-token-type"/> for more details.</t>
      <section anchor="client-anon-issuer-origin-id">
        <name>Client Behavior</name>
        <t>This section describes the Client behavior for generating an one-time-use
request key and signature. Clients provide their Client Secret as input
to the request key generation step, and the rest of the token request inputs
to the signature generation step.</t>
        <section anchor="index-request">
          <name>Request Key</name>
          <t>Clients produce <tt>request_key</tt> by masking Client Key and Client Secret with a
randomly chosen blind. Let <tt>pk_sign</tt> and <tt>sk_sign</tt> denote Client Key and
Client Secret, respectively. This process is done as follows:</t>
          <ol spacing="normal" type="1"><li>Generate a random blind key, sk_blind.</li>
            <li>Blind <tt>pk_sign</tt> with <tt>sk_blind</tt> to compute a blinded public key, <tt>request_key</tt>.</li>
            <li>Output the blinded public key.</li>
          </ol>
          <t>In pseudocode, this is as follows:</t>
          <artwork><![CDATA[
sk_blind = BKS-BlindKeyGen()
blinded_key = BKS-BlindPublicKey(pk_sign, sk_blind)
request_key = BKS-SerializePublicKey(blinded_key)
request_blind = BKS-SerializePrivatekey(sk_blind)
]]></artwork>
        </section>
        <section anchor="index-proof">
          <name>Request Signature</name>
          <t>Clients produce signature of their request based on the following inputs defined in <xref target="request-one"/>:
<tt>token_key_id</tt>, <tt>blinded_msg</tt>, <tt>request_key</tt>, <tt>issuer_encap_key_id</tt>, <tt>encrypted_token_request</tt>.
This process requires the blind value <tt>sk_blind</tt> produced during the <xref target="index-request"/> process.
As above, let pk and sk denote Client Key and Client Secret, respectively. Given these
values, this signature process works as follows:</t>
          <ol spacing="normal" type="1"><li>Concatenate all signature inputs to yield a message to sign.</li>
            <li>Compute a signature with the blind <tt>sk_blind</tt> over the input message using
Client Secret, <tt>sk_sign</tt> as the signing key.</li>
            <li>Output the signature.</li>
          </ol>
          <t>In pseudocode, this is as follows:</t>
          <artwork><![CDATA[
context = concat(token_type,
                 token_key_id,
                 issuer_encap_key_id,
                 encrypted_token_request)
request_signature = BKS-BlindKeySign(sk_sign, sk_blind, context)
]]></artwork>
        </section>
      </section>
      <section anchor="attester-anon-issuer-origin-id">
        <name>Attester Behavior (Client Request Validation)</name>
        <t>Given a TokenRequest request containing <tt>request_key</tt>, <tt>request_signature</tt>, and <tt>request_blind</tt>,
as well as Client Key <tt>pk_blind</tt>, Attesters verify the signature as follows:</t>
        <ol spacing="normal" type="1"><li>Check that <tt>request_key</tt> is a valid public key. If this fails, abort.</li>
          <li>Check that <tt>request_blind</tt> is a valid private key. If this fails, abort.</li>
          <li>Blind the Client Key <tt>pk_sign</tt> by blind <tt>sk_blind</tt>, yielding a blinded key.
If this does not match <tt>request_key</tt>, abort.</li>
          <li>Verify <tt>request_signature</tt> over the contents of the request, excluding the
signature itself, using <tt>request_key</tt>. If signature verification fails, abort.</li>
        </ol>
        <t>In pseudocode, this is as follows:</t>
        <artwork><![CDATA[
blind_key = BKS-DeserializePublicKey(request_key)
sk_blind = BKS-DeserializePrivatekey(request_blind)
pk_blind = BKS-BlindPublicKey(pk_sign, sk_blind)
if pk_blind != blind_key:
  raise InvalidParameterError

context = parse(request[..len(request)-Nsig]) // this matches context computed during signing
valid = BKS-Verify(blind_key, context, request_signature)
if not valid:
  raise InvalidSignatureError
]]></artwork>
      </section>
      <section anchor="issuer-anon-issuer-origin-id">
        <name>Issuer Behavior</name>
        <t>Given an Issuer Origin Secret (denoted <tt>sk_origin</tt>) and a TokenRequest, from which
<tt>request_key</tt> and <tt>request_signature</tt> are parsed, Issuers verify
the request signature and compute a response as follows:</t>
        <ol spacing="normal" type="1"><li>Check that <tt>request_key</tt> is a valid public key. If this fails, abort.</li>
          <li>Verify <tt>request_signature</tt> over the contents of the request, excluding the
signature itself, using <tt>request_key</tt>. If signature verification fails, abort.</li>
          <li>Blind <tt>request_key</tt> by Issuer Origin Secret, <tt>sk_origin</tt>, yielding an index key.</li>
          <li>Output the index key.</li>
        </ol>
        <t>In pseudocode, this is as follows:</t>
        <artwork><![CDATA[
blind_key = BKS-DeserializePublicKey(request_key)
context = parse(request[..len(request)-Nsig]) // this matches context computed during signing
valid = BKS-Verify(blind_key, context, request_signature)
if not valid:
  raise InvalidSignatureError

evaluated_key = BKS-BlindPublicKey(request_key, sk_origin)
index_key = BKS-SerializePublicKey(evaluated_key)
]]></artwork>
      </section>
      <section anchor="attester-output-anon-issuer-origin-id">
        <name>Attester Behavior (Index Computation)</name>
        <t>Given an Issuer response <tt>index_key</tt>, Client blind <tt>sk_blind</tt>, and Client
Key (denoted pk_sign), Attesters complete the Anonymous Issuer Origin ID computation as follows:</t>
        <ol spacing="normal" type="1"><li>Check that <tt>index_key</tt> is a valid public key. If this fails, abort.</li>
          <li>Unblind the <tt>index_key</tt> using the Client blind <tt>sk_blind</tt>, yielding the index result.</li>
          <li>Run HKDF <xref target="RFC5869"/> with the hash function corresponding to the BKS scheme,
using the index result as the secret, Client Key <tt>pk_sign</tt> as the salt, and
ASCII string "anon_issuer_origin_id" as the info string, yielding Anonymous Issuer Origin ID.</li>
        </ol>
        <t>In pseudocode, this is as follows:</t>
        <artwork><![CDATA[
evaluated_key = BKS-DeserializePublicKey(index_key)
unblinded_key = BKS-UnblindPublicKey(evaluated_key, sk_blind)

index_result = BKS-SerializePublicKey(unblinded_key)
pk_encoded = BKS-SerializePublicKey(pk_sign)

anon_issuer_origin_id = HKDF-Hash(secret=index_result,
  salt=pk_encoded, info="anon_issuer_origin_id")
]]></artwork>
      </section>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>This section describes security considerations relevant to the use of this protocol.</t>
      <section anchor="channel-security">
        <name>Channel Security</name>
        <t>An attacker that can act as an intermediate between Attester and Issuer
communication can influence or disrupt the ability for the Issuer to correctly
rate-limit token issuance.  All communication channels use server-authenticated
HTTPS. Some connections, e.g., between an Attester and an Issuer, require
mutual authentication between both endpoints. Where appropriate, endpoints
MAY use further enhancements such as TLS certificate pinning to mitigate
the risk of channel compromise.</t>
      </section>
      <section anchor="issuance-unlinkability">
        <name>Token Request Unlinkability and Unforgeability</name>
        <t>Client token requests are constructed such that an Issuer cannot distinguish between
any two token requests from the same Client and two requests from different Clients.
We refer to this property as issuance unlinkability. This property is achieved
by the way the tokens are constructed. In particular, TokenRequest.request_key and TokenRequest.request_signature
are the only value in a TokenRequest that is derived from per-Client information, i.e.,
the Client Secret.</t>
        <t>TokenRequest.request_key is computed using a freshly generated blind for each token
request. As a result, the value of TokenRequest.request_key in one token request is
statistically independent from Client Key. Similarly, TokenRequest.request_signature
is computed using the same freshly generated blind as TokenRequest.request_key for each
token request, and the resulting signature is therefore independent from signatures
produced using Client Secret. More details about this unlinkability property can be
found in <xref target="KEYBLINDING"/>.</t>
        <t>This unlinkability property is only intended for requests observed by the Issuer.
In contrast, the Attester is required to link requests from the same Client together
for the purposes of enforcing rate limits. This Attester does this by observing the
Client Key. Importantly, the Client Key is not sent to the Issuer during the issuance
flow, as doing this would allow the Issuer to trivially link two requests to the same
Client.</t>
        <t>The token request signature is also required to be unforgeable. Informally, unforgeability
means that no entity can produce a valid (message, signature) pair for any blinding key without
access to the private signing key. Importantly, the means the Attester cannot forge
signatures on behalf of a given Client in an attempt to learn the origin name.</t>
      </section>
      <section anchor="info-disclosure">
        <name>Information Disclosure</name>
        <t>The protocol in this document is designed such that information pertaining to issuance
of a token is limited to parties that need it for completing the protocol. In particular,
honest-but-curious Attesters learn only the Anonymous Issuer Origin ID as described in
<xref target="anon-issuer-origin-id"/>, any per-Client information necessary for attestation, and the
target Issuer for a given token request. The Attester does not directly learn the origin
name associated with a given token request, though it does learn the distribution of tokens
across Client interactions. This auxiliary information could be used to infer the Origin
for a given token. For example, if an Issuer has only two configured Origins, each with
a different token request pattern, then the distribution of Client tokens might reveal
the Origin associated with a given token.</t>
        <t>Malicious or otherwise compromised Attesters can choose to not follow the protocol described
in this specification, allowing, for example, Clients to bypass rate limits imposed by
Origins. Moreover, malicious Attesters could reveal the per-request blind (request_blind)
to Issuers, breaking the unlinkability property described in <xref target="issuance-unlinkability"/>.</t>
        <t>Honest-but-curious Issuers only learn the Attester that vouches for a particular Client's
token request and the origin name associated with a token request. Issuers do not learn
the Anonymous Issuer Origin ID or any per-Client information used when creating a token
request.</t>
        <t>Conversely, malicious Issuers that do not follow the protocol can choose to not validate
the token request signature, thereby allowing others to forge token requests in an attempt
to learn the origin name. Malicious Issuers can also rotate token signing keys or Issuer
Origin Secret values frequently in an attempt to bypass Attester-enforced rate limits.
Both of these are detectable by the Attester, though. Issuers can also lie about per-origin
rate limits without detection, e.g., by increasing the limit to a value well beyond any configured
limit by an Origin, or return different limits for different origins to the Attester.</t>
        <t>Clients learn the output token. They do not learn the Anonymous Issuer Origin ID, though the
security of the protocol does not depend on keeping this value secret from Clients. Moreover,
even malicious Clients cannot tamper with per-Client state stored on the Attester for other
Clients, as doing so requires knowledge of their unique Client Secret.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>This section describes privacy considerations relevant to use of this protocol.</t>
      <section anchor="client-token-state-and-origin-tracking">
        <name>Client Token State and Origin Tracking</name>
        <t>Origins SHOULD only generate token challenges based on client action, such as when a user
loads a website. Clients SHOULD ignore token challenges if an Origin tries to force the
client to present tokens multiple times without any new client-initiated action. Failure
to do so can allow malicious origins to track clients across contexts. Specifically, an
origin can abuse per-user token limits for tracking by assigning each new client a random
token count and observing whether or not the client can successfully redeem that many
tokens in a given context. If any token redemption fails, then the origin learns information
about how many tokens that client had previously been issued.</t>
        <t>By rejecting repeated or duplicative challenges within a single context, the origin only
learns a single bit of information: whether or not the client had any token quota left
in the given policy window.</t>
      </section>
      <section anchor="origin-verification">
        <name>Origin Verification</name>
        <t>Rate-limited tokens are defined in terms of a Client authenticating to an Origin, where
the "origin" is used as defined in <xref target="RFC6454"/>. In order to limit cross-origin correlation,
Clients MUST verify that the name of the origin that is providing the HTTP authentication
challenge is present in the TokenChallenge.origin_info list (<xref target="AUTHSCHEME"/>), where the
matching logic is defined for same-origin policies in <xref target="RFC6454"/>. Clients MAY further limit
which authentication challenges they are willing to respond to, for example by only accepting
challenges when the origin is a web site to which the user navigated.</t>
      </section>
      <section anchor="client-identification-with-unique-keys">
        <name>Client Identification with Unique Keys</name>
        <t>Client activity could be linked if an Origin and Issuer collude to have unique keys targeted
at specific Clients or sets of Clients.</t>
        <t>To mitigate the risk of a targeted Issuer Encapsulation Key, the Attester can observe and validate
the token_key_id presented by the Client to the Issuer. As described in <xref target="issuance"/>, Attesters
MUST validate that the token_key_id in the Client's TokenRequest matches a known public key
for the Issuer. The Attester needs to support key rotation, but ought to disallow very rapid key
changes, which could indicate that an Origin is colluding with an Issuer to try to rotate the key
for each new Client in order to link the client activity.</t>
      </section>
      <section anchor="origin-identification">
        <name>Origin Identification</name>
        <t>As stated in <xref target="properties"/>, the design of this protocol is such that Attesters cannot
learn the identity of origins that Clients are accessing. The Origin Name itself is
encrypted in the request between the Client and the Issuer, so the Attester cannot
directly learn the value. However, in order to prevent the Attester from inferring the
value, additional constraints need to be added:</t>
        <ul spacing="normal">
          <li>Each Issuer SHOULD serve tokens to a large number of Origins. A one-to-one relationship
between Origin and Issuer would allow an Attester to infer which Origin is accessed
simply by observing the Issuer identity.</li>
          <li>Issuers SHOULD NOT return rate-limit values that are specific to Origins, such
that an Attester can infer which Origin is accessed by observing the rate limit. This
can be mitigated by having many Origins share the same rate-limit value.</li>
        </ul>
        <t>Some deployments MAY choose to relax these requirements, such as in cases where the
origins being accessed are ubiquitous or do not correspond to user-specific behavior.</t>
      </section>
      <section anchor="collusion">
        <name>Collusion Among Different Entities</name>
        <t>Collusion among the different entities in the Privacy Pass architecture can result in
exposure of a client's per-origin access patterns.</t>
        <t>For this issuance protocol, Issuers and Attesters should be run by mutually distinct
organizations to limit information sharing. A single entity running an Issuer and Attester
for a single token issuance flow can view the origins being accessed by a given client.
Running the Issuer and Attester in this 'single Issuer/Attester' fashion reduces the privacy
promises of no one entity being able to learn Client browsing patterns. This may be desirable
for a redemption flow that is limited to specific Issuers and Attesters, but should be avoided
where hiding origin names from the Attester is desirable.</t>
        <t>If a Attester and Origin are able to collude, they can correlate a client's identity
and origin access patterns through timestamp correlation. The timing of a request to an
Origin and subsequent token issuance to a Attester can reveal the Client
identity (as known to the Attester) to the Origin, especially if repeated over multiple accesses.</t>
      </section>
    </section>
    <section anchor="deploy">
      <name>Deployment Considerations</name>
      <section anchor="token-key-management">
        <name>Token Key Management</name>
        <t>Issuers SHOULD generate a new (Token Key, Issuer Origin Secret) regularly, and
SHOULD maintain old and new secrets to allow for graceful updates. The RECOMMENDED
rotation interval is two times the length of the policy window for that
information. During generation, issuers must ensure the <tt>token_key_id</tt> (the 8-bit
prefix of SHA256(Token Key)) is different from all other <tt>token_key_id</tt>
values for that origin currently in rotation. One way to ensure this uniqueness
is via rejection sampling, where a new key is generated until its <tt>token_key_id</tt> is
unique among all currently in rotation for the origin.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA considerations</name>
      <section anchor="iana-token-type">
        <name>Token Type</name>
        <t>This document updates the "Token Type" Registry (<xref target="AUTHSCHEME"/>) with the following value:</t>
        <table anchor="aeadid-values">
          <name>Token Types</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Publicly Verifiable</th>
              <th align="left">Public Metadata</th>
              <th align="left">Private Metadata</th>
              <th align="left">Nk</th>
              <th align="left">Nid</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0003</td>
              <td align="left">Rate-Limited Blind RSA(SHA-384, 2048-bit) with ECDSA(P-384, SHA-384)</td>
              <td align="left">Y</td>
              <td align="left">N</td>
              <td align="left">N</td>
              <td align="left">512</td>
              <td align="left">32</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">0x0004</td>
              <td align="left">Rate-Limited Blind RSA(SHA-384, 2048-bit) with Ed25519(SHA-512)</td>
              <td align="left">Y</td>
              <td align="left">N</td>
              <td align="left">N</td>
              <td align="left">512</td>
              <td align="left">32</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
        <t>The details of the signature scheme with key blinding and unblinding functions for each token type above are described in the following sections.</t>
        <section anchor="ecdsa-sig-functions">
          <name>ECDSA-based Token Type</name>
          <t>This section describes the implementation details of the signature scheme with key
blinding and unblinding functions introduced in <xref target="anon-issuer-origin-id"/> using
<xref target="ECDSA"/> with P-384 as the underlying elliptic curve and SHA-384 as the corresponding
hash function.</t>
          <ul spacing="normal">
            <li>BKS-KeyGen(): Generate a random ECDSA private and public key pair (sk, pk).</li>
            <li>BKS-BlindKeyGen(): Generate a random ECDSA private key bk.</li>
            <li>BKS-BlindPublicKey(pk, bk): Produce a blinded public key based on the input public
key pk and blind bk according to <xref target="KEYBLINDING"/>, Section 6.1.</li>
            <li>BKS-Verify(pk, msg, sig): Verify the DER-encoded <xref target="X690"/> BKS-Sig-Value signature
sig over input message msg against the ECDSA public key pk, producing a boolean value indicating success.</li>
            <li>BKS-BlindKeySign(sk_sign, sk_blind, msg): Sign input message msg with signing key sk_sign and
blind sk_blind according to <xref target="KEYBLINDING"/>, Section 6.2, and serializes the resulting signature
pair (r, s) in "raw" form, i.e., as the concatenation of two 48-byte, big endian scalars,
yielding an <tt>Nsig=96</tt> byte signature.</li>
            <li>BKS-SerializePrivatekey(sk): Serialize an ECDSA private key using the Field-Element-to-Octet-String
conversion according to <xref target="SECG"/>.</li>
            <li>BKS-DeserializePrivatekey(buf): Attempt to deserialize an ECDSA private key from a 48-byte
string buf using Octet-String-to-Field-Element from <xref target="SECG"/>. This function can fail if buf
does not represent a valid private key.</li>
            <li>BKS-SerializePublicKey(pk): Serialize an ECDSA public key using the
compressed Elliptic-Curve-Point-to-Octet-String method according to <xref target="SECG"/>.</li>
            <li>BKS-DeserializePublicKey(buf): Attempt to deserialize a public key using
the compressed Octet-String-to-Elliptic-Curve-Point method according to <xref target="SECG"/>,
and then performs partial public-key validation as defined in section 5.6.2.3.4 of
<xref target="KEYAGREEMENT"/>. This validation includes checking
that the coordinates are in the correct range, that the point is on the curve, and
that the point is not the point at infinity.</li>
          </ul>
        </section>
        <section anchor="eddsa-sig-functions">
          <name>Ed25519-based Token Type</name>
          <t>This section describes the implementation details of the signature scheme with key
blinding and unblinding functions introduced in <xref target="anon-issuer-origin-id"/> using
Ed25519 as described in <xref target="RFC8032"/>.</t>
          <ul spacing="normal">
            <li>BKS-KeyGen(): Generate a random Ed25519 private and public key pair (sk, pk), where
sk is randomly generated 32 bytes (See <xref target="RFC4086"/> for information about randomness
generation) and pk is computed according to <xref section="5.1.5" sectionFormat="comma" target="RFC8032"/>.</li>
            <li>BKS-BlindKeyGen(): Generate and output 32 random bytes.</li>
            <li>BKS-BlindPublicKey(pk, bk): Produce a blinded public key based on the input public
key pk and blind bk according to <xref section="5.1" sectionFormat="comma" target="KEYBLINDING"/>.</li>
            <li>BKS-Verify(pk, msg, sig): Verify the signature sig over input message msg against
the Ed25519 public key pk, as defined in <xref section="5.1.7" sectionFormat="comma" target="RFC8032"/>, producing a
boolean value indicating success.</li>
            <li>BKS-BlindKeySign(sk_sign, sk_blind, msg): Sign input message msg with signing key sk_sign and
blind sk_blind according to <xref section="5.2" sectionFormat="comma" target="KEYBLINDING"/>, yielding an <tt>Nsig=64</tt> byte signature.</li>
            <li>BKS-SerializePrivatekey(sk): Identity function which outputs sk as an <tt>Nsk=32</tt> byte buffer.</li>
            <li>BKS-DeserializePrivatekey(buf): Identity function which outputs buf interpreted as <tt>sk</tt>.</li>
            <li>BKS-SerializePublicKey(pk): Identity function which outputs pk as an <tt>Npk=32</tt> byte buffer.</li>
            <li>BKS-DeserializePublicKey(buf): Identity function which outputs buf interpreted as <tt>pk</tt>.</li>
          </ul>
        </section>
      </section>
      <section anchor="iana-headers">
        <name>HTTP Headers</name>
        <t>This document registers four new headers for use on the token issuance path
in the "Permanent Message Header Field Names" &lt;<eref target="https://www.iana.org/assignments/message-headers"/>&gt;.</t>
        <figure anchor="iana-header-type-table">
          <name>Registered HTTP Header</name>
          <artwork><![CDATA[
    +-------------------------+----------+--------+---------------+
    | Header Field Name       | Protocol | Status |   Reference   |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Origin        |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Client        |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Request-Blind |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Request-Key   |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Limit         |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
]]></artwork>
        </figure>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="X690">
          <front>
            <title>Information technology - ASN.1 encoding Rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)</title>
            <author>
              <organization>ITU-T</organization>
            </author>
            <date year="2021" month="February"/>
          </front>
          <seriesInfo name="ISO/IEC 8824-1:2021" value=""/>
        </reference>
        <reference anchor="ECDSA">
          <front>
            <title>Public Key Cryptography for the Financial Services Industry - The Elliptic Curve Digital Signature Algorithm (ECDSA)</title>
            <author>
              <organization>American National Standards Institute</organization>
            </author>
            <date year="2005" month="November"/>
          </front>
          <seriesInfo name="ANSI" value="ANS X9.62-2005"/>
        </reference>
        <reference anchor="SECG" target="https://secg.org/sec1-v2.pdf">
          <front>
            <title>Elliptic Curve Cryptography, Standards for Efficient Cryptography Group, ver. 2</title>
            <author>
              <organization/>
            </author>
            <date year="2009"/>
          </front>
        </reference>
        <reference anchor="ARCH">
          <front>
            <title>Privacy Pass Architectural Framework</title>
            <author fullname="Alex Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Jana Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="7" month="March" year="2022"/>
            <abstract>
              <t>   This document specifies the architectural framework for constructing
   secure and anonymity-preserving instantiations of the Privacy Pass
   protocol.  It provides recommendations on how the protocol ecosystem
   should be constructed to ensure the privacy of clients, and the
   security of all participating entities.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-architecture-03"/>
        </reference>
        <reference anchor="ISSUANCE">
          <front>
            <title>Privacy Pass Issuance Protocol</title>
            <author fullname="Sofía Celi">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Alex Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Steven Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="5" month="April" year="2022"/>
            <abstract>
              <t>   This document specifies two variants of the the two-message issuance
   protocol for Privacy Pass tokens: one that produces tokens that are
   privately verifiable, and another that produces tokens that are
   publicly verifiable.  The privately verifiable issuance protocol
   optionally supports public metadata during the issuance flow.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-04"/>
        </reference>
        <reference anchor="BLINDSIG">
          <front>
            <title>RSA Blind Signatures</title>
            <author fullname="Frank Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <author fullname="Frederic Jacobs">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="2" month="February" year="2022"/>
            <abstract>
              <t>   This document specifies the RSA-based blind signature protocol with
   appendix (RSA-BSSA).  RSA blind signatures were first introduced by
   Chaum for untraceable payments [Chaum83].  It extends RSA-PSS
   encoding specified in [RFC8017] to enable blind signature support.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/chris-wood/draft-wood-cfrg-blind-signatures.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-rsa-blind-signatures-03"/>
        </reference>
        <reference anchor="AUTHSCHEME">
          <front>
            <title>The Privacy Pass HTTP Authentication Scheme</title>
            <author fullname="Tommy Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Steven Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="4" month="April" year="2022"/>
            <abstract>
              <t>   This document defines an HTTP authentication scheme that can be used
   by clients to redeem Privacy Pass tokens with an origin.  It can also
   be used by origins to challenge clients to present an acceptable
   Privacy Pass token.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-auth-scheme-02"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="TLS13">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="HPKE">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes">
              <organization/>
            </author>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan">
              <organization/>
            </author>
            <author fullname="B. Lipp" initials="B." surname="Lipp">
              <organization/>
            </author>
            <author fullname="C. Wood" initials="C." surname="Wood">
              <organization/>
            </author>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="KEYBLINDING">
          <front>
            <title>Key Blinding for Signature Schemes</title>
            <author fullname="Frank Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <author fullname="Edward Eaton">
              <organization>University of Waterloo</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="7" month="March" year="2022"/>
            <abstract>
              <t>   This document describes extensions to existing signature schemes for
   key blinding.  This functionality guarantees that a blinded public
   key and all signatures produced using the blinded key pair are
   unlinkable to the unblinded key pair.  Moreover, signatures produced
   using blinded key pairs are indistinguishable from signatures
   produced using unblinded key pairs.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-dew-cfrg-signature-key-blinding-01"/>
        </reference>
        <reference anchor="RFC6454">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth">
              <organization/>
            </author>
            <date month="December" year="2011"/>
            <abstract>
              <t>This document defines the concept of an "origin", which is often used as the scope of authority or privilege by user agents.  Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites.  In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string.  It also defines an HTTP header field, named "Origin", that indicates which origins are associated with an HTTP request.   [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </reference>
        <reference anchor="RFC8941">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="P-H. Kamp" initials="P-H." surname="Kamp">
              <organization/>
            </author>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8941"/>
          <seriesInfo name="DOI" value="10.17487/RFC8941"/>
        </reference>
        <reference anchor="RFC6570">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Hadley" initials="M." surname="Hadley">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="D. Orchard" initials="D." surname="Orchard">
              <organization/>
            </author>
            <date month="March" year="2012"/>
            <abstract>
              <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet.   [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6570"/>
          <seriesInfo name="DOI" value="10.17487/RFC6570"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk">
              <organization/>
            </author>
            <author fullname="P. Eronen" initials="P." surname="Eronen">
              <organization/>
            </author>
            <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="KEYAGREEMENT">
          <front>
            <title>Recommendation for pair-wise key-establishment schemes using discrete logarithm cryptography</title>
            <author fullname="Elaine Barker" initials="E." surname="Barker">
              <organization/>
            </author>
            <author fullname="Lily Chen" initials="L." surname="Chen">
              <organization/>
            </author>
            <author fullname="Allen Roginsky" initials="A." surname="Roginsky">
              <organization/>
            </author>
            <author fullname="Apostol Vassilev" initials="A." surname="Vassilev">
              <organization/>
            </author>
            <author fullname="Richard Davis" initials="R." surname="Davis">
              <organization/>
            </author>
            <date month="April" year="2018"/>
          </front>
          <seriesInfo name="National Institute of Standards and Technology" value="report"/>
          <seriesInfo name="DOI" value="10.6028/nist.sp.800-56ar3"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara">
              <organization/>
            </author>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA).  The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves.  An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="BASIC-ISSUANCE">
          <front>
            <title>Privacy Pass Issuance Protocol</title>
            <author fullname="Sofía Celi">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Alex Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Steven Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="5" month="April" year="2022"/>
            <abstract>
              <t>   This document specifies two variants of the the two-message issuance
   protocol for Privacy Pass tokens: one that produces tokens that are
   privately verifiable, and another that produces tokens that are
   publicly verifiable.  The privately verifiable issuance protocol
   optionally supports public metadata during the issuance flow.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-04"/>
        </reference>
        <reference anchor="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd">
              <organization/>
            </author>
            <author fullname="J. Schiller" initials="J." surname="Schiller">
              <organization/>
            </author>
            <author fullname="S. Crocker" initials="S." surname="Crocker">
              <organization/>
            </author>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts.  However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities.  The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult.  This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities.  It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications.  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="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
      </references>
    </references>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors of this document would like to acknowledge feedback from contributors
to the Privacy Pass working group for their help in improving this document.
The authors also thank Frank Denis and David Schinazi for their contributions.</t>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This section includes test vectors for Origin Name encryption in <xref target="encrypt-origin"/>
and Anonymous Origin ID computation in <xref target="anon-issuer-origin-id"/>. Test vectors for
the token request and response protocol can be found in <xref target="ISSUANCE"/>.</t>
      <section anchor="origin-name-encryption-test-vector">
        <name>Origin Name Encryption Test Vector</name>
        <t>The test vector below for the procedure in <xref target="encrypt-origin"/> lists the following values:</t>
        <ul spacing="normal">
          <li>origin_name: The Origin Name to encrypt, represented as a hexadecimal string.</li>
          <li>kem_id, kdf_id, aead_id: The HPKE algorithms comprising the ciphersuite DHKEM(X25519, HKDF-SHA256), HKDF-SHA256, AES-128-GCM.</li>
          <li>issuer_encap_key_seed: The seed used to derive the private key corresponding to
Issuer Encapsulation Key via the DeriveKeyPair function as defined in <xref section="7.1.3." sectionFormat="of" target="HPKE"/>,
represented as a hexadecimal string.</li>
          <li>issuer_encap_key: The public Issuer Encapsulation Key, represented as a hexadecimal string.</li>
          <li>token_type: The type of the protocol specified in this document.</li>
          <li>token_key_id: The ID of Token Key computed as in <xref target="request-one"/>, a single octet.</li>
          <li>blinded_msg: A random blinded_msg value, represented as a hexadecimal string.</li>
          <li>request_key: A random request_key value, represented as a hexadecimal string.</li>
          <li>issuer_encap_key_id: The Issuer Encapsulation Key ID computed as in <xref target="request-one"/>, represented as a hexadecimal string.</li>
          <li>encrypted_token_request: The encrypted InnerTokenRequest, represented as a hexadecimal string.</li>
        </ul>
        <artwork><![CDATA[
origin_name: 746573742e6578616d706c65
kem_id: 32
kdf_id: 1
aead_id: 1
issuer_encap_key_seed:
d2653816496f400baec656f213f1345092f4406af4f2a63e164956c4c3d240ca
issuer_encap_key: 010020d7b6a2c10e75c4239feb9897e8d23f3f3c377d78e7903611
53167736a24a9c5400010001
token_type: 3
token_key_id: 125
blinded_msg: 89da551a48270b053e53c9eb741badf89e43cb7e66366bb936e11fb2aa0
d30866986a790378bb9fc6a7cf5c32b7b7584d448ffa4ced3be650e354b3136428a52ec0
b27c4103c5855c2b9b4f521ad0713c800d7e6925b6c62e1a6f58b31d13335f468cf509b7
46a16e79b23862d277d0880706c3fb84b127d94faf8d6d2f3e124e681994441b19be084e
c5c159bcd0abab433bbc308d90ea2cabdf4216e1b07155be66a048d686e383ca1e517ab8
0025bb4849d98beb8c3d05d045c1167cb74f4451d8f85695babb604418385464f21f9a81
5fb850ed83fd16a966130427e5637816501f7a79c0010e06adeba55781ceb50f56eae152
ebd06f3cef80dc7ab121d
request_key: 0161d905e4e37f515cb61f863b60e5896aa9e4a17dbe238e752a144c64a
5412e244f0b1f75e010831e185cac023d33cb20
issuer_encap_key_id:
dd2c6de3091f1873643233d229a7a0e9defe0f9fe43f6a7c42ae3a6b16f77837
encrypted_token_request: 82ef7c068506bcabc27d068a51c7ead2cbaf600b76a15e4
d9df99a0da676da5a073fcc8f5ac77b25064d7379037b4e1b186977cface31eceb611978
c73c9aef38c9a0e8ae846881624fa6d454523a0a91d22b02b022891d0469deebd66a912a
a1ab3391b203e92e0a681f0a10c2a2d59b668daf1e5219ed16227d707fa0e8e29188bd58
7ab38b3584564ce9b6538ba82e301cfed4231a2fa4f64a67285a1b9bf648e25f3eb1644c
88d43552bdea6e4bfcbaef0de3ac245e0432be6b019494927fde0743b775f9efe8ca5fef
afbf2048890d54618d408a6001fc8fb276f6828c46f4fe1381e9775eec72ee47593df738
95d18952440d33756d78caea4bd8218950d35afa6c46c535211eda39da277260cb8dab7c
00c6840a745e8150a6ee4893e72b6a51382f877f8c05a15e891a2bde07049760f0f09879
78d78b97e47ecaf90a44996d724dd3720e308abbbf04f672bc5a4db573291986be191b06
03ff521accb6fa081c151c758f3092a89fc6ef591934ff4bc860896c57f83a31b237dd1b
803516c
]]></artwork>
      </section>
      <section anchor="anonymous-origin-id-test-vector">
        <name>Anonymous Origin ID Test Vector</name>
        <t>The test vector below for the procedure in <xref target="anon-issuer-origin-id"/> lists the following values:</t>
        <ul spacing="normal">
          <li>sk_client: Client Secret, serialized and represented as a hexadecimal string.</li>
          <li>pk_client: Client Key, serialized and represented as a hexadecimal string.</li>
          <li>sk_origin: Origin Secret, serialized and represented as a hexadecimal string.</li>
          <li>request_blind: The request_blind value computed in <xref target="index-request"/>, represented as a hexadecimal string.</li>
          <li>index_key: The index_key value computed in <xref target="issuer-anon-issuer-origin-id"/>, represented as a hexadecimal string.</li>
          <li>anon_issuer_origin_id: The anon_issuer_origin_id value computed in <xref target="attester-output-anon-issuer-origin-id"/>, represented as a hexadecimal string.</li>
        </ul>
        <artwork><![CDATA[
sk_sign: f6e6a0c9de38663ca539ff2e6a04e4fca11dc569794dc405e2d17439d6ce4f6
7abb2b81a1852e0db993b6a0452eb60d6
pk_sign: 032db7483c710673e6999a5fb2a2c6eac1d891f89bbf58d985ff168d182ad51
605c4369280efabb7692f661162e683f03c
sk_origin: 85de5fbbd787da5093da0adb240eba0cc6ea90d72032fc4b6925dd7d0ab1d
a1e5ae0be27fe9f59e9ec7e1f1b15b28696
request_blind: 0698a149fb9d16bcb0a856062f74f9191e82b35e91224a57abce60f5b
79f03a669c6b5e093d57e647865f9fd4305b5a9
request_key: 0287b0ce6b957111263d8c6126af96d400bd5a9d0b0f62ade15ab789446
06c209470ced7086d3c418dd32bf9245fd42678
index_key: 03188bec3dc02d2382b5251b6b4fd729d0472bbddf008c5e93b7c12270d9f
57dde111c861c13be53822a1cebb604946066
anon_issuer_origin_id: 9b0f980e5c1142fddb4401e5cd2107a87d22b73753b0d5dc9
3f9a8f5ed2ee7db78163c6a93cc41ae8158d562381c51ee
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+W9a3fcxrEo+h2/AqHXXSbXnhnP+0FH2aElOea2LemIcrKz
snLNHqBBIpwZTACMKEbW/i33t9xfdurVLwBDyU72I+cwWRY5A3RXV1fXu6r7
/X5U5/VGn8cnr1Wt+9/l27zWafymuNO7+LKqDmqX6PhVWdRFUmxOIrVel/rt
edx+uorSItmpLYyVliqr+/syf6uSh72qqn6Jj2/w8X5ND/eH4yiBD2+K8uE8
zndZEUX5vjyP6/JQ1ePhcAUP3OmH+6JMz+PLXa3Lna77z3DkKKpqtUt/VJti
B7M96Cra5+fxnwDEXlwVZV3qrILfHrb4y5+jSB3q26I8j+J+FMNPvqvO46tB
/I3epWWe3FXFjj5n4K+Soq5b3xXlzXn8u6K42ej4u++e0md6q/LNeVzhC7+t
bt0bg6TYBpP92yC+fNC7G1V6E/2b2qngY5rja1XVmwd//L+U+W8z+rQ17ptB
/Eod5HEe9U2x3T54n9KgF/s9wH25Swb0WQUY0vV5/HKn5atXqryL/6D4lSSv
YU+eHva6rPNd0Yufqk2eFeUuV/FqNhxN+anisKtx837YERFc1bCdVVxk8cVW
AyKUv4Z6jwD9VuFkrVXAVvxebVL9N38Xav0WKND7/LEdeEuP/Ta5LYttftgO
4NlghqeD+GIQ/6EoUm+Kp7dlXtXF/laXwbc00dNNcUizjSq1P1Gi7n97q9U+
392s87oaAElG0a4ot6rO32ogsPjf56vhOb1iztUl0DY9UOziWie3u2JT3DzE
/fji6sVgFOtdUqQwXvz6sNGIjL1O8gzQRy8ANr9SVZ7Ez4PH4tOvnr8+w43Z
FTt4dtP6/il8H8MhiZ/BGuHzQw4EmrYeewaPnRC4KeweUJ9elwdVPsTj4XhE
n9uzE1vcXL75of+GCQk2Wld4es0Dl1cvv7h8/jReLsfT/uhchnn+9NnVRYiW
V4f1Btb1rX6In5YP+7q4KdX+9iEGZMX1rY6/znfAenJY2pUu3+YJQHu5S4E3
lIi7N/DE880m39cwxtND+VbDQm/yGh/Pb3aqPpRA2hvgLnl9u41PCYBgpcBi
Zv3R6MgyLl5cXZ7jf+N/Xw3m4z4+fQwdQu67+AXtGYKA7EmVKYIM2K8PNVLR
1fOnvwtx0FiBj4eeNwii5HkGNJHrXR1i63dlcdj34re6HMRjXl6tyhs83Ld1
va/Ov/ii0skNHgj8ZdR/Ox7s0yzEwyqK+v1+rNaAXJUARb+5zasYuPlhixNW
TJGwASp+q8pcwWdAl7hJr5jFA/uoqjg30mIv0iKqb1Udq82muOdFMOuHf+K1
jp1IALoEUlcx8Js+bNhNvovXQPTVIEZAIr1TayRW/opeP1TaDIbj4p+JquAZ
mnGnYUR4qtSwoDwBEBIgnyrKgDvEeGIetsWhipMN4rMa8Oq3eZpudBR9hsKm
LNJDgpv5j8PFqYJhdJbvADZY4Pv3v7p4/fSbJ5f9Z4Nc11kgLVWZ3AJaEqTi
Dx/OYg+P0S/GY9zAY/RL8RgfxSOeSpjxY7jAxV9eXf1w8eLp824EmCc/fIgY
ZxXILFjnBqd3MzPovfj+Nk9uYzyCGo47sHNAy574y+YBzwbsGC49giXuinog
m2r2b33IN2l82CN/vu18sWMJhCDAVxW9vrqIv9rkwGot56lwhV99d/ni2dXl
73iFJawwycqbflmp/hof71f28Q8fesirIzkqv2x7t1rteOMiJXsS3+ebDbwE
i4GRaCW0nYkGaQUjmWF3h+0asIaEzFPDHhTAe+G76B4wCo/e5CiOZVrgl4Cc
GL/KEaIsfwejAFx5kdIo+VYbLLdRV+obkEm6rAjdgSLJeESMEiBx/bDX0en7
97BPihXHPn4EZ6In6IEtSAkQdwZrzdrrN2/evCJ+DZgQeRpVya3e6uZB/OHN
N1dPv3n+/RFqxDH6/OaHD7Cuzz6Lvy9qnIk4xIXBNtHEPQpa2rw7rfcxaAnx
JYCRpiXS7p4BJFq9zVPd+D46VCicFSLr3QPhGSQfoB0++v2rF6CyFvegF5U9
4Ej4YFXAM/C3hh2mzWScMjyfV6Ct5xtQ5hAaObuVEaaoGyQF6NW7GlTlHHeI
txUoKb+5rfGkeFQDXBg4BDwE4+dlvC82KI4qQn1xANaABxQfxXEPu/yvBwNG
DMuEDQCmWQLuAs4g1Aa7cKN3ugTJSSfAcBQEGxDxFvHkDr2qQc2sGfdAa3iK
8WN4kPRVTefBsjUeGGlr/UC4If5kiDKyRAlEZlgSclzcH0NdAAWxggfhw2Zd
W9ChUQ7sFUybHEBXjNaqJEbqwdgD/lLjeIJPGhJgUXAOUq23tI18nvBs2tMe
iahJQv4Kag3opLzrgC/HsXFa9zZRUZNDC3OA10ED36J2yRzPWFeEOBgQdAoY
AGmKhufVekSMWsIdzNCLFIxyExfEc5NbhdqDRqU6Tyo6oPkW9H0SnAFosBQ0
PfQ7hd+zAAVWYRYD29NYyr1eV8AghIj5eNl9AOK81Zs9UACaDDWIJ3VIB/HL
PW487IBIM0bbDsZB5gcD0HNA+weQHSCcYWy0aKKk1KJ7I2szMwN2QW2/QWDy
Hc6+My/0AH44RWAi7DfFQwh4hOMit4F5dT/f9VO9B1aFehaYvg9glaRpLkoj
ixvR+4X+Sv3XQ15a4q2AYNUNnjrgaQ4B+l0CkhpnqrSPaUDzxY435zFUK6Bk
2Dbk4OrhHk4gClQiNMvwHW+JnKxAUAhCIHVRCrQCXMrphyngMaRr1RANsDKg
VmIlET2F+21WimdesRnAu83HWQAB7o/mDpAmUKImkHLRDSKehL+GbVXwn4IE
D8wAdFrfDuKvC4uKnre8rWJeCyABXk+36i9FGQlzPHNLJFlHI5kVKIOymPUr
IH+kPFFUcdh7xRSa5lkGOAVGiOwf1prcwcAZrAKlBSEvJUvNqlkaTzwCXBWA
MrSchTjwaDEjA+bQFq801vv3//rVxdXl0/4n61lAy6AFeTwvPLtCAgNgFh7D
Y0g+/zcQRnV8QUwP9xtEALqOdPk5oCvVFibUeD98iGmqyJvKKpg4WksZwSUK
SLs0B2lwgNNiWJoQGJHVPXxf3HtCEgmG1HeNR5PWQvAw2B3wxveEhY1W5Q5l
UWRsDse1efH5XhFjYjAIK7RNRnvOjRRFCRqjpkdnGwDYF6VY9tG6BG0PR7lF
P0T5wJTe3lFPW6kDa4RZDsv8z6+AQGqhvZ5dXM/sRMQ7AVgE5r9WNQ1lTnot
81oM3O1ADCNde8qmkfmkq9LhVQaD/NIW1qfwQXhHWBOdTKsk4KgkmVArFcxa
LvY2r3KScqBevbLCnOZ6zcxhSzv+/jMn6j/wCQl0ZNYcDRbDrTbY4CUwruLA
MIsslRIvu1XAFGjLgeYQ/I1Ob7Qx+Z6KniUqDihaOKxK+JRG+AeNIl+SIo6D
IK8oDje3uBvMd5C7ZocdvRmfVlrDaQF4t2AaECvcArcBbQ6RSDZKrhP2teXO
u3R2DpYskZClbJ7sOKhE6I0H2P4B7RWdgaf8MbppzhiVclDWGjeSfQ2AuFP5
+IXaankw5PkwFq6DLTU3Ds6HZPUQk0G2yd1Qr/jzP9ChljEtb4DhjJXkYMor
MngIsILp2dgopBUfSmTAZkLmFo6Y48c4jzGABB3GSZVsFKzNUpJMxBPAgIYh
BXuSFrBzqAzSGaOTZ7ZEyEpGc7sCgOCCywdZmujyp/KgIH0tJwzPFL/XZxUw
/xuSttXCEXoYDpjF6YVVEWWoy2dnA0NFglVHQ/zM52hEgJJU252Sd6/oU/Y6
Co6ZYvmAw5QMd69JenZci4hgZXF6KEnvkiM98KCDQS0+mWt3Ezvsl3dSYneS
7KPiI4rhtNeoDls0CCgODbJq2Aem5lzsbGCv+gbZnUJKAC6LQD81a2+cEDK/
4MHAstg9GMrbo3qz88wWIYR7TQ5pFCjuOx554EPbQAoDaknwXnkSDYbzqNoi
OYquyChUO7NgsQArZ/wVqKTeqk2GlCtaT89SX0Oti1A9V5sjOw7YxC8MDlO7
qMuaddTSyQA8/yQIQ29MINNDgmjPVxX0Ui9KdbVHBd/Ipk76IWXRji3GHJlB
xo5O4EEUQ1GbzAQbKBbewliklVucvgMrD61Ib3hnb6JU4Lerzw0siPekAE6W
1Kjm4qFXu0iGE8gAniwvt/6osBiNLmS0vYV5ma/6AmCpN6xf3uZ70Fd5Biu7
CZlHETSIr0D8gka4YVw1yDCyvM6DxyEXF3HYgJhAFx+q9huhrmBLSXWRhUeC
IbQSnIdHO9ozHNruvCVa9hu5kYSsQW9324I2E2v4yW1RiMHJAsU556w435Hz
rtT7A7tADMTVlz6/IPck24i4r/ga2F23RUqDpWiCAcdgq4jHMhEgZUdk2rEY
QaODCIiFlIxuXTHmGFrO7xm7sNRXkRj0PbJRydPkP4u4tVZu3DhgPT5zuCjW
YHBQgFtVBbmZxYNFZhybguSkYyXZWNh4dragMYKdRRpvUlS12XZ8Rwwgg8RA
Kw75jI8GGl67wVElZYywRvYOLSlg2izFJDKB9gNrLJ67QECpwKQknU92UuQ7
S3cwiZ7eqt2NHI1K23FVuc6BJ5Q5kImIMBUqH4Q+2AGgfVQ9Q801zlS+wTCW
IWW0koyKEAzzZcwKI8vZPuncYNEZvRFpC4YCQC8MxnBedAEo52Ik85QkAlKn
JTHcP2S2ZdpHNZgYNRorOlwsn+G8k1fHAa+Ounm155+2bNsNL7EFMV3jm4Mq
wdbQrALXnW7mnonVsLsADhqutwRaTqNKw1rYgOvSvwwLQaOVtE4Q2VWonAmR
5HVkjPUeUQx6F1NDN0yUEvmVVZfkcmEmvdkcqpxkaH2vNew/vmN4PL3AZpgv
RQL1nRfVfJIhjBxrFhEivIzerG4RWl9W0fG0nMs3kKqo9aIlP3iHDwXwultj
dgebmxsf7AZ5rXdMZdcJDRSS9kdDupPZQQWQPS4SUOEBNMA6+8cS5Cb7oqpy
JJ2MGZYvL5iUWPnTxvowO6gixz94F9GniU/LSEYPb43jiMTDMnKq7FCSuy3N
q+RQVeT+lbNpdpsjCPEb4vacCvD+Mzb1mMjB8Iox66WKT77/4erNSY//jV+8
pN9fP/9fP1y+fv4Mf7/65uK77+wvkTxx9c3LH7575n5zbz59+f33z18845fh
0zj4KDr5/uKPJ7zzJy9fvbl8+eLiu5O21wEJgIUocu4SVFXcUVWhKpWU+Zo9
FV89ffX//3+jKcZXXn/9dDwarcCU5T+Wo8UU/kAnJs9GkpT/BPQ9RGq/B4ST
vw306kTtMbCPNAmmxy0KTjxHgMbohx1FBMnHeZ8jv5D4bNprukow8UF7KiMc
6Yp8qTDLm++ukBw5piC+ql/Bh6PJEwR3Op1jhA7sGzopExPaojQnVPWBgHHo
Sh9gPpjGRQeJVIxhb4Mu6Kamv8XvEHEc6ptX3z7HCVej5ZDIxGZrkEVR6xum
auTafz3oHbFt4Ng1r2IHbKQo7+gDoNWUD5/dFIkt+QDFJ4yWU0D827MT4w06
2Z3gm6Ezjqch2niLXxO3MkCB5X4Qu8yNvdG707MTEAb1wVh68NENHHLSaVpr
ECafFRgDIlDxVBC5BfE68c+Qq6U0TsTbEh0qbNXllIpG+04uET6q56jfGWsD
90dCS5XkdOR/E05tFTwTKyPLtSyqKoiWkHuRF8cMwx9lANMyK+uaNj2gGdUV
CkP1xYR7+paVtcZA9sfON4mRWW+ZNWx5mF7E5InoxPgIh8rYwiWRJj52mIy5
3TltogSk6Cg4l03ilAeOXQnUZrFBqiAPZI+bfpegliRHI9+9LTZvdRVAqqxq
iVubi6PO+IhNIM/O+YnEYmO7eIR5LSalADVtYmHisTOC2DqXiTextCBC8kx4
Xh5qBrIiozj7PgIzYU4KN29gZDewsSLRlUUm8WEtdhR5Ii2upeEQ3jnU/a1+
OMf/4DtoRJW52jhKCcLkatceKfK0ZuNbIKAcXXzKoo3vWVWGKdImqIiABC15
g+cfGbcLe6G9GHJqm/AhIU7eWKuTS3SJ/QVR4PltrcvftMCdKMQpHsq3VjVw
zg7y6IiFz54h1nl6gTeeQINTBGpqsUuZYMB2s84bCv8dgMbmU+aOHKlqq8CY
K9CgAIxrmRAwMf1A5x8Q+YNJj0LpbcMgkIHs60+tM76sJXjoqTBZXlZoDdEC
TLTLSwGxdCMuGQ+pIKDUHswX5pxEhW9sCg1pMub4AqfHvDWWFJWxQyOPuJid
+tFEo7eKb8icKXHdOGXVuD1IS4s8DyoNK7LpOTrij4Ed5+IQEz6PaoeFhbX5
yEyPuLXRPKukIlI6vKnEuT3XKx+bjrQE4yQio7W8A3FdeOgQDDjjm8nVklrl
77YJaxhoNhJYku02U1fOUdABOC2TghceLimmzykaPjjEPshJwBasuKc7PUfe
aAMnm5l0LnzCSdC22XWghywQozOaxB8DypfoHCWF2zCD/mG3yXd3kgnjhVOM
WWxlJrkrORBJEtxBx55tIxrJ921pOwRQ7PxmDOqeDDUvsuLHVeik86Ja6/EP
W+BmJ2y52NwRqOTNbqiiJlTGMvWBUbsHEEIN8g4B+kQqN4EjYyE7r2WwMPvy
3nkmKaIAf/KDA3gSdxg2a19gXgWovbKvsqWYFwTqr2Rokb31FF2iNwfOCAGL
qwLFbQ8Wl7E3ycQyyUagTWoK+ynKjGDGnPgjgGQZDY6IFsPxA8HQSP6U2N7A
G+W1MN4fXl/iGLxZpf3wOwJCMEo2AZ8yow7FcSu7QQbGd20w2mQFs3o1kMcx
kf0Lzq+TGSWp0OIAxyeDBrBeHDARbKvTXFGGXnxS63f1F/uNyncn/pI6xIOK
r4NP4cNrzIc5ULKrj6e1Jj7DSaoks7R7cXcTUW6/9V8412btskV2hmf5QUJP
/zH8tbnYoyvFSU+8VAxBY58g68MROmFW+2J/541Gvmak1VTidwjON/s7/W2a
XaZGRcvQNcXUgYYgGYD/8R//ERV7hQoPPs8584CyP8EEf/4y/uILn6rEcoyQ
+kZznkBvL9MvY/vz8RcQop/zwoVWqf9G9wsR73D8HhCILy+R3fyYp8iuLZzw
2db7zC5WONSP8Ip9nhB3l2be8wxJrOAf+vRD3CS0LwmfkRfb9I647EKxRn8x
QC9JzubJt0ABKuaoSFE+wHN/gd98BT/+t6uXLyL+XBg+MMNNKu5D5GGi/KAa
W6p7+yd8A2e0so5eBxWQwE/x1zQK6TLu5ycsjTn4n3z056fop/N+18+Rjx/7
gbHEQuuz5tkXzfOnTqbIijAiyHgUQrjMWHIg+yCvaI1t1uhOJbI1NyzKbThc
3lj2TNJoPx3X/T5l1OiCTTjDXYMMBnrUkQZnUm2K4i7e5Hf6nI8x0T5wD4GO
mS0j7eQ8Xs6nw2EveMLDBTxw8qmM+yQYJEDCR4ZxTAwA+cBnxSgQdnEGURWn
xiAefEHg88a/VMXuJDJumk2RkCYgls+93mz6HDyjb3Azvhi4T2VRsgw7P/tO
STRaezJID4oiYzWYNPfEPOfXoPRY0nj+ytBV4EWeHkku8lO0vKECe7YXmRCC
iSCIcEKtj+y8HTsHyD6CAcQx6cIPorcHYkyc4jpumNY89o8oGIX7YBqj4kQr
dClQFYQvHFHb8j4xlpCd4PiI0RZjtpRV6t6X5EST/qU3FN6mKBrNHsxF+cjO
WqYX7VKOA4Dxvu2+Js+BjtqYE98lPWOO8MmJeIw6qgLcpGDcgHUpbnNZJ3tM
jZ8JY6YmY1fVMPb6UGvyM7SO3IktTHFbgNrvfHooN67uj5yhHUqRariHWWP9
0NSIcO0dxlW3nkPlTU1PHWjD5skP4tmuxNVtyNo5tRq5pr7DghI5xXlAfhA6
f5FRZUOBOpBTbGG0LkEznp/D6DI0e5G1kZzvDx7aV6ySO0PXejRCTVo2g6Ox
wVc97xAy0UV8RjhEAXZGvgVzMjSZyCK1FYcNO91CZP08lOJGxjdHdB1MyLMa
McvkVlOevf9sZCdjuDDMnjeGCziFhcEoMp0QqBsk0FoOanMGSbrHwLAFNZLv
2JftUMk2GbO2NbrPPo4TSny3AMkA7cXJFzKecEWrzYWEyYEP9mSSYUB87jHC
MjG+3eYBDGM2QXeYZVlhOSwbgCgq7WEzc5noOzKoPgb+NkVFdXstT8PgGLS3
pHG4WAsYArrckDc3cdWeQHGp3gNRA5nmLM2iwhQ5EAs6UopmKtHQA25yvDiq
RMycdXP8gOv4xRqqDnvMVY6Em1bIVEzemHBFqqXpqpc7Jib9IhsE2Jg6DFeD
m4XFZjthanWpsIbD+uo9F4FspBerCdwoHk6Ih+DxpUo8Cvu29YFfffv8j4S6
yxdcxJfqe67hsyeENCszhlkGpyaxiSppRjuKUmYGWI8fP/VCDcYXQfaBVw/h
MvEpcTqT3AifGCR0pyrPK+oPEwXDOIbVQoTZds7Dppr+hn7VTcIyUcU+wzBJ
HqDcU4UAAOEycoqtjtwBI8d4exdqTxoRSJ9ZnxyB9v6zIOkFi/E6kw+dtuqk
RuA9IHeRNfsk2zdUruiIBd5QFYOZVxNlljrTZenZ9/IgR7zn09kUlMpYKiJt
VglQSDPnlzgPpx3fmoPkKUUvvYgQG5ZiuG6wphIbGMjZ/JhiOODKyyOKbZCC
h3Ts63MsOzv0OVFZYYEITZxnsVURKWuENb0gbIVIJNrziNL3Ane5Tmzqr3U5
WodnY9Wskv24I2/z8agFAvFIzMIIST9dJgCMstEDJ1MA2GNAWQZgD0YzfQ9N
VBMw4oo80rowMaLYbg87o8TiUY68MIDlff5A5KhwS/XrP0JUm0JVdFYHXnAc
gu028sDLuqUOBgzGzNf/N4Uth/E83r3Qr865/Q9ULmVjoiAO9X0MGu+G8woi
l7yMkTlTjZpnroAkrzg2wZtHpe23JMTvPQwY57EJNgfZciYiUAjjkVm2vDTL
qtFGMLXxXt6ag33XGVEhd49EZS2uqyjkFzbMgtprEBJr6FFc3NeahPzYXHTk
1+PC0UvzhD+ZjPuUIsLwoFZzaAWiBna1JvcotvF7rtQ4aCtofSXaebFIYfDD
PfEzrFmOAHm0hTbvscl7TN7jqa8M96Tm0cvvKvVfOHfa6sZUw4+ZtMyj6vvi
+EZISHmr9gazHsBnUqFqc8u2GpefV1tWoIwkZVUlr/zgR+5Q4AwjTplUOB02
j4mM9tK02shbEoOKkxbbzYMXQDkWossOxDKdJ/tig7kd1I8GsBZ5YKCgkN2G
OV69/hoPty1r82q2pLojPKQcJm9SaqQHN4NeJ3RP4m++ffb1KY/2JBgMqzM3
9ZOTkx7x1Cd+tYdIebvLRs43DmwrEdoX9n7ab838EpMJHoJc8dSQOlkjdoMx
diS7+cCCrjseT3rORSNlhcJnx8r1BuhEFIdb1ciSZJ/hgbQ6zDnqu+pvzOyh
umBq3eHyscPGBqjfCdQWZGQRVhvcHqo6dkX81hpC+Haf1+54Y3m/JzEyIq0d
FRuQTETjxqWUKng3KvXNgXL/Ac0qZXHiEZQpBkJNzoV0xQPpKayW1XCI2YX/
o2PAbTkRGSt5kXPYhhSNEi9K3OQzflhz3lmjDCxSWc2VyiZJypuFZw+OVszt
ICpPftq9pLMuLijjUIgeEX8s5cJiGk+Gcr6t8CHMsmYaM0qypEKGar+fZ2tL
Lzod85zqaqOzxIRMZVNEYpk3w9ViI7fzFSFTqV6XuUYN2qUZ/vD6shH2FB+W
eFfpCEmlmg3I5GVYbGPOctXc1ojSWejgoaikDH6btCDDeQlsqml8GZ+FD4zs
RBZqKx3crRfCctY4zg5oVJ99R5USb+EFZ0ywvV8dCLvZYRNWHsJzf7jV9S3n
4eO+ewRqtFIs5mJR2Iz7SwHbRlW18calj0TxRaqz8IJd7lw2Kly7B+bRMoDh
0OL/NPzZWLNtxfZ42N+quDkS1iaRWK+R2JxtydZsgG+774VkCJiUcdFx6ABT
5ri0xAHLOT7siaTwZFFuCKmAXs6RQbB+V5cqSNKzqeEmxYWrYcWW6lk+FIUp
W6J6cmQDPQdbtVM3pEiE+QuSkuIH+9GhShnKoDx4hznA4cAhvckErPnr6fUt
VRQfPGoiRXKMpEXRLWV/AsBsInUmXVW+/uoD5yvQlj1h7wrq54JFwNY+9IwV
kz7tG17ecnqdKUs2nYTcSK2SSVMLIC7/wz7l/DyUM29zsBwKL8xC8DhZ56Sh
J04de0m5xAG1WZEu3iCSbM5eFutNodjENxpEaHnU0WLSI7PiUJJtQy/d8kux
S5MUN50BJ2KXPPtQq4b3rOo1Kz/MVkkpOvVfkjk+fDgTR+YJkF2fFiWZOSeS
6XpZA3VcmaSOVJZksv9X0xH6Qi4BKD6ezmb5Cu2SK0kMF2HD09pw2brABHID
eb8u+tazbFF/islBHD0tdtRBjV34siz/JQ8np15KEb82iC6xFuqrF1/D9CaO
Cz/NdYOuW2X9db5T5YPLMfDQw8D+V6Dn52KmZxtBGXElmf7OW4lW80cRIc9+
DBESye+Tl/qfAB9sGBlJsCMtkxNKP4qRYKmfjBhA9j8dWhyL/nSsIBf8GE6o
K9zfi40dFWzccH18JyLaTCF6jCl0nBivcUROuT6RZ3IbzdjGyFw9J6HCtY84
Yr5EZDjVTdH1MUwT9hjHUqbDSLYu9IANmhSb95/5G89b4oVY7POEX1NCmlDq
nvd1PzS0UURdYUOlnXjyUS99iL+/+CMNsT3U2NKnEZRHL7cxym3COJZqRZ5J
HO/z3Y7iN2j253VODRgIu3l1hzuCI+w0OUv32B240hSwi9AYSfoY/gK7WRqF
iRbmh/hdbrAMBLLv9RGXnNVpMJSSGEC6LCvXgM4eOdJLKQ2wvFdlSvXo1qYT
9cTkpxolVXozYgJTjcXftrbAUicWkFCfS/JRBl81YOuZBIaTHptw0XdAtJt4
Egzv0hbCjFZTGzcajBHpEvWYLbiO7WLnNyDzrTt/7IoTodG1TLmfQtUmY8k4
gNopT+//lSGXnCXPFN6lFldIbOoG83qRtsim8sgLXXTkcXlo4iUKdVjvPHDd
BNfNVEFdjWGMNpWH0iTYqycmyTXJkmuvKC/f7YHUwlhBfG1DP9emUY3ty4Lu
fOd2vOaMymvkFmxwGrbAUuuJzH86GZ9xb7N3yB2uvrkYz+andpozrkL/kaF5
Qq0tVH06fDccDic9loC9WN7vSRrnWUQhHJ3+uK3gKNIfMMJbnLRSa0DCj/TZ
6f7ushd7E5w5vm98pejlpfRbP/zhOdepd4KfjBFKIewZH1/LZ5gyynjjEJP9
nP687oj5Jq5vjsk9Y5Oyn6dEyk1QbfwcheIlMIiSdtCwU9psjC6CKQBzXEsY
jlEg0Fz3ImzJxTkp1x4mr3txuBTbrCiIurU2vJls+2Mde6P+6cXdn7/0vvIm
4LRi77s9sEJ4S6DG2X49HAzG/+9o3h/9BlNsWyu2ObbUls+kdZPPKMcmWtSL
SFbhZ73xOXDWJyUCmOgcp5kgT7q2bzRx2LGZ8qzsILudcltzZvfRpzbjjChM
aovbABufpCPWmAqx+w7b6RXZx8kkoBCLJNFP/C+jAINBb4FPybpQIB2oo5lL
uuiRcANMUwzYRSqamU9CWWQzCpxm+YMWkcWcD/6j1P/8SKmgT2LmGV+aB5b2
e5f7bb+QmCjlzsn3f5qM/xw8c2Trfz3yKDJu07UF/E8v4Nc/I9V2Eqz26FWw
41eTBqesH5+4pbKGGo/7RVJjfJSVLZP8t1V1civuYEKM6UbmlUPa4Xjltvp6
o5Vg3nQP5Nrupk8CeR4654xuEbm4kaoMi3dZ9Gcm7Os+4iU8e/66zxXhaXx1
oEx2m4WP1xiY7PZEldyLzIIw8DIgg10U5GD7gxzbH4DMrnK8vqPGrCfJy+os
no2aXKBrUc20Se5ednKEVIwt4ajdbXmoHJHZ0GBtkTBz45hkQD7OcwCeFi0S
JDb0+vP5iVfEJ42uX70EhdzLAKT4sZTFh1pqXXgexJ6rOQvYkhTSrIv0wQTI
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
uCFzXR6nwhDOqubnEDumIqz9lAls8gecOooh8wejN7Ci1ak5pP+kmoOsqaNt
HVbxLYeTMeWxfYLkl4E+RfaboGyMDUgwSd00/HG2H+ie1IYsPuX2Thh4nA6X
c+nr5DvsOKzOY5C9GXt2NBdv7++CsovGkZCFOnkzA1k+c2f4qIqC/h5OIAJw
TX8gv3naf7N+EqzIreej+snP6ZwnzMluf6h+NCPsnaheoKz3FBVUE/6ZVBV/
NWNcS1tLmE9/tpZwaZx1VkJy/IMprsKjw0WF2P/uyWQsE4BsyTDZ7eOS/2MT
oFQnHxdInZqzJa69/n3H5O3Hht07uPefBHdDbP4SsKk3Hjp5KMfiG7qDuDJu
Hr6SuGr5eEpy5eCDWXEoyUUljxILovyznYtfe3EKVd+a7JeTVxr41A7H+15I
j6dn5Y78PdVJ/Os//fn0tq731fkXX9zf3w8QsEFR3nzBmVAUQvpCaNcAfPYb
6RSMRvm/HHWw/EvHr82n/yViu78FmnMomajwT5RRd6jglzjwD/30D4SjeaG3
80zEMaKJf63qNG57KP5z4Ai7Mf/3wSGJEMz4/gfAgf77/058kJss/q/fFzx3
6AbzOAh5ivucYi3+sNfCQoANeZwHXWMwCAj65I5a6Cc2x5YOOjvOMH2qKCub
l2EXwGH9TX7HQR/3cpxpneKgbGhRUSBWjsAops1jELDF5mwUdSiLw964ykFN
u9WbPYrrfEsJaiZP2QAwCMCjPHG8Sv0u/rrE/z7Tu5wDeM/UWzDVrjDRTP0t
9yawkBmnXPyGWoSBFEVYQ73ZGgQYoYrf8jM0mJ9E4t0UbO5o8i9z/kDBuY57
xMOO0I/oywOG0Zu/o97A3QxfNUoW1uiPtEWhl1dXP1y8ePrc3Fzlr+S5W4mH
FSlEdCBwr3gb4PBuJ+laPmUENjpN+5fzeldxnbcSdPi2Vxyv50xxlqwKiOUd
0HSSb8FuZHcAyvA7vcVWdHinGv1LF0jkKY9Nl2zZa5BYLy9z6/XgiymrA6bw
Pfvm2+ffn/476ZY9bifBsa2z4K9efPH8qj8aL/u/e/o9zt/qi1fB0eDZ8Tdb
8iU3d9iQeG1u6w37k0Tx0dQ6Cm2RU4+Ggk9eUWGmUU6aGrBRFReg+E4GeLr5
ylW0yD8Ruc3F8bpE8z6eAviJo7t2hDwuudmbNQ0SsDfO9oA7mCE4WseDYOVQ
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
apLAOhUKsmU6m8MiRslspDUdif8NaYDV2mkUAQA=

-->

</rfc>
