<?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-12" 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-12"/>
    <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="August" day="09"/>
    <keyword>Internet-Draft</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, one-time-use 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 then respond to that challenge
with an HTTP authentication response (using the Authorization request header
field). Clients produce an authentication response based on 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 is referred to as token redemption. This
interaction between client and origin is shown below.</t>
      <figure anchor="fig-overview">
        <name>Challenge-response redemption protocol flow</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width="568" viewBox="0 0 568 160" 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,112" 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,144" 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 40,128 L 96,128" fill="none" stroke="black"/>
              <path d="M 280,128 L 360,128" 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="48,128 36,122.4 36,133.6" fill="black" transform="rotate(180,40,128)"/>
              <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="380" y="116">//</text>
                <text x="408" y="116">Run</text>
                <text x="460" y="116">issuance</text>
                <text x="532" y="116">protocol</text>
                <text x="164" y="132">Authorization:</text>
                <text x="248" y="132">Token</text>
                <text x="40" y="148">|</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 requirement for tokens sent from an origin to a client,
using the "WWW-Authenticate" HTTP header field. This challenge is bound to a
specific token issuer and issuance protocol, and may be additionally bound to
a specific context or origin name.</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"/>).</t>
      <t>Unlike many authentication schemes in which a client will present the same
credentials across multiple requests, tokens used with the "PrivateToken"
scheme are single-use credentials, and are not reused. Spending the same token
value more than once allows the origin to link multiple transactions to the
same client. In deployment scenarios where origins send token challenges to
request tokens, origins ought to expect at most one request containing a token
from the client in reaction to a particular 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 challenge includes a TokenChallenge
message, along with information about what keys to use when requesting a token
from the issuer.</t>
        <t>Origins that support this authentication scheme need to handle the following
tasks:</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 challenges.</li>
          <li>Determine a redemption context construction to include in the
TokenChallenge, as discussed in <xref target="context-construction"/>.</li>
          <li>Select the origin information to include in the TokenChallenge. This can
be empty to allow fully cross-origin tokens, a single origin name that
matches the origin itself, or a list of origin names containing the origin
itself.</li>
        </ol>
        <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>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>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 the authority portion of a URI
as defined in <xref section="3.2" sectionFormat="of" target="URI"/>. 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 the authority portion of a URI as defined in
<xref section="3.2" sectionFormat="of" target="URI"/>. 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>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
challenge value MUST be unique for every 401 HTTP response to prevent replay
attacks. 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>Clients MAY ignore the challenge, e.g., because the token-key is
invalid or otherwise untrusted.</t>
        <t>The header field MAY also include the standard "realm" parameter, if desired.
Issuance protocols MAY require other parameters. Clients SHOULD ignore unknown
parameters in challenges, except if otherwise specified by issuance protocols.</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>
        <t>Upon receipt of this challenge, a client validates the TokenChallenge before
responding to it. 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 process or respond to 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
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>
        <t>Note that it is possible for the WWW-Authenticate header field to include
multiple challenges. 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 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>An empty redemption context is not bound to any property of the client session.
Preventing double spending on tokens requires the origin to keep state
associated with the redemption context. The size of this state varies based on
the size of the redemption context. For example, double spend state for unique,
per-request redemption contexts only needs to exist within the scope of
the request connection or session. In contrast, double spend state for empty
redemption contexts must be stored and shared across all requests until
token-key expiration or rotation.</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 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 changing networks.
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"/>). 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>
        <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. 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>
        <t>If a client is unable to fetch a token, it MUST react to the challenge as
if it could not produce a valid Authorization response.</t>
        <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="interaction">
      <name>User Interaction</name>
      <t>When used in contexts like websites, origins that challenge clients for
tokens need to consider how to optimize their interaction model to ensure a
good user experience.</t>
      <t>Origins SHOULD minimize the number of challenges sent on a particular client
session, such as a unique TLS session between a client and origin
(referred to as the "redemption context" in <xref target="ARCHITECTURE"/>). Similarly, clients
SHOULD have some implementation-specific policy to minimize the number of tokens
that can be retrieved by origins. One possible implementation of this policy is
to bound the number of token challenges a given origin can provide for a given
session.</t>
      <t>Token challenges can be performed without explicit user involvement, depending
on the issuance protocol. If tokens are scoped to a specific origin,
there is no need for per-challenge user interaction. Note that the issuance
protocol may separately involve user interaction if the client needs to be
newly validated.</t>
      <t>If a client cannot use cached tokens to respond to a challenge, either because
it has run out of cached tokens or the associated context is unique, the token
issuance process can add user-perceivable latency. Origins need not block
useful work such as loading the contents of a web page on token authentication.
Instead, token authentication can be used in similar ways to existing CAPTCHA
validation flows, wherein validation sometimes proceeds alongside useful work,
e.g., when loading contents of a web page, but without the need for user interaction.
If issuance is taking a long time, an origin can fall back to another method
of user validation.</t>
      <t>An origin MUST NOT use more than one redemption context value for a given token
