<?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.8 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-privacypass-batched-tokens-01" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.1 -->
  <front>
    <title abbrev="Batched Tokens">Batched Token Issuance Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-batched-tokens-01"/>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2024" month="April" day="08"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 25?>

<t>This document specifies a variant of the Privacy Pass issuance protocol that
allows for batched issuance of tokens. This allows clients to request more than
one token at a time and for issuers to isse more than one token at a time.</t>
    </abstract>
  </front>
  <middle>
    <?line 31?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies a variant of the Privacy Pass issuance protocol (as
defined in <xref target="ARCH"/>) that allows for batched
issuance of tokens. This allows clients to request more than one token at a time
and for issuers to isse more than one token at a time.</t>
      <t>The base Privacy Pass issuance protocol
<xref target="ISSUANCE"/> defines stateless anonymous tokens,
which can either be publicly verifiable or not. While it is possible to run
multiple instances of the issuance protocol in parallel, e.g., over a
multiplexed transport such as HTTP/3 <xref target="HTTP3"/>, the cost of doing so
scales linearly with the number of instances.</t>
      <t>This variant builds upon the privately verifiable issuance protocol that uses
VOPRF <xref target="OPRF"/>, and allows for batched issuance of tokens.
This allows clients to request more than one token at a time and for issuers to
issue more than one token at a time. In effect, batched issuance performance
scales better than linearly.</t>
      <t>This issuance protocol registers the batched token type (<xref target="iana-token-type"/>),
to be used with the PrivateToken HTTP authentication scheme defined in
<xref target="AUTHSCHEME"/>.</t>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>Privately Verifiable Tokens (as defines in
<xref target="ISSUANCE"/>) offer a simple way to unlink the
issuance from the redemption. The base protocol however only allows for a single
token to be issued at a time for every challenge. In some cases, especially
where a large number of clients need to fetch a large number of tokens, this may
introduce performance bottlenecks. The Batched Token Issuance Protocol improves
upon the basic Privately Verifiable Token issuance protocol in the following key
ways:</t>
      <ol spacing="normal" type="1"><li>
          <t>Issuing multiple tokens at once in response to a single TokenChallenge,
thereby reducing the size of the proofs required for multiple tokens.</t>
        </li>
        <li>
          <t>Improving server and client issuance efficiency by amortizing the cost of the
VOPRF proof generation and verification, respectively.</t>
        </li>
      </ol>
    </section>
    <section anchor="client-to-issuer-request">
      <name>Client-to-Issuer Request</name>
      <t>Except where specified otherwise, the client follows the same protocol as
described in <xref section="5.1" sectionFormat="comma" target="ISSUANCE"/>.</t>
      <t>The Client first creates a context as follows:</t>
      <artwork><![CDATA[
client_context = SetupVOPRFClient(ciphersuiteID, pkI)
]]></artwork>
      <t><tt>ciphersuiteID</tt> is the ciphersuite identifier from <xref target="OPRF"/> corresponding
to the ciphersuite being used for this token version. SetupVOPRFClient is
defined in <xref section="3.2" sectionFormat="comma" target="OPRF"/>.</t>
      <t><tt>Nr</tt> denotes the number of tokens the clients wants to request. For every token,
the Client then creates an issuance request message for a random value <tt>nonce</tt>
with the input challenge and Issuer key identifier as described below:</t>
      <artwork><![CDATA[
nonce_i = random(32)
challenge_digest = SHA256(challenge)
token_input = concat(token_type, nonce_i, challenge_digest, token_key_id)
blind_i, blinded_element_i = client_context.Blind(token_input)
]]></artwork>
      <t><tt>token_type</tt> corresponds to the 2-octet integer in the challenge.</t>
      <t>The above is repeated for each token to be requested. Importantly, a fresh nonce
MUST be sampled each time.</t>
      <t>The Client then creates a TokenRequest structured as follows:</t>
      <sourcecode type="tls"><![CDATA[
struct {
    uint8_t blinded_element[Ne];
} BlindedElement;

struct {
   uint16_t token_type;
   uint8_t truncated_token_key_id;
   BlindedElement blinded_elements<0..2^16-1>;
} TokenRequest;
]]></sourcecode>
      <t>The structure fields are defined as follows:</t>
      <ul spacing="normal">
        <li>
          <t>"token_type" is a 2-octet integer, which matches the type in the challenge.</t>
        </li>
        <li>
          <t>"truncated_token_key_id" is the least significant byte of the <tt>token_key_id</tt>
