<?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-rfc2629 version 1.5.12 -->
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-private-access-tokens-01" category="std" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.10.0 -->
  <front>
    <title abbrev="Private Access Tokens">Private Access Tokens</title>
    <seriesInfo name="Internet-Draft" value="draft-private-access-tokens-01"/>
    <author initials="S." surname="Hendrickson" fullname="Scott Hendrickson">
      <organization>Google LLC</organization>
      <address>
        <email>scott@shendrickson.com</email>
      </address>
    </author>
    <author initials="J." surname="Iyengar" fullname="Jana Iyengar">
      <organization>Fastly</organization>
      <address>
        <email>jri@fastly.com</email>
      </address>
    </author>
    <author initials="T." surname="Pauly" fullname="Tommy Pauly">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <author initials="S." surname="Valdez" fullname="Steven Valdez">
      <organization>Google LLC</organization>
      <address>
        <email>svaldez@chromium.org</email>
      </address>
    </author>
    <author initials="C.A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2021" month="October" day="25"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document defines a protocol for issuing and redeeming privacy-preserving
access tokens. These tokens can adhere to an issuance policy, allowing a
service to limit access according to the policy without tracking client identity.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
  <eref target="https://github.com/tfpauly/privacy-proxy"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>Servers commonly use passive and persistent identifiers associated with clients,
such as IP addresses or device identifiers, for enforcing access and usage
policies. For example, a server might limit the amount of content an IP address
can access over a given time period (referred to as a "metered paywall"), or
a server might rate-limit access from an IP address to prevent fraud and
abuse. Servers also commonly use the client's IP address as a strong indicator
of the client's geographic location to limit access to services or content to a
specific geographic area (referred to as "geofencing").</t>
      <t>However, passive and persistent client identifiers can be used by any entity
that has access to it without the client's express consent. A server can use a
client's IP address or its device identifier to track client activity. A
client's IP address, and therefore its location, is visible to all entities on
the path between the client and the server. These entities can trivially track a
client, its location, and servers that the client visits.</t>
      <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>This document describes an architecture for Private Access Tokens (PATs),
using RSA Blind Signatures as defined in
<xref target="BLINDSIG" format="default"/>, as an explicit replacement for
these passive client identifiers. These tokens are privately issued to clients
upon request and then redeemed by servers in such a way that the issuance and
redemption events for a given token are unlinkable.</t>
      <t>At first glance, using PATs in lieu of passive identifiers for policy
enforcement suggests that some entity needs to know both the client's identity
and the server's policy, and such an entity would be trivially able to track a
client and its activities. However, with appropriate mediation and separation
between the parties involved in the issuance and the redemption protocols, it is
possible to eliminate this information concentration without any functional
regressions. This document describes such a protocol.</t>
      <t>The relationship of this work to Privacy Pass (<xref target="I-D.ietf-privacypass-protocol" format="default"/>)
is discussed in <xref target="privacy-pass" format="default"/>.</t>
      <section anchor="motivation" numbered="true" toc="default">
        <name>Motivation</name>
        <t>This section describes classes of use cases where an origin would traditionally
use a stable and unique client identifier for enforcing attribute-based
policy. Hiding these identifiers from origins would therefore require an
alternative for origins to continue enforcing their policies. Using the Privacy
Address Token architecture for addressing these use cases is described in
<xref target="examples" format="default"/>.</t>
        <section anchor="use-case-rate-limit" numbered="true" toc="default">
          <name>Rate-limited Access</name>
          <t>An origin provides rate-limited access to content to a client over a fixed
period of time. The origin does not need to know the client's identity, but
needs to know that a requesting client has not exceeded the maximum rate set by
the origin.</t>
          <t>One example of this use case is a metered paywall, where an origin limits the
number of page requests to 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>Another example of this use case is rate-limiting page accesses to a client to
help prevent fraud. Operations that are sensitive to fraud, such as account
creation on a website, often employ rate-limiting as a defense in depth
strategy. Captchas or additional verification can be required by these pages
when a client exceeds a set rate-limit.</t>
          <t>Origins routinely use client IP addresses for this purpose.</t>
        </section>
        <section anchor="use-case-geolocation" numbered="true" toc="default">
          <name>Client Geo-Location</name>
          <t>An origin provides access to or customizes content based on the geo-location of
the client. The origin does not need to know the client's identity, but needs to
know the geo-location, with some level of accuracy, for providing service.</t>
          <t>A specific example of this use case is "geo-fencing", where an origin restricts
the available content it can serve based on the client's geographical region.</t>
          <t>Origins almost exclusively use client IP addresses for this purpose.</t>
        </section>
        <section anchor="use-case-authentication" numbered="true" toc="default">
          <name>Private Client Authentication</name>
          <t>An origin provides access to content for clients that have been authorized by a
delegated or known mediator. The origin does not need to know the client's
identity.</t>
          <t>A specific example of this use case is a federated service that authorizes users
for access to specific sites, such as a federated news service or a federated
video streaming service. The origin trusts the federator to authorize users and
needs proof that the federator authorized a particular user, but it does not
need the user's identity to provide access to content.</t>
          <t>Origins could currently redirect clients to a federator for authentication, but
origins could then track the client's federator user ID or the client's IP
address across accesses.</t>
        </section>
      </section>
      <section anchor="architecture" numbered="true" toc="default">
        <name>Architecture</name>
        <t>At a high level, the PAT architecture seeks to solve the following problem: in
the absence of a stable Client identifier, an Origin needs to verify the
identity of a connecting Client and enforce access policies for the incoming
Client. To accomplish this, the PAT architecture employs four functional
components:</t>
        <ol spacing="normal" type="1"><li>Client: requests a PAT from an Issuer and presents it to a Origin for access
to the Origin's service.</li>
          <li>Mediator: authenticates a Client, using information such as its IP address,
an account name, or a device identifier. Anonymizes a Client to an Issuer and
relays information between an anonymized Client and an Issuer.</li>
          <li>Issuer: issues PATs to an anonymized Client on behalf of an
Origin. Anonymizes an Origin to a Mediator and enforces the Origin's policy.</li>
          <li>Origin: directs a Client to an Issuer with a challenge and enables access to
content or services to the Client upon verification of any PAT sent in
response by the Client.</li>
        </ol>
        <t>In the PAT architecture, these four components interact as follows.</t>
        <t>An Origin designates a trusted Issuer to issue tokens for it. The Origin then
redirects any incoming Clients to the Issuer for policy enforcement, expecting
the Client to return with a proof from the Issuer that the Origin's policy has
been enforced for this Client.</t>
        <t>The Client employs a trusted Mediator through which it communicates with the
Issuer for this proof. The Mediator performs three important functions:</t>
        <ul spacing="normal">
          <li>authenticate and associate the Client with a stable identifier;</li>
          <li>maintain issuance state for the Client and relay it to the Issuer; and</li>
          <li>anonymize the Client and mediate communication between the Client and the
Issuer.</li>
        </ul>
        <t>When a Mediator-anonymized Client requests a token from an Issuer, the Issuer
enforces the Origin's policies based on the received Client issuance state and
Origin policy. Issuers know the Origin's policies and enforce them on behalf of the
Origin. An example policy is: "Limit 10 accesses per Client".  More examples and
their use cases are discussed in <xref target="examples" format="default"/>. The Issuer does not learn the
Client's true identity.</t>
        <t>Finally, the Origin provides access to content or services to a Client upon
verifying a PAT presented by the Client. Verification of this
token serves as proof that the Client meets the Origin's policies as enforced by
the delegated Issuer with the help of a Mediator. The Origin can then provide
any services or content gated behind these policies to the Client.</t>
        <t><xref target="fig-overview" format="default"/> shows the components of the PAT architecture described in this
document. Protocol details follow in <xref target="challenge-redemption" format="default"/> and <xref target="issuance" format="default"/>.</t>
        <figure anchor="fig-overview">
          <name>PAT Architectural Components</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
 Client        Mediator          Issuer          Origin

    <---------------------------------------- Challenge \
                                                        |
+--------------------------------------------\          |
| TokenRequest --->                          |          |
|             (validate)                     |          |
|             (attach state)                 |          |
|                    TokenRequest --->       |          |    PAT
|                                 (validate) |   PAT    | Challenge/
|                                 (evaluate) | Issuance |  Response
|                    <--- TokenResponse      |   Flow   |   Flow
|             (evaluate)                     |          |
|             (update state)                 |          |
|   <--- TokenResponse                       |          |
---------------------------------------------/          |
                                                        |
     Response -------------------------------------- >  /
]]></artwork>
        </figure>
      </section>
      <section anchor="properties" numbered="true" toc="default">
        <name>Properties and Requirements</name>
        <t>In this architecture, the Mediator, Issuer, and Origin 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" format="default"/> for more about the pieces of
