<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-yun-privacypass-arc-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.0 -->
  <front>
    <title abbrev="Privacy Pass Issuance Protocol for ARC">Privacy Pass Issuance Protocol for Anonymous Rate-Limited Credentials</title>
    <seriesInfo name="Internet-Draft" value="draft-yun-privacypass-arc-01"/>
    <author initials="C." surname="Yun" fullname="Cathie Yun">
      <organization>Apple, Inc.</organization>
      <address>
        <email>cathieyun@gmail.com</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Apple, Inc.</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2025" month="August" day="06"/>
    <abstract>
      <?line 40?>

<t>This document specifies the issuance and redemption protocols for
tokens based on the Anonymous Rate-Limited Credential (ARC) protocol.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://example.com/LATEST"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-yun-privacypass-arc/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        PRIVACYPASS Privacy Pass mailing list (<eref target="mailto:WG@example.com"/>),
        which is archived at <eref target="https://example.com/WG"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/USER/REPO"/>.</t>
    </note>
  </front>
  <middle>
    <?line 45?>

<section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="ARCHITECTURE"/> describes the Privacy Pass architecture, and <xref target="ISSUANCE"/>
and <xref target="AUTHSCHEME"/> describe the issuance and redemption protocols for
basic Privacy Pass tokens, i.e., those computed using blind RSA signatures
(as specified in <xref target="BLIND-RSA"/>) or verifiable oblivious
pseudorandom functions (as specified in <xref target="VOPRFS"/>). These protocols
are widely deployed in practice for a variety of applications, including
anonymous authentication for protocols such as Oblivious HTTP <xref target="OHTTP"/>
and the Distributed Aggregation Protocol <xref target="DAP"/>. While
effective, these variants of Privacy Pass tokens are limited in that
each token can only be spent once. These are often calle "one-time-use" tokens.
This means that applications which wish to limit access to a given user, e.g.,
for the purposes of throttling or rate limiting them, must issue one token
for each redemption.</t>
      <t>The Anonymous Rate-Limited Credential (ARC) protocol, as specified in <xref target="ARC"/>,
offers a more scalable approach to rate limiting. In particular, ARC credentials
can be issued once and then presented (or redeemed) up to some fixed-amount
of time for distinct, per-origin presentation contexts. This means that a Client
will only be able to present a limited number of tokens associated with a given
context.</t>
      <t>This document specifies the issuance and redemption protocols for ARC. <xref target="motivation"/>
describes motivation for this new type of token, <xref target="overview"/> presents an overview
of the protocols, and the remainder of the document specifies the protocols themselves.</t>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>To demonstrate how ARC is useful, consider the case where a client wishes to keep
its IP address private while accessing a service. The client 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>With one-time-use tokens, the server can verify that each client access meets
a particular bar for attestation, i.e., the bar that is enforced during issuance,
but cannot be used by the server to rate limit a specific client. This is because
there is no mechanism in the issuance protocol to link repeated Client token
requests in order to apply rate-limiting.</t>
      <t>There are several use cases for rate-limiting anonymous clients that are common
on the Internet. These routinely use client IP address tracking, among other
characteristics, to implement rate-limiting.</t>
      <t>One example of this use case is rate-limiting website accesses to a client to
help prevent abusive behavior. Operations that are sensitive to abuse, such as
account creation on a website or logging into an account, often employ rate-limiting
as a defense-in-depth strategy. Additional verification can be required by these
pages when a client exceeds a set rate-limit.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>This document uses the terms Origin, Client, Issuer, and Token as defined in
<xref section="2" sectionFormat="of" target="ARCHITECTURE"/>. Moreover, the following additional terms are
used throughout this document.</t>
      <ul spacing="normal">
        <li>
          <t>Issuer Public Key: The public key (from a private-public key pair) used by
the Issuer for issuing and verifying Tokens.</t>
        </li>
        <li>
          <t>Issuer Private Key: The private key (from a private-public key pair) used by
the Issuer for issuing and verifying Tokens.</t>
        </li>
      </ul>
      <t>Unless otherwise specified, this document encodes protocol messages in TLS
notation from <xref section="3" sectionFormat="of" target="TLS13"/>. Moreover, all constants are in
network byte order.</t>
    </section>
    <section anchor="overview">
      <name>Protocol Overview</name>
      <t>The issuance and redemption protocols defined in this document are built on
