<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.25 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-privacypass-rate-limit-tokens-01" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="Rate-Limited Tokens">Rate-Limited Token Issuance Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-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="2023" month="March" day="03"/>
    <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>Discussion of this document takes place on the
    Privacy Pass Working Group mailing list (privacy-pass@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/privacy-pass/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/ietf-wg-privacypass/draft-ietf-privacypass-rate-limit-tokens"/>.</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 basic 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. This is because there is no mechanism in the issuance protocol
to link repeated client token requests in order to apply rate-limiting.</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 abusive behavior. Operations that are sensitive to abuse, 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="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 specific client, thereby coupling sensitive attestation and redemption
contexts. In some cases this might be a significant portion of browsing history.</t>
      </section>
      <section anchor="protocol-overview">
        <name>Protocol Overview</name>
        <t>The issuance protocol defined in this document decouples sensitive information in the
attestation context, such as the client identity, from the information in the redemption
context, such as the origin. It does so by employing the 'Split Origin, Attester, Issuer'
model. In this model, the Issuer learns redemption information like origin identity (used
to determine per-origin rate limit policies), and the Attester learns attestation
information like client identity (used to keep track of the previous instances of token
issuance).</t>
        <t><xref target="fig-example-allow"/> shows how this interaction works for client requests that
are within the rate limit. The Client's token request to the Attester (constructed
according to <xref target="request-one"/>, and forwarded to the Issuer according to <xref target="request-two"/>)
contains encrypted information that the Issuer uses to identify the relevant rate
limit policy to apply. This rate limit policy is returned to the Attester (according
to <xref target="response-one"/>), which then checks whether or not the Client is within this
policy. If yes, the Attester forwards the issuer token response to the Client
so that the resulting token can be redeemed by the Origin.</t>
        <figure anchor="fig-example-allow">
          <name>Successful rate-limited issuance</name>
          <artwork><![CDATA[
                                                     +-----------+
      Client                                         |   Origin  |
        |                    Challenge               |           |
        <-------------------------------------------------+      |
        |                                            |           |
        |          +-------------+                   |           |
        |          |   Attester  |                   |           |
        |          |             |                   |           |
        |          | Attest      |    +----------+   |           |
        +----------------->      |    |  Issuer  |   |           |
        |          |             |    |          |   |           |
        |   TokenRequest         |    |          |   |           |
        |   + Anon Origin ID     |    |          |   |           |
        | [ + Encrypted Origin ] |    |          |   |           |
        +----------------->      |    |          |   |           |
        |          |             |    |          |   |           |
        |          |       TokenRequest          |   |           |
        |          |      [ + Encrypted origin ] |   |           |
        |          |     +------------------->   |   |           |
        |          |             |    |          |   |           |
        |          |             |    |          |   |           |
        |          |       TokenResponse         |   |           |
        |          |      [ + Rate limit ]       |   |           |
        |          |     <-------------------+   |   |           |
        |          |             |    |          |   |           |
        |          |  in limit?  |    |          |   |           |
        |          |     yes     |    |          |   |           |
        |          |             |    |          |   |           |
        |   TokenResponse        |    |          |   |           |
        <-----------------+      |    |          |   |           |
        |          |             |    |          |   |           |
        |          +-------------+    +----------+   |           |
        |                                            |           |
        |                    Redeem                  |           |
        +------------------------------------------------->      |
                                                     |           |
                                                     +-----------+
]]></artwork>
        </figure>
        <t><xref target="fig-example-deny"/> shows how this interaction works for client requests that
exceed the rate limit. The Client's request to the Issuer and the Issuer's
response to the Attester are the same. However, in this scenario, the Client
is not within the rate limit, so the Attester responds to the Client with an
error instead of the issuer's token response.</t>
        <figure anchor="fig-example-deny">
          <name>Failed rate-limited issuance</name>
          <artwork><![CDATA[
                                                     +-----------+
      Client                                         |   Origin  |
        |                    Challenge               |           |
        <-------------------------------------------------+      |
        |                                            |           |
        |          +-------------+                   |           |
        |          |   Attester  |                   |           |
        |          |             |                   |           |
        |          | Attest      |    +----------+   |           |
        +----------------->      |    |  Issuer  |   |           |
        |          |             |    |          |   |           |
        |   TokenRequest         |    |          |   |           |
        |   + Anon Origin ID     |    |          |   |           |
        | [ + Encrypted Origin ] |    |          |   |           |
        +----------------->      |    |          |   |           |
        |          |             |    |          |   |           |
        |          |       TokenRequest          |   |           |
        |          |      [ + Encrypted origin ] |   |           |
        |          |     +------------------->   |   |           |
        |          |             |    |          |   |           |
        |          |             |    |          |   |           |
        |          |       TokenResponse         |   |           |
        |          |       + Rate limit          |   |           |
        |          |     <-------------------+   |   |           |
        |          |             |    |          |   |           |
        |          |  in limit?  |    |          |   |           |
        |          |      no     |    |          |   |           |
        |          |             |    |          |   |           |
        |        Error           |    |          |   |           |
        <-----------------+      |    |          |   |           |
        |          |             |    |          |   |           |
        |          +-------------+    +----------+   |           |
        X                                            |           |
  issuance failed                                    +-----------+
]]></artwork>
        </figure>
        <t>Each Issuer defines a window of time over which Attesters enforce rate limits.
The window begins upon a Client's first token request to the Attester for that
Issuer and ends after the window time elapses, after which the Client's rate limit
state is reset. Issuers indicate which rate limit to use for a given request by
parsing the Client's encrypted Origin. Attesters enforce the rate limit based
on the value indicated by the Issuer, and maintaining the count of accesses
by a client to a corresponding Anonymous Origin ID.</t>
        <t>Along with the rate limit for the Origin, Issuers include a value generated
with a per-Origin secret in their responses, which allows Attesters to ensure
that the Anonymous Origin ID indicated by the Client maps to exactly one Origin
as seen by the Issuer; this value that is used to validate the Anonymous Origin ID
is called the Anonymous Issuer Origin ID. Issuers can rotate the per-Origin secret
they use as desired. If a rotation event happens during a Client's active policy
window, the Attester would compute a different Anonymous Issuer Origin ID and
mistakenly conclude that the Client is accessing a new Origin. To mitigate this,
Clients provide a stable Anonymous Origin ID in their request to the Attester,
which is constant for all requests to that Origin. This allows the Attester to
detect when Issuer rotation events occur without affecting Client rate limits.</t>
        <figure anchor="fig-example-policy-windows">
          <name>Issuer policy window rotation</name>
          <artwork><![CDATA[
                          Per-Origin
                         secret rotate
Issuer:      -----+------------X----------+------------> Time
                  |         policy        |
Client            |         window        |
Token Requests:   *--------------*--------|
                  |              |        |
                  v              v        |
            Issuer Origin  Issuer Origin  |
                ID x           ID y       |
                  |                       |
            (policy start)          (policy end)
]]></artwork>
        </figure>
        <t>Unlike the basic issuance protocol <xref target="ISSUANCE"/>, the rate-limited issuance protocol
in this document has additional functional and state requirements for Client, Attester,
and Issuer. <xref target="attester-state"/> describes the state that the Attester must track
in order to enforce these limits, <xref target="client-state"/> describes the Client state necessary
for successive token requests with the Attester, and <xref target="issuer-state"/> describes the state
necessary for the Issuer to apply rate limits. The functional description of each
participant in this protocol is explained in <xref target="issuance"/></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 a per-Origin 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 applies policies on behalf of Origins, a Client is required to
reveal the Origin's identity to the delegated Issuer. It is a requirement of
this protocol that the Attester not learn the Origin's identity so that,
despite knowing the Client's identity, an Attester cannot track and concentrate
information about Client activity.</t>
        <t>An Issuer expects an Attester to verify its Clients' identities correctly, but an
Issuer cannot confirm an Attester's efficacy or the Attester-Client relationship
directly without learning the Client's identity. Similarly, an Origin does not
know the Attester's identity, but ultimately relies on the Attester to correctly
verify or authenticate a Client for the Origin's policies to be correctly
enforced. An Issuer therefore chooses to issue tokens to only known and
reputable Attesters; the Issuer can employ its own methods to determine the
reputation of a Attester.</t>
        <t>An Attester is expected to employ a stable Client identifier, such as an IP
address, a device identifier, or an account at the Attester, that can serve as a
reasonable proxy for a user with some creation and maintenance cost on the user.</t>
        <t>For the Issuance protocol, a Client is expected to create and maintain stable
and explicit secrets for time periods that are on the scale of Issuer policy
windows. Changing these secrets arbitrarily during a policy window can result in
token issuance failure for the rest of the policy window; see <xref target="client-state"/>
for more details. A Client can use a service offered by its Attester or a
third-party to store these secrets, but it is a requirement of this protocol
that the Attester not be able to learn these secrets.</t>
        <t>The privacy guarantees of this issuance protocol, specifically those around