information):</t>
        <ul spacing="normal">
          <li>The Mediator 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), and the number
of tokens issued to a given Client for the claimed Origin in the given policy
window.  The Mediator does not know the identity of the Origin the Client is
trying to access (ORIGIN_ID), but knows a Client-anonymized identifier for
it (ANON_ORIGIN_ID).</li>
          <li>The Issuer knows the Origin's secret (ORIGIN_SECRET) and policy about client
access, and learns the Origin's identity (ORIGIN_NAME) and the number of
previous tokens issued to the Client (as communicated by the Mediator) during
issuance. The Issuer does not learn the Client's identity.</li>
          <li>The Origin knows the Issuer to which it will delegate an incoming Client
(ISSUER_NAME), and can verify that any tokens presented by the Client were
signed by the Issuer. The Origin does not learn which Mediator was used by a
Client for issuance.</li>
        </ul>
        <t>Since an Issuer enforces 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 architecture that the Mediator not learn the Origin's identity so that,
despite knowing the Client's identity, a Mediator cannot track and concentrate
information about Client activity.</t>
        <t>An Issuer expects a Mediator to verify its Clients' identities correctly, but an
Issuer cannot confirm a Mediator's efficacy or the Mediator-Client relationship
directly without learning the Client's identity. Similarly, an Origin does not
know the Mediator's identity, but ultimately relies on the Mediator 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 Mediators; the Issuer can employ its own methods to determine the
reputation of a Mediator.</t>
        <t>A Mediator is expected to employ a stable Client identifier, such as an IP
address, a device identifier, or an account at the Mediator, 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" format="default"/>
for more details. A Client can use a service offered by its Mediator or a
third-party to store these secrets, but it is a requirement of the PAT
architecture that the Mediator not be able to learn these secrets.</t>
        <t>The privacy guarantees of the PAT architecture, 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 Mediators, and Origins
choose and share policy with Issuers; however, the Mediator is generally
expected to not be colluding with Issuers or Origins. If this occurs, it
can become possible for a Mediator 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" format="default"/>.</t>
      </section>
      <section anchor="client-identity" numbered="true" toc="default">
        <name>Client Identity</name>
        <t>The PAT architecture does not enforce strong constraints around the definition
of a Client identity and allows it to be defined entirely by a Mediator. If a
user can create an arbitrary number of Client identities that are accepted by
one or more Mediators, a malicious user can easily abuse the system to
defeat the Issuer's ability to enforce per-Client policies.</t>
        <t>These multiple identities could be fake or true identities.</t>
        <t>A Mediator alone is responsible for detecting and weeding out fake Client
identities in the PAT architecture. An Issuer relies on a Mediator's reputation;
as explained in <xref target="properties" format="default"/>, the correctness of the architecture hinges on
Issuers issuing tokens to only known and reputable Mediators.</t>
        <t>Users have multiple true identities on the Internet however, and as a result, it
seems possible for a user to abuse the system without having to create
fake identities. For instance, a user could use multiple Mediators,
authenticating with each one using a different true identity.</t>
        <t>The PAT architecture offers no panacea against this potential abuse.  We note
however that the usages of PATs will cause the ecosystem to evolve and offer
practical mitigations, such as:</t>
        <ul spacing="normal">
          <li>An Issuer can learn the properties of a Mediator - specifically, which stable
Client identifier is authenticated by the Mediator - to determine whether the
Mediator is acceptable for an Origin.</li>
          <li>An Origin can choose an Issuer based on the types of Mediators accepted by the
Issuer, or the Origin can communicate its constraints to the designated
Issuer.</li>
          <li>An Origin can direct a user to a specific Issuer based on client properties
that are visible. For instance, properties that are observable in the HTTP
User Agent string.</li>
          <li>The number of true Mediator-authenticated identities for a user is expected to
be small, and therefore likely to be small enough to not matter for certain
use cases. For instance, when PATs are used to prevent fraud by rate-limiting
Clients (as described in <xref target="use-case-rate-limit" format="default"/>), an Origin might be tolerant
of the potential amplification caused by an attacking user's access to
multiple true identities with Issuer-trusted Mediators.</li>
        </ul>
      </section>
      <section anchor="user-interaction" numbered="true" toc="default">
        <name>User Interaction</name>
        <t>When used in contexts like websites, origin servers that challenge clients for
Private Access Tokens need to consider how to optimize their interaction model
to ensure a good user experience.</t>
        <t>Private Access Tokens are designed to be used without explicit user involvement.
Since tokens are only valid for a single origin and in response to a specific
challenge, there is no need for a user to manage a limited pool of tokens
across origins. The information that is available to an origin upon token
redemption is limited to the fact that this is a client that passed a
Mediator's checks and has not exceeded the per-origin limit defined by an
Issuer. Generally, if a user is willing to use Private Access Tokens with
a particular origin (or all origins), there is no need for per-challenge
user interaction. Note that the Issuance flow may separately involve user interaction if
the Mediator needs to authenticate the Client.</t>
        <t>Since tokens are issued using a separate connection through a Mediator
to an Issuer, the process of issuance can add user-perceivable latency.
Origins SHOULD NOT block useful work on token authentication.
Instead, token authentication can be used in similar ways to CAPTCHA
validation today, but without the need for user interaction. If issuance
is taking a long time, a website could show an indicator that it is waiting,
or fall back to another method of user validation.</t>
        <t>If an origin is requesting an unexpected number of tokens, such as requesting
token authentication more than once for a single website load, it can indicate
that the server is not functioning correctly, or is trying to attack or overload
the client or issuance servers. In such cases, the client SHOULD ignore
redundant token challengers, or else alert the user.</t>
      </section>
    </section>
    <section anchor="terms" numbered="true" toc="default">
      <name>Notation and 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" format="default"/> <xref target="RFC8174" format="default"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <t>Unless said otherwise, this document encodes protocol messages in TLS notation
from <xref target="TLS13" format="default"/>, Section 3.</t>
      <t>This draft includes pseudocode that uses the functions and conventions defined
in <xref target="HPKE" format="default"/>.</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 to refer to the different pieces of information
passed through the system:</t>
      <dl>
        <dt>
ISSUER_NAME:  </dt>
        <dd>
          <t>The Issuer Name identifies which Issuer is able to provide tokens for a Client.
The Client sends the Issuer Name to the Mediator so the Mediator know where to
forward requests. Each Issuer is associated with a specific ISSUER_POLICY_WINDOW.</t>
        </dd>
        <dt>
ISSUER_POLICY_WINDOW:  </dt>
        <dd>
          <t>The period over which an Issuer will track access policy, defined in terms of
seconds and represented as a uint64. The state that the Mediator 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>
        </dd>
        <dt>
ORIGIN_TOKEN_KEY:  </dt>
        <dd>
          <t>The public key used when generating and verifying Private Access Tokens. Each
Origin Token Key is unique to a single Origin. The corresponding private key
is held by the Issuer.</t>
        </dd>
        <dt>
ISSUER_KEY:  </dt>
        <dd>
          <t>The public key used to encrypt values such as ORIGIN_NAME in requests from
Clients to the Issuer, so that Mediators cannot learn the ORIGIN_NAME value. Each
ISSUER_KEY is used across all requests on the Issuer, for different Origins.</t>
        </dd>
        <dt>
ORIGIN_NAME:  </dt>
        <dd>
          <t>The name of the Origin that requests and verifies Private Access Tokens.</t>
        </dd>
        <dt>
ANON_ORIGIN_ID:  </dt>
        <dd>
          <t>An identifier that is generated by the Client and marked on requests to the
Mediator, which represents a specific Origin anonymously. The Client generates
a stable ANON_ORIGIN_ID for each ORIGIN_NAME, to allow the Mediator to count
token access without learning the ORIGIN_NAME.</t>
        </dd>
        <dt>
CLIENT_KEY:  </dt>
        <dd>
          <t>A public key chosen by the Client and shared only with the Mediator.</t>
        </dd>
        <dt>
CLIENT_SECRET:  </dt>
        <dd>
          <t>The secret key used by the Client during token issuance, whose public key
(CLIENT_KEY) is shared with the Mediator.</t>
        </dd>
        <dt>
ORIGIN_SECRET:  </dt>
        <dd>
          <t>The secret key used by the Issuer during token issuance, whose public key is
not shared with anyone.</t>
        </dd>
        <dt>
ANON_ISSUER_ORIGIN_ID:  </dt>
        <dd>
          <t>An identifier that is generated by Issuer based on an ORIGIN_SECRET that is
