<?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.11 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-privacypass-auth-scheme-14" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.10 -->
  <front>
    <title abbrev="Privacy Pass Authentication">The Privacy Pass HTTP Authentication Scheme</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-auth-scheme-14"/>
    <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="September" day="25"/>
    <keyword>anonymous</keyword>
    <keyword>authorization</keyword>
    <keyword>crypto</keyword>
    <abstract>
      <t>This document defines an HTTP authentication scheme for Privacy Pass,
a privacy-preserving authentication mechanism used for authorization.
The authentication scheme in this document 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 Privacy Pass tokens.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Privacy Pass tokens are unlinkable authenticators that can be used to
anonymously authorize a client (see
<xref target="ARCHITECTURE"/>).
Tokens are generated by token issuers, on the basis of authentication,
attestation, or some previous action such as solving a CAPTCHA. A client
possessing such a token is able to prove that it was able to get a token
issued, without allowing the relying party redeeming the client's token
(the origin) to link it with the issuance flow.</t>
      <t>Different types of authenticators, using different token issuance protocols,
can be used as Privacy Pass tokens.</t>
      <t>This document defines a common HTTP authentication scheme
(<xref section="11" sectionFormat="comma" target="RFC9110"/>), PrivateToken, that allows clients to redeem various
kinds of Privacy Pass tokens.</t>
      <t>Clients and relying parties (origins) interact using this scheme to perform the
token challenge and token redemption flow. In particular, origins challenge
clients for a token with an HTTP Authentication challenge (using the
WWW-Authenticate response header field). Clients can then react to that
challenge by issuing a new request with a corresponding token (using the Authorization
request header field). Clients generate tokens that match the origin's token
challenge by running the token issuance protocol
<xref target="ISSUANCE"/>. The act of presenting a token in an
Authorization request header field is referred to as token redemption. This
interaction between client and origin is shown below.</t>
      <figure anchor="fig-overview">
        <name>Challenge and redemption protocol flow</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="456" viewBox="0 0 456 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 40,64 L 40,176" fill="none" stroke="black"/>
              <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
              <path d="M 328,32 L 328,64" fill="none" stroke="black"/>
              <path d="M 360,64 L 360,112" fill="none" stroke="black"/>
              <path d="M 360,144 L 360,176" fill="none" stroke="black"/>
              <path d="M 400,32 L 400,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
              <path d="M 328,32 L 400,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 80,64" fill="none" stroke="black"/>
              <path d="M 328,64 L 400,64" fill="none" stroke="black"/>
              <path d="M 40,96 L 56,96" fill="none" stroke="black"/>
              <path d="M 336,96 L 352,96" fill="none" stroke="black"/>
              <path d="M 48,160 L 96,160" fill="none" stroke="black"/>
              <path d="M 280,160 L 360,160" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="360,96 348,90.4 348,101.6" fill="black" transform="rotate(0,352,96)"/>
              <polygon class="arrowhead" points="56,160 44,154.4 44,165.6" fill="black" transform="rotate(180,48,160)"/>
              <g class="text">
                <text x="44" y="52">Origin</text>
                <text x="364" y="52">Client</text>
                <text x="136" y="100">WWW-Authenticate:</text>
                <text x="268" y="100">TokenChallenge</text>
                <text x="284" y="132">(Run</text>
                <text x="340" y="132">issuance</text>
                <text x="416" y="132">protocol)</text>
                <text x="164" y="164">Authorization:</text>
                <text x="248" y="164">Token</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------+                              +--------+
| Origin |                              | Client |
+---+----+                              +---+----+
    |                                       |
    +-- WWW-Authenticate: TokenChallenge -->|
    |                                       |
    |                            (Run issuance protocol)
    |                                       |
    |<------ Authorization: Token ----------+
    |                                       |
]]></artwork>
        </artset>
      </figure>
      <t>In addition to working with different token issuance protocols, this scheme
optionally supports use of tokens that are associated with origin-chosen
contexts and specific origin names. Relying parties that request and redeem
tokens can choose a specific kind of token, as appropriate for its use case.
These options allow for different deployment models to prevent double-spending,
and allow for both interactive (online challenges) and non-interactive
(pre-fetched) tokens.</t>
      <section anchor="terminology">
        <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 document uses the terms "Client", "Origin", "Issuer", "Issuance Protocol",
and "Token" as defined in <xref target="ARCHITECTURE"/>. It additionally
uses the following terms in more specific ways:</t>
        <ul spacing="normal">
          <li>Issuer key: Keying material that can be used with an issuance protocol
to create a signed token.</li>
          <li>Token challenge: A request for tokens sent from an origin to a client, using
the "WWW-Authenticate" HTTP header field. This challenge identifies a specific
token issuer and issuance protocol. Token challenges optionally include
one or both of: a redemption context (see <xref target="context-construction"/>), and
a list of associated origins. These optional values are then
be bound to the token that is issued.</li>
          <li>Token redemption: An action by which a client presents a token to an origin
in an HTTP request, using the "Authorization" HTTP header field.</li>
        </ul>
      </section>
    </section>
    <section anchor="challenge-redemption">
      <name>HTTP Authentication Scheme</name>
      <t>Token redemption is performed using HTTP Authentication
(<xref section="11" sectionFormat="comma" target="RFC9110"/>), with the scheme "PrivateToken". Origins challenge
clients to present a token from a specific issuer (<xref target="challenge"/>). Once a
client has received a token from that issuer, or already has a valid token
available, it presents the token to the origin (<xref target="redemption"/>). The process of
presenting a token as authentication to an origin is also referred to
as "spending" a token.</t>
      <t>In order to prevent linkability across different transactions, clients
will often present a particular "PrivateToken" only once. Origins can link multiple
transactions to the same client if that client spends the same token value more
than once. As such, origins ought to expect at most one unique token
value, carried in one request, for each challenge.</t>
      <t>The rest of this section describes the token challenge and redemption interactions
in more detail.</t>
      <section anchor="challenge">
        <name>Token Challenge</name>
        <t>Origins send a token challenge to clients in an "WWW-Authenticate" header field
with the "PrivateToken" scheme. This authentication scheme has two mandatory parameters:
one containing a token challenge and another containing the token-key used for
producing (and verifying) a corresponding token.</t>
        <t>Origins that support the "PrivateToken" authentication scheme need to handle
the following tasks in constructing the WWW-Authenticate header field:</t>
        <ol spacing="normal" type="1"><li>Select which issuer to use, and configure the issuer name and token-key to
include in WWW-Authenticate token challenges. The issuer name is included in
the token challenge, and the issuer token-key is used to populate the
WWW-Authenticate header parameter.</li>
          <li>Determine a redemption context construction to include in the
token challenge, as discussed in <xref target="context-construction"/>.</li>
          <li>Select the origin information to include in the token challenge. This can
be empty to allow fully cross-origin tokens, a single origin name that
matches the origin itself for per-origin tokens, or a list of origin names
containing the origin itself. See <xref section="3.4" sectionFormat="of" target="ARCHITECTURE"/> for more
information about the difference between cross-origin and per-origin tokens.</li>
        </ol>
        <t>Once these decisions are made, origins construct the WWW-Authenticate header
by first constructing the token challenge as described in <xref target="challenge-structure"/>.
Origins send challenges as described in <xref target="send-challenge"/>, and clients process
them as described in <xref target="process-challenge"/> and <xref target="caching"/>.</t>
        <section anchor="challenge-structure">
          <name>Token Challenge Structure</name>
          <t>This document defines the default challenge structure that can be used across
