<?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 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-schlesinger-privacypass-act-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="Privacy Pass Issuance Protocol for ACT">Privacy Pass Issuance Protocol for Anonymous Credit Tokens</title>
    <seriesInfo name="Internet-Draft" value="draft-schlesinger-privacypass-act-00"/>
    <author initials="S." surname="Schlesinger" fullname="Samuel Schlesinger">
      <organization>Google</organization>
      <address>
        <email>samschlesinger@google.com</email>
      </address>
    </author>
    <author initials="T." surname="Meunier" fullname="Thibault Meunier">
      <organization>Cloudflare Inc.</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <date year="2025" month="October" day="20"/>
    <abstract>
      <?line 42?>

<t>This document specifies the issuance and redemption protocols for
tokens based on the Anonymous Credit Tokens (ACT) 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://SamuelSchlesinger.github.io/draft-act/draft-schlesinger-privacypass-act.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-schlesinger-privacypass-act/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        PRIVACYPASS Privacy Pass mailing list (<eref target="mailto:privacypass@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/privacy-pass"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/privacypass/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/SamuelSchlesinger/draft-act"/>.</t>
    </note>
  </front>
  <middle>
    <?line 47?>

<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 section="6" sectionFormat="of" target="ISSUANCE"/> or verifiable oblivious pseudorandom functions as specified in <xref section="5" sectionFormat="of" target="ISSUANCE"/>. Further, the <xref target="ARC"/> scheme and its associated integration in <xref target="ARCHITECTURE"/> (<xref target="ARC_PP"/>) extend these approaches to multi-use
tokens.</t>
      <t>The Anonymous Credit Tokens (ACT) protocol, as specified in <xref target="ACT"/>, offers a
differentiated approach to rate limiting from <xref target="ARC"/>. In particular,
a credential initially holding N credits, along with its subsequent refunded credentials,
can be presented up to N times. When a client spends a certain number of credits from
a credential, that credential is invalidated and the client receives a new credential
with the remaining balance.</t>
      <t>This document specifies the issuance and redemption protocols for ACT. <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 ACT is useful, one can use a similar example to
the one presented in <xref section="2" sectionFormat="of" target="ARC_PP"/>: a client that wishes to keep its IP address private while accessing a service. <xref target="ARC_PP"/> offers the origin to limit the number of requests a client can make to N. This is enforced by each origin getting its own presentation context, and limiting the number of presentations per context to N. This means that, from a single credential, a client
can produce N presentations and access the system N times,
unlinkably. These presentations can be generated in parallel.</t>
      <t>On the other hand, consider a credential initially holding N credits. A client redeeming
all N credits individually has to spend <tt>1</tt>, receive a refunded credential with N-1 credits,
spend <tt>1</tt> from that credential, receive a refunded credential with N-2 credits, and so on.
Because the client cannot spend from a credential until they receive the refunded credential
from their previous spend, a single live session is enforced per initial credential.
This provides concurrency control. A client is also able to spend more than <tt>1</tt> credit at once,
allowing for more efficient redemption of multiple credits.
Finally, as each new presentation requires obtaining a refunded credential from the previous spend,
the origin gains the ability to invalidate a session by declining to issue a refunded credential.
This creates the
ability to shed harmful future traffic or redirect it in a favorable way.</t>
      <t>One such use case for this is a privacy proxy, another is privately accessing
web APIs like the artificial intelligence models, and finally zero trust networks
which act as forward proxies for their user traffic.</t>
      <t>Therefore, ACT provides the following properties:</t>
      <ol spacing="normal" type="1"><li>
          <t>Concurrency control: Preventing multiple simultaneous uses of the same
credential, mitigating abuse from credential sharing or replay.</t>
        </li>
        <li>
          <t>Dynamic Revocation: Enabling immediate invalidation of credentials in response to
origin policy, without waiting for credential expiry.</t>
        </li>
        <li>
          <t>Per-Session Rate Limiting: Enforcing access policies that adapt to user,