per-Client and per-Origin. See <xref target="response-two" format="default"/> for details of derivation.</t>
        </dd>
      </dl>
    </section>
    <section anchor="setup" numbered="true" toc="default">
      <name>Configuration</name>
      <t>Issuers MUST provide three parameters for configuration:</t>
      <ol spacing="normal" type="1"><li>ISSUER_KEY: a <tt>KeyConfig</tt> as defined in <xref target="OHTTP" format="default"/> to use when
encrypting the ORIGIN_NAME in issuance requests. This parameter uses resource media type
"application/ohttp-keys".</li>
        <li>ISSUER_POLICY_WINDOW: a uint64 of seconds as defined in <xref target="terms" format="default"/>.</li>
        <li>ISSUER_REQUEST_URI: a Private Access Token request URL for generating access tokens.
For example, an Issuer URL might be https://issuer.example.net/access-token-request. This parameter
uses resource media type "text/plain".</li>
      </ol>
      <t>These 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 align="center">
        <thead>
          <tr>
            <th align="left">Field Name</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">issuer-key</td>
            <td align="left">ISSUER_KEY resource URL as a JSON string</td>
          </tr>
          <tr>
            <td align="left">issuer-policy-window</td>
            <td align="left">ISSUER_POLICY_WINDOW as a JSON number</td>
          </tr>
          <tr>
            <td align="left">issuer-request-uri</td>
            <td align="left">ISSUER_REQUEST_URI resource URL as a JSON string</td>
          </tr>
        </tbody>
      </table>
      <t>As an example, the Issuer's JSON directory could look like:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
 {
    "issuer-key": "https://issuer.example.net/key",
    "issuer-token-window": 86400,
    "issuer-request-uri": "https://issuer.example.net/access-token-request"
 }
]]></artwork>
      <t>Mediators MUST provide a single parameter for configuration, MEDIATOR_REQUEST_URI,
wich is Private Access Token request URL for proxying protocol messages to Issuers.
For example, a Mediator URL might be https://mediator.example.net/relay-access-token-request.
Similar to Issuers, Mediators make this parameter available by a directory object
with the following contents:</t>
      <table align="center">
        <thead>
          <tr>
            <th align="left">Field Name</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">mediator-request-uri</td>
            <td align="left">MEDIATOR_REQUEST_URI resource URL</td>
          </tr>
        </tbody>
      </table>
      <t>As an example, the Mediator's JSON dictionary could look like:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
 {
    "mediator-request-uri": "https://mediator.example.net/relay-access-token-request."
 }
]]></artwork>
      <t>Issuer and Mediator directory resources have the media type "application/json"
and are located at the well-known location /.well-known/private-access-tokens-directory.</t>
    </section>
    <section anchor="challenge-redemption" numbered="true" toc="default">
      <name>Token Challenge and Redemption Protocol</name>
      <t>This section describes the interactive protocol for the token challenge
and redemption flow between a Client and an Origin.</t>
      <t>Token redemption is performed using HTTP Authentication (<xref target="RFC7235" format="default"/>), with
the scheme "PrivateAccessToken". Origins challenge Clients to present a unique,
single-use token from a specific Issuer. Once a Client has received a token
from that Issuer, it presents the token to the Origin.</t>
      <t>Token redemption only requires Origins to verify token signatures computed
using the Blind Signature protocol from <xref target="BLINDSIG" format="default"/>. Origins are not required
to implement the complete Blind Signature protocol. (In contrast, token issuance
requires Clients and Issuers to implement the Blind Signature protocol, as
described in <xref target="issuance" format="default"/>.)</t>
      <section anchor="challenge" numbered="true" toc="default">
        <name>Token Challenge</name>
        <t>Origins send a token challenge to Clients in an "WWW-Authenticate" header with
the "PrivateAccessToken" scheme. This challenge includes a TokenChallenge message,
along with information about what keys to use when requesting a token from
the Issuer.</t>
        <t>The TokenChallenge message has the following structure:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
    uint8_t version;
    opaque origin_name<1..2^16-1>;
    opaque issuer_name<1..2^16-1>;
    opaque redemption_nonce[32];
} TokenChallenge;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>"version" is a 1-octet integer. This document defines version 1.</li>
          <li>"origin_name" is a string containing the name of the Origin (ORIGIN_NAME).</li>
          <li>"issuer_name" is a string containing the name of the Issuer (ISSUER_NAME).</li>
          <li>"redemption_nonce" is a fresh 32-byte nonce generated for each redemption request.</li>
        </ul>
        <t>When used in an authentication challenge, the "PrivateAccessToken" scheme uses the
following attributes:</t>
        <ul spacing="normal">
          <li>"challenge", which contains a base64url-encoded <xref target="RFC4648" format="default"/> TokenChallenge
value. This MUST be unique for every 401 HTTP response to prevent replay attacks.</li>
          <li>"token-key", which contains a base64url encoding of the SubjectPublicKeyInfo object
for use with the RSA Blind Signature protocol (ORIGIN_TOKEN_KEY).</li>
          <li>"issuer-key", which contains a base64url encoding of a <tt>KeyConfig</tt> as defined
in <xref target="OHTTP" format="default"/> to use when encrypting the ORIGIN_NAME in issuance requests
(ISSUER_KEY).</li>
          <li>"max-age", an optional attribute that consists of the number of seconds for which
the challenge will be accepted by the Origin.</li>
        </ul>
        <t>Origins MAY also include the standard "realm" attribute, if desired.</t>
        <t>As an example, the WWW-Authenticate header could look like this:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
WWW-Authenticate: PrivateAccessToken challenge=abc..., token-key=123...,
issuer-key=456...
]]></artwork>
        <t>Upon receipt of this challenge, a Client uses the message and keys in the Issuance protocol
(see <xref target="issuance" format="default"/>). If the TokenChallenge has a version field the Client
does not recognize or support, it MUST NOT parse or respond to the challenge.
This document defines version 1, which indicates use of private tokens based on
RSA Blind Signatures <xref target="BLINDSIG" format="default"/>, and determines the rest of the structure contents.</t>
        <t>Note that it is possible for the WWW-Authenticate header to include multiple
challenges, in order to allow the Client to fetch a batch of multiple tokens
for future use.</t>
        <t>For example, the WWW-Authenticate header could look like this:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
WWW-Authenticate: PrivateAccessToken challenge=abc..., token-key=123...,
issuer-key=456..., PrivateAccessToken challenge=def..., token-key=234...,
issuer-key=567...
]]></artwork>
      </section>
      <section anchor="redemption" numbered="true" toc="default">
        <name>Token Redemption</name>
        <t>The output of the issuance protocol is a token that corresponds to the Origin's challenge (see <xref target="challenge" format="default"/>).
A token is a structure that begins with a single byte that indicates a version, which
MUST match the version in the TokenChallenge structure.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
    uint8_t version;
    uint8_t token_key_id[32];
    uint8_t message[32];
    uint8_t signature[Nk];
} Token;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>"version" is a 1-octet integer. This document defines version 1.</li>
          <li>"token_key_id" is a collision-resistant hash that identifies the ORIGIN_TOKEN_KEY
used to produce the signature. This is generated as SHA256(public_key), where
public_key is a DER-encoded SubjectPublicKeyInfo object carrying the public key.</li>
          <li>"message" is a 32-octet message containing the hash of the original
TokenChallenge, SHA256(TokenChallenge). This message is signed by the signature,</li>
          <li>"signature" is a Nk-octet RSA Blind Signature that covers the message. For
version 1, Nk is indicated by size of the Token structure and may be 256, 384,
or 512. These correspond to RSA 2048, 3072, and 4096 bit keys. Clients implementing
version 1 MUST support signature sizes with Nk of 512 and 256.</li>
        </ul>
        <t>When used for client authorization, the "PrivateAccessToken" authentication
scheme defines one parameter, "token", which contains the base64url-encoded
Token struct. All unknown or unsupported parameters to "PrivateAccessToken"
authentication credentials MUST be ignored.</t>
        <t>Clients present this Token structure to Origins in a new HTTP request using
the Authorization header as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
Authorization: PrivateAccessToken token=abc...
]]></artwork>
        <t>Origins verify the token signature using the corresponding policy verification
key from the Issuer, and validate that the message matches the hash of a
TokenChallenge it previously issued and is still valid, SHA256(TokenChallenge),
and that the version of the Token matches the version in the TokenChallenge.
The TokenChallenge MAY be bound to a specific HTTP session with Client, but
Origins can also accept tokens for valid challenges in new sessions.</t>
        <t>If a Client's issuance request fails with a 401 error, as described in <xref target="request-two" format="default"/>,
the Client MUST react to the challenge as if it could not produce a valid Authorization
response.</t>
      </section>
    </section>
    <section anchor="issuance" numbered="true" toc="default">
      <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, Mediator, and Issuer,
