<?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-cfrg-act-01" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="ACT">Anonymous Credit Tokens</title>
    <seriesInfo name="Internet-Draft" value="draft-schlesinger-cfrg-act-01"/>
    <author fullname="Samuel Schlesinger">
      <organization>Google</organization>
      <address>
        <email>samschlesinger@google.com</email>
      </address>
    </author>
    <author fullname="Jonathan Katz">
      <organization>Google</organization>
      <address>
        <email>jkcrypto@google.com</email>
      </address>
    </author>
    <date year="2026" month="February" day="13"/>
    <abstract>
      <?line 64?>

<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.</t>
      <t>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.</t>
      <t>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.</t>
      <t>This document is a product of the Crypto Forum Research Group (CFRG)
in the IRTF.</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-cfrg-act.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-schlesinger-cfrg-act/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Crypto Forum Research Group mailing list (<eref target="mailto:cfrg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cfrg"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cfrg/"/>.
      </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 89?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Modern web services face a fundamental tension between operational
needs and user privacy. Services need to implement rate limiting to
prevent abuse, charge for API usage to sustain operations, and
allocate computational resources fairly. However, traditional
approaches require tracking client identities and creating detailed
logs of client behavior, raising significant privacy concerns in an
era of increasing data protection awareness and regulation.</t>
      <t>Anonymous Credit Tokens (ACT) help to resolve this tension by
providing a cryptographic protocol that enables credit-based systems
without client tracking. Built on keyed-verification anonymous
credentials <xref target="KVAC"/> and privately verifiable BBS-style signatures
<xref target="BBS"/>, the protocol allows services to issue, track, and spend
credits while maintaining client privacy.</t>
      <section anchor="key-properties">
        <name>Key Properties</name>
        <t>The protocol provides four essential properties that make it
suitable for privacy-preserving credit systems:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Unlinkability</strong>: The issuer cannot link credit issuance to
spending, or connect multiple transactions by the same client.
This property is information-theoretic, not merely computational.</t>
          </li>
          <li>
            <t><strong>Partial Spending</strong>: Clients can spend any amount up to their
balance and receive anonymous change without revealing their
previous or current
balance, enabling flexible spending.</t>
          </li>
          <li>
            <t><strong>Double-Spend Prevention</strong>: Cryptographic nullifiers ensure each
token is used only once, without linking it to issuance.</t>
          </li>
          <li>
            <t><strong>Balance Privacy</strong>: During spending, only the amount being spent
is revealed, not the total balance in the token, protecting
clients from balance-based profiling.</t>
          </li>
        </ol>
      </section>
      <section anchor="use-cases">
        <name>Use Cases</name>
        <t>Anonymous Credit Tokens can be applied to various scenarios:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Rate Limiting</strong>: Services can issue daily credit allowances that
clients spend anonymously for API calls or resource access.</t>
          </li>
          <li>
            <t><strong>API Credits</strong>: API providers can sell credit packages that
developers use to pay for API requests without creating a detailed
usage history linked to their identity. This enables:  </t>
            <ul spacing="normal">
              <li>
                <t>Pre-paid API access without requiring credit cards for each
transaction</t>
              </li>
              <li>
                <t>Anonymous API usage for privacy-sensitive applications</t>
              </li>
              <li>
                <t>Usage-based billing without tracking individual request patterns</t>
              </li>
              <li>
                <t>Protection against competitive analysis through usage monitoring</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="protocol-overview">
        <name>Protocol Overview</name>
        <t>The protocol involves two parties: an issuer (typically a service
provider) and clients (typically users of the service). The
interaction follows three main phases:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Setup</strong>: The issuer generates a key pair and publishes the
public key.</t>
          </li>
          <li>
            <t><strong>Issuance</strong>: A client requests credits from the issuer. The
issuer creates a blind signature on the credit value and a
client-chosen nullifier, producing a credit token.</t>
          </li>
          <li>
            <t><strong>Spending</strong>: To spend credits, the client reveals a nullifier
and proves possession of a valid token associated with that
nullifier having sufficient balance. The issuer verifies the
proof, checks the nullifier hasn't been used before, and issues a
new token (which remains hidden from the issuer) for any remaining
balance.</t>
          </li>
        </ol>
      </section>
      <section anchor="design-goals">
        <name>Design Goals</name>
        <t>The protocol is designed with the following goals:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Privacy</strong>: Unlinkability between issuance and spending; see the Security
Properties section for the formal definition.</t>
          </li>
          <li>
            <t><strong>Security</strong>: Clients cannot spend more credits than they possess or use the
same credits multiple times.</t>
          </li>
          <li>
            <t><strong>Efficiency</strong>: All operations should be computationally efficient, with
performance characteristics suitable for high-volume web services and a
large number of applications.</t>
          </li>
          <li>
            <t><strong>Simplicity</strong>: The protocol should be straightforward to implement and
integrate into existing systems relative to other comparable solutions.</t>
          </li>
        </ul>
      </section>
      <section anchor="relation-to-existing-work">
        <name>Relation to Existing Work</name>
        <t>This protocol builds upon several cryptographic primitives:</t>
        <ul spacing="normal">
          <li>
            <t><strong>BBS Signatures</strong> <xref target="BBS"/>: The core signature scheme that enables efficient
proofs of possession. We use a variant that is privately verifiable, which
avoids the need for pairings and makes our protocol more efficient.</t>
          </li>
          <li>
            <t><strong>Sigma Protocols</strong> <xref target="ORRU-SIGMA"/>: The zero-knowledge proof framework used
for spending proofs.</t>
          </li>
          <li>
            <t><strong>Fiat-Shamir Transform</strong> <xref target="ORRU-FS"/>: The technique to make the interactive
proofs non-interactive.</t>
          </li>
        </ul>
        <t>The protocol can be viewed as a specialized instantiation of keyed-verification
anonymous credentials <xref target="KVAC"/> optimized for numerical values and partial
spending.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</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?>

<section anchor="notation">
        <name>Notation</name>
        <t>This document uses the following notation:</t>
        <ul spacing="normal">
          <li>
            <t><tt>||</tt>: Concatenation of byte strings</t>
          </li>
          <li>
            <t><tt>x &lt;- S</tt>: Sampling x uniformly from the set S</t>
          </li>
          <li>
            <t><tt>x := y</tt>: Assignment of the value y to the variable x</t>
          </li>
          <li>
            <t><tt>[n]</tt>: The set of integers {0, 1, ..., n-1}</t>
          </li>
          <li>
            <t><tt>|x|</tt>: The length of byte string x</t>
          </li>
          <li>
            <t><tt>0x</tt> prefix: Hexadecimal values</t>
          </li>
          <li>
            <t>We use additive notation for group operations, so group elements are added
together like <tt>a + b</tt> and scalar multiplication of a group element by a scalar
is written as <tt>a * n</tt>, with group element <tt>a</tt> and scalar <tt>n</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="data-types">
        <name>Data Types</name>
        <t>The protocol uses the following data types:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Scalar</strong>: An integer modulo the group order q</t>
          </li>
          <li>
            <t><strong>Element</strong>: An element of the Ristretto255 group</t>
          </li>
          <li>
            <t><strong>ByteString</strong>: A sequence of bytes</t>
          </li>
        </ul>
      </section>
      <section anchor="cryptographic-parameters">
        <name>Cryptographic Parameters</name>
        <t>The protocol uses the Ristretto group <xref target="RFC9496"/>, which provides a prime-order
group abstraction over Curve25519. It would be easy to adapt this approach to
using any other prime order group based on the contents of this document. The
key parameters are:</t>
        <ul spacing="normal">
          <li>
            <t><strong>q</strong>: The prime order of the group (2^252 + 27742317777372353535851937790883648493)</t>
          </li>
          <li>
            <t><strong>G</strong>: The standard generator of the Ristretto group</t>
          </li>
          <li>
            <t><strong>L</strong>: The bit length for credit values</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="protocol-specification">
      <name>Protocol Specification</name>
      <section anchor="system-parameters">
        <name>System Parameters</name>
        <t>The protocol requires the following system parameters:</t>
        <artwork><![CDATA[
Parameters:
  - G: Generator of the Ristretto group
  - H1, H2, H3, H4: Additional generators for commitments
  - L: Bit length for credit values (configurable, must satisfy 1 <= L <= 128)
]]></artwork>
        <t>Implementations <bcp14>MUST</bcp14> enforce 1 &lt;= L &lt;= 128. See the Parameter Selection
section for the rationale behind this constraint.</t>
        <t>The generators H1, H2, H3, and H4 <bcp14>MUST</bcp14> be generated deterministically from a
nothing-up-my-sleeve value to ensure they are independent of each other and of
G. This prevents attacks whereby malicious parameters could compromise security. Note that these generators are independent of the choice of L.</t>
        <artwork><![CDATA[
GenerateParameters(domain_separator):
  Input:
    - domain_separator: ByteString identifying the deployment
  Output:
    - params: System parameters (H1, H2, H3, H4)

  Steps:
    1. seed = BLAKE3(LengthPrefixed(domain_separator))
    2. counter = 0
    3. H1 = HashToRistretto255(seed, counter++)
    4. H2 = HashToRistretto255(seed, counter++)
    5. H3 = HashToRistretto255(seed, counter++)
    6. H4 = HashToRistretto255(seed, counter++)
    7. return (H1, H2, H3, H4)

HashToRistretto255(seed, counter):
  Input:
    - seed: 32-byte seed value
    - counter: Integer counter for domain separation
  Output:
    - P: A valid Ristretto255 point

  Steps:
    1. hasher = BLAKE3.new()
    2. hasher.update(LengthPrefixed(domain_separator))
    3. hasher.update(LengthPrefixed(seed))
    4. hasher.update(LengthPrefixed(counter.to_le_bytes(4)))
    5. uniform_bytes = hasher.finalize_xof(64)
    6. P = OneWayMap(uniform_bytes)
    7. return P
]]></artwork>
        <t>The domain_separator <bcp14>MUST</bcp14> be unique for each deployment to ensure
cryptographic isolation between different services. The domain separator <bcp14>SHOULD</bcp14>
follow this structured format:</t>
        <artwork><![CDATA[
domain_separator = "ACT-v1:" || organization || ":" || service || ":" || deployment_id || ":" || version
]]></artwork>
        <t>Each component (organization, service, deployment_id, version) <bcp14>MUST NOT</bcp14>
contain the colon character ':'.</t>
        <t>Where:</t>
        <ul spacing="normal">
          <li>
            <t><tt>organization</tt>: A unique identifier for the organization (e.g., "example-corp", "acme-inc")</t>
          </li>
          <li>
            <t><tt>service</tt>: The specific service or application name (e.g., "payment-api", "rate-limiter")</t>
          </li>
          <li>
            <t><tt>deployment_id</tt>: The deployment environment (e.g., "production", "staging", "us-west-1")</t>
          </li>
          <li>
            <t><tt>version</tt>: An ISO 8601 date (YYYY-MM-DD) indicating when parameters were generated</t>
          </li>
        </ul>
        <t>Example: <tt>"ACT-v1:example-corp:payment-api:production:2024-01-15"</tt></t>
        <t>This structured format ensures:
1. Protocol identification through the "ACT-v1:" prefix
2. Organizational namespace isolation
3. Service-level separation within organizations
4. Environment isolation (production vs staging)
5. Version tracking for parameter updates</t>
        <t>Using generic or unstructured domain separators creates security risks through
parameter collision and <bcp14>MUST NOT</bcp14> be used. When parameters need to be updated
(e.g., for security reasons or protocol upgrades), a new version date <bcp14>MUST</bcp14> be
used, creating entirely new parameters.</t>
        <t>The OneWayMap function is defined in <xref target="RFC9496"/> Section 4.3.4, which provides a
cryptographically secure mapping from uniformly random byte strings to valid
Ristretto255 points.</t>
      </section>
      <section anchor="key-generation">
        <name>Key Generation</name>
        <t>The issuer generates a key pair as follows:</t>
        <artwork><![CDATA[
KeyGen():
  Input: None
  Output:
    - sk: Private key (Scalar)
    - pk: Public key (Group Element)

  Steps:
    1. x <- Zq
    2. W = G * x
    3. sk = x
    4. pk = W
    5. return (sk, pk)
]]></artwork>
      </section>
      <section anchor="token-issuance">
        <name>Token Issuance</name>
        <t>The issuance protocol is an interactive protocol between a client and the
issuer:</t>
        <section anchor="client-issuance-request">
          <name>Client: Issuance Request</name>
          <artwork><![CDATA[
IssueRequest():
  Output:
    - request: Issuance request
    - state: Client state for later verification

  Steps:
    1. k <- Zq  // Nullifier (will prevent double-spending)
    2. r <- Zq  // Blinding factor
    3. K = H2 * k + H3 * r
    4. // Generate proof of knowledge of k, r
    5. k' <- Zq
    6. r' <- Zq
    7. K1 = H2 * k' + H3 * r'
    8. transcript = CreateTranscript("request")
    9. AddToTranscript(transcript, K)
    10. AddToTranscript(transcript, K1)
    11. gamma = GetChallenge(transcript)
    12. k_bar = k' + gamma * k
    13. r_bar = r' + gamma * r
    14. request = (K, gamma, k_bar, r_bar)
    15. state = (k, r)
    16. return (request, state)
]]></artwork>
        </section>
        <section anchor="issuer-issuance-response">
          <name>Issuer: Issuance Response</name>
          <artwork><![CDATA[
IssueResponse(sk, request, c, ctx):
  Input:
    - sk: Issuer's private key
    - request: Client's issuance request
    - c: Credit amount to issue (c > 0)
    - ctx: Request context (Scalar)
  Output:
    - response: Issuance response or INVALID
  Exceptions:
    - InvalidIssuanceRequestProof, raised when the client proof verification fails

  Steps:
    1. Parse request as (K, gamma, k_bar, r_bar)
    2. // Verify proof of knowledge
    3. K1 = H2 * k_bar + H3 * r_bar - K * gamma
    4. transcript = CreateTranscript("request")
    5. AddToTranscript(transcript, K)
    6. AddToTranscript(transcript, K1)
    7. if GetChallenge(transcript) != gamma:
    8.     raise InvalidIssuanceRequestProof
    9. // Create BBS signature on (c, ctx, k, r)
    10. e <- Zq
    11. A = (G + H1 * c + H4 * ctx + K) * (1/(e + sk))  // K = H2 * k + H3 * r
    12. // Generate proof of correct computation
    13. alpha <- Zq
    14. Y_A = A * alpha
    15. Y_G = G * alpha
    16. X_A = G + H1 * c + H4 * ctx + K
    17. X_G = G * e + pk
    18. transcript_resp = CreateTranscript("respond")
    19. AddToTranscript(transcript_resp, c)
    20. AddToTranscript(transcript_resp, ctx)
    21. AddToTranscript(transcript_resp, e)
    22. AddToTranscript(transcript_resp, A)
    23. AddToTranscript(transcript_resp, X_A)
    24. AddToTranscript(transcript_resp, X_G)
    25. AddToTranscript(transcript_resp, Y_A)
    26. AddToTranscript(transcript_resp, Y_G)
    27. gamma_resp = GetChallenge(transcript_resp)
    28. z = gamma_resp * (sk + e) + alpha
    29. response = (A, e, gamma_resp, z, c, ctx)
    30. return response
]]></artwork>
        </section>
        <section anchor="client-token-verification">
          <name>Client: Token Verification</name>
          <artwork><![CDATA[
VerifyIssuance(pk, request, response, state):
  Input:
    - pk: Issuer's public key
    - request: The issuance request sent
    - response: Issuer's response
    - state: Client state from request generation
  Output:
    - token: Credit token
  Exceptions:
    - InvalidIssuanceResponseProof, raised when the server proof verification fails

  Steps:
    1. Parse request as (K, gamma, k_bar, r_bar)
    2. Parse response as (A, e, gamma_resp, z, c, ctx)
    3. Parse state as (k, r)
    4. // Verify proof
    5. X_A = G + H1 * c + H4 * ctx + K
    6. X_G = G * e + pk
    7. Y_A = A * z - X_A * gamma_resp
    8. Y_G = G * z - X_G * gamma_resp
    9. transcript_resp = CreateTranscript("respond")
    10. AddToTranscript(transcript_resp, c)
    11. AddToTranscript(transcript_resp, ctx)
    12. AddToTranscript(transcript_resp, e)
    13. AddToTranscript(transcript_resp, A)
    14. AddToTranscript(transcript_resp, X_A)
    15. AddToTranscript(transcript_resp, X_G)
    16. AddToTranscript(transcript_resp, Y_A)
    17. AddToTranscript(transcript_resp, Y_G)
    18. if GetChallenge(transcript_resp) != gamma_resp:
    19.     raise InvalidIssuanceResponseProof
    20. token = (A, e, k, r, c, ctx)
    21. return token
]]></artwork>
        </section>
      </section>
      <section anchor="token-spending">
        <name>Token Spending</name>
        <t>The spending protocol allows a client to spend s credits from a token
containing c credits (where 0 &lt;= s &lt;= c).</t>
        <t>Note: Spending s = 0 is permitted and produces a new token with the same
balance but a fresh nullifier. This "re-anonymization" operation is useful
for securely transferring a token to another party: after a zero-spend, the
original holder can no longer use the old nullifier, and the recipient
obtains a token that is cryptographically unlinkable to the original.</t>
        <section anchor="client-spend-proof-generation">
          <name>Client: Spend Proof Generation</name>
          <artwork><![CDATA[
ProveSpend(token, s):
  Input:
    - token: Credit token (A, e, k, r, c, ctx)
    - s: Amount to spend (0 <= s <= c)
  Output:
    - proof: Spend proof
    - state: Client state for receiving change
  Exceptions:
    - InvalidAmount: raised when s > c or s >= 2^L or c >= 2^L

  Steps:
    1. // Validate inputs
    2. if s >= 2^L:
    3.     raise InvalidAmount
    4. if c >= 2^L:
    5.     raise InvalidAmount
    6. if s > c:
    7.     raise InvalidAmount

    8. // Randomize the signature
    9. r1, r2 <- Zq
    10. B = G + H1 * c + H2 * k + H3 * r + H4 * ctx
    11. A' = A * (r1 * r2)
    12. B_bar = B * r1
    13. r3 = 1/r1

    14. // Generate initial proof components
    15. c' <- Zq
    16. r' <- Zq
    17. e' <- Zq
    18. r2' <- Zq
    19. r3' <- Zq

    20. // Compute first round messages
    21. A1 = A' * e' + B_bar * r2'
    22. A2 = B_bar * r3' + H1 * c' + H3 * r'

    23. // Decompose c - s into bits
    24. m = c - s
    25. (i[0], ..., i[L-1]) = BitDecompose(m)  // See Section 3.7

    26. // Create commitments for each bit
    27. k* <- Zq
    28. s[0] <- Zq
    29. Com[0] = H1 * i[0] + H2 * k* + H3 * s[0]
    30. For j = 1 to L-1:
    31.     s[j] <- Zq
    32.     Com[j] = H1 * i[j] + H3 * s[j]

    33. // Initialize range proof arrays
    34. C = array[L][2]
    35. C' = array[L][2]
    36. gamma0 = array[L]
    37. z = array[L][2]

    38. // Process bit 0 (with k* component)
    39. C[0][0] = Com[0]
    40. C[0][1] = Com[0] - H1
    41. k0' <- Zq
    42. s_prime = array[L]
    43. s_prime[0] <- Zq
    44. gamma0[0] <- Zq
    45. w0 <- Zq
    46. z[0] <- Zq

    47. if i[0] == 0:
    48.     C'[0][0] = H2 * k0' + H3 * s_prime[0]
    49.     C'[0][1] = H2 * w0 + H3 * z[0] - C[0][1] * gamma0[0]
    50. else:
    51.     C'[0][0] = H2 * w0 + H3 * z[0] - C[0][0] * gamma0[0]
    52.     C'[0][1] = H2 * k0' + H3 * s_prime[0]

    53. // Process remaining bits
    54. For j = 1 to L-1:
    55.     C[j][0] = Com[j]
    56.     C[j][1] = Com[j] - H1
    57.     s_prime[j] <- Zq
    58.     gamma0[j] <- Zq
    59.     z[j] <- Zq
    60.
    61.     if i[j] == 0:
    62.         C'[j][0] = H3 * s_prime[j]
    63.         C'[j][1] = H3 * z[j] - C[j][1] * gamma0[j]
    64.     else:
    65.         C'[j][0] = H3 * z[j] - C[j][0] * gamma0[j]
    66.         C'[j][1] = H3 * s_prime[j]

    67. // Compute K' commitment
    68. K' = Sum(Com[j] * 2^j for j in [L])
    69. r* = Sum(s[j] * 2^j for j in [L])
    70. k' <- Zq
    71. s' <- Zq
    72. C_final = H1 * (-c') + H2 * k' + H3 * s'

    73. // Generate challenge using transcript
    74. transcript = CreateTranscript("spend")
    75. AddToTranscript(transcript, k)
    76. AddToTranscript(transcript, ctx)
    77. AddToTranscript(transcript, A')
    78. AddToTranscript(transcript, B_bar)
    79. AddToTranscript(transcript, A1)
    80. AddToTranscript(transcript, A2)
    81. For j = 0 to L-1:
    82.     AddToTranscript(transcript, Com[j])
    83. For j = 0 to L-1:
    84.     AddToTranscript(transcript, C'[j][0])
    85.     AddToTranscript(transcript, C'[j][1])
    86. AddToTranscript(transcript, C_final)
    87. gamma = GetChallenge(transcript)

    88. // Compute responses
    89. e_bar = -gamma * e + e'
    90. r2_bar = gamma * r2 + r2'
    91. r3_bar = gamma * r3 + r3'
    92. c_bar = -gamma * c + c'
    93. r_bar = -gamma * r + r'

    94. // Complete range proof responses
    95. z_final = array[L][2]
    96. gamma0_final = array[L]
    97.
    98. // For bit 0
    99. if i[0] == 0:
    100.    gamma0_final[0] = gamma - gamma0[0]
    101.    w00 = gamma0_final[0] * k* + k0'
    102.    w01 = w0
    103.    z_final[0][0] = gamma0_final[0] * s[0] + s_prime[0]
    104.    z_final[0][1] = z[0]
    105. else:
    106.    gamma0_final[0] = gamma0[0]
    107.    w00 = w0
    108.    w01 = (gamma - gamma0_final[0]) * k* + k0'
    109.    z_final[0][0] = z[0]
    110.    z_final[0][1] = (gamma - gamma0_final[0]) * s[0] + s_prime[0]

    111. // For remaining bits
    112. For j = 1 to L-1:
    113.     if i[j] == 0:
    114.         gamma0_final[j] = gamma - gamma0[j]
    115.         z_final[j][0] = gamma0_final[j] * s[j] + s_prime[j]
    116.         z_final[j][1] = z[j]
    117.     else:
    118.         gamma0_final[j] = gamma0[j]
    119.         z_final[j][0] = z[j]
    120.         z_final[j][1] = (gamma - gamma0_final[j]) * s[j] + s_prime[j]

    121. k_bar = gamma * k* + k'
    122. s_bar = gamma * r* + s'

    123. // Construct proof
    124. proof = (k, s, ctx, A', B_bar, Com, gamma, e_bar,
    125.          r2_bar, r3_bar, c_bar, r_bar,
    126.          w00, w01, gamma0_final, z_final,
    127.          k_bar, s_bar)
    128. state = (k*, r*, m, ctx)
    129. return (proof, state)
]]></artwork>
        </section>
        <section anchor="issuer-spend-verification-and-refund">
          <name>Issuer: Spend Verification and Refund</name>
          <artwork><![CDATA[
VerifyAndRefund(sk, proof, t):
  Input:
    - sk: Issuer's private key
    - proof: Client's spend proof
    - t: Credits to return to the client (0 <= t <= s, t < 2^L)
  Output:
    - refund: Refund for remaining credits
  Exceptions:
    - DoubleSpendError: raised when the nullifier has been used before
    - InvalidSpendProof: raised when the spend proof verification fails

  Steps:
    1. Parse proof and extract nullifier k
    2. // Check nullifier hasn't been used
    3. if k in used_nullifiers:
    4.     raise DoubleSpendError
    5. // Verify the proof (see Section 3.5.2)
    6. if not VerifySpendProof(sk, proof):
    7.     raise InvalidSpendProof
    8. // Record nullifier
    9. used_nullifiers.add(k)
    10. // Issue refund for remaining balance
    11. K' = Sum(Com[j] * 2^j for j in [L])
    12. refund = IssueRefund(sk, K', proof.ctx, proof.s, t)
    13. return refund
]]></artwork>
        </section>
        <section anchor="refund-issuance">
          <name>Refund Issuance</name>
          <t>After verifying a spend proof, the issuer creates a refund token for the
remaining balance. The issuer may optionally return t credits (where
0 &lt;= t &lt;= s) back to the client via a partial credit return. This enables
pre-authorization patterns where the client holds s credits but only t
are returned unused. The resulting token will have c - s + t credits.
Use t = 0 to consume the full spend amount:</t>
          <artwork><![CDATA[
IssueRefund(sk, K', ctx, s, t):
  Input:
    - sk: Issuer's private key
    - K': Commitment to remaining balance and new nullifier
    - ctx: Request context from the spend proof
    - s: The spend amount from the proof
    - t: Credits to return to the client (0 <= t <= s, t < 2^L)
  Output:
    - refund: Refund response
  Exceptions:
    - InvalidAmount: raised when t > s or t >= 2^L

  Steps:
    1. // Validate partial return amount
    2. if t >= 2^L:
    3.     raise InvalidAmount
    4. if t > s:
    5.     raise InvalidAmount

    6. // Create new BBS signature on remaining balance + partial return
    7. e* <- Zq
    8. X_A* = G + K' + H1 * t + H4 * ctx
    9. A* = X_A* * (1/(e* + sk))

    10. // Generate proof of correct computation
    11. alpha <- Zq
    12. Y_A = A* * alpha
    13. Y_G = G * alpha
    14. X_G = G * e* + pk

    15. // Create challenge using transcript
    16. transcript = CreateTranscript("refund")
    17. AddToTranscript(transcript, e*)
    18. AddToTranscript(transcript, t)
    19. AddToTranscript(transcript, ctx)
    20. AddToTranscript(transcript, A*)
    21. AddToTranscript(transcript, X_A*)
    22. AddToTranscript(transcript, X_G)
    23. AddToTranscript(transcript, Y_A)
    24. AddToTranscript(transcript, Y_G)
    25. gamma = GetChallenge(transcript)

    26. // Compute response
    27. z = gamma * (sk + e*) + alpha

    28. refund = (A*, e*, gamma, z, t)
    29. return refund
]]></artwork>
        </section>
        <section anchor="client-refund-token-construction">
          <name>Client: Refund Token Construction</name>
          <t>The client verifies the refund and constructs a new credit token:</t>
          <artwork><![CDATA[
ConstructRefundToken(pk, spend_proof, refund, state):
  Input:
    - pk: Issuer's public key
    - spend_proof: The spend proof sent to issuer
    - refund: Issuer's refund response
    - state: Client state (k*, r*, m, ctx)
  Output:
    - token: New credit token or INVALID
  Exceptions:
    - InvalidRefundProof: When the refund proof verification fails

  Steps:
    1. Parse refund as (A*, e*, gamma, z, t)
    2. Parse state as (k*, r*, m, ctx)

    3. // Reconstruct commitment with partial return
    4. K' = Sum(spend_proof.Com[j] * 2^j for j in [L])
    5. X_A* = G + K' + H1 * t + H4 * ctx
    6. X_G = G * e* + pk

    7. // Verify proof
    8. Y_A = A* * z + X_A* * (-gamma)
    9. Y_G = G * z + X_G * (-gamma)

    10. // Check challenge using transcript
    11. transcript = CreateTranscript("refund")
    12. AddToTranscript(transcript, e*)
    13. AddToTranscript(transcript, t)
    14. AddToTranscript(transcript, ctx)
    15. AddToTranscript(transcript, A*)
    16. AddToTranscript(transcript, X_A*)
    17. AddToTranscript(transcript, X_G)
    18. AddToTranscript(transcript, Y_A)
    19. AddToTranscript(transcript, Y_G)
    20. if GetChallenge(transcript) != gamma:
    21.     raise InvalidRefundProof

    22. // Construct new token with remaining balance + partial return
    23. token = (A*, e*, k*, r*, m + t, ctx)
    24. return token
]]></artwork>
        </section>
        <section anchor="spend-verification">
          <name>Spend Proof Verification</name>
          <t>The issuer verifies a spend proof as follows:</t>
          <artwork><![CDATA[
VerifySpendProof(sk, proof):
  Input:
    - sk: Issuer's private key
    - proof: Spend proof from client
  Output:
    - valid: Boolean indicating if proof is valid
  Exceptions:
    - IdentityPointError: raised when A' is the identity
    - InvalidClientSpendProof: raised when the challenge does not match the reconstruction

  Steps:
    1. Parse proof as (k, s, ctx, A', B_bar, Com, gamma, e_bar,
                      r2_bar, r3_bar, c_bar, r_bar, w00, w01,
                      gamma0, z, k_bar, s_bar)

    2. // Check A' is not identity
    3. if A' == Identity:
    4.     raise IdentityPointError

    5. // Compute issuer's view of signature
    6. A_bar = A' * sk
    7. H1_prime = G + H2 * k + H4 * ctx

    8. // Verify sigma protocol
    9. A1 = A' * e_bar + B_bar * r2_bar - A_bar * gamma
    10. A2 = B_bar * r3_bar + H1 * c_bar + H3 * r_bar - H1_prime * gamma

    11. // Initialize arrays for range proof verification
    12. gamma1 = array[L]
    13. C = array[L][2]
    14. C' = array[L][2]

    15. // Process bit 0 (with k* component)
    16. gamma1[0] = gamma - gamma0[0]
    17. C[0][0] = Com[0]
    18. C[0][1] = Com[0] - H1
    19. C'[0][0] = H2 * w00 + H3 * z[0][0] - C[0][0] * gamma0[0]
    20. C'[0][1] = H2 * w01 + H3 * z[0][1] - C[0][1] * gamma1[0]

    21. // Verify remaining bits
    22. For j = 1 to L-1:
    23.     gamma1[j] = gamma - gamma0[j]
    24.     C[j][0] = Com[j]
    25.     C[j][1] = Com[j] - H1
    26.     C'[j][0] = H3 * z[j][0] - C[j][0] * gamma0[j]
    27.     C'[j][1] = H3 * z[j][1] - C[j][1] * gamma1[j]

    28. // Verify final commitment
    29. K' = Sum(Com[j] * 2^j for j in [L])
    30. Com_total = H1 * s + K'
    31. C_final = H1 * (-c_bar) + H2 * k_bar + H3 * s_bar - Com_total * gamma

    32. // Recompute challenge using transcript
    33. transcript = CreateTranscript("spend")
    34. AddToTranscript(transcript, k)
    35. AddToTranscript(transcript, ctx)
    36. AddToTranscript(transcript, A')
    37. AddToTranscript(transcript, B_bar)
    38. AddToTranscript(transcript, A1)
    39. AddToTranscript(transcript, A2)
    40. For j = 0 to L-1:
    41.     AddToTranscript(transcript, Com[j])
    42. For j = 0 to L-1:
    43.     AddToTranscript(transcript, C'[j][0])
    44.     AddToTranscript(transcript, C'[j][1])
    45. AddToTranscript(transcript, C_final)
    46. gamma_check = GetChallenge(transcript)

    47. // Verify challenge matches
    48. if gamma != gamma_check:
    49.     raise InvalidVerifySpendProof

    50. return true
]]></artwork>
        </section>
      </section>
      <section anchor="cryptographic-primitives">
        <name>Cryptographic Primitives</name>
        <section anchor="protocol-version">
          <name>Protocol Version</name>
          <t>The protocol version string for domain separation is:</t>
          <artwork><![CDATA[
PROTOCOL_VERSION = "curve25519-ristretto anonymous-credits v1.0"
]]></artwork>
          <t>This version string <bcp14>MUST</bcp14> be used consistently across all implementations for
interoperability. The curve specification is included to prevent cross-curve
attacks and ensure implementations using different curves cannot accidentally
interact.</t>
        </section>
        <section anchor="hash-function-and-fiat-shamir-transform">
          <name>Hash Function and Fiat-Shamir Transform</name>
          <t>The protocol uses BLAKE3 <xref target="BLAKE3"/> as the underlying hash function for the
Fiat-Shamir transform <xref target="ORRU-FS"/>. Following the sigma protocol framework
<xref target="ORRU-SIGMA"/>, challenges are generated using a transcript that accumulates
all protocol messages:</t>
          <artwork><![CDATA[
CreateTranscript(label):
  Input:
    - label: ASCII string identifying the proof type
  Output:
    - transcript: A new transcript object

  Steps:
    1. hasher = BLAKE3.new()
    2. hasher.update(LengthPrefixed(PROTOCOL_VERSION))
    3. hasher.update(LengthPrefixed(Encode(H1)))
    4. hasher.update(LengthPrefixed(Encode(H2)))
    5. hasher.update(LengthPrefixed(Encode(H3)))
    6. hasher.update(LengthPrefixed(Encode(H4)))
    7. hasher.update(LengthPrefixed(label))
    8. return transcript with hasher

AddToTranscript(transcript, value):
  Input:
    - transcript: Existing transcript
    - value: Element or Scalar to add

  Steps:
    1. encoded = Encode(value)
    2. transcript.hasher.update(LengthPrefixed(encoded))

GetChallenge(transcript):
  Input:
    - transcript: Completed transcript
  Output:
    - challenge: Scalar challenge value

  Steps:
    1. hash = transcript.hasher.output(64)  // 64 bytes of output
    2. challenge = from_little_endian_bytes(hash) mod q
    3. return challenge
]]></artwork>
          <t>This approach ensures:</t>
          <ul spacing="normal">
            <li>
              <t>Domain separation through the label and protocol version</t>
            </li>
            <li>
              <t>Inclusion of all public parameters to prevent parameter substitution attacks</t>
            </li>
            <li>
              <t>Proper ordering with length prefixes to prevent ambiguity</t>
            </li>
            <li>
              <t>Deterministic challenge generation from the complete transcript</t>
            </li>
          </ul>
        </section>
        <section anchor="encoding-functions">
          <name>Encoding Functions</name>
          <t>Elements and scalars are encoded as follows:</t>
          <artwork><![CDATA[
Encode(value):
  Input:
    - value: Element or Scalar
  Output:
    - encoding: ByteString

  Steps:
    1. If value is an Element:
    2.     return value.compress()  // 32 bytes, compressed Ristretto point
    3. If value is a Scalar:
    4.     return value.to_bytes_le()  // 32 bytes, little-endian
]]></artwork>
          <t>The following function provides consistent length-prefixing for hash inputs:</t>
          <artwork><![CDATA[
LengthPrefixed(data):
  Input:
    - data: ByteString to be length-prefixed
  Output:
    - prefixed: ByteString with length prefix

  Steps:
    1. length = len(data)
    2. return length.to_be_bytes(8) || data  // 8-byte big-endian length prefix
]]></artwork>
          <t>Note: Implementations <bcp14>MAY</bcp14> use standard serialization formats (e.g. CBOR) for
complex structures, but <bcp14>MUST</bcp14> ensure deterministic encoding for hash inputs.</t>
        </section>
        <section anchor="binary-decomposition">
          <name>Binary Decomposition</name>
          <t>To decompose a scalar into its binary representation:</t>
          <artwork><![CDATA[
BitDecompose(s):
  Input:
    - s: Scalar value
  Output:
    - bits: Array of L scalars (each 0 or 1)

  Steps:
    1. bytes = s.to_bytes_le()  // 32 bytes, little-endian
    2. For i = 0 to L-1:
    3.     byte_index = i / 8
    4.     bit_position = i % 8
    5.     bit = (bytes[byte_index] >> bit_position) & 1
    6.     bits[i] = Scalar(bit)
    7. return bits
]]></artwork>
          <t>Note: This algorithm produces bits in LSB-first order (i.e., <tt>bits[0]</tt> is the
least significant bit). See Section 3.1 for constraints on L.</t>
        </section>
        <section anchor="scalar-conversion">
          <name>Scalar Conversion</name>
          <t>Converting between credit amounts and scalars:</t>
          <artwork><![CDATA[
CreditToScalar(amount):
  Input:
    - amount: Integer credit amount (0 <= amount < 2^L)
  Output:
    - s: Scalar representation
  Exceptions:
    - AmountTooBigError: raised when the amount exceeds 2^L

  Steps:
    1. if amount >= 2^L:
    2.     return AmountTooBigError
    3. return Scalar(amount)

ScalarToCredit(s):
  Input:
    - s: Scalar value
  Output:
    - amount: Integer credit amount or ERROR
  Exceptions:
    - ScalarOutOfRangeError: raised when the scalar value is >= 2^L

  Steps:
    1. amount = s as integer  // Interpret little-endian scalar bytes as integer
    2. if amount >= 2^L:
    3.     return ScalarOutOfRangeError
    4. return amount
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="protocol-messages-and-wire-format">
      <name>Protocol Messages and Wire Format</name>
      <section anchor="message-encoding">
        <name>Message Encoding</name>
        <t>All protocol messages <bcp14>SHOULD</bcp14> be encoded using deterministic CBOR (RFC 8949) for
interoperability. Decoders <bcp14>MUST</bcp14> reject messages containing unknown CBOR map
keys. The following sections define the structure of each message type.</t>
        <section anchor="issuance-request-message">
          <name>Issuance Request Message</name>
          <artwork><![CDATA[
IssuanceRequestMsg = {
    1: bstr,  ; K (compressed Ristretto point, 32 bytes)
    2: bstr,  ; gamma (scalar, 32 bytes)
    3: bstr,  ; k_bar (scalar, 32 bytes)
    4: bstr   ; r_bar (scalar, 32 bytes)
}
]]></artwork>
        </section>
        <section anchor="issuance-response-message">
          <name>Issuance Response Message</name>
          <artwork><![CDATA[
IssuanceResponseMsg = {
    1: bstr,  ; A (compressed Ristretto point, 32 bytes)
    2: bstr,  ; e (scalar, 32 bytes)
    3: bstr,  ; gamma_resp (scalar, 32 bytes)
    4: bstr,  ; z (scalar, 32 bytes)
    5: bstr,  ; c (scalar, 32 bytes)
    6: bstr   ; ctx (scalar, 32 bytes)
}
]]></artwork>
        </section>
        <section anchor="spend-proof-message">
          <name>Spend Proof Message</name>
          <artwork><![CDATA[
SpendProofMsg = {
    1: bstr,           ; k (nullifier, 32 bytes)
    2: bstr,           ; s (spend amount, 32 bytes)
    3: bstr,           ; A' (compressed point, 32 bytes)
    4: bstr,           ; B_bar (compressed point, 32 bytes)
    5: [* bstr],       ; Com array (L compressed points)
    6: bstr,           ; gamma (scalar, 32 bytes)
    7: bstr,           ; e_bar (scalar, 32 bytes)
    8: bstr,           ; r2_bar (scalar, 32 bytes)
    9: bstr,           ; r3_bar (scalar, 32 bytes)
    10: bstr,          ; c_bar (scalar, 32 bytes)
    11: bstr,          ; r_bar (scalar, 32 bytes)
    12: bstr,          ; w00 (scalar, 32 bytes)
    13: bstr,          ; w01 (scalar, 32 bytes)
    14: [* bstr],      ; gamma0 array (L scalars)
    15: [* [bstr, bstr]], ; z array (L pairs of scalars)
    16: bstr,          ; k_bar (scalar, 32 bytes)
    17: bstr,          ; s_bar (scalar, 32 bytes)
    18: bstr           ; ctx (scalar, 32 bytes)
}
]]></artwork>
        </section>
        <section anchor="refund-message">
          <name>Refund Message</name>
          <artwork><![CDATA[
RefundMsg = {
    1: bstr,  ; A* (compressed Ristretto point, 32 bytes)
    2: bstr,  ; e* (scalar, 32 bytes)
    3: bstr,  ; gamma (scalar, 32 bytes)
    4: bstr,  ; z (scalar, 32 bytes)
    5: bstr   ; t (partial return, scalar, 32 bytes)
}
]]></artwork>
        </section>
      </section>
      <section anchor="error-responses">
        <name>Error Responses</name>
        <t>Error responses <bcp14>SHOULD</bcp14> use the following format:</t>
        <artwork><![CDATA[
ErrorMsg = {
    1: uint,   ; error_code
    2: tstr    ; error_message (for debugging only)
}
]]></artwork>
        <t>Error codes are defined in Section 5.3.</t>
      </section>
      <section anchor="protocol-flow">
        <name>Protocol Flow</name>
        <t>The complete protocol flow with message types:</t>
        <artwork><![CDATA[
Client                                          Issuer
  |                                               |
  |-- IssuanceRequestMsg ------------------------>|
  |                                               |
  |<-- IssuanceResponseMsg -----------------------|
  |                                               |
  | (client creates token)                        |
  |                                               |
  |-- SpendProofMsg ----------------------------->|
  |                                               |
  |<-- RefundMsg or ErrorMsg ---------------------|
  |                                               |
]]></artwork>
        <section anchor="example-usage-scenario">
          <name>Example Usage Scenario</name>
          <t>Consider an API service that sells credits in bundles of 1000:</t>
          <ol spacing="normal" type="1"><li>
              <t><strong>Purchase</strong>: Alice buys 1000 API credits
              </t>
              <ul spacing="normal">
                <li>
                  <t>Alice generates a random nullifier k and blinding factor r</t>
                </li>
                <li>
                  <t>Alice sends IssuanceRequestMsg to the service</t>
                </li>
                <li>
                  <t>Service creates a BBS signature on (1000, k, r) and returns it</t>
                </li>
                <li>
                  <t>Alice now has a token worth 1000 credits</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>First API Call</strong>: Alice makes an API call costing 50 credits
              </t>
              <ul spacing="normal">
                <li>
                  <t>Alice creates a SpendProofMsg proving she has ≥ 50 credits</t>
                </li>
                <li>
                  <t>Alice reveals nullifier k to prevent double-spending</t>
                </li>
                <li>
                  <t>Service verifies the proof and records k as used</t>
                </li>
                <li>
                  <t>Service issues a RefundMsg for a new token worth 950 credits</t>
                </li>
                <li>
                  <t>Alice generates new nullifier k' for the refund token</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Subsequent Calls</strong>: Alice continues using the API
              </t>
              <ul spacing="normal">
                <li>
                  <t>Each call repeats the spend/refund process</t>
                </li>
                <li>
                  <t>Each new token has a fresh nullifier</t>
                </li>
                <li>
                  <t>The service cannot link Alice's calls together</t>
                </li>
              </ul>
            </li>
          </ol>
          <t>This example demonstrates how the protocol maintains privacy while preventing double-spending and enabling flexible partial payments.</t>
        </section>
      </section>
    </section>
    <section anchor="implementation-considerations">
      <name>Implementation Considerations</name>
      <section anchor="nullifier-management">
        <name>Nullifier Management</name>
        <t>Implementations <bcp14>MUST</bcp14> maintain a persistent database of used nullifiers to
prevent double-spending. The nullifier storage requirements grow linearly with
the number of spent tokens. Implementations <bcp14>MAY</bcp14> use the following strategies to
manage storage:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Expiration</strong>: If tokens have expiration dates, old nullifiers can be
pruned.</t>
          </li>
          <li>
            <t><strong>Sharding</strong>: Nullifiers can be partitioned across multiple databases.</t>
          </li>
          <li>
            <t><strong>Bloom Filters</strong>: Probabilistic data structures can reduce memory usage
with a small false-positive rate. WARNING: false positives cause
legitimate spends to be rejected. Bloom filters <bcp14>MUST NOT</bcp14> be the sole
nullifier check; a positive result <bcp14>MUST</bcp14> be confirmed against authoritative
storage before rejecting a spend.</t>
          </li>
        </ol>
      </section>
      <section anchor="constant-time-operations">
        <name>Constant-Time Operations</name>
        <t>Implementations <bcp14>MUST</bcp14> use constant-time operations for all secret-dependent
computations. See the Security Considerations section for detailed
requirements and mitigations.</t>
      </section>
      <section anchor="randomness-generation">
        <name>Randomness Generation</name>
        <t>The security of the protocol critically depends on the quality of random number
generation. Implementations <bcp14>MUST</bcp14> use cryptographically secure random number
generators (CSPRNGs) for:</t>
        <ul spacing="normal">
          <li>
            <t>Private key generation</t>
          </li>
          <li>
            <t>Blinding factors (r, k)</t>
          </li>
          <li>
            <t>Proof randomness (nonces)</t>
          </li>
        </ul>
        <section anchor="rng-requirements">
          <name>RNG Requirements</name>
          <ol spacing="normal" type="1"><li>
              <t><strong>Entropy Source</strong>: Use OS-provided entropy (e.g., /dev/urandom on Unix systems)</t>
            </li>
            <li>
              <t><strong>Fork Safety</strong>: Reseed after fork() to prevent nonce reuse</t>
            </li>
            <li>
              <t><strong>Backtracking Resistance</strong>: Use forward-secure PRNGs when possible</t>
            </li>
          </ol>
        </section>
        <section anchor="nonce-generation">
          <name>Nonce Generation</name>
          <t>Following <xref target="ORRU-SIGMA"/>, nonces (the randomness used in proofs) <bcp14>MUST</bcp14> be
generated with extreme care:</t>
          <ol spacing="normal" type="1"><li>
              <t><strong>Fresh Randomness</strong>: Generate new nonces for every proof</t>
            </li>
            <li>
              <t><strong>No Reuse</strong>: Never reuse nonces across different proofs</t>
            </li>
            <li>
              <t><strong>Full Entropy</strong>: Use the full security parameter (256 bits) of randomness</t>
            </li>
            <li>
              <t><strong>Zeroization</strong>: Clear nonces from memory after use</t>
            </li>
          </ol>
          <t>WARNING: Leakage of even a few bits of a nonce can allow complete recovery of the witness (secret values). Implementations <bcp14>MUST</bcp14> use constant-time operations and secure memory handling for all nonce-related computations.</t>
        </section>
      </section>
      <section anchor="point-validation">
        <name>Point Validation</name>
        <t>All Ristretto points received from external sources <bcp14>MUST</bcp14> be validated:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Deserialization</strong>: Verify the point deserializes to a valid Ristretto point</t>
          </li>
          <li>
            <t><strong>Non-Identity</strong>: Verify the point is not the identity element</t>
          </li>
          <li>
            <t><strong>Subgroup Check</strong>: Ristretto guarantees prime-order subgroup membership</t>
          </li>
        </ol>
        <t>Example validation:</t>
        <artwork><![CDATA[
ValidatePoint(P):
  1. If P fails to deserialize:
  2.     return INVALID
  3. If P == Identity:
  4.     return INVALID
  5. // Ristretto ensures prime-order subgroup membership
  6. return VALID
]]></artwork>
        <t>All implementations <bcp14>MUST</bcp14> validate points at these locations:</t>
        <ul spacing="normal">
          <li>
            <t>When receiving <tt>K</tt> in issuance request</t>
          </li>
          <li>
            <t>When receiving <tt>A</tt> in issuance response</t>
          </li>
          <li>
            <t>When receiving <tt>A'</tt> and <tt>B_bar</tt> in spend proof</t>
          </li>
          <li>
            <t>When receiving <tt>Com[j]</tt> commitments in spend proof</t>
          </li>
          <li>
            <t>When receiving <tt>A*</tt> in refund response</t>
          </li>
        </ul>
      </section>
      <section anchor="error-handling">
        <name>Error Handling</name>
        <t>Implementations <bcp14>SHOULD NOT</bcp14> provide detailed error messages that could leak
information about the verification process. A single INVALID response should be
returned for all verification failures.</t>
        <section anchor="error-codes">
          <name>Error Codes</name>
          <t>While detailed error messages should not be exposed to untrusted parties,
implementations <bcp14>MAY</bcp14> use the following internal error codes:</t>
          <ul spacing="normal">
            <li>
              <t><tt>INVALID_PROOF</tt>: Proof verification failed</t>
            </li>
            <li>
              <t><tt>NULLIFIER_REUSE</tt>: Double-spend attempt detected</t>
            </li>
            <li>
              <t><tt>MALFORMED_REQUEST</tt>: Request format is invalid</t>
            </li>
            <li>
              <t><tt>INVALID_AMOUNT</tt>: Credit amount is invalid (exceeds 2^L - 1, spend exceeds balance, or partial return exceeds spend)</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="parameter-selection">
        <name>Parameter Selection</name>
        <t>Implementations <bcp14>MUST</bcp14> choose L based on their maximum credit requirements and
performance constraints. See Section 3.1 for constraints on L.</t>
        <t>The bit length L is configurable and determines the range of credit values (0
to 2^L - 1). The choice of L involves several trade-offs:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Range</strong>: Larger L supports higher credit values</t>
          </li>
          <li>
            <t><strong>Performance</strong>: Proof size and verification time scale linearly with L</t>
          </li>
        </ol>
        <section anchor="performance-characteristics">
          <name>Performance Characteristics</name>
          <t>The protocol has the following computational complexity:</t>
          <t><strong>Notation for Operations:</strong></t>
          <ul spacing="normal">
            <li>
              <t><strong>Group Operations</strong>: Point additions in the Ristretto255 group (e.g., P + Q)</t>
            </li>
            <li>
              <t><strong>Group Exponentiations</strong>: Scalar multiplication of group elements (e.g., P * s)</t>
            </li>
            <li>
              <t><strong>Scalar Additions/Multiplications</strong>: Arithmetic operations modulo the group order q</t>
            </li>
            <li>
              <t><strong>Issuance</strong>:</t>
            </li>
          </ul>
          <table>
            <thead>
              <tr>
                <th align="left">Operation</th>
                <th align="left">Group Operations</th>
                <th align="left">Group Exponentiations</th>
                <th align="left">Scalar Additions</th>
                <th align="left">Scalar Multiplications</th>
                <th align="left">Hashes</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Client Request</td>
                <td align="left">2</td>
                <td align="left">4</td>
                <td align="left">2</td>
                <td align="left">1</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">Issuer Response</td>
                <td align="left">5</td>
                <td align="left">8</td>
                <td align="left">3</td>
                <td align="left">1</td>
                <td align="left">2</td>
              </tr>
              <tr>
                <td align="left">Client Credit Token Construction</td>
                <td align="left">5</td>
                <td align="left">5</td>
                <td align="left">0</td>
                <td align="left">0</td>
                <td align="left">1</td>
              </tr>
            </tbody>
          </table>
          <ul spacing="normal">
            <li>
              <t><strong>Spending</strong>:</t>
            </li>
          </ul>
          <table>
            <thead>
              <tr>
                <th align="left">Operation</th>
                <th align="left">Group Operations</th>
                <th align="left">Group Exponentiations</th>
                <th align="left">Scalar Additions</th>
                <th align="left">Scalar Multiplications</th>
                <th align="left">Hashes</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Client Request</td>
                <td align="left">17 + 4L</td>
                <td align="left">27 + 8L</td>
                <td align="left">13 + 5L</td>
                <td align="left">12 + 3L</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">Issuer Response</td>
                <td align="left">16 + 4L</td>
                <td align="left">24 + 5L</td>
                <td align="left">4 + L</td>
                <td align="left">1</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">Client Credit Token Construction</td>
                <td align="left">3</td>
                <td align="left">5</td>
                <td align="left">L</td>
                <td align="left">L</td>
                <td align="left">1</td>
              </tr>
            </tbody>
          </table>
          <t>Note: L is the configurable bit length for credit values.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Storage</strong>:</t>
            </li>
          </ul>
          <table>
            <thead>
              <tr>
                <th align="left">Component</th>
                <th align="left">Size</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Token size</td>
                <td align="left">192 bytes (6 × 32 bytes)</td>
              </tr>
              <tr>
                <td align="left">Spend proof size</td>
                <td align="left">32 × (14 + 4L) bytes</td>
              </tr>
              <tr>
                <td align="left">Nullifier database entry</td>
                <td align="left">32 bytes per spent token</td>
              </tr>
            </tbody>
          </table>
          <t>Note: Token size is independent of L.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="security-model-and-definitions">
        <name>Security Model and Definitions</name>
        <section anchor="threat-model">
          <name>Threat Model</name>
          <t>We consider a setting with:</t>
          <ul spacing="normal">
            <li>
              <t>Multiple issuers who can operate independently, though malicious issuers may collude with each other</t>
            </li>
            <li>
              <t>Potentially malicious clients who may attempt to spend more credits than they should (whether by forging tokens, spending more credits than a token has, or double-spending a token)</t>
            </li>
          </ul>
        </section>
        <section anchor="security-properties">
          <name>Security Properties</name>
          <t>The protocol provides the following security guarantees:</t>
          <ol spacing="normal" type="1"><li>
              <t><strong>Unforgeability</strong>: For an honest isser I, no probabilistic polynomial-time (PPT) adversary controlling a set of malicious clients and other malicious issuers can spend more credits than have been issued by I.</t>
            </li>
            <li>
              <t><strong>Anonymity/Unlinkability</strong>: For an honest client C, no adversary controlling a set of malicious issuers and other malicious clients can link a token issuance/refund to C with a token spend by C. This property is information-theoretic in nature.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="cryptographic-assumptions">
        <name>Cryptographic Assumptions</name>
        <t>Security relies on:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>The q-SDH Assumption</strong> in the Ristretto255 group. We refer to <xref target="TZ23"/> for the formal definition.</t>
          </li>
          <li>
            <t><strong>Random Oracle Model</strong>: The BLAKE3 hash function H is modeled as a random oracle.</t>
          </li>
        </ol>
      </section>
      <section anchor="privacy-properties">
        <name>Privacy Properties</name>
        <t>The protocol provides the following privacy guarantees:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Unlinkability</strong>: The issuer cannot link a token issuance/refund to a later spend of that token.</t>
          </li>
        </ol>
        <t>However, the protocol does NOT provide:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Network-Level Privacy</strong>: IP addresses and network metadata can still link transactions.</t>
          </li>
          <li>
            <t><strong>Amount Privacy</strong>: The spent amount s is revealed to the issuer.</t>
          </li>
          <li>
            <t><strong>Timing Privacy</strong>: Transaction timing patterns could potentially be used for correlation.</t>
          </li>
          <li>
            <t><strong>Context Privacy</strong>: The request context (ctx) is revealed in the clear during
spending. If the issuer assigns distinct ctx values per issuance, the resulting
token chain (issuance, spend, refund, subsequent spends) becomes linkable through
the shared ctx value. This is by design for application-level context binding, but
deployments that require full unlinkability <bcp14>MUST</bcp14> use a shared ctx across all clients
within the same context (e.g., per-service or per-epoch), not per-client values.
The ctx value persists across refunds: a token produced by a refund inherits the
ctx of the original token.</t>
          </li>
        </ol>
      </section>
      <section anchor="implementation-vulnerabilities-and-mitigations">
        <name>Implementation Vulnerabilities and Mitigations</name>
        <section anchor="critical-security-requirements">
          <name>Critical Security Requirements</name>
          <ol spacing="normal" type="1"><li>
              <t><strong>RNG Failures</strong>: Weak randomness can completely break the protocol's security.  </t>
              <t><strong>Attack Vector</strong>: Predictable or repeated nonces in proofs can allow complete recovery of secret values including private keys and token contents.  </t>
              <t><strong>Mitigations</strong>:  </t>
              <ul spacing="normal">
                <li>
                  <t><bcp14>MUST</bcp14> use cryptographically secure RNGs (e.g., OS-provided entropy sources)</t>
                </li>
                <li>
                  <t><bcp14>MUST</bcp14> reseed after fork() operations to prevent nonce reuse</t>
                </li>
                <li>
                  <t><bcp14>MUST</bcp14> implement forward-secure RNG state management</t>
                </li>
                <li>
                  <t><bcp14>SHOULD</bcp14> use separate RNG instances for different protocol components</t>
                </li>
                <li>
                  <t><bcp14>MUST</bcp14> zeroize RNG state on process termination</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Timing Attacks</strong>: Variable-time operations can leak information about secret values.  </t>
              <t><strong>Attack Vector</strong>: Timing variations in scalar arithmetic or bit operations can reveal secret bit patterns, potentially exposing credit balances or allowing token forgery.  </t>
              <t><strong>Mitigations</strong>:  </t>
              <ul spacing="normal">
                <li>
                  <t><bcp14>MUST</bcp14> use constant-time scalar arithmetic libraries</t>
                </li>
                <li>
                  <t><bcp14>MUST</bcp14> use constant-time conditional selection for range proof conditionals</t>
                </li>
                <li>
                  <t><bcp14>MUST</bcp14> avoid early-exit conditions based on secret values</t>
                </li>
                <li>
                  <t>Critical constant-time operations include:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Scalar multiplication and addition</t>
                    </li>
                    <li>
                      <t>Binary decomposition in range proofs</t>
                    </li>
                    <li>
                      <t>Conditional assignments based on secret bits</t>
                    </li>
                    <li>
                      <t>Challenge verification comparisons</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Nullifier Database Attacks</strong>: Corruption or manipulation of the nullifier database enables double-spending.  </t>
              <t><strong>Attack Vectors</strong>:  </t>
              <ul spacing="normal">
                <li>
                  <t>Database corruption allowing nullifier deletion</t>
                </li>
                <li>
                  <t>Race conditions in concurrent nullifier checks</t>
                </li>
              </ul>
              <t>
<strong>Mitigations</strong>:  </t>
              <ul spacing="normal">
                <li>
                  <t><bcp14>MUST</bcp14> use ACID-compliant database transactions</t>
                </li>
                <li>
                  <t><bcp14>MUST</bcp14> check nullifier uniqueness within the same transaction as insertion</t>
                </li>
                <li>
                  <t><bcp14>SHOULD</bcp14> implement append-only audit logs for nullifier operations</t>
                </li>
                <li>
                  <t><bcp14>MUST</bcp14> implement proper database backup and recovery procedures</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Eavesdropping/Message Modification Attacks</strong>: A network-level adversary can copy spend proofs or modify messages sent between an honest client and issuer.  </t>
              <t><strong>Attack Vectors</strong>:  </t>
              <ul spacing="normal">
                <li>
                  <t>Eavesdropping and copying of proofs</t>
                </li>
                <li>
                  <t>Message modifications causing protocol failure</t>
                </li>
              </ul>
              <t>
<strong>Mitigations</strong>:  </t>
              <ul spacing="normal">
                <li>
                  <t>Client and issuer <bcp14>MUST</bcp14> use TLS 1.3 or above when communicating.</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>State Management Vulnerabilities</strong>: Improper state handling can lead to security breaches.  </t>
              <t><strong>Attack Vectors</strong>:  </t>
              <ul spacing="normal">
                <li>
                  <t>State confusion between protocol sessions</t>
                </li>
                <li>
                  <t>Memory disclosure of sensitive state</t>
                </li>
                <li>
                  <t>Incomplete state cleanup</t>
                </li>
              </ul>
              <t>
<strong>Mitigations</strong>:  </t>
              <ul spacing="normal">
                <li>
                  <t><bcp14>MUST</bcp14> use separate state objects for each protocol session</t>
                </li>
                <li>
                  <t><bcp14>MUST</bcp14> zeroize all sensitive data (keys, nonces, intermediate values) after use</t>
                </li>
                <li>
                  <t><bcp14>SHOULD</bcp14> use memory protection mechanisms (e.g., mlock) for sensitive data</t>
                </li>
                <li>
                  <t><bcp14>MUST</bcp14> implement proper error handling that doesn't leak state information</t>
                </li>
                <li>
                  <t><bcp14>SHOULD</bcp14> use explicit state machines for protocol flow</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Concurrency and Race Conditions</strong>: Parallel operations can introduce vulnerabilities.  </t>
              <t><strong>Attack Vectors</strong>:  </t>
              <ul spacing="normal">
                <li>
                  <t>TOCTOU (Time-of-check to time-of-use) vulnerabilities in nullifier checking</t>
                </li>
                <li>
                  <t>Race conditions in balance updates</t>
                </li>
                <li>
                  <t>Concurrent modification of shared state</t>
                </li>
              </ul>
              <t>
<strong>Mitigations</strong>:  </t>
              <ul spacing="normal">
                <li>
                  <t><bcp14>MUST</bcp14> use appropriate locking for all shared resources</t>
                </li>
                <li>
                  <t><bcp14>MUST</bcp14> perform nullifier check and insertion atomically</t>
                </li>
                <li>
                  <t><bcp14>SHOULD</bcp14> document thread-safety guarantees</t>
                </li>
                <li>
                  <t><bcp14>MUST</bcp14> ensure atomic read-modify-write for all critical operations</t>
                </li>
              </ul>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="known-attack-scenarios">
        <name>Known Attack Scenarios</name>
        <section anchor="parallel-spend-attack">
          <name>1. Parallel Spend Attack</name>
          <t><strong>Scenario</strong>: A malicious client attempts to spend the same token multiple times by initiating parallel spend operations before any nullifier is recorded.</t>
          <t><strong>Prevention</strong>: The issuer <bcp14>MUST</bcp14> ensure atomic nullifier checking and recording within a single database transaction. Network-level rate limiting can provide additional protection.</t>
        </section>
        <section anchor="balance-inflation-attack">
          <name>2. Balance Inflation Attack</name>
          <t><strong>Scenario</strong>: An attacker attempts to create a proof claiming to have more credits than actually issued by manipulating the range proof.</t>
          <t><strong>Prevention</strong>: The cryptographic soundness of the range proof prevents this attack.</t>
        </section>
        <section anchor="token-linking-attack">
          <name>3. Token Linking Attack</name>
          <t><strong>Scenario</strong>: An issuer attempts to link transactions by analyzing patterns in nullifiers, amounts, or timing.</t>
          <t><strong>Prevention</strong>: Nullifiers are cryptographically random and unlinkable. However, implementations <bcp14>MAY</bcp14> add random delays and amount obfuscation where possible.</t>
        </section>
      </section>
      <section anchor="protocol-composition-and-state-management">
        <name>Protocol Composition and State Management</name>
        <section anchor="state-management-requirements">
          <name>State Management Requirements</name>
          <t>Before they make a spend request or an issue request, the client <bcp14>MUST</bcp14> store
their private state (the nullifier, the blinding factor, and the new balance)
durably.</t>
          <t>For the issuer, the spend and refund operations <bcp14>MUST</bcp14> be treated as an atomic
transaction. However, even more is required. If a nullifier associated with a
given spend is persisted to the database, clients <bcp14>MUST</bcp14> be able to access the
associated refund. If they cannot access this, then they can lose access to the
rest of their credits. For performance reasons, an issuer <bcp14>SHOULD</bcp14> automatically
clean these up after some expiry, but if they do so, they <bcp14>MUST</bcp14> inform the
client of this policy so the client can ensure they can retry to retrieve the
rest of their credits in time. Issuers <bcp14>MAY</bcp14> implement functionality to notify
the issuer that the refund request was processed, so they can delete the refund
record. It is not clear that this is worth the cost relative to just cleaning
them up in bulk at some specified expiration date, however if you are memory
constrained this could be useful.</t>
        </section>
        <section anchor="session-management">
          <name>Session Management</name>
          <t>Each protocol session (issuance or spend/refund) <bcp14>MUST</bcp14> use fresh randomness.
See the Randomness Generation section for detailed RNG requirements.</t>
        </section>
        <section anchor="version-negotiation">
          <name>Version Negotiation</name>
          <t>To support protocol evolution, implementations <bcp14>MAY</bcp14> include version negotiation
in the initial handshake. All parties <bcp14>MUST</bcp14> agree on the protocol version before
proceeding.</t>
        </section>
      </section>
      <section anchor="quantum-resistance">
        <name>Quantum Resistance</name>
        <t>This protocol is NOT quantum-resistant. The discrete logarithm problem can be
solved efficiently by quantum computers using Shor's algorithm. Organizations
requiring long-term security should consider post-quantum alternatives. However,
user privacy is preserved even in the presence of a cryptographically relevant
quantum computer.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>This document specifies a number of algorithms for encoding or hashing an arbitrary string to a point on an elliptic curve. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </reference>
        <reference anchor="RFC9496">
          <front>
            <title>The ristretto255 and decaf448 Groups</title>
            <author fullname="H. de Valence" initials="H." surname="de Valence"/>
            <author fullname="J. Grigg" initials="J." surname="Grigg"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="I. Lovecruft" initials="I." surname="Lovecruft"/>
            <author fullname="G. Tankersley" initials="G." surname="Tankersley"/>
            <author fullname="F. Valsorda" initials="F." surname="Valsorda"/>
            <date month="December" year="2023"/>
            <abstract>
              <t>This memo specifies two prime-order groups, ristretto255 and decaf448, suitable for safely implementing higher-level and complex cryptographic protocols. The ristretto255 group can be implemented using Curve25519, allowing existing Curve25519 implementations to be reused and extended to provide a prime-order group. Likewise, the decaf448 group can be implemented using edwards448.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9496"/>
          <seriesInfo name="DOI" value="10.17487/RFC9496"/>
        </reference>
        <reference anchor="BLAKE3" target="https://github.com/BLAKE3-team/BLAKE3-specs/blob/master/blake3.pdf">
          <front>
            <title>BLAKE3: One Function, Fast Everywhere</title>
            <author>
              <organization/>
            </author>
            <date year="2020" month="January" day="09"/>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9474">
          <front>
            <title>RSA Blind Signatures</title>
            <author fullname="F. Denis" initials="F." surname="Denis"/>
            <author fullname="F. Jacobs" initials="F." surname="Jacobs"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document specifies an RSA-based blind signature protocol. RSA blind signatures were first introduced by Chaum for untraceable payments. A signature that is output from this protocol can be verified as an RSA-PSS signature.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9474"/>
          <seriesInfo name="DOI" value="10.17487/RFC9474"/>
        </reference>
        <reference anchor="ORRU-SIGMA" target="https://www.ietf.org/archive/id/draft-orru-zkproof-sigma-protocols-00.txt">
          <front>
            <title>Sigma Protocols</title>
            <author>
              <organization/>
            </author>
            <date year="2025" month="January" day="19"/>
          </front>
        </reference>
        <reference anchor="ORRU-FS" target="https://mmaker.github.io/draft-zkproof-sigma-protocols/draft-orru-zkproof-fiat-shamir.html">
          <front>
            <title>The Fiat-Shamir Transform</title>
            <author>
              <organization/>
            </author>
            <date year="2025" month="January" day="19"/>
          </front>
        </reference>
        <reference anchor="BBS" target="https://crypto.stanford.edu/~dabo/pubs/papers/groupsigs.pdf">
          <front>
            <title>Short Group Signatures</title>
            <author>
              <organization/>
            </author>
            <date year="2004"/>
          </front>
        </reference>
        <reference anchor="KVAC" target="https://eprint.iacr.org/2013/516.pdf">
          <front>
            <title>Keyed-Verification Anonymous Credentials</title>
            <author>
              <organization/>
            </author>
            <date year="2014"/>
          </front>
        </reference>
        <reference anchor="TZ23" target="https://eprint.iacr.org/2023/275">
          <front>
            <title>Revisiting BBS Signatures</title>
            <author>
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 1501?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This appendix provides test vectors for implementers to verify their
implementations. All values are encoded in hexadecimal.</t>
      <!-- TEST_VECTORS_START -->
<t>The following test vector was generated deterministically using a
ChaCha20 RNG seeded with the bytes <tt>00 01 02 ... 1e 1f</tt> and L=8.
The domain separator is <tt>"ACT-v1:test:vectors:v0:2025-01-01"</tt>, credit amount
c=100, spend amount s=30, partial return t=10, and ctx=0. Values labelled <tt>*_cbor</tt>
are the CBOR wire-format encodings (Section 4) of each protocol
message, displayed in hexadecimal.</t>
      <t>Implementations <bcp14>SHOULD</bcp14> verify they can deserialize these CBOR
messages and that a full protocol run with the same deterministic
RNG produces identical output.</t>
      <section anchor="parameters">
        <name>Parameters</name>
        <artwork><![CDATA[
domain_separator: "ACT-v1:test:vectors:v0:2025-01-01"
L: 8
c: 100
s: 30
t: 10
ctx: 0000000000000000000000000000000000000000000000000000000000000000
]]></artwork>
      </section>
      <section anchor="key-generation-1">
        <name>Key Generation</name>
        <artwork><![CDATA[
sk_cbor:
  a201582036e5b43419551a92c809a995a3d2c817a86ce8f5dd973b06fe9cb5a3
  f012870b0258204aceeb1d507e50957db46b6bcd374614b8ea080cbbc77ad060
  666bf5788c8121

pk_cbor:
  58204aceeb1d507e50957db46b6bcd374614b8ea080cbbc77ad060666bf5788c
  8121
]]></artwork>
      </section>
      <section anchor="issuance">
        <name>Issuance</name>
        <artwork><![CDATA[
preissuance_cbor:
  a20158206102398efee33b886f4bb7042b897d83db59b71a05aff76e9b633b87
  cade7d0002582069e5d557cb6094acfa586118e602e90aa6fe6cbabd4571eeb0
  d2f63b8c8a8f07

issuance_request_cbor:
  a4015820aa9315999f76c89406fe743dc7ff12e8fab85871f8c36987c6ec25ee
  ca2cd84e025820811880b9160decfbb41006af6c39056c9b0c139f7acf647fb5
  b0b22486039504035820c319066c466ef36d08809279c02dac8430c119fae886
  7f0c235cd6f6e4514c0f0458206af5dcb3e7138eb2a0f5b523054e05137b558f
  1bb6711b10b689e3565c241506

issuance_response_cbor:
  a60158201eeda51d75404be1bdd06c31aa72bbd38470a4717e732ccf372b91bc
  77161a0e0258204778cf09b14bf78e89e5ef5bcb523863d4e70f9d84ae1fbe75
  778e60a92c290e035820e94bd324b71702e9f29a239b3a064caa4c46d85d9693
  0f75bc39eca6211d2c0f04582029002c4fa8a9f71b8c015fb7869ad64a0fc4e0
  50c7c4955ef6ebff27f722890e05582064000000000000000000000000000000
  0000000000000000000000000000000006582000000000000000000000000000
  00000000000000000000000000000000000000

credit_token_cbor:
  a60158201eeda51d75404be1bdd06c31aa72bbd38470a4717e732ccf372b91bc
  77161a0e0258204778cf09b14bf78e89e5ef5bcb523863d4e70f9d84ae1fbe75
  778e60a92c290e03582069e5d557cb6094acfa586118e602e90aa6fe6cbabd45
  71eeb0d2f63b8c8a8f070458206102398efee33b886f4bb7042b897d83db59b7
  1a05aff76e9b633b87cade7d0005582064000000000000000000000000000000
  0000000000000000000000000000000006582000000000000000000000000000
  00000000000000000000000000000000000000
]]></artwork>
      </section>
      <section anchor="spending">
        <name>Spending</name>
        <artwork><![CDATA[
nullifier:
  69e5d557cb6094acfa586118e602e90aa6fe6cbabd4571eeb0d2f63b8c8a8f07

context:
  0000000000000000000000000000000000000000000000000000000000000000

charge:
  1e00000000000000000000000000000000000000000000000000000000000000

spend_proof_cbor:
  b201582069e5d557cb6094acfa586118e602e90aa6fe6cbabd4571eeb0d2f63b
  8c8a8f070258201e000000000000000000000000000000000000000000000000
  00000000000000035820b221966bf32eafaac154b44f6037083d01314eee2e46
  e11b5003bcd07b6bb074045820562528491b9c19a10cefd74b3e45a89fcfdd62
  440997758ae8fa34d1a8d8583d05885820581721b2e63035cfe346849bd92c2b
  937b8e9404dabe1e5ca29e77de3321852a5820448491c7d81ecc20a9705b1bdd
  4df0c71570df3ad5fd9334758f8df9f56ede32582096431dd3f6ea1d7cb43165
  8d6f0fe14795e569b731c3cbe79bf293d78b6674255820cc718e6924e761e85b
  abf7a2b2336e892bb722c36d5aad88ee962b2d8d6b003a5820349e11dd9143d4
  8cf90e62386ebcada9490ab0ebb87739c49863ddd8a984a43a5820cc635618f8
  1e27bb91252afb2d66ea443cc17e48d4f08c0041f1071e6ead92145820e6e7cd
  cde60cf3fcef195aa9c511636eb31ee52ed1a328a821f9600bc997d25d582092
  857b094af803da09df1a95db12761e860425b53cb7cd967d3c227e535b991d06
  5820c68d2efa21dce1ada7a23b30c34edce8db9d6bc71ce2e8c75921fb179f6c
  d10607582003918610c7af601b6e22c22d0861e781252a24c6f759c4cda08b8f
  1fe7a09003085820c273eff86e662b4d44bcbdb73b0e4eec7714662dd1c0db61
  5ad53260a2b7650b0958207dbd42848d4dc3cb0a5461f26a08c3761f5decf00c
  d97976302a12a1ec46dc0e0a5820e97e15f04be7008f2f1c0bc69d2d4bebfbd1
  8bcca213f1ccf6187e933166e9050b5820a19468507a55c3e47628a435e3210e
  8024dc8259a06fdf7efb8c0e70d4a07e0d0c5820786081f2c4f6061d3e313f67
  cc7f73500283ffefa13a0f829e7ce85c8b19640b0d5820b8b352e7cb2066cef5
  cbbb79ae17852b0e44c82dc29b4b9a76d3422037e14c0c0e8858209411a6afca
  a687cba25c7a3ba2e3f3e12917bce920615a6073b7dceebad92b0b58205d5690
  3268f420e1ccc725685a7be6edd935f9a1ddc0e11508d648268e198b09582046
  040cd466c38375c1811153671aeed9530a3f052ed30c660d33141252255f0458
  209aa8b4018a9a0d53701b704bcd5636b1870749f1fd45dda322764282784707
  0a5820e3c62f417f88e5b7ec2182560e0d852e50e37a1d7ac00a8f5e090a7205
  f41f0d58205f22918a53fb88546521a44238ce5608c13c6ebf0f11f6784c835a
  c531b8720a58209d04a1b04cc9f59818dbaf7d04da70d2446145f9534886bce9
  5ed2b70df7cd095820346599fabc841424884cd029f3d63ae63158c6b4c975af
  e0d1147715d462aa020f88825820677b5e013537036d2e0c11ec8117799424bc
  ee744e7b1bd9571b7c464c7b72085820ba017329a9e86ccbe5ed1c76a1362f39
  9724cc7211b77940b6c513155bb1b30e825820ab6c718a173c91b3d30670fa50
  862021895ca40c818bc9d15e4110f7c0a4640958203c36da850f85cf51fdc896
  54b0a853677308974b9ea38e6e7e49ce94560ca8018258201b7d378abce009fc
  e50133f2d77380f3492794f72b209407e155f8ed8341bd05582057aa6d5d46a6
  d3b63c1d45af5c8d66ebc78494ee94df100b6cefc775fa6db8098258205612d9
  c1afb3c81bc81860c99b18466af0797eec6ebb3c6b8207b0521ffdf20c58209f
  5184c3bd8bc8d7a3f33941a3e8126850fbc795d4809dfeb5f363a30ff2ee0482
  58204c7c14d9881aa291a136ab4979d832cf5c80b75c8fe00ca976f65b3d4c9d
  150c5820150b6c20f4b894b4d491a252b4956c72e880639b7880f25f6ad0cba1
  6dbd020f8258207b2bc0d260f1f3ac32dfa6643a721a845faf9fe8e5de52751f
  5d824fa34e770f58209fe39299e57caa120937957a8957cd6c25f14958ea8e7b
  6333a2ac501bc144068258201f19d99a4e9955cc464fe48912f51399358bc678
  4a22312a95233e592dd1070558204c666f3adfaa3806b290247faa6950bb74e2
  70c9155f5004d407d21f223c0802825820d0b1d956f1b1a4ffb3c1a447bcb22a
  0e5679b70ca98357ce0dd5b6670bdc480e582017636a9a14caef700e53785bcb
  bd98380ac45d53af06107e99911fbf4ccf24001058201c7ad54f635ebd976c1e
  4fc275d93ce2e0981bbcaacb3745deda0be61cfe9f07115820c8451b222fdf76
  abc8a76dd90d1b5526de7e510809750825eea0cce6a4fe1c0212582000000000
  00000000000000000000000000000000000000000000000000000000

prerefund_cbor:
  a40158200f9288d8ef1360d8ef4967e041bf09a716c093956464370d30dfe283
  2be71b06025820ebada4fb4050db92729a58f0ae585f76154103a2ef2166c401
  12638f006d280b03582046000000000000000000000000000000000000000000
  0000000000000000000004582000000000000000000000000000000000000000
  00000000000000000000000000
]]></artwork>
      </section>
      <section anchor="refund">
        <name>Refund</name>
        <artwork><![CDATA[
refund_cbor:
  a5015820880974b47fd0d4d06333e2f047abc4420992bd903ed44dae86199a54
  361f9c540258208a0977b088e9d17a637f71a013c67774648f0da03b141404ae
  678a0e5e090b04035820fdcd645c0d6e13905fff07e56d63465e4cc585f3c247
  8500c96cd361a4ad01070458202c9f3110e53540738100e7e636949ce7ac08bf
  b4ac6867fb72ac6ec847a2f90e0558200a000000000000000000000000000000
  00000000000000000000000000000000
]]></artwork>
      </section>
      <section anchor="refund-token">
        <name>Refund Token</name>
        <artwork><![CDATA[
refund_token_cbor:
  a6015820880974b47fd0d4d06333e2f047abc4420992bd903ed44dae86199a54
  361f9c540258208a0977b088e9d17a637f71a013c67774648f0da03b141404ae
  678a0e5e090b04035820ebada4fb4050db92729a58f0ae585f76154103a2ef21
  66c40112638f006d280b0458200f9288d8ef1360d8ef4967e041bf09a716c093
  956464370d30dfe2832be71b0605582050000000000000000000000000000000
  0000000000000000000000000000000006582000000000000000000000000000
  00000000000000000000000000000000000000

refund_token_credits:
  5000000000000000000000000000000000000000000000000000000000000000

refund_token_nullifier:
  ebada4fb4050db92729a58f0ae585f76154103a2ef2166c40112638f006d280b

remaining_balance: 80
]]></artwork>
        <!-- TEST_VECTORS_END -->

</section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>This section records the status of known implementations of the protocol
defined by this specification at the time of posting of this Internet-Draft,
and is based on a proposal described in RFC 7942.</t>
      <section anchor="anonymous-credit-tokens">
        <name>anonymous-credit-tokens</name>
        <t>Organization: Google</t>
        <t>Description: Reference implementation in Rust</t>
        <t>Maturity: Beta</t>
        <t>Coverage: Complete protocol implementation</t>
        <t>License: Apache 2.0</t>
        <t>Contact: sgschlesinger@gmail.com</t>
        <t>URL: https://github.com/SamuelSchlesinger/anonymous-credit-tokens</t>
      </section>
    </section>
    <section anchor="terminology-glossary">
      <name>Terminology Glossary</name>
      <t>This glossary provides quick definitions of key terms used throughout this document:</t>
      <t><strong>ACT (Anonymous Credit Tokens)</strong>: The privacy-preserving authentication protocol specified in this document.</t>
      <t><strong>Blind Signature</strong>: A cryptographic signature where the signer signs a message without seeing its content.</t>
      <t><strong>Refund</strong>: The refund issued for the remaining balance after a partial spend.</t>
      <t><strong>Credit</strong>: A numerical unit of authorization that can be spent by clients.</t>
      <t><strong>Domain Separator</strong>: A unique string used to ensure cryptographic isolation between different deployments.</t>
      <t><strong>Element</strong>: A point in the Ristretto255 elliptic curve group.</t>
      <t><strong>Issuer</strong>: The entity that creates and signs credit tokens.</t>
      <t><strong>Nullifier</strong>: A unique value revealed during spending that prevents double-spending of the same token.</t>
      <t><strong>Partial Spending</strong>: The ability to spend less than the full value of a token and receive change.</t>
      <t><strong>Scalar</strong>: An integer modulo the group order q, used in cryptographic operations.</t>
      <t><strong>Sigma Protocol</strong>: An interactive zero-knowledge proof protocol following a commit-challenge-response pattern.</t>
      <t><strong>Token</strong>: A cryptographic credential containing a BBS signature and associated data (A, e, k, r, c, ctx).</t>
      <t><strong>Unlinkability</strong>: The property that transactions cannot be correlated with each other or with token issuance.</t>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank the Crypto Forum Research Group for their
valuable feedback and suggestions. Special thanks to the contributors who
provided implementation guidance and security analysis.</t>
      <t>This work builds upon the foundational research in anonymous credentials and
zero-knowledge proofs by numerous researchers in the cryptographic community,
particularly the work on BBS signatures by Boneh, Boyen, and Shacham, and
keyed-verification anonymous credentials by Chase, Meiklejohn, and Zaverucha.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
GHOAEXXYSc4g1/IYyA+5b0CRkrfQ5L2UuNbZBw1bgfJ9uC03gYWV5XiX0RrN
aO2YHU6LI2vWiuy5w5Cj9K+vyFyI7zC8dHw2vsPsaq8b3GF3mcyF+A6ry8lc
iO+wu0zmQnxXhoMOeSfBrnyDJPy6zIUk2jlS/LWZC8m9cx1M5kJyB046mQuJ
kX7vuTbwnTGApOOetDTH5oM+908k+V8khU3y5/E1FLZl+a/ba1q/tjeWYJHo
20pbirvZ+qtiX9piEbrqwlohMFOOQFf+21o0B8rc1AF7+/rd65PXp+9/fPr2
7MXrVwDSg9yWdustbAkwW/WzZ8La12E/eGDqxJDR153Ylokh64ysLgwF2UN1
vvNFTW9zTKdtCVxdxAurlQLenL4vlY4lQM6LsrVIbGa/fi+GizmYq+Y8fI87
eKb6FZ9VSS2t9TlFpLSFaLijLXOc5jnbVHTOYGuL64x7Kn1kX3fjKbZWdN1W
k0+qDVHlXP6BnvAQsxeejVpM+eyEyvm0FSHMwYg7xdJM4ZaMJf405d90Mrhj
TLX1ab1uSdvDluKlsldbu0wX7XNlLN9TAGxWVyt+XZDelnFq6uokahNtWhfH
0zRT001XhT8+8o/PTl68MGS0XuhLTCwqy7gZ47ETUEUc9gHbBdfZR5X/S+s/
rbPOPes/PZ3ldaH2vgv371kFynSInMpP9+oQmw7De3awtaVGd3QQ/O0bw90K
MQtttkdlCM+7TWBz4a8tV1AcVNry1Wtavyedj0y1D4rlyRV8qT9ZbCJb8UYp
Pqu3LNMbdLcT9G/dvh6GDiZ2aZRbd2Tyy4rulrrUbLnxyOyq1UhSLm0rLWNv
m9uoeWSqBcYXBIaJVBIlL06+MhBop/iWwwDvIYCXU/WebnGlM12CjAbdp8Kn
/q+G4jUF2O6OWrDVP23BI48SHNY1klvqiMnL3A/raDWPAgGQ+PaFAZI6Enl2
qvs4uqAtEdSsMpDRciWyWtSC19NF8aVCqHlFwxSplEJLqjNgepVV5yvysLEL
t6ajA7v2Gm57VpmbnEIH5axEmBJpZqNIoOaf2nK6toatyGRDwBsRoQ49bxDf
LkbZIDqlF+PWWtyksxelLlApNW30sEeGiNj8EYLgZn2uKwmVsCfkF0dCfoe+
+UI5tfp0oT5NWJ2p9Kq7IQx3omUtJPp+qjbmEkruCSW35e3aUqlW09piSq3V
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

-->

</rfc>