token types, although future token types MAY extend or modify the structure
of the challenge; see <xref target="token-types"/> for the registry information
which establishes and defines the relationship between "token_type" and the
contents of the TokenChallenge message.</t>
          <t>All token challenges MUST begin with a 2-octet integer that defines the
token type, in network byte order. This type indicates the issuance protocol
used to generate the token and determines the structure and semantics of the rest of
the structure. Values are registered in an IANA registry, <xref target="token-types"/>. Client MUST
ignore challenges with token types they do not support.</t>
          <t>Even when a given token type uses the default challenge structure,
the requirements on the presence or interpretation of the fields can differ
across token types. For example, some token types might require that "origin_info"
is non-empty, while others allow it to be empty.</t>
          <t>The default TokenChallenge message has the following structure:</t>
          <artwork><![CDATA[
struct {
    uint16_t token_type;
    opaque issuer_name<1..2^16-1>;
    opaque redemption_context<0..32>;
    opaque origin_info<0..2^16-1>;
} TokenChallenge;
]]></artwork>
          <t>The structure fields are defined as follows:</t>
          <ul spacing="normal">
            <li>"token_type" is a 2-octet integer, in network byte order, as described
above.</li>
            <li>"issuer_name" is an ASCII string that identifies the issuer using the format of a
server name defined in <xref target="server-name"/>. This name identifies the issuer that is allowed to
issue tokens that can be redeemed by this origin. The field that stores this string in the challenge
is prefixed with a 2-octet integer indicating the length, in network byte order.</li>
            <li>"redemption_context" is a field that is either 0 or 32 bytes, prefixed with a single
octet indicating the length (either 0 or 32). If value is non-empty, it is a 32-byte value
generated by the origin that allows the origin to require that clients fetch tokens
bound to a specific context, as opposed to reusing tokens that were fetched for other
contexts. See <xref target="context-construction"/> for example contexts that might be useful in
practice. Challenges with redemption_context values of invalid lengths MUST be ignored.</li>
            <li>"origin_info" is an ASCII string that is either empty, or contains one or more
origin names that allow a token to be scoped to a specific set of origins. Each
origin name uses the format of a server name defined in <xref target="server-name"/>. The string
is prefixed with a 2-octet integer indicating the length, in network byte order.
If empty, any non-origin-specific token can be redeemed. If the string contains
multiple origin names, they are delimited with commas "," without any whitespace.
If this field is not empty, the Origin MUST include its own name as one of the
names in the list.</li>
          </ul>
          <t>If "origin_info" contains multiple origin names, this means the challenge is valid
for any of the origins in the list, including the origin which issued the challenge
(which must always be present in the list if it is non-empty; see <xref target="process-challenge"/>).
This can be useful in settings where clients pre-fetch and cache tokens for a particular
challenge -- including the "origin_info" field -- and then later redeem these tokens
with one of the origins in the list. See <xref target="caching"/> for more discussion about
token caching.</t>
          <section anchor="server-name">
            <name>Server Name Encoding</name>
            <t>Server names contained in a token challenge are ASCII strings that contain a hostname
and optional port, where the port is implied to be "443" if missing. The names use the
format of the authority portion of a URI as defined in <xref section="3.2" sectionFormat="of" target="URI"/>.
The names MUST NOT include a "userinfo" portion of an authority. For example, a valid
server name might be "issuer.example.com" or "issuer.example.com:8443",
but not "issuer@example.com".</t>
          </section>
          <section anchor="context-construction">
            <name>Redemption Context Construction</name>
            <t>The TokenChallenge redemption context allows the origin to determine the
context in which a given token can be redeemed. This value can be a unique
per-request nonce, constructed from 32 freshly generated random bytes. It
can also represent state or properties of the client session. Some example
properties and methods for constructing the corresponding context are below.
This list is not exhaustive.</t>
            <ul spacing="normal">
              <li>Context bound to a given time window: Construct redemption context as
F(current time window), where F is a pseudorandom function.</li>
              <li>Context bound to a client network: Construct redemption context as
F(client ASN), where F is a pseudorandom function.</li>
              <li>Context bound to a given time window and client network: Construct redemption
context as F(current time window, client ASN), where F is a pseudorandom function.</li>
            </ul>
            <t>Preventing double spending on tokens requires the origin to keep state
associated with the redemption context. An empty redemption context is not
bound to any property of the client request, so state to prevent double spending
needs to be stored and shared across all origin servers that can accept tokens until
token-key expiration or rotation. For a non-empty redemption context, the
double spend state only needs to be stored across the set of origin servers that will
accept tokens with that redemption context.</t>
            <t>Origins that share redemption contexts, i.e., by using the same redemption
context, choosing the same issuer, and providing the same origin_info field in
the TokenChallenge, must necessarily share state required to enforce double
spend prevention. Origins should consider the operational complexity of this
shared state before choosing to share redemption contexts. Failure to
successfully synchronize this state and use it for double spend prevention can
allow Clients to redeem tokens to one Origin that were issued after an
interaction with another Origin that shares the context.</t>
          </section>
        </section>
        <section anchor="send-challenge">
          <name>Sending Token Challenges</name>
          <t>When used in an authentication challenge, the "PrivateToken" scheme uses the
following parameters:</t>
          <ul spacing="normal">
            <li>"challenge", which contains a base64url-encoded <xref target="RFC4648"/> TokenChallenge
value. This document follows the default padding behavior described in
<xref section="3.2" sectionFormat="of" target="RFC4648"/>, so the base64url value MUST include padding.
As an Authentication Parameter (<tt>auth-param</tt> from <xref section="11.2" sectionFormat="comma" target="RFC9110"/>),
the value can be either a token or a quoted-string, and might be required to
be a quoted-string if the base64url string includes "=" characters. This
parameter is required for all challenges.</li>
            <li>"token-key", which contains a base64url encoding of the public key for
use with the issuance protocol indicated by the challenge. See <xref target="ISSUANCE"/>
for more information about how this public key is used by the issuance protocols
in that specification. The encoding of
the public key is determined by the token type; see <xref target="token-types"/>.
As with "challenge", the base64url value MUST include padding. As an
Authentication Parameter (<tt>auth-param</tt> from <xref section="11.2" sectionFormat="comma" target="RFC9110"/>), the
value can be either a token or a quoted-string, and might be required to be a
quoted-string if the base64url string includes "=" characters. This parameter
MAY be omitted in deployments where clients are able to retrieve the issuer key
using an out-of-band mechanism.</li>
            <li>"max-age", an optional parameter that consists of the number of seconds for
which the challenge will be accepted by the origin.</li>
          </ul>
          <t>The header field MAY also include the standard "realm" parameter, if desired.
Issuance protocols MAY define other parameters, some of which might be required.
Clients MUST ignore parameters in challenges that are not defined for the issuance
protocol corresponding to the token type in the challenge.</t>
          <t>As an example, the WWW-Authenticate header field could look like this:</t>
          <artwork><![CDATA[
WWW-Authenticate:
  PrivateToken challenge="abc...", token-key="123..."
]]></artwork>
          <section anchor="sending-multiple-token-challenges">
            <name>Sending Multiple Token Challenges</name>
            <t>It is possible for the WWW-Authenticate header field to include multiple
challenges (<xref section="11.6.1" sectionFormat="comma" target="RFC9110"/>). This allows the origin to indicate
support for different token types, issuers, or to include multiple redemption
contexts. For example, the WWW-Authenticate header field could look like this:</t>
            <artwork><![CDATA[
WWW-Authenticate:
  PrivateToken challenge="abc...", token-key="123...",
  PrivateToken challenge="def...", token-key="234..."
]]></artwork>
            <t>Origins should only include challenges for different types of issuance