with the following steps:</t>
      <ol spacing="normal" type="1"><li>The Client sends a token request to the Mediator, encrypted using an Issuer-specific key</li>
        <li>The Mediator validates the request and proxies the request to the Issuer</li>
        <li>The Issuer decrypts the request and sends a response back to the Mediator</li>
        <li>The Mediator verifies the response and proxies the response to the Client</li>
      </ol>
      <t>The Issuance protocol has a number of underlying cryptographic dependencies for
operation:</t>
      <ul spacing="normal">
        <li>
          <xref target="HPKE" format="default"/>, for encrypting information in transit between Client and Issuer across the Mediator.</li>
        <li>RSA Blind Signatures <xref target="BLINDSIG" format="default"/>, for issuing and constructing Tokens as described in <xref target="redemption" format="default"/>.</li>
        <li>Prime Order Groups (POGs), for computing stable mappings between (Client, Origin) pairs. This
document uses notation described in <xref section="2.1" sectionFormat="comma" target="VOPRF" format="default"/>, and, in particular,
the functions RandomScalar(), Generator(), SerializeScalar(), SerializeElement(), and HashToScalar().</li>
        <li>Non-Interactive proof-of-knowledge (POK), as described in <xref target="nizk-dl" format="default"/>, for verifying correctness of Client requests.</li>
      </ul>
      <t>Clients and Issuers are required to implement all of these dependencies, whereas Mediators are required
to implement POG and POK support.</t>
      <section anchor="state-requirements" numbered="true" toc="default">
        <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" numbered="true" toc="default">
          <name>Client State</name>
          <t>A Client is required to have the following information, derived from a given TokenChallenge:</t>
          <ul spacing="normal">
            <li>Origin name (ORIGIN_NAME), a URI referring to the Origin <xref target="RFC6454" format="default"/>. This is
the value of TokenChallenge.origin_name.</li>
            <li>Origin token public key (ORIGIN_TOKEN_KEY), a blind signature public key
corresponding to the Origin identified by TokenChallenge.origin_name.</li>
            <li>Issuer public key (ISSUER_KEY), a public key used to encrypt requests
corresponding to the Issuer identified by TokenChallenge.issuer_name.</li>
          </ul>
          <t>Clients maintain a stable CLIENT_ID that they use for all communication with
a specific Mediator. CLIENT_ID 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_ID, CLIENT_SECRET), they may generate a new tuple. The
mediator will enforce if a client is allowed to use this new CLIENT_ID. See <contact fullname="#mediator-state"/>
for details on this enforcement.</t>
          <t>Clients also need to be able to generate an ANON_ORIGIN_ID value that corresponds
to the ORIGIN_NAME, to send in requests to the Mediator.</t>
          <t>ANON_ORIGIN_ID MUST be a stable and unpredictable 32-byte value computed by the Client.
Clients MUST NOT change this value across token requests for the same ORIGIN_NAME. Doing
so will result in token issuance failure (specifically, when a Mediator rejects a request
upon detecting two ANON_ORIGIN_ID values that map to the same Origin).</t>
          <t>One possible mechanism for implementing this identifier is for the Client to store a mapping
between the ORIGIN_NAME and a randomly generated ANON_ORIGIN_ID for future requests. Alternatively,
the Client can compute a PRF keyed by a per-client secret (CLIENT_SECRET) over the ORIGIN_NAME,
e.g., ANON_ORIGIN_ID = HKDF(secret=CLIENT_SECRET, salt="", info=ORIGIN_NAME).</t>
        </section>
        <section anchor="mediator-state" numbered="true" toc="default">
          <name>Mediator State</name>
          <t>A Mediator is required to maintain state for every authenticated Client. The mechanism
of identifying a Client is specific to each Mediator, and is not defined in this document.
As examples, the Mediator could use device-specific certificates or account authentication
to identify a Client.</t>
          <t>Mediators must enforce that Clients don't change their CLIENT_ID frequently, to ensure Clients can't
regularily evade the per-client policy as seen by the issuer. Mediators MUST NOT allow Clients to
change their CLIENT_ID more than once within a policy window, or in the subsequent policy window
after a previous CLIENT_ID change. Alternative schemes where the mediator stores the encrypted
(CLIENT_ID, CLIENT_SECRET) tuple on behalf of the client are possble but not described here.</t>
          <t>Mediators are expected to know the ISSUER_POLICY_WINDOW for any ISSUER_NAME to which
they allow access. This information can be retrieved using the URIs defined in <xref target="setup" format="default"/>.</t>
          <t>For each Client-Issuer pair, a Mediator 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_ID, ANON_ORIGIN_ID, policy window), the Mediator maintains the
following state:</t>
          <ul spacing="normal">
            <li>A counter of successful tokens issued</li>
            <li>Whether or not a previous request was rejected by the Issuer</li>
            <li>The last received ANON_ISSUER_ORIGIN_ID value for this ANON_ORIGIN_ID, if any</li>
          </ul>
        </section>
        <section anchor="issuer-state" numbered="true" toc="default">
          <name>Issuer State</name>
          <t>Issuers maintain a stable ORIGIN_SECRET that they use in calculating values returned
to the Mediator 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.</t>
          <t>Issuers are expected to have the private key that corresponds to ISSUER_KEY,
which allows them to decrypt the ORIGIN_NAME values in requests.</t>
          <t>Issuers also need to know the set of valid ORIGIN_TOKEN_KEY public keys and corresponding
private key, for each ORIGIN_NAME that is served by the Issuer. Origins SHOULD update
their view of the ORIGIN_TOKEN_KEY regularly to ensure that Client requests do not fail
after ORIGIN_TOKEN_KEY rotation.</t>
        </section>
      </section>
      <section anchor="issuance-http-headers" numbered="true" toc="default">
        <name>Issuance HTTP Headers</name>
        <t>The Issuance protocol defines four new HTTP headers that are used in requests
and responses between Clients, Mediators, and Issuers (see <xref target="iana-headers" format="default"/>).</t>
        <t>The "Sec-Token-Origin" is an Item Structured Header <xref target="RFC8941" format="default"/>. Its
value MUST be a Byte Sequence. This header is sent both on Client-to-Mediator
requests (<xref target="request-one" format="default"/>) and on Issuer-to-Mediator responses (<xref target="response-one" format="default"/>).
Its ABNF is:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
    Sec-Token-Origin = sf-binary
]]></artwork>
        <t>The "Sec-Token-Client" is an Item Structured Header <xref target="RFC8941" format="default"/>. Its
value MUST be a Byte Sequence. This header is sent on Client-to-Mediator
requests (<xref target="request-one" format="default"/>), and contains the bytes of CLIENT_KEY.
Its ABNF is:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
    Sec-Token-Client = sf-binary
]]></artwork>
        <t>The "Sec-Token-Nonce" is an Item Structured Header <xref target="RFC8941" format="default"/>. Its
value MUST be a Byte Sequence. This header is sent on Client-to-Mediator
requests (<xref target="request-one" format="default"/>), and contains a per-request nonce value.
Its ABNF is:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
    Sec-Token-Nonce = sf-binary
]]></artwork>
        <t>The "Sec-Token-Count" is an Item Structured Header <xref target="RFC8941" format="default"/>. Its
value MUST be an Integer. This header is sent on Mediator-to-Issuer
requests (<xref target="request-one" format="default"/>), and contains the number of times a
Client has previously received a token for an Origin. Its ABNF is:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
    Sec-Token-Count = sf-integer
]]></artwork>
      </section>
      <section anchor="request-one" numbered="true" toc="default">
        <name>Client-to-Mediator Request</name>
        <t>The Client and Mediator MUST use a secure and Mediator-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" format="default"/> for additional about this channel.</t>
        <t>Issuance begins by Clients hashing the TokenChallenge to produce a token input
as message = SHA256(challenge), and then blinding message as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
blinded_req, blind_inv = rsabssa_blind(ORIGIN_TOKEN_KEY, message)
]]></artwork>
        <t>The Client MUST use a randomized variant of RSABSSA in producing this signature with
a salt length of at least 32 bytes.</t>
        <t>The Client uses CLIENT_SECRET to generate proof of its request.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
blind = RandomScalar()
blind_key = blind * CLIENT_SECRET
blind_generator = blind * Generator()
key_proof = SchnorrProof(CLIENT_SECRET, blind_key, blind_generator)
]]></artwork>
        <t>The Client then transforms this proof into "mapping_nonce", "mapping_key", "mapping_generator",
and "mapping_proof".</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
mapping_nonce = SerializeScalar(blind)
mapping_key = SerializeElement(blind_key)
mapping_generator = SerializeElement(blind_generator)
mapping_proof = SerializeProof(key_proof)
]]></artwork>
        <t>The Client then constructs a Private Access Token request using mapping_key,
