<?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.31 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-guo-privacypass-token-binding-02" category="std" consensus="true" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="Privacy Pass Token Binding">Privacy Pass with Token Binding Extension</title>
    <seriesInfo name="Internet-Draft" value="draft-guo-privacypass-token-binding-02"/>
    <author initials="W." surname="Guo" fullname="Wei Guo">
      <organization>Huawei Technologies</organization>
      <address>
        <email>guowei90@huawei.com</email>
      </address>
    </author>
    <author initials="L." surname="Xia" fullname="Liang Xia">
      <organization>Huawei Technologies</organization>
      <address>
        <email>frank.xialiang@huawei.com</email>
      </address>
    </author>
    <author initials="J." surname="Li" fullname="Ji Li">
      <organization>Huawei Technologies</organization>
      <address>
        <email>liji100@huawei.com</email>
      </address>
    </author>
    <author initials="Y." surname="Li" fullname="Yong Li">
      <organization>Huawei Technologies</organization>
      <address>
        <email>Yong.Li1@huawei.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="15"/>
    <area>General</area>
    <workgroup>Internet Engineering Task Force</workgroup>
    <keyword>keyword1</keyword>
    <keyword>keyword2</keyword>
    <keyword>keyword3</keyword>
    <abstract>
      <?line 55?>

<t>This document provides a token binding extension for the Privacy Pass protocol. This extension allows a Client to cryptographically bind a Privacy Pass token to its own generated one-time public key during the issuance flow, without exposing the public key to the Issuer. Later, when spending the token during the redemption flow, the Client must use the corresponding private key to generate a binding proof that the Origin needs to additionally verify except the token itself, where the proof generation can optionally support channel binding. This proof constrains the legitimate presenter of the token to be only the Client who holds the private key and further constrains the legitimate usage of the token to be only the Client's specific channel when channel binding is used in the proof generation, and thus can prevent token export and replay attacks. In addition, the token binding extension does not introduce additional cryptographic primitives, and only uses the primitives currently utilized in the issuance protocol to generate the one-time public-private keypair as well as generate and verify the binding proof.</t>
    </abstract>
  </front>
  <middle>
    <?line 59?>

<section anchor="intro">
      <name>Introduction</name>
      <t>Privacy Pass provides an anonymous authorization architecture based on privacy-preserving authentication mechanisms <xref target="RFC9576"/>, and it consists of the issuance protocol and the redemption protocol. In the issuance protocol <xref target="RFC9578"/>, a Client can interact with a token Issuer to obtain Privacy Pass tokens after completing some authentication successfully, where the tokens are generated by the Issuer using the Issuer Private Key. In the redemption protocol <xref target="RFC9577"/>, the Client holding such a token can prove to an Origin that it is authorized by the Issuer to access the Origin's protected resources, without allowing the Origin (even with the Issuer) to link it with the issuance flow.</t>
      <t>However, Privacy Pass tokens pertain to bearer tokens, and any party in possession of Privacy Pass tokens can also access to the protected resources. Therefore, attackers can take advantage of this by exporting Privacy Pass tokens from a user's machines or application connections, presenting them to the application server (the Origin), and impersonating the legitimate user. The token binding extension for the Privacy Pass protocol is to prevent such attacks by cryptographically binding a Privacy Pass token to the user agent (the Client) generated one-time public key and requiring the Client presenting the token to additionally prove possession of the corresponding private key. It can be used not only for basic tokens <xref target="RFC9578"/> but also for advanced tokens (e.g., batched tokens <xref target="I-D.draft-ietf-privacypass-batched-tokens-07"/>, tokens with public metadata <xref target="I-D.draft-ietf-privacypass-public-metadata-issuance-02"/>).</t>
      <t>In addition, this extension does not introduce additional cryptographic primitives, and only uses the primitives (such as Schnorr NIZKP in <xref section="2.2" sectionFormat="of" target="RFC9497"/> and RSA signature in <xref target="RFC8017"/>) currently utilized in the issuance protocol to generate the one-time public-private keypair as well as generate and verify the binding proof. Specifically, we choose the Schnorr NIZKP to achieve token binding for both privately verifiable tokens and publicly verifiable tokens because of the following reasons: 1) the keypair of the Schnorr NIZKP can be generated from a secure seed, which is not supported by the RSA signature; 2) the keypair generation of the Schnorr NIZKP is much faster than that of the RSA signature. Because the keypair is only used one time, a more lightweight proving is to directly present the one-time private key to the Origin, which is so not a zero-knowledge proof, and its verification procedure needs to compute the corresponding one-time public key and verify the bound token.