type and issuer per client request. If an origin issues a large number of
challenges with unique contexts, such as more than once for each request, this
can indicate that the origin is either not functioning correctly or is trying
to attack or overload the client or issuance server. In such cases, a client
MUST ignore redundant token challenges for the same request and SHOULD alert
the user if possible.</t>
      <t>Origins MAY include multiple challenges, where each challenge refers to a
different issuer or a different token type, to allow clients to choose a
preferred issuer or type.</t>
      <t>An origin MUST NOT assume that token challenges will always yield a valid
token. Clients might experience issues running the issuance protocol, e.g.,
because the attester or issuer is unavailable, or clients might simply not
support the requested token type. Origins SHOULD account for such operational
or interoperability failures by offering clients a fallback challenge such
as CAPTCHA for accessing a resource. Failure to provide a fallback will likely
mean that some clients fail authentication and cannot perform the desired
action, such as loading a web page or accessing some other resource.</t>
      <t>For example, consider a scenario in which the client is a web browser, and the
origin can accept either a token or a solution to a puzzle intended to
determine if the client is a real human user. The origin would send clients a
401 HTTP response that contains a token challenge in a "WWW-Authenticate"
header field along with content that contains the puzzle to display to the
user. Clients that are able to respond with a token will be able to
automatically return the token and not show the puzzle, while clients that
either do not support tokens or are unable to fetch tokens at a particular
time can present the user with the puzzle.</t>
      <t>To mitigate the risk of deployments becoming dependent on tokens, clients and
origins SHOULD grease their behavior unless explicitly configured not to. In
particular, clients SHOULD ignore token challenges with some non-zero
probability. From the origin's perspective, ignoring a token challenge is
indistinguishable from the issuance protocol failing for arbitrary reasons
(excluding what can be inferred from latency between the client and origin interaction).
Likewise, origins SHOULD randomly choose to not challenge clients for tokens
with some non-zero probability. Moreover, origins SHOULD include random token
types, from the Reserved list of "greased" types (defined in <xref target="token-types"/>),
with some non-zero probability.</t>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</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 replayed 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="160" width="624" viewBox="0 0 624 160" 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,128" fill="none" stroke="black"/>
              <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
              <path d="M 312,32 L 312,64" fill="none" stroke="black"/>
              <path d="M 360,64 L 360,112" fill="none" stroke="black"/>
              <path d="M 400,32 L 400,64" fill="none" stroke="black"/>
              <path d="M 544,32 L 544,64" fill="none" stroke="black"/>
              <path d="M 576,64 L 576,96" fill="none" stroke="black"/>
              <path d="M 616,32 L 616,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
              <path d="M 312,32 L 400,32" fill="none" stroke="black"/>
              <path d="M 544,32 L 616,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 80,64" fill="none" stroke="black"/>
              <path d="M 312,64 L 400,64" fill="none" stroke="black"/>
              <path d="M 544,64 L 616,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 360,112 L 384,112" fill="none" stroke="black"/>
              <path d="M 552,112 L 576,112" fill="none" stroke="black"/>
              <path d="M 360,128 L 376,128" fill="none" stroke="black"/>
              <path d="M 560,128 L 576,128" fill="none" stroke="black"/>
              <path d="M 40,144 L 128,144" fill="none" stroke="black"/>
              <path d="M 264,144 L 360,144" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="584,112 572,106.4 572,117.6" fill="black" transform="rotate(0,576,112)"/>
              <polygon class="arrowhead" points="368,128 356,122.4 356,133.6" fill="black" transform="rotate(180,360,128)"/>
              <polygon class="arrowhead" points="360,96 348,90.4 348,101.6" fill="black" transform="rotate(0,352,96)"/>
              <polygon class="arrowhead" points="48,144 36,138.4 36,149.6" fill="black" transform="rotate(180,40,144)"/>
              <g class="text">
                <text x="44" y="52">Origin</text>
                <text x="356" y="52">Attacker</text>
                <text x="580" y="52">Client</text>
                <text x="136" y="100">WWW-Authenticate:</text>
                <text x="268" y="100">TokenChallenge</text>
                <text x="424" y="116">(replay</text>
                <text x="500" y="116">challenge)</text>
                <text x="444" y="132">Authorization:</text>
                <text x="528" y="132">Token</text>
                <text x="168" y="148">(replay</text>
                <text x="228" y="148">token)</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------+                            +----------+                 +--------+