mapping_generator, mapping_proof, blinded_req, and origin information.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
   uint8_t version;
   uint8_t mapping_generator[Ne];
   uint8_t mapping_key[Ne];
   uint8_t mapping_proof[Np];
   uint8_t token_key_id;
   uint8_t blinded_req[Nk];
   uint8_t name_key_id[32];
   uint8_t encrypted_origin_name<1..2^16-1>;
} AccessTokenRequest;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>"version" is a 1-octet integer, which matches the version in the TokenChallenge.
This document defines version 1.</li>
          <li>"mapping_generator", "mapping_key", and "mapping_proof" are computed as described above.</li>
          <li>"token_key_id" is the least significant byte of the ORIGIN_TOKEN_KEY key ID, which is
generated as SHA256(public_key), where public_key is a DER-encoded SubjectPublicKeyInfo
object carrying ORIGIN_TOKEN_KEY.</li>
          <li>"blinded_req" is the Nk-octet request defined above.</li>
          <li>"name_key_id" is a collision-resistant hash that identifies the ISSUER_KEY public
key, generated as SHA256(KeyConfig).</li>
          <li>"encrypted_origin_name" is an encrypted structure that contains ORIGIN_NAME,
calculated as described in <xref target="encrypt-origin" format="default"/>.</li>
        </ul>
        <t>The Client then generates an HTTP POST request to send through the Mediator to
the Issuer, with the AccessTokenRequest as the body. The media type for this request
is "message/access-token-request". The Client includes the "Sec-Token-Origin" header,
whose value is ANON_ORIGIN_ID; the "Sec-Token-Client" header, whose value is CLIENT_KEY; and
the "Sec-Token-Nonce" header, whose value is mapping_nonce. The Client sends this request
to the Mediator's proxy URI. An example request is shown below, where Nk = 512.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
:method = POST
:scheme = https
:authority = issuer.net
:path = /access-token-request
accept = message/access-token-response
cache-control = no-cache, no-store
content-type = message/access-token-request
content-length = 512
sec-token-origin = ANON_ORIGIN_ID
sec-token-client = CLIENT_KEY
sec-token-nonce = mapping_nonce

<Bytes containing the AccessTokenRequest>
]]></artwork>
        <t>If the Mediator detects a version in the AccessTokenRequest that it does not recognize
or support, it MUST reject the request with an HTTP 400 error.</t>
        <t>The Mediator also checks to validate that the name_key_id in the client's AccessTokenRequest
matches a known ISSUER_KEY public key for the Issuer. For example, the Mediator can
fetch this key using the API defined in <xref target="setup" format="default"/>. 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 Mediator rejects the request with an HTTP
400 error. Note that Mediators need to be careful in cases of key rotation; see
<xref target="privacy-considerations" format="default"/>.</t>
        <t>The Mediator finally checks to ensure that the AccessTokenRequest.mapping_proof is valid
for the given CLIENT_KEY; see <xref target="nizk-dl" format="default"/> for verification details. If the index is invalid,
the Mediator rejects the request with an HTTP 400 error.</t>
        <t>If the Mediator 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
ANON_ORIGIN_ID. See <xref target="mediator-state" format="default"/> for more details.</t>
        <t>If the Mediator has stored state that a previous request for this ANON_ORIGIN_ID was
rejected by the Issuer in the current policy window, it SHOULD reject the request without
forwarding it to the Issuer.</t>
        <t>If the Mediator detects this Client has changed their CLIENT_ID more frequently than allowed
as described in <contact fullname="#mediator-state"/>, it SHOULD reject the request without forwarding it to
the Issuer.</t>
      </section>
      <section anchor="request-two" numbered="true" toc="default">
        <name>Mediator-to-Issuer Request</name>
        <t>The Mediator and the Issuer MUST use a secure and Issuer-authenticated HTTPS
connection. Also, Issuers MUST authenticate Mediators, 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" format="default"/> for additional about this channel.</t>
        <t>Before copying and forwarding the Client's AccessTokenRequest request to the Issuer,
the Mediator adds a header that includes the count of previous tokens as "Sec-Token-Count".
The Mediator MAY also add additional context information, but MUST NOT add information
that will uniquely identify a Client.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
:method = POST
:scheme = https
:authority = issuer.net
:path = /access-token-request
accept = message/access-token-response
cache-control = no-cache, no-store
content-type = message/access-token-request
content-length = 512
sec-token-count = 3

<Bytes containing the AccessTokenRequest>
]]></artwork>
        <t>Upon receipt of the forwarded request, the Issuer validates the following conditions:</t>
        <ul spacing="normal">
          <li>The "Sec-Token-Count" header is present</li>
          <li>The AccessTokenRequest contains a supported version</li>
          <li>For version 1, the AccessTokenRequest.name_key_id corresponds to the ID of the ISSUER_KEY held by the Issuer</li>
          <li>For version 1, the AccessTokenRequest.encrypted_origin_name can be decrypted using the
Issuer's private key (the private key associated with ISSUER_KEY), and matches
an ORIGIN_NAME that is served by the Issuer</li>
          <li>For version 1, the AccessTokenRequest.blinded_req is of the correct size</li>
          <li>For version 1, the AccessTokenRequest.token_key_id corresponds to an ID of an ORIGIN_TOKEN_KEY
for the corresponding ORIGIN_NAME</li>
        </ul>
        <t>If any of these conditions is not met, the Issuer MUST return an HTTP 400 error to the Mediator,
which will forward the error to the client.</t>
        <t>If the request is valid, the Issuer then can use the value from "Sec-Token-Count" to determine if
the Client is allowed to receive a token for this Origin during the current policy window. If the
Issuer refuses to issue more tokens, it responds with an HTTP 429 (Too Many Requests) error to the
Mediator, which will forward the error to the client.</t>
        <t>The Issuer determines the correct ORIGIN_TOKEN_KEY by using the decrypted ORIGIN_NAME value and
AccessTokenRequest.token_key_id. If there is no ORIGIN_TOKEN_KEY whose truncated key ID matches
AccessTokenRequest.token_key_id, the Issuer MUST return an HTTP 401 error to Mediator, which will
forward the error to the client. The Mediator learns that the client's view of the Origin key
was invalid in the process.</t>
      </section>
      <section anchor="response-one" numbered="true" toc="default">
        <name>Issuer-to-Mediator Response</name>
        <t>If the Issuer is willing to give a token to the Client, the Issuer verifies the token request
using "mapping_generator", "mapping_key", and "mapping_proof":</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
valid = SchnorrVerify(mapping_generator, mapping_key, mapping_proof)
]]></artwork>
        <t>If this fails, the Issuer rejects the request with a 400 error. Otherwise, the Issuer decrypts
AccessTokenRequest.encrypted_origin_name to discover "origin". If this fails, the Issuer
rejects the request with a 400 error. The Issuer then evaluates the mapping over the ORIGIN_SECRET
pertaining to the origin for this issuer:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
mapping_input = DeserializeElement(AccessTokenRequest.mapping_key)
index = ORIGIN_SECRET * mapping_input
mapping_index = SerializeElement(index)
]]></artwork>
        <t>If DeserializeElement fails, or if AccessTokenRequest.mapping_key is the identity element, the Issuer
rejects the request with a 400 error.</t>
        <t>The Issuer completes the issuance flow by computing a blinded response as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
blind_sig = rsabssa_blind_sign(skP, AccessTokenRequest.blinded_req)
]]></artwork>
        <t><tt>skP</tt> is the private key corresponding to ORIGIN_TOKEN_KEY, known only to the Issuer.</t>
        <t>The Issuer generates an HTTP response with status code 200 whose body consists of
blind_sig, with the content type set as "message/access-token-response" and the
mapping_tag set in the "Sec-Token-Origin" header.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
:status = 200
content-type = message/access-token-response
content-length = 512
sec-token-origin = mapping_index

<Bytes containing the blind_sig>
]]></artwork>
      </section>
      <section anchor="response-two" numbered="true" toc="default">
        <name>Mediator-to-Client Response</name>
        <t>Upon receipt of a successful response from the Issuer, the Mediator extracts the
"Sec-Token-Origin" header, and uses the value to determine ANON_ISSUER_ORIGIN_ID.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
index = DeserializeElement(mapping_index)
nonce = DeserializeScalar(mapping_nonce)
ANON_ISSUER_ORIGIN_ID = (nonce^(-1)) * index
]]></artwork>
        <t>If the "Sec-Token-Origin" is missing, or if the same ANON_ISSUER_ORIGIN_ID was previously
