<?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-13" 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-13"/>
    <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="12"/>
    <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="9" month="August" 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-14"/>
        </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="16" month="August" 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-12"/>
        </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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
it6EaC5ng1kcp7DsgZiHw3AajkBEZyAjsjFIhvm0P4/hJJM4nstoNB0lQBWD
ySgZ9KfDTI7m01E/6YdwijLsgyiaiP5kMp8N00EowQ4YgvGIRvdsMExg70kK
RwSSDZBrEAG8o3mMhmc4SPsge8AMBcNzOIqnQg4G42ic9RFbAB/6oea6iMFh
XzTYLuE6YDr8X96myAz6sHk5GwIE0jlgdH+cDrIhwCYbhXM4xzgbJek4mcAX
cjiJwXQBRSUeJbDuPuiN8RBRG6awDgWx71HYv2Xy4GWRi8Xp4uF69SkZ/rBK
8vFKPnlcJ08+rk5PRdG9mLyYrxcP0uefTrrzB5tJ9OH85Y9PFo9Hg+psGe/6
n16+eb19/urhYjG+StarTfR+tPvpx+Uy/vFB9dOb+/fxmkpD+fePXpyePnj3
p8X8wcXlz8vL/Mn8uv9g8aa4fvFs8fLFonpy8v7kydni8Wpx/eZk8fOj6MWD
iycnZz8/EWen8fDhm0cPTh4unj+4WF0sLy8e/PTmxaPFxbN8cX364MXi1cni
zWyBE5xcPIPfHy1uPpZ1NPj5h3n89NXifPtCfHhWrXbvqt1Pz06vX756szrZ
TMo3s4fZq+L6bH1efnz28dFPJy/PgPKnD5++q6t1vXk52D5YPsun20V42o3l
+1z888vo+vn1ZnU9PH/zqbtI/xQ+S94ttqPi6qfxyett8SwsyjfXNw8mV0+u
klqG4/H5bP3sxfnlJnq6CrNXb8/rMxFfrT/Er3Y/rca7R6fTy9dvnzzJn129
nPx8/SlMPs3D1eTq8vz86dMXdV0Uf3j65GY6vsj+cP3q3e7B6sf5+qc4ef9I
TJ+ddJeT7iwcFZ+yt/LjYLIpnj2/+sPT/PL88ce3r7IPefbD+yc/nsQn72+m
m5/f9j/93F+fnzz49OFy1X+4eHr9cClO3j64+Gl7MT+VP45eXy93z4vT2XL8
6d3rV/Prh2dF+Gy7K8Pl8zevn/VPBh9fPs/yf45+vD59uHizeHDUYZVBWO/2
Qmdf3D9iVaC7xhuJFeHcPwr7R+Jv8uFv8uFv8uG/Vj44JBgqEgxdHfdeIOM4
zGQ6hOHC/nASJoCg/QQQAwaEYQF5JxJWMJ9H4TSdzsGKzJLBLBLjYQbgGsHR
REk/A6RLgPQGo3k0mcwA7ccxfA3YCtitoRW2QiskaIV/FdD6mzT9mzT9K5Wm
nXZMFISKjw6g4jdiorgVFV1MnEyfdvufLj4uBk8Xf3rzMUy30fvkbLV7INci
ejyXZ3F2XWzPu2V4uplcv74ob4o/XK7X0etXq6tJNTz/Z735A3sXB1QJtDb/
L9TFkJJYugAA

-->

</rfc>