separating the identity of the Client from the names of the Origins that it
accesses, are based on the expectation that there is not collusion between
the entities that know about Client identity and those that know about Origin
identity. Clients choose and share information with Attesters, and Origins
choose and share policy with Issuers; however, the Attester is generally
expected to not be colluding with Issuers or Origins. If this occurs, it
can become possible for an Attester to learn or infer which Origins a
Client is accessing, or for an Origin to learn or infer the Client
identity. For further discussion, see <xref target="collusion"/>.</t>
      </section>
    </section>
    <section anchor="terms">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <t>Unless otherwise specified, this document encodes protocol messages in TLS notation
from <xref target="TLS13"/>, Section 3.</t>
      <t>This draft includes pseudocode that uses the functions and conventions defined
in <xref target="HPKE"/>.</t>
      <t>Encoding an integer to a sequence of bytes in network byte order is described
using the function "encode(n, v)", where "n" is the number of bytes and "v" is
the integer value. The function "len()" returns the length of a sequence of bytes.</t>
      <t>The following terms are defined in <xref target="ARCH"/> and are used throughout this
document:</t>
      <ul spacing="normal">
        <li>Client: An entity that provides authorization tokens to services
across the Internet, in return for authorization.</li>
        <li>Issuer: An entity that produces Privacy Pass tokens to clients.</li>
        <li>Attester: An entity that can attest to properties about the client,
including previous patterns of access.</li>
        <li>Origin: The server from which the client can redeem tokens.</li>
        <li>Issuance Protocol: The protocol exchange that involves the client,
attester, and issuer, used to generate tokens.</li>
      </ul>
      <t>The following terms are defined in <xref target="AUTHSCHEME"/>, which defines the
interactions between clients and origins:</t>
      <ul spacing="normal">
        <li>Issuer Name: The name that identifies the Issuer, which is an entity
that can generate tokens for a Client using one or more issuance protocols.</li>
        <li>Token Key: Keying material that can be used with an issuance protocol
to create a signed token.</li>
        <li>Origin Name: The name that identifies the Origin, as included in a
TokenChallenge.</li>
      </ul>
      <t>Additionally, this document defines several terms that are unique to the
rate-limited issuance protocol:</t>
      <ul spacing="normal">
        <li>Issuer Policy Window: The period over which an Issuer will track access
policy, defined in terms of seconds and represented as a uint64. The state
that the Attester keeps for a Client is specific to a policy window.
The effective policy window for a specific Client starts when the Client
first sends a request associated with an Issuer.</li>
        <li>Issuer Encapsulation Key: The public key used to encrypt values such as
Origin Name in requests from Clients to the Issuer, so that Attesters cannot learn
the Origin Name value. Each Issuer Encapsulation Key is used across all requests on the
Issuer, for different Origins.</li>
        <li>Anonymous Origin ID: An identifier that is generated by the Client and marked
on requests to the Attester, which represents a specific Origin anonymously. The Client
generates a stable Anonymous Origin ID for each pair of Origin Name and Issuer 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-one"/> for details
of derivation.</li>
      </ul>
    </section>
    <section anchor="setup">
      <name>Configuration</name>
      <t>Issuers MUST provide the following parameters for configuration:</t>
      <ol spacing="normal" type="1"><li>Issuer Policy Window: a uint64 of seconds as defined in <xref target="terms"/>.</li>
        <li>Issuer Request URI: a token request URL for generating access tokens.
For example, an Issuer URL might be https://issuer.example.net/token-request. This parameter
uses resource media type "text/plain".</li>
        <li>Issuer Encapsulation Key: a <tt>EncapsulationKey</tt> structure as defined below to use when encapsulating
information, such as the origin name, to the Issuer in issuance requests. This parameter uses resource media type
"application/issuer-encap-key". The Npk parameter corresponding to the HpkeKdfId can be found in <xref target="HPKE"/>.</li>
      </ol>
      <artwork><![CDATA[
opaque HpkePublicKey[Npk]; // defined in RFC9180
uint16 HpkeKemId;          // defined in RFC9180
uint16 HpkeKdfId;          // defined in RFC9180
uint16 HpkeAeadId;         // defined in RFC9180

struct {
  uint8 key_id;
  HpkeKemId kem_id;
  HpkePublicKey public_key;
  HpkeKdfId kdf_id;
  HpkeAeadId aead_id;
} EncapsulationKey;
]]></artwork>
      <t>The Issuer parameters can be obtained from an Issuer via a directory object, which is a JSON
object whose field names and values are raw values and URLs for the parameters.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Field Name</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">issuer-policy-window</td>
            <td align="left">Issuer Policy Window as a JSON number</td>
          </tr>
          <tr>
            <td align="left">issuer-request-uri</td>
            <td align="left">Issuer Request URI resource URL as a JSON string</td>
          </tr>
          <tr>
            <td align="left">encap-keys</td>
            <td align="left">List of Encapsulation Key values, each as a base64url encoded EncapsulationKey value</td>
          </tr>
        </tbody>
      </table>
      <t>Issuers MAY advertise multiple encap-keys to support key rotation, where the order
of the keys in the list indicates preference as with token-keys.</t>
      <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",
    "encap-keys": [
      <encoded EncapsulationKey>
    ]
 }
]]></artwork>
      <t>Issuers MUST support at least one Token Key per origin. Issuers MAY support
multiple Token Key values for the same Origin in order to support rotation.
Origin configuration for Issuers is out of scope for this document, and so
the mechanism by which Origins obtain their Token Key value is not specified
here.</t>
      <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 is empty, the
encrypted message is the empty string "". If the origin_info field contains
multiple origin names, the Client is permitted to select any of the origin
names to use for the encrypted message. In general, the Client SHOULD
select the origin name that presented the challenge. However, in the context
of loading a webpage, the Client SHOULD prefer using the name of the
main document URL (the first-party name, as opposed to a third-party name)
if it is present in the origin_info list. Issuers need to ensure that they
only allow rate-limiting on expected origins, which for the case of websites
with challenges originating from third-parties would generally be the
first-party name.</t>
      <t>The HTTP authentication challenge also SHOULD contain the following
additional attribute:</t>
      <ul spacing="normal">
        <li>"issuer-encap-key", which contains a base64url encoding of a <tt>EncapsulationKey</tt> as defined
in <xref target="setup"/> to use when encrypting the Origin Name in issuance requests.</li>
      </ul>
    </section>
    <section anchor="issuance">
      <name>Issuance Protocol</name>
      <t>This section describes the Issuance protocol for a Client to request and receive
a token from an Issuer. Token issuance involves a Client, Attester, and Issuer,
with the following steps:</t>
      <ol spacing="normal" type="1"><li>The Client sends a token request containing a token request, encrypted origin
name, and one-time-use public key and signature to the Attester</li>
        <li>The Attester validates the request contents, specifically checking the request
signature, and proxies the request to the Issuer</li>
        <li>The Issuer validates the request against the signature, and processes its contents,
and produces a token response sent back to the Attester</li>
        <li>The Attester verifies the response and proxies the response to the Client</li>
      </ol>
      <t>The Issuance protocol is designed such that Client, Attester, and Issuer learn only
what is necessary for completing the protocol; see <xref target="info-disclosure"/> for more details.</t>
      <t>The Issuance protocol has a number of underlying cryptographic dependencies for
operation:</t>
      <ul spacing="normal">
        <li>RSA Blind Signatures <xref target="BLINDSIG"/>, for issuing and constructing Tokens. This support
is the same as used in the base publicly verifiable token issuance protocol <xref target="ISSUANCE"/></li>
        <li>
          <xref target="HPKE"/>, for encrypting the origin server name in transit between Client and Issuer across the Attester.</li>
        <li>Signatures with key blinding, as described in <xref target="KEYBLINDING"/>, for verifying
correctness of Client requests.</li>
      </ul>
      <t>Clients and Issuers are required to implement all of these dependencies, whereas Attesters are required
to implement signature with key blinding support.</t>
      <section anchor="state-requirements">
        <name>State Requirements</name>
        <t>The Issuance protocol requires each participating endpoint to maintain some
necessary state, as described in this section.</t>
        <section anchor="client-state">
          <name>Client State</name>
          <t>A Client is required to have the following information, derived from a given TokenChallenge:</t>
          <ul spacing="normal">
            <li>Origin Name, a hostname referring to the Origin <xref target="RFC6454"/>. This is the name
of the Origin that issued the token challenge. One or more names can be listed
in the TokenChallenge.origin_info field. Rate-limited token issuance relies on the
client selecting a single origin name from this list if multiple are present.</li>
            <li>Token Key, a blind signature public key specific to the Origin. This key is owned by the
Issuer identified by the TokenChallenge.issuer_name.</li>
            <li>Issuer Encapsulation Key, a public key used to encrypt request information corresponding
to the Issuer identified by TokenChallenge.issuer_name.</li>
          </ul>
          <t>Clients maintain a stable Client Key that they use for all communication with
a specific Attester. Client Key is a public key, where the corresponding private key
Client Secret is known only to the client.</t>
          <t>If the client loses this (Client Key, Client Secret), they may generate a new tuple. The
Attester will enforce if a client is allowed to use this new Client Key. See <xref target="attester-state"/>
for details on this enforcement.</t>
          <t>Clients also need to be able to generate an Anonymous Origin ID value that corresponds