in network byte order (in other words, the last 8 bits of <tt>token_key_id</tt>).</t>
        </li>
        <li>
          <t>"blinded_elements" is a list of <tt>Nr</tt> serialized elements, each of length <tt>Ne</tt>
bytes and computed as <tt>SerializeElement(blinded_element_i)</tt>, where
blinded_element_i is the i-th output sequence of <tt>Blind</tt> invocations above. Ne
is as defined in <xref section="4" sectionFormat="comma" target="OPRF"/>.</t>
        </li>
      </ul>
      <t>Upon receipt of the request, the Issuer validates the following conditions:</t>
      <ul spacing="normal">
        <li>
          <t>The TokenRequest contains a supported token_type equal to one of the batched
token types defined in this document.</t>
        </li>
        <li>
          <t>The TokenRequest.truncated_token_key_id corresponds to a key ID of a Public
Key owned by the issuer.</t>
        </li>
        <li>
          <t>Nr, as determined based on the size of TokenRequest.blinded_elements, is
less than or equal to the number of tokens that the issuer can issue in a
single batch.</t>
        </li>
      </ul>
      <t>If any of these conditions is not met, the Issuer MUST return an HTTP 400 error
to the client.</t>
    </section>
    <section anchor="issuer-to-client-response">
      <name>Issuer-to-Client Response</name>
      <t>Except where specified otherwise, the client follows the same protocol as
described in <xref section="5.2" sectionFormat="comma" target="ISSUANCE"/>.</t>
      <t>Upon receipt of a TokenRequest, the Issuer tries to deseralize the i-th element
of TokenRequest.blinded_elements using DeserializeElement from <xref section="2.1" sectionFormat="of" target="OPRF"/>, yielding <tt>blinded_element_i</tt> of type <tt>Element</tt>. If this fails for any of
the TokenRequest.blinded_elements values, the Issuer MUST return an HTTP 400
error to the client. Otherwise, if the Issuer is willing to produce a token to
the Client, the issuer forms a list of <tt>Element</tt> values, denoted
<tt>blinded_elements</tt>, and computes a blinded response as follows:</t>
      <artwork><![CDATA[
server_context = SetupVOPRFServer(ciphersuiteID, skI, pkI)
evaluated_elements, proof = server_context.BlindEvaluateBatch(skI, blinded_elements)
]]></artwork>
      <t><tt>ciphersuiteID</tt> is the ciphersuite identifier from <xref target="OPRF"/> corresponding
to the ciphersuite being used for this token version. SetupVOPRFServer is
defined in <xref section="3.2" sectionFormat="comma" target="OPRF"/>. The issuer uses a list of
blinded elements to compute in the proof generation step. The
<tt>BlindEvaluateBatch</tt> function is a batch-oriented version of the <tt>BlindEvaluate</tt>
function described in <xref section="3.3.2" sectionFormat="comma" target="OPRF"/>. The description of
<tt>BlindEvaluateBatch</tt> is below.</t>
      <artwork><![CDATA[
Input:

  Element blindedElements[Nr]

Output:

  Element evaluatedElements[Nr]
  Proof proof

Parameters:

  Group G
  Scalar skS
  Element pkS

def BlindEvaluateBatch(blindedElements):
  evaluatedElements = []
  for blindedElement in blindedElements:
    evaluatedElements.append(skS * blindedElement)

  proof = GenerateProof(skS, G.Generator(), pkS,
                        blindedElements, evaluatedElements)
  return evaluatedElements, proof
]]></artwork>
      <t>The Issuer then creates a TokenResponse structured as follows:</t>
      <sourcecode type="tls"><![CDATA[
struct {
    uint8_t evaluated_element[Ne];
} EvaluatedElement;

struct {
   EvaluatedElement evaluated_elements<0..2^16-1>;
   uint8_t evaluated_proof[Ns + Ns];
} TokenResponse;
]]></sourcecode>
      <t>The structure fields are defined as follows:</t>
      <ul spacing="normal">
        <li>
          <t>"evaluated_elements" is a list of <tt>Nr</tt> serialized elements, each of length
<tt>Ne</tt> bytes and computed as <tt>SerializeElement(evaluate_element_i)</tt>, where
evaluate_element_i is the i-th output of <tt>BlindEvaluate</tt>.</t>
        </li>
        <li>
          <t>"evaluated_proof" is the (Ns+Ns)-octet serialized proof, which is a pair of
