<?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.7.7 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-privacypass-rate-limit-tokens-04" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title abbrev="Rate-Limited Tokens">Rate-Limited Token Issuance Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-rate-limit-tokens-04"/>
    <author initials="S." surname="Hendrickson" fullname="Scott Hendrickson">
      <organization>Google LLC</organization>
      <address>
        <email>scott@shendrickson.com</email>
      </address>
    </author>
    <author initials="J." surname="Iyengar" fullname="Jana Iyengar">
      <organization>Fastly</organization>
      <address>
        <email>jri@fastly.com</email>
      </address>
    </author>
    <author initials="T." surname="Pauly" fullname="Tommy Pauly">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <author initials="S." surname="Valdez" fullname="Steven Valdez">
      <organization>Google LLC</organization>
      <address>
        <email>svaldez@chromium.org</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2024" month="March" day="04"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 63?>

<t>This document specifies a variant of the Privacy Pass issuance protocol
that allows for tokens to be rate-limited on a per-origin basis. This
enables origins to use tokens for use cases that need to restrict access
from anonymous clients.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Privacy Pass Working Group mailing list (privacy-pass@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/privacy-pass/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/ietf-wg-privacypass/draft-ietf-privacypass-rate-limit-tokens"/>.</t>
    </note>
  </front>
  <middle>
    <?line 70?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies a variant of the Privacy Pass issuance protocol
(as defined in <xref target="ARCH"/>) that allows
for tokens to be rate-limited on a per-origin basis. This enables origins
to use tokens for use cases that need to restrict access from anonymous clients.</t>
      <t>The base Privacy Pass issuance protocol <xref target="ISSUANCE"/>
defines stateless anonymous tokens, which can either be publicly verifiable
or not.</t>
      <t>This variant builds upon the publicly verifiable issuance protocol that uses
RSA Blind Signatures <xref target="BLINDSIG"/>, and
allows tokens to be rate-limited on a per-origin basis. This means that
a client will only be able to receive a limited number of tokens associated
with a given origin server within a fixed period of time.</t>
      <t>This issuance protocol registers the Rate-Limited Blind RSA token type
(<xref target="iana-token-type"/>), to be used with the PrivateToken HTTP authentication
scheme defined in <xref target="AUTHSCHEME"/>.</t>
      <section anchor="motivation">
        <name>Motivation</name>
        <t>A client that wishes to keep its IP address private can hide its IP address
using a proxy service or a VPN. However, doing so severely limits the client's
ability to access services and content, since servers might not be able to
enforce their policies without a stable and unique client identifier.</t>
        <t>Privacy Pass tokens in general allow clients to provide anonymous attestation
of various properties. The tokens generated by the basic issuance
protocol (<xref target="ISSUANCE"/>) can be used to verify that a client meets a particular
bar for attestation, but cannot be used by a redeeming server to rate-limit
specific clients. This is because there is no mechanism in the issuance protocol
to link repeated client token requests in order to apply rate-limiting.</t>
        <t>There are several use cases for rate-limiting anonymous clients that
are common on the Internet. These routinely use client IP address tracking,
among other characteristics, to implement rate-limiting.</t>
        <t>One example of this use case is rate-limiting website accesses to a client to
help prevent abusive behavior. Operations that are sensitive to abuse, such as account
creation on a website or logging into an account, often employ rate-limiting
as a defense-in-depth strategy. Additional verification can be required by these
pages when a client exceeds a set rate-limit.</t>
        <t>Another example of this use case is a metered paywall, where an origin limits the
number of page requests from each unique user over a period of time before the
user is required to pay for access. The origin typically resets this state
periodically, say, once per month. For example, an origin may serve ten (major
content) requests in a month before a paywall is enacted. Origins may want to
differentiate quick refreshes from distinct accesses.</t>
        <t>For some applications, the basic issuance protocol from <xref target="ISSUANCE"/> could be used to
implement rate limits. In particular, the 'Joint Attester and Issuer' model from <xref target="ARCH"/>
could be used to restrict the number of tokens issued to individual clients over a
time window. However, in this deployment model, the Attester and Issuer would learn all
origins used by a specific client, thereby coupling sensitive attestation and redemption
contexts. In some cases this might be a significant portion of browsing history.</t>
      </section>
      <section anchor="protocol-overview">
        <name>Protocol Overview</name>
        <t>The issuance protocol defined in this document decouples sensitive information in the
attestation context, such as the client identity, from the information in the redemption
context, such as the origin. It does so by employing the 'Split Origin, Attester, Issuer'
model. In this model, the Issuer learns redemption information like origin identity (used
to determine per-origin rate limit policies), and the Attester learns attestation
information like client identity (used to keep track of the previous instances of token
issuance).</t>
        <t><xref target="fig-example-allow"/> shows how this interaction works for client requests that
are within the rate limit. The Client's token request to the Attester (constructed
according to <xref target="request-one"/>, and forwarded to the Issuer according to <xref target="request-two"/>)
contains encrypted information that the Issuer uses to identify the relevant rate
limit policy to apply. This rate limit policy is returned to the Attester (according
to <xref target="response-one"/>), which then checks whether or not the Client is within this
policy. If yes, the Attester forwards the issuer token response to the Client
so that the resulting token can be redeemed by the Origin.</t>
        <figure anchor="fig-example-allow">
          <name>Successful rate-limited issuance</name>
          <artwork><![CDATA[
                                                     +-----------+
      Client                                         |   Origin  |
        |                    Challenge               |           |
        <-------------------------------------------------+      |
        |                                            |           |
        |          +-------------+                   |           |
        |          |   Attester  |                   |           |
        |          |             |                   |           |
        |          | Attest      |    +----------+   |           |
        +----------------->      |    |  Issuer  |   |           |
        |          |             |    |          |   |           |
        |   TokenRequest         |    |          |   |           |
        |   + Anon Origin ID     |    |          |   |           |
        | [ + Encrypted Origin ] |    |          |   |           |
        +----------------->      |    |          |   |           |
        |          |             |    |          |   |           |
        |          |       TokenRequest          |   |           |
        |          |      [ + Encrypted origin ] |   |           |
        |          |     +------------------->   |   |           |
        |          |             |    |          |   |           |
        |          |             |    |          |   |           |
        |          |       TokenResponse         |   |           |
        |          |      [ + Rate limit ]       |   |           |
        |          |     <-------------------+   |   |           |
        |          |             |    |          |   |           |
        |          |  in limit?  |    |          |   |           |
        |          |     yes     |    |          |   |           |
        |          |             |    |          |   |           |
        |   TokenResponse        |    |          |   |           |
        <-----------------+      |    |          |   |           |
        |          |             |    |          |   |           |
        |          +-------------+    +----------+   |           |
        |                                            |           |
        |                    Redeem                  |           |
        +------------------------------------------------->      |
                                                     |           |
                                                     +-----------+
]]></artwork>
        </figure>
        <t><xref target="fig-example-deny"/> shows how this interaction works for client requests that
exceed the rate limit. The Client's request to the Issuer and the Issuer's
response to the Attester are the same. However, in this scenario, the Client
is not within the rate limit, so the Attester responds to the Client with an
error instead of the issuer's token response.</t>
        <figure anchor="fig-example-deny">
          <name>Failed rate-limited issuance</name>
          <artwork><![CDATA[
                                                     +-----------+
      Client                                         |   Origin  |
        |                    Challenge               |           |
        <-------------------------------------------------+      |
        |                                            |           |
        |          +-------------+                   |           |
        |          |   Attester  |                   |           |
        |          |             |                   |           |
        |          | Attest      |    +----------+   |           |
        +----------------->      |    |  Issuer  |   |           |
        |          |             |    |          |   |           |
        |   TokenRequest         |    |          |   |           |
        |   + Anon Origin ID     |    |          |   |           |
        | [ + Encrypted Origin ] |    |          |   |           |
        +----------------->      |    |          |   |           |
        |          |             |    |          |   |           |
        |          |       TokenRequest          |   |           |
        |          |      [ + Encrypted origin ] |   |           |
        |          |     +------------------->   |   |           |
        |          |             |    |          |   |           |
        |          |             |    |          |   |           |
        |          |       TokenResponse         |   |           |
        |          |       + Rate limit          |   |           |
        |          |     <-------------------+   |   |           |
        |          |             |    |          |   |           |
        |          |  in limit?  |    |          |   |           |
        |          |      no     |    |          |   |           |
        |          |             |    |          |   |           |
        |        Error           |    |          |   |           |
        <-----------------+      |    |          |   |           |
        |          |             |    |          |   |           |
        |          +-------------+    +----------+   |           |
        X                                            |           |
  issuance failed                                    +-----------+
]]></artwork>
        </figure>
        <t>Each Issuer defines a window of time over which Attesters enforce rate limits,
defined in the Issuer configuration directory (<xref target="setup"/>). This window might
be as long as a month, or as short as an hour, depending on the use case. The
window is the same across all Origins that work with the Issuer; if multiple
window lengths are needed, then the entity running the Issuer can run multiple
Issuers with different Issuer names, one for each window length.</t>
        <t>The window begins upon a Client's first token request to the Attester for that
Issuer and ends after the window time elapses, after which the Client's rate limit
state is reset. Issuers indicate which rate limit to use for a given request by
parsing the Client's encrypted Origin. Attesters enforce the rate limit based
on the value indicated by the Issuer, and maintaining the count of accesses
by a client to a corresponding Client's Origin Alias (see <xref target="terms"/>).</t>
        <t>Along with the rate limit for the Origin, Issuers include a value generated
with a per-Origin secret in their responses, which allows Attesters to ensure
that the Client's Origin Alias indicated by the Client maps to exactly one Origin
as seen by the Issuer; this value that is used to validate the Client's Origin Alias
is called the Issuer's Origin Alias (see <xref target="terms"/>). Issuers can rotate the per-Origin secret
they use as desired. If a rotation event happens during a Client's active policy
window, the Attester would compute a different Issuer's Origin Alias and
mistakenly conclude that the Client is accessing a new Origin. To mitigate this,
Clients provide a stable Client's Origin Alias in their request to the Attester,
which is constant for all requests to that Origin. This allows the Attester to
detect when Issuer rotation events occur without affecting Client rate limits.</t>
        <figure anchor="fig-example-policy-windows">
          <name>Issuer policy window rotation</name>
          <artwork><![CDATA[
                          Per-Origin
                         secret rotate
Issuer:      -----+------------X----------+------------> Time
                  |         policy        |
Client            |         window        |
Token Requests:   *--------------*--------|
                  |              |        |
                  v              v        |
            Issuer Origin  Issuer Origin  |
                ID x           ID y       |
                  |                       |
            (policy start)          (policy end)
]]></artwork>
        </figure>
        <t>Unlike the basic issuance protocol <xref target="ISSUANCE"/>, the rate-limited issuance protocol