to the pair of Origin Name and Issuer 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 and Issuer
Name. See <xref target="penalization"/> for a discussion of Attester behavior if a collision is detected.</t>
          <t>One possible mechanism for implementing this identifier is for the Client to store a mapping
between the pair of (Origin Name, Issuer 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 and Issuer Name, e.g.,
Anonymous Origin ID = HKDF(secret=Client Secret, salt="", info=(Origin Name, Issuer 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 need to enforce that Clients don't change their Client Key frequently, to ensure Clients can't
regularly evade the per-client policy as seen by the issuer. Attesters MUST NOT allow Clients to
change their Client Key more than once within a policy window, or in the subsequent policy window
after a previous Client Key change. Alternative schemes where the Attester stores the encrypted
(Client Key, Client Secret) tuple on behalf of the client are possible but not described here.</t>
          <t>The Attester keeps track of Clients and Issuers that are not trusted, due to problems like
changing Client Keys frequently, etc, as penalized entities (see <xref target="penalization"/>).</t>
          <t>Attesters are expected to know both the Issuer Policy Window and current Issuer Encapsulation Key
for any Issuer Name to which they allow access. This information can be retrieved using the
URIs defined in <xref target="setup"/>. The current Issuer Encapsulation Key value is used to check the value
of the issuer_encap_key_id in Client-generated requests (<xref target="request-one"/>) to reject requests where
clients are using unique key IDs. Such unique keys could indicate a key-targeting attack that
intends de-anonymize a client to the Issuer. In order to handle encapsulation key rotation, the Attester
needs to know the current key value and the previou key value, and remember the last time the
value changed to ensure that it does not happen too frequently (such as no more than once per
policy window, or no more than once per day).</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 previous rate limit provided by the Issuer</li>
            <li>The last received Anonymous Issuer Origin ID value for this Anonymous Origin ID, if any</li>
          </ul>
          <t>The Issuer-provided rate limit for a single Origin is intended to not change more frequently
than once per policy window. If the Attester detects a change of rate limit multiple times
for the state kept for a single policy window, it SHOULD reject tokens issued in the remainder
of the policy window.</t>
        </section>
        <section anchor="issuer-state">
          <name>Issuer State</name>
          <t>Issuers maintain a stable Issuer Origin Secret that they use in calculating values returned
to the Attester for each origin. If this value changes, it will open up a possibility
for Clients to request extra tokens for an Origin without being limited, within a
policy window. See <xref target="token-key-management"/> for details about generating and rotating
the Issuer Origin Secret.</t>
          <t>Issuers are expected to have the private key that corresponds to Issuer Encapsulation Key,
which allows them to decrypt the Origin Name values in requests.</t>
          <t>For each Origin, Issuers need to know what rate limit to enforce during a policy window.
Issuers SHOULD NOT use unique values for specific Origins, which would allow Attesters
to recognize an Origin being accessed by multiple Clients. Each Origin limit is allowed
to change, but SHOULD NOT change more often than once per policy window, to ensure that
the limit is useful.</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>
        <section anchor="client-behavior">
          <name>Client behavior</name>
          <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 computes <tt>token_key_id</tt> as the least significant byte of the Token Key
ID, where the Token Key ID is generated as SHA256(public_key) and public_key is a DER-encoded
SubjectPublicKeyInfo object carrying Token Key. The Client then constructs a InnerTokenRequest
value, denoted <tt>origin_token_request</tt>, combining <tt>token_key_id</tt>, <tt>blinded_msg</tt>, and a padded
representation of the origin name as follows:</t>
          <artwork><![CDATA[
struct {
  uint8_t token_key_id;
  uint8_t blinded_msg[Nk];
  uint8_t padded_origin_name<0..2^16-1>;
} InnerTokenRequest;
]]></artwork>
          <t>This structure is initialized and then encrypted using Issuer Encryption Key, producing
<tt>encrypted_token_request</tt>, as described in <xref target="encrypt-origin"/>.</t>
          <t>Finally, the Client uses Client Secret to produce <tt>request_signature</tt>
as described in <xref target="index-proof"/>.</t>
          <t>The Client then constructs a TokenRequest structure. This TokenRequest
structure is based on the publicly verifiable token issuance path in
<xref target="ISSUANCE"/>, adding fields for the encrypted origin name and request signature.</t>
          <artwork><![CDATA[
struct {
   uint16_t token_type = 0x0003;
   uint8_t request_key[Npk];
   uint8_t issuer_encap_key_id[32];
   uint8_t encrypted_token_request<1..2^16-1>;
   uint8_t request_signature[Nsig];
} TokenRequest;
]]></artwork>
          <t>The structure fields are defined as follows:</t>
          <ul spacing="normal">
            <li>"token_type" is a 2-octet integer, which matches the type in the challenge.</li>
            <li>"request_key" is the request_key value generated above.</li>
            <li>"issuer_encap_key_id" is a collision-resistant hash that identifies the Issuer
Encryption Key, generated as SHA256(EncapsulationKey).</li>
            <li>"encrypted_token_request" is an encrypted structure that contains an InnerTokenRequest
value, calculated as described in <xref target="encrypt-origin"/>.</li>
            <li>"request_signature" is computed as described in <xref target="index-proof"/>.</li>
          </ul>
          <t>The Client then generates an HTTP POST request to send through the Attester to
the Issuer, with the TokenRequest as the body. The media type for this request
is "message/token-request". The Client includes the "Sec-Token-Origin" header,
whose value is Anonymous Origin ID; the "Sec-Token-Client" header, whose value is
Client Key; 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 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>
        </section>
        <section anchor="attester-behavior">
          <name>Attester behavior</name>
          <t>Upon receiving a request from a Client, the Attester checks if the Client has been
penalized based on incorrect behavior using this protocol (see <xref target="penalization"/>).
If the Client is not trusted, the Attester rejects the request with an appropriate HTTP 4xx error.</t>
          <t>If this Issuer for the token request is not known to or trusted by the Attester, including if the Issuer
has been penalized (see <xref target="penalization"/>), the Attester rejects the request with
an appropriate HTTP error.</t>
          <t>If the Attester detects a token_type in the TokenRequest that it does not recognize
or support, it MUST reject the request with an HTTP 400 error.</t>
          <t>The Attester also checks to validate that the issuer_encap_key_id in the client's TokenRequest
matches a known Issuer Encapsulation Key public key for the Issuer. For example, the Attester can
fetch this key using the API defined in <xref target="setup"/>. This check is done to help ensure that
the Client has not been given a unique key that could allow the Issuer to fingerprint or target
the Client. If the key does not match, the Attester rejects the request with an HTTP
400 error. Note that this can lead to failures in the event of Issuer Issuer Encapsulation Key
rotation; see <xref target="privacy-considerations"/> for considerations.</t>
          <t>The Attester finally validates the Client's stable mapping request as described in
<xref target="attester-anon-issuer-origin-id"/>. If this fails, the Attester MUST return an HTTP 400
error to the Client.</t>
          <t>If the Attester accepts the request, it will look up the state stored for this Client.
It will look up the count of previously generate tokens for this Client using the same
Anonymous Origin ID. See <xref target="attester-state"/> for more details.</t>
          <t>If the Attester has stored state that a previous request for this Anonymous Origin ID was
rejected by the Issuer in the current policy window, it SHOULD reject the request without
forwarding it to the Issuer.</t>
          <t>If the Attester detects this Client has changed their Client Key more frequently than allowed
as described in <xref target="attester-state"/>, it SHOULD reject the request without forwarding it to
the Issuer, and also use this event to penalize the Client (see <xref target="penalization"/>).</t>
        </section>
      </section>
      <section anchor="request-two">
        <name>Attester-to-Issuer Request</name>
        <t>The Attester and the Issuer MUST use a secure and Issuer-authenticated HTTPS
connection for all requests. 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>
        <section anchor="attester-behavior-1">
          <name>Attester behavior</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>
        </section>
        <section anchor="issuer-behavior">
          <name>Issuer behavior</name>
          <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.issuer_encap_key_id correspond to known Issuer Encapsulation Keys held by the Issuer.</li>
            <li>The TokenRequest.encrypted_token_request can be decrypted using the
Issuer's private key (the private key associated with Issuer Encapsulation Key), and contains
a valid InnerTokenRequest whose unpadded origin name matches an Origin Name that is served by
the Issuer. The Origin name associated with the InnerTokenRequest value might be the empty string "",
as described in <xref target="encrypt-origin"/>, in which case the Issuer applies a cross-origin
policy if supported. If a cross-origin policy is not supported, this condition is not met.</li>
          </ul>
          <t>If any of these conditions is not met, the Issuer MUST return an HTTP 400 error to the Attester,
which will forward the error to the client.</t>
          <t>The Issuer determines the correct Issuer Key by using the decrypted Origin Name and
InnerTokenRequest.token_key_id values. If there is no Token Key whose truncated key ID matches
InnerTokenRequest.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>
      <section anchor="response-one">
        <name>Token Issuance Response</name>
        <section anchor="issuer-behavior-1">
          <name>Issuer behavior</name>
          <t>If the Issuer is willing to give a token to the Client, the Issuer decrypts
TokenRequest.encrypted_token_request to discover a InnerTokenRequest value. If this fails,
the Issuer rejects the request with a 400 error. Otherwise, the Issuer validates and
processes the token request with Issuer Origin Secret corresponding to the designated
Origin as described in <xref target="issuer-anon-issuer-origin-id"/>. If this fails, the Issuer
rejects the request with a 400 error. Otherwise, the output is
index_key.</t>
          <t>The Issuer completes the issuance flow by computing a blinded response as follows:</t>
          <artwork><![CDATA[
blind_sig = rsabssa_blind_sign(skP, InnerTokenRequest.blinded_msg)
]]></artwork>
          <t><tt>skP</tt> is the private key corresponding to the per-Origin Token Key, known only to the Issuer.
The Issuer then encrypts <tt>blind_sig</tt> to the Client as described in <xref target="encap-issuer-to-client"/>,
yielding <tt>encrypted_token_response</tt>.</t>
          <t>The Issuer generates an HTTP response with status code 200 whose body consists of
blind_sig, with the content type set as "message/token-response", the
index_key set in the "Sec-Token-Origin" header, and the limit of tokens
allowed for a Client for the Origin within a policy window set in the
"Sec-Token-Limit" header. This limit SHOULD NOT be unique to a specific
Origin, such that the Attester could use the value to infer which Origin
the Client is accessing (see <xref target="privacy-considerations"/>).</t>
          <artwork><![CDATA[
:status = 200
content-type = message/token-response
content-length = <Length of blind_sig>
sec-token-origin = index_key
sec-token-limit = Token limit

<Bytes containing the encrypted_token_response>
]]></artwork>
        </section>
        <section anchor="attester-behavior-2">
          <name>Attester behavior</name>
          <t>For all non-successful responses from the Issuer, the Attester forwards the HTTP
response unmodified to the Client as the response to the original request for this issuance.</t>
          <t>Upon receipt of a successful (2xx) 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" header is missing in a successful (2xx) response from the
Issuer, the Attester MUST count this towards penalizing the Issuer (see <xref target="penalization"/>).
The token response MUST continue to be processed, however, to prevent a malicious
Issuer from using a token issuance failure as a signal to the requesting Origin.</t>
          <t>If the Anonymous Issuer Origin ID derived from the value in the "Sec-Token-Origin" header
was previously received in a response for a request with a different Anonymous Origin ID within the
same policy window, the Attester MUST count this towards penalizing the Issuer or
Client (see <xref target="penalization"/>). The token response MUST continue to be processed, however,
to prevent a malicious Issuer from using a token issuance failure as a signal to the
requesting Origin.</t>
          <t>The Attester then stores the Anonymous Issuer Origin ID alongside the state for the Anonymous
Origin ID to compare on future token issuances.</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>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>
        </section>
        <section anchor="client-behavior-1">
          <name>Client behavior</name>
          <t>Upon receipt, the Client decrypts the <tt>blind_sig</tt> from <tt>encrypted_token_response</tt> as
described in <xref target="encap-issuer-to-client"/>. If successful, the Client then processes
the response as follows:</t>
          <artwork><![CDATA[
authenticator = rsabssa_finalize(pkI, token_input, blind_sig, blind_inv)
]]></artwork>
          <t>If this succeeds, the Client then constructs a token as described in
<xref target="AUTHSCHEME"/> as follows:</t>
          <artwork><![CDATA[
struct {
    uint16_t token_type = 0x0003
    uint8_t nonce[32];
    uint8_t context[32];
    uint8_t token_key_id[Nid];
    uint8_t authenticator[Nk]
} Token;
]]></artwork>
        </section>
      </section>
      <section anchor="penalization">
        <name>Penalization of Invalid Clients and Issuers</name>
        <t>When an Attester encounters incorrect and potentially malicious behavior
by either Clients or Issuers, it needs to "penalize" them. This involves
keeping state about invalid protocol events, and determining when a
particular Client or Issuer has exceeded a threshold for such events.</t>
        <t>Each category of invalid events can have a different threshold, and can apply
to Clients, Issuers, or both. Different penalization events are described
below, with suggested thresholds. This list is not exhaustive.</t>
        <ul spacing="normal">
          <li>Client Key changing more than once over any two consecutive policy windows
for a single Client, based on the Attester's view of Client identity.
This is a Client-specific penalization event. A RECOMMENDED threshold for
penalizing the Client based on this is one event; a well-behaved
Client will never change keys this frequently.</li>
          <li>Issuer responses missing the "Sec-Token-Origin" header on a 2xx response.
This is an Issuer-specific penalization event. A RECOMMENDED threshold for
penalizing the Issuer based on this is ten events across all Clients; a
well-behaved Issuer will never generate such responses, but it can be
useful for an Attester to have a small tolerance for errors before penalizing
an Issuer entirely.</li>
          <li>Anonymous Issuer Origin ID (from Issuer) collision across two Anonymous
Origin IDs for a particular Client within a single policy window. This
penalization event is applicable for both Clients and Issuers. A RECOMMENDED
threshold for penalizing the Issuer is ten events across different Clients.
A RECOMMENDED threshold for penalizing the Client is two events across multiple
Issuers, or five events with a single Issuer. If many events are seen for a single
Issuer, it is likely that the Issuer is compromised or malicious; while if such events
are seen for a specific Client, it is likely that the Client is is compromised or
malicious.</li>
        </ul>
        <t>Once a Client or Issuer passes the threshold for penalization, the Attester
rejects future requests from that Client or for that Issuer. This SHOULD
only be reset after a sufficient period of time (such as at least one policy
window), and based on either manual review or another validation process
determined by the Attester. Penalization indicates that a Client or Issuer
might be malicious or compromised, and so ought not to be trusted until
further validation that the error or attack has been mitigated.</t>
      </section>
    </section>
    <section anchor="encrypt-origin">
      <name>Encrypting Origin Token Requests and Responses</name>
      <t>Clients encapsulate token request information to the Issuer using the Issuer Encapsulation Key.
Issuers decrypt the token request using their corresponding private key. This process yields
the decrypted token request as well as a shared encryption context between Client and Issuer.
Issuers encapsulate their token response to the Client using an ephemeral key derived from this
shared encryption context. This process ensures that the Attester learns neither the token
request or response information.</t>
      <t>Client to Issuer encapsulation is described in <xref target="encap-client-to-issuer"/>, and Issuer to
Client encapsulation is described in <xref target="encap-issuer-to-client"/>.</t>
      <section anchor="encap-client-to-issuer">
        <name>Client to Issuer Encapsulation</name>
        <t>Given a <tt>EncapsulationKey</tt> (Issuer Encapsulation Key), Clients produce encrypted_token_request
using the following values:</t>
        <ul spacing="normal">
          <li>the one octet key identifier from the Name Key, keyID, with the corresponding KEM identified by kemID,
the public key from the configuration, pkI, and;</li>
          <li>a selected combination of KDF, identified by kdfID, and AEAD, identified by aeadID.</li>
        </ul>
        <t>Beyond the key configuration inputs, Clients also require the following inputs defined
in <xref target="request-one"/>: <tt>token_key_id</tt>, <tt>blinded_msg</tt>, <tt>request_key</tt>, <tt>origin_name</tt>, and
<tt>issuer_encap_key_id</tt>.</t>
        <t>Together, these are used to encapsulate an InnerTokenRequest and produce an encrypted token
request (<tt>encrypted_token_request</tt>).</t>
        <t><tt>origin_name</tt> contains the name of the origin that initiated the challenge, as
taken from the TokenChallenge.origin_info field. If the TokenChallenge.origin_info field
is empty, <tt>origin_name</tt> is set to the empty string "".</t>
        <t>The process for generating <tt>encrypted_token_request</tt> from <tt>blinded_msg</tt>, <tt>request_key</tt>, and
<tt>origin_name</tt> values is as follows:</t>
        <ol spacing="normal" type="1"><li>Compute an <xref target="HPKE"/> context using pkI, yielding context and encapsulation key enc.</li>
          <li>Construct associated data, aad, by concatenating the values of keyID, kemID, kdfID,
aeadID, and all other values of the TokenRequest structure.</li>
          <li>Pad origin_name with N zero bytes, where N = 31 - ((L - 1) % 32) and L is the length
of origin_name. If L is 0, N = 32. Denote this padding process as the function <tt>pad</tt>.</li>
          <li>Encrypt (seal) the padded origin_name with aad as associated data using context, yielding ciphertext ct.</li>
          <li>Concatenate the values of aad, enc, and ct, yielding encrypted_token_request.</li>
        </ol>
        <t>Note that enc is of fixed-length, so there is no ambiguity in parsing this structure.</t>
        <t>In pseudocode, this procedure is as follows:</t>
        <artwork><![CDATA[
enc, context = SetupBaseS(pkI, "InnerTokenRequest")
aad = concat(encode(1, keyID),
             encode(2, kemID),
             encode(2, kdfID),
             encode(2, aeadID),
             encode(2, token_type),
             encode(Npk, request_key),
             encode(32, issuer_encap_key_id))
padded_origin_name = pad(origin_name)
inner_token_request_enc = concat(encode(1, token_key_id),
                                 encode(Nk, blinded_msg),
                                 encode(2, len(padded_origin_name)),
                                 encode(len(padded_origin_name), padded_origin_name))
ct = context.Seal(aad, inner_token_request_enc)
encrypted_token_request = concat(enc, ct)
]]></artwork>
        <t>Issuers reverse this procedure to recover the InnerTokenRequest value by computing the AAD as
described above and decrypting encrypted_token_request with their private key skI (the private
key corresponding to pkI). The <tt>origin_name</tt> value is recovered from InnerTokenRequest.padded_origin_name
by stripping off padding bytes. In pseudocode, this procedure is as follows:</t>
        <artwork><![CDATA[
enc, ct = parse(encrypted_token_request)
aad = concat(encode(1, keyID),
             encode(2, kemID),
             encode(2, kdfID),
             encode(2, aeadID),
             encode(2, token_type),
             encode(Npk, request_key),
             encode(32, issuer_encap_key_id))
context = SetupBaseR(enc, skI, "TokenRequest")
inner_token_request_enc, error = context.Open(aad, ct)
]]></artwork>
        <t>The <tt>InnerTokenRequest.blinded_msg</tt>, <tt>InnerTokenRequest.token_key_id</tt>, and unpadded <tt>origin_name</tt>
values are used by the Issuer as described in <xref target="request-two"/>.</t>
      </section>
      <section anchor="encap-issuer-to-client">
        <name>Issuer to Client Encapsulation</name>
        <t>Given an HPKE context <tt>context</tt> computed in <xref target="encap-client-to-issuer"/>, Issuers encapsulate
their token response <tt>blind_sig</tt>, yielding an encrypted token response <tt>encrypted_token_response</tt>,
to the Client as follows:</t>
        <ol spacing="normal" type="1"><li>Export a secret <tt>secret</tt> from <tt>context</tt>, using the string "OriginTokenResponse" as context.
The length of this secret is <tt>max(Nn, Nk)</tt>, where <tt>Nn</tt> and <tt>Nk</tt> are the length of AEAD
key and nonce associated with <tt>context</tt>.</li>
          <li>Generate a random value of length <tt>max(Nn, Nk)</tt> bytes, called <tt>response_nonce</tt>.</li>
          <li>Extract a pseudorandom key <tt>prk</tt> using the <tt>Extract</tt> function provided by
the KDF algorithm associated with <tt>context</tt>. The <tt>ikm</tt> input to this
function is <tt>secret</tt>; the <tt>salt</tt> input is the concatenation of <tt>enc</tt> (from
<tt>enc_request</tt>) and <tt>response_nonce</tt></li>
          <li>Use the <tt>Expand</tt> function provided by the same KDF to extract an AEAD key
<tt>key</tt>, of length <tt>Nk</tt> - the length of the keys used by the AEAD associated
with <tt>context</tt>. Generating <tt>key</tt> uses a label of "key".</li>
          <li>Use the same <tt>Expand</tt> function to extract a nonce <tt>nonce</tt> of length <tt>Nn</tt> -
the length of the nonce used by the AEAD. Generating <tt>nonce</tt> uses a label of
"nonce".</li>
          <li>Encrypt <tt>blind_sig</tt>, passing the AEAD function Seal the values of <tt>key</tt>,
<tt>nonce</tt>, empty <tt>aad</tt>, and a <tt>pt</tt> input of <tt>request</tt>, which yields <tt>ct</tt>.</li>
          <li>Concatenate <tt>response_nonce</tt> and <tt>ct</tt>, yielding an Encapsulated Response
<tt>enc_response</tt>. Note that <tt>response_nonce</tt> is of fixed-length, so there is no
ambiguity in parsing either <tt>response_nonce</tt> or <tt>ct</tt>.</li>
        </ol>
        <t>In pseudocode, this procedure is as follows:</t>
        <artwork><![CDATA[
secret = context.Export("OriginTokenResponse", Nk)
response_nonce = random(max(Nn, Nk))
salt = concat(enc, response_nonce)
prk = Extract(salt, secret)
aead_key = Expand(prk, "key", Nk)
aead_nonce = Expand(prk, "nonce", Nn)
ct = Seal(aead_key, aead_nonce, "", blind_sig)
encrypted_token_response = concat(response_nonce, ct)
]]></artwork>
        <t>Clients decrypt <tt>encrypted_token_response</tt> by reversing this process. That is,
they first parse <tt>enc_response</tt> into <tt>response_nonce</tt> and <tt>ct</tt>. They then
follow the same process to derive values for <tt>aead_key</tt> and <tt>aead_nonce</tt>.</t>
        <t>The client uses these values to decrypt <tt>ct</tt> using the Open function provided by
the AEAD. Decrypting might produce an error, as follows:</t>
        <artwork><![CDATA[
blind_sig, error = Open(aead_key, aead_nonce, "", ct)
]]></artwork>
      </section>
    </section>
    <section anchor="anon-issuer-origin-id">
      <name>Anonymous Issuer Origin ID Computation</name>
      <t>This section describes the Client, Attester, and Issuer behavior in computing
Anonymous Issuer Origin ID, the stable mapping based on client identity and
origin name. At a high level, this functionality computes y = F(x, k), where x
is a per-Client secret and k is a per-Origin secret, subject to the following constraints:</t>
      <ul spacing="normal">
        <li>The Attester only learns y if the Client in possession of x engages with the protocol;</li>
        <li>The Attester prevents a Client with private input x from running the protocol for input x' that is not equal to x;</li>
        <li>The Issuer does not learn x, nor does it learn when two requests correspond to the same private value x; and</li>
        <li>Neither the Client nor Attester learn k.</li>
      </ul>
      <t>The interaction between Client, Attester, and Issuer in computing this
functionality is shown below.</t>
      <artwork><![CDATA[
Client               Attester                Issuer
    (request, signature)
  ---------------------->
                           (request, signature)
                         ---------------------->
                                (response)
                         <----------------------
]]></artwork>
      <t>The protocol for computing this functionality is divided into sections for
each of the participants. <xref target="client-anon-issuer-origin-id"/> describes Client behavior
for initiating the computation with its per-Client secret, <xref target="attester-anon-issuer-origin-id"/>
describes Attester behavior for verifying Client requests, <xref target="issuer-anon-issuer-origin-id"/>
describes Issuer behavior for computing the mapping with its per-Origin secret,
and <xref target="attester-output-anon-issuer-origin-id"/> describes the final Attester step for
computing the client-origin index.</t>
      <t>The index computation is based on a signature scheme with key blinding and unblinding
support, denoted BKS, as described in <xref section="3" sectionFormat="of" target="KEYBLINDING"/>. Such a scheme has the
following functions:</t>
      <ul spacing="normal">
        <li>BKS-KeyGen(): Generate a random private and public key pair (sk, pk).</li>
        <li>BKS-BlindKeyGen(): Generate a random blinding key bk.</li>
        <li>BKS-BlindPublicKey(pk, bk, ctx): Produce a blinded public key based on the input public
key pk, blind key bk, and context ctx.</li>
        <li>BKS-UnblindPublicKey(pk, bk, ctx): Produce an unblinded public key based on the input
blinded public key pk, blind bk, and context ctx.</li>
        <li>BKS-Verify(pk, msg, sig): Verify signature sig over input message msg against the
public key pk, producing a boolean value indicating success.</li>
        <li>BKS-BlindKeySign(sk_sign, sk_blind, ctx, msg): Sign input message msg with signing key sk_sign, blind
key sk_blind, and context ctx and produce a signature of size <tt>Nsig</tt> bytes.</li>
        <li>BKS-SerializePrivatekey(sk): Serialize a private key to a byte string of length <tt>Nsk</tt>.</li>
        <li>BKS-DeserializePrivatekey(buf): Attempt to deserialize a private key from an <tt>Nsk</tt>-byte
string buf. This function can fail if buf does not represent a valid private key.</li>
        <li>BKS-SerializePublicKey(pk): Serialize a public key to a byte string of length <tt>Npk</tt>.</li>
        <li>BKS-DeserializePublicKey(buf): Attempt to deserialize a public key of length <tt>Npk</tt>.
This function can fail if buf does not represent a valid public key.</li>
      </ul>
      <t>Additionally, each BKS scheme has a corresponding hash function, denoted <tt>Hash</tt>.
The implementation of each of these functions depends on the issuance protocol
token type. See <xref target="iana-token-type"/> for more details.</t>
      <section anchor="client-anon-issuer-origin-id">
        <name>Client Behavior</name>
        <t>This section describes the Client behavior for generating an one-time-use
request key and signature. Clients provide their Client Secret as input
to the request key generation step, and the rest of the token request inputs
to the signature generation step.</t>
        <section anchor="index-request">
          <name>Request Key</name>
          <t>Clients produce <tt>request_key</tt> by masking Client Key and Client Secret with a
randomly chosen blind. Let <tt>pk_sign</tt> and <tt>sk_sign</tt> denote Client Key and
Client Secret, respectively. This process is done as follows:</t>
          <ol spacing="normal" type="1"><li>Generate a random blind key, sk_blind.</li>
            <li>Blind <tt>pk_sign</tt> with <tt>sk_blind</tt> to compute a blinded public key, <tt>request_key</tt>.</li>
            <li>Output the blinded public key.</li>
          </ol>
          <t>In pseudocode, this is as follows:</t>
          <artwork><![CDATA[
sk_blind = BKS-BlindKeyGen()
ctx = concat(encode(2, token_type)), "ClientBlind")
blinded_key = BKS-BlindPublicKey(pk_sign, sk_blind, ctx)
request_key = BKS-SerializePublicKey(blinded_key)
request_blind = BKS-SerializePrivatekey(sk_blind)
]]></artwork>
        </section>
        <section anchor="index-proof">
          <name>Request Signature</name>
          <t>Clients produce a signature of their request by signing its entire contents
consisting of the following values defined in <xref target="request-one"/>:
<tt>token_key_id</tt>, <tt>blinded_msg</tt>, <tt>request_key</tt>, <tt>issuer_encap_key_id</tt>, and <tt>encrypted_token_request</tt>.
This process requires the blind value <tt>sk_blind</tt> produced during the <xref target="index-request"/> process.
As above, let pk and sk denote Client Key and Client Secret, respectively. Given these
values, this signature process works as follows:</t>
          <ol spacing="normal" type="1"><li>Concatenate all signature inputs to yield a message to sign.</li>
            <li>Compute a signature with the blind <tt>sk_blind</tt> over the input message using
Client Secret, <tt>sk_sign</tt> as the signing key.</li>
            <li>Output the signature.</li>
          </ol>
          <t>In pseudocode, this is as follows:</t>
          <artwork><![CDATA[
message = concat(token_type,
                 request_key,
                 issuer_encap_key_id,
                 encode(2, len(encrypted_token_request)),
                 encrypted_token_request)
ctx = concat(encode(2, token_type)), "ClientBlind")
request_signature = BKS-BlindKeySign(sk_sign, sk_blind, ctx, message)
]]></artwork>
        </section>
      </section>
      <section anchor="attester-anon-issuer-origin-id">
        <name>Attester Behavior (Client Request Validation)</name>
        <t>Given a TokenRequest request containing <tt>request_key</tt>, <tt>request_signature</tt>, and <tt>request_blind</tt>,
as well as Client Key <tt>pk_blind</tt>, Attesters verify the signature as follows:</t>
        <ol spacing="normal" type="1"><li>Check that <tt>request_key</tt> is a valid public key. If this fails, abort.</li>
          <li>Check that <tt>request_blind</tt> is a valid private key. If this fails, abort.</li>
          <li>Blind the Client Key <tt>pk_sign</tt> by blind <tt>sk_blind</tt>, yielding a blinded key.
If this does not match <tt>request_key</tt>, abort.</li>
          <li>Verify <tt>request_signature</tt> over the contents of the request, excluding the
signature itself, using <tt>request_key</tt>. If signature verification fails, abort.</li>
        </ol>
        <t>In pseudocode, this is as follows:</t>
        <artwork><![CDATA[
blind_key = BKS-DeserializePublicKey(request_key)
sk_blind = BKS-DeserializePrivatekey(request_blind)
ctx = concat(encode(2, token_type)), "ClientBlind")
pk_blind = BKS-BlindPublicKey(pk_sign, sk_blind, ctx)
if pk_blind != blind_key:
  raise InvalidParameterError

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

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

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

anon_issuer_origin_id = HKDF-Hash(secret=index_result,
  salt=pk_encoded, info="anon_issuer_origin_id")
]]></artwork>
      </section>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>This section describes security considerations relevant to the use of this protocol.</t>
      <section anchor="client-secret-use">
        <name>Client Secret Use</name>
        <t>The Client Secret key is used for two purposes in this protocol: (1) computing request