Scalar values, computed as <tt>concat(SerializeScalar(proof[0]),
SerializeScalar(proof[1]))</tt>, where Ns is as defined in <xref section="4" sectionFormat="comma" target="OPRF"/>.</t>
        </li>
      </ul>
    </section>
    <section anchor="finalization">
      <name>Finalization</name>
      <t>Upon receipt, the Client handles the response and, if successful, deserializes
the body values TokenResponse.evaluate_response and
TokenResponse.evaluate_proof, yielding <tt>evaluated_elements</tt> and <tt>proof</tt>. If
deserialization of either value fails, the Client aborts the protocol.
Otherwise, the Client processes the response as follows:</t>
      <artwork><![CDATA[
authenticator_values = client_context.FinalizeBatch(token_input, blind, evaluated_elements, blinded_elements, proof)
]]></artwork>
      <t>The <tt>FinalizeBatch</tt> function is a batched variant of the <tt>Finalize</tt> function as
defined in <xref section="3.3.2" sectionFormat="comma" target="OPRF"/>. <tt>FinalizeBatch</tt> accepts lists of evaluated
elements and blinded elements as input parameters, and is implemented as
described below:</t>
      <artwork><![CDATA[
Input:

  PrivateInput input
  Scalar blind
  Element evaluatedElements[Nr]
  Element blindedElements[Nr]
  Proof proof

Output:

  opaque output[Nh * Nr]

Parameters:

  Group G
  Element pkS

Errors: VerifyError

def FinalizeBatch(input, blind, evaluatedElements, blindedElements, proof):
  if VerifyProof(G.Generator(), pkS, blindedElements,
                 evaluatedElements, proof) == false:
    raise VerifyError

  output = nil
  for evaluatedElement in evaluatedElements:
    N = G.ScalarInverse(blind) * evaluatedElement
    unblindedElement = G.SerializeElement(N)
    hashInput = I2OSP(len(input), 2) || input ||
                I2OSP(len(unblindedElement), 2) || unblindedElement ||
                "Finalize"
    output = concat(output, Hash(hashInput))

  return output
]]></artwork>
      <t>If this succeeds, the Client then constructs <tt>Nr</tt> Token values as follows, where
<tt>authenticator</tt> is the i-th Nh-byte length slice of <tt>authenticator_values</tt> that
corresponds to <tt>nonce</tt>, the i-th nonce that was sampled in
<xref target="client-to-issuer-request"/>:</t>
      <artwork><![CDATA[
struct {
    uint16_t token_type;
    uint8_t nonce[32];
    uint8_t challenge_digest[32];
    uint8_t token_key_id[32];
    uint8_t authenticator[Nh];
} Token;
]]></artwork>
      <t>If the FinalizeBatch function fails, the Client aborts the protocol.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <t>Implementors SHOULD be aware of the security considerations described in <xref section="6.2.3" sectionFormat="comma" target="OPRF"/> and implement mitigation mechanisms. Application can mitigate
this issue by limiting the number of clients and limiting the number of token
requests per client per key.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA considerations</name>
      <section anchor="iana-token-type">
        <name>Token Type</name>
        <t>This document updates the "Token Type" Registry (<xref target="AUTHSCHEME"/>) with the
