<?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.25 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-robert-privacypass-batched-tokens-01" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="Batched Tokens">Batched Token Issuance Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-robert-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="2023" month="March" day="13"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <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>
    <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="6" month="March" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for constructing
   privacy-preserving authentication mechanisms.  It provides
   recommendations on how the architecture should be deployed to ensure
   the privacy of clients and the security of all participating
   entities.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-architecture-11"/>
        </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="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare</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="6" month="March" 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-10"/>
        </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="6" month="March" year="2023"/>
            <abstract>
              <t>   This document defines an HTTP authentication scheme that 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 an acceptable
   Privacy Pass token.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-auth-scheme-09"/>
        </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">
              <organization/>
            </author>
            <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>