signatures and (2) computing the Anonymous Issuer Origin ID (with the corresponding
public key). This is necessary to ensure the client associated with the Anonymous Issuer
Origin ID is the same client that produced a corresponding request. In general, using
the same cryptographic key for two distinct purposes is considered bad practice.
However, analysis of this protocol demonstrates that it is safe in this context.
The Client Secret MUST NOT be used for any purpose outside of this protocol.</t>
      </section>
      <section anchor="custom-token-request-encapsulation">
        <name>Custom Token Request Encapsulation</name>
        <t>The protocol in this document uses <xref target="HPKE"/> directly to encrypt token request information
to the issuer while also authenticating information exposed to the attester. Oblivious HTTP
<xref target="OHTTP"/>, which is a protocol built on top of HPKE for
request encapsulation, is not suitable for this purpose since it does not allow clients to
additionally authenticate application-layer information that is visible to intermediaries,
which is the case for the data visible to the Attester.</t>
      </section>
      <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-encapsulation-keys">
        <name>Client Identification with Unique Encapsulation 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>As with the basic issuance protocol <xref target="ISSUANCE"/>, the token_key_id is truncated to a single
octet to mitigate the risk of unique keys per client.</t>
        <t>To mitigate the risk of a targeted Issuer Encapsulation Key, the Attester can observe and validate