device, or risk context, rather than static per-credential limits. This creates incentives
for platforms to deploy such methods.</t>
        </li>
      </ol>
    </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>OPEN ISSUE: Consider taking them from <xref target="ACT"/></t>
      <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 Credit Tokens (ACT) protocol. ACT credentials can be thought of as
single use credentials, similar to the RSA Blind Signatures protocol. However,
by another viewpoint, they might be thought of as stateful, multi-use credentials.</t>
      <t>With ACT, Clients receive TokenChallenge inputs from the redemption protocol
(<xref section="2.1" sectionFormat="comma" target="AUTHSCHEME"/>). If they have a valid ACT 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 an
ACT 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="288" width="544" viewBox="0 0 544 288" 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,272" 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 216,256 L 216,272" fill="none" stroke="black"/>
              <path d="M 256,48 L 256,80" fill="none" stroke="black"/>
              <path d="M 312,32 L 312,80" 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,272" fill="none" stroke="black"/>
              <path d="M 512,48 L 512,80" fill="none" stroke="black"/>
              <path d="M 536,48 L 536,80" fill="none" stroke="black"/>
              <path d="M 312,32 L 520,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 328,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 40,128 L 208,128" fill="none" stroke="black"/>
              <path d="M 288,128 L 464,128" fill="none" stroke="black"/>
              <path d="M 48,144 L 176,144" fill="none" stroke="black"/>
              <path d="M 312,144 L 472,144" fill="none" stroke="black"/>
              <path d="M 48,174 L 72,174" fill="none" stroke="black"/>
              <path d="M 48,178 L 72,178" fill="none" stroke="black"/>
              <path d="M 184,174 L 208,174" fill="none" stroke="black"/>
              <path d="M 184,178 L 208,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 40,240 L 128,240" fill="none" stroke="black"/>
              <path d="M 272,240 L 464,240" fill="none" stroke="black"/>
              <path d="M 48,256 L 128,256" fill="none" stroke="black"/>
              <path d="M 328,256 L 472,256" fill="none" stroke="black"/>
              <path d="M 520,32 C 528.83064,32 536,39.16936 536,48" fill="none" stroke="black"/>
              <path d="M 328,96 C 319.16936,96 312,88.83064 312,80" fill="none" stroke="black"/>
              <path d="M 520,96 C 528.83064,96 536,88.83064 536,80" 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="216,176 204,170.4 204,181.6" fill="black" transform="rotate(0,208,176)"/>
              <polygon class="arrowhead" points="56,256 44,250.4 44,261.6" fill="black" transform="rotate(180,48,256)"/>
              <polygon class="arrowhead" points="56,208 44,202.4 44,213.6" fill="black" transform="rotate(180,48,208)"/>
              <polygon class="arrowhead" points="56,176 44,170.4 44,181.6" fill="black" transform="rotate(180,48,176)"/>
              <polygon class="arrowhead" points="56,144 44,138.4 44,149.6" fill="black" transform="rotate(180,48,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="172" y="260">Response</text>
                <text x="272" y="260">TokenRefund</text>
                <text x="376" y="276">|</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
                                      +--------------------------.