in this document has additional functional and state requirements for Client, Attester,
and Issuer. <xref target="attester-state"/> describes the state that the Attester must track
in order to enforce these limits, <xref target="client-state"/> describes the Client state necessary
for successive token requests with the Attester, and <xref target="issuer-state"/> describes the state
necessary for the Issuer to apply rate limits. The functional description of each
participant in this protocol is explained in <xref target="issuance"/></t>
      </section>
      <section anchor="properties">
        <name>Properties and Requirements</name>
        <t>For rate-limited token issuance, the Attester, Issuer, and Origin as defined in
<xref target="ARCH"/> each have partial knowledge of the Client's identity and actions,
and each entity only knows enough to serve its function (see <xref target="terms"/> for more
about the pieces of information):</t>
        <ul spacing="normal">
          <li>
            <t>The Attester knows the Client's identity and learns the Client's public key
(Client Key), the Issuer being targeted (Issuer Name), the period of time
for which the Issuer's policy is valid (Issuer Policy Window), the number of
tokens the Issuer is willing to issue within the current policy window, and the
number of tokens issued to a given Client for the claimed Origin in the policy
window. The Attester does not know the identity of the Origin the Client is
trying to access (Origin Name), but knows a Client-anonymized identifier for
it (Client's Origin Alias).</t>
          </li>
          <li>
            <t>The Issuer knows a per-Origin secret (Issuer Origin Secret) and policy about client
access, and learns the Origin's identity (Origin Name) during issuance. The Issuer
does not learn the Client's identity or information about the Client's access
pattern.</t>
          </li>
          <li>
            <t>The Origin knows the Issuer to which it will delegate an incoming Client
(Issuer Name), and can verify that any tokens presented by the Client were
signed by the Issuer. The Origin does not learn which Attester was used by a
Client for issuance.</t>
          </li>
        </ul>
        <t>Since an Issuer applies policies on behalf of Origins, a Client is required to
reveal the Origin's identity to the delegated Issuer. It is a requirement of
this protocol that the Attester not learn the Origin's identity so that,
despite knowing the Client's identity, an Attester cannot track and concentrate
information about Client activity.</t>
        <t>An Issuer expects an Attester to verify its Clients' identities correctly, but an
Issuer cannot confirm an Attester's efficacy or the Attester-Client relationship
directly without learning the Client's identity. Similarly, an Origin does not
know the Attester's identity, but ultimately relies on the Attester to correctly
verify or authenticate a Client for the Origin's policies to be correctly
enforced. An Issuer therefore chooses to issue tokens to only known and
reputable Attesters; the Issuer can employ its own methods to determine the
reputation of a Attester.</t>
        <t>An Attester is expected to employ a stable Client identifier, such as an IP
address, a device identifier, or an account at the Attester, that can serve as a
reasonable proxy for a user with some creation and maintenance cost on the user.</t>
        <t>For the Issuance protocol, a Client is expected to create and maintain stable
and explicit secrets for time periods that are on the scale of Issuer policy
windows. Changing these secrets arbitrarily during a policy window can result in
token issuance failure for the rest of the policy window; see <xref target="client-state"/>
for more details. A Client can use a service offered by its Attester or a
third-party to store these secrets, but it is a requirement of this protocol
that the Attester not be able to learn these secrets.</t>
        <t>The privacy guarantees of this issuance protocol, specifically those around
separating the identity of the Client from the names of the Origins that it
accesses, are based on the expectation that there is not collusion between
the entities that know about Client identity and those that know about Origin
identity. Clients choose and share information with Attesters, and Origins
choose and share policy with Issuers; however, the Attester is generally
expected to not be colluding with Issuers or Origins. If this occurs, it
can become possible for an Attester to learn or infer which Origins a
Client is accessing, or for an Origin to learn or infer the Client
identity. For further discussion, see <xref target="collusion"/>.</t>
      </section>
    </section>
    <section anchor="terms">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.
<?line -6?>
      </t>
      <t>Unless otherwise specified, this document encodes protocol messages in TLS notation
from <xref target="TLS13"/>, Section 3.</t>
      <t>This draft includes pseudocode that uses the functions and conventions defined
in <xref target="HPKE"/>.</t>
      <t>Encoding an integer to a sequence of bytes in network byte order is described
using the function "encode(n, v)", where "n" is the number of bytes and "v" is
the integer value. The function "len()" returns the length of a sequence of bytes.</t>
      <t>The following terms are defined in <xref target="ARCH"/> and are used throughout this
document:</t>
      <ul spacing="normal">
        <li>
          <t>Client: An entity that provides authorization tokens to services
across the Internet, in return for authorization.</t>
        </li>
        <li>
          <t>Issuer: An entity that produces Privacy Pass tokens to clients.</t>
        </li>
        <li>
          <t>Attester: An entity that can attest to properties about the client,
including previous patterns of access.</t>
        </li>
        <li>
          <t>Origin: The server from which the client can redeem tokens.</t>
        </li>
        <li>
          <t>Issuance Protocol: The protocol exchange that involves the client,
attester, and issuer, used to generate tokens.</t>
        </li>
      </ul>
      <t>The following terms are defined in <xref target="AUTHSCHEME"/>, which defines the
interactions between clients and origins:</t>
      <ul spacing="normal">
        <li>
          <t>Issuer Name: The name that identifies the Issuer, which is an entity
that can generate tokens for a Client using one or more issuance protocols.</t>
        </li>
        <li>
          <t>Token Key: Keying material that can be used with an issuance protocol
to create a signed token.</t>
        </li>
        <li>
          <t>Origin Name: The name that identifies the Origin, as included in a
TokenChallenge.</t>
        </li>
      </ul>
      <t>Additionally, this document defines several terms that are unique to the
rate-limited issuance protocol:</t>
      <ul spacing="normal">
        <li>
          <t>Issuer Policy Window: The period over which an Issuer will track access
policy, defined in terms of seconds and represented as a uint64. The state
that the Attester keeps for a Client is specific to a policy window.
The effective policy window for a specific Client starts when the Client
first sends a request associated with an Issuer.</t>
        </li>
        <li>
          <t>Issuer Encapsulation Key: The public key used to encrypt values such as
Origin Name in requests from Clients to the Issuer, so that Attesters cannot learn
the Origin Name value. Each Issuer Encapsulation Key is used across all requests on the
Issuer, for different Origins.</t>
        </li>
        <li>
          <t>Client's Origin Alias: An identifier that is generated by the Client and marked
on requests to the Attester, which represents a specific Origin anonymously. The Client
generates a stable Client's Origin Alias for each pair of Origin Name and Issuer Name,
to allow the Attester to count token access without learning the Origin Name.</t>
        </li>
        <li>
          <t>Client Key: A public key chosen by the Client and shared only with the Attester;
see <xref target="issuance-unlinkability"/> for more details about this restriction.</t>
        </li>
        <li>
          <t>Client Secret: The secret key used by the Client during token issuance, whose public key
(Client Key) is shared with the Attester.</t>
        </li>
        <li>
          <t>Issuer Origin Secret: A per-origin secret key used by the Issuer during token issuance,
whose public key is not shared with anyone.</t>
        </li>
        <li>
          <t>Issuer's Origin Alias: An identifier that is generated by Issuer based on an
Issuer Origin Secret that is per-Client and per-Origin. See <xref target="response-one"/> for details
of derivation.</t>
        </li>
      </ul>
    </section>
    <section anchor="setup">
      <name>Configuration</name>
      <t>Issuers MUST provide the following parameters for configuration:</t>
      <ol spacing="normal" type="1"><li>
          <t>Issuer Policy Window: a uint64 of seconds as defined in <xref target="terms"/>.</t>
        </li>
        <li>
          <t>Issuer Request URI: a token request URL for generating access tokens.
For example, an Issuer URL might be https://issuer.example.net/token-request. This parameter
uses resource media type "text/plain".</t>
        </li>
        <li>
          <t>Issuer Public Key values: A list of Issuer Public Keys for the issuance protocol, each scoped to a particular origin.</t>
        </li>
        <li>
          <t>Issuer Encapsulation Key: a <tt>EncapsulationKey</tt> structure as defined below to use when encapsulating
information, such as the origin name, to the Issuer in issuance requests. This parameter uses resource media type
"application/issuer-encap-key". The Npk parameter corresponding to the HpkeKdfId can be found in <xref target="HPKE"/>.</t>
        </li>
      </ol>
      <artwork><![CDATA[
opaque HpkePublicKey[Npk]; // defined in RFC9180
uint16 HpkeKemId;          // defined in RFC9180
uint16 HpkeKdfId;          // defined in RFC9180
uint16 HpkeAeadId;         // defined in RFC9180

struct {
  uint8 key_id;
  HpkeKemId kem_id;
  HpkePublicKey public_key;
  HpkeKdfId kdf_id;
  HpkeAeadId aead_id;
} EncapsulationKey;
]]></artwork>
      <t>The Issuer parameters can be obtained from an Issuer via a directory object, which is a JSON
object whose field names and values are raw values and URLs for the parameters.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Field Name</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">issuer-policy-window</td>
            <td align="left">Issuer Policy Window as a JSON number</td>
          </tr>
          <tr>
            <td align="left">issuer-request-uri</td>
            <td align="left">Issuer Request URI resource URL as a JSON string, as defined in <xref target="ISSUANCE"/></td>
          </tr>
          <tr>
            <td align="left">encap-keys</td>
            <td align="left">List of Encapsulation Key values, each as a base64url encoded EncapsulationKey value</td>
          </tr>
          <tr>
            <td align="left">token-keys</td>
            <td align="left">List of Token Key values, each represented as JSON objects</td>
          </tr>
        </tbody>
      </table>
      <t>The "token-keys" JSON object is inherited from the basic issuance <xref target="ISSUANCE"/> protocol,
with an additional key "origin", which is a JSON string that indicates which origin
is bound to the key.</t>
      <t>Issuers MAY advertise multiple encap-keys to support key rotation, where the order
of the keys in the list indicates preference as with token-keys.</t>
      <t>As an example, the Issuer's JSON directory could look like:</t>
      <artwork><![CDATA[
 {
    "issuer-policy-window": 86400,
    "issuer-request-uri": "https://issuer.example.net/token-request",
    "encap-keys": [
      <encoded EncapsulationKey>
    ],
    "token-keys": [
      {
        "token-type": 3,
        "token-key": "MI...AB",
        "origin": "example.com"
      },
      {
        "token-type": 3,
        "token-key": "MI...AQ"
        "origin": "example.net"
      }
    ]
 }
]]></artwork>
      <t>Issuers MUST support at least one Token Key per origin. Issuers MAY support
multiple Token Key values for the same Origin in order to support rotation.</t>
      <t>As in <xref target="ISSUANCE"/>, Issuer directory resources have the media type
"application/private-token-issuer-directory" and are located at the well-known location
"/.well-known/private-token-issuer-directory".</t>
      <t>Issuers SHOULD use HTTP cache directives to permit caching of this resource <xref target="RFC5861"/>, as defined in the issuance <xref target="ISSUANCE"/> protocol.</t>
    </section>
    <section anchor="token-challenge-requirements">
      <name>Token Challenge Requirements</name>
      <t>Clients receive challenges for tokens, as described in <xref target="AUTHSCHEME"/>.</t>
      <t>For the rate-limited token issuance protocol described in this document,
the name of the origin is sent in an encrypted message from the Client
to the Issuer. If the TokenChallenge.origin_info field contains a single
origin name, that origin name is used. If the origin_info field is empty, the
encrypted message is the empty string "". If the origin_info field contains
multiple origin names, the Client is permitted to select any of the origin
names to use for the encrypted message. In general, the Client SHOULD
select the origin name that presented the challenge. However, in the context
of loading a webpage, the Client SHOULD prefer using the name of the
main document URL (the first-party name, as opposed to a third-party name)
if it is present in the origin_info list. This allows a third-party (an
embedded website resource) to send a challenge that applies a rate-limit
to the first party name (the origin that hosts the main document URL).
If a third-party is sending challenges in this way (that contain both the
first- and third-party origin names), the Issuers need to ensure that they
only allow rate-limiting on the expected origin (which SHOULD be the
first-party name, to align with Client behavior).</t>
      <t>The HTTP authentication challenge also SHOULD contain the following
additional attribute:</t>
      <ul spacing="normal">
        <li>
          <t>"issuer-encap-key", which contains a base64url encoding of a <tt>EncapsulationKey</tt> as defined
in <xref target="setup"/> to use when encrypting the Origin Name in issuance requests.</t>
        </li>
      </ul>
    </section>
    <section anchor="issuance">
      <name>Issuance Protocol</name>
      <t>This section describes the Issuance protocol for a Client to request and receive
a token from an Issuer. Token issuance involves a Client, Attester, and Issuer,
with the following steps:</t>
      <ol spacing="normal" type="1"><li>
          <t>The Client sends a token request containing a token request, encrypted origin
name, and one-time-use public key and signature to the Attester</t>
        </li>
        <li>
          <t>The Attester validates the request contents, specifically checking the request
signature, and proxies the request to the Issuer</t>
        </li>
        <li>
          <t>The Issuer validates the request against the signature, and processes its contents,
and produces a token response sent back to the Attester</t>
        </li>
        <li>
          <t>The Attester verifies the response and proxies the response to the Client</t>
        </li>
      </ol>
      <t>The Issuance protocol is designed such that Client, Attester, and Issuer learn only
what is necessary for completing the protocol; see <xref target="info-disclosure"/> for more details.</t>
      <t>The Issuance protocol has a number of underlying cryptographic dependencies for
operation:</t>
      <ul spacing="normal">
        <li>
          <t>RSA Blind Signatures <xref target="BLINDSIG"/>, for issuing and constructing Tokens. This support
is the same as used in the base publicly verifiable token issuance protocol <xref target="ISSUANCE"/></t>
        </li>
        <li>
          <t><xref target="HPKE"/>, for encrypting the origin server name in transit between Client and Issuer across the Attester.</t>
        </li>
        <li>
          <t>Signatures with key blinding, as described in <xref target="KEYBLINDING"/>, for verifying
correctness of Client requests.</t>
        </li>
      </ul>
      <t>Clients and Issuers are required to implement all of these dependencies, whereas Attesters are required
to implement signature with key blinding support.</t>
      <section anchor="state-requirements">
        <name>State Requirements</name>
        <t>The Issuance protocol requires each participating endpoint to maintain some
necessary state, as described in this section.</t>
        <section anchor="client-state">
          <name>Client State</name>
          <t>A Client is required to have the following information, derived from a given TokenChallenge:</t>
          <ul spacing="normal">
            <li>
              <t>Origin Name, a hostname referring to the Origin <xref target="RFC6454"/>. This is the name
of the Origin that issued the token challenge. One or more names can be listed
in the TokenChallenge.origin_info field. Rate-limited token issuance relies on the
client selecting a single origin name from this list if multiple are present.</t>
            </li>
            <li>
              <t>Token Key, a blind signature public key specific to the Origin. This key is owned by the
Issuer identified by the TokenChallenge.issuer_name.</t>
            </li>
            <li>
              <t>Issuer Encapsulation Key, a public key used to encrypt request information corresponding
to the Issuer identified by TokenChallenge.issuer_name.</t>
            </li>
          </ul>
          <t>Clients maintain a stable Client Key that they use for all communication with
a specific Attester. Client Key is a public key, where the corresponding private key
Client Secret is known only to the client.</t>
          <t>If the client loses this (Client Key, Client Secret), they may generate a new tuple. The
Attester will enforce if a client is allowed to use this new Client Key. See <xref target="attester-state"/>
for details on this enforcement.</t>
          <t>Clients also need to be able to generate an Client's Origin Alias value that corresponds
to the pair of Origin Name and Issuer Name, to send in requests to the Attester.</t>
          <t>Client's Origin Alias MUST be a stable and unpredictable 32-byte value computed by the Client.
Clients MUST NOT change this value across token requests for the same Origin Name and Issuer
Name. See <xref target="penalization"/> for a discussion of Attester behavior if a collision is detected.</t>
          <t>One possible mechanism for implementing this identifier is for the Client to store a mapping
between the pair of (Origin Name, Issuer Name) and a randomly generated Client's Origin Alias
for future requests. Alternatively, the Client can compute a PRF keyed by a per-client secret
(Client Secret) over the Origin Name and Issuer Name, e.g.,
Client's Origin Alias = HKDF(secret=Client Secret, salt="", info=(Origin Name, Issuer name)).</t>
        </section>
        <section anchor="attester-state">
          <name>Attester State</name>
          <t>An Attester is required to maintain state for every authenticated Client. The mechanism
of identifying a Client is specific to each Attester, and is not defined in this document.
As examples, the Attester could use device-specific certificates or account authentication
to identify a Client.</t>
          <t>Attesters need to enforce that Clients don't change their Client Key frequently, to ensure Clients can't
regularly evade the per-client policy as seen by the issuer. Attesters MUST NOT allow Clients to
change their Client Key more than once within a policy window, or in the subsequent policy window
after a previous Client Key change. Changing the secret will reset the client's policy window and
thus can be used to exceed rate limits. One way to mitigate this is for the Attester to penalize clients that register new secrets
too frequently. Alternative schemes where the Attester stores the encrypted
(Client Key, Client Secret) tuple on behalf of the client are possible but not described here.</t>
          <t>The Attester keeps track of Clients and Issuers that are not trusted, due to problems like
changing Client Keys frequently, etc, as penalized entities (see <xref target="penalization"/>).</t>
          <t>Attesters are expected to know both the Issuer Policy Window and current Issuer Encapsulation Key
for any Issuer Name to which they allow access. This information can be retrieved using the
URIs defined in <xref target="setup"/>. The current Issuer Encapsulation Key value is used to check the value
of the issuer_encap_key_id in Client-generated requests (<xref target="request-one"/>) to reject requests where
clients are using unique key IDs. Such unique keys could indicate a key-targeting attack that
intends de-anonymize a client to the Issuer. In order to handle encapsulation key rotation, the Attester
needs to know the current key value and the previou key value, and remember the last time the
value changed to ensure that it does not happen too frequently (such as no more than once per
policy window, or no more than once per day).</t>
          <t>For each Client-Issuer pair, an Attester maintains a policy window
start and end time for each Issuer from which a Client requests a token.</t>
          <t>For each tuple of (Client Key, Client's Origin Alias, policy window), the Attester maintains the
following state:</t>
          <ul spacing="normal">
            <li>
              <t>A counter of successful tokens issued</t>
            </li>
            <li>
              <t>Whether or not a previous request was rejected by the Issuer</t>
            </li>
            <li>
              <t>The previous rate limit provided by the Issuer</t>
            </li>
            <li>
              <t>The last received Issuer's Origin Alias value for this Client's Origin Alias, if any</t>
            </li>
          </ul>
          <t>The Issuer-provided rate limit for a single Origin is intended to not change more frequently
than once per policy window. If the Attester detects a change of rate limit multiple times
for the state kept for a single policy window, it SHOULD reject tokens issued in the remainder
of the policy window.</t>
        </section>
        <section anchor="issuer-state">
          <name>Issuer State</name>
          <t>Issuers maintain a stable Issuer Origin Secret that they use in calculating values returned
to the Attester for each origin. If this value changes, it will open up a possibility
for Clients to request extra tokens for an Origin without being limited, within a
policy window. See <xref target="token-key-management"/> for details about generating and rotating
the Issuer Origin Secret.</t>
          <t>Issuers are expected to have the private key that corresponds to Issuer Encapsulation Key,
which allows them to decrypt the Origin Name values in requests.</t>
          <t>For each Origin, Issuers need to know what rate limit to enforce during a policy window.
Issuers SHOULD NOT use unique values for specific Origins, which would allow Attesters
to recognize an Origin being accessed by multiple Clients. Each Origin limit is allowed
to change, but SHOULD NOT change more often than once per policy window, to ensure that
the limit is useful.</t>
        </section>
      </section>
      <section anchor="issuance-http-headers">
        <name>Issuance HTTP Headers</name>
        <t>The Issuance protocol defines four new HTTP headers that are used in requests
and responses between Clients, Attesters, and Issuers (see <xref target="iana-headers"/>).</t>
        <t>The "Sec-Token-Origin-Alias" is an Item Structured Header <xref target="RFC8941"/>. Its
value MUST be a Byte Sequence. This header is sent both on Client-to-Attester
requests (<xref target="request-one"/>) and on Issuer-to-Attester responses (<xref target="response-one"/>).
Its ABNF is:</t>
        <artwork><![CDATA[
    Sec-Token-Origin-Alias = sf-binary
]]></artwork>
        <t>The "Sec-Token-Client" is an Item Structured Header <xref target="RFC8941"/>. Its
value MUST be a Byte Sequence. This header is sent on Client-to-Attester
requests (<xref target="request-one"/>), and contains the bytes of Client Key.
Its ABNF is:</t>
        <artwork><![CDATA[
    Sec-Token-Client = sf-binary
]]></artwork>
        <t>The "Sec-Token-Request-Blind" is an Item Structured Header <xref target="RFC8941"/>. Its
value MUST be a Byte Sequence. This header is sent on Client-to-Attester
requests (<xref target="request-one"/>), and contains a per-request nonce value.
Its ABNF is:</t>
        <artwork><![CDATA[
    Sec-Token-Request-Blind = sf-binary
]]></artwork>
        <t>The "Sec-Token-Limit" is an Item Structured Header <xref target="RFC8941"/>. Its
value MUST be an Integer. This header is sent on Issuer-to-Attester
responses (<xref target="response-one"/>), and contains the number of times a
Client can retrieve a token for the requested Origin within a policy window,
as set by the Issuer. Its ABNF is:</t>
        <artwork><![CDATA[
    Sec-Token-Limit = sf-integer
]]></artwork>
      </section>
      <section anchor="request-one">
        <name>Client-to-Attester Request</name>
        <t>The Client and Attester MUST use a secure and Attester-authenticated HTTPS
connection. They MAY use mutual authentication or mechanisms such as TLS
certificate pinning, to mitigate the risk of channel compromise; see
<xref target="sec-considerations"/> for additional about this channel.</t>
        <section anchor="client-behavior">
          <name>Client behavior</name>
          <t>Requests to the Attester need to indicate the Issuer Name to which issuance
requests will be forwarded. Attesters SHOULD provide Clients with a URI template
that contains one variable that contains the Issuer Name, "issuer", using
Level 3 URI template encoding as defined in Section 1.2 of <xref target="RFC6570"/>.</t>
          <t>An example of an Attester URI templates is shown below:</t>
          <artwork><![CDATA[
https://attester.net/token-request{?issuer}
]]></artwork>
          <t>Attesters and Clients MAY agree on other mechanisms to specify the Issuer Name
in requests.</t>
          <t>The Client first creates an issuance request message for a random value <tt>nonce</tt>
using the input TokenChallenge <tt>challenge</tt> and the Issuer key identifier <tt>key_id</tt>
as follows:</t>
          <artwork><![CDATA[
nonce = random(32)
context = SHA256(challenge)
token_input = concat(0x0003, nonce, context, key_id)
blinded_msg, blind_inv = rsabssa_blind(pkI, token_input)
]]></artwork>
          <t>The Client then uses Client Key to generate its one-time-use request public
key <tt>request_key</tt> and blind <tt>request_blind</tt> as described in <xref target="client-issuers-origin-alias"/>.</t>
          <t>The Client then computes <tt>token_key_id</tt> as the least significant byte of the Token Key
ID, where the Token Key ID is generated as SHA256(public_key) and public_key is a DER-encoded
SubjectPublicKeyInfo object carrying Token Key. The Client then constructs a InnerTokenRequest
value, denoted <tt>origin_token_request</tt>, combining <tt>token_key_id</tt>, <tt>blinded_msg</tt>, and a padded
representation of the origin name as follows:</t>
          <artwork><![CDATA[
struct {
  uint8_t token_key_id;
  uint8_t blinded_msg[Nk];
  uint8_t padded_origin_name<0..2^16-1>;
} InnerTokenRequest;
]]></artwork>
          <t>This structure is initialized and then encrypted using Issuer Encryption Key, producing
<tt>encrypted_token_request</tt>, as described in <xref target="encrypt-origin"/>.</t>
          <t>Finally, the Client uses Client Secret to produce <tt>request_signature</tt>
as described in <xref target="index-proof"/>.</t>
          <t>The Client then constructs a TokenRequest structure. This TokenRequest
structure is based on the publicly verifiable token issuance path in
<xref target="ISSUANCE"/>, adding fields for the encrypted origin name and request signature.</t>
          <artwork><![CDATA[
struct {
   uint16_t token_type = 0x0003;
   uint8_t request_key[Npk];
   uint8_t issuer_encap_key_id[32];
   uint8_t encrypted_token_request<1..2^16-1>;
   uint8_t request_signature[Nsig];
} TokenRequest;
]]></artwork>
          <t>The structure fields are defined as follows:</t>
          <ul spacing="normal">
            <li>
              <t>"token_type" is a 2-octet integer, which matches the type in the challenge.</t>
            </li>
            <li>
              <t>"request_key" is the request_key value generated above.</t>
            </li>
            <li>
              <t>"issuer_encap_key_id" is a collision-resistant hash that identifies the Issuer
Encryption Key, generated as SHA256(EncapsulationKey).</t>
            </li>
            <li>
              <t>"encrypted_token_request" is an encrypted structure that contains an InnerTokenRequest
value, calculated as described in <xref target="encrypt-origin"/>.</t>
            </li>
            <li>
              <t>"request_signature" is computed as described in <xref target="index-proof"/>.</t>
            </li>
          </ul>
          <t>The Client then generates an HTTP POST request to send through the Attester to
the Issuer, with the TokenRequest as the body. The media type for this request
is "application/private-token-request". The Client includes the "Sec-Token-Origin-Alias" header,
whose value is Client's Origin Alias; the "Sec-Token-Client" header, whose value is
Client Key; and the "Sec-Token-Request-Blind" header, whose value is request_blind.
The Client sends this request to the Attester's proxy URI. An example request is
shown below, where the Issuer Name is "issuer.net" and the Attester URI template is
"https://attester.net/token-request{?issuer}"</t>
          <artwork><![CDATA[
:method = POST
:scheme = https
:authority = attester.net
:path = /token-request?issuer=issuer.net
accept = application/private-token-response
cache-control = no-cache, no-store
content-type = application/private-token-request
content-length = <Length of TokenRequest>
sec-token-origin-alias = Client's Origin Alias
sec-token-client = Client Key
sec-token-request-blind = request_blind

<Bytes containing the TokenRequest>
]]></artwork>
        </section>
        <section anchor="attester-behavior">
          <name>Attester behavior</name>
          <t>Upon receiving a request from a Client, the Attester checks if the Client has been
penalized based on incorrect behavior using this protocol (see <xref target="penalization"/>).
If the Client is not trusted, the Attester rejects the request with an appropriate HTTP 4xx error.</t>
          <t>If this Issuer for the token request is not known to or trusted by the Attester, including if the Issuer
has been penalized (see <xref target="penalization"/>), the Attester rejects the request with
an appropriate HTTP error.</t>
          <t>If the Attester detects a token_type in the TokenRequest that it does not recognize
or support, it MUST reject the request with an HTTP 400 error.</t>
          <t>The Attester also checks to validate that the issuer_encap_key_id in the client's TokenRequest
matches a known Issuer Encapsulation Key public key for the Issuer. For example, the Attester can
fetch this key using the API defined in <xref target="setup"/>. This check is done to help ensure that
the Client has not been given a unique key that could allow the Issuer to fingerprint or target
the Client. If the key does not match, the Attester rejects the request with an HTTP
400 error. Note that this can lead to failures in the event of Issuer Issuer Encapsulation Key
rotation; see <xref target="privacy-considerations"/> for considerations.</t>
          <t>The Attester finally validates the Client's stable mapping request as described in
<xref target="attester-issuers-origin-alias"/>. If this fails, the Attester MUST return an HTTP 400
error to the Client.</t>
          <t>If the Attester accepts the request, it will look up the state stored for this Client.
It will look up the count of previously generate tokens for this Client using the same
Client's Origin Alias. See <xref target="attester-state"/> for more details.</t>
          <t>If the Attester has stored state that a previous request for this Client's Origin Alias was
rejected by the Issuer in the current policy window, it SHOULD reject the request without
forwarding it to the Issuer.</t>
          <t>If the Attester detects this Client has changed their Client Key more frequently than allowed
as described in <xref target="attester-state"/>, it SHOULD reject the request without forwarding it to
the Issuer, and also use this event to penalize the Client (see <xref target="penalization"/>).</t>
        </section>
      </section>
      <section anchor="request-two">
        <name>Attester-to-Issuer Request</name>
        <t>The Attester and the Issuer MUST use a secure and Issuer-authenticated HTTPS
connection for all requests. Also, Issuers MUST authenticate Attesters, either via mutual
TLS or another form of application-layer authentication. They MAY additionally use
mechanisms such as TLS certificate pinning, to mitigate the risk of channel
compromise; see <xref target="sec-considerations"/> for additional about this channel.</t>
        <section anchor="attester-behavior-1">
          <name>Attester behavior</name>
          <t>Assuming all checks in <xref target="request-one"/> succeed, the Attester generates an HTTP POST request
to send to the Issuer with the Client's TokenRequest as the body. The Attester MUST NOT
add information that will uniquely identify a Client, or associate the request with a small
set of possible Clients. Extensions to this protocol MAY allow Attesters to add information
that can be used to separate large populations, such as providing information about the country
or region to which a Client belongs. An example request is shown below.</t>
          <artwork><![CDATA[
:method = POST
:scheme = https
:authority = issuer.net
:path = /token-request
accept = application/private-token-response
cache-control = no-cache, no-store
content-type = application/private-token-request
content-length = <Length of TokenRequest>

<Bytes containing the TokenRequest>
]]></artwork>
        </section>
        <section anchor="issuer-behavior">
          <name>Issuer behavior</name>
          <t>Upon receipt of the forwarded request, the Issuer validates the following conditions:</t>
          <ul spacing="normal">
            <li>
              <t>The TokenRequest contains a supported token_type</t>
            </li>
            <li>
              <t>The TokenRequest.issuer_encap_key_id correspond to known Issuer Encapsulation Keys held by the Issuer.</t>
            </li>
            <li>
              <t>The TokenRequest.encrypted_token_request can be decrypted using the
Issuer's private key (the private key associated with Issuer Encapsulation Key), and contains
a valid InnerTokenRequest whose unpadded origin name matches an Origin Name that is served by
the Issuer. The Origin name associated with the InnerTokenRequest value might be the empty string "",
as described in <xref target="encrypt-origin"/>, in which case the Issuer applies a cross-origin
policy if supported. If a cross-origin policy is not supported, this condition is not met.</t>
            </li>
          </ul>
          <t>If any of these conditions is not met, the Issuer MUST return an HTTP 400 error to the Attester,
which will forward the error to the client.</t>
          <t>The Issuer determines the correct Issuer Key by using the decrypted Origin Name and
InnerTokenRequest.token_key_id values. If there is no Token Key whose truncated key ID matches
InnerTokenRequest.token_key_id, the Issuer MUST return an HTTP 401 error to Attester, which will
forward the error to the client. The Attester learns that the client's view of the Origin key
was invalid in the process.</t>
        </section>
      </section>
      <section anchor="response-one">
        <name>Token Issuance Response</name>
        <section anchor="issuer-behavior-1">
          <name>Issuer behavior</name>
          <t>If the Issuer is willing to give a token to the Client, the Issuer decrypts
TokenRequest.encrypted_token_request to discover a InnerTokenRequest value. If this fails,
the Issuer rejects the request with a 400 error. Otherwise, the Issuer validates and
processes the token request with Issuer Origin Secret corresponding to the designated
Origin as described in <xref target="issuer-issuers-origin-alias"/>. If this fails, the Issuer
rejects the request with a 400 error. Otherwise, the output is
index_key.</t>
          <t>The Issuer completes the issuance flow by computing a blinded response as follows:</t>
          <artwork><![CDATA[
blind_sig = rsabssa_blind_sign(skP, InnerTokenRequest.blinded_msg)
]]></artwork>
          <t><tt>skP</tt> is the private key corresponding to the per-Origin Token Key, known only to the Issuer.
The Issuer then encrypts <tt>blind_sig</tt> to the Client as described in <xref target="encap-issuer-to-client"/>,
yielding <tt>encrypted_token_response</tt>.</t>
          <t>The Issuer generates an HTTP response with status code 200 whose body consists of
blind_sig, with the content type set as "application/private-token-response", the
index_key set in the "Sec-Token-Origin-Alias" header, and the limit of tokens
allowed for a Client for the Origin within a policy window set in the
"Sec-Token-Limit" header. This limit SHOULD NOT be unique to a specific
Origin, such that the Attester could use the value to infer which Origin
the Client is accessing (see <xref target="privacy-considerations"/>).</t>
          <artwork><![CDATA[
:status = 200
content-type = application/private-token-response
content-length = <Length of blind_sig>
sec-token-origin-alias = index_key
sec-token-limit = Token limit

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

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

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

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

issuer_origin_alias = HKDF-Hash(secret=index_result,
  salt=pk_encoded, info="IssuerOriginAlias")
]]></artwork>
      </section>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>This section describes security considerations relevant to the use of this protocol.</t>
      <section anchor="client-secret-use">
        <name>Client Secret Use</name>
        <t>The Client Secret key is used for two purposes in this protocol: (1) computing request
signatures and (2) computing the Issuer's Origin Alias (with the corresponding
public key). This is necessary to ensure the client associated with the Issuer's
Origin Alias is the same client that produced a corresponding request. In general, using
the same cryptographic key for two distinct purposes is considered bad practice.
However, analysis of this protocol demonstrates that it is safe in this context.
The Client Secret MUST NOT be used for any purpose outside of this protocol.</t>
      </section>
      <section anchor="custom-token-request-encapsulation">
        <name>Custom Token Request Encapsulation</name>
        <t>The protocol in this document uses <xref target="HPKE"/> directly to encrypt token request information
to the issuer while also authenticating information exposed to the attester. Oblivious HTTP
<xref target="OHTTP"/>, which is a protocol built on top of HPKE for
request encapsulation, is not suitable for this purpose since it does not allow clients to
additionally authenticate application-layer information that is visible to intermediaries,
which is the case for the data visible to the Attester.</t>
      </section>
      <section anchor="channel-security">
        <name>Channel Security</name>
        <t>An attacker that can act as an intermediate between Attester and Issuer
communication can influence or disrupt the ability for the Issuer to correctly
rate-limit token issuance.  All communication channels use server-authenticated
HTTPS. Some connections, e.g., between an Attester and an Issuer, require
mutual authentication between both endpoints. Where appropriate, endpoints
MAY use further enhancements such as TLS certificate pinning to mitigate
the risk of channel compromise.</t>
      </section>
      <section anchor="issuance-unlinkability">
        <name>Token Request Unlinkability and Unforgeability</name>
        <t>Client token requests are constructed such that an Issuer cannot distinguish between
any two token requests from the same Client and two requests from different Clients.
We refer to this property as issuance unlinkability. This property is achieved
by the way the tokens are constructed. In particular, TokenRequest.request_key and TokenRequest.request_signature
are the only value in a TokenRequest that is derived from per-Client information, i.e.,
the Client Secret.</t>
        <t>TokenRequest.request_key is computed using a freshly generated blind for each token
request. As a result, the value of TokenRequest.request_key in one token request is
statistically independent from Client Key. Similarly, TokenRequest.request_signature
is computed using the same freshly generated blind as TokenRequest.request_key for each
token request, and the resulting signature is therefore independent from signatures
produced using Client Secret. More details about this unlinkability property can be
found in <xref target="KEYBLINDING"/>.</t>
        <t>This unlinkability property is only intended for requests observed by the Issuer.
In contrast, the Attester is required to link requests from the same Client together
for the purposes of enforcing rate limits. This Attester does this by observing the
Client Key. Importantly, the Client Key is not sent to the Issuer during the issuance
flow, as doing this would allow the Issuer to trivially link two requests to the same
Client.</t>
        <t>The token request signature is also required to be unforgeable. Informally, unforgeability
means that no entity can produce a valid (message, signature) pair for any blinding key without
access to the private signing key. Importantly, the means the Attester cannot forge
signatures on behalf of a given Client in an attempt to learn the origin name.</t>
      </section>
      <section anchor="info-disclosure">
        <name>Information Disclosure</name>
        <t>The protocol in this document is designed such that information pertaining to issuance
of a token is limited to parties that need it for completing the protocol. In particular,
honest-but-curious Attesters learn only the Issuer's Origin Alias as described in
<xref target="issuers-origin-alias"/>, any per-Client information necessary for attestation, and the
target Issuer for a given token request. The Attester does not directly learn the origin
name associated with a given token request, though it does learn the distribution of tokens
across Client interactions. This auxiliary information could be used to infer the Origin
for a given token. For example, if an Issuer has only two configured Origins, each with
a different token request pattern, then the distribution of Client tokens might reveal
the Origin associated with a given token.</t>
        <t>Malicious or otherwise compromised Attesters can choose to not follow the protocol described
in this specification, allowing, for example, Clients to bypass rate limits imposed by
Origins. Moreover, malicious Attesters could reveal the per-request blind (request_blind)
to Issuers, breaking the unlinkability property described in <xref target="issuance-unlinkability"/>.</t>
        <t>Honest-but-curious Issuers only learn the Attester that vouches for a particular Client's
token request and the origin name associated with a token request. Issuers do not learn
the Issuer's Origin Alias or any per-Client information used when creating a token
request.</t>
        <t>Conversely, malicious Issuers that do not follow the protocol can choose to not validate
the token request signature, thereby allowing others to forge token requests in an attempt
to learn the origin name. Malicious Issuers can also rotate token signing keys or Issuer
Origin Secret values frequently in an attempt to bypass Attester-enforced rate limits.
Both of these are detectable by the Attester, though. Issuers can also lie about per-origin
rate limits without detection, e.g., by increasing the limit to a value well beyond any configured
limit by an Origin, or return different limits for different origins to the Attester.</t>
        <t>Clients learn the output token. They do not learn the Issuer's Origin Alias, though the
security of the protocol does not depend on keeping this value secret from Clients. Moreover,
even malicious Clients cannot tamper with per-Client state stored on the Attester for other
Clients, as doing so requires knowledge of their unique Client Secret.</t>
      </section>
      <section anchor="rate-limit-enforcement">
        <name>Rate Limit Enforcement</name>
        <t>Since the purpose of this token variant is to allow rate limits to be enforced on token
issuance to Clients, the accuracy of the rate limit is an important part of evaluating
the efficacy and security of a given deployment.</t>
        <t>The rate limit is enforced by the Attester based on state about the Client that only
the Attester holds, where the state is kept on a per-Issuer and per-Origin basis. This means
that the selection of both the Issuer and the Attester determines the state for the rate
limit. As such, Origins SHOULD only send challenges for a single Issuer within a given
period of time, in order to ensure that a Client is not able to get tokens across
multiple Issuers and exceed the rate limit. Similarly, Issuers need to be selective
in which Attesters they allow, to ensure that a single Client cannot trivially work
with many Attesters in order to exceed the rate limit.</t>
        <t>Since the effectiveness of the rate limit requires a bounded set of Attesters for any
particular use case, deployments need to consider the impact on centralization in order
to ensure that new Attesters can still join the overall ecosystem. See the discussion
on centralization in <xref target="ARCH"/>.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>This section describes privacy considerations relevant to use of this protocol.</t>
      <section anchor="client-token-state-and-origin-tracking">
        <name>Client Token State and Origin Tracking</name>
        <t>Origins SHOULD only generate token challenges based on client action, such as when a user
loads a website. Clients SHOULD ignore token challenges if an Origin tries to force the
client to present tokens multiple times without any new client-initiated action. Failure
to do so can allow malicious origins to track clients across contexts. Specifically, an
origin can abuse per-user token limits for tracking by assigning each new client a random
token count and observing whether or not the client can successfully redeem that many
tokens in a given context. If any token redemption fails, then the origin learns information
about how many tokens that client had previously been issued.</t>
        <t>By rejecting repeated or duplicative challenges within a single context, the origin only
learns a single bit of information: whether or not the client had any token quota left
in the given policy window.</t>
      </section>
      <section anchor="origin-verification">
        <name>Origin Verification</name>
        <t>Rate-limited tokens are defined in terms of a Client authenticating to an Origin, where
the "origin" is used as defined in <xref target="RFC6454"/>. In order to limit cross-origin correlation,
Clients MUST verify that the name of the origin that is providing the HTTP authentication
challenge is present in the TokenChallenge.origin_info list (<xref target="AUTHSCHEME"/>), where the
matching logic is defined for same-origin policies in <xref target="RFC6454"/>. Clients MAY further limit
which authentication challenges they are willing to respond to, for example by only accepting
challenges when the origin is a web site to which the user navigated.</t>
      </section>
      <section anchor="client-identification-with-unique-encapsulation-keys">
        <name>Client Identification with Unique Encapsulation Keys</name>
        <t>Client activity could be linked if an Origin and Issuer collude to have unique keys targeted
at specific Clients or sets of Clients.</t>
        <t>As with the basic issuance protocol <xref target="ISSUANCE"/>, the token_key_id is truncated to a single
octet to mitigate the risk of unique keys per client.</t>
        <t>Clients SHOULD check encapsulation key consistency to help mitigate targeting attacks. Consistency for Privacy Pass resources such as Issuer directories and token keys is described in
<xref target="CONSISTENCY"/>.
<xref target="CONSISTENCY-MIRROR"/> describes a specific
approach in which Clients can check the consistency of a key using a mirror server.
Since encapsulation keys are available in the Issuer well-known configuration (<xref target="setup"/>),
the Client can fetch the configuration via a mirror to perform a consistency check.</t>
        <t>Clients can also detect inconsistency if the encapsulation key changes across multiple
challenges (indicating that an Origin might be trying to target Clients, but did not
recognize the Client across two requests). Encapsulation key changes within a short
period of time can indicate that the Origin is attempting to target the Client.</t>
        <t>The Attester can also help ensure consistency with an in-band check, which conforms
to the approach in <xref target="CONSISTENCY-INBAND"/>.
The Attester can observe and validate the issuer_encap_key_id presented by the Client to
the Issuer. As described in <xref target="request-one"/>, Attesters MUST validate that the
issuer_encap_key_id in the Client's TokenRequest matches a known Issuer
Encapsulation Key public key for the Issuer. The Attester needs to support key rotation, but
ought to disallow very rapid key changes, which could indicate that an Origin is colluding with
an Issuer to try to rotate the key for each new Client in order to link the client activity.</t>
      </section>
      <section anchor="client-identification-with-unique-per-origin-token-keys">
        <name>Client Identification with Unique Per-Origin Token Keys</name>
        <t>Client activity could also be linked if an Origin and Issuer collude to use a unique
per-origin Token Key.</t>
        <t>Since Attesters do not see per-origin identities that can be correlated across Clients,
Attesters cannot perform in-band consistency checks.</t>
        <t>Clients SHOULD check encapsulation key consistency to help mitigate targeting attacks.
Consistency for Privacy Pass resources such as Issuer directories and token keys is described in
<xref target="CONSISTENCY"/>.
<xref target="CONSISTENCY-MIRROR"/> describes a specific
approach in which Clients can check the consistency of a key using a mirror server.
Since per-origin token keys are available in the Issuer well-known configuration (<xref target="setup"/>),
the Client can fetch the configuration via a mirror to perform a consistency check.</t>
        <t>Clients can detect inconsistency if the token key for an Origin-Issuer pair changes across
multiple challenges (indicating that an Origin might be trying to target Clients, but did not
recognize the Client across two requests). Token key changes within a short
period of time can indicate that the Origin is attempting to target the Client.</t>
      </section>
      <section anchor="origin-identification">
        <name>Origin Identification</name>
        <t>As stated in <xref target="properties"/>, the design of this protocol is such that Attesters cannot
learn the identity of origins that Clients are accessing. The Origin Name itself is
encrypted in the request between the Client and the Issuer, so the Attester cannot
directly learn the value. However, in order to prevent the Attester from inferring the
value, additional constraints need to be added:</t>
        <ul spacing="normal">
          <li>
            <t>Each Issuer SHOULD serve tokens to a large number of Origins. A one-to-one relationship
between Origin and Issuer would allow an Attester to infer which Origin is accessed
simply by observing the Issuer identity.</t>
          </li>
          <li>
            <t>Issuers SHOULD NOT return rate-limit values that are specific to Origins, such
that an Attester can infer which Origin is accessed by observing the rate limit. This
can be mitigated by having many Origins share the same rate-limit value.</t>
          </li>
          <li>
            <t>If an Issuer changes the rate-limit values for a single Origin, that change occurring
at the same time across multiple Clients could allow Attesters to recognize an Origin
in common across Clients. To mitigate this, Issuers either can change the limits for
multiple Origins simultaneously, or have an Origin switch to a separate Issuer.</t>
          </li>
        </ul>
        <t>Some deployments MAY choose to relax these requirements, such as in cases where the
origins being accessed are ubiquitous or do not correspond to user-specific behavior.</t>
      </section>
      <section anchor="collusion">
        <name>Collusion Among Different Entities</name>
        <t>Collusion among the different entities in the Privacy Pass architecture can result in
exposure of a client's per-origin access patterns.</t>
        <t>For this issuance protocol, Issuers and Attesters should be run by mutually distinct
organizations to limit information sharing. A single entity running an Issuer and Attester
for a single token issuance flow can view the origins being accessed by a given client.
Running the Issuer and Attester in this 'single Issuer/Attester' fashion reduces the privacy
promises of no one entity being able to learn Client browsing patterns. This may be desirable
for a redemption flow that is limited to specific Issuers and Attesters, but should be avoided
where hiding origin names from the Attester is desirable.</t>
        <t>If a Attester and Origin are able to collude, they can correlate a client's identity
and origin access patterns through timestamp correlation. The timing of a request to an
Origin and subsequent token issuance to a Attester can reveal the Client
identity (as known to the Attester) to the Origin, especially if repeated over multiple accesses.</t>
      </section>
    </section>
    <section anchor="deploy">
      <name>Deployment Considerations</name>
      <section anchor="token-key-management">
        <name>Token Key Management</name>
        <t>Issuers SHOULD generate new (Token Key, Issuer Origin Secret) values regularly, and
SHOULD maintain old and new secrets to allow for graceful updates. The RECOMMENDED
rotation interval is two times the length of the policy window for that
information. During generation, issuers must ensure the <tt>token_key_id</tt> (the 8-bit
prefix of SHA256(Token Key)) is different from all other <tt>token_key_id</tt>
values for that Origin currently in rotation. One way to ensure this uniqueness
is via rejection sampling, where a new key is generated until its <tt>token_key_id</tt> is
unique among all currently in rotation for the Origin.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA considerations</name>
      <section anchor="iana-token-type">
        <name>Token Type</name>
        <t>This document updates the "Token Type" Registry (<xref target="AUTHSCHEME"/>) with the following value:</t>
        <table anchor="aeadid-values">
          <name>Token Types</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Publicly Verifiable</th>
              <th align="left">Public Metadata</th>
              <th align="left">Private Metadata</th>
              <th align="left">Nk</th>
              <th align="left">Nid</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0003 (suggested)</td>
              <td align="left">Rate-Limited Blind RSA(SHA-384, 2048-bit) with ECDSA(P-384, SHA-384)</td>
              <td align="left">Y</td>
              <td align="left">N</td>
              <td align="left">N</td>
              <td align="left">512</td>
              <td align="left">32</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">0x0004 (suggested)</td>
              <td align="left">Rate-Limited Blind RSA(SHA-384, 2048-bit) with Ed25519(SHA-512)</td>
              <td align="left">Y</td>
              <td align="left">N</td>
              <td align="left">N</td>
              <td align="left">512</td>
              <td align="left">32</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
        <t>The details of the signature scheme with key blinding and unblinding functions for each token type above are described in the following sections.</t>
        <section anchor="ecdsa-sig-functions">
          <name>ECDSA-based Token Type</name>
          <t>This section describes the implementation details of the signature scheme with key
blinding and unblinding functions introduced in <xref target="issuers-origin-alias"/> using
<xref target="ECDSA"/> with P-384 as the underlying elliptic curve and SHA-384 as the corresponding
hash function.</t>
          <ul spacing="normal">
            <li>
              <t>BKS-KeyGen(): Generate a random ECDSA private and public key pair (sk, pk).</t>
            </li>
            <li>
              <t>BKS-BlindKeyGen(): Generate a random ECDSA private key bk.</t>
            </li>
            <li>
              <t>BKS-BlindPublicKey(pk, bk, ctx): Produce a blinded public key based on the input public
key pk, blind bk, and context ctx according to <xref target="KEYBLINDING"/>, Section 6.1.</t>
            </li>
            <li>
              <t>BKS-UnblindPublicKey(pk, bk, ctx): Produce an unblinded public key based on the input
blinded public key pk, blind bk, and context ctx according to <xref target="KEYBLINDING"/>, Section 6.1.</t>
            </li>
            <li>
              <t>BKS-Verify(pk, msg, sig): Verify the DER-encoded <xref target="X690"/> BKS-Sig-Value signature
sig over input message msg against the ECDSA public key pk, producing a boolean value indicating success.</t>
            </li>
            <li>
              <t>BKS-BlindKeySign(sk_sign, sk_blind, ctx, msg): Sign input message msg with signing key sk_sign, blind sk_blind,
and context ctx according to <xref target="KEYBLINDING"/>, Section 6.2, and serializes the resulting signature
pair (r, s) in "raw" form, i.e., as the concatenation of two 48-byte, big endian scalars,
yielding an <tt>Nsig=96</tt> byte signature.</t>
            </li>
            <li>
              <t>BKS-SerializePrivatekey(sk): Serialize an ECDSA private key using the Field-Element-to-Octet-String
conversion according to <xref target="SECG"/>.</t>
            </li>
            <li>
              <t>BKS-DeserializePrivatekey(buf): Attempt to deserialize an ECDSA private key from a 48-byte
string buf using Octet-String-to-Field-Element from <xref target="SECG"/>. This function can fail if buf
does not represent a valid private key.</t>
            </li>
            <li>
              <t>BKS-SerializePublicKey(pk): Serialize an ECDSA public key using the
compressed Elliptic-Curve-Point-to-Octet-String method according to <xref target="SECG"/>.</t>
            </li>
            <li>
              <t>BKS-DeserializePublicKey(buf): Attempt to deserialize a public key using
the compressed Octet-String-to-Elliptic-Curve-Point method according to <xref target="SECG"/>,
and then performs partial public-key validation as defined in section 5.6.2.3.4 of
<xref target="KEYAGREEMENT"/>. This validation includes checking
that the coordinates are in the correct range, that the point is on the curve, and
that the point is not the point at infinity.</t>
            </li>
          </ul>
        </section>
        <section anchor="eddsa-sig-functions">
          <name>Ed25519-based Token Type</name>
          <t>This section describes the implementation details of the signature scheme with key
blinding and unblinding functions introduced in <xref target="issuers-origin-alias"/> using
Ed25519 as described in <xref target="RFC8032"/>.</t>
          <ul spacing="normal">
            <li>
              <t>BKS-KeyGen(): Generate a random Ed25519 private and public key pair (sk, pk), where
sk is randomly generated 32 bytes (See <xref target="RFC4086"/> for information about randomness
generation) and pk is computed according to <xref section="5.1.5" sectionFormat="comma" target="RFC8032"/>.</t>
            </li>
            <li>
              <t>BKS-BlindKeyGen(): Generate and output 32 random bytes.</t>
            </li>
            <li>
              <t>BKS-BlindPublicKey(pk, bk, ctx): Produce a blinded public key based on the input public
key pk, blind bk, and context ctx according to <xref section="5.1" sectionFormat="comma" target="KEYBLINDING"/>.</t>
            </li>
            <li>
              <t>BKS-UnblindPublicKey(pk, bk, ctx): Produce an unblinded public key based on the input
blinded public key pk, blind bk, and context ctx according to <xref target="KEYBLINDING"/>, Section 5.1.</t>
            </li>
            <li>
              <t>BKS-Verify(pk, msg, sig): Verify the signature sig over input message msg against
the Ed25519 public key pk, as defined in <xref section="5.1.7" sectionFormat="comma" target="RFC8032"/>, producing a
boolean value indicating success.</t>
            </li>
            <li>
              <t>BKS-BlindKeySign(sk_sign, sk_blind, ctx, msg): Sign input message msg with signing key sk_sign, blind
sk_blind, and context ctx according to <xref section="5.2" sectionFormat="comma" target="KEYBLINDING"/>, yielding an <tt>Nsig=64</tt> byte signature.</t>
            </li>
            <li>
              <t>BKS-SerializePrivatekey(sk): Identity function which outputs sk as an <tt>Nsk=32</tt> byte buffer.</t>
            </li>
            <li>
              <t>BKS-DeserializePrivatekey(buf): Identity function which outputs buf interpreted as <tt>sk</tt>.</t>
            </li>
            <li>
              <t>BKS-SerializePublicKey(pk): Identity function which outputs pk as an <tt>Npk=32</tt> byte buffer.</t>
            </li>
            <li>
              <t>BKS-DeserializePublicKey(buf): Identity function which outputs buf interpreted as <tt>pk</tt>.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="iana-headers">
        <name>HTTP Headers</name>
        <t>This document registers four new headers for use on the token issuance path
in the "Hypertext Transfer Protocol (HTTP) Field Name Registry" &lt;<eref target="https://www.iana.org/assignments/http-fields"/>&gt;.</t>
        <figure anchor="iana-header-type-table">
          <name>Registered HTTP Header</name>
          <artwork><![CDATA[
    +-------------------------+----------+--------+---------------+
    | Header Field Name       | Protocol | Status |   Reference   |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Origin-Alias  |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Client        |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Request-Blind |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
    | Sec-Token-Limit         |   http   |  std   | This document |
    +-------------------------+----------+--------+---------------+
]]></artwork>
        </figure>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="X690">
          <front>
            <title>Information technology - ASN.1 encoding Rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)</title>
            <author>
              <organization>ITU-T</organization>
            </author>
            <date year="2021" month="February"/>
          </front>
          <seriesInfo name="ISO/IEC 8824-1:2021" value=""/>
        </reference>
        <reference anchor="ECDSA">
          <front>
            <title>Public Key Cryptography for the Financial Services Industry - The Elliptic Curve Digital Signature Algorithm (ECDSA)</title>
            <author>
              <organization>American National Standards Institute</organization>
            </author>
            <date year="2005" month="November"/>
          </front>
          <seriesInfo name="ANSI" value="ANS X9.62-2005"/>
        </reference>
        <reference anchor="SECG" target="https://secg.org/sec1-v2.pdf">
          <front>
            <title>Elliptic Curve Cryptography, Standards for Efficient Cryptography Group, ver. 2</title>
            <author>
              <organization/>
            </author>
            <date year="2009"/>
          </front>
        </reference>
        <reference anchor="ARCH">
          <front>
            <title>The Privacy Pass Architecture</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="September" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for authorization
   based on privacy-preserving authentication mechanisms.  It describes
   the conceptual model of Privacy Pass and its protocols, its security
   and privacy goals, practical deployment models, and recommendations
   for each deployment model that helps ensure the desired security and
   privacy goals are fulfilled.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-architecture-16"/>
        </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="3" month="October" 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-16"/>
        </reference>
        <reference anchor="BLINDSIG">
          <front>
            <title>RSA Blind Signatures</title>
            <author fullname="F. Denis" initials="F." surname="Denis"/>
            <author fullname="F. Jacobs" initials="F." surname="Jacobs"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document specifies an RSA-based blind signature protocol. RSA blind signatures were first introduced by Chaum for untraceable payments. A signature that is output from this protocol can be verified as an RSA-PSS signature.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9474"/>
          <seriesInfo name="DOI" value="10.17487/RFC9474"/>
        </reference>
        <reference anchor="AUTHSCHEME">
          <front>
            <title>The Privacy Pass HTTP Authentication Scheme</title>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="23" month="October" year="2023"/>
            <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>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-auth-scheme-15"/>
        </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="HPKE">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="RFC5861">
          <front>
            <title>HTTP Cache-Control Extensions for Stale Content</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document defines two independent HTTP Cache-Control extensions that allow control over the use of stale responses by caches. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5861"/>
          <seriesInfo name="DOI" value="10.17487/RFC5861"/>
        </reference>
        <reference anchor="KEYBLINDING">
          <front>
            <title>Key Blinding for Signature Schemes</title>
            <author fullname="Frank Denis" initials="F." surname="Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <author fullname="Edward Eaton" initials="E." surname="Eaton">
              <organization>University of Waterloo</organization>
            </author>
            <author fullname="Tancrède Lepoint" initials="T." surname="Lepoint">
         </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="22" month="January" year="2024"/>
            <abstract>
              <t>   This document describes extensions to existing digital signature
   schemes for key blinding.  The core property of signing with key
   blinding is that a blinded public key and all signatures produced
   using the blinded key pair are independent of the unblinded key pair.
   Moreover, signatures produced using blinded key pairs are
   indistinguishable from signatures produced using unblinded key pairs.
   This functionality has a variety of applications, including Tor onion
   services and privacy-preserving airdrop for bootstrapping
   cryptocurrency systems.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-signature-key-blinding-05"/>
        </reference>
        <reference anchor="RFC6454">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <date month="December" year="2011"/>
            <abstract>
              <t>This document defines the concept of an "origin", which is often used as the scope of authority or privilege by user agents. Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites. In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string. It also defines an HTTP header field, named "Origin", that indicates which origins are associated with an HTTP request. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </reference>
        <reference anchor="RFC8941">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8941"/>
          <seriesInfo name="DOI" value="10.17487/RFC8941"/>
        </reference>
        <reference anchor="RFC6570">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="M. Hadley" initials="M." surname="Hadley"/>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="D. Orchard" initials="D." surname="Orchard"/>
            <date month="March" year="2012"/>
            <abstract>
              <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6570"/>
          <seriesInfo name="DOI" value="10.17487/RFC6570"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="KEYAGREEMENT">
          <front>
            <title>Recommendation for pair-wise key-establishment schemes using discrete logarithm cryptography</title>
            <author fullname="Elaine Barker" initials="E." surname="Barker">
              <organization/>
            </author>
            <author fullname="Lily Chen" initials="L." surname="Chen">
              <organization/>
            </author>
            <author fullname="Allen Roginsky" initials="A." surname="Roginsky">
              <organization/>
            </author>
            <author fullname="Apostol Vassilev" initials="A." surname="Vassilev">
              <organization/>
            </author>
            <author fullname="Richard Davis" initials="R." surname="Davis">
              <organization/>
            </author>
            <date month="April" year="2018"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.sp.800-56ar3"/>
          <refcontent>National Institute of Standards and Technology</refcontent>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="OHTTP">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="January" year="2024"/>
            <abstract>
              <t>This document describes Oblivious HTTP, a protocol for forwarding encrypted HTTP messages. Oblivious HTTP allows a client to make multiple requests to an origin server without that server being able to link those requests to the client or to identify the requests as having come from the same client, while placing only limited trust in the nodes used to forward the messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9458"/>
          <seriesInfo name="DOI" value="10.17487/RFC9458"/>
        </reference>
        <reference anchor="CONSISTENCY">
          <front>
            <title>Key Consistency and Discovery</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Matthew Finkel" initials="M." surname="Finkel">
              <organization>The Tor Project</organization>
            </author>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="10" month="July" year="2023"/>
            <abstract>
              <t>   This document describes the consistency requirements of protocols
   such as Privacy Pass, Oblivious DoH, and Oblivious HTTP for user
   privacy.  It presents definitions for consistency and then surveys
   mechanisms for providing consistency in varying threat models.  In
   concludes with discussion of open problems in this area.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-key-consistency-01"/>
        </reference>
        <reference anchor="CONSISTENCY-MIRROR">
          <front>
            <title>Checking Resource Consistency with HTTP Mirrors</title>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Matthew Finkel" initials="M." surname="Finkel">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <date day="23" month="October" year="2023"/>
            <abstract>
              <t>   This document describes the mirror protocol, an HTTP-based protocol
   for fetching mirrored HTTP resources.  The primary use case for the
   mirror protocol is to support HTTP resource consistency checks in
   protocols that require clients have a consistent view of some
   protocol-specific resource (typically, a public key) for security or
   privacy reasons, including Privacy Pass and Oblivious HTTP.  To that
   end, this document also describes how to use the mirror protocol to
   implement these consistency checks.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-group-privacypass-consistency-mirror-01"/>
        </reference>
        <reference anchor="CONSISTENCY-INBAND">
          <front>
            <title>Privacy Pass In-Band Key Consistency Checks</title>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="10" month="July" year="2023"/>
            <abstract>
              <t>   This document describes an in-band key consistency enforcement
   mechanism for Privacy Pass deployments wherein the Attester is split
   from the Issuer and Origin.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-pw-privacypass-in-band-consistency-00"/>
        </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>
      </references>
    </references>
    <?line 1716?>