the issuer_encap_key_id presented by the Client to the Issuer. As described in <xref target="request-one"/>, Attesters
MUST validate that the issuer_encap_key_id in the Client's TokenRequest matches a known Issuer
Encapsulation Key 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>
          <li>If an Issuer changes the rate-limit values for a single Origin, that change occurring
at the same time across multiple Clients could allow Attesters to recognize an Origin
in common across Clients. To mitigate this, Issuers either can change the limits for
multiple Origins simultaneously, or have an Origin switch to a separate Issuer.</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 new (Token Key, Issuer Origin Secret) values regularly, and
SHOULD maintain old and new secrets to allow for graceful updates. The RECOMMENDED
rotation interval is two times the length of the policy window for that
information. During generation, issuers must ensure the <tt>token_key_id</tt> (the 8-bit
prefix of SHA256(Token Key)) is different from all other <tt>token_key_id</tt>
values for that Origin currently in rotation. One way to ensure this uniqueness
is via rejection sampling, where a new key is generated until its <tt>token_key_id</tt> is
unique among all currently in rotation for the Origin.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA considerations</name>
      <section anchor="iana-token-type">
        <name>Token Type</name>
        <t>This document updates the "Token Type" Registry (<xref target="AUTHSCHEME"/>) with the following value:</t>
        <table anchor="aeadid-values">
          <name>Token Types</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Publicly Verifiable</th>
              <th align="left">Public Metadata</th>
              <th align="left">Private Metadata</th>
              <th align="left">Nk</th>
              <th align="left">Nid</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0003</td>
              <td align="left">Rate-Limited Blind RSA(SHA-384, 2048-bit) with ECDSA(P-384, SHA-384)</td>
              <td align="left">Y</td>
              <td align="left">N</td>
              <td align="left">N</td>
              <td align="left">512</td>
              <td align="left">32</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">0x0004</td>
              <td align="left">Rate-Limited Blind RSA(SHA-384, 2048-bit) with Ed25519(SHA-512)</td>
              <td align="left">Y</td>
              <td align="left">N</td>
              <td align="left">N</td>
              <td align="left">512</td>
              <td align="left">32</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
        <t>The details of the signature scheme with key blinding and unblinding functions for each token type above are described in the following sections.</t>
        <section anchor="ecdsa-sig-functions">
          <name>ECDSA-based Token Type</name>
          <t>This section describes the implementation details of the signature scheme with key