| Origin |                            | Attacker |                 | Client |
+---+----+                            +-----+----+                 +---+----+
    |                                       |                          |
    +-- WWW-Authenticate: TokenChallenge -->|                          |
    |                                       +--- (replay challenge) --->
    |                                       <-- Authorization: Token --+
    <----------- (replay token) ------------+
]]></artwork>
        </artset>
      </figure>
      <t>Moreover, 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>
      <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 augment the time between getting
challenged then redeeming a token so as to make this sort of linkability more
difficult. For more discussion on correlation risks between token issuance and
redemption, see <xref target="ARCHITECTURE"/>.</t>
      <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>
      <t>Applications SHOULD constrain tokens to a single origin unless the use case can
accommodate such replay attacks. Replays are also possible if the client
redeems a token sent as part of 0-RTT data. 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>
      <t>All random values in the challenge and token MUST be generated using a
cryptographically secure source of randomness.</t>
    </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>
        <t>Authentication Scheme Name: PrivateToken</t>
        <t>Pointer to specification text: <xref target="challenge-redemption"/> of this document</t>
      </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>Template:</t>
        <ul spacing="normal">
          <li>Value: The two-byte identifier for the algorithm</li>
          <li>Name: Name of the issuance protocol</li>
          <li>Token Structure: The contents of the Token structure in <xref target="redemption"/></li>
          <li>Token Key Encoding: The encoding of the "token-key" parameter in <xref target="redemption"/></li>
          <li>TokenChallenge Structure: The contents of the TokenChallenge structure in <xref target="challenge"/></li>
          <li>Publicly Verifiable: A Y/N value indicating if the output tokens are
publicly verifiable</li>
          <li>Public Metadata: A Y/N value indicating if the output tokens can contain
public metadata.</li>
          <li>Private Metadata: A Y/N value indicating if the output tokens can contain
private metadata.</li>
          <li>Nk: The length in bytes of an output authenticator</li>
          <li>Nid: The length of the token key identifier</li>
          <li>Reference: Where this algorithm is defined</li>
          <li>Notes: Any notes associated with the entry</li>
        </ul>
        <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 sufficiently clearly defined to be used for both
token issuance and redemption, and meets the common security and privacy
requirements for issuance protocols defined in <xref section="3.2" sectionFormat="of" target="ARCHITECTURE"/>.</t>
        <t>Values 0xFF00-0xFFFF are reserved for private use. Implementers can use values
in this range for experimentation with new token type protocols, as well as other
proprietary uses that do not require interoperability.</t>
        <t>This document defines several Reserved values, which can be used by clients
and servers to send "greased" values in token challenges and responses 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 response. The
contents of the Token structure SHOULD be filled with random bytes when
using greased values.</t>
        <t>The initial contents for this registry consist of the following Values.
For each Value, the Name is "RESERVED", the Publicly Verifiable, Public
Metadata, Private Metadata, Nk, and Nid attributes are all assigned "N/A",
the Reference is this document, and the Notes attribute is "None". The
initial list of Values is as follows:</t>
        <ul spacing="normal">
          <li>0x0000</li>
          <li>0x02AA</li>
          <li>0x1132</li>
          <li>0x2E96</li>
          <li>0x3CD3</li>
          <li>0x4473</li>
          <li>0x5A63</li>
          <li>0x6D32</li>
          <li>0x7F3F</li>
          <li>0x8D07</li>
          <li>0x916B</li>
          <li>0xA6A4</li>
          <li>0xBEAB</li>
          <li>0xC3F3</li>
          <li>0xDA42</li>
          <li>0xE944</li>
          <li>0xF057</li>
        </ul>
        <t>Additionally, the registry is to be initialized with the following entry
for Private Use.</t>
        <ul spacing="normal">
          <li>Value: 0xFF00-0xFFFF</li>
          <li>Name: Private Use</li>
          <li>Token Structure: The contents of the Token structure in <xref target="redemption"/></li>
          <li>Token Key Encoding: N/A</li>
          <li>TokenChallenge Structure: The contents of the TokenChallenge structure in <xref target="challenge"/></li>
          <li>Publicly Verifiable: N/A</li>
          <li>Public Metadata: N/A</li>
          <li>Private Metadata: N/A</li>
          <li>Nk: N/A</li>
          <li>Nid: N/A</li>
          <li>Reference: This document</li>
          <li>Notes: None</li>
        </ul>
        <t><xref target="ISSUANCE"/> defines other non-grease entries for this registry.</t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <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="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="15" month="June" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for constructing
   privacy-preserving authentication mechanisms.  It provides
   recommendations on how the architecture should be deployed to ensure
   the privacy of clients and the security of all participating
   entities.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-architecture-13"/>
        </reference>
        <reference anchor="ISSUANCE">
          <front>
            <title>Privacy Pass Issuance Protocol</title>
            <author fullname="Sofia Celi" initials="S." surname="Celi">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="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="26" month="June" 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-11"/>
        </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="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.</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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
m/8f/sJizECtAAA=

-->

</rfc>
