<?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.5 (Ruby 3.0.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-privacypass-rate-limit-tokens-01" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.3 -->
  <front>
    <title abbrev="Rate-Limited Tokens">Rate-Limited Token Issuance Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-privacypass-rate-limit-tokens-01"/>
    <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="April" day="05"/>
    <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>Origin Name 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 Origin Name 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>Origin Name Key: a <tt>NameKey</tt> structure as defined below to use when encrypting the Origin
Name in issuance requests. This parameter uses resource media type "application/issuer-name-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;
} NameKey;
]]></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">origin-name-key-uri</td>
            <td align="left">Origin Name 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"
    "origin-name-key-uri": "https://issuer.example.net/name-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>"origin-name-key", which contains a base64url encoding of a <tt>NameKey</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>
          <xref target="ECDSA"/> 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 ECDSA 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>Origin Name 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
regularily 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 possble 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 Origin Name 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-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 encrypts the origin name using Origin Name Key, producing
<tt>encrypted_origin_name</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 blinded_msg[Nk];
   uint8_t request_key[49];
   uint8_t origin_name_key_id[32];
   uint8_t encrypted_origin_name<1..2^16-1>;
   uint8_t request_signature[96];
} 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>"blinded_msg" is the Nk-octet request defined above.</li>
          <li>"request_key" is computed as described in <xref target="index-request"/>.</li>
          <li>"origin_name_key_id" is a collision-resistant hash that identifies the Origin Name Key,
generated as SHA256(NameKey).</li>
          <li>"encrypted_origin_name" is an encrypted structure that contains Origin Name,
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; and
the "Sec-Token-Request-Blind" header, whose value is request_blind. The Client
sends this request to the Attester's proxy URI. An example request is shown below,
where Nk = 512, 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

<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 origin_name_key_id in the client's TokenRequest
matches a known Origin Name 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 Origin Name 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.origin_name_key_id correspond to known
Token Keys and Origin Name Keys held by the Issuer.</li>
          <li>The TokenRequest.encrypted_origin_name can be decrypted using the
Issuer's private key (the private key associated with Origin Name Key), and matches
an Origin Name that is served by the Issuer. This name 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>
          <li>The TokenRequest.blinded_msg is of the correct size</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_origin_name to discover "origin". 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, TokenRequest.blinded_msg)
]]></artwork>
        <t><tt>skP</tt> is the private key corresponding to Token Key, known only to the Issuer.</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 blind_sig>
]]></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 handles the response and, if successful, processes the
body 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 Names</name>
      <t>Given a <tt>NameKey</tt> (Origin Name Key), Clients produce encrypted_origin_name and authenticate
the contents of the TokenRequest 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>, and <tt>origin_name_key_id</tt>.</t>
      <t>Together, these are used to encapsulate Origin Name (<tt>origin_name</tt>) and produce
Encrypted Origin Name (<tt>encrypted_origin</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_origin</tt> from <tt>origin_name</tt> 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. 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_origin_name.</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, "TokenRequest")
aad = concat(encode(1, keyID),
             encode(2, kemID),
             encode(2, kdfID),
             encode(2, aeadID),
             encode(2, token_type),
             encode(1, token_key_id),
             encode(Nk, blinded_msg),
             encode(49, request_key),
             encode(32, origin_name_key_id))
ct = context.Seal(aad, pad(origin_name))
encrypted_origin_name = concat(enc, ct)
]]></artwork>
      <t>Issuers reverse this procedure to recover the (padded) Origin Name by computing the AAD as
described above and decrypting encrypted_origin_name with their private key skI (the private
key corresponding to pkI), and stripping off padding bytes. In pseudocode, this procedure
is as follows:</t>
      <artwork><![CDATA[
enc, ct = parse(encrypted_origin_name)
aad = concat(encode(1, keyID),
             encode(2, kemID),
             encode(2, kdfID),
             encode(2, aeadID),
             encode(2, token_type),
             encode(1, token_key_id),
             encode(Nk, blinded_msg),
             encode(49, request_key),
             encode(32, origin_name_key_id))
enc, context = SetupBaseR(enc, skI, "TokenRequest")
origin_name, error = context.Open(aad, ct)
]]></artwork>
      <t>The resulting value of origin_name is used by the Issuer to determine which rate-limit values