blinding and unblinding functions introduced in <xref target="anon-issuer-origin-id"/> using
<xref target="ECDSA"/> with P-384 as the underlying elliptic curve and SHA-384 as the corresponding
hash function.</t>
          <ul spacing="normal">
            <li>BKS-KeyGen(): Generate a random ECDSA private and public key pair (sk, pk).</li>
            <li>BKS-BlindKeyGen(): Generate a random ECDSA private key bk.</li>
            <li>BKS-BlindPublicKey(pk, bk, ctx): Produce a blinded public key based on the input public
key pk, blind bk, and context ctx according to <xref target="KEYBLINDING"/>, Section 6.1.</li>
            <li>BKS-UnblindPublicKey(pk, bk, ctx): Produce an unblinded public key based on the input
blinded public key pk, blind bk, and context ctx according to <xref target="KEYBLINDING"/>, Section 6.1.</li>
            <li>BKS-Verify(pk, msg, sig): Verify the DER-encoded <xref target="X690"/> BKS-Sig-Value signature
sig over input message msg against the ECDSA public key pk, producing a boolean value indicating success.</li>
            <li>BKS-BlindKeySign(sk_sign, sk_blind, ctx, msg): Sign input message msg with signing key sk_sign, blind sk_blind,
and context ctx according to <xref target="KEYBLINDING"/>, Section 6.2, and serializes the resulting signature
pair (r, s) in "raw" form, i.e., as the concatenation of two 48-byte, big endian scalars,
yielding an <tt>Nsig=96</tt> byte signature.</li>
            <li>BKS-SerializePrivatekey(sk): Serialize an ECDSA private key using the Field-Element-to-Octet-String
conversion according to <xref target="SECG"/>.</li>
            <li>BKS-DeserializePrivatekey(buf): Attempt to deserialize an ECDSA private key from a 48-byte
