<?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.20 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-privacypass-batched-tokens-03" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.24.0 -->
  <front>
    <title abbrev="Batched Tokens">Batched Token Issuance Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-batched-tokens-03"/>
    <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="November" day="05"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 26?>

<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 issue more than one token at a time.</t>
    </abstract>
  </front>
  <middle>
    <?line 32?>

<section anchor="change-log">
      <name>Change Log:</name>
      <t>RFC EDITOR PLEASE DELETE THIS SECTION.</t>
      <t>draft-03</t>
      <ul spacing="normal">
        <li>
          <t>Arbitrary token types</t>
        </li>
        <li>
          <t>Error code 400 aligned with RFC9578 and replaced by error code 422</t>
        </li>
      </ul>
      <t>draft-02</t>
      <ul spacing="normal">
        <li>
          <t>Renaming TokenRequest to BatchTokenRequest and TokenResponse to
BatchTokenResponse</t>
        </li>
        <li>
          <t>IANA: Media types for BatchTokenRequest and BatchTokenResponse</t>
        </li>
        <li>
          <t>IANA: Expand Token Type registry entry</t>
        </li>
        <li>
          <t>Various editorial fixes</t>
        </li>
      </ul>
      <t>draft-01</t>
      <ul spacing="normal">
        <li>
          <t>Initial WG document version</t>
        </li>
      </ul>
    </section>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies two Privacy Pass issuance protocols (as defined in
<xref target="RFC9576"/>) that allow 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.</t>
      <t>The base Privacy Pass issuance protocol
<xref target="RFC9578"/> 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"/> or by orchestrating
multiple HTTP requests, these ad-hoc solutions vary based on transport protocol
support. In addition, in some cases, they cannot take advantage of cryptographic
optimizations.</t>
      <t>The first variant of the issuance protocol builds upon the privately verifiable
issuance protocol in <xref target="RFC9578"/> 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, private batched issuance performance scales better than linearly.</t>
      <t>The second variant of the issuance protocol introduces a new Client-Issuer
communication method, which allows for batched issuance of arbitrary token
types. This allows clients to request more than one token at a time and for
issuers to issue more than one token at a time. This variant has no other effect
than batching requests and responses and the issuance performance remains
linear.</t>
      <t>This batched issuance protocol registers one new 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>Privacy Pass tokens (as defined in <xref target="RFC9576"/> and
<xref target="RFC9578"/>) are unlinkable during issuance and
redemption. The basic issuance protocols defined in <xref target="RFC9578"/> however only
allow 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. Batched token issuance
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>
      <t>For all Verifiable Token issuance protocol, it allows for a single TokenRequest
to be sent that encompasses multiple token requests. This enables the issuance
of tokens for more than one key in one round trip between the Client and the
Issuer. The cost remains linear.</t>
    </section>
    <section anchor="batched-privately-verifiable-token">
      <name>Batched Privately Verifiable Token</name>
      <t>This section describes a batched issuance protocol for select token types,
including 0x0001 (defined in <xref target="RFC9578"/>) and 0xF91A (defined in this document).
This variant is more efficient than Arbitary Batch Token Issuance defined below.
It does so by requiring the same key to be used by all token requests.</t>
      <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="RFC9578"/>.</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 BatchTokenRequest 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>;
} BatchTokenRequest;
]]></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>The Client then generates an HTTP POST request to send to the Issuer Request
URL, with the BatchTokenRequest as the content. The media type for this request
is "application/private-token-privately-verifiable-batch-request". An example
request for the Issuer Request URL "https://issuer.example.net/request" is shown
below.</t>
        <artwork><![CDATA[
POST /request HTTP/1.1
Host: issuer.example.net
Accept: application/private-token-privately-verifiable-batch-response
Content-Type: application/private-token-privately-verifiable-batch-request
Content-Length: <Length of BatchTokenRequest>

<Bytes containing the BatchTokenRequest>
]]></artwork>
      </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="RFC9578"/>.</t>
        <t>Upon receipt of the request, the Issuer validates the following conditions:</t>
        <ul spacing="normal">
          <li>
            <t>The BatchTokenRequest contains a supported token_type equal to one of the
batched token types defined in this document.</t>
          </li>
          <li>
            <t>The BatchTokenRequest.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 BatchTokenRequest.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 422
(Unprocessable Content) error to the client.</t>
        <t>The Issuer then tries to deseralize the i-th element of
BatchTokenRequest.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 BatchTokenRequest.blinded_elements values, the Issuer MUST return an HTTP
422 (Unprocessable Content) 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 BatchTokenResponse 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];
} BatchTokenResponse;
]]></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>
        <t>The Issuer generates an HTTP response with status code 200 whose content