to send to the Attester for enforcement. If the decrypted origin_name is the empty string "",
the Issuer applies a cross-origin rate-limit policy, if supported. If the decrypted origin_name
is the empty string "" and the Issuer does not support cross-origin rate limiting, then it MUST
abort the protocol as described in <xref target="request-two"/>.</t>
    </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 ECDSA <xref target="ECDSA"/> instantiated with P-384 and SHA-384 and
extended with key blinding support as described in <xref target="KEYBLINDING"/>. It uses the following
functions:</t>
      <ul spacing="normal">
        <li>ECDSA-KeyGen(): Generate a random ECDSA private and public key pair (sk, pk).</li>
        <li>ECDSA-BlindPublicKey(pk, r): Produce a blinded public key based on the input public
key pk and blind r according to <xref target="KEYBLINDING"/>, Section 6.1.</li>
        <li>ECDSA-Verify(pk, msg, sig): Verify the DER-encoded <xref target="X690"/> ECDSA-Sig-Value signature
sig over input message msg against the ECDSA public key pk, producing a boolean value indicating success.</li>
        <li>ECDSA-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.</li>
        <li>ECDSA-SerializePrivatekey(sk): Serialize an ECDSA private key using the Field-Element-to-Octet-String
conversion according to <xref target="SECG"/>.</li>
        <li>ECDSA-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>ECDSA-SerializePublicKey(pk): Serialize an ECDSA public key using the
compressed Elliptic-Curve-Point-to-Octet-String method according to <xref target="SECG"/>.</li>
        <li>ECDSA-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 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 ECDSA private 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 = ECDSA-KeyGen()
blinded_key = ECDSA-BlindPublicKey(pk_sign, sk_blind)
request_key = ECDSA-SerializePublicKey(blinded_key)
request_blind = ECDSA-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>name_key_id</tt>, <tt>encrypted_origin_name</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 an ECDSA 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(0x0003, // token_type
                 token_key_id,
                 blinded_msg,
                 request_key,
                 name_key_id,
                 encrypted_origin_name)
request_signature = ECDSA-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 ECDSA public key. If this fails, abort.</li>
          <li>Check that <tt>request_blind</tt> is a valid ECDSA 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 = ECDSA-DeserializePublicKey(request_key)
sk_blind = ECDSA-DeserializePrivatekey(request_blind)
pk_blind = ECDSA-BlindPublicKey(pk_sign, sk_blind)
if pk_blind != blind_key:
  raise InvalidParameterError

context = parse(request[..len(request)-96]) // this matches context computed during signing
valid = ECDSA-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 ECDSA 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 = ECDSA-DeserializePublicKey(request_key)
context = parse(request[..len(request)-96]) // this matches context computed during signing
valid = ECDSA-Verify(blind_key, context, request_signature)
if not valid:
  raise InvalidSignatureError

evaluated_key = ECDSA-BlindPublicKey(request_key, sk_origin)
index_key = ECDSA-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 ECDSA 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 SHA-384 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 = ECDSA-DeserializePublicKey(index_key)
unblinded_key = ECDSA-UnblindPublicKey(evaluated_key, sk_blind)

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