string buf using Octet-String-to-Field-Element from <xref target="SECG"/>. This function can fail if buf
does not represent a valid private key.</li>
            <li>BKS-SerializePublicKey(pk): Serialize an ECDSA public key using the
compressed Elliptic-Curve-Point-to-Octet-String method according to <xref target="SECG"/>.</li>
            <li>BKS-DeserializePublicKey(buf): Attempt to deserialize a public key using
the compressed Octet-String-to-Elliptic-Curve-Point method according to <xref target="SECG"/>,
and then performs partial public-key validation as defined in section 5.6.2.3.4 of
<xref target="KEYAGREEMENT"/>. This validation includes checking
that the coordinates are in the correct range, that the point is on the curve, and
that the point is not the point at infinity.</li>
          </ul>
        </section>
        <section anchor="eddsa-sig-functions">
          <name>Ed25519-based Token Type</name>
          <t>This section describes the implementation details of the signature scheme with key
blinding and unblinding functions introduced in <xref target="anon-issuer-origin-id"/> using
Ed25519 as described in <xref target="RFC8032"/>.</t>
          <ul spacing="normal">
            <li>BKS-KeyGen(): Generate a random Ed25519 private and public key pair (sk, pk), where
sk is randomly generated 32 bytes (See <xref target="RFC4086"/> for information about randomness
generation) and pk is computed according to <xref section="5.1.5" sectionFormat="comma" target="RFC8032"/>.</li>
            <li>BKS-BlindKeyGen(): Generate and output 32 random bytes.</li>
            <li>BKS-BlindPublicKey(pk, bk, ctx): Produce a blinded public key based on the input public
key pk, blind bk, and context ctx according to <xref section="5.1" sectionFormat="comma" target="KEYBLINDING"/>.</li>
            <li>BKS-UnblindPublicKey(pk, bk, ctx): Produce an unblinded public key based on the input
blinded public key pk, blind bk, and context ctx according to <xref target="KEYBLINDING"/>, Section 5.1.</li>
            <li>BKS-Verify(pk, msg, sig): Verify the signature sig over input message msg against
the Ed25519 public key pk, as defined in <xref section="5.1.7" sectionFormat="comma" target="RFC8032"/>, producing a
boolean value indicating success.</li>
            <li>BKS-BlindKeySign(sk_sign, sk_blind, ctx, msg): Sign input message msg with signing key sk_sign, blind
sk_blind, and context ctx according to <xref section="5.2" sectionFormat="comma" target="KEYBLINDING"/>, yielding an <tt>Nsig=64</tt> byte signature.</li>
            <li>BKS-SerializePrivatekey(sk): Identity function which outputs sk as an <tt>Nsk=32</tt> byte buffer.</li>
            <li>BKS-DeserializePrivatekey(buf): Identity function which outputs buf interpreted as <tt>sk</tt>.</li>
            <li>BKS-SerializePublicKey(pk): Identity function which outputs pk as an <tt>Npk=32</tt> byte buffer.</li>
            <li>BKS-DeserializePublicKey(buf): Identity function which outputs buf interpreted as <tt>pk</tt>.</li>
          </ul>
        </section>
      </section>
      <section anchor="iana-headers">
        <name>HTTP Headers</name>
        <t>This document registers four new headers for use on the token issuance path