received in a response for a different ANON_ORIGIN_ID within the same policy window,
the Mediator MUST drop the token and respond to the client with an HTTP 400 status.
If there is not an error, the ANON_ISSUER_ORIGIN_ID is stored alongside the state
for the ANON_ORIGIN_ID.</t>
        <t>For all other cases, the Mediator forwards all HTTP responses unmodified to the Client
as the response to the original request for this issuance.</t>
        <t>When the Mediator detects successful token issuance, it MUST increment the counter
in its state for the number of tokens issued to the Client for the ANON_ORIGIN_ID.</t>
        <t>Upon receipt, the Client handles the response and, if successful, processes the
body as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
sig = rsabssa_finalize(ORIGIN_TOKEN_KEY, nonce, blind_sig, blind_inv)
]]></artwork>
        <t>If this succeeds, the Client then constructs a Private Access Token as described in
<xref target="challenge" format="default"/> using the token input message and output sig.</t>
      </section>
      <section anchor="encrypt-origin" numbered="true" toc="default">
        <name>Encrypting Origin Names</name>
        <t>Given a <tt>KeyConfig</tt> (ISSUER_KEY), Clients produce encrypted_origin_name and authenticate
all other contents of the AccessTokenRequest using the following values:</t>
        <ul spacing="normal">
          <li>the key identifier from the configuration, keyID, with the corresponding KEM identified by kemID,
the public key from the configuration, pkI, and;</li>
          <li>a selected combination of KDF, identified by kdfID, and AEAD, identified by aeadID.</li>
        </ul>
        <t>Beyond the key configuration inputs, Clients also require the AccessTokenRequest inputs.
Together, these are used to encapsulate ORIGIN_NAME (<tt>origin_name</tt>) and produce
ENCRYPTED_ORIGIN_NAME (<tt>encrypted_origin</tt>) as follows:</t>
        <ol spacing="normal" type="1"><li>Compute an <xref target="HPKE" format="default"/> context using pkI, yielding context and encapsulation key enc.</li>
          <li>Construct associated data, aad, by concatenating the values of keyID, kemID, kdfID,
aeadID, and all other values of the AccessTokenRequest structure.</li>
          <li>Encrypt (seal) request with aad as associated data using context, yielding ciphertext ct.</li>
          <li>Concatenate the values of aad, enc, and ct, yielding an Encapsulated Request enc_request.</li>
        </ol>
        <t>Note that enc is of fixed-length, so there is no ambiguity in parsing this structure.</t>
        <t>In pseudocode, this procedure is as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
enc, context = SetupBaseS(pkI, "AccessTokenRequest")
aad = concat(encode(1, keyID),
             encode(2, kemID),
             encode(2, kdfID),
             encode(2, aeadID),
             encode(1, version),
             encode(Ne, mapping_generator),
             encode(Ne, mapping_key),
             encode(Np, mapping_proof),
             encode(1, token_key_id),
             encode(Nk, blinded_req),
             encode(32, name_key_id))
ct = context.Seal(aad, origin_name)
encrypted_origin_name = concat(enc, ct)
]]></artwork>
        <t>Issuers reverse this procedure to recover ORIGIN_NAME by computing the AAD as described
above and decrypting encrypted_origin_name with their private key skI, the private key
corresponding to pkI. In pseudocode, this procedure is as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
enc, ct = parse(encrypted_origin_name)
aad = concat(encode(1, keyID),
             encode(2, kemID),
             encode(2, kdfID),
             encode(2, aeadID),
             encode(1, version),
             encode(Ne, mapping_generator),
             encode(Ne, mapping_key),
             encode(Np, mapping_proof),
             encode(1, token_key_id),
             encode(Nk, blinded_req),
             encode(32, name_key_id))
enc, context = SetupBaseR(enc, skI, "AccessTokenRequest")
origin_name, error = context.Open(aad, ct)
]]></artwork>
      </section>
      <section anchor="nizk-dl" numbered="true" toc="default">
        <name>Non-Interactive Schnorr Proof of Knowledge</name>
        <t>Each Issuance request requires evaluation and verification of a Schnorr proof-of-knowledge.
Given input secret "secret" and two elements, "base" and "target", generation of this
proof (u, c, z), denoted SchnorrProof(secret, base, target), works as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
r = RandomScalar()
u = r * base
c = HashToScalar(SerializeElement(base) ||
                 SerializeElement(target) ||
                 SerializeElement(mask),
                 dst = "PrivateAccessTokensProof")
z = r + (c * secret)
]]></artwork>
        <t>The proof is encoded by serializing (u, c, z) as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
   uint8_t u[Ne];
   uint8_t c[Ns];
   uint8_t z[Ns];
} Proof;
]]></artwork>
        <t>The size of this structure is Np = Ne + 2*Ns bytes.</t>
        <t>Verification of a proof (u, c, z), denoted SchnorrVerify(base, target, proof),
works as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
c = HashToScalar(SerializeElement(base) ||
                 SerializeElement(target) ||
                 SerializeElement(mask),
                 dst = "PrivateAccessTokensProof")
expected_left = base * z
expected_right = u + (target * c)
]]></artwork>
        <t>The proof is considered valid if expected_left is the same as expected_right.</t>
      </section>
    </section>
    <section anchor="examples" numbered="true" toc="default">
      <name>Instantiating Uses Cases</name>
      <t>This section describes various instantiations of this protocol to address use cases
described in <xref target="motivation" format="default"/>.</t>
      <section anchor="implement-rate-limit" numbered="true" toc="default">
        <name>Rate-limited Access</name>
        <t>To instantiate this case, the site acts as an Origin and registers a "bounded token" policy
with the Issuer. In this policy, the Issuer enforces a fixed number of tokens that it will
allow a Client to request for a single ORIGIN_NAME.</t>
        <t>Origins request tokens from Clients and, upon successful redemption, the Origin knows
the Client was able to request a token for the given ORIGIN_NAME within its budget.
Failure to present a token can be interpreted as a signal that the client's token
budget was exceeded.</t>
        <t>Clients can redeem a token from a specific challenge up to the <tt>max-age</tt> in the challenge.
Servers can choose to issue many challenges in a single HTTP 401 response, providing the
client with many challenge nonces which can be used to redeem tokens over a longer period
of time.</t>
      </section>
      <section anchor="implement-geolocation" numbered="true" toc="default">
        <name>Client Geo-Location</name>
        <t>To instantiate this use case, the Issuer has an issuing key pair per geographic region, i.e.,
each region has a unique policy key. When verifying the key for the Client request, the Mediator
obtains the per-region key from the Issuer based on the Client's perceived location. During
issuance, the Mediator checks that this key matches that of the Client's request. If it matches,
the Mediator forwards the request to complete issuance. The number of key pairs is then the cross
product of the number of Origins that require per-region keys and the number of regions.</t>
        <t>During redemption, Clients present their geographic location to Origins in a "Sec-CH-Geohash"
header. Origins use this to obtain the appropriate policy verification key. Origins request
tokens from Clients and, upon successful redemption, the Origin knows the Client obtained a
token for the given ORIGIN_NAME in the specified region.</t>
      </section>
      <section anchor="implement-authentication" numbered="true" toc="default">
        <name>Private Client Authentication</name>
        <t>To instantiate this case, the site acts as an Origin and registers an "unlimited token"
policy with the Issuer. In this policy, the Issuer does not enforce any limit on the number
of tokens a given user will obtain.</t>
        <t>Origins request tokens from Clients and, upon successful redemption, the Origin knows
the Client was able to request a token for the given ORIGIN_NAME tuple. As a
result, the Origin knows this is an authentic client.</t>
      </section>
    </section>
    <section anchor="sec-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>This section discusses security considerations for the protocol.</t>
      <t>[OPEN ISSUE: discuss trust model]</t>
      <section anchor="client-identity-1" numbered="true" toc="default">
        <name>Client Identity</name>
        <t>The HTTPS connection between Client and Mediator is minimally Mediator-authenticated. Mediators
can also require Client authentication if they wish to restrict Private Access Token proxying
to trusted or otherwise authenticated Clients. Absent some form of Client authentication, Mediators
can use other per-Client information for the client identifier mapping, such as IP addresses.</t>
      </section>
      <section anchor="denial-of-service" numbered="true" toc="default">
        <name>Denial of Service</name>
        <t>Requesting and verifying a Private Access Token is more expensive than checking an implicit
signal, such as an IP address, especially since malicious clients can generate garbage
Private Access Tokens and for Origins to work. However, similar DoS vectors already exist
for Origins, e.g., at the underlying TLS layer.</t>
      </section>
      <section anchor="channel-security" numbered="true" toc="default">
        <name>Channel Security</name>
        <t>An attacker that can act as an intermediate between Mediator 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 a Mediator 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>
        <t>An attacker that can intermediate the channel between Client and Origin can