protocols with functionally equivalent properties. For instance, both issuance
protocols in <xref target="ISSUANCE"/> have the same functional properties, albeit with
different mechanisms for verifying the resulting tokens during redemption.
Since clients are free to choose which challenge they want to consume when
presented with options, mixing multiple challenges with different functional
properties for one use case is nonsensical. If the origin has a preference
for one challenge over another (for example, if one uses a token type
that is faster to verify), it can sort it to be first in the list
of challenges as a hint to the client.</t>
          </section>
        </section>
        <section anchor="process-challenge">
          <name>Processing Token Challenges</name>
          <t>Upon receipt of a challenge, a client validates the TokenChallenge structure
before taking any action, such as fetching a new token or redeeming a token
in a new request. Validation requirements are as follows:</t>
          <ul spacing="normal">
            <li>The token_type is recognized and supported by the client;</li>
            <li>The TokenChallenge structure is well-formed; and</li>
            <li>If the origin_info field is non-empty, the name of the origin that issued the
authentication challenge is included in the list of origin names. Comparison
of the origin name that issued the authentication challenge against elements
in the origin_info list is done via case-insensitive equality checks.</li>
          </ul>
          <t>If validation fails, the client MUST NOT fetch or redeem a token based on the
challenge. Clients MAY have further restrictions and requirements around
validating when a challenge is considered acceptable or valid. For example,
clients can choose to ignore challenges that list origin names for which the
current connection is not authoritative (according to the TLS certificate).</t>
          <t>Caching and pre-fetching of tokens is discussed in <xref target="caching"/>.</t>
        </section>
        <section anchor="caching">
          <name>Token Caching</name>
          <t>Clients can generate multiple tokens from a single TokenChallenge, and cache
them for future use. This improves privacy by separating the time of token
issuance from the time of token redemption, and also allows clients to avoid
any overhead of receiving new tokens via the issuance protocol.</t>
          <t>Cached tokens can only be redeemed when they match all of the fields in the
TokenChallenge: token_type, issuer_name, redemption_context, and origin_info.
Clients ought to store cached tokens based on all of these fields, to
avoid trying to redeem a token that does not match. Note that each token
has a unique client nonce, which is sent in token redemption (<xref target="redemption"/>).</t>
          <t>If a client fetches a batch of multiple tokens for future use that are bound
to a specific redemption context (the redemption_context in the TokenChallenge
was not empty), clients SHOULD discard these tokens upon flushing state such as
HTTP cookies <xref target="COOKIES"/>, or if there is a network
change and the client does not have any origin-specific state like HTTP cookies.
Using these tokens in a context that otherwise would not be linkable to the
original context could allow the origin to recognize a client.</t>
        </section>
      </section>
      <section anchor="redemption">
        <name>Token Redemption</name>
        <t>The output of the issuance protocol is a token that corresponds to the origin's
challenge (see <xref target="challenge"/>).</t>
        <section anchor="token-structure">
          <name>Token Structure</name>
          <t>A token is a structure that begins with a two-octet field that indicates a token
type, which MUST match the token_type in the TokenChallenge structure. This value
determines the structure and semantics of the rest of token structure.</t>
          <t>This document defines the default token structure that can be used across
token types, although future token types MAY extend or modify the structure
of the token; see <xref target="token-types"/> for the registry information which
establishes and defines the relationship between "token_type" and the contents
of the Token structure.</t>
          <t>The default Token message has the following structure:</t>
          <artwork><![CDATA[
struct {
    uint16_t token_type;
    uint8_t nonce[32];
    uint8_t challenge_digest[32];
    uint8_t token_key_id[Nid];
    uint8_t authenticator[Nk];
} Token;
]]></artwork>
          <t>The structure fields are defined as follows:</t>
          <ul spacing="normal">
            <li>"token_type" is a 2-octet integer, in network byte order, as described
above.</li>
            <li>"nonce" is a 32-octet value containing a client-generated random nonce.</li>
            <li>"challenge_digest" is a 32-octet value containing the hash of the
original TokenChallenge, SHA-256(TokenChallenge), where SHA-256 is as defined
in <xref target="SHS"/>. Changing the hash function to something
other than SHA-256 would require defining a new token type and token structure
(since the contents of challenge_digest would be computed differently),
which can be done in a future specification.</li>
            <li>"token_key_id" is a Nid-octet identifier for the token authentication
key. The value of this field is defined by the token_type and corresponding
issuance protocol.</li>
            <li>"authenticator" is a Nk-octet authenticator that is cryptographically bound
to the preceding fields in the token; see <xref target="verification"/> for more information
about how this field is used in verifying a token. The token_type and corresponding
issuance protocol determine the value of the authenticator field and how it is computed.
The value of constant Nk depends on token_type, as defined in <xref target="token-types"/>.</li>
          </ul>
          <t>The authenticator value in the Token structure is computed over the token_type,
nonce, challenge_digest, and token_key_id fields. A token is considered a valid
if token verification using succeeds; see <xref target="verification"/> for details about
verifying the token and its authenticator value.</t>
        </section>
        <section anchor="sending-tokens">
          <name>Sending Tokens</name>
          <t>When used for client authorization, the "PrivateToken" authentication
scheme defines one parameter, "token", which contains the base64url-encoded
Token struct. As with the challenge parameters (<xref target="challenge"/>), the base64url
value MUST include padding. As an Authentication Parameter (<tt>auth-param</tt> from
<xref section="11.2" sectionFormat="comma" target="RFC9110"/>), the value can be either a token or a
quoted-string, and might be required to be a quoted-string if the base64url
string includes "=" characters. All unknown or unsupported parameters to
"PrivateToken" authentication credentials MUST be ignored.</t>
          <t>Clients present this Token structure to origins in a new HTTP request using
the Authorization header field as follows:</t>
          <artwork><![CDATA[
Authorization: PrivateToken token="abc..."
]]></artwork>
          <t>For context-bound tokens, origins store or reconstruct the contexts of previous
TokenChallenge structures in order to validate the token. A TokenChallenge can
be bound to a specific TLS session with a client, but origins can also accept
tokens for valid challenges in new sessions. Origins SHOULD implement some form
of double-spend prevention that prevents a token with the same nonce from being
redeemed twice. Double-spend prevention ensures that clients cannot replay tokens
for previous challenges. See <xref target="replay-attacks"/> for more information about replay
attacks. For context-bound tokens, this double-spend prevention can require no state
or minimal state, since the context can be used to verify token uniqueness.</t>
        </section>
        <section anchor="verification">
          <name>Token Verification</name>
          <t>A token consists of some input cryptographically bound to an authenticator
value, such as a digital signature. Verifying a token consists of checking that
the authenticator value is correct.</t>
          <t>The authenticator value is as computed when running and finalizing the issuance
protocol corresponding to the token type with the following value as the input:</t>
          <artwork><![CDATA[
struct {
    uint16_t token_type;
    uint8_t nonce[32];
    uint8_t challenge_digest[32];
    uint8_t token_key_id[Nid];
} AuthenticatorInput;
]]></artwork>
          <t>The value of these fields are as described in <xref target="redemption"/>. The cryptographic