<!-- at some point time and recovered from this seed at any time in the future -->
      </t>
      <t>At a high level, Privacy Pass with token binding extension proceeds as follows. First, a Client generates a one-time public-private keypair probably within a secure hardware module, such as a Trusted Platform Module (TPM) and a Trusted Execution Environment (TEE). Then, the client concatenates the token input and the public key to obtain a bound token input, blinds the bound token input, and generates a TokenRequest similar to Section <xref target="RFC9578" section="5.1" sectionFormat="bare"/> and Section <xref target="RFC9578" section="6.1" sectionFormat="bare"/> of <xref target="RFC9578"/>. After finalizing the issuance protocol successfully, the client will obtain a Privacy Pass bound token. Lastly, when spending the token, the client needs to use the private key to generate a binding proof, which is used to prove possession of the private key corresponding to the public key included in the bound token input. After receiving the token, the public key and the binding proof, the Origin not only needs to verify the token bound with the public key but also needs to verify the binding proof using the bound public key.</t>
      <t>Moreover, if there is a channel (e.g., TLS <xref target="RFC5246"/> <xref target="RFC8446"/>, HPKE <xref target="RFC9180"/>) between the Client and the Origin, then a secret value exported from the channel can be used as an additional input in the Schnorr NIZK proof generation to support the property of channel binding, which guarantees that the token and the binding proof for one channel that obtained by an attacker cannot be used in another channel.</t>
      <t>As a result, if an attacker attempts to export and replay a Privacy Pass bound token, it also needs to use the Client's private key that corresponds to the token's bound public key. But this is hard to do if the private key is specially protected in a secure hardware module.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>Unless otherwise specified, this document encodes protocol messages in TLS notation from <xref section="3" sectionFormat="of" target="RFC8446"/>.</t>
      <t>This document uses terms "Origin", "Client", "Issuer", "Issuance", "Redemption", "Token challenge", "Token request", "Token response" and "Token" as defined in <xref target="RFC9576"/>, and also uses the terms "Issuer key", "Token redemption" as defined in <xref target="RFC9577"/> as well as the terms "Issuer Public Key", "Issuer Private Key" as defined in <xref target="RFC9578"/>.
<!-- Moreover, the following additional terms are used throughout this document. -->
      </t>
    </section>
    <section anchor="issuance-protocol-with-token-binding-extension">
      <name>Issuance Protocol with Token Binding Extension</name>
      <t>This section describes the issuance protocol with token binding extension, which includes two types of issuance protocol: one for privately verifiable tokens and another for publicly verifiable tokens.</t>
      <section anchor="binding_private">
        <name>Token Binding for Privately Verifiable Token Issuance</name>
        <t>This section uses notation described in <xref section="4.4" sectionFormat="of" target="RFC9497"/>, including SerializeElement, DeserializeElement, and DeserializeScalar.</t>
        <t>The constants <tt>Ne</tt> and <tt>Ns</tt> are defined in <xref section="4.4" sectionFormat="of" target="RFC9497"/>, and the constant <tt>Nk</tt> is defined in <xref section="8.2.1" sectionFormat="of" target="RFC9578"/>.</t>
        <section anchor="client-to-issuer-request">
          <name>Client-to-Issuer Request</name>
          <t>The Client first generates a context as follows:</t>
          <artwork><![CDATA[
client_context = SetupVOPRFClient("P384-SHA384", pkI)
]]></artwork>
          <t>Here, <tt>pkI</tt> denotes the Issuer Public Key defined in <xref section="5" sectionFormat="of" target="RFC9578"/>. "P384-SHA384" is the identifier corresponding to the OPRF(P-384, SHA-384) ciphersuite defined in <xref target="RFC9497"/>. SetupVOPRFClient is defined in <xref section="3.2" sectionFormat="of" target="RFC9497"/>.</t>
          <t>The Client then generates a random 32-byte <tt>nonce</tt> and creates a <tt>token_input</tt> as follows:</t>
          <artwork><![CDATA[
nonce = random(32)
challenge_digest = SHA256(challenge)
token_input = concat(0x8001, 
                     nonce, 
                     challenge_digest, 
                     token_key_id)
]]></artwork>
          <t>Here, the <tt>challenge</tt> is an opaque string, and might be provided by the redemption protocol described in <xref section="2.1" sectionFormat="of" target="RFC9577"/>. The 2 bytes value <tt>0x8001</tt> represents the token type of VOPRF(P-384, SHA-384) with Token Binding (P-384, SHA-384), where the latter ciphersuite (P-384, SHA-384) will be used for token binding. The <tt>token_key_id</tt> is a key identifier of the Issuer Public Key pkI, which is computed as described in <xref section="5.5" sectionFormat="of" target="RFC9578"/>.</t>
          <!-- The Client first generates an ephemeral seed from a long-term seed and the random ```nonce```, and then uses the ephemeral seed to derive an ephemeral public-private keypair (pkE, skE) in the group of elliptic curve P-384, where the long-term seed is probably protected by a secure hardware module, ```pkE``` and ```skE``` are of Ne-byte length and Ns-byte length, respectively, and the constants ```Ne = 49``` and ```Ns = 48``` are defined in {{Section 4.4 of RFC9497}}. A RECOMMENDED method for generating ephemeral keypairs is as follows: -->