consists of TokenResponse, with the content type set as
"application/private-token-privately-verifiable-batch-response".</t>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/private-token-privately-verifiable-batch-response
Content-Length: <Length of BatchTokenResponse>

<Bytes containing the BatchTokenResponse>
]]></artwork>
      </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, 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. Token
verification works exactly as specified in <xref target="RFC9578"/>.</t>
      </section>
    </section>
    <section anchor="arbitrary-batched-token-issuance">
      <name>Arbitrary Batched Token Issuance</name>
      <t>This section describes an issuance protocol mechanism for issuing multiple
tokens in one round trip between Client and Issuer. An arbitrary batched token
request can contain token requests for any token type.</t>
      <section anchor="arbitrary-client-to-issuer-request">
        <name>Client-to-Issuer Request</name>
        <t>The Client first creates all TokenRequest it wants to batch. To do so, the
client follows protocol describing issuance, such as <xref section="5.1" sectionFormat="comma" target="RFC9578"/> or
<xref section="6.1" sectionFormat="comma" target="RFC9578"/>.</t>
        <t>The Client then creates a BatchedTokenRequest structured as follows:</t>
        <sourcecode type="tls"><![CDATA[
struct {
   uint16_t token_type;
   select (token_type) {
      case (0x0001): /* Type VOPRF(P-384, SHA-384), RFC 9578 */
         uint8_t truncated_token_key_id;
         uint8_t blinded_msg[Ne];
      case (0x0002): /* Type Blind RSA (2048-bit), RFC 9578 */
         uint8_t truncated_token_key_id;
         uint8_t blinded_msg[Nk];
   }
} TokenRequest;

struct {
  TokenRequest token_requests<0..2^16-1>;
} BatchTokenRequest
]]></sourcecode>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t>"token_type" is a 2-octet integer. TokenRequest MUST be prefixed with a uint16
"token_type" indicating the token type. The rest of the structure follows
based on that type, within the inner opaque token_request attribute. The above
definition corresponds to TokenRequest from <xref target="RFC9578"/>. For TokenRequest not
defined in <xref target="RFC9578"/>, they MAY be used as long as they are prefixed with a
2-octet token_type.</t>
          </li>
          <li>
            <t>"token_requests" are serialized TokenRequests, in network byte order. The
number of token_requests, as a 2-octet integer, is prepended to the serialized
TokenRequests. In addition, the 2-octet integer length of each TokenRequest is
prepended to the serialized TokenRequests.</t>
          </li>
        </ul>
        <t>The Client then generates an HTTP POST request to send to the Issuer Request
URL, with the BatchTokenRequest as the content. The media type for this request
is "application/private-token-arbitrary-batch-request". An example request for
the Issuer Request URL "https://issuer.example.net/request" is shown below.</t>
        <artwork><![CDATA[
POST /request HTTP/1.1
Host: issuer.example.net
Accept: application/private-token-arbitrary-batch-response
Content-Type: application/private-token-arbitrary-batch-request
Content-Length: <Length of BatchTokenRequest>

<Bytes containing the BatchTokenRequest>
]]></artwork>
      </section>
      <section anchor="arbitrary-issuer-to-client-response">
        <name>Issuer-to-Client Response</name>
        <t>Upon receipt of the request, the Issuer validates the following conditions:</t>
        <ul spacing="normal">
          <li>
            <t>The Content-Type is application/private-token-arbitrary-batch-request as
registered with IANA.</t>
          </li>
        </ul>
        <t>If this condition is not met, the Issuer MUST return an HTTP 422 (Unprocessable
Content) error to the client.</t>
        <t>The Issuer then tries to deserialize the first 2 bytes of the i-th element of
BatchTokenRequest.token_requests. If this is not a token type registered with
IANA, the Issuer MUST return an HTTP 422 (Unprocessable Content) error to the
client. The issuer creates a BatchTokenResponse structured as follows:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  TokenResponse token_response<0..2^16-1>; /* Defined by token_type */
} OptionalTokenResponse;

struct {
  OptionalTokenResponse token_responses<0..2^16-1>;
} BatchTokenResponse
]]></sourcecode>
        <t>BatchTokenResponse.token_responses is a vector of OptionalTokenResponses, length
prefixed with two bytes. OptionalTokenResponse.token_response is a
length-prefix-encoded TokenResponse, where a length of 0 indicates that the
Issuer failed or refused to issue the associated TokenRequest.</t>
        <t>The Issuer generates an HTTP response with status code 200 whose content
consists of TokenResponse, with the content type set as
"application/private-token-arbitrary-batch-response".</t>
        <t>If the Issuer issues some tokens but not all, it MUST return an HTTP 206 to the
client and continue processing further requests.</t>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/private-token-arbitrary-batch-response
Content-Length: <Length of BatchTokenResponse>