verification check depends on the token type; see <xref section="5.4" sectionFormat="of" target="ISSUANCE"/>
and <xref section="6.4" sectionFormat="of" target="ISSUANCE"/> for verification instructions for the issuance
protocols described in <xref target="ISSUANCE"/>. As such, the security properties of the
token, e.g., the probability that one can forge an authenticator value without
invoking the issuance protocol, depend on the cryptographic algorithm used by
the issuance protocol as determined by the token type.</t>
        </section>
      </section>
    </section>
    <section anchor="client-behavior">
      <name>Client Behavior</name>
      <t>When a client receives one or more token challenges in response to a request,
the client has a set of choices to make:</t>
      <ul spacing="normal">
        <li>Whether or not to redeem a token via a new request to the origin.</li>
        <li>Whether to redeem a previously issued and cached token, or redeem a token freshly issued from the issuance protocol.</li>
        <li>If multiple challenges were sent, which challenge to use for redeeming a
token on a subsequent request.</li>
      </ul>
      <t>The approach to these choices depends on the use case of the application, as
well as the deployment model (see <xref section="4" sectionFormat="of" target="ARCHITECTURE"/> for discussion
of the different deployment models).</t>
      <section anchor="choosing-to-redeem-tokens">
        <name>Choosing to Redeem Tokens</name>
        <t>Some applications of tokens might require clients to always present a token
as authentication in order to successfully make requests. For example, a restricted
service that wants to only allow access to valid users, but do so without learning
specific user credential information, could use tokens that are based on attesting user
credentials. In these kinds of use cases, clients will need to always redeem a
token in order to successfully make a request.</t>
        <t>Many other use cases for Privacy Pass tokens involve open services that must work
with any client, including those that either cannot redeem tokens, or can only sometimes redeem
tokens. For example, a service can use tokens as a way to reduce the incidence of
presenting CAPTCHAs to users. In such use cases, services will regularly encounter
clients that cannot redeem a token or choose not to. In order to mitigate the risk
of these services relying on always receiving tokens, clients that are capable of
redeeming tokens can ignore token challenges (and instead behave as if they were a client
that either doesn't support redeeming tokens or is unable to generate a new token, by not
sending a new request that contains a token to redeem) with some
non-trivial probability. See <xref section="5.1" sectionFormat="of" target="ARCHITECTURE"/> for further considerations
on avoiding discriminatory behavior across clients when using Privacy Pass tokens.</t>
        <t>Clients might also choose to not redeem tokens in subsequent requests when the
token challenges indicate erroneous or malicious behavior on the part of the
challenging origin. For example, if a client's ability to generate tokens via an
attester and issuer is limited to a certain rate, a malicious origin could send
an excessive number of token challenges with unique redemption contexts
in order to cause the client to exhaust its ability to generate new tokens, or
to overwhelm issuance servers. The limits here will vary based on the specific
deployment, but clients SHOULD have some implementation-specific policy
to minimize the number of tokens that can be retrieved by origins.</t>
      </section>
      <section anchor="choosing-between-multiple-challenges">
        <name>Choosing Between Multiple Challenges</name>
        <t>A single response from an origin can include multiple token challenges.
For example, a set of challenges could include different token types
and issuers, to allow clients to choose a preferred issuer or type.</t>
        <t>The choice of which challenge to use for redeeming tokens is up to
client policy. This can involve which token types are supported or preferred,
which issuers are supported or preferred, or whether or not the
client is able to use cached tokens based on the redemption context
or origin information in the challenge. See <xref target="caching"/> for more discussion
on token caching. Regardless of how the choice is made, it SHOULD be done in a
consistent manner to ensure that the choice does not reveal information about the
specific client; see <xref section="6.2" sectionFormat="of" target="ARCHITECTURE"/> for more details on the privacy
implications of issuance consistency.</t>
      </section>
    </section>
    <section anchor="origin-behavior">
      <name>Origin Behavior</name>
      <t>Origins choose what token challenges to send to clients, which will vary
depending on the use case and deployment model. The origin chooses
which token types, issuers, redemption contexts, and origin info to include
in challenges. If an origin sends multiple challenges, each challenge SHOULD
be equivalent in terms of acceptability for token redemption, since clients
are free to choose to generate tokens based on any of the challenges.</t>
      <t>Origins ought to consider the time involved in token issuance. Particularly,
a challenge that includes a unique redemption context will prevent a client
from using cached tokens, and thus can add more delay before the client
is able to redeem a token.</t>
      <t>Origins SHOULD minimize the number of challenges sent to a particular client
context (referred to as the "redemption context" in
<xref section="3.3" sectionFormat="of" target="ARCHITECTURE"/>), to avoid overwhelming clients and issuers
with token requests that might cause clients to hit rate limits.</t>
      <section anchor="greasing">
        <name>Greasing</name>
        <t>In order to prevent clients becoming incompatible with new token challenges,
origins SHOULD include random token types, from the Reserved list of "greased"
types (defined in <xref target="token-types"/>), with some non-trivial probability.</t>
        <t>Additionally, for deployments where tokens are not required (such as when tokens
are used as a way to avoiding showing CAPTCHAs), origins SHOULD randomly 
choose to not challenge clients for tokens with some non-trivial probability.
This helps origins ensure that their behavior for handling clients that cannot
redeem tokens is maintained and exercised consistently.</t>
      </section>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>This section contains security considerations for the PrivateToken authentication
scheme described in this document.</t>
      <section anchor="randomness-requirements">
        <name>Randomness Requirements</name>
        <t>All random values in the challenge and token MUST be
generated using a cryptographically secure source of randomness (<xref target="RFC4086"/>).</t>
      </section>
      <section anchor="replay-attacks">
        <name>Replay Attacks</name>
        <t>Applications SHOULD constrain tokens to a single origin unless the use case can
accommodate replay attacks. Replaying tokens is not necessarily a security
or privacy problem. As an example, it is reasonable for clients to replay tokens
in contexts where token redemption does not induce side effects and in which
client requests are already linkable. One possible setting where this applies
is where tokens are sent as part of 0-RTT data.</t>
        <t>If successful token redemption produces side effects, origins SHOULD implement an
anti-replay mechanism to mitigate the harm of such replays. See <xref section="8" sectionFormat="comma" target="TLS13"/>
and <xref section="9.2" sectionFormat="comma" target="RFC9001"/> for details about anti-replay mechanisms, as well as
<xref section="3" sectionFormat="comma" target="RFC8470"/> for discussion about safety considerations for 0-RTT
HTTP data.</t>
      </section>
      <section anchor="reflection-attacks">
        <name>Reflection Attacks</name>
        <t>The security properties of token challenges vary depending on whether the
