<?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.2 (Ruby 3.0.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-privacypass-rate-limit-tokens-00" 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-00"/>
    <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="March" day="07"/>
    <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 common 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>
      </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 I-D.irtf-cfrg-hpke
uint16 HpkeKemId;          // defined in I-D.irtf-cfrg-hpke
uint16 HpkeKdfId;          // defined in I-D.irtf-cfrg-hpke
uint16 HpkeAeadId;         // defined in I-D.irtf-cfrg-hpke

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 token challenge MUST be interactive and per-origin. That is, the
TokenChallenge structure MUST contain both the redemption_nonce and
origin_name fields.</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 value of TokenChallenge.origin_name.</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 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>"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 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.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</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_result.</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_result 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.</t>
        <artwork><![CDATA[
:status = 200
content-type = message/token-response
content-length = <Length of blind_sig>
sec-token-origin = index_result
set-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>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>) 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, 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, name_key_id))
enc, context = SetupBaseR(enc, skI, "TokenRequest")
origin_name, error = context.Open(aad, ct)
]]></artwork>
    </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(request_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="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,
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 learn the origin name associated with a given token
request.</t>
        <t>The Issuer only learns the Attester that vouches for a particular Client's token request
and the origin name associated with a token request. The Issuer does not learn the
Anonymous Issuer Origin ID or any per-Client information used when creating a token request.</t>
        <t>The Client learns the output token. It does not learn the Anonymous Issuer Origin ID.</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>
    <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 origin_name presented in the TokenChallenge structure (<xref target="AUTHSCHEME"/>)
matches the origin that is providing the HTTP authentication challenge, 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="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>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="AUTHSCHEME" target="https://tfpauly.github.io/privacy-proxy/draft-pauly-privacypass-auth-scheme.html">
        <front>
          <title>The Privacy Pass HTTP Authentication Scheme</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </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="7" month="March" 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-03"/>
      </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="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="Richard L. Barnes">
            <organization>Cisco</organization>
          </author>
          <author fullname="Karthik Bhargavan">
            <organization>Inria</organization>
          </author>
          <author fullname="Benjamin Lipp">
            <organization>Inria</organization>
          </author>
          <author fullname="Christopher A. Wood">
            <organization>Cloudflare</organization>
          </author>
          <date day="2" month="September" year="2021"/>
          <abstract>
            <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.

 This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.
            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-hpke-12"/>
      </reference>
      <reference anchor="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-00"/>
      </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>
  </back>
  <!-- ##markdown-source:
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
/enw0TeP6VCfvdjX312GuUwTfaavlWJPiM/0l+SCZXM7mu837O9JI+5OcA1/
yNbf4+Vhe8n3oQ2clBTyCpS/kUkdfBnYNQassSv0XuyM/HiUp+8rXcC0AEUD
Bj8V904I55mhosot5uRSdZfwVFem2I67MVWqSraWHm6RezLaDVD9SBRL0FAp
ITAfAOpHvRs6i8p1Pn7885OnD2DH+N2z/HLIneI9y+Ibork7F8OrJZmYIGFb
4QoKDdquTLEeoqMsQRIUWsrAFb681/66MINZwOkZxzQptokqF4c6aWGwJvy2
ByaONGL1EwzNijoNQBSXaBNIGeuLMfxQlHi6BCv/OXhv8bJhXINBGNMLXi60
gyS7VaU3W5QYNUjyUTYaqO1vPB+sS6AMfvwNtc8D1Tan7p85Xos7TudpZRB0
pmCcMsXCMgFPiBP9Av04MVHHyeZ0T8DwiPvMYbzuNboHh2fUzJ5asBZofVGC
X4yis6MDPHgelsOs7oHmYjUFcJDhLJYNB9vq22GT7qGyfqQ7bqwPI2kpqAER
QY7WkMhliwIe58x77wrmIGHMH7U5GNDe9e4vQILJObvDQNWHcnPiN2Dc9vrU
VKeE6+fRnT9JjubzHEzO8fBgVV1nw1Ps8NreBLnS+Zeg30N2O/Y7AEpPVQNg
G9V9AN8KIJpZEk4vUJgh+desFYAgYgCwSZGmixChRQXxatR8PYLTN3o0wrtw
YFDuMLz//Zujo1dHJ2+fHb4+Hu0+GD158PCb+yfHZ29HZ6ejbx48GH79ZL96
5AnBzOLrv7RlOK1ek4BKWgrnMFSh7FISqSrMtx6Ex7k1b+4vGB8jdgbCabpP
0VXv/gO6sXCKus16ZJpKJN+pmuAb9P5q4y9WOaKGT1EJuDZR6LZpH9mwhVxs
ZJLNJV+HUqOAEWvnLDuczloWpHaELAt7CXXcd5597zpYaNjbGop7Od7zOeWY
fvbxXlzrGfqqdsq4qbT9AhvD1ldGw/tBUBCvkN2tzrfO1KvFuArvJTxxvmQ5
w+Xy57X+NWEncDx63PR2QGFAvnOPb1pT909d+4qftsP+LiWGmlepnCNnL/eM
CXDSms71kfOErmDTBp5d5aUV0eBLmjgByueDRC9s8N32ebO8PH7WUtZ8XwQk
pWebNK+WhrDjDKD+rR4ObgYP78SA9ItanUcyXwIN+mbynhK5fLZLh4Gs+Qzk
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

-->

</rfc>