<Bytes containing the BatchTokenResponse>
]]></artwork>
      </section>
      <section anchor="arbitrary-finalization">
        <name>Finalization</name>
        <t>The Client tries to deserialize the i-th element of
BatchTokenResponse.token_responses using the protocol associated to
BatchTokenRequest.token_type. If the element has a size of 0, the Client MUST
ignore this token, and continue processing the next token. The Client finalizes
each deserialized TokenResponse using the matching TokenRequest according to the
corresponding finalization procedure defined by the token type.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <section anchor="batched-privately-verifiable-tokens">
        <name>Batched Privately Verifiable Tokens</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="arbitrary-batched-verifiable-tokens">
        <name>Arbitrary Batched Verifiable Tokens</name>
        <t>Implementors SHOULD be aware of the inherent linear cost of this token type. An
Issuer MAY ignore TokenRequest if the number of tokens per request past a limit.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA considerations</name>
      <t>This section contains IANA codepoint allocation requests.</t>
      <section anchor="iana-token-type">
        <name>Token Type</name>
        <t>This document updates the "Token Type" Registry (<xref target="AUTHSCHEME"/>) with the
following entry:</t>
        <ul spacing="normal">
          <li>
            <t>Value: 0xF91A</t>
          </li>
          <li>
            <t>Name: VOPRF (ristretto255, SHA-512)</t>
          </li>
          <li>
            <t>Token Structure: As defined in <xref section="2.2" sectionFormat="of" target="AUTHSCHEME"/></t>
          </li>
          <li>
            <t>Token Key Encoding: Serialized using SerializeElement from <xref section="2.1" sectionFormat="of" target="OPRF"/></t>
          </li>
          <li>
            <t>TokenChallenge Structure: As defined in <xref section="2.1" sectionFormat="of" target="AUTHSCHEME"/></t>
          </li>
          <li>
            <t>Publicly Verifiable: N</t>
          </li>
          <li>
            <t>Public Metadata: N</t>
          </li>
          <li>
            <t>Private Metadata: N</t>
          </li>
          <li>
            <t>Nk: 32</t>
          </li>
          <li>
            <t>Nid: 32</t>
          </li>
          <li>
            <t>Reference: <xref section="5" sectionFormat="comma" target="RFC9578"/></t>
          </li>
          <li>
            <t>Notes: None</t>
          </li>
        </ul>
      </section>
      <section anchor="media-types">
        <name>Media Types</name>
        <t>The following entries should be added to the IANA "media types" registry:</t>
        <ul spacing="normal">
          <li>
            <t>"application/private-token-privately-verifiable-batch-request"</t>
          </li>
          <li>
            <t>"application/private-token-privately-verifiable-batch-response"</t>
          </li>
          <li>
            <t>"application/private-token-arbitrary-batch-request"</t>
          </li>
          <li>
            <t>"application/private-token-arbitrary-batch-response"</t>
          </li>
        </ul>
        <t>The templates for these entries are listed below and the reference should be
this RFC.</t>
        <section anchor="applicationprivate-token-privately-verifiable-batch-request-media-type">
          <name>"application/private-token-privately-verifiable-batch-request" media type</name>
          <dl spacing="compact">
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>private-token-request</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>"binary"</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="security-considerations"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>Applications that want to issue or facilitate issuance of Privacy Pass tokens,
including Privacy Pass issuer applications themselves.</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl spacing="compact">
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IETF</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationprivate-token-privately-verifiable-batch-response-media-type">
          <name>"application/private-token-privately-verifiable-batch-response" media type</name>
          <dl spacing="compact">
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>private-token-response</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>"binary"</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="security-considerations"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>Applications that want to issue or facilitate issuance of Privacy Pass tokens,
including Privacy Pass issuer applications themselves.</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl spacing="compact">
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IETF</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationprivate-token-arbitrary-batch-request-media-type">
          <name>"application/private-token-arbitrary-batch-request" media type</name>
          <dl spacing="compact">
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>private-token-request</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>"binary"</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="security-considerations"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>Applications that want to issue or facilitate issuance of Privacy Pass tokens,
including Privacy Pass issuer applications themselves.</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl spacing="compact">
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IETF</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationprivate-token-arbitrary-batch-response-media-type">
          <name>"application/private-token-arbitrary-batch-response" media type</name>
          <dl spacing="compact">
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>private-token-response</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>"binary"</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="security-considerations"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>Applications that want to issue or facilitate issuance of Privacy Pass tokens,
including Privacy Pass issuer applications themselves.</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl spacing="compact">
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IETF</t>
            </dd>
          </dl>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9576">
          <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="RFC9578">
          <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:
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

-->

</rfc>