challenge contains a redemption context or not, as well as whether the
challenge is per-origin or not. For example, cross-origin tokens with empty
contexts can be reflected from one party by another, as shown below.</t>
        <figure anchor="fig-replay">
          <name>Replay attack example</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="176" width="472" viewBox="0 0 472 176" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                <path d="M 40,64 L 40,160" fill="none" stroke="black"/>
                <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
                <path d="M 176,32 L 176,64" fill="none" stroke="black"/>
                <path d="M 216,64 L 216,160" fill="none" stroke="black"/>
                <path d="M 264,32 L 264,64" fill="none" stroke="black"/>
                <path d="M 392,32 L 392,64" fill="none" stroke="black"/>
                <path d="M 424,64 L 424,144" fill="none" stroke="black"/>
                <path d="M 464,32 L 464,64" fill="none" stroke="black"/>
                <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
                <path d="M 176,32 L 264,32" fill="none" stroke="black"/>
                <path d="M 392,32 L 464,32" fill="none" stroke="black"/>
                <path d="M 8,64 L 80,64" fill="none" stroke="black"/>
                <path d="M 176,64 L 264,64" fill="none" stroke="black"/>
                <path d="M 392,64 L 464,64" fill="none" stroke="black"/>
                <path d="M 40,96 L 56,96" fill="none" stroke="black"/>
                <path d="M 192,96 L 208,96" fill="none" stroke="black"/>
                <path d="M 216,112 L 232,112" fill="none" stroke="black"/>
                <path d="M 224,128 L 288,128" fill="none" stroke="black"/>
                <path d="M 352,128 L 424,128" fill="none" stroke="black"/>
                <path d="M 48,144 L 64,144" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="232,128 220,122.4 220,133.6" fill="black" transform="rotate(180,224,128)"/>
                <polygon class="arrowhead" points="216,96 204,90.4 204,101.6" fill="black" transform="rotate(0,208,96)"/>
                <polygon class="arrowhead" points="56,144 44,138.4 44,149.6" fill="black" transform="rotate(180,48,144)"/>
                <g class="text">
                  <text x="44" y="52">Origin</text>
                  <text x="220" y="52">Attacker</text>
                  <text x="428" y="52">Client</text>
                  <text x="124" y="100">TokenChallenge</text>
                  <text x="276" y="116">(reflect</text>
                  <text x="356" y="116">challenge)</text>
                  <text x="412" y="116">-&gt;</text>
                  <text x="320" y="132">Token</text>
                  <text x="108" y="148">(reflect</text>
                  <text x="172" y="148">token)</text>
                  <text x="208" y="148">-</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+--------+           +----------+               +--------+
| Origin |           | Attacker |               | Client |
+---+----+           +----+-----+               +---+----+
    |                     |                         |
    +-- TokenChallenge -->|                         |
    |                     +-- (reflect challenge) ->|
    |                     |<-------- Token ---------+
    |<-- (reflect token) -+                         |
    |                     |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="token-exhaustion-attacks">
        <name>Token Exhaustion Attacks</name>
        <t>When a Client holds cross-origin tokens with empty contexts, it
is possible for any Origin in the cross-origin set to deplete that Client
set of tokens. To prevent this from happening, tokens can be scoped to single
Origins (with non-empty origin_info) such that they can only be redeemed for
a single Origin. Alternatively, if tokens are cross-Origin, Clients can use
alternate methods to prevent many tokens from being redeemed at once. For
example, if the Origin requests an excess of tokens, the Client could choose to
not present any tokens for verification if a redemption had already
occurred in a given time window.</t>
        <t>Token challenges that include non-empty origin_info bind tokens to one or more
specific origins. As described in <xref target="challenge"/>, clients only accept such
challenges from origin names listed in the origin_info string. Even if multiple
origins are listed, a token can only be redeemed for an origin if the challenge
has a match for the origin_info. For example, if "a.example.com" issues
a challenge with an origin_info string of "a.example.com,b.example.com", a
client could redeem a token fetched for this challenge if and only if
"b.example.com" also included an origin_info string of
"a.example.com,b.example.com". On the other hand, if "b.example.com" had an
origin_info string of "b.example.com" or "b.example.com,a.example.com" or
"a.example.com,b.example.com,c.example.com", the string would not match and the
client would need to use a different token.</t>
      </section>
      <section anchor="timing-correlation-attacks">
        <name>Timing Correlation Attacks</name>
        <t>Context-bound token challenges require clients to obtain matching tokens when
challenged, rather than presenting a token that was obtained from a different
context in the past. This can make it more likely that issuance and redemption
events will occur at approximately the same time. For example, if a client is
challenged for a token with a unique context at time T1 and then subsequently
obtains a token at time T2, a colluding issuer and origin can link this to the
same client if T2 is unique to the client. This linkability is less feasible as
the number of issuance events at time T2 increases. Depending on the "max-age"
token challenge parameter, clients MAY try to add delay to the time between
being challenged and redeeming a token to make this sort of linkability more
difficult. For more discussion on correlation risks between token issuance and
redemption, see <xref target="ARCHITECTURE"/>.</t>
      </section>
      <section anchor="cross-context-linkability-attacks">
        <name>Cross-Context Linkability Attacks</name>
        <t>As discussed in <xref target="challenge"/>, clients SHOULD discard any context-bound tokens
upon flushing cookies or changing networks, to prevent an origin using the
redemption context state as a cookie to recognize clients.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <section anchor="authentication-scheme">
        <name>Authentication Scheme</name>
        <t>This document registers the "PrivateToken" authentication scheme in the
"Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry" defined
in <xref section="16.4" sectionFormat="comma" target="RFC9110"/>.</t>
        <dl>
          <dt>Authentication Scheme Name:</dt>
          <dd>
            <t>PrivateToken</t>
          </dd>
          <dt>Pointer to specification text:</dt>
          <dd>
            <t><xref target="challenge-redemption"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="token-types">
        <name>Token Type Registry</name>
        <t>IANA is requested to create a new "Privacy Pass Token Type" registry in a new
"Privacy Pass Parameters" page to list identifiers for issuance protocols
defined for use with the Privacy Pass token authentication scheme. These
identifiers are two-byte values, so the maximum possible value is
0xFFFF = 65535.</t>
        <t>New registrations need to list the following attributes:</t>
        <dl spacing="compact">
          <dt>Value:</dt>
          <dd>
            <t>The two-byte identifier for the algorithm</t>
          </dd>
          <dt>Name:</dt>
          <dd>
            <t>Name of the issuance protocol</t>
          </dd>
          <dt>Token Structure:</dt>
          <dd>
            <t>The contents of the Token structure in <xref target="redemption"/></t>
          </dd>
          <dt>Token Key Encoding:</dt>
          <dd>
            <t>The encoding of the "token-key" parameter in <xref target="redemption"/></t>
          </dd>
          <dt>TokenChallenge Structure:</dt>
          <dd>
            <t>The contents of the TokenChallenge structure in <xref target="challenge"/></t>
          </dd>
          <dt>Public Verifiability:</dt>
          <dd>
            <t>A Y/N value indicating if the output tokens have the
public verifiability property; see <xref section="3.5" sectionFormat="of" target="ARCHITECTURE"/>
for more details about this property.</t>
          </dd>
          <dt>Public Metadata:</dt>
          <dd>
            <t>A Y/N value indicating if the output tokens can contain
public metadata; see <xref section="3.5" sectionFormat="of" target="ARCHITECTURE"/>
for more details about this property.</t>
          </dd>
          <dt>Private Metadata:</dt>
          <dd>
            <t>A Y/N value indicating if the output tokens can contain
private metadata; see <xref section="3.5" sectionFormat="of" target="ARCHITECTURE"/>
for more details about this property.</t>
          </dd>
          <dt>Nk:</dt>
          <dd>
            <t>The length in bytes of an output authenticator</t>
          </dd>
          <dt>Nid:</dt>
          <dd>
            <t>The length of the token key identifier</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>Where this algorithm is defined</t>
          </dd>
          <dt>Notes:</dt>
          <dd>
            <t>Any notes associated with the entry</t>
          </dd>
        </dl>
        <t>New entries in this registry are subject to the Specification Required
registration policy (<xref section="4.6" sectionFormat="comma" target="RFC8126"/>). Designated experts need to
ensure that the token type is defined to be used for both token issuance and
redemption. Additionally, the experts can reject registrations on the basis
that they do not meet the security and privacy requirements for issuance
protocols defined in <xref section="3.2" sectionFormat="of" target="ARCHITECTURE"/>.</t>
        <t><xref target="ISSUANCE"/> defines entries for this registry.</t>
        <section anchor="reserved-values">
          <name>Reserved Values</name>
          <t>This document defines several Reserved values, which can be used by clients