the Anonymous Rate-Limited Credential (ARC) protocol. In contrast to the core
Privacy Pass protocols which are one-time-use anonymous credentials, ARC allows
clients to turn a single credential output from an issuance protocol into a
fixed number of unlinkable tokens, each of which are bound to some agreed-upon
public presentation context.</t>
      <t>With ARC, Clients receive TokenChallenge inputs from the redemption protocol
(<xref section="2.1" sectionFormat="comma" target="AUTHSCHEME"/>). If they have a valid credential for the designated
Issuer, Clients can use the TokenChallenge to produce a single token for
presentation. Otherwise, Clients invoke the issuance protocol to obtain a
credential. This interaction is shown below.</t>
      <figure anchor="fig-overview">
        <name>Issuance and Redemption Overview</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="544" viewBox="0 0 544 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,48 L 8,80" fill="none" stroke="black"/>
              <path d="M 40,80 L 40,128" fill="none" stroke="black"/>
              <path d="M 40,160 L 40,256" fill="none" stroke="black"/>
              <path d="M 80,48 L 80,80" fill="none" stroke="black"/>
              <path d="M 168,48 L 168,80" fill="none" stroke="black"/>
              <path d="M 216,80 L 216,112" fill="none" stroke="black"/>
              <path d="M 216,160 L 216,176" fill="none" stroke="black"/>
              <path d="M 256,48 L 256,80" fill="none" stroke="black"/>
              <path d="M 312,32 L 312,96" fill="none" stroke="black"/>
              <path d="M 336,48 L 336,80" fill="none" stroke="black"/>
              <path d="M 376,80 L 376,120" fill="none" stroke="black"/>
              <path d="M 376,152 L 376,232" fill="none" stroke="black"/>
              <path d="M 408,48 L 408,80" fill="none" stroke="black"/>
              <path d="M 440,48 L 440,80" fill="none" stroke="black"/>
              <path d="M 472,80 L 472,256" fill="none" stroke="black"/>
              <path d="M 512,48 L 512,80" fill="none" stroke="black"/>
              <path d="M 536,32 L 536,96" fill="none" stroke="black"/>
              <path d="M 312,32 L 536,32" fill="none" stroke="black"/>
              <path d="M 8,48 L 80,48" fill="none" stroke="black"/>
              <path d="M 168,48 L 256,48" fill="none" stroke="black"/>
              <path d="M 336,48 L 408,48" fill="none" stroke="black"/>
              <path d="M 440,48 L 512,48" fill="none" stroke="black"/>
              <path d="M 8,80 L 80,80" fill="none" stroke="black"/>
              <path d="M 168,80 L 256,80" fill="none" stroke="black"/>
              <path d="M 336,80 L 408,80" fill="none" stroke="black"/>
              <path d="M 440,80 L 512,80" fill="none" stroke="black"/>
              <path d="M 312,96 L 368,96" fill="none" stroke="black"/>
              <path d="M 384,96 L 464,96" fill="none" stroke="black"/>
              <path d="M 480,96 L 520,96" fill="none" stroke="black"/>
              <path d="M 48,128 L 208,128" fill="none" stroke="black"/>
              <path d="M 288,128 L 464,128" fill="none" stroke="black"/>
              <path d="M 40,144 L 176,144" fill="none" stroke="black"/>
              <path d="M 312,144 L 472,144" fill="none" stroke="black"/>
              <path d="M 56,174 L 72,174" fill="none" stroke="black"/>
              <path d="M 56,178 L 72,178" fill="none" stroke="black"/>
              <path d="M 184,174 L 200,174" fill="none" stroke="black"/>
              <path d="M 184,178 L 200,178" fill="none" stroke="black"/>
              <path d="M 40,192 L 128,192" fill="none" stroke="black"/>
              <path d="M 288,192 L 368,192" fill="none" stroke="black"/>
              <path d="M 48,208 L 128,208" fill="none" stroke="black"/>
              <path d="M 296,208 L 376,208" fill="none" stroke="black"/>
              <path d="M 48,240 L 128,240" fill="none" stroke="black"/>
              <path d="M 272,240 L 464,240" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="472,240 460,234.4 460,245.6" fill="black" transform="rotate(0,464,240)"/>
              <polygon class="arrowhead" points="472,128 460,122.4 460,133.6" fill="black" transform="rotate(0,464,128)"/>
              <polygon class="arrowhead" points="376,192 364,186.4 364,197.6" fill="black" transform="rotate(0,368,192)"/>
              <polygon class="arrowhead" points="208,176 196,170.4 196,181.6" fill="black" transform="rotate(0,200,176)"/>
              <polygon class="arrowhead" points="64,176 52,170.4 52,181.6" fill="black" transform="rotate(180,56,176)"/>
              <polygon class="arrowhead" points="56,208 44,202.4 44,213.6" fill="black" transform="rotate(180,48,208)"/>
              <polygon class="arrowhead" points="48,144 36,138.4 36,149.6" fill="black" transform="rotate(180,40,144)"/>
              <g class="text">
                <text x="44" y="68">Client</text>
                <text x="212" y="68">Attester</text>
                <text x="372" y="68">Issuer</text>
                <text x="476" y="68">Origin</text>
                <text x="248" y="132">Request</text>
                <text x="244" y="148">TokenChallenge</text>
                <text x="128" y="180">Attestation</text>
                <text x="208" y="196">CredentialRequest</text>
                <text x="212" y="212">CredentialResponse</text>
                <text x="216" y="228">|</text>
                <text x="168" y="244">Request</text>
                <text x="208" y="244">+</text>
                <text x="240" y="244">Token</text>
                <text x="216" y="260">|</text>
                <text x="376" y="260">|</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
                                      +---------------------------+