<t>The Client generates an ephemeral public-private keypair (pkE, skE) in the group of elliptic curve P-384, where <tt>pkE</tt> and <tt>skE</tt> are of Ne-byte length and Ns-byte length, respectively, and the constants <tt>Ne = 49</tt> and <tt>Ns = 48</tt> are defined in <xref section="4.4" sectionFormat="of" target="RFC9497"/>. A <bcp14>RECOMMENDED</bcp14> method for generating ephemeral keypairs is as follows:</t>
          <artwork><![CDATA[
seed = random(Ns)
ephemeral_seed = SHA384(concat(seed, nonce))
(skE, pkE) = DeriveKeyPair(ephemeral_seed, "PrivacyPassTokenBinding")
]]></artwork>
          <t>Here, the long-term <tt>seed</tt> is probably generated within a secure hardware module and can be used to protect multiple tokens (or a batch of tokens), and the DeriveKeyPair function is defined in <xref section="3.2.1" sectionFormat="of" target="RFC9497"/>.</t>
          <t>After that, the Client creates a <tt>bound_token_input</tt> and blinds it as follows:</t>
          <artwork><![CDATA[
binding_pkE = SerializeElement(pkE)
bound_token_input = concat(token_input, binding_pkE)
blind, blinded_element = client_context.Blind(bound_token_input)
blinded_msg = SerializeElement(blinded_element)
]]></artwork>
          <t>Here, the Blind function is defined in Section <xref target="RFC9497" section="3.3.1" sectionFormat="bare"/> and Section <xref target="RFC9497" section="3.3.2" sectionFormat="bare"/> of <xref target="RFC9497"/>. If the Blind function fails, the Client aborts the protocol. The Client stores the <tt>bound_token_input</tt>, <tt>blind</tt> and <tt>blinded_element</tt> values locally for use when finalizing the issuance protocol to produce a token (as described in <xref target="private_finalization"/>).</t>
          <t>The Client creates a TokenRequest structured as follows, where structure fields are defined in <xref section="5.1" sectionFormat="of" target="RFC9578"/>.</t>
          <artwork><![CDATA[
  struct {
      uint16_t token_type = 0x8001;
      uint8_t truncated_token_key_id;
      uint8_t blinded_msg[Ne];
  } TokenRequest;
]]></artwork>
          <t>The Client then generates an HTTP POST request to send to the Issuer Request URL, with the TokenRequest as the content. Please refer to <xref section="5.1" sectionFormat="of" target="RFC9578"/> for an example request.</t>
        </section>
        <section anchor="issuer-to-client-response">
          <name>Issuer-to-Client Response</name>
          <t>This section is the same as <xref section="5.2" sectionFormat="of" target="RFC9578"/>, except that the token type value is <tt>0x8001</tt>.</t>
        </section>
        <section anchor="private_finalization">
          <name>Finalization</name>
          <t>Upon receipt, the Client handles the response and, if successful, deserializes the values TokenResponse.evaluate_msg and TokenResponse.evaluate_proof, and obtains <tt>evaluated_element</tt> and <tt>proof</tt> as follows.</t>
          <artwork><![CDATA[
evaluated_element = DeserializeElement(TokenResponse.evaluate_msg)
c = DeserializeScalar(TokenResponse.evaluate_proof[0])
s = DeserializeScalar(TokenResponse.evaluate_proof[1])
proof = (c, s)
]]></artwork>
          <t>If deserialization of either value fails, the Client aborts the protocol. Otherwise, the Client processes the response as follows:</t>
          <artwork><![CDATA[
authenticator = client_context.Finalize(bound_token_input, 
                                        blind, 
                                        evaluated_element, 
                                        blinded_element, 
                                        proof)
]]></artwork>
          <t>Here, the Finalize function is defined in <xref section="3.3.2" sectionFormat="of" target="RFC9497"/>. If this succeeds, the Client creates a token as follows:</t>
          <artwork><![CDATA[
  struct {
      uint16_t token_type = 0x8001;
      uint8_t nonce[32];
      uint8_t challenge_digest[32];
      uint8_t token_key_id[32];
      uint8_t authenticator[Nk];
  } Token;
]]></artwork>
          <t>If the Finalize function fails, the Client aborts the protocol; otherwise it stores the token and its corresponding one-time public key <tt>binding_pkE</tt>.</t>
        </section>
      </section>
      <section anchor="binding_public">
        <name>Token Binding for Publicly Verifiable Token Issuance</name>
        <t>This section uses the SerializeElement notation defined in <xref section="4.3" sectionFormat="of" target="RFC9497"/>.</t>
        <t>The constant <tt>Nk</tt> is defined in <xref section="8.2.2" sectionFormat="of" target="RFC9578"/>.</t>
        <section anchor="client-to-issuer-request-1">
          <name>Client-to-Issuer Request</name>
          <t>The Client first generates a random 32-byte <tt>nonce</tt> and creates a <tt>token_input</tt> as follows:</t>
          <artwork><![CDATA[
nonce = random(32)
challenge_digest = SHA256(challenge)
token_input = concat(0x8002, 
                     nonce, 
                     challenge_digest, 
                     token_key_id)
]]></artwork>
          <t>Here, the <tt>challenge</tt> is an opaque string, and might be provided by the redemption protocol described in <xref section="2.1" sectionFormat="of" target="RFC9577"/>. The 2 bytes value <tt>0x8002</tt> represents the token type of Blind RSA (2048-bit) with Token Binding (P-256, SHA-256), where the latter ciphersuite (P-256, SHA-256) will be used for token binding. The <tt>token_key_id</tt> is a key identifier of the Issuer Public Key pkI, which is computed as described in <xref section="6.5" sectionFormat="of" target="RFC9578"/>.</t>
          <!-- The Client first generates an ephemeral seed from a long-term seed and the random ```nonce```, and then uses the ephemeral seed to derive an ephemeral public-private keypair (pkE, skE) in the group of elliptic curve P-256, where the long-term seed is probably protected by a secure hardware module, ```pkE``` and ```skE``` are of Ne-byte length and Ns-byte length, respectively, and the constants ```Ne = 33``` and ```Ns = 32``` are defined in {{Section 4.3 of RFC9497}}. A RECOMMENDED method for generating ephemeral keypairs is as follows: -->