and servers to send "greased" values in token challenges and redemptions to
ensure that implementations remain able to handle unknown token types
gracefully (this technique is inspired by <xref target="RFC8701"/>). Implementations SHOULD
select reserved values at random when including them in greased messages.
Servers can include these in TokenChallenge structures, either as the only
challenge when no real token type is desired, or as one challenge in a list of
challenges that include real values. Clients can include these in Token
structures when they are not able to present a real token. The
contents of the Token structure SHOULD be filled with random bytes when
using greased values.</t>
          <t>The initial contents for this registry consists of multiple reserved values,
with the following attributes, which are repeated for each registration:</t>
          <dl spacing="compact">
            <dt>Value:</dt>
            <dd>
              <t>0x0000, 0x02AA, 0x1132, 0x2E96, 0x3CD3, 0x4473, 0x5A63, 0x6D32, 0x7F3F,
0x8D07, 0x916B, 0xA6A4, 0xBEAB, 0xC3F3, 0xDA42, 0xE944, 0xF057</t>
            </dd>
            <dt>Name:</dt>
            <dd>
              <t>RESERVED</t>
            </dd>
            <dt>Token Structure:</dt>
            <dd>
              <t>Random bytes</t>
            </dd>
            <dt>Token Key Encoding:</dt>
            <dd>
              <t>Random bytes</t>
            </dd>
            <dt>TokenChallenge Structure:</dt>
            <dd>
              <t>Random bytes</t>
            </dd>
            <dt>Publicly Verifiable:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Public Metadata:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Private Metadata:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Nk:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Nid:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>This document</t>
            </dd>
            <dt>Notes:</dt>
            <dd>
              <t>None</t>
            </dd>
          </dl>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="ARCHITECTURE">
          <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="12" month="September" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for authorization
   based on privacy-preserving authentication mechanisms.  It describes
   the conceptual model of Privacy Pass and its protocols, its security
   and privacy goals, practical deployment models, and recommendations
   for each deployment model that helps ensure the desired security and
   privacy goals are fulfilled.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-architecture-15"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="TLS13">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <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="URI">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="SHS" target="https://doi.org/10.6028/nist.fips.180-4">
          <front>
            <title>Secure Hash Standard</title>
            <author fullname="Quynh H. Dang" surname="Dang"/>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date month="July" year="2015"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.180-4"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <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="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="14" month="September" 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-14"/>
        </reference>
        <reference anchor="COOKIES">
          <front>
            <title>Cookies: HTTP State Management Mechanism</title>
            <author fullname="Steven Bingler" initials="S." surname="Bingler">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Mike West" initials="M." surname="West">
              <organization>Google LLC</organization>
            </author>
            <author fullname="John Wilander" initials="J." surname="Wilander">
              <organization>Apple, Inc</organization>
            </author>
            <date day="10" month="May" year="2023"/>
            <abstract>
              <t>   This document defines the HTTP Cookie and Set-Cookie header fields.
   These header fields can be used by HTTP servers to store state
   (called cookies) at HTTP user agents, letting the servers maintain a
   stateful session over the mostly stateless HTTP protocol.  Although
   cookies have many historical infelicities that degrade their security
   and privacy, the Cookie and Set-Cookie header fields are widely used
   on the Internet.  This document obsoletes RFC 6265.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-rfc6265bis-12"/>
        </reference>
        <reference anchor="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="J. Schiller" initials="J." surname="Schiller"/>
            <author fullname="S. Crocker" initials="S." surname="Crocker"/>
            <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>
        <reference anchor="RFC9001">
          <front>
            <title>Using TLS to Secure QUIC</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="S. Turner" initials="S." role="editor" surname="Turner"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes how Transport Layer Security (TLS) is used to secure QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9001"/>
          <seriesInfo name="DOI" value="10.17487/RFC9001"/>
        </reference>
        <reference anchor="RFC8470">
          <front>
            <title>Using Early Data in HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="W. Tarreau" initials="W." surname="Tarreau"/>
            <date month="September" year="2018"/>
            <abstract>
              <t>Using TLS early data creates an exposure to the possibility of a replay attack. This document defines mechanisms that allow clients to communicate with servers about HTTP requests that are sent in early data. Techniques are described that use these mechanisms to mitigate the risk of replay.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8470"/>
          <seriesInfo name="DOI" value="10.17487/RFC8470"/>
        </reference>
        <reference anchor="RFC8701">
          <front>
            <title>Applying Generate Random Extensions And Sustain Extensibility (GREASE) to TLS Extensibility</title>
            <author fullname="D. Benjamin" initials="D." surname="Benjamin"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>This document describes GREASE (Generate Random Extensions And Sustain Extensibility), a mechanism to prevent extensibility failures in the TLS ecosystem. It reserves a set of TLS protocol values that may be advertised to ensure peers correctly handle unknown values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8701"/>
          <seriesInfo name="DOI" value="10.17487/RFC8701"/>
        </reference>
      </references>
    </references>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This section includes test vectors for the HTTP authentication scheme specified
in this document. It consists of the following types of test vectors:</t>
      <ol spacing="normal" type="1"><li>Test vectors for the challenge and redemption protocols. Implementations can
use these test vectors for verifying code that builds and encodes
TokenChallenge structures, as well as code that produces a well-formed Token
bound to a TokenChallenge.</li>
        <li>Test vectors for the HTTP headers used for authentication. Implementations
can use these test vectors for validating whether they parse HTTP
authentication headers correctly to produce TokenChallenge structures and the
other associated parameters, such as the token-key and max-age values.</li>
      </ol>
      <section anchor="challenge-and-redemption-structure-test-vectors">
        <name>Challenge and Redemption Structure Test Vectors</name>
        <t>This section includes test vectors for the challenge and redemption
functionalities described in <xref target="challenge"/> and <xref target="redemption"/>. Each test vector
lists the following values:</t>
        <ul spacing="normal">
          <li>token_type: The type of token issuance protocol, a value from
<xref target="token-types"/>. For these test vectors, token_type is 0x0002, corresponding
to the issuance protocol in <xref target="ISSUANCE"/>.</li>
          <li>issuer_name: The name of the issuer in the TokenChallenge structure,
represented as a hexadecimal string.</li>
          <li>redemption_context: The redemption context in the TokenChallenge structure,
represented as a hexadecimal string.</li>
          <li>origin_info: The origin info in the TokenChallenge structure, represented as
a hexadecimal string.</li>
          <li>nonce: The nonce in the Token structure, represented as a hexadecimal string.</li>
          <li>token_key: The public token-key, encoded based on the corresponding token
type, represented as a hexadecimal string.</li>
          <li>token_authenticator_input: The values in the Token structure used to compute
the Token authenticator value, represented as a hexadecimal string.</li>
        </ul>
        <t>Test vectors are provided for each of the following TokenChallenge
