<?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.31 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-schlesinger-privacypass-act-01" 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-01"/>
    <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="2026" month="February" day="13"/>
    <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>ACT takes a different approach. 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>Example use cases include privacy proxies, privately accessing web APIs such
as artificial intelligence models, and zero trust networks that 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>The following terms are used as defined in <xref target="ACT"/>: Credit, Token, Nullifier,
Scalar, Element, and Domain Separator.</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>Protocol messages are encoded using CBOR as specified in <xref section="4" sectionFormat="of" target="ACT"/>.</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>The CFRG ACT specification <xref target="ACT"/> includes <tt>request_context</tt> (ctx) as a
parameter in its cryptographic functions. Specifically:</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>: Takes <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 via an additional generator H4. The context scalar is included in
the BBS signature as <tt>H4 * ctx</tt>.</t>
          </li>
          <li>
            <t><strong>VerifyAndRefund</strong>: The <tt>request_context</tt> is included in the spend proof and
used to verify that the proof is bound to the correct application context. The
issuer reconstructs the context from the TokenChallenge and uses it during
verification and refund issuance.</t>
          </li>
          <li>
            <t><strong>Credential Structure</strong>: The Anonymous Credit Token includes the context-bound
component within the BBS signature via the H4 generator.</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>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>Note: The token type value 0xE5AD is provisional pending IANA assignment.</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>Origins <bcp14>SHOULD</bcp14> construct <tt>credential_context</tt> using time-based epochs (e.g.,
<tt>F(current time window)</tt> where F is a pseudorandom function) to enforce
credential expiration, or per-application binding values to isolate credential
usage across different services. The <tt>redemption_context</tt> <bcp14>SHOULD</bcp14> be set to a
fresh random value for each TokenChallenge to ensure token freshness, or left
empty when freshness is not required.</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)
t = <Origin-configured credits to return to the client>
refund = VerifyAndRefund(skI, spend_proof, t)
]]></artwork>
        <t>The parameter <tt>t</tt> controls how many of the spent credits are returned to
the client (0 &lt;= t &lt;= cost). Setting t = 0 consumes the full spend amount;
setting t &gt; 0 enables pre-authorization patterns where the origin holds
credits temporarily and returns unused ones. The origin determines <tt>t</tt>
based on its own policy (e.g., from the TokenChallenge or application
logic).</t>
        <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>MUST</bcp14> implement double-spend prevention that prevents a token with the same nonce from being redeemed twice.
With ACT, the Origin <bcp14>MUST</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>MUST</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>MUST</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 771?>

<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:
H4sIAOHbj2kAA8196XLcyJng/3yKHOpHk1JVSaTU7R7qGFOUZHHcorQk5Y4O
h1eFQiVJDFFALYAiu1otP8s+yz7ZfmceQJGSx+uI7XBYLBx5fPndF8bjsemK
rnT7dutDU1xn+dp+yNrWHrXtKqtyZz80dVfndWnP68YeVHW1XtSr1h42bl50
9qy+clW7ZbLZrHHX3zjI4dmWybPOXdTNet+23dyYeZ1X2QJWMW+y827c5pel
a4vqwjXjJY+4hAHHWd6NH+2adjVbFG1b1FW3XsJLR6/P3pi8rlpYy6rdt12z
cqZaLWau2TdzmGnfwNoem2tXreBvay+aerXctx9Ojv5ycPjLh4PTU7jIY8Ub
gIuLrCj3bbSGPxauO5/UzQXczJr8ct9edt2y3X/4EB/FK8W1m+hDD/HCw1lT
37TuoYwyXvLQF0V3uZrt29NssXLladjyQwYCbBaeKmH5bQeQ1WkGj094oElR
hxcffhWOk8tuUW4Zk626yxrAZMcwmbVFBfA7ndhofLrOp8NzD27CRrOq+C3r
4ET27Z/q+qJ0dMMx+NpsEa3kjxf0wCSvF8msZxP7zq2qIpnx7LKYZauyS27B
fPv2sKxX83OAuLNHVT6J56u7MR7AHzt5ebK6MqaqmwWs8JoQAHAQ0Gb8ajKE
U37eXAjsD04O46fWqyqFYpPzQ58+fOg/x6PoA2+Pzl4fnn08eb1vT94c/vv3
f/gBr388e3t6+Pb1O3/1D3D16PT048Hxob/2ozFFdR7Wbsbjsc1mbdfgGg3A
p7VAPauFqzrbLl1enBeutd2ls4WSX1bNLdCrWyzxhACbmRpbJEfTEQnbWda6
uYW7+OYtdG63AW47/v0JL2ZRzOdw3uYenEPX1PNVjrMY8/lzvPMvX+zctXlT
zGR1Cacguulc3q0aN6L1fv6skIA34QIO5wEWDfbtO8UtFrnOa2he3vzIFhM3
GcFQdess4OVy1QEwVogRdlYWMOjJ6YFti4sqwxXCelsP6zlgLyzu1NG27Q+2
PrfR0mHea9fAg9msdLaG0a4LBOyydat53cCC64U9X1X09mBgGwb+Ph14Yt+s
Gth7MyIIELBhOsBkt2A4FB0O19Z5kXU0GHDchmiUB+6dzjZdAVT+8mXHul87
B0PAyACQbAlwzGBghJddAEEV41XrBHMmiITfijKjDRuEB758GcHuzl0DKzbz
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

-->

</rfc>