<t>The Client generates an ephemeral public-private keypair (pkE, skE) in the group of elliptic curve P-256, where <tt>pkE</tt> and <tt>skE</tt> are of Ne-byte length and Ns-byte length, respectively, and the constants <tt>Ne = 33</tt> and <tt>Ns = 32</tt> are defined in <xref section="4.3" sectionFormat="of" target="RFC9497"/>. A <bcp14>RECOMMENDED</bcp14> method for generating ephemeral keypairs is as follows:</t>
          <artwork><![CDATA[
seed = random(Ns)
ephemeral_seed = SHA256(concat(seed, nonce))
(skE, pkE) = DeriveKeyPair(ephemeral_seed, "PrivacyPassTokenBinding")
]]></artwork>
          <t>Here, the long-term <tt>seed</tt> is probably generated within a secure hardware module and can be used to protect multiple tokens (or a batch of tokens), and the DeriveKeyPair function is defined in <xref section="3.2.1" sectionFormat="of" target="RFC9497"/>.</t>
          <t>After that, the Client creates a <tt>bound_token_input</tt> and blinds it as follows:</t>
          <artwork><![CDATA[
binding_pkE = SerializeElement(pkE)
bound_token_input = concat(token_input, binding_pkE)
blinded_msg, blind_inv = Blind(pkI, PrepareIdentity(bound_token_input))
]]></artwork>
          <t>Here, <tt>pkI</tt> denotes the Issuer Public Key defined in <xref section="6" sectionFormat="of" target="RFC9578"/>. The PrepareIdentity and Blind functions are defined in Section <xref target="RFC9474" section="4.1" sectionFormat="bare"/> and Section <xref target="RFC9474" section="4.2" sectionFormat="bare"/> of <xref target="RFC9474"/>, respectively. If the Blind function fails, the Client aborts the protocol. The Client stores the <tt>bound_token_input</tt> and <tt>blind_inv</tt> values locally for use when finalizing the issuance protocol to produce a token (as described in <xref target="public_finalization"/>).</t>
          <t>The Client creates a TokenRequest structured as follows, where structure fields are defined in <xref section="6.1" sectionFormat="of" target="RFC9578"/>.</t>
          <artwork><![CDATA[
  struct {
      uint16_t token_type = 0x8002;
      uint8_t truncated_token_key_id;
      uint8_t blinded_msg[Nk];
  } TokenRequest;
]]></artwork>
          <t>The Client then generates an HTTP POST request to send to the Issuer Request URL, with the TokenRequest as the content. Please refer to <xref section="6.1" sectionFormat="of" target="RFC9578"/> for an example request.</t>
        </section>
        <section anchor="issuer-to-client-response-1">
          <name>Issuer-to-Client Response</name>
          <t>This section is the same as <xref section="6.2" sectionFormat="of" target="RFC9578"/>, except that the token type value is <tt>0x8002</tt>.</t>
        </section>
        <section anchor="public_finalization">
          <name>Finalization</name>
          <t>Upon receipt, the Client handles the response and, if successful, processes the content as follows:</t>
          <artwork><![CDATA[
authenticator = 
  Finalize(pkI, PrepareIdentity(bound_token_input), blind_sig, blind_inv)
]]></artwork>
          <t>Here, the Finalize function is defined in <xref section="4.4" sectionFormat="of" target="RFC9474"/>. If this succeeds, the Client creates a token as follows:</t>
          <artwork><![CDATA[
  struct {
      uint16_t token_type = 0x8002;
      uint8_t nonce[32];
      uint8_t challenge_digest[32];
      uint8_t token_key_id[32];
      uint8_t authenticator[Nk];
  } Token;
]]></artwork>
          <t>If the Finalize function fails, the Client aborts the protocol; otherwise it stores the token and its corresponding one-time public key <tt>binding_pkE</tt>.</t>
        </section>
      </section>
    </section>
    <section anchor="redemption-protocol-with-token-binding-extension">
      <name>Redemption Protocol with Token Binding Extension</name>
      <t>This section describes the redemption protocol with token binding extension, which includes two types of redemption protocol: one for privately verifiable tokens and another for publicly verifiable tokens.</t>
      <section anchor="token-binding-for-privately-verifiable-token-redemption">
        <name>Token Binding for Privately Verifiable Token Redemption</name>
        <t>This section uses notation described in <xref section="4.4" sectionFormat="of" target="RFC9497"/>, including Generator, RandomScalar, HashToScalar, SerializeElement and DeserializeElement, and SerializeScalar and DeserializeScalar.</t>
        <!-- The constants Ne = 49 and Ns = 48 are defined in Section 4.4 of {{RFC9497}}. -->

<section anchor="private_token_binding_generation">
          <name>Token Binding Generation</name>
          <t>The Client first creates a <tt>proof_input</tt> as follows:</t>
          <artwork><![CDATA[
proof_input = concat(token, 
                     channel_binding_type, 
                     channel_binding_secret)
]]></artwork>
          <t>This document defines three variants for channel binding, and the following one-byte values will be used to distinguish between types:</t>
          <table anchor="ref-to-tab1">
            <name>Channel Binding Types</name>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">Value</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">no_channel_binding</td>
                <td align="left">0x00</td>
              </tr>
              <tr>
                <td align="left">tls_channel_binding</td>
                <td align="left">0x01</td>
              </tr>
              <tr>
                <td align="left">hpke_channel_binding</td>
                <td align="left">0x02</td>
              </tr>
            </tbody>
          </table>
          <t>The meaning of the above types and the corresponding <tt>channel_binding_secret</tt> are described as follows:</t>
          <ul spacing="normal">
            <li>
              <t>The "no_channel_binding" type means that no channel binding is used in the token binding generation, then the <tt>channel_binding_secret</tt> is a 0-byte value.</t>
            </li>
            <li>
              <t>The "tls_channel_binding" type means that a TLS channel binding is used in the token binding generation, then the <tt>channel_binding_secret</tt> is a 32-byte value. The computations of this secret are defined in <xref target="RFC5705"/> for TLS 1.2 and in <xref section="7.5" sectionFormat="of" target="RFC8446"/> for TLS 1.3, respectively, and the corresponding inputs are defined in <xref section="2" sectionFormat="of" target="RFC9266"/>. 