configurations:</t>
        <ol spacing="normal" type="1"><li>TokenChallenge with a single origin and non-empty redemption context</li>
          <li>TokenChallenge with a single origin and empty redemption context</li>
          <li>TokenChallenge with an empty origin and redemption context</li>
          <li>TokenChallenge with an empty origin and non-empty redemption context</li>
          <li>TokenChallenge with a multiple origins and non-empty redemption context</li>
        </ol>
        <t>These test vectors are below.</t>
        <artwork><![CDATA[
// Test vector 1:
//   token_type(0002), issuer_name(issuer.example),
//   origin_info(origin.example), redemption_context(non-empty)
token_type: 0002
issuer_name: 6973737565722e6578616d706c65
redemption_context:
476ac2c935f458e9b2d7af32dacfbd22dd6023ef5887a789f1abe004e79bb5bb
origin_info: 6f726967696e2e6578616d706c65
nonce:
e01978182c469e5e026d66558ee186568614f235e41ef7e2378e6f202688abab
token_key_id:
ca572f8982a9ca248a3056186322d93ca147266121ddeb5632c07f1f71cd2708
token_authenticator_input: 0002e01978182c469e5e026d66558ee1865686
14f235e41ef7e2378e6f202688abab8e1d5518ec82964255526efd8f9db88205a
8ddd3ffb1db298fcc3ad36c42388fca572f8982a9ca248a3056186322d93ca147
266121ddeb5632c07f1f71cd2708

// Test vector 2:
//   token_type(0002), issuer_name(issuer.example),
//   origin_info(origin.example), redemption_context(empty)
token_type: 0002
issuer_name: 6973737565722e6578616d706c65
redemption_context:
origin_info: 6f726967696e2e6578616d706c65
nonce:
e01978182c469e5e026d66558ee186568614f235e41ef7e2378e6f202688abab
token_key_id:
ca572f8982a9ca248a3056186322d93ca147266121ddeb5632c07f1f71cd2708
token_authenticator_input: 0002e01978182c469e5e026d66558ee1865686
14f235e41ef7e2378e6f202688abab11e15c91a7c2ad02abd66645802373db1d8
23bea80f08d452541fb2b62b5898bca572f8982a9ca248a3056186322d93ca147
266121ddeb5632c07f1f71cd2708

// Test vector 3:
//   token_type(0002), issuer_name(issuer.example),
//   origin_info(), redemption_context(empty)
token_type: 0002
issuer_name: 6973737565722e6578616d706c65
redemption_context:
origin_info:
nonce:
e01978182c469e5e026d66558ee186568614f235e41ef7e2378e6f202688abab
token_key_id:
ca572f8982a9ca248a3056186322d93ca147266121ddeb5632c07f1f71cd2708
token_authenticator_input: 0002e01978182c469e5e026d66558ee1865686
14f235e41ef7e2378e6f202688ababb741ec1b6fd05f1e95f8982906aec161289
6d9ca97d53eef94ad3c9fe023f7a4ca572f8982a9ca248a3056186322d93ca147
266121ddeb5632c07f1f71cd2708

// Test vector 4:
//   token_type(0002), issuer_name(issuer.example),
//   origin_info(), redemption_context(non-empty)
token_type: 0002
issuer_name: 6973737565722e6578616d706c65
redemption_context:
476ac2c935f458e9b2d7af32dacfbd22dd6023ef5887a789f1abe004e79bb5bb
origin_info:
nonce:
e01978182c469e5e026d66558ee186568614f235e41ef7e2378e6f202688abab
token_key_id:
ca572f8982a9ca248a3056186322d93ca147266121ddeb5632c07f1f71cd2708
token_authenticator_input: 0002e01978182c469e5e026d66558ee1865686
14f235e41ef7e2378e6f202688ababb85fb5bc06edeb0e8e8bdb5b3bea8c4fa40
837c82e8bcaf5882c81e14817ea18ca572f8982a9ca248a3056186322d93ca147
266121ddeb5632c07f1f71cd2708

// Test vector 5:
//   token_type(0002), issuer_name(issuer.example),
//   origin_info(foo.example,bar.example),
//   redemption_context(non-empty)
token_type: 0002
issuer_name: 6973737565722e6578616d706c65
redemption_context:
476ac2c935f458e9b2d7af32dacfbd22dd6023ef5887a789f1abe004e79bb5bb
origin_info: 666f6f2e6578616d706c652c6261722e6578616d706c65
nonce:
e01978182c469e5e026d66558ee186568614f235e41ef7e2378e6f202688abab
token_key_id:
ca572f8982a9ca248a3056186322d93ca147266121ddeb5632c07f1f71cd2708
token_authenticator_input: 0002e01978182c469e5e026d66558ee1865686
14f235e41ef7e2378e6f202688ababa2a775866b6ae0f98944910c8f48728d8a2
735b9157762ddbf803f70e2e8ba3eca572f8982a9ca248a3056186322d93ca147
266121ddeb5632c07f1f71cd2708
]]></artwork>
      </section>
      <section anchor="http-header-test-vectors">
        <name>HTTP Header Test Vectors</name>
        <t>This section includes test vectors the contents of the HTTP authentication
headers. Each test vector consists of one or more challenges that comprise
a WWW-Authenticate header. For each challenge, the token-type, token-key,
max-age, and token-challenge parameters are listed. Each challenge also
includes an unknown (not specified) parameter that implementations are meant
to ignore.</t>
        <t>The parameters for each challenge are indexed by their position
in the WWW-Authentication challenge list. For example, token-key-0 denotes
the token-key parameter for the first challenge in the list, whereas
token-key-1 denotes the token-key for the second challenge in the list.</t>
        <t>The resulting wire-encoded WWW-Authentication header based on this
