<?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-00" 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-00"/>
    <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"
 }
 ~~~

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:

| Field Name           | Value                             |
|:---------------------|:----------------------------------|
| mediator-request-uri | MEDIATOR_REQUEST_URI resource URL |


As an example, the Mediator's JSON dictionary could look like:

]]></artwork>
      <t>{
    "mediator-request-uri": "https://mediator.example.net/relay-access-token-request."
 }
~~~</t>
      <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</organization>
            </author>
            <author fullname="Nick Sullivan">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="6" month="July" year="2021"/>
            <abstract>
              <t>   An Oblivious Pseudorandom Function (OPRF) is a two-party protocol for
   computing the output of a PRF.  One party (the server) holds the PRF
   secret key, and the other (the client) holds the PRF input.  The
   'obliviousness' property ensures that the server does not learn
   anything about the client's input during the evaluation.  The client
   should also not learn anything about the server's secret PRF key.
   Optionally, OPRFs can also satisfy a notion 'verifiability' (VOPRF).
   In this setting, the client can verify that the server's output is
   indeed the result of evaluating the underlying PRF with just a public
   key.  This document specifies OPRF and VOPRF constructions
   instantiated within prime-order groups, including elliptic curves.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-07"/>
        </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:
H4sIAMMKd2EAA+1963rcxpXg/3oKhPphctLdulh2HNryhqYom2OJ0pJ0/OXz
ZGSwG81GiAZ6ADSpNq15ln2WfbI916pTAJqikuxM9tvwS2SyG6jLqXO/1Xg8
dm3eFtl+8qbOr9M2Sw6m06xpkvPqKisbl15c1Nn1tm9n1bRMl/DyrE7n7XjF
D41Temjc0kPjR4/cFD69rOrNftK0M+fyVb2ftPW6aZ88evT7R0/cVba5qerZ
fnJctlldZu34OQ7oXNOm5extWlQlTLLJGrfK95Of2mo6Spqqbuts3sBvmyX+
8mfn0nW7qOp9l4xdAj952ewnZ5Pku6yc1fn0qqlK+pzXfDat2rb3XVVf7iff
VtVlkSUvXx7SZ9kyzQtYO77wh2YR3phMq2U02b9OkuNNVl6mtZnoX9MyjT6m
OV6kTVts7Ph/qfM/zOnT3rjnk+RNupbHedTzarncmE9p0IPVCtZ9XE4n9FkD
EMra/eR1mclXb9L6Kvkx5VemeQtHcrheZXWbl9UoOUyLfF7VZZ4mv//s0eOn
/FS1Lls8ux/KvM1myVkLp9kk1Tw5WGYAiNTuoV3hgv6Q4mS9XcBR/DEtZtkv
9hTa7Dor7ed3ncA1PfaH6aKulvl6OYFnoxkOJ8nBJPmxqmZmisNFnTdttVpk
dfQtTXRYVOvZvEjrzE40TW/+sMjSVV5eXuRtMwGUdG48HifpBcA0ncJf54u8
SYAA1susbJNZNs9LgEqarOoK8LMqEgBkkjfNGsZIAIuTOptl2RL/IjqZboBe
siarr+EjxySTMMlMkvMFfCN/wWLKJJ3B6vETGIpGTctplqyqIp9uRklaFNUN
zeNowCk9WeTLvE1kZPgPUBg+A9+0C303ucmBZNZtgru6wq+nRY4bymfwL+DH
hPe9zGezInPuAZJoXc3W0zavyuT2QW7+fO/cGUyf1bBmwM6qLDbJGvaxSpsm
v84ICoBrDZxGmGKe4/PwRDXNU8QvXJGsohm5Zj1dwLfJ8RuAwQwA1iDu1QBw
2qYZY0QQz0r4d0qwkI3DpOsmvcwc7TjPALwv8MF36RKQFICXNLRo2OPlohWo
IYTSJWI+Ivq0KmnFAPuwDkfnwpNU+H6aXOaIy22+zHCfeTVLdoEzZTUcPR0d
4sfOMgMeBx+s0s0NHNzO3gj24zqrqJGPRgc4B5SPF4BDAgpd48rmdbqe4V6B
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
mnWDtalyusi40bJEd9k1QzKecctjuac/IQBHNLUkJMDFKIEIuXco2M86ua9K
qB/S0t8CkN/mM9bk7LfCbfpfeEPnp5OroP39dyp9diMyEBbd5PgMWN4orVK2
EhcC+5AsYCSll9ouZP/i/SoifnTbsqgo8pJiotvBk88+3+UYDy5mT/IzXPiI
1/b86NQrSXfoHsk0rSVNKorniqjm45HtgvbIgFMZ0VFQaetCEKwip4WLEWmk
O4g/3pPt6sDouYjK0D1cRrQu/6es7ORKVjakOAn5Sa6wl3CUmu2MXDi5SqjL
/CwUBDQki4xMM2jHsdcNqhqwoVHy6RdPKe/us8dP9OaDQPN4zri2J4+efgGP
PvrdE5YaTx/9/vPkImezLhTSeYsYM+n8ElkMilwMIKFVCguAPcByYQk0Oqwr
Ut9Dw1ffbFT8tVsV91jXd6LHK4lgKYp3fY6ERvraJ47eU92dBegkOQCtbV2y
1wzV4VL2ST3DfWQGwDi0TNc1SZBdU2J70Pw5Xw9VN4WyeoZIKeoeL8ykiiK1
5S6zG7UT2E9NbhfSPQ8sLFUWRiwIuVb01KD4I+iJ6GNGpysIDUa7fqAkeH86
CR2c4GJbMuI1bN0egyMNRlH7o5Bpo5RIAkI4mNJ32iFqcXlRDDRc7UGJ6Ng6
HfVxmmAb8Y/kjguZWvE9oju7jjtF1WTI14GqPqDABRcyRgUtdKYNXxPBNKRd
SbG7rfcsotmLtgJbFTa7i1PxgwbGWXc3OmYjmbWmrUHHRqJibC/C0R7N6hqz
NvrFHuoQp2j5yHaUJCwHk2Xa9lRi6qM6596OqJ+hpq0yJ5XlR8jp1BTmRFWv
+Rufs1f67/Qz92yGKGOLE/fCfS/iW3XDPREngggeepLWbvvIhoSX4GEcDUVc
mjZbSSvcXkqeTq9L66TkjdQCDlnvusSxRypMAdHBfaBBiUwNhLBzDHXlnc+j
XCg/mCaAZLSE/kghK03brEoCuN3CwNI0UUlMF363v7TgITHmmzsfPGo2+oLd
DqSX1QWpGrR4fzvYLFvBqrFPO9douUovDCDl7fYWs2HRzOKbSbz7wTpIqRN3
incK+NiEiUxo2IczwDr5N+Phy5NiC6971x/X1q25/laLfAbINbQcpJmA6S9R
70cB8W1drVd4j9Prb7EKhIOo6NJnBKUQ4jJd4RWFjd/UrqI6M6Y9kI15LXkj
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

-->

</rfc>