<!-- It is repeated here for convenience, where TLS-Exporter interface is defined in Section 7.5 of {{RFC8446}} and the context_value is a zero-length string defined in Section 2 of {{RFC9266}}. -->
<!-- ~~~
channel_binding_secret = TLS-Exporter("EXPORTER-Channel-Binding", context_value, 32)
~~~ -->
              </t>
            </li>
            <li>
              <t>The "hpke_channel_binding" type means that a HPKE channel binding is used in the token binding generation, then the <tt>channel_binding_secret</tt> is a 32-byte value. This secret is generated according to <xref section="5.3" sectionFormat="of" target="RFC9180"/>, and it is defined as follows, where the Context.Export interface is defined in <xref section="5.3" sectionFormat="of" target="RFC9180"/>.</t>
            </li>
          </ul>
          <artwork><![CDATA[
channel_binding_secret = Context.Export("EXPORTER-Channel-Binding", 32)
]]></artwork>
          <t>The Client then generates a <tt>binding_proof</tt> as follows, which is to prove possession of the private key <tt>skE</tt> corresponding to the previously bound public key <tt>pkE</tt>:</t>
          <artwork><![CDATA[
r = RandomScalar()
R = r * Generator()
serialized_R = SerializeElement(R)
challengeTranscript = I2OSP(len(serialized_R), 2) || serialized_R ||
                      I2OSP(len(proof_input), 2) || proof_input ||
                      "Challenge"
c = HashToScalar(challengeTranscript)
s = r - c * skE
binding_proof = (SerializeScalar(c), SerializeScalar(s))
]]></artwork>
          <t>Here, the HashToScalar function is based on SHA-384, and the private key <tt>skE</tt> <bcp14>MAY</bcp14> be recovered from the long-term <tt>seed</tt> and the Token.nonce as follows.</t>
          <artwork><![CDATA[
ephemeral_seed = SHA384(concat(seed, Token.nonce))
(skE, _) = DeriveKeyPair(ephemeral_seed, "PrivacyPassTokenBinding")
]]></artwork>
          <t>Here, the DeriveKeyPair function defined in <xref section="3.2.1" sectionFormat="of" target="RFC9497"/> is used to derive only <tt>skE</tt>.</t>
          <t>The Client creates a TokenBinding structured as follows:</t>
          <artwork><![CDATA[
  struct {
      uint8_t channel_binding_type;
      uint8_t binding_pkE[Ne];
      uint8_t binding_proof[Ns+Ns];
  } TokenBinding;
]]></artwork>
          <t>If the "no_channel_binding" type is used, then the token binding can also be generated in another more lightweight way without Schnorr NIZK proof generation and verification. Note that the keypair (skE, pkE) is only used once for a Privacy Pass bound token, so the Client can directly present the one-time private key <tt>skE</tt> to the Origin to prove possession of this key, and thus it is not a zero-knowledge proof. In this case, the first Ns-byte value of the <tt>binding_proof</tt> field is set to <tt>SerializeScalar(skE)</tt> and the second Ns-byte value of this field is set to all zero bytes, and the <tt>binding_pkE</tt> field is set to zero-length string since the one-time public key <tt>pkE</tt> can be recovered from the one-time private key <tt>skE</tt>.</t>
        </section>
        <section anchor="sending-token-and-token-binding">
          <name>Sending Token and Token Binding</name>
          <t>When used for Client authorization, the "PrivateToken" authentication scheme defines one parameter, "token", which contains the base64url-encoded Token structure. This document defines a new parameter, "token_binding", which contains the base64url-encoded TokenBinding structure. This document follows the default padding behavior described in <xref section="3.2" sectionFormat="of" target="RFC4648"/>, so the base64url value <bcp14>MUST</bcp14> include padding. The Client presents the Token structure and the TokenBinding structure to the Origin in a new HTTP request using the Authorization header field as follows:</t>
          <artwork><![CDATA[
Authorization: PrivateToken token="abc...", token_binding="def..."
]]></artwork>
        </section>
        <section anchor="token-and-token-binding-verification">
          <name>Token and Token Binding Verification</name>
          <t>Upon receipt, the Origin needs to verify both the token and the token binding, and if any one of verifications fails, this authorization request will be rejected.</t>
          <t>For the token type of VOPRF(P-384, SHA-384) with Token Binding (P-384, SHA-384) (0x8001), verifying a token requires creating a VOPRF context using the Issuer Private Key, evaluating the bound token input, and comparing the result against the token authenticator value.</t>
          <artwork><![CDATA[
server_context = SetupVOPRFServer("P384-SHA384", skI)
token_authenticator_input = 
  concat(Token.token_type, 
         Token.nonce, 
         Token.challenge_digest, 
         Token.token_key_id)
bound_token_authenticator_input = 
  concat(token_authenticator_input, TokenBinding.binding_pkE)
bound_token_authenticator = 
  server_context.Evaluate(bound_token_authenticator_input)
valid = (bound_token_authenticator == Token.authenticator)
]]></artwork>
          <t>Here, the SetupVOPRFServer and Evaluate functions are defined in Section <xref target="RFC9497" section="3.3.1" sectionFormat="bare"/> and Section <xref target="RFC9497" section="3.2" sectionFormat="bare"/> of <xref target="RFC9497"/>, respectively.</t>
          <t>Verifying a token binding requires checking that TokenBinding.binding_proof is a valid Schnorr NIZK proof using the TokenBinding.binding_pkE, where the HashToScalar function is based on SHA-384.</t>
          <artwork><![CDATA[
proof_verification_input = 
  concat(token,  
         TokenBinding.channel_binding_type, 
         expected_channel_binding_secret)
pkE = DeserializeElement(TokenBinding.binding_pkE)
c = DeserializeScalar(TokenBinding.binding_proof[0])
s = DeserializeScalar(TokenBinding.binding_proof[1])
R = (s * Generator()) + (c * pkE)
serialized_R = SerializeElement(R)
challengeTranscript = 
  I2OSP(len(serialized_R), 2) || serialized_R ||
  I2OSP(len(proof_verification_input), 2) || proof_verification_input ||
  "Challenge"
expectedC = HashToScalar(challengeTranscript)
valid = (expectedC == c)
]]></artwork>
          <t>If the "no_channel_binding" type is used and the token binding is generated without using Schnorr NIZKP, then a token binding is implicitly verified in the above token verification, where the <tt>binding_pkE</tt> is computed as follows.</t>
          <artwork><![CDATA[
skE = DeserializeScalar(TokenBinding.binding_proof[0])
pkE = skE * Generator()
binding_pkE = SerializeElement(pkE)
]]></artwork>
        </section>
      </section>
      <section anchor="token-binding-for-publicly-verifiable-token-redemption">
        <name>Token Binding for Publicly Verifiable Token Redemption</name>
        <t>This section uses notation described in <xref section="4.3" sectionFormat="of" target="RFC9497"/>, including Generator, RandomScalar, HashToScalar, SerializeElement and DeserializeElement, and SerializeScalar and DeserializeScalar.</t>
        <!-- The constants Ne = 33 and Ns = 32 are defined in {{Section 4.3 of RFC9497}}. -->