observe a TokenChallenge, and can view a Token being presented for authentication
to an Origin. Scoping the TokenChallenge nonce to the Client HTTP session prevents
Tokens being collected in one session and then presented to the Origin in another.
Note that an Origin cannot distinguish between a connection to a single Client and
a connection to an attacker intermediating multiple Clients. Thus, it is possible for
an attacker to collect and later present Tokens from multiple clients over the same
Origin session.</t>
      </section>
    </section>
    <section anchor="privacy-considerations" numbered="true" toc="default">
      <name>Privacy Considerations</name>
      <section anchor="client-token-state-and-origin-tracking" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <name>Origin Verification</name>
        <t>Private Access Tokens are defined in terms of a Client authenticating to an Origin, where
the "origin" is used as defined in <xref target="RFC6454" format="default"/>. In order to limit cross-origin correlation,
Clients MUST verify that the origin_name presented in the TokenChallenge structure (<xref target="challenge" format="default"/>)
matches the origin that is providing the HTTP authentication challenge, where the matching logic
is defined for same-origin policies in <xref target="RFC6454" format="default"/>. 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-keys" numbered="true" toc="default">
        <name>Client Identification with Unique 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>To mitigate the risk of a targeted ISSUER_KEY, the Mediator can observe and validate
the name_key_id presented by the Client to the Issuer. As described in <xref target="issuance" format="default"/>, Mediators
MUST validate that the name_key_id in the Client's AccessTokenRequest matches a known public key
for the Issuer. The Mediator 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>
        <t>To mitigate the risk of a targeted ORIGIN_TOKEN_KEY, the protocol expects that an Issuer has only
a single valid public key for signing tokens at a time. The Client does not present the name_key_id
of the token public key to the Issuer, but instead expects the Issuer to infer the correct key based
on the information the Issuer knows, specifically the origin_name itself.</t>
      </section>
      <section anchor="collusion" numbered="true" toc="default">
        <name>Collusion Among Different Entities</name>
        <t>Collusion among the different entities in the PAT architecture can result in
violation of the Client's privacy.</t>
        <t>Issuers and Mediators should be run by mutually distinct organizations to limit
information sharing. A single entity running an issuer and mediator for a single redemption
can view the origins being accessed by a given client. Running the issuer and mediator in
this 'single issuer/mediator' fashion reduces the privacy promises to those of the
<xref target="I-D.ietf-privacypass-protocol" format="default"/>; see <xref target="privacy-pass" format="default"/> for more discussion. This may be
desirable for a redemption flow that is limited to specific issuers and mediators,
but should be avoided where hiding origins from the mediator is desirable.</t>
        <t>If a Mediator 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 Mediator can reveal the Client
identity (as known to the Mediator) to the Origin, especially if repeated over multiple accesses.</t>
      </section>
    </section>
    <section anchor="deploy" numbered="true" toc="default">
      <name>Deployment Considerations</name>
      <section anchor="origin-key-rollout" numbered="true" toc="default">
        <name>Origin Key Rollout</name>
        <t>Issuers SHOULD generate a new (ORIGIN_TOKEN_KEY, ORIGIN_SECRET) 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(ORIGIN_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" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <section anchor="authentication-scheme" numbered="true" toc="default">
        <name>Authentication Scheme</name>
        <t>This document registers the "PrivateAccessToken" authentication scheme in the "Hypertext
Transfer Protocol (HTTP) Authentication Scheme Registry" established by <xref target="RFC7235" format="default"/>.</t>
        <t>Authentication Scheme Name: PrivateAccessToken</t>
        <t>Pointer to specification text: <xref target="challenge" format="default"/> of this document</t>
      </section>
      <section anchor="iana-headers" numbered="true" toc="default">
        <name>HTTP Headers</name>
        <t>This document registers four new headers for use on the token issuance path
in the "Permanent Message Header Field Names" &lt;<eref target="https://www.iana.org/assignments/message-headers"/>&gt;.</t>
        <figure anchor="iana-header-type-table">
          <name>Registered HTTP Header</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
    +-------------------+----------+--------+---------------+
    | Header Field Name | Protocol | Status |   Reference   |
    +-------------------+----------+--------+---------------+
    | Sec-Token-Origin  |   http   |  std   | This document |
    +-------------------+----------+--------+---------------+
    | Sec-Token-Client  |   http   |  std   | This document |
    +-------------------+----------+--------+---------------+
    | Sec-Token-Nonce   |   http   |  std   | This document |
    +-------------------+----------+--------+---------------+
    | Sec-Token-Count   |   http   |  std   | This document |
    +-------------------+----------+--------+---------------+
]]></artwork>
        </figure>
      </section>
      <section anchor="media-types" numbered="true" toc="default">
        <name>Media Types</name>
        <t>This specification defines the following protocol messages, along with their
corresponding media types:</t>
        <ul spacing="normal">
          <li>AccessTokenRequest <xref target="issuance" format="default"/>: "message/access-token-request"</li>
          <li>AccessTokenResponse <xref target="issuance" format="default"/>: "message/access-token-response"</li>
        </ul>
        <t>The definition for each media type is in the following subsections.</t>
        <section anchor="messageaccess-token-request-media-type" numbered="true" toc="default">
          <name>"message/access-token-request" media type</name>
          <dl>
            <dt>
Type name:  </dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>
Subtype name:  </dt>
            <dd>
              <t>access-token-request</t>
            </dd>
            <dt>
Required parameters:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Optional parameters:  </dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>
Encoding considerations:  </dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>
Security considerations:  </dt>
            <dd>
              <t>see <xref target="issuance" format="default"/></t>
            </dd>
            <dt>
Interoperability considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Published specification:  </dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>
Applications that use this media type:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Fragment identifier considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Additional information:  </dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>
Person and email address to contact for further information:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Intended usage:  </dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>
Restrictions on usage:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Author:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Change controller:  </dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="messageaccess-token-response-media-type" numbered="true" toc="default">
          <name>"message/access-token-response" media type</name>
          <dl>
            <dt>
Type name:  </dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>
Subtype name:  </dt>
            <dd>
              <t>access-token-response</t>
            </dd>
            <dt>
Required parameters:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Optional parameters:  </dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>
Encoding considerations:  </dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>
Security considerations:  </dt>
            <dd>
              <t>see <xref target="issuance" format="default"/></t>
            </dd>
            <dt>