in the "Permanent Message Header Field Names" &lt;<eref target="https://www.iana.org/assignments/message-headers"/>&gt;.</t>
        <figure anchor="iana-header-type-table">
          <name>Registered HTTP Header</name>
          <artwork><![CDATA[
    +-------------------------+----------+--------+---------------+
    | Header Field Name       | Protocol | Status |   Reference   |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Origin        |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Client        |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Request-Blind |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-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>The Privacy Pass Architecture</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="30" month="January" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for constructing
   privacy-preserving authentication mechanisms.  It provides
   recommendations on how the architecture should be deployed 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-10"/>
        </reference>
        <reference anchor="ISSUANCE">
          <front>
            <title>Privacy Pass Issuance Protocol</title>
            <author fullname="Sofia Celi" initials="S." surname="Celi">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="30" month="January" year="2023"/>
            <abstract>
              <t>   This document specifies two variants of the two-message issuance
   protocol for Privacy Pass tokens: one that produces tokens that are
   privately verifiable using the issuance private key, and another that
   produces tokens that are publicly verifiable using the issuance
   public key.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-08"/>
        </reference>
        <reference anchor="BLINDSIG">
          <front>
            <title>RSA Blind Signatures</title>
            <author fullname="Frank Denis" initials="F." surname="Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <author fullname="Frederic Jacobs" initials="F." surname="Jacobs">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="16" month="February" year="2023"/>
            <abstract>
              <t>   This document specifies an RSA-based blind signature protocol.  RSA
   blind signatures were first introduced by Chaum for untraceable
   payments.  A signature that is output from this protocol can be
   verified as an RSA-PSS signature.

   This document is a product of the Crypto Forum Research Group (CFRG)
   in the IRTF.

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-11"/>
        </reference>
        <reference anchor="AUTHSCHEME">
          <front>
            <title>The Privacy Pass HTTP Authentication Scheme</title>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="30" month="January" year="2023"/>
            <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-08"/>
        </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" initials="F." surname="Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <author fullname="Edward Eaton" initials="E." surname="Eaton">
              <organization>University of Waterloo</organization>
            </author>
            <author fullname="Tancrède Lepoint" initials="T." surname="Lepoint">
         </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="31" month="January" year="2023"/>
            <abstract>
              <t>   This document describes extensions to existing digital signature
   schemes for key blinding.  The core property of signing with key
   blinding is that a blinded public key and all signatures produced
   using the blinded key pair are independent of the unblinded key pair.
   Moreover, signatures produced using blinded key pairs are
   indistinguishable from signatures produced using unblinded key pairs.
   This functionality has a variety of applications, including Tor onion
   services and privacy-preserving airdrop for bootstrapping
   cryptocurrency systems.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-signature-key-blinding-03"/>
        </reference>
        <reference anchor="RFC6454">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth">
              <organization/>
            </author>
            <date month="December" year="2011"/>
            <abstract>
              <t>This document defines the concept of an "origin", which is often used as the scope of authority or privilege by user agents.  Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites.  In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string.  It also defines an HTTP header field, named "Origin", that indicates which origins are associated with an HTTP request.   [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </reference>
        <reference anchor="RFC8941">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="P-H. Kamp" initials="P-H." surname="Kamp">
              <organization/>
            </author>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8941"/>
          <seriesInfo name="DOI" value="10.17487/RFC8941"/>
        </reference>
        <reference anchor="RFC6570">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Hadley" initials="M." surname="Hadley">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="D. Orchard" initials="D." surname="Orchard">
              <organization/>
            </author>
            <date month="March" year="2012"/>
            <abstract>
              <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet.   [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6570"/>
          <seriesInfo name="DOI" value="10.17487/RFC6570"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk">
              <organization/>
            </author>
            <author fullname="P. Eronen" initials="P." surname="Eronen">
              <organization/>
            </author>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications.  The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions.  This document is not an Internet  Standards Track specification; it is published for informational  purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="KEYAGREEMENT">
          <front>
            <title>Recommendation for pair-wise key-establishment schemes using discrete logarithm cryptography</title>
            <author fullname="Elaine Barker" initials="E." surname="Barker">
              <organization/>
            </author>
            <author fullname="Lily Chen" initials="L." surname="Chen">
              <organization/>
            </author>
            <author fullname="Allen Roginsky" initials="A." surname="Roginsky">
              <organization/>
            </author>
            <author fullname="Apostol Vassilev" initials="A." surname="Vassilev">
              <organization/>
            </author>
            <author fullname="Richard Davis" initials="R." surname="Davis">
              <organization/>
            </author>
            <date month="April" year="2018"/>
          </front>
          <seriesInfo name="National Institute of Standards and Technology" value="report"/>
          <seriesInfo name="DOI" value="10.6028/nist.sp.800-56ar3"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara">
              <organization/>
            </author>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA).  The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves.  An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="OHTTP">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd">
              <organization/>
            </author>
            <author fullname="J. Schiller" initials="J." surname="Schiller">
              <organization/>
            </author>
            <author fullname="S. Crocker" initials="S." surname="Crocker">
              <organization/>
            </author>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts.  However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities.  The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult.  This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities.  It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
      </references>
    </references>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors of this document would like to acknowledge feedback from contributors
to the Privacy Pass working group for their help in improving this document.
The authors also thank Frank Denis and David Schinazi for their contributions.</t>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This section includes test vectors for Origin Name encryption in <xref target="encrypt-origin"/>
and Anonymous Origin ID computation in <xref target="anon-issuer-origin-id"/>. Test vectors for
the token request and response protocol can be found in <xref target="ISSUANCE"/>.</t>
      <section anchor="origin-name-encryption-test-vector">
        <name>Origin Name Encryption Test Vector</name>
        <t>The test vector below for the procedure in <xref target="encrypt-origin"/> lists the following values:</t>
        <ul spacing="normal">
          <li>origin_name: The Origin Name to encrypt, represented as a hexadecimal string.</li>
          <li>kem_id, kdf_id, aead_id: The HPKE algorithms comprising the ciphersuite DHKEM(X25519, HKDF-SHA256), HKDF-SHA256, AES-128-GCM.</li>
          <li>issuer_encap_key_seed: The seed used to derive the private key corresponding to
Issuer Encapsulation Key via the DeriveKeyPair function as defined in <xref section="7.1.3." sectionFormat="of" target="HPKE"/>,
represented as a hexadecimal string.</li>
          <li>issuer_encap_key: The public Issuer Encapsulation Key, represented as a hexadecimal string.</li>
          <li>token_type: The type of the protocol specified in this document.</li>
          <li>token_key_id: The ID of Token Key computed as in <xref target="request-one"/>, a single octet.</li>
          <li>blinded_msg: A random blinded_msg value, represented as a hexadecimal string.</li>
          <li>request_key: A random request_key value, represented as a hexadecimal string.</li>
          <li>issuer_encap_key_id: The Issuer Encapsulation Key ID computed as in <xref target="request-one"/>, represented as a hexadecimal string.</li>
          <li>encrypted_token_request: The encrypted InnerTokenRequest, represented as a hexadecimal string.</li>
        </ul>
        <artwork><![CDATA[
origin_name: 746573742e6578616d706c65
kem_id: 32
kdf_id: 1
aead_id: 1
issuer_encap_key_seed:
d2653816496f400baec656f213f1345092f4406af4f2a63e164956c4c3d240ca
issuer_encap_key: 010020d7b6a2c10e75c4239feb9897e8d23f3f3c377d78e7903611
53167736a24a9c5400010001
token_type: 3
token_key_id: 125
blinded_msg: 89da551a48270b053e53c9eb741badf89e43cb7e66366bb936e11fb2aa0
d30866986a790378bb9fc6a7cf5c32b7b7584d448ffa4ced3be650e354b3136428a52ec0
b27c4103c5855c2b9b4f521ad0713c800d7e6925b6c62e1a6f58b31d13335f468cf509b7
46a16e79b23862d277d0880706c3fb84b127d94faf8d6d2f3e124e681994441b19be084e
c5c159bcd0abab433bbc308d90ea2cabdf4216e1b07155be66a048d686e383ca1e517ab8
0025bb4849d98beb8c3d05d045c1167cb74f4451d8f85695babb604418385464f21f9a81
5fb850ed83fd16a966130427e5637816501f7a79c0010e06adeba55781ceb50f56eae152
ebd06f3cef80dc7ab121d
request_key: 0161d905e4e37f515cb61f863b60e5896aa9e4a17dbe238e752a144c64a
5412e244f0b1f75e010831e185cac023d33cb20
issuer_encap_key_id:
dd2c6de3091f1873643233d229a7a0e9defe0f9fe43f6a7c42ae3a6b16f77837
encrypted_token_request: 82ef7c068506bcabc27d068a51c7ead2cbaf600b76a15e4
d9df99a0da676da5a073fcc8f5ac77b25064d7379037b4e1b186977cface31eceb611978
c73c9aef38c9a0e8ae846881624fa6d454523a0a91d22b02b022891d0469deebd66a912a
a1ab3391b203e92e0a681f0a10c2a2d59b668daf1e5219ed16227d707fa0e8e29188bd58
7ab38b3584564ce9b6538ba82e301cfed4231a2fa4f64a67285a1b9bf648e25f3eb1644c
88d43552bdea6e4bfcbaef0de3ac245e0432be6b019494927fde0743b775f9efe8ca5fef
afbf2048890d54618d408a6001fc8fb276f6828c46f4fe1381e9775eec72ee47593df738
95d18952440d33756d78caea4bd8218950d35afa6c46c535211eda39da277260cb8dab7c
00c6840a745e8150a6ee4893e72b6a51382f877f8c05a15e891a2bde07049760f0f09879
78d78b97e47ecaf90a44996d724dd3720e308abbbf04f672bc5a4db573291986be191b06
03ff521accb6fa081c151c758f3092a89fc6ef591934ff4bc860896c57f83a31b237dd1b
803516c
]]></artwork>
      </section>
      <section anchor="anonymous-issuer-origin-id-test-vector">
        <name>Anonymous Issuer Origin ID Test Vector</name>
        <t>The test vector below for the procedure in <xref target="anon-issuer-origin-id"/> lists the following values:</t>
        <ul spacing="normal">
          <li>sk_client: Client Secret, serialized and represented as a hexadecimal string.</li>
          <li>pk_client: Client Key, serialized and represented as a hexadecimal string.</li>
          <li>sk_origin: Origin Secret, serialized and represented as a hexadecimal string.</li>
          <li>request_blind: The request_blind value computed in <xref target="index-request"/>, represented as a hexadecimal string.</li>
          <li>index_key: The index_key value computed in <xref target="issuer-anon-issuer-origin-id"/>, represented as a hexadecimal string.</li>
          <li>anon_issuer_origin_id: The anon_issuer_origin_id value computed in <xref target="attester-output-anon-issuer-origin-id"/>, represented as a hexadecimal string.</li>
        </ul>
        <artwork><![CDATA[
sk_sign: f6e6a0c9de38663ca539ff2e6a04e4fca11dc569794dc405e2d17439d6ce4f6
7abb2b81a1852e0db993b6a0452eb60d6
pk_sign: 032db7483c710673e6999a5fb2a2c6eac1d891f89bbf58d985ff168d182ad51
605c4369280efabb7692f661162e683f03c
sk_origin: 85de5fbbd787da5093da0adb240eba0cc6ea90d72032fc4b6925dd7d0ab1d
a1e5ae0be27fe9f59e9ec7e1f1b15b28696
request_blind: 0698a149fb9d16bcb0a856062f74f9191e82b35e91224a57abce60f5b
79f03a669c6b5e093d57e647865f9fd4305b5a9
request_key: 0287b0ce6b957111263d8c6126af96d400bd5a9d0b0f62ade15ab789446
06c209470ced7086d3c418dd32bf9245fd42678
index_key: 03188bec3dc02d2382b5251b6b4fd729d0472bbddf008c5e93b7c12270d9f
57dde111c861c13be53822a1cebb604946066
anon_issuer_origin_id: 9b0f980e5c1142fddb4401e5cd2107a87d22b73753b0d5dc9
3f9a8f5ed2ee7db78163c6a93cc41ae8158d562381c51ee
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
EETcUdON57MXswdJaZFnQKVhhTf5cSeNZVunu9D5wF/L0nyk0yNsnbtahVQE
SosxlSi3Z3lVD3+jHIcaiUhp3d5yZEboMvaVb4kZUVSr/NNWr4auhnMi7XHr
1NXDrm7cJvkuNkmxdfY9hqmXu41/d5CASFh6w2Kzt5U1xGrdalHyRu85ns0o
de4jVIo6z7oFbKSZqCxZd4V9gzZTEsSVSHT3aywCIpVhPC+LqsuWl3LoDqXK
E2d3q2ODt7JMMolbnA8XKPp/3TV1Rwqc53Dx3S1EAXhTjf34lzCwvhO0XDb0
gVVp/FXrqqL6qlRj9ReTrO+BOdXQvh6x8SjsV3+Sas7OmhlszL68cRZLcjRY
r0QPnjSN5F2+r3ykWCcHxGKpWER62FM0lV7vuRwJaGIVCHQb0MRUDyXVS2ND
doHEgTYEKs8huRL+SMB5Br0DrEc5QsA4akXRxPXX80bRcOCfX1/gGGFA28+v
f6RFCGRJZ+DbpuJSHDdKbMjA+K6tfaDV8lj86snjWODxa647JTNK2IqFAY5P
Cg9Av9yjw3tlsiKhylXxEVYX+Jr8vUf+llrYRxJfBZ/Ch1cx56ajLcyD08IQ
veFYOeJpxr24vsYFefaNttoGJMl0ajkqhScfKf2tb/bgTnHSI68eiICxSyvr
wlU6YlL8YnPrjRaGyclyvt/cmh+y/CJTES5H0xVjByqKpCBivEa5SVAgwue5
liSA7C8wwV+/ib/+2scq0SwjxL7BlCcwq4vsGxcM8vEXcEWf8sK5STL/jfYX
Ij7h+D0AEF+eIdn5pciQbNt1wmcr7zO7WaFUv8Ar9nkC3G2We8/zSuIE/kOf
fojriPYNwTPyXJ/eFZdTKBc7jlqQ4n/65FvAAAxjQ6dCub2H5/4VfvMVgPif
L1++iPhzIfxAFJeZmBeRlolwhGLuNrmzf8I3cEcrawh2qwIU+DX+jkYhvuwH
Bf2RQgo/4efX6NezliD1bvfAxw/9wFiiwYXxQ7CuNqLIgjICSC0O4bp0LC0p
AXyL9tgkje5WIllzwyL/hsuFY9nLWAXw+rFg83pTOORz6LA4REMis5qO99ul
2JWyBi5JROevHic5/5c4yd6iog5Hv0J/F5Z98laDJof9BuvNENfVaCo1yzDh
Av4ViSmaXpI4gSWuXoNSyX1MAmpKJJPFByLf+A4qYKyRKjMI4jEIXg6TuW7Q
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

-->

</rfc>
