<?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.6.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-privacypass-batched-tokens-00" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.0 -->
  <front>
    <title abbrev="Batched Tokens">Batched Token Issuance Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-batched-tokens-00"/>
    <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="2023" month="September" day="09"/>
    <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>Issuing multiple tokens at once in response to a single TokenChallenge,
thereby reducing the size of the proofs required for multiple tokens.</li>
        <li>Improving server and client issuance efficiency by amortizing the cost of the
VOPRF proof generation and verification, respectively.</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("ristretto255-SHA512", pkI)
]]></artwork>
      <t>Here, "ristretto255-SHA512" is the identifier corresponding to the OPRF(ristretto255,
SHA-512) ciphersuite in <xref target="OPRF"/>. 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(0xF91A, nonce_i, challenge_digest, key_id)
blind_i, blinded_element_i = client_context.Blind(token_input)
]]></artwork>
      <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 = 0xF91A;
   uint8_t 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>"token_type" is a 2-octet integer, which matches the type in the challenge.</li>
        <li>"token_key_id" is the least significant byte of the <tt>key_id</tt> in network byte
order (in other words, the last 8 bits of <tt>key_id</tt>).</li>
        <li>"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"/>.</li>
      </ul>
      <t>Upon receipt of the request, the Issuer validates the following conditions:</t>
      <ul spacing="normal">
        <li>The TokenRequest contains a supported token_type equal to 0xF91A.</li>
        <li>The TokenRequest.token_key_id corresponds to a key ID of a Public Key owned by
the issuer.</li>
        <li>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.</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("ristretto255-SHA512", skI, pkI)
evaluated_elements, proof = server_context.BlindEvaluateBatch(skI, blinded_elements)
]]></artwork>
      <t>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>"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>.</li>
        <li>"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"/>.</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 = 0xF91A
    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">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>
        <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="9" month="August" 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-14"/>
        </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="16" month="August" 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-12"/>
        </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="9" month="August" 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-12"/>
        </reference>
      </references>
      <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:
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

-->

</rfc>