+--------+          +----------+      |  +--------+   +--------+  |
| Client |          | Attester |      |  | Issuer |   | Origin |  |
+---+----+          +-----+----+      |  +----+---+   +---+----+  |
    |                     |            `------|-----------|------'
    |                     |                   |           |
    +--------------------- Request ---------------------->|
    |<---------------- TokenChallenge --------------------+
    |                     |                   |           |
    |<=== Attestation ===>|                   |           |
    +----------- CredentialRequest ---------->|           |
    |<---------- CredentialResponse ----------+           |
    |                     |                   |           |
    +----------- Request + Token ------------------------>|
    |<---------- Response + TokenRefund ------------------+
    |                     |                   |           |
]]></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>ACT 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="ACT"/>.</t>
    </section>
    <section anchor="state-management">
      <name>Client State Management</name>
      <section anchor="credential-lifecycle-and-distributed-transactions">
        <name>Credential Lifecycle and Distributed Transactions</name>
        <t>ACT credentials follow a distributed transaction model where each spend operation
creates a two-phase interaction between the client and the origin:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Spend Phase</strong>: The client commits to spending a credential by generating a spend
proof containing a nullifier. At this point, the credential <bcp14>MUST</bcp14> be considered
invalid and cannot be reused.</t>
          </li>
          <li>
            <t><strong>Refund Phase</strong>: The origin verifies the spend proof and, if valid, returns a
refund that allows the client to construct a new credential with the remaining
balance.</t>
          </li>
        </ol>
        <t>This two-phase model is critical for ACT's concurrency control properties. Because
a credential becomes invalid immediately upon spend (before the refund is received),
a client cannot perform multiple concurrent spend operations with the same credential.
This enforces a strict serialization of operations per credential chain.</t>
      </section>
      <section anchor="client-state-transitions">
        <name>Client State Transitions</name>
        <t>A client managing an ACT credential progresses through the following states:</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="288" width="440" viewBox="0 0 440 288" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 8,128 L 8,160" fill="none" stroke="black"/>
              <path d="M 8,224 L 8,256" fill="none" stroke="black"/>
              <path d="M 48,64 L 48,120" fill="none" stroke="black"/>
              <path d="M 48,160 L 48,216" fill="none" stroke="black"/>
              <path d="M 96,32 L 96,64" fill="none" stroke="black"/>
              <path d="M 96,128 L 96,160" fill="none" stroke="black"/>
              <path d="M 96,224 L 96,256" fill="none" stroke="black"/>
              <path d="M 8,32 L 96,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 96,64" fill="none" stroke="black"/>
              <path d="M 8,128 L 96,128" fill="none" stroke="black"/>
              <path d="M 8,160 L 96,160" fill="none" stroke="black"/>
              <path d="M 8,224 L 96,224" fill="none" stroke="black"/>
              <path d="M 8,256 L 96,256" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="56,216 44,210.4 44,221.6" fill="black" transform="rotate(90,48,216)"/>
              <polygon class="arrowhead" points="56,120 44,114.4 44,125.6" fill="black" transform="rotate(90,48,120)"/>
              <g class="text">
                <text x="56" y="52">Initial</text>
                <text x="160" y="52">(Credential</text>
                <text x="228" y="52">with</text>
                <text x="256" y="52">N</text>
                <text x="300" y="52">credits)</text>
                <text x="148" y="100">ProveSpend(credential,</text>
                <text x="264" y="100">cost)</text>
                <text x="56" y="148">Spent</text>
                <text x="148" y="148">(Waiting</text>
                <text x="200" y="148">for</text>
                <text x="248" y="148">refund,</text>
                <text x="324" y="148">credential</text>
                <text x="404" y="148">invalid)</text>
                <text x="172" y="196">ConstructRefundToken(refund)</text>
                <text x="52" y="244">Refunded</text>
                <text x="132" y="244">(New</text>
                <text x="196" y="244">credential</text>
                <text x="260" y="244">with</text>
                <text x="308" y="244">N-cost</text>
                <text x="372" y="244">credits)</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
   +----------+
   |  Initial |  (Credential with N credits)
   +----+-----+
        |
        | ProveSpend(credential, cost)
        v
   +----------+
   |   Spent  |  (Waiting for refund, credential invalid)
   +----+-----+
        |
        | ConstructRefundToken(refund)
        v
   +----------+
   | Refunded |  (New credential with N-cost credits)
   +----------+
]]></artwork>
        </artset>
        <t>State transitions:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Initial</strong>: Client holds a valid credential with N credits (N &gt; 0). The credential
can be spent.</t>
          </li>
          <li>
            <t><strong>Spent</strong>: Client has generated a spend proof and sent it to the origin. The
original credential is now invalid and <bcp14>MUST NOT</bcp14> be used again. The client is
blocked waiting for a refund response.</t>
          </li>
          <li>
            <t><strong>Refunded</strong>: Client has received a valid refund and constructed a new credential
with the remaining balance. If the new balance is greater than 0, the client
returns to the Initial state with the new credential. If the balance is 0, the
credential is exhausted.</t>
          </li>
        </ul>
        <t>The transition from Spent to Refunded may fail if the origin does not provide a
valid refund. Error handling for this case is described in <xref target="error-handling"/>.</t>
      </section>
      <section anchor="concurrency-control-through-blocking">
        <name>Concurrency Control Through Blocking</name>
        <t>The key insight enabling ACT's concurrency control is that each credential instance
can only be in one state at a time. When a client calls ProveSpend, it must
immediately transition the credential to the Spent state, making it unavailable for
any other operations. The client cannot perform another spend until it receives a
refund and transitions to the Refunded state with a new credential instance.</t>
        <t>This blocking behavior prevents credential sharing and concurrent usage:</t>
        <ul spacing="normal">
          <li>
            <t>If a malicious party attempts to copy a credential and use it elsewhere, only one
spend operation can succeed (whichever reaches the origin first). The second spend
will be rejected as a double-spend when the origin checks the nullifier.</t>
          </li>
          <li>
            <t>Even if a single client attempts to perform concurrent spends with the same
credential, the first spend invalidates the credential, preventing the second.</t>
          </li>
        </ul>
        <t>The origin can enforce session behavior by declining to issue a refund, effectively
terminating the credential chain and preventing further operations.</t>
      </section>
      <section anchor="multiple-credential-management">
        <name>Multiple Credential Management</name>
        <t>Clients <bcp14>MAY</bcp14> maintain multiple independent credential chains simultaneously. This is
useful when credentials are bound to different contexts via the credential_context
field (<xref target="token-challenge-requirements"/>).</t>
        <t>Example: A client might hold:</t>
        <ul spacing="normal">
          <li>
            <t>Credential A: Bound to issuer1.example, origin1.example, credential_context =
"session-2024-01", with 100 credits</t>
          </li>
          <li>
            <t>Credential B: Bound to issuer1.example, origin2.example, credential_context =
"session-2024-01", with 50 credits</t>
          </li>
          <li>
            <t>Credential C: Bound to issuer1.example, origin1.example, credential_context =
"session-2024-02", with 75 credits</t>
          </li>
        </ul>
        <t>Each credential chain operates independently with its own state machine. A spend
operation on Credential A does not affect Credentials B or C. The client can perform
spend operations on different credentials concurrently, but each individual credential
chain is strictly serialized through the spend-refund cycle.</t>
        <t>When the client receives a <tt>TokenChallenge</tt>, it determines which credential to use
based on the challenge's <tt>issuer_name</tt>, <tt>origin_info</tt>, and <tt>credential_context</tt> fields.
If no matching credential exists or all matching credentials are in the <tt>Spent</tt> state
(awaiting refund), the client <bcp14>SHOULD</bcp14> either wait for a refund or request a new
credential through the issuance protocol.</t>
      </section>
      <section anchor="error-handling">
        <name>Error Handling</name>
        <section anchor="delayed-or-missing-refunds">
          <name>Delayed or Missing Refunds</name>
          <t>After a client sends a spend proof to the origin, the client must wait for the
corresponding refund before it can continue using the credential chain. The spent
credential instance is immediately invalid and <bcp14>MUST NOT</bcp14> be reused.</t>
          <t>Origins <bcp14>MAY</bcp14> retain spend proof state and serve delayed refund requests after service
interruptions or failures. This allows credential chains to resume even if the initial
refund response was not delivered due to network issues or temporary service outages.</t>
          <t>However, origins <bcp14>MAY</bcp14> also implement a timeout after which they delete stored refund
state. If a client's refund request arrives after this timeout, the origin will be
unable to provide the refund, effectively terminating that credential chain. Clients
in this situation will need to request a new credential through the issuance protocol
(<xref target="credential-issuance-protocol"/>) to continue accessing the origin.</t>
        </section>
      </section>
    </section>
    <section anchor="setup">
      <name>Configuration</name>
      <t>ACT Issuers are configured with key material used for issuance and credential
verification. Concretely, Issuers run the <tt>KeyGen</tt> function from <xref target="ACT"/>
to produce a private and public key, denoted skI and pkI, respectively.</t>
      <artwork><![CDATA[
skI, pkI = KeyGen()
]]></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 <xref section="4.1" sectionFormat="of" target="ACT"/>.</t>
      <t>OPEN ISSUE: Coordinate with <xref target="ACT"/> specification authors on the serialization format (CBOR vs TLS presentation language) to ensure consistency.</t>
      <section anchor="request-context-extension">
        <name>Request Context Extension</name>
        <t>This Privacy Pass integration binds credentials to application-specific contexts
using a <tt>request_context</tt> parameter. This approach is inspired by the Anonymous
Rate-Limited Credentials (ARC) protocol <xref target="ARC_PP"/>, which threads a similar
context parameter through its cryptographic operations for domain separation.</t>
        <t>IMPORTANT: The current CFRG ACT specification <xref target="ACT"/> does not include
<tt>request_context</tt> parameters in its cryptographic functions. To support the
Privacy Pass integration described in this document, the ACT specification would
need to be extended with the following changes:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>IssueRequest</strong>: No changes needed - the client generates a blinded commitment
without knowledge of the final context binding.</t>
          </li>
          <li>
            <t><strong>IssueResponse</strong>: Add <tt>request_context</tt> as an input parameter alongside the
credit amount <tt>c</tt>. The issuer determines the appropriate context based on its
policy (e.g., derived from TokenChallenge fields) and binds the credential to
this context. The function would hash the context into a scalar and include it
in the credential signature, similar to how ARC hashes <tt>requestContext</tt> into <tt>m2</tt>.</t>
          </li>
          <li>
            <t><strong>VerifyAndRefund</strong>: Add <tt>request_context</tt> as an input parameter to verify
that the spend proof is bound to the correct application context. The issuer
reconstructs the context from the TokenChallenge and uses it during verification.</t>
          </li>
          <li>
            <t><strong>Credential Structure</strong>: The Anonymous Credit Token structure would be extended
to include the context-bound component within the BBS signature, analogous to
how ARC credentials include <tt>m2</tt> for presentation context binding.</t>
          </li>
        </ol>
        <t>The key insight is that <tt>request_context</tt> is determined by the issuer (like the
credit amount), not by the client. The issuer sets the context during IssueResponse
based on the TokenChallenge requirements, and both parties reconstruct it from
TokenChallenge fields during spending.</t>
        <t>Until these extensions are incorporated into the CFRG ACT specification, the
function calls in this document should be understood as describing the intended
behavior with request_context support. Implementations <bcp14>SHOULD</bcp14> coordinate with
the CFRG ACT specification authors to ensure compatibility.</t>
        <t>For reference on how request context threading works in practice, see
<xref section="3" sectionFormat="of" target="ARC_PP"/>, which demonstrates the pattern of binding credentials
to application-specific contexts through cryptographic commitments.</t>
      </section>
    </section>
    <section anchor="token-challenge-requirements">
      <name>Token Challenge Requirements</name>
      <t>The ACT 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 = 0xE5AD; /* Type ACT(Ristretto255) */
    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>OPEN ISSUE: This token type value (0xE5AD) was chosen arbitrarily and may be too close to the ARC token type. This should be coordinated with IANA registry assignments.</t>
      <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 the 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 rejected.</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>"cost", which contains a JSON number indicating the amount of credits to
spend out of the ACT credential.</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 credentials 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>IssueRequest</tt>
function from <xref target="ACT"/> as follows:</t>
        <artwork><![CDATA[
(clientSecrets, request) = IssueRequest()
]]></artwork>
        <t>The Client then creates a TokenRequest structure as follows:</t>
        <artwork><![CDATA[
struct {
  uint16_t token_type = 0xE5AD; /* Type ACT(Ristretto255) */
  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 <xref section="4.1.1" sectionFormat="of" target="ACT"/>.</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 0xE5AD.</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 <xref section="4.1.1" sectionFormat="of" target="ACT"/>, 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 determines both the number of initial credits and the
request_context based on its policy (e.g., based on attestation results, payment
verification, or TokenChallenge requirements). The request_context binds the
credential to the specific application context:</t>
        <artwork><![CDATA[
request_context = concat(tokenChallenge.issuer_name,
  tokenChallenge.origin_info,
  tokenChallenge.credential_context,
  issuer_key_id)
response = IssueResponse(skI, request, initial_credits, request_context)
]]></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 <xref section="4.1.2" sectionFormat="of" target="ACT"/>.</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 <xref section="4.1.2" sectionFormat="of" target="ACT"/>
yielding <tt>response</tt>. If deserialization fails, the Client aborts the protocol.
Otherwise, the Client processes the response as follows:</t>
        <artwork><![CDATA[
credential = VerifyIssuance(pkI, request, response, clientSecrets)
]]></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 cost
values from <xref section="2.1" sectionFormat="comma" target="AUTHSCHEME"/>; the cost 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 cost,
denoted <tt>cost</tt>, and a previously obtained credential that is valid
for the Issuer identifier in the challenge, denoted <tt>credential</tt>, containing at
least <tt>cost</tt> credits, Clients compute a spend request as follows:</t>
        <artwork><![CDATA[
spend_proof, state = ProveSpend(credential, cost)
]]></artwork>
        <t>Each credential instance <bcp14>MUST</bcp14> only ever be used for a single spend request. When the client
receives the refunded credential from the server, the client uses that new credential instance
for the next spend. If the same credential instance is used more than once, the privacy
assumptions of ACT are violated by presenting the same nullifier twice.</t>
        <t>The resulting Token value is then constructed as follows:</t>
        <artwork><![CDATA[
struct {
    uint16_t token_type = 0xE5AD; /* Type ACT(Ristretto255) */
    uint8_t challenge_digest[32];
    uint8_t issuer_key_id[Nid];
    uint8_t encoded_spend_proof[Nspend_proof];
} 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 0xE5AD.</t>
          </li>
          <li>
            <t>"challenge_digest" is a 32-octet value containing the hash of the original TokenChallenge, SHA-256(TokenChallenge).</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>"encoded_spend_proof" is a Nspend_proof-octet encoded spend proof, set to the serialized
<tt>spend_proof</tt> value as specified in <xref section="4.1.3" sectionFormat="of" target="ACT"/>. The spend proof contains
the nullifier (field 1) and spend amount (field 2), among other cryptographic values.</t>
          </li>
        </ul>
      </section>
      <section anchor="refund">
        <name>Token Refund</name>
        <t>Upon receiving a Token from the Client, the Origin deserializes the spend_proof
according to <xref section="4.1.3" sectionFormat="of" target="ACT"/>, yielding a SpendProofMsg structure. The
Origin then extracts the relevant fields from the spend proof:</t>
        <artwork><![CDATA[
// Extract fields from SpendProofMsg (see Section 4.1.3 of ACT)
nullifier = spend_proof.k      // Field 1: nullifier (32 bytes)
spend_amount = spend_proof.s   // Field 2: spend amount (32 bytes)
]]></artwork>
        <t>The Origin <bcp14>SHOULD</bcp14> verify that the spend_amount matches the requested cost from
TokenChallenge to ensure the client is spending the expected amount.</t>
        <t>To verify the Token and issue a refund, the Origin constructs the request_context
and invokes VerifyAndRefund:</t>
        <artwork><![CDATA[
request_context = concat(tokenChallenge.issuer_name,
  tokenChallenge.origin_info,
  tokenChallenge.credential_context,
  issuer_key_id)
refund = VerifyAndRefund(skI, request_context, spend_proof)
]]></artwork>
        <t>This function returns the <tt>refund</tt> serialized according to <xref section="4.1.4" sectionFormat="of" target="ACT"/> if the spend proof is valid, and nil otherwise.</t>
        <t>As mentioned in <xref section="2.2.2" sectionFormat="of" target="AUTHSCHEME"/>, Origins <bcp14>SHOULD</bcp14> implement some form of double-spend prevention that prevents a token with the same nonce from being redeemed twice.
With ACT, the Origin <bcp14>SHOULD</bcp14> check that the nullifier has not previously been seen before calling VerifyAndRefund. It then stores the nullifier
for  use in future double-spending checks.
To reduce the overhead of performing double spend checks, the Origin <bcp14>MAY</bcp14> store and
look up the nullifiers corresponding to the associated request_context value.</t>
        <artwork><![CDATA[
struct {
    uint8_t refund[Nrefund];
} Refund;
]]></artwork>
        <t>The Origin sends the refund back to the client encoded as the above <tt>Refund</tt> struct.</t>
      </section>
      <section anchor="new-credential-from-refund">
        <name>New Credential from Refund</name>
        <t>Unlike <xref target="ARC"/>, clients must construct a new credential instance based on the <tt>Refund</tt> response. To do
so, clients invoke the <tt>ConstructRefundToken</tt> function from <xref section="3.4.4" sectionFormat="of" target="ACT"/> as follows:</t>
        <artwork><![CDATA[
credential = ConstructRefundToken(pkI, spend_proof, refund, state)
]]></artwork>
        <t>The client then uses this new credential instance for subsequent spend operations.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <section anchor="privacy-properties">
        <name>Privacy Properties</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 ACT
requires a joint Origin and Issuer configuration (where the Issuer and Origin are operated
by the same entity) given that tokens produced from credentials are not publicly verifiable.</t>
        <t>ACT credentials offer Origin-Client unlinkability, Issuer-Client unlinkability, and
redemption context unlinkability, as described in <xref section="3.3" sectionFormat="of" target="ARCHITECTURE"/>. The
cryptographic security properties of the underlying ACT protocol, including unforgeability
and unlinkability guarantees, are analyzed in <xref target="ACT"/>.</t>
      </section>
      <section anchor="double-spend-prevention">
        <name>Double-Spend Prevention</name>
        <t><xref section="2.2.2" sectionFormat="of" target="AUTHSCHEME"/> specifies double spending requirements that Origin <bcp14>SHOULD</bcp14>
follow.</t>
        <t>For ACT, the double-spend prevention mechanism relies on Origins maintaining
state to track nullifiers. As described in <xref target="refund"/>, Origins <bcp14>SHOULD</bcp14> check that a nullifier
has not been previously seen before accepting a spend proof. This check is critical for
preventing credential reuse attacks.</t>
        <t>The nullifier space is large (32 bytes), making random collisions computationally
unlikely. However, Origins <bcp14>SHOULD</bcp14> ensure that their nullifier storage is persistent and
survives server restarts. If an Origin loses nullifier state (e.g., due to data loss or
cache eviction), it becomes vulnerable to replay attacks where an attacker can resubmit
previously spent credentials during the credential validity period.</t>
        <t>Origins <bcp14>MAY</bcp14> scope nullifier storage by request_context to improve lookup performance
and enable efficient storage management. Since nullifiers are only meaningful within the
context of a specific credential binding (determined by <tt>issuer_name</tt>, <tt>origin_info</tt>,
<tt>credential_context</tt>, and <tt>issuer_key_id</tt>), Origins can partition nullifier storage accordingly.</t>
        <t>When an Origin implements a timeout for refund state (as described in <xref target="error-handling"/>),
it <bcp14>MAY</bcp14> also expire the corresponding nullifier after the same timeout period, provided
that no future spend attempts with that nullifier are possible.</t>
      </section>
      <section anchor="concurrency-control-and-credential-sharing">
        <name>Concurrency Control and Credential Sharing</name>
        <t>The state machine described in <xref target="state-management"/> enforces that each credential instance
can only be spent once. This prevents multiple parties from using the same credential
concurrently, which is critical for preventing credential sharing attacks.</t>
        <t>If an attacker copies a credential and attempts to use it from multiple locations
simultaneously, only the first spend operation to reach the Origin will succeed. The
Origin's nullifier check will reject all subsequent spends with the same credential as
double-spend attempts. This property holds even if the spend operations occur in parallel
from different network locations.</t>
        <t>Clients <bcp14>MUST</bcp14> implement the state machine correctly and transition credentials to the Spent
state immediately upon calling ProveSpend. A client implementation that allows multiple
concurrent ProveSpend calls on the same credential would enable double-spend attempts and
violate ACT's privacy guarantees by revealing that the same credential is being used
multiple times.</t>
      </section>
      <section anchor="issuer-key-identification">
        <name>Issuer Key Identification</name>
        <t>As described in <xref target="credential-issuance-protocol"/>, the TokenRequest includes only a
truncated issuer_key_id (the least significant byte) to prevent Issuers from using the
key identifier as a client tracking mechanism.</t>
        <t>Issuers <bcp14>MUST</bcp14> prevent truncated key ID collisions among simultaneously active keys. This
can be accomplished by generating keys until the truncated key ID does not collide with
any existing active key's truncated ID. With a 1-byte (256 value) truncated key space,
this is straightforward for reasonable numbers of concurrent keys.</t>
        <t>Additionally, Issuers <bcp14>SHOULD</bcp14> limit the total number of simultaneously active keys for
privacy reasons, as a large number of active keys can enable partitioning attacks.</t>
      </section>
      <section anchor="dynamic-revocation-and-origin-control">
        <name>Dynamic Revocation and Origin Control</name>
        <t>ACT's design allows Origins to terminate credential chains by declining to issue refunds.
While this enables the dynamic revocation property described in <xref target="motivation"/>, it also
gives Origins significant control over client access.</t>
        <t>Clients have no cryptographic recourse if an Origin refuses to provide refunds after
accepting valid spend proofs. This is an intentional design property that enables Origins
to enforce access policies and shed abusive traffic, but it does mean that clients must
trust Origins to behave correctly within the protocol.</t>
        <t>Clients <bcp14>MAY</bcp14> implement reputation systems or other mechanisms to track Origin behavior and
avoid Origins that consistently fail to provide refunds. However, such mechanisms are
outside the scope of this specification.</t>
      </section>
    </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: 0xE5AD</t>
        </li>
        <li>
          <t>Name: ACT (Ristretto255)</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-normative-references">
      <name>Normative References</name>
      <reference anchor="ACT">
        <front>
          <title>Anonymous Credit Tokens</title>
          <author fullname="Samuel Schlesinger" initials="S." surname="Schlesinger">
            <organization>Google</organization>
          </author>
          <author fullname="Jonathan Katz" initials="J." surname="Katz">
            <organization>Google</organization>
          </author>
          <date day="18" month="August" year="2025"/>
          <abstract>
            <t>   This document specifies Anonymous Credit Tokens (ACT), a privacy-
   preserving authentication protocol that enables numerical credit
   systems without tracking individual clients.  Based on keyed-
   verification anonymous credentials and privately verifiable BBS-style
   signatures, the protocol allows issuers to grant tokens containing
   credits that clients can later spend anonymously with that issuer.

   The protocol's key features include: (1) unlinkable transactions -
   the issuer cannot correlate credit issuance with spending, or link
   multiple spends by the same client, (2) partial spending - clients
   can spend a portion of their credits and receive anonymous change,
   and (3) double-spend prevention through cryptographic nullifiers that
   preserve privacy while ensuring each token is used only once.

   Anonymous Credit Tokens are designed for modern web services
   requiring rate limiting, usage-based billing, or resource allocation
   while respecting user privacy.  Example applications include rate
   limiting and API credits.

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

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-schlesinger-cfrg-act-00"/>
      </reference>
      <reference anchor="ARC">
        <front>
          <title>Privacy Pass Issuance Protocol for 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="20" month="October" year="2025"/>
          <abstract>
            <t>   This document specifies the issuance and redemption protocols for
   tokens based on the Anonymous Rate-Limited Credential (ARC) protocol.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-yun-privacypass-arc-02"/>
      </reference>
      <reference anchor="ARC_PP">
        <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="6" month="August" 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-01"/>
      </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="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>
    <?line 758?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank Cathie Yun, Thibault Meunier, and Chris Wood.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
hgAA

-->

</rfc>
