<?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.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-privacypass-batched-tokens-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="Batched Tokens">Batched Token Issuance Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-batched-tokens-02"/>
    <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="October" day="13"/>
    <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-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 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 issue 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 of the issuance protocol builds upon the privately verifiable
issuance protocol in <xref target="ISSUANCE"/> 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>The token type for this issuance protocol is the same as in the non-batched
issuance protocol. This is because the underlying cryptographic protocol is
the same. As a result, the batched issuance protocol in this document only
works with token types that support batching.</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>Privately Verifiable Tokens (as defines in
<xref target="ISSUANCE"/>) offer a simple way to unlink the
issuance from the redemption. The base protocol however only allows for a single
token to be issued at a time for every challenge. In some cases, especially
where a large number of clients need to fetch a large number of tokens, this may
introduce performance bottlenecks. The Batched Token Issuance Protocol improves
upon the basic Privately Verifiable Token issuance protocol in the following key
ways:</t>
      <ol spacing="normal" type="1"><li>
          <t>Issuing multiple tokens at once in response to a single TokenChallenge,
thereby reducing the size of the proofs required for multiple tokens.</t>
        </li>
        <li>
          <t>Improving server and client issuance efficiency by amortizing the cost of the
VOPRF proof generation and verification, respectively.</t>
        </li>
      </ol>
    </section>
    <section anchor="client-to-issuer-request">
      <name>Client-to-Issuer Request</name>
      <t>Except where specified otherwise, the client follows the same protocol as
described in <xref section="5.1" sectionFormat="comma" target="ISSUANCE"/>.</t>
      <t>The Client first creates a context as follows:</t>
      <artwork><![CDATA[
client_context = SetupVOPRFClient(ciphersuiteID, pkI)
]]></artwork>
      <t><tt>ciphersuiteID</tt> is the ciphersuite identifier from <xref target="OPRF"/> corresponding
to the ciphersuite being used for this token version. SetupVOPRFClient is
defined in <xref section="3.2" sectionFormat="comma" target="OPRF"/>.</t>
      <t><tt>Nr</tt> denotes the number of tokens the clients wants to request. For every token,
the Client then creates an issuance request message for a random value <tt>nonce</tt>
with the input challenge and Issuer key identifier as described below:</t>
      <artwork><![CDATA[
nonce_i = random(32)
challenge_digest = SHA256(challenge)
token_input = concat(token_type, nonce_i, challenge_digest,
                token_key_id)
blind_i, blinded_element_i = client_context.Blind(token_input)
]]></artwork>
      <t><tt>token_type</tt> corresponds to the 2-octet integer in the challenge.</t>
      <t>The above is repeated for each token to be requested. Importantly, a fresh nonce
MUST be sampled each time.</t>
      <t>The Client then creates a 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-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-batch-response
Content-Type: application/private-token-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="ISSUANCE"/>.</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 400 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 400
error to the client. Otherwise, if the Issuer is willing to produce a token to
the Client, the issuer forms a list of <tt>Element</tt> values, denoted
<tt>blinded_elements</tt>, and computes a blinded response as follows:</t>
      <artwork><![CDATA[
server_context = SetupVOPRFServer(ciphersuiteID, skI, pkI)
evaluated_elements, proof =
  server_context.BlindEvaluateBatch(skI, blinded_elements)
]]></artwork>
      <t><tt>ciphersuiteID</tt> is the ciphersuite identifier from <xref target="OPRF"/> corresponding
to the ciphersuite being used for this token version. SetupVOPRFServer is
defined in <xref section="3.2" sectionFormat="comma" target="OPRF"/>. The issuer uses a list of
blinded elements to compute in the proof generation step. The
<tt>BlindEvaluateBatch</tt> function is a batch-oriented version of the <tt>BlindEvaluate</tt>
function described in <xref section="3.3.2" sectionFormat="comma" target="OPRF"/>. The description of
<tt>BlindEvaluateBatch</tt> is below.</t>
      <artwork><![CDATA[
Input:

  Element blindedElements[Nr]

Output:

  Element evaluatedElements[Nr]
  Proof proof

Parameters:

  Group G
  Scalar skS
  Element pkS

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

  proof = GenerateProof(skS, G.Generator(), pkS,
                        blindedElements, evaluatedElements)
  return evaluatedElements, proof
]]></artwork>
      <t>The Issuer then creates a 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-batch-response".</t>
      <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/private-token-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="ISSUANCE"/>.</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>
      <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="ISSUANCE"/></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-batch-request"</t>
          </li>
          <li>
            <t>"application/private-token-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-batch-request-media-type">
          <name>"application/private-token-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-batch-response-media-type">
          <name>"application/private-token-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="ARCH">
          <front>
            <title>The Privacy Pass Architecture</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="September" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for authorization
   based on privacy-preserving authentication mechanisms.  It describes
   the conceptual model of Privacy Pass and its protocols, its security
   and privacy goals, practical deployment models, and recommendations
   for each deployment model that helps ensure the desired security and
   privacy goals are fulfilled.

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

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

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-auth-scheme-15"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="HTTP3">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