<section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors of this document would like to acknowledge feedback from contributors
to the Privacy Pass working group for their help in improving this document.
The authors also thank Frank Denis and David Schinazi for their contributions.</t>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This section includes test vectors for Origin Name encryption in <xref target="encrypt-origin"/>
and Client's Origin Alias computation in <xref target="issuers-origin-alias"/>. Test vectors for
the token request and response protocol can be found in <xref target="ISSUANCE"/>.</t>
      <section anchor="origin-name-encryption-test-vector">
        <name>Origin Name Encryption Test Vector</name>
        <t>The test vector below for the procedure in <xref target="encrypt-origin"/> lists the following values:</t>
        <ul spacing="normal">
          <li>
            <t>origin_name: The Origin Name to encrypt, represented as a hexadecimal string.</t>
          </li>
          <li>
            <t>kem_id, kdf_id, aead_id: The HPKE algorithms comprising the ciphersuite DHKEM(X25519, HKDF-SHA256), HKDF-SHA256, AES-128-GCM.</t>
          </li>
          <li>
            <t>issuer_encap_key_seed: The seed used to derive the private key corresponding to
Issuer Encapsulation Key via the DeriveKeyPair function as defined in <xref section="7.1.3." sectionFormat="of" target="HPKE"/>,
represented as a hexadecimal string.</t>
          </li>
          <li>
            <t>issuer_encap_key: The public Issuer Encapsulation Key, represented as a hexadecimal string.</t>
          </li>
          <li>
            <t>token_type: The type of the protocol specified in this document.</t>
          </li>
          <li>
            <t>token_key_id: The ID of Token Key computed as in <xref target="request-one"/>, a single octet.</t>
          </li>
          <li>
            <t>blinded_msg: A random blinded_msg value, represented as a hexadecimal string.</t>
          </li>
          <li>
            <t>request_key: A random request_key value, represented as a hexadecimal string.</t>
          </li>
          <li>
            <t>issuer_encap_key_id: The Issuer Encapsulation Key ID computed as in <xref target="request-one"/>, represented as a hexadecimal string.</t>
          </li>
          <li>
            <t>encrypted_token_request: The encrypted InnerTokenRequest, represented as a hexadecimal string.</t>
          </li>
        </ul>
        <artwork><![CDATA[
origin_name: 746573742e6578616d706c65
kem_id: 32
kdf_id: 1
aead_id: 1
issuer_encap_key_seed:
d2653816496f400baec656f213f1345092f4406af4f2a63e164956c4c3d240ca
issuer_encap_key: 010020d7b6a2c10e75c4239feb9897e8d23f3f3c377d78e7903611
53167736a24a9c5400010001
token_type: 3
token_key_id: 125
blinded_msg: 89da551a48270b053e53c9eb741badf89e43cb7e66366bb936e11fb2aa0
d30866986a790378bb9fc6a7cf5c32b7b7584d448ffa4ced3be650e354b3136428a52ec0
b27c4103c5855c2b9b4f521ad0713c800d7e6925b6c62e1a6f58b31d13335f468cf509b7
46a16e79b23862d277d0880706c3fb84b127d94faf8d6d2f3e124e681994441b19be084e
c5c159bcd0abab433bbc308d90ea2cabdf4216e1b07155be66a048d686e383ca1e517ab8
0025bb4849d98beb8c3d05d045c1167cb74f4451d8f85695babb604418385464f21f9a81
5fb850ed83fd16a966130427e5637816501f7a79c0010e06adeba55781ceb50f56eae152
ebd06f3cef80dc7ab121d
request_key: 0161d905e4e37f515cb61f863b60e5896aa9e4a17dbe238e752a144c64a
5412e244f0b1f75e010831e185cac023d33cb20
issuer_encap_key_id:
dd2c6de3091f1873643233d229a7a0e9defe0f9fe43f6a7c42ae3a6b16f77837
encrypted_token_request: 82ef7c068506bcabc27d068a51c7ead2cbaf600b76a15e4
d9df99a0da676da5a073fcc8f5ac77b25064d7379037b4e1b186977cface31eceb611978
c73c9aef38c9a0e8ae846881624fa6d454523a0a91d22b02b022891d0469deebd66a912a
a1ab3391b203e92e0a681f0a10c2a2d59b668daf1e5219ed16227d707fa0e8e29188bd58
7ab38b3584564ce9b6538ba82e301cfed4231a2fa4f64a67285a1b9bf648e25f3eb1644c
88d43552bdea6e4bfcbaef0de3ac245e0432be6b019494927fde0743b775f9efe8ca5fef
afbf2048890d54618d408a6001fc8fb276f6828c46f4fe1381e9775eec72ee47593df738
95d18952440d33756d78caea4bd8218950d35afa6c46c535211eda39da277260cb8dab7c
00c6840a745e8150a6ee4893e72b6a51382f877f8c05a15e891a2bde07049760f0f09879
78d78b97e47ecaf90a44996d724dd3720e308abbbf04f672bc5a4db573291986be191b06
03ff521accb6fa081c151c758f3092a89fc6ef591934ff4bc860896c57f83a31b237dd1b
803516c
]]></artwork>
      </section>
      <section anchor="issuers-origin-alias-test-vector">
        <name>Issuer's Origin Alias Test Vector</name>
        <t>The test vector below for the procedure in <xref target="issuers-origin-alias"/> lists the following values:</t>
        <ul spacing="normal">
          <li>
            <t>sk_client: Client Secret, serialized and represented as a hexadecimal string.</t>
          </li>
          <li>
            <t>pk_client: Client Key, serialized and represented as a hexadecimal string.</t>
          </li>
          <li>
            <t>sk_origin: Origin Secret, serialized and represented as a hexadecimal string.</t>
          </li>
          <li>
            <t>request_blind: The request_blind value computed in <xref target="index-request"/>, represented as a hexadecimal string.</t>
          </li>
          <li>
            <t>index_key: The index_key value computed in <xref target="issuer-issuers-origin-alias"/>, represented as a hexadecimal string.</t>
          </li>
          <li>
            <t>issuer_origin_alias: The issuer_origin_alias value computed in <xref target="attester-output-issuers-origin-alias"/>, represented as a hexadecimal string.</t>
          </li>
        </ul>
        <artwork><![CDATA[
sk_sign: f7a8996bfd0d4ef9af88b3eab73d9e05a2d8c557407236aa15e67b4c
8972bc57afb6562f0341dcc5e80fbb71811b9bbe
pk_sign: 032d276595b188b428e954f0cf61bebea9663a7d6678042a54bdb177
8fc88df7f03b83f7e2c15b14147f3487363f9dbd7a
sk_origin: 337d87ad143b414e05e7f764df402b8af14c20c34dc727dca027aa
87a5e1099f3760985813549a451ec42b0d7a377fdf
request_blind: 7444e18d84cad471dc07d8210b714493254776ff897f040feb
6e97a9a5f90f21d940ea7c50f8a5e3d9d8998c45ab7d42
request_key: 02168f9ec10377781d0b16370e7e97b02755741ad0e66e089696
080b4412ce56e933d47c22ff08a5d5da1474aa6b899b0a
index_key: 0284e8d968c696e57194db7b7a37814a1d7c9c2216106530561d07
adc87ff1b6b9c8b911711f5be66c165bbe90c280befb
issuer_origin_alias: ee475b7c158ff52a89ae21e7178ce572124ba6012a58
ba4124f0c691ffe4b40099637964891316264e8442f5f17aa5af
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+296XYb15Uw+v88RTW97gr5BYAxA6SjpGlJjtm2JX2inGFl
5ZqFwgFZTQCFRgGSGFn9LPdZ7pPdPZ6hqkBScnrId5vplkmg6gz77LPnod1u
m12+W9qz5Oh1urPt7/NVvrPz5E1xa9fJRVnu03Vmk1fbYldkxfLIpLPZ1r49
S+pPl2ZeZOt0BWPNt+li187tbtHebPO3aXa3ScuyvcV3lvhOe0dvtLtDk8GH
18X27izJ14vCmHyzPUt2232563e7p92+ubV374rt/Cy5WO/sdm137Wc4vDHl
Ll3Pf0qXxRqmvLOl2eRnyV9gna2kLLa7rV2U8NvdCn/5qzHpfndTbM9M0jYJ
/OTr8iy57CTf2vV8m2e3ZbGmz3kHl1mx29W+K7bXZ8nvi+J6aZPvv39Kn9lV
mi/PkhJf+Ofyxr/RyYpVNNm/dJKLO7u+TrfBRP+SrtPoY5rjm7TcLe/C8f91
m//zgj6tjfumk7xK9/I4j/qmWK3ugk9p0PPNBtZ9sc469FkJELK7s+Tl2spX
r9LtbfLHlF/J8h2cydP9xm53+bpoJU/TZb4otus8TU5H3d6Qnyr26x0e3o9r
woTLHRxnmRSL5HxlARBpuIfdBhf0zylOVtsFHMUf0uXc/i08hZ19C2gYfH7f
Cbylx/45u9kWq3y/6sCz0QxPO8l5J/ljUcyDKZ7ebPNyV2xu7Db6liZ6uiz2
88Uy3dpwoix99883Nt3k6+tZvis7gJLGrIvtKt3lby0gWPKn8Wn3jF7Ry3UB
uE0PFOtkZ7ObdbEsru+SdnJ++aLTS+w6K+YwXvJ6v7QIjI3N8gWAj14AaH6d
lnmWPI8eS46/fv76BA9mXazh2WXt+6fwfQKXJHkGe4TP9zkg6Lz22DN47IiW
O4fTA+yzs+0+3d4l/W6/R5+7u5M42Fy8+bH9hhEJDtqWeHv1gYvLl19ePH+a
TKf9Ybt3JsM8f/rs8jwGy6v9bAn7+s7eJU+3d5tdcb1NNzd3CQAr2d3Y5Jt8
DfQnh61d2u3bPIPVXqznQBu2CLs38MTz5TLf7GCMp/vtWwsbvc53+Hh+vU53
+y2g9hKoS767WSXHtIBop0BiRu1e78A2zl9cXpzhv8mfTjvjfhufPgQOQfd1
8oLODJeA5CndznHJAP3dfodYdPn86e9jGFR2EMKhFQyCIHm+AJzI7XoXQ+v3
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
KLOgC/H/AQipiFgYbAEA

-->

</rfc>