+--------+          +----------+      |  +--------+   +--------+  |
| Client |          | Attester |      |  | Issuer |   | Origin |  |
+---+----+          +-----+----+      |  +----+---+   +---+----+  |
    |                     |           +-------|-----------|------ +
    |                     |                   |           |
    |--------------------- Request ---------------------->|
    <----------------- TokenChallenge --------------------+
    |                     |                   |           |
    | <== Attestation ==> |                   |           |
    +----------- CredentialRequest ---------->|           |
    |<---------- CredentialResponse ----------+           |
    |                     |                   |           |
    |----------- Request + Token ------------------------>|
    |                     |                   |           |
]]></artwork>
        </artset>
      </figure>
      <t>Similar to the core Privacy Pass protocols, the TokenChallenge can
be interactive or non-interactive, and per-origin or cross-origin.</t>
      <t>ARC is only compatible with deployment models where the Issuer and Origin
are operated by the same entity (see <xref section="4" sectionFormat="of" target="ARCHITECTURE"/>), as
tokens produced from a credential are not publicly verifiable. The details
of attestation are outside the scope of the issuance protocol; see
<xref section="4" sectionFormat="of" target="ARCHITECTURE"/> for information about how attestation can
be implemented in each of the relevant deployment models.</t>
      <t>The issuance and redemption protocols in this document are built on
<xref target="ARC"/>.</t>
    </section>
    <section anchor="setup">
      <name>Configuration</name>
      <t>ARC Issuers are configured with key material used for issuance and token
verification. Concretely, Issuers run the <tt>SetupServer</tt> function from <xref target="ARC"/>
to produce a private and public key, denoted skI and pkI, respectively.</t>
      <artwork><![CDATA[
skI, pkI = SetupServer()
]]></artwork>
      <t>The Issuer Public Key ID, denoted <tt>issuer_key_id</tt>, is computed as the
SHA-256 hash of the Issuer Public Key, i.e., <tt>issuer_key_id = SHA-256(pkI_serialized)</tt>,
where <tt>pkI_serialized</tt> is the serialized version of <tt>pkI</tt> as described in [Section 4.1 of ARC].</t>
    </section>
    <section anchor="token-challenge-requirements">
      <name>Token Challenge Requirements</name>
      <t>The ARC protocol uses a modified TokenChallenge structure from the one
specified in <xref target="AUTHSCHEME"/>. In particular, the updated TokenChallenge
structure is as follows:</t>
      <artwork><![CDATA[
struct {
    uint16_t token_type = 0xE5AC; /* Type ARC(P-256) */
    opaque issuer_name<1..2^16-1>;
    opaque redemption_context<0..32>;
    opaque origin_info<0..2^16-1>;
    opaque credential_context<0..32>;
} TokenChallenge;
]]></artwork>
      <t>With the exception of <tt>credential_context</tt>, all fields are exactly as specified
in <xref section="2.1.1" sectionFormat="of" target="AUTHSCHEME"/>. The <tt>credential_context</tt> field is defined as
follows:</t>
      <ul spacing="normal">
        <li>
          <t>"credential_context" is a field that is either 0 or 32 bytes, prefixed with a single