<section anchor="token-binding-generation">
          <name>Token Binding Generation</name>
          <t>The Client first creates a <tt>proof_input</tt> as follows:</t>
          <artwork><![CDATA[
proof_input = concat(token, 
                     channel_binding_type, 
                     channel_binding_secret)
]]></artwork>
          <t>Here, the <tt>channel_binding_type</tt> and the <tt>channel_binding_secret</tt> fields are defined in <xref target="private_token_binding_generation"/>.</t>
          <t>The Client then generates a <tt>binding_proof</tt> as follows, which is to prove possession of the private key <tt>skE</tt> corresponding to the previously bound public key <tt>pkE</tt>:</t>
          <artwork><![CDATA[
r = RandomScalar()
R = r * Generator()
serialized_R = SerializeElement(R)
challengeTranscript = I2OSP(len(serialized_R), 2) || serialized_R ||
                      I2OSP(len(proof_input), 2) || proof_input ||
                      "Challenge"
c = HashToScalar(challengeTranscript)
s = r - c * skE
binding_proof = (SerializeScalar(c), SerializeScalar(s))
]]></artwork>
          <t>Here, the HashToScalar function is based on SHA-256, and the private key <tt>skE</tt> <bcp14>MAY</bcp14> be recovered from the long-term <tt>seed</tt> and the Token.nonce as follows.</t>
          <artwork><![CDATA[
ephemeral_seed = SHA256(concat(seed, Token.nonce))
(skE, _) = DeriveKeyPair(ephemeral_seed, "PrivacyPassTokenBinding")
]]></artwork>
          <t>Here, the DeriveKeyPair function defined in <xref section="3.2.1" sectionFormat="of" target="RFC9497"/> is used to derive only <tt>skE</tt>.</t>
          <t>The Client creates a TokenBinding structured as follows:</t>
          <artwork><![CDATA[
  struct {
      uint8_t channel_binding_type;
      uint8_t binding_pkE[Ne];
      uint8_t binding_proof[Ns+Ns];
  } TokenBinding;
]]></artwork>
          <t>If the "no_channel_binding" type is used, then the token binding can also be generated by using the same lightweight way as in <xref target="private_token_binding_generation"/>, thus is omitted here.</t>
        </section>
        <section anchor="sending-token-and-token-binding-1">
          <name>Sending Token and Token Binding</name>
          <t>As an example, the Client presents the Token structure and the TokenBinding structure to the Origin in a new HTTP request using the Authorization header field as follows:</t>
          <artwork><![CDATA[
Authorization: PrivateToken token="abc...", token_binding="def..."
]]></artwork>
        </section>
        <section anchor="token-and-token-binding-verification-1">
          <name>Token and Token Binding Verification</name>
          <t>Upon receipt, the Origin needs to verify both the token and the token binding, and if any one of verifications fails, this authorization request will be rejected.</t>
          <t>For the token type of Blind RSA (2048-bit) with Token Binding (P-256, SHA-256) (0x8002), verifying a token requires checking that Token.authenticator is a valid RSA signature over the bound token input using the Issuer Public Key.</t>
          <artwork><![CDATA[
token_authenticator_input = 
  concat(Token.token_type, 
         Token.nonce, 
         Token.challenge_digest, 
         Token.token_key_id)
bound_token_authenticator_input = 
  concat(token_authenticator_input, TokenBinding.binding_pkE)
valid = RSASSA-PSS-VERIFY(pkI, 
                          bound_token_authenticator_input, 
                          Token.authenticator)
]]></artwork>
          <t>Here, the RSASSA-PSS-VERIFY function is defined in <xref section="8.1.2" sectionFormat="of" target="RFC8017"/>, using SHA-384 as the hash function, MGF1 with SHA-384 as the Probabilistic Signature Scheme (PSS) mask generation function (MGF), and a 48-byte salt length (sLen).</t>
          <t>Verifying a token binding requires checking that TokenBinding.binding_proof is a valid Schnorr NIZK proof using the TokenBinding.binding_pkE, where the HashToScalar function is based on SHA-256.</t>
          <artwork><![CDATA[
proof_verification_input = 
  concat(token, 
         TokenBinding.channel_binding_type, 
         expected_channel_binding_secret)
pkE = DeserializeElement(TokenBinding.binding_pkE)
c = DeserializeScalar(TokenBinding.binding_proof[0])
s = DeserializeScalar(TokenBinding.binding_proof[1])
R = (s * Generator()) + (c * pkE)
serialized_R = SerializeElement(R)
challengeTranscript = 
  I2OSP(len(serialized_R), 2) || serialized_R ||
  I2OSP(len(proof_verification_input), 2) || proof_verification_input ||
  "Challenge"
expectedC = HashToScalar(challengeTranscript)
valid = (expectedC == c)
]]></artwork>
          <t>If the "no_channel_binding" type is used and the token binding is generated without using Schnorr NIZKP, then a token binding is implicitly verified in the above token verification, where the <tt>binding_pkE</tt> is computed as follows.</t>
          <artwork><![CDATA[
skE = DeserializeScalar(TokenBinding.binding_proof[0])
pkE = skE * Generator()
binding_pkE = SerializeElement(pkE)
]]></artwork>
          <!-- # Security Considerations