Interoperability considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Published specification:  </dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>
Applications that use this media type:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Fragment identifier considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Additional information:  </dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>
Person and email address to contact for further information:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Intended usage:  </dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>
Restrictions on usage:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Author:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Change controller:  </dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="BLINDSIG">
          <front>
            <title>RSA Blind Signatures</title>
            <author fullname="Frank Denis" initials="F." surname="Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <author fullname="Frederic Jacobs" initials="F." surname="Jacobs">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="2" month="August" year="2021"/>
            <abstract>
              <t>   This document specifies the RSA-based blind signature scheme with
   appendix (RSA-BSSA).  RSA blind signatures were first introduced by
   Chaum for untraceable payments [Chaum83].  It extends RSA-PSS
   encoding specified in [RFC8017] to enable blind signature support.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/chris-wood/draft-wood-cfrg-blind-signatures.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-rsa-blind-signatures-02"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="TLS13">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="HPKE">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="Richard L. Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Karthik Bhargavan">
              <organization>Inria</organization>
            </author>
            <author fullname="Benjamin Lipp">
              <organization>Inria</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="2" month="September" year="2021"/>
            <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 which
   authenticates possession of a pre-shared key, and two optional ones
   which authenticate possession of a KEM private key.  HPKE works for
   any combination of an asymmetric key encapsulation mechanism (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 key agreement, HKDF, and SHA2.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-hpke-12"/>
        </reference>
        <reference anchor="OHTTP">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="24" month="August" year="2021"/>
            <abstract>
              <t>   This document describes a system for the forwarding of encrypted HTTP
   messages.  This allows a client to make multiple requests of a server
   without the server being able to link those requests to the client or
   to identify the requests as having come from the same client.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-thomson-http-oblivious-02"/>
        </reference>
        <reference anchor="RFC7235">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Authentication</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypermedia information systems.  This document defines the HTTP Authentication framework.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7235"/>
          <seriesInfo name="DOI" value="10.17487/RFC7235"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes.  It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="VOPRF">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) using Prime-Order Groups</title>
            <author fullname="Alex Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Nick Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="25" month="October" year="2021"/>
            <abstract>
              <t>   An Oblivious Pseudorandom Function (OPRF) is a two-party protocol
   between client and server for computing the output of a Pseudorandom
   Function (PRF).  The server provides the PRF secret key, and the
   client provides the PRF input.  At the end of the protocol, the
   client learns the PRF output without learning anything about the PRF
   secret key, and the server learns neither the PRF input nor output.
   A Partially-Oblivious PRF (POPRF) is an OPRF that allows client and
   server to provide public input to the PRF.  OPRFs and POPRFs can also
   satisfy a notion of 'verifiability'.  In this setting, clients can
   verify that the server used a specific private key during the
   execution of the protocol.  This document specifies a POPRF protocol
   with optional verifiability instantiated within standard prime-order
   groups, including elliptic curves.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-08"/>
        </reference>
        <reference anchor="RFC6454">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth">
              <organization/>
            </author>
            <date month="December" year="2011"/>
            <abstract>
              <t>This document defines the concept of an "origin", which is often used as the scope of authority or privilege by user agents.  Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites.  In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string.  It also defines an HTTP header field, named "Origin", that indicates which origins are associated with an HTTP request.   [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </reference>
        <reference anchor="RFC8941">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="P-H. Kamp" initials="P-H." surname="Kamp">
              <organization/>
            </author>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8941"/>
          <seriesInfo name="DOI" value="10.17487/RFC8941"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.ietf-privacypass-protocol">
          <front>
            <title>Privacy Pass Protocol Specification</title>
            <author fullname="Sofía Celi">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Alex Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Armando Faz-Hernandez">
              <organization>Cloudflare</organization>
            </author>
            <date day="22" month="February" year="2021"/>
            <abstract>
              <t>   This document specifies the Privacy Pass protocol.  This protocol
   provides anonymity-preserving authorization of clients to servers.
   In particular, client re-authorization events cannot be linked to any
   previous initial authorization.  Privacy Pass is intended to be used
   as a performant protocol in the application-layer.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-01"/>
        </reference>
      </references>
    </references>
    <section anchor="privacy-pass" numbered="true" toc="default">
      <name>Related Work: Privacy Pass</name>
      <t>Private Access Tokens has many similarities to the existing Privacy Pass protocol
(<xref target="I-D.ietf-privacypass-protocol" format="default"/>). Both protocols allow clients to redeem signed
tokens while not allowing linking between token issuance and token redemption.</t>
      <t>There are several important differences between the protocols, however:</t>
      <ul spacing="normal">
        <li>Private Access Tokens uses per-origin tokens that support rate-limiting policies. Each
token can only be used with a specific origin in accordance with a policy defined for that
origin. This allows origins to implement metered paywalls or mechanisms that that limit the
actions a single client can perform. Per-origin tokens also ensure that one origin cannot
consume all of a client's tokens, so there is less need for clients to manage when they are
willing to present tokens to origins.</li>
        <li>Private Access Tokens employ an online challenge (<xref target="challenge" format="default"/>) during token redemption.
This ensures that tokens cannot be harvested and stored for use later. This also removes
the need for preventing double spending or employing token expiry techniques, such as
frequent signer rotation or expiry-encoded public metadata.</li>
        <li>Private Access Tokens use a publically verifiable signature
<xref target="BLINDSIG" format="default"/> to optimize token
verification at the origin by avoiding a round trip to the issuer/mediator.</li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIACU3d2EAA+1963rcxpXg/3oKhPphctLdsmTZcWjLG5qiLI4lSkvS8ZfP
k5HBbjQbIRroAdCk2rTmWfZZ9sn2XKtOAWiKSrIz2W/DL5HJbqAup879VuPx
2LV5W2T7yZs6v07bLDmYTrOmSc6rq6xsXHpxUWfX276dVdMyXcLLszqdt+MV
PzRO6aFxSw+NP33kpvDpZVVv9pOmnTmXr+r9pK3XTfv4009//+ljd5Vtbqp6
tp8cl21Wl1k7foYDOte0aTl7mxZVCZNsssat8v3kp7aajpKmqts6mzfw22aJ
v/zZuXTdLqp63yVjl8BPXjb7ydkkeZGVszqfXjVVSZ/zms+mVdv2vqvqy/3k
u6q6LLLk5ctD+ixbpnkBa8cX/tAswhuTabWMJvvXSXK8ycrLtDYT/WtaptHH
NMfztGmLjR3/L3X+hzl92hv3fJK8SdfyOI96Xi2XG/MpDXqwWsG6j8vphD5r
AEJZu5+8LjP56k1aXyU/pvzKNG/hSA7Xq6xu87IaJYdpkc+ruszT5Peff/ro
CT9VrcsWz+6HMm+zWXLWwmk2STVPDpYZACK1e2hXuKA/pDhZbxdwFH9Mi1n2
iz2FNrvOSvv5XSdwTY/9Ybqoq2W+Xk7g2WiGw0lyMEl+rKqZmeJwUedNW60W
WR19SxMdFtV6Ni/SOrMTTdObPyyydJWXlxd520wAJZ0bj8dJegEwTafw1/ki
bxIggPUyK9tkls3zEqCSJqu6AvysigQAmeRNs4YxEsDipM5mWbbEv4hOphug
l6zJ6mv4yDHJJEwyk+R8Ad/IX7CYMklnsHr8BIaiUdNymiWrqsinm1GSFkV1
Q/M4GnBKTxb5Mm8TGRn+AxSGz8A37ULfTW5yIJl1m+CurvDraZHjhvIZ/Av4
MeF9L/PZrMice4AkWlez9bTNqzK5fZCbP987dwbTZzWsGbCzKotNsoZ9rNKm
ya8zggLgWgOnEaaY5/g8PFFN8xTxC1ckq2hGrllPF/BtcvwGYDADgDWIezUA
nLZpxhgRxLMS/p0SLGTjMOm6SS8zRzvOMwDvc3zwXboEJAXgJQ0tGvZ4uWgF
agihdImYj4g+rUpaMcA+rMPRufAkFb6fJpc54nKbLzPcZ17Nkl3gTFkNR09H
h/ixs8yAx8EHq3RzAwe3szeC/bjOKmrko9EBzgHl4wXgkIBC17iyeZ2uZ7hX
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
CVqdHWvEedtZunCWpstwCNeYTAGQodRml5ziDXt9cH71T6r1KZfq9CzQLrLM
+UJmgy/WUTqMyZNYsdY7G52igFy+aDgr+yR9flhID1Nr3N9pJCBFTeAdFwdw
IrP7KIBGxNGlWWZv0cshGkClVOsVO71bvrAVk9j7t70fD7zBIVcqbfOOFm9S
mqiBGcjgPmYTdNIyNN+km20SrgNVyPX3iegvizc9HQeCRFsiOxg8csPBI882
1nXdC5ISMMVZv4WJVetWO2lSTlon+XZgM8poLeRwgxzOmQ2HfENQmqO/kt7j
+grWQD7P/baRdLcRdwEwCQrBoTfgDcP08i4blwuA5J1hj5i4xz/kDzsAkTDy
IQIaKmo4bmIJWU4hRWy4xY4zhw16aT3czxqtU/KvhOYs4yLdZHW32XfwwgWP
V0EhPTfseUv+Gs+b63jekr/B8/at3BFYrTaadmyON3D+QTk5nEfeYVywAhSk
WljKBYNG7e0xEN/4ven7oicxwvjqamzgbrYqdzrEmZ+YJBDyKGazqF0vrYuY
G0tLLDEZSBr5/0sBnYrD+7OPVhr7JeGZ4lU2CyLIEHtcuBD1reJjbfwtz/0I
RYgpSLmVPDmAsiZ6Eoq/RJOFt56zmNZyvS3agFUnB2pugRlrC42gOPab3d57
ukGjW1NMJORtU0yc7xhnA+q73Qh7t5lwnNBLlYekBrvQefODset778m4PnAs
ze3htHmqNrz3UNYx1D0ODD/RaYQ9hOJYf0t2lMZrtirXFWxC7n1AR81pA24w
6kktTtXo62a9Qh9JYyDOo4228YHo6W6msLGXpebNqvHkyJXrMcmvx7ksmPTT
p5zo9im5qsNcKBiSgyV4FsXOSJboPbnSLXabiqR6rrZHQ50+upWWM9aI9ZMe
4k8x1nIf/z7ZPa+q5BUei2BAsxfBq9eS+J7QPV+Y2qeo0YKiZc+feGENuUCJ
vdQTcrR8AHUVQv6alt5s7Itp63XJWg97Mz2ZfmD8e2DpowCZIRi6D8EwLvjy
F6mLWeUt7iiFRS4nzzYOM7fE+FFtWy5sCSkoncSIU60WQ73SpEV4Ugld6s2F
OpcWkaM6s1gk2YK1KHNb2qH9le5uCS3yRn3E649UO7R7RxSFnLTRUHvGRYMZ
1WgWRVvYbjUaezF53ZpbLHr1f0N4NSyRkJnkDVXBa/+qnZCM1ludu9/qzju8
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

-->

</rfc>