list of challenges is then listed at the end. Line folding is only
used to fit the document formatting constraints and not unsupported
in actual requests.</t>
        <artwork><![CDATA[
token-type-0: 0x0002
token-key-0: 30820152303d06092a864886f70d01010a3030a00d300b060960864
8016503040202a11a301806092a864886f70d010108300b060960864801650304020
2a2030201300382010f003082010a0282010100cb1aed6b6a95f5b1ce013a4cfcab2
5b94b2e64a23034e4250a7eab43c0df3a8c12993af12b111908d4b471bec31d4b6c9
ad9cdda90612a2ee903523e6de5a224d6b02f09e5c374d0cfe01d8f529c500a78a2f
67908fa682b5a2b430c81eaf1af72d7b5e794fc98a3139276879757ce453b526ef9b
f6ceb99979b8423b90f4461a22af37aab0cf5733f7597abe44d31c732db68a181c6c
bbe607d8c0e52e0655fd9996dc584eca0be87afbcd78a337d17b1dba9e828bbd81e2
91317144e7ff89f55619709b096cbb9ea474cead264c2073fe49740c01f00e109106
066983d21e5f83f086e2e823c879cd43cef700d2a352a9babd612d03cad02db134b7
e225a5f0203010001
max-age-0: 10
token-challenge-0: 0002000e6973737565722e6578616d706c65208a3e83a33d9
8005d2f30bef419fa6bf4cd5c6005e36b1285bbb4ccd40fa4b383000e6f726967696
e2e6578616d706c65

WWW-Authenticate: PrivateToken challenge="AAIADmlzc3Vlci5leGFtcGxlII
o-g6M9mABdLzC-9Bn6a_TNXGAF42sShbu0zNQPpLODAA5vcmlnaW4uZXhhbXBsZQ==",
 token-key="MIIBUjA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAqEaMBgGCSqG
SIb3DQEBCDALBglghkgBZQMEAgKiAwIBMAOCAQ8AMIIBCgKCAQEAyxrta2qV9bHOATpM
_KsluUsuZKIwNOQlCn6rQ8DfOowSmTrxKxEZCNS0cb7DHUtsmtnN2pBhKi7pA1I-beWi
JNawLwnlw3TQz-Adj1KcUAp4ovZ5CPpoK1orQwyB6vGvcte155T8mKMTknaHl1fORTtS
bvm_bOuZl5uEI7kPRGGiKvN6qwz1cz91l6vkTTHHMttooYHGy75gfYwOUuBlX9mZbcWE
7KC-h6-814ozfRex26noKLvYHikTFxROf_ifVWGXCbCWy7nqR0zq0mTCBz_kl0DAHwDh
CRBgZpg9IeX4PwhuLoI8h5zUPO9wDSo1Kpur1hLQPK0C2xNLfiJaXwIDAQAB",unknow
nChallengeAttribute="ignore-me", max-age="10"

token-type-0: 0x0002
token-key-0: 30820152303d06092a864886f70d01010a3030a00d300b060960864
8016503040202a11a301806092a864886f70d010108300b060960864801650304020
2a2030201300382010f003082010a0282010100cb1aed6b6a95f5b1ce013a4cfcab2
5b94b2e64a23034e4250a7eab43c0df3a8c12993af12b111908d4b471bec31d4b6c9
ad9cdda90612a2ee903523e6de5a224d6b02f09e5c374d0cfe01d8f529c500a78a2f
67908fa682b5a2b430c81eaf1af72d7b5e794fc98a3139276879757ce453b526ef9b
f6ceb99979b8423b90f4461a22af37aab0cf5733f7597abe44d31c732db68a181c6c
bbe607d8c0e52e0655fd9996dc584eca0be87afbcd78a337d17b1dba9e828bbd81e2
91317144e7ff89f55619709b096cbb9ea474cead264c2073fe49740c01f00e109106
066983d21e5f83f086e2e823c879cd43cef700d2a352a9babd612d03cad02db134b7
e225a5f0203010001
max-age-0: 10
token-challenge-0: 0002000e6973737565722e6578616d706c65208a3e83a33d9
8005d2f30bef419fa6bf4cd5c6005e36b1285bbb4ccd40fa4b383000e6f726967696
e2e6578616d706c65
token-type-1: 0x0001
token-key-1: ebb1fed338310361c08d0c7576969671296e05e99a17d7926dfc28a
53fabd489fac0f82bca86249a668f3a5bfab374c9
max-age-1: 10
token-challenge-1: 0001000e6973737565722e6578616d706c65208a3e83a33d9
8005d2f30bef419fa6bf4cd5c6005e36b1285bbb4ccd40fa4b383000e6f726967696
e2e6578616d706c65

WWW-Authenticate: PrivateToken challenge="AAIADmlzc3Vlci5leGFtcGxlII
o-g6M9mABdLzC-9Bn6a_TNXGAF42sShbu0zNQPpLODAA5vcmlnaW4uZXhhbXBsZQ==",
 token-key="MIIBUjA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAqEaMBgGCSqG
SIb3DQEBCDALBglghkgBZQMEAgKiAwIBMAOCAQ8AMIIBCgKCAQEAyxrta2qV9bHOATpM
_KsluUsuZKIwNOQlCn6rQ8DfOowSmTrxKxEZCNS0cb7DHUtsmtnN2pBhKi7pA1I-beWi
JNawLwnlw3TQz-Adj1KcUAp4ovZ5CPpoK1orQwyB6vGvcte155T8mKMTknaHl1fORTtS
bvm_bOuZl5uEI7kPRGGiKvN6qwz1cz91l6vkTTHHMttooYHGy75gfYwOUuBlX9mZbcWE
7KC-h6-814ozfRex26noKLvYHikTFxROf_ifVWGXCbCWy7nqR0zq0mTCBz_kl0DAHwDh
CRBgZpg9IeX4PwhuLoI8h5zUPO9wDSo1Kpur1hLQPK0C2xNLfiJaXwIDAQAB",unknow
nChallengeAttribute="ignore-me", max-age="10", PrivateToken challeng
e="AAEADmlzc3Vlci5leGFtcGxlIIo-g6M9mABdLzC-9Bn6a_TNXGAF42sShbu0zNQPp
LODAA5vcmlnaW4uZXhhbXBsZQ==", token-key="67H-0zgxA2HAjQx1dpaWcSluBem
aF9eSbfwopT-r1In6wPgryoYkmmaPOlv6s3TJ",unknownChallengeAttribute="ig
nore-me", max-age="10"
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
KXoTormcDWZxnMKyB2IeDsNpOAIRnYGMyMYgGebT/jyGk0zieC6j0XSUAFUM
JqNk0J8OMzmaT0f9pB/CKcqwD6JoIvqTyXw2TAehBDtgCMYjGt2zwTCBvScp
HBFINkCuQQTwjuYxGp7hIO2D7AEzFAzP4SieCjkYjKNx1kdsAXzoh5rrIgaH
fdFgu4TrgOnwf3mbIjPow+blbAgQSOeA0f1xOsiGAJtsFM7hHONslKTjZAJf
yOEkBtMFFJV4lMC6+6A3xkNEbZjCOhTEvkdh/5bJg5dFLhani4fr1adk+MMq
yccr+eRxnTz5uDo9FUX3YvJivl48SJ9/OunOH2wm0Yfzlz8+WTweDaqzZbzr
f3r55vX2+auHi8X4KlmvNtH70e6nH5fL+McH1U9v7t/HayoN5d8/enF6+uDd
nxbzBxeXPy8v8yfz6/6DxZvi+sWzxcsXi+rJyfuTJ2eLx6vF9ZuTxc+PohcP
Lp6cnP38RJydxsOHbx49OHm4eP7gYnWxvLx48NObF48WF8/yxfXpgxeLVyeL
N7MFTnBy8Qx+f7S4+VjW0eDnH+bx01eL8+0L8eFZtdq9q3Y/PTu9fvnqzepk
MynfzB5mr4rrs/V5+fHZx0c/nbw8A8qfPnz6rq7W9eblYPtg+SyfbhfhaTeW
73Pxzy+j6+fXm9X18PzNp+4i/VP4LHm32I6Kq5/GJ6+3xbOwKN9c3zyYXD25
SmoZjsfns/WzF+eXm+jpKsxevT2vz0R8tf4Qv9r9tBrvHp1OL1+/ffIkf3b1
cvLz9acw+TQPV5Ory/Pzp09f1HVR/OHpk5vp+CL7w/Wrd7sHqx/n65/i5P0j
MX120l1OurNwVHzK3sqPg8mmePb86g9P88vzxx/fvso+5NkP75/8eBKfvL+Z
bn5+2//0c399fvLg04fLVf/h4un1w6U4efvg4qftxfxU/jh6fb3cPS9OZ8vx
p3evX82vH54V4bPtrgyXz9+8ftY/GXx8+TzL/zn68fr04eLN4sFRh1UGYb3b
C519cf+IVYHuGm8kVoRz/yjsH4m/yYe/yYe/yYf/WvngkGCoSDB0ddx7gYzj
MJPpEIYL+8NJmACC9hNADBgQhgXknUhYwXwehdN0OgcrMksGs0iMhxmAawRH
EyX9DJAuAdIbjObRZDIDtB/H8DVgK2C3hlbYCq2QoBX+VUDrb9L0b9L0r1Sa
dtoxURAqPjqAit+IieJWVHQxcTJ92u1/uvi4GDxd/OnNxzDdRu+Ts9XugVyL
6PFcnsXZdbE975bh6WZy/fqivCn+cLleR69fra4m1fD8n/XmD+xdHFAl0Nr8
v1A5kMJYugAA

-->

</rfc>