following value:</t>
        <table anchor="aeadid-values">
          <name>Token Types</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Publicly Verifiable</th>
              <th align="left">Public Metadata</th>
              <th align="left">Private Metadata</th>
              <th align="left">Nk</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0xF901</td>
              <td align="left">Batched Token VOPRF (P-384, SHA-384)</td>
              <td align="left">N</td>
              <td align="left">N</td>
              <td align="left">N</td>
              <td align="left">32</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">0xF91A</td>
              <td align="left">Batched Token VOPRF (ristretto255, SHA-512)</td>
              <td align="left">N</td>
              <td align="left">N</td>
              <td align="left">N</td>
              <td align="left">32</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="ARCH">
          <front>
            <title>The Privacy Pass Architecture</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="September" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for authorization
   based on privacy-preserving authentication mechanisms.  It describes
   the conceptual model of Privacy Pass and its protocols, its security
   and privacy goals, practical deployment models, and recommendations
   for each deployment model that helps ensure the desired security and
   privacy goals are fulfilled.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-architecture-16"/>
        </reference>
        <reference anchor="ISSUANCE">
          <front>
            <title>Privacy Pass Issuance Protocol</title>
            <author fullname="Sofia Celi" initials="S." surname="Celi">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="3" month="October" year="2023"/>
            <abstract>
              <t>   This document specifies two variants of the two-message issuance
   protocol for Privacy Pass tokens: one that produces tokens that are
   privately verifiable using the issuance private key, and another that
   produces tokens that are publicly verifiable using the issuance
   public key.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-16"/>
        </reference>
        <reference anchor="OPRF">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) using Prime-Order Groups</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="21" month="February" year="2023"/>
            <abstract>
              <t>   An Oblivious Pseudorandom Function (OPRF) is a two-party protocol
   between client and server for computing the output of a Pseudorandom
   Function (PRF).  The server provides the PRF private key, and the
   client provides the PRF input.  At the end of the protocol, the
   client learns the PRF output without learning anything about the PRF
   private key, and the server learns neither the PRF input nor output.
   An OPRF can also satisfy a notion of 'verifiability', called a VOPRF.
   A VOPRF ensures clients can verify that the server used a specific
   private key during the execution of the protocol.  A VOPRF can also
   be partially-oblivious, called a POPRF.  A POPRF allows clients and
   servers to provide public input to the PRF computation.  This
   document specifies an OPRF, VOPRF, and POPRF instantiated within
   standard prime-order groups, including elliptic curves.  This
   document is a product of the Crypto Forum Research Group (CFRG) in
   the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-21"/>
        </reference>
        <reference anchor="AUTHSCHEME">
          <front>
            <title>The Privacy Pass HTTP Authentication Scheme</title>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="23" month="October" year="2023"/>
            <abstract>
              <t>   This document defines an HTTP authentication scheme for Privacy Pass,
   a privacy-preserving authentication mechanism used for authorization.
   The authentication scheme in this document can be used by clients to
   redeem Privacy Pass tokens with an origin.  It can also be used by
   origins to challenge clients to present Privacy Pass tokens.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-auth-scheme-15"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="HTTP3">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA81abXPbuBH+jl+B2jMdqSextpxk7pS6rc9xEk8bxWMn1w+Z
1IJIyMKYIlgAsqOzfb+9uwvwnb54cm2n/pBIBLDY12cfgBqPx8wpl8op3/lR
uHglE/5BX8uMn1q7EVks+ZnRTsc63WFisTDyZsobEy1LdJyJNUhIjFi6sZJu
Oc6NuhHxNhfWjhd++tjR9PHePouFk1fabKfcuoQxlZspd2Zj3WRv74e9CbuW
21ttkik/zZw0mXTjVyiaMetEllyKVGew3VZalqsp/wTqjbjVxhm5tPBpu8YP
nxkTG7fSZsr4mHH4U5md8vOIn+uFNI4eecXPRb4SMq0PaHM15WcrLTP1hZ//
/hU9lGuh0ilHC/9q/BpDS6JYrxu7HEf8KOL/0DqpbXO8Mso6na+kaYzSXsep
3iTLVBhZ3yoWt39dSZGr7GqhnI3AF4yNx2MuFtYZEcO3DytlOcRgs5aZ4zaX
sVoqabngN8IoAc/0krsVBpJiws8gKFwV4c1DeGGKcEykqb61fKkND2GrZqIY
CmHEac8wN04VbGxhjBv5r420jq+1kSgvYxAov4gLBxo5tZYcQkgboGBpaCF8
lNUq3rMq8mavVZKkkrFdTA2jk03slM7+c04YCMhnuVQZGp7xu7vfHZ0fvz08
Hb+KOnktTLxSTsZuY+TDw5AcyLsOZL/FgX2uYN/qwA9g/0LYrzmBgdWnFxcf
j2bHJ/2WFzMfHrh3loVChppOJcgTmc62a72xwdgRu12peAWpnHGpHCb/Ajbb
LFIVp1t+Iw2ESixS8I/hmXZQGCsF35QD1XiurVU4iN7ZZGy9SZ3KcThDMIhh
6xDZbjAhgLkw4GWZjriMrqIR17AdF6WULxBmKKPM5oAe3G5ATWH52w8fzv54
AMH/C346ODx/ffzD/v6zh4cRbRRrS+mUaKhKwB1mYwGW8xQcIQyYdAtW0sxs
swZ0wLmltlHI1SItFxuVJpZvcp3REnIzeLLhmP5i5RsLCPjT+7Pz15io+L8P
l4FwxUtzNb7RuVmi2pgxTytt9lsys6e0Kfu/lppQzFwul1BKo65uuTQgco2f
C08vpIO+4OUVXi8c2/WVkVcAu6QOFYCX73Vw21zywd0dxEL4BjXGR1DOIwZW
Q6KCk5Mqomc+PL5FYnZw7DHgJAU9DZCIWxAOjqgwBKvp6OOHtxfHb0/ePVJP
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
A/s3fWTFX0YqAAA=

-->

</rfc>
