<?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.17 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-robert-privacypass-batched-tokens-00" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.2 -->
  <front>
    <title abbrev="Batched Tokens">Batched Token Issuance Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-robert-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="2022" month="November" day="06"/>
    <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(0x0001, pkI)
]]></artwork>
      <t>Here, 0x0001 is the two-octet 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(0x0001, 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="17" month="October" year="2022"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for constructing
   anonymous-credential 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-08"/>
        </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-Hernández" initials="A." surname="Faz-Hernández">
              <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="July" year="2022"/>
            <abstract>
              <t>   This document specifies two variants of the the two-message issuance
   protocol for Privacy Pass tokens: one that produces tokens that are
   privately verifiable, and another that produces tokens that are
   publicly verifiable.  The privately verifiable issuance protocol
   optionally supports public metadata during the issuance flow.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-06"/>
        </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-Hernández" initials="A." surname="Faz-Hernández">
              <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="6" month="October" year="2022"/>
            <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 secret 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
   secret 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.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-14"/>
        </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="5" month="August" year="2022"/>
            <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-05"/>
        </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:
H4sIAAAAAAAAA71abXMbtxH+jl+BSjMdsuFdJTr2JHTVRpFlS9Oa1khy+sHj
iuAdSGJ0PFyAO8mMxPz27i5w75TtJp3wg00egMW+PvsApyAIWK7yRE743o8i
j1Yy5tf6Vqb83NpCpJHkF0bnOtLJHhPzuZF3E96aaFmso1SsQUJsxCIPjJ5L
kweZUXci2mTC2mDuFgQ5LQgODlgkcrnUZjPhKl1oxlRmJjw3hc3HBwffH4zZ
rdzcaxNP+HmaS5PKPHiF0hmzuUjjG5HoFHbcSMsyNeEfQMMRt9rkRi4sfNus
8ctHxkSRr7SZMB4wDh+V2gm/DPklKUmPnO6XIlsJmTQHtFlO+MVKy1R94pd/
fkUP5VqoBLSW+eIH49Y4g8NIr1u7nIT8OOT/1jpubHOyMsrmOltJ0xqlvU4S
XcSLRBjZ3CoS9z+spMhUupyr3IbgC8aCIOBibnMjIvh1vVKWQxiKtUxzbjMZ
qYWSlgt+J4wS8EwveL7CWFJQ+AVEhasywpmPMEwRORNJou8tX2jDfdzqmSiG
Yhhy2tPPjRIFG1sY40b+XEib87U2EuWlDALlFnGRg0a5WksOIaQNULA0tBC+
ynoV37EqdGavVRwnkrF9TA2j4yLKlU7/f04YCEhpuVApGp7yh4c/HV+enB2d
B69CjHorsYWJViqXUV4Yud0OyYG870D2exy4yxXstzrwGuyfC/tFJ4DV51dX
74+nJ6e7LS9nbrfeWZZDZeYykSBPpDrdrHVhvbEjfr9S0QpSOeVS5Zj8c9is
mCcqSjb8ThoIlZhDVMGkVOdQGCuVSK5yUI1n2loFg+SdIuXrIslVhsMpgkEE
W/vI9uxgEMBMGPCyTEZchstwxDVsBw4ppXyCMEMZpTYD9OC2ADWF5WfX1xd/
fQZu+Ad+e3Z0+frk+8PDb7fbEcONIm0pnWINVQm4w20kwHKegCOEAZPuwUpS
KS3WgA44t9I29LlapuW8UElseZHplJaQm8GTTcc8Uay8sICAP727uHyNIcP/
XbgMhCtamGVwpzOzALWp5L6utNnvycwdpU3Z/6XUhGLmcrGAUhr1dcukAZFr
/M68p+cyh77g5JVeLx3b95WRS4BdUocKwMl3OuSbTLLBwwPEQrgOFeAjKOcR
Wg2JCk6O64heuPC4LonZwbHHgJMUNDVEIgvCwREdDHl/fXZ1cnb69ol6QhmB
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
D6H0d4ZHjQSwe1v2X4S90bmBKAAA

-->

</rfc>