anon_issuer_origin_id = HKDF-SHA384(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 Origin Name 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</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>
      </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-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="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="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>
      </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>
      </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>origin_name_key_seed: The seed used to derive the private key corresponding to
Origin Name Key via the DeriveKeyPair function as defined in <xref section="7.1.3." sectionFormat="of" target="HPKE"/>,
represented as a hexadecimal string.</li>
          <li>origin_name_key: The public Origin Name Key, represented as a hexadecimal string.</li>
          <li>token_type: The type of the protocol specified in this document, 0x0003.</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>origin_name_key_id: The Origin Name Key ID computed as in <xref target="request-one"/>, represented as a hexadecimal string.</li>
          <li>encrypted_origin_name: The encrypted Origin Name, represented as a hexadecimal string.</li>
        </ul>
        <artwork><![CDATA[
origin_name: 746573742e6578616d706c65
kem_id: 32
kdf_id: 1
aead_id: 1
origin_name_key_seed:
ccc9e9744e7461acc6f3967757e7564b78f04ae5c9cd33f8c0c9b51ddff61f4f
origin_name_key: 010020c9a7a358ab74c0664b0cffd11a5f7090108086153d77e2824
72d254991fdbe1b00010001
token_type: 3
token_key_id: 104
blinded_msg: 01a7031dbbcca4ac6acaa4650219406fd9fbceb8c264e2b3be22823a679
6571230f29ec01fe2dd633bbd4c208addfa0a6dbb149aeb4aca9070bafe849301076a40b
442469066ef78525f16a4e8cb3596ac0c548932aa421d7294d98e86187100598e9b8a968
c56d2c0277132c3efdc04b6030b9800642db686254784927cfd941f8a3a1f71893e33af4
d73f71403108c882afed2129b050663839d77bbd38f9479e7242a2d31f2fbce72259aab4
acecf7da7168347a214c6e9bb77974812b363355ac8bf4703085de54e2af85e970a3a83e
2ee3d658951167fae57ab313569dcb7551c916cb0bda9c6293843fe75849eb6a33953145
43bccb7e5146b618c637ffe8fc1bae2fddb102ce6d9a9c5eee0d267849a9bfb12e633fbf
ffc80b76b017ae16f70ee6c3d841b9a4b1bf88264a2d62ae564941f943001ed95b869d2f
d81e82efc399507a0ed5450be2832076a40ce1dbd1e555fb0cf360e65c4087d101d87919
9180dfcecdd0a3a2340b893fd130e5d6ece273b4a646f157b344f110973403a14a5f46d3
b2ec4457e2164ce850fc395c71d4adeab69f7ec617b6b062c1afb8da558970dfea3196e9
b2acb58dcfd23f54fc2084373cd9a78f7c84047c6f64e7464999597267e9b6a0f95bf13f
634c2a23f861fc83a09d08309ad00af4abf8cf48f1f7d286f65750f20faa1310849e8aee
44c4ec6abb1c846a16a222116ad94
request_key: 8a9ffd91064e498f0b14b4b82d65255b2859da8d349e2bb362ca7c8211e
23fcd5cd01813ef6eb4b994d532c3520e1aa89e
origin_name_key_id:
590ef89ec14ebd7cd0598c7c1e045838e7c484713265c10d923d314fa1ef433f
encrypted_origin_name: b9d946ee16d9114b6d42524a1fe1e5fae9768c45d4b48ce13
2e758d614911c31c3c1b73a90b63735a0c53f5b94cf176c1a00392618dac727bc287d18
]]></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: a04e2a1c1a58ed8ca09419fe937507964b640981de40c6c05c14bb547b17830
d5b18c1acf236482234f0e4ed8a6a36e5
pk_sign: 03edf9e62abec27bd25f7171dcf24aeb163fbb026381cb634a8c41058b70b74
083a704177d0aee92a9be2740fd627fa3a4
sk_origin: abc3bbe04e44502bb3549551a87f4f843b7d6ba2fb789bd82ccebe7e304f0
77f52125a4829747bd5c68a8942500d898c
request_blind: 0d19ff14f8d24f7cceb377a0f54b27295e270624814293493d264d967
c541b490d7e95ff1fbb40e4f89dfdd9e25ad997
request_key: 02031027dcbe5e5607749fc6e4e0967cca89d591545c0badc640febc682
50199b87f3e60112a40425a03b9e8ac58d5bb77
index_key: 03878a9ff9e8bc58c05f8b6e71374d14f81a113f2a6828c4fa482e2d3ea50
04c0d790022a71d6437f905fb5d5daf036f52
anon_issuer_origin_id: 3edd83377d6a22f5726dac066ee1864f2c0424cd4868f994b
2e16ec270f4cc4e382a5b0730ca378797171fa2aec8222f
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
tBFEu0yB1gPyEEYkkvh/AFxDk4M+9QAA

-->

</rfc>