This document does not introduce any new security considerations. -->

</section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <!-- This document has no IANA actions. -->

<t>This document defines two new token types "0x8001" and "0x8002" with the following contents, and requests that IANA add the two values to the "Privacy Pass Token Types" Registry defined in <xref section="6.2" sectionFormat="of" target="RFC9577"/>.</t>
      <t>Note that Token Binding, Ne, Ns are newly added fields, where the latter two <bcp14>MUST</bcp14> be provided if Token Binding is Y, or not applicable (N/A) otherwise.</t>
      <section anchor="token-type-voprfp-384-sha-384-with-token-binding-p-384-sha-384">
        <name>Token Type VOPRF(P-384, SHA-384) with Token Binding (P-384, SHA-384)</name>
        <t>Value: 0x8001</t>
        <t>Name: VOPRF(P-384, SHA-384) with Token Binding (P-384, SHA-384)</t>
        <t>Token Structure: As defined in <xref target="binding_private"/>.</t>
        <t>Token Key Encoding: Serialized using SerializeElement (<xref section="2.1" sectionFormat="of" target="RFC9497"/>).</t>
        <t>TokenChallenge Structure: As defined in <xref section="2.1" sectionFormat="of" target="RFC9577"/>.</t>
        <t>Publicly Verifiable: N</t>
        <t>Public Metadata: N</t>
        <t>Private Metadata: N</t>
        <t>Nk: 48</t>
        <t>Nid: 32</t>
        <t>Token Binding: Y</t>
        <t>Ne: 49</t>
        <t>Ns: 48</t>
        <t>Change controller: IETF</t>
        <t>Reference: This document, <xref target="binding_private"/></t>
        <t>Notes: None</t>
      </section>
      <section anchor="token-type-blind-rsa-2048-bit-with-token-binding-p-256-sha-256">
        <name>Token Type Blind RSA (2048-bit) with Token Binding (P-256, SHA-256)</name>
        <t>Value: 0x8002</t>
        <t>Name: Blind RSA (2048-bit) with Token Binding (P-256, SHA-256)</t>
        <t>Token Structure: As defined in <xref target="binding_public"/>.</t>
        <t>Token Key Encoding: Serialized as a DER-encoded SubjectPublicKeyInfo (SPKI) object using the RSASSA-PSS OID <xref target="RFC5756"/>.</t>
        <t>TokenChallenge Structure: As defined in <xref section="2.1" sectionFormat="of" target="RFC9577"/>.</t>
        <t>Publicly Verifiable: Y</t>
        <t>Public Metadata: N</t>
        <t>Private Metadata: N</t>
        <t>Nk: 256</t>
        <t>Nid: 32</t>
        <t>Token Binding: Y</t>
        <t>Ne: 33</t>
        <t>Ns: 32</t>
        <t>Change controller: IETF</t>
        <t>Reference: This document, <xref target="binding_public"/></t>
        <t>Notes: None</t>
      </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="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="J. Iyengar" initials="J." surname="Iyengar"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <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, to help ensure that the desired security and privacy goals are fulfilled.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9576"/>
          <seriesInfo name="DOI" value="10.17487/RFC9576"/>
        </reference>
        <reference anchor="RFC9578">
          <front>
            <title>Privacy Pass Issuance Protocols</title>
            <author fullname="S. Celi" initials="S." surname="Celi"/>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="S. Valdez" initials="S." surname="Valdez"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <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 Issuer Private Key and one that produces tokens that are publicly verifiable using the Issuer Public Key. Instances of "issuance protocol" and "issuance protocols" in the text of this document are used interchangeably to refer to the two variants of the Privacy Pass issuance protocol.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9578"/>
          <seriesInfo name="DOI" value="10.17487/RFC9578"/>
        </reference>
        <reference anchor="RFC9577">
          <front>
            <title>The Privacy Pass HTTP Authentication Scheme</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="S. Valdez" initials="S." surname="Valdez"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <abstract>
              <t>This document defines an HTTP authentication scheme for Privacy Pass, a privacy-preserving authentication mechanism used for authorization. The authentication scheme specified 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="RFC" value="9577"/>
          <seriesInfo name="DOI" value="10.17487/RFC9577"/>
        </reference>
        <reference anchor="RFC9497">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) Using Prime-Order Groups</title>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="December" year="2023"/>
            <abstract>
              <t>An Oblivious Pseudorandom Function (OPRF) is a two-party protocol between a client and a 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="RFC" value="9497"/>
          <seriesInfo name="DOI" value="10.17487/RFC9497"/>
        </reference>
        <reference anchor="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
        <reference anchor="RFC5246">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
            <author fullname="T. Dierks" initials="T." surname="Dierks"/>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2008"/>
            <abstract>
              <t>This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol. The TLS protocol provides communications security over the Internet. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5246"/>
          <seriesInfo name="DOI" value="10.17487/RFC5246"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9180">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9474">
          <front>
            <title>RSA Blind Signatures</title>
            <author fullname="F. Denis" initials="F." surname="Denis"/>
            <author fullname="F. Jacobs" initials="F." surname="Jacobs"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document specifies an RSA-based blind signature protocol. RSA blind signatures were first introduced by Chaum for untraceable payments. A signature that is output from this protocol can be verified as an RSA-PSS signature.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9474"/>
          <seriesInfo name="DOI" value="10.17487/RFC9474"/>
        </reference>
        <reference anchor="RFC5705">
          <front>
            <title>Keying Material Exporters for Transport Layer Security (TLS)</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="March" year="2010"/>
            <abstract>
              <t>A number of protocols wish to leverage Transport Layer Security (TLS) to perform key establishment but then use some of the keying material for their own purposes. This document describes a general mechanism for allowing that. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5705"/>
          <seriesInfo name="DOI" value="10.17487/RFC5705"/>
        </reference>
        <reference anchor="RFC9266">
          <front>
            <title>Channel Bindings for TLS 1.3</title>
            <author fullname="S. Whited" initials="S." surname="Whited"/>
            <date month="July" year="2022"/>
            <abstract>
              <t>This document defines a channel binding type, tls-exporter, that is compatible with TLS 1.3 in accordance with RFC 5056, "On the Use of Channel Bindings to Secure Channels". Furthermore, it updates the default channel binding to the new binding for versions of TLS greater than 1.2. This document updates RFCs 5801, 5802, 5929, and 7677.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9266"/>
          <seriesInfo name="DOI" value="10.17487/RFC9266"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5756">
          <front>
            <title>Updates for RSAES-OAEP and RSASSA-PSS Algorithm Parameters</title>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <author fullname="D. Brown" initials="D." surname="Brown"/>
            <author fullname="K. Yiu" initials="K." surname="Yiu"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="T. Polk" initials="T." surname="Polk"/>
            <date month="January" year="2010"/>
            <abstract>
              <t>This document updates RFC 4055. It updates the conventions for using the RSA Encryption Scheme - Optimal Asymmetric Encryption Padding (RSAES-OAEP) key transport algorithm in the Internet X.509 Public Key Infrastructure (PKI). Specifically, it updates the conventions for algorithm parameters in an X.509 certificate's subjectPublicKeyInfo field. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5756"/>
          <seriesInfo name="DOI" value="10.17487/RFC5756"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.draft-ietf-privacypass-batched-tokens-07">
          <front>
            <title>Batched Token Issuance Protocol</title>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare Inc.</organization>
            </author>
            <date day="25" month="February" year="2026"/>
            <abstract>
              <t>   This document specifies two variants of the Privacy Pass issuance
   protocol that allow for batched issuance of tokens.  These allow
   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>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-batched-tokens-07"/>
        </reference>
        <reference anchor="I-D.draft-ietf-privacypass-public-metadata-issuance-02">
          <front>
            <title>Privacy Pass Issuance Protocols with Public Metadata</title>
            <author fullname="Scott Hendrickson" initials="S." surname="Hendrickson">
              <organization>Google</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="27" month="May" year="2025"/>
            <abstract>
              <t>   This document specifies Privacy Pass issuance protocols that encode
   public information visible to the Client, Attester, Issuer, and
   Origin into each token.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-public-metadata-issuance-02"/>
        </reference>
      </references>
    </references>
    <?line 596?>

<!-- # Acknowledgements
{:numbered="false"}

The authors would like to thank... -->



  </back>
  <!-- ##markdown-source:
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
zK7l/wCAzZTQW3oAAA==

-->

</rfc>