octet indicating the length (either 0 or 32). If value is non-empty, it is a 32-byte value
generated by the origin that allows the origin to require that clients fetch credentials
bound to a specific context. Challenges with credential_context values of invalid lengths
<bcp14>MUST</bcp14> be ignored.</t>
        </li>
      </ul>
      <t>Similar to the <tt>redemption_context</tt> field, the <tt>credential_context</tt> is used to bind
information to the credential. This might be useful, for example, to enforce some
expiration on the credential. Origins might do this by constructing <tt>credential_context</tt>
as F(current time window), where F is a pseudorandom function. Semantically, this is
equivalent to the Origin asking the Client for a token from a credential that is
bound to "current time window."</t>
      <t>[[OPEN ISSUE: give more guidance about how to construct credential_context and redemption_context depending on the application's needs]]</t>
      <t>In addition to this updated TokenChallenge, the HTTP authentication challenge
also <bcp14>SHOULD</bcp14> contain the following additional attribute:</t>
      <ul spacing="normal">
        <li>
          <t>"rate-limit", which contains a JSON number indicating the presentation
limit to use for ARC.</t>
        </li>
      </ul>
      <t>Implementation-specific steps: the client should store the Origin-provided input <tt>tokenChallenge</tt> so that when they receive a new <tt>tokenChallenge</tt> value, they can check if it has changed and which fields are different. This will inform the client's behavior - for example, if <tt>credential_context</tt> is being used to enforce an expiration on the credential, then if the <tt>credential_context</tt> has changed, this can prompt the client to request a new credential.</t>
    </section>
    <section anchor="credential-issuance-protocol">
      <name>Credential Issuance Protocol</name>
      <t>Issuers provide an Issuer Private and Public Key, denoted <tt>skI</tt> and <tt>pkI</tt>
respectively, used to produce tokens as input to the protocol. See <xref target="setup"/>
for how these keys are generated.</t>
      <t>Clients provide the following as input to the issuance protocol:</t>
      <ul spacing="normal">
        <li>
          <t>Issuer Request URL: A URL identifying the location to which issuance requests
are sent. This can be a URL derived from the "issuer-request-uri" value in the
Issuer's directory resource, or it can be another Client-configured URL. The value
of this parameter depends on the Client configuration and deployment model.
For example, in the 'Joint Origin and Issuer' deployment model, the Issuer
Request URL might correspond to the Client's configured Attester, and the
Attester is configured to relay requests to the Issuer.</t>
        </li>
        <li>
          <t>Issuer name: An identifier for the Issuer. This is typically a host name that
can be used to construct HTTP requests to the Issuer.</t>
        </li>
        <li>
          <t>Issuer Public Key: <tt>pkI</tt>, with a key identifier <tt>token_key_id</tt> computed as
described in <xref target="setup"/>.</t>
        </li>
      </ul>
      <t>Given this configuration and these inputs, the two messages exchanged in
this protocol to produce a credential are described below.</t>
      <section anchor="client-to-issuer-request">
        <name>Client-to-Issuer Request</name>
        <t>Given Origin-provided input <tt>tokenChallenge</tt> and the Issuer Public Key ID <tt>issuer_key_id</tt>,
the Client first creates a credential request message using the <tt>CredentialRequest</tt>
function from <xref target="ARC"/> as follows:</t>
        <artwork><![CDATA[
request_context = concat(tokenChallenge.issuer_name,
  tokenChallenge.origin_info,
  tokenChallenge.credential_context,
  issuer_key_id)
(clientSecrets, request) = CredentialRequest(request_context)
]]></artwork>
        <t>The Client then creates a TokenRequest structure as follows:</t>
        <artwork><![CDATA[
struct {
  uint16_t token_type = 0xE5AC; /* Type ARC(P-256) */
  uint8_t truncated_issuer_key_id;
  uint8_t encoded_request[Nrequest];
} TokenRequest;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t>"token_type" is a 2-octet integer.</t>
          </li>
          <li>
            <t>"truncated_issuer_key_id" is the least significant byte of the <tt>issuer_key_id</tt>
(<xref target="setup"/>) in network byte order (in other words, the last 8
bits of <tt>issuer_key_id</tt>). This value is truncated so that Issuers cannot use
<tt>issuer_key_id</tt> as a way of uniquely identifying Clients; see <xref target="security"/>
and referenced information for more details.</t>
          </li>
          <li>
            <t>"encoded_request" is the Nrequest-octet request, computed as the serialization
of the <tt>request</tt> value as defined in [Section 4.2.1 of ARC].</t>
          </li>
        </ul>
        <t>The Client then generates an HTTP POST request to send to the Issuer Request URL,
with the TokenRequest as the content. The media type for this request is
"application/private-credential-request". An example request for the Issuer Request URL
"https://issuer.example.net/request" is shown below.</t>
        <artwork><![CDATA[
POST /request HTTP/1.1
Host: issuer.example.net
Accept: application/private-credential-response
Content-Type: application/private-credential-request
Content-Length: <Length of TokenRequest>

<Bytes containing the TokenRequest>
]]></artwork>
      </section>
      <section anchor="issuer-to-client-response">
        <name>Issuer-to-Client Response</name>
        <t>Upon receipt of the request, the Issuer validates the following conditions:</t>
        <ul spacing="normal">
          <li>
            <t>The TokenRequest contains a supported token_type equal to value 0xE5AC.</t>
          </li>
          <li>
            <t>The TokenRequest.truncated_token_key_id corresponds to the truncated key ID
of an Issuer Public Key, with corresponding secret key <tt>skI</tt>, owned by
the Issuer.</t>
          </li>
          <li>
            <t>The TokenRequest.encoded_request is of the correct size (<tt>Nrequest</tt>).</t>
          </li>
        </ul>
        <t>If any of these conditions is not met, the Issuer <bcp14>MUST</bcp14> return an HTTP 422
(Unprocessable Content) error to the client.</t>
        <t>If these conditions are met, the Issuer then tries to deserialize
TokenRequest.encoded_request according to [Section 4.2.1 of ARC], yielding <tt>request</tt>.
If this fails, the Issuer <bcp14>MUST</bcp14> return an HTTP 422 (Unprocessable Content)
error to the client. Otherwise, if the Issuer is willing to produce a credential
for the Client, the Issuer completes the issuance flow by an issuance response
as follows:</t>
        <artwork><![CDATA[
response = CredentialResponse(skI, pkI, request)
]]></artwork>
        <t>The Issuer then creates a TokenResponse structured as follows:</t>
        <artwork><![CDATA[
struct {
   uint8_t encoded_response[Nresponse];
} TokenResponse;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t>"encoded_response" is the Nresponse-octet encoded issuance response message, computed
as the serialization of <tt>response</tt> as specified in [Section 4.2.2 of ARC].</t>
          </li>
        </ul>
        <t>The Issuer generates an HTTP response with status code 200 whose content
consists of TokenResponse, with the content type set as
"application/private-credential-response".</t>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/private-credential-response
Content-Length: <Length of TokenResponse>

<Bytes containing the TokenResponse>
]]></artwork>
      </section>
      <section anchor="credential-finalization">
        <name>Credential Finalization</name>
        <t>Upon receipt, the Client handles the response and, if successful, deserializes
the content values <tt>TokenResponse.encoded_response</tt> according to [Section 4.2.2 of ARC]
yielding <tt>response</tt>. If deserialization fails, the Client aborts the protocol.
Otherwise, the Client processes the response as follows:</t>
        <artwork><![CDATA[
credential = FinalizeCredential(clientSecrets, pkI, request, response)
]]></artwork>
        <t>The Client then saves the credential structure, associated with the given Issuer
Name, to use when producing Token values in response to future token challenges.</t>
      </section>
    </section>
    <section anchor="token-redemption-protocol">
      <name>Token Redemption Protocol</name>
      <t>The token redemption protocol takes as input TokenChallenge and presentation limit
values from <xref section="2.1" sectionFormat="comma" target="AUTHSCHEME"/>; the presentation limit is sent as an additional
attribute within the HTTP challenge as described in <xref target="token-challenge-requirements"/>.
Clients use credentials from the issuance protocol in producing tokens
bound to the TokenChallenge. The process for producing a token in this
way, as well as verifying a resulting token, is described in the following sections.</t>
      <section anchor="token-creation">
        <name>Token Creation</name>
        <t>Given a TokenChallenge value as input, denoted <tt>challenge</tt>, a presentation limit,
denoted <tt>presentationLimit</tt>, and a previously computed credential that is valid
for the Issuer identifier in the challenge, denoted <tt>credential</tt>, Clients compute
a credential presentation value as follows:</t>
        <artwork><![CDATA[
presentation_context = concat(tokenChallenge.issuer_name,
  tokenChallenge.origin_info,
  tokenChallenge.redemption_context,
  issuer_key_id)
state = MakePresentationState(credential, presentation_context, presentationLimit)
newState, nonce, presentation = Present(state)
]]></artwork>
        <t>Subsequent presentations <bcp14>MUST</bcp14> use the updated state, denoted <tt>newState</tt>. Reusing
the original state will break the presentation unlinkability properties of ARC;
see <xref target="security"/>.</t>
        <t>The resulting Token value is then constructed as follows:</t>
        <artwork><![CDATA[
struct {
    uint16_t token_type = 0xE5AC; /* Type ARC(P-256) */
    uint8_t issuer_key_id[Nid];
    uint32_t presentation_nonce;
    uint8_t presentation[Npresentation];
} Token;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t>"token_type" is a 2-octet integer, in network byte order, equal to 0xE5AC.</t>
          </li>
          <li>
            <t>"issuer_key_id" is a Nid-octet identifier for the Issuer Public Key, computed
as defined in <xref target="setup"/>.</t>
          </li>
          <li>
            <t>"presentation_nonce" is a 32-bit encoding of the nonce output from ARC.</t>
          </li>
          <li>
            <t>"presentation" is a Npresentation-octet presentation, set to the serialized
<tt>presentation</tt> value (see [Section 4.3.2 of ARC] for serialiation details).</t>
          </li>
        </ul>
      </section>
      <section anchor="verification">
        <name>Token Verification</name>
        <t>Given a deserialized presentation from the token, denoted <tt>presentation</tt> and
obtained by deserializing a presentation according to [Section 4.3.2 of ARC],
a presentation limit, denoted <tt>presentation_limit</tt>, a presentation nonce
from a token, denoted <tt>nonce</tt>, and the digest of a token challenge, denoted
<tt>challenge_digest</tt>, verifying a Token requires invoking the VerifyPresentation
function from [Section 4.3.3 of ARC] in the following ways:</t>
        <artwork><![CDATA[
request_context = concat(tokenChallenge.issuer_name,
  tokenChallenge.origin_info,
  tokenChallenge.credential_context,
  issuer_key_id)
presentation_context = concat(tokenChallenge.issuer_name,
  tokenChallenge.origin_info,
  tokenChallenge.redemption_context,
  issuer_key_id)
valid = VerifyPresentation(skI, pkI, request_context, presentation_context, nonce, presentation, presentation_limit)
]]></artwork>
        <t>This function returns True if the CredentialToken is valid, and False otherwise.</t>
        <t>Implementation-specific steps: to prevent double spending, the Origin should perform a check that the
tag (presentation.tag) has not previously been seen. It then stores the tag for use in future double
spending checks. To reduce the overhead of performing double spend checks, the Origin can store and
look up the tags corresponding to the associated request_context and presentation_context values.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>Privacy considerations for tokens based on deployment details, such as issuer configuration
and issuer selection, are discussed in <xref section="6.1" sectionFormat="of" target="ARCHITECTURE"/>. Note that ARC
requires a joint Origin and Issuer configuration given that it is privately verifiable.</t>
      <t>ARC offers Origin-Client unlinkability, Issuer-Client unlinkability, and redemption context
unlinkability, as described in <xref section="3.3" sectionFormat="of" target="ARCHITECTURE"/>, with one exception.
While redemption context unlinkability is achieved by re-randomizing credentials every time
they are presented as tokens, there is a reduction in the anonymity set in the case of presentation
nonce collisions, as detailed in [Section 7.2 of ARC].</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document updates the "Privacy Pass Token Type" Registry with the
following entries.</t>
      <ul spacing="normal">
        <li>
          <t>Value: 0xE5AC</t>
        </li>
        <li>
          <t>Name: ARC (P-256)</t>
        </li>
        <li>
          <t>Token Structure: As defined in <xref section="2.2" sectionFormat="of" target="AUTHSCHEME"/></t>
        </li>
        <li>
          <t>Token Key Encoding: Serialized as described in <xref target="setup"/></t>
        </li>
        <li>
          <t>TokenChallenge Structure: As defined in <xref section="2.1" sectionFormat="of" target="AUTHSCHEME"/></t>
        </li>
        <li>
          <t>Public Verifiability: N</t>
        </li>
        <li>
          <t>Public Metadata: N</t>
        </li>
        <li>
          <t>Private Metadata: N</t>
        </li>
        <li>
          <t>Nk: 0 (not applicable)</t>
        </li>
        <li>
          <t>Nid: 32</t>
        </li>
        <li>
          <t>Reference: This document</t>
        </li>
        <li>
          <t>Notes: None</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="ARC">
          <front>
            <title>Anonymous Rate-Limited Credentials</title>
            <author fullname="Cathie Yun" initials="C." surname="Yun">
              <organization>Apple, Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Apple, Inc.</organization>
            </author>
            <date day="5" month="February" year="2025"/>
            <abstract>
              <t>   This document specifies the Anonymous Rate-Limited Credential (ARC)
   protocol, a specialization of keyed-verification anonymous
   credentials with support for rate limiting.  ARC credentials can be
   presented from client to server up to some fixed number of times,
   where each presentation is cryptographically bound to client secrets
   and application-specific public information, such that each
   presentation is unlinkable from the others as well as the original
   credential creation.  ARC is useful in applications where a server
   needs to throttle or rate-limit access from anonymous clients.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-yun-cfrg-arc-00"/>
        </reference>
        <reference anchor="ARCHITECTURE">
          <front>
            <title>The Privacy Pass Architecture</title>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="J. Iyengar" initials="J." surname="Iyengar"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <abstract>
              <t>This document specifies the Privacy Pass architecture and requirements for its constituent protocols used for authorization based on privacy-preserving authentication mechanisms. It describes the conceptual model of Privacy Pass and its protocols, its security and privacy goals, practical deployment models, and recommendations for each deployment model, to help ensure that the desired security and privacy goals are fulfilled.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9576"/>
          <seriesInfo name="DOI" value="10.17487/RFC9576"/>
        </reference>
        <reference anchor="AUTHSCHEME">
          <front>
            <title>The Privacy Pass HTTP Authentication Scheme</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="S. Valdez" initials="S." surname="Valdez"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <abstract>
              <t>This document defines an HTTP authentication scheme for Privacy Pass, a privacy-preserving authentication mechanism used for authorization. The authentication scheme specified in this document can be used by Clients to redeem Privacy Pass tokens with an Origin. It can also be used by Origins to challenge Clients to present Privacy Pass tokens.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9577"/>
          <seriesInfo name="DOI" value="10.17487/RFC9577"/>
        </reference>
        <reference anchor="ISSUANCE">
          <front>
            <title>Privacy Pass Issuance Protocols</title>
            <author fullname="S. Celi" initials="S." surname="Celi"/>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="S. Valdez" initials="S." surname="Valdez"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <abstract>
              <t>This document specifies two variants of the two-message issuance protocol for Privacy Pass tokens: one that produces tokens that are privately verifiable using the Issuer Private Key and one that produces tokens that are publicly verifiable using the Issuer Public Key. Instances of "issuance protocol" and "issuance protocols" in the text of this document are used interchangeably to refer to the two variants of the Privacy Pass issuance protocol.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9578"/>
          <seriesInfo name="DOI" value="10.17487/RFC9578"/>
        </reference>
        <reference anchor="BLIND-RSA">
          <front>
            <title>RSA Blind Signatures</title>
            <author fullname="F. Denis" initials="F." surname="Denis"/>
            <author fullname="F. Jacobs" initials="F." surname="Jacobs"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document specifies an RSA-based blind signature protocol. RSA blind signatures were first introduced by Chaum for untraceable payments. A signature that is output from this protocol can be verified as an RSA-PSS signature.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9474"/>
          <seriesInfo name="DOI" value="10.17487/RFC9474"/>
        </reference>
        <reference anchor="VOPRFS">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) Using Prime-Order Groups</title>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="December" year="2023"/>
            <abstract>
              <t>An Oblivious Pseudorandom Function (OPRF) is a two-party protocol between a client and a server for computing the output of a Pseudorandom Function (PRF). The server provides the PRF private key, and the client provides the PRF input. At the end of the protocol, the client learns the PRF output without learning anything about the PRF private key, and the server learns neither the PRF input nor output. An OPRF can also satisfy a notion of 'verifiability', called a VOPRF. A VOPRF ensures clients can verify that the server used a specific private key during the execution of the protocol. A VOPRF can also be partially oblivious, called a POPRF. A POPRF allows clients and servers to provide public input to the PRF computation. This document specifies an OPRF, VOPRF, and POPRF instantiated within standard prime-order groups, including elliptic curves. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9497"/>
          <seriesInfo name="DOI" value="10.17487/RFC9497"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="TLS13">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="OHTTP">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="January" year="2024"/>
            <abstract>
              <t>This document describes Oblivious HTTP, a protocol for forwarding encrypted HTTP messages. Oblivious HTTP allows a client to make multiple requests to an origin server without that server being able to link those requests to the client or to identify the requests as having come from the same client, while placing only limited trust in the nodes used to forward the messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9458"/>
          <seriesInfo name="DOI" value="10.17487/RFC9458"/>
        </reference>
        <reference anchor="DAP">
          <front>
            <title>Distributed Aggregation Protocol for Privacy Preserving Measurement</title>
            <author fullname="Tim Geoghegan" initials="T." surname="Geoghegan">
              <organization>ISRG</organization>
            </author>
            <author fullname="Christopher Patton" initials="C." surname="Patton">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Brandon Pitman" initials="B." surname="Pitman">
              <organization>ISRG</organization>
            </author>
            <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>Independent</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="29" month="April" year="2025"/>
            <abstract>
              <t>   There are many situations in which it is desirable to take
   measurements of data which people consider sensitive.  In these
   cases, the entity taking the measurement is usually not interested in
   people's individual responses but rather in aggregated data.
   Conventional methods require collecting individual responses and then
   aggregating them on some server, thus representing a threat to user
   privacy and rendering many such measurements difficult and
   impractical.  This document describes a multi-party distributed
   aggregation protocol (DAP) for privacy preserving measurement which
   can be used to collect aggregate data without revealing any
   individual contributor's data.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ppm-dap-15"/>
        </reference>
        <reference anchor="RATE-LIMITED">
          <front>
            <title>Rate-Limited Token Issuance Protocol</title>
            <author fullname="Scott Hendrickson" initials="S." surname="Hendrickson">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="1" month="April" year="2024"/>
            <abstract>
              <t>   This document specifies a variant of the Privacy Pass issuance
   protocol that allows for tokens to be rate-limited on a per-origin
   basis.  This enables origins to use tokens for use cases that need to
   restrict access from anonymous clients.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-rate-limit-tokens-06"/>
        </reference>
      </references>
    </references>
    <?line 486?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank Tommy Pauly and the authors
of <xref target="RATE-LIMITED"/>
for helpful discussions on rate-limited tokens.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
KUeZbE5/xoCquNJZQG4dmjQ3UUKSbwmlweGx7MzW0aguK50rZIQWeX7Nf25B
iCk7yUdrdoPIqqtC3UCl07PGMdK5hQuUCONP/C2ooW5lCySU/0Irbo9h79X5
yzZBPd3acP81sBXtdlGX/2SJfVGahZiNkW2SKeO6LJ3fcyblO58TbH32eAyr
JkKAN8rbrUj/13Dpv1NbntmiMyFxBuM23dFuepfebft3OGz914bBLXjmGrA/
8rLTW26vRXVH9WI6/92gt6kBC2xiKM+CBtSJ4r/mMrBZB06Su4/nqbkRn1cg
XuT2O3F6YXxI38uvuSVOce8T3VTzt0Ki5o/8VO7b/kg0Q77Jsv1s/BEfbVwy
xpK4hr5YJ4UJ/YoAFkSfi5RarUvLFpKsTiru+1Yi7p4+2j/e70h170PcVVOo
aP/pMTFoF4wHz8yM/pzO2mcuVOPAsAolu+m7Zv0zadWuBYL4/VjaNSAwFhHj
max77qApXnfQXZMr2Ol2+/rp1DtwaIHdLjTYw52+xLj+pa+7Ae8XkdBrOMY6
FqP+bJWCxWdXHzdvXuFywNbIPrRdW+2nx9fgk94ke2xTjNAu4g9Q8i6wK346
c8XVXd26NBoEVYe/OKYedvmjWNMovqY734+vs/wWkjHjPId6vytdhybZ27gi
f7Rhu+flL6aV+pZ9ySK9NmJPo+wanFouSQxqap6xkMqOpw9d3r//8Wz/4nD8
8ugVlO9Z8DeUgr841/RDjkUfXA+ZWayu6oWzbWxGybv64a7mBZH6P13HUlZo
TwAA

-->

</rfc>
