<?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.36 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-privacypass-public-metadata-issuance-03" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="Issuance Protocols Public Metadata">Privacy Pass Issuance Protocols with Public Metadata</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-public-metadata-issuance-03"/>
    <author fullname="Scott Hendrickson">
      <organization>Google</organization>
      <address>
        <email>scott@shendrickson.com</email>
      </address>
    </author>
    <author fullname="Christopher A. Wood">
      <organization/>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2026" month="May" day="13"/>
    <area>Security</area>
    <workgroup>Privacy Pass</workgroup>
    <abstract>
      <?line 43?>

<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>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-privacypass.github.io/draft-ietf-privacypass-public-metadata-issuance/draft-ietf-privacypass-public-metadata-issuance.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-privacypass-public-metadata-issuance/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Privacy Pass Working Group mailing list (<eref target="mailto:privacy-pass@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/privacy-pass/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/privacy-pass/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-privacypass/draft-ietf-privacypass-public-metadata-issuance"/>.</t>
    </note>
  </front>
  <middle>
    <?line 48?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The basic Privacy Pass issuance protocols as specified in <xref target="BASIC-PROTOCOL"/> and resulting
tokens convey only a single bit of information: whether or not the token is valid. However,
it is possible for tokens to be issued with additional information agreed upon by Client,
Attester, and Issuer during issuance. This information, sometimes referred to as public
metadata, allows Privacy Pass applications to encode deployment-specific information that is
necessary for their use case.</t>
      <t>This document specifies two Privacy Pass issuance protocols that encode public information
visible to the Client, Attester, Issuer, and Origin. One is based on the partially-oblivious
PRF construction from <xref target="POPRF"/>, and the other is based on the partially-blind RSA signature
scheme from <xref target="PBRSA"/>.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" 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.
<?line -6?>
      </t>
    </section>
    <section anchor="notation">
      <name>Notation</name>
      <t>The following terms are used throughout this document to describe the protocol operations in this document:</t>
      <ul spacing="normal">
        <li>
          <t>len(s): the length of a byte string, in bytes.</t>
        </li>
        <li>
          <t>concat(x0, ..., xN): Concatenation of byte strings. For example, concat(0x01, 0x0203, 0x040506) = 0x010203040506</t>
        </li>
        <li>
          <t>int_to_bytes: Convert a non-negative integer to a byte string. int_to_bytes is
implemented as I2OSP as described in <xref section="4.1" sectionFormat="of" target="RFC8017"/>. Note that these
functions operate on byte strings in big-endian byte order.</t>
        </li>
      </ul>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>Public metadata enables Privacy Pass deployments that share information between Clients, Attesters,
Issuers and Origins. In the basic Privacy Pass issuance protocols (types 0x0001 and 0x0002), the only
information available to all parties is the choice of Issuer, expressed through the TokenChallenge.
If one wants to differentiate bits of information at the origin, many PrivateToken challenges must be sent,
one for each Issuer that attests to the bit required.</t>
      <t>For example, if a deployment was built that attested to an app’s published state in an app store,
it requires 1 bit {<tt>published</tt>, <tt>not_published</tt>} and can be built with a single Issuer. An app version
attester would require one Issuer for each app version and one TokenChallenge per Issuer.</t>
      <t>Taken further, the limitation of one bit of information in each Privacy Pass token means that a distinct
Issuer and Issuer public key is needed for each unique value one wants to express with a token.
This many-key metadata deployment should provide metadata visible to all parties in the same way as
the <xref target="PBRSA"/> proposal outlined in this document. However, it comes with practical reliability and
scalability tradeoffs. In particular, many simultaneous deployed keys could be difficult to scale.
Some HSM implementations have fixed per-key costs, slow key generation, and minimum key lifetimes.
Quick key rotation creates reliability risk to the system, as a pause or slowdown in key rotation
could cause the system to run out of active signing or verification keys. Issuance protocols that
support public metadata mitigate these tradeoffs by allowing deployments to change metadata values
without publishing new keys.</t>
    </section>
    <section anchor="private-flow">
      <name>Issuance Protocol for Privately Verifiable Tokens</name>
      <t>This section describes a variant of the issuance protocol in <xref section="5" sectionFormat="of" target="BASIC-PROTOCOL"/>
that supports public metadata based on the partially oblivious PRF (POPRF) from
<xref target="POPRF"/>. Issuers provide a Private and Public Key, denoted
<tt>skI</tt> and <tt>pkI</tt> respectively, used to produce tokens as input to the protocol.
See <xref target="private-issuer-configuration"/> for how this key pair is generated.</t>
      <t>Clients provide the following as input to the issuance protocol:</t>
      <ul spacing="normal">
        <li>
          <t>Issuer Request URI: A URI to which token request messages are sent. This can
be a URL derived from the "issuer-request-uri" value in the Issuer's
directory resource, or it can be another Client-configured URL. The value
of this parameter depends on the Client configuration and deployment model.
For example, in the 'Split Origin, Attester, Issuer' deployment model, the
Issuer Request URI might correspond to the Client's configured Attester,
and the Attester is configured to relay requests to the Issuer.</t>
        </li>
        <li>
          <t>Issuer name: An identifier for the Issuer. This is typically a host name that
can be used to construct HTTP requests to the Issuer.</t>
        </li>
        <li>
          <t>Issuer Public Key: <tt>pkI</tt>, with a key identifier <tt>token_key_id</tt> computed as
described in <xref target="public-issuer-configuration"/>.</t>
        </li>
        <li>
          <t>Challenge value: <tt>challenge</tt>, an opaque byte string. For example, this might
be provided by the redemption protocol in <xref target="AUTHSCHEME"/>.</t>
        </li>
        <li>
          <t>Extensions: <tt>extensions</tt>, an Extensions structure as defined in <xref target="TOKEN-EXTENSION"/>.</t>
        </li>
      </ul>
      <t>Given this configuration and these inputs, the two messages exchanged in
this protocol are described below. This section uses notation described in
<xref section="4" sectionFormat="comma" target="POPRF"/>, including SerializeElement and DeserializeElement,
SerializeScalar and DeserializeScalar, and DeriveKeyPair.</t>
      <t>The constants <tt>Ne</tt> and <tt>Ns</tt> are as defined in <xref section="4" sectionFormat="comma" target="POPRF"/> for
OPRF(P-384, SHA-384). The constant <tt>Nk</tt>, which is also equal to <tt>Nh</tt> as defined
in <xref section="4" sectionFormat="comma" target="POPRF"/>, is defined in <xref target="iana"/>.</t>
      <section anchor="private-request">
        <name>Client-to-Issuer Request</name>
        <t>The Client first creates a context as follows:</t>
        <artwork><![CDATA[
client_context = SetupPOPRFClient("P384-SHA384", pkI)
]]></artwork>
        <t>Here, "P384-SHA384" is the identifier corresponding to the
OPRF(P-384, SHA-384) ciphersuite in <xref target="POPRF"/>. SetupPOPRFClient
is defined in <xref section="3.2" sectionFormat="comma" target="POPRF"/>.</t>
        <t>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 = random(32)
challenge_digest = SHA256(challenge)
token_input = concat(0xDA7B, // Token type field is 2 bytes long
                     nonce,
                     challenge_digest,
                     token_key_id)
blind, blinded_element, tweaked_key = client_context.Blind(token_input, extensions, pkI)
]]></artwork>
        <t>The Blind function is defined in <xref section="3.3.3" sectionFormat="comma" target="POPRF"/>.
If the Blind function fails, the Client aborts the protocol.
The Client stores the <tt>nonce</tt>, <tt>challenge_digest</tt>, and <tt>tweaked_key</tt> values locally
for use when finalizing the issuance protocol to produce a token
(as described in <xref target="private-finalize"/>).</t>
        <t>The Client then creates an ExtendedTokenRequest structured as follows:</t>
        <artwork><![CDATA[
struct {
  TokenRequest request;
  Extensions extensions;
} ExtendedTokenRequest;
]]></artwork>
        <t>The contents of ExtendedTokenRequest.request are as defined in <xref section="5" sectionFormat="of" target="BASIC-PROTOCOL"/>.
The contents of ExtendedTokenRequest.extensions match the Client's configured <tt>extensions</tt> value.</t>
        <t>The Client then generates an HTTP POST request to send to the Issuer Request
URI, with the ExtendedTokenRequest as the content. The media type for this request
is "application/private-token-request". An example request is shown below:</t>
        <artwork><![CDATA[
:method = POST
:scheme = https
:authority = issuer.example.net
:path = /request
accept = application/private-token-response
cache-control = no-cache, no-store
content-type = application/private-token-request
content-length = <Length of ExtendedTokenRequest>

<Bytes containing the ExtendedTokenRequest>
]]></artwork>
      </section>
      <section anchor="private-response">
        <name>Issuer-to-Client Response</name>
        <ul spacing="normal">
          <li>
            <t>The ExtendedTokenRequest.request contains a supported token_type.</t>
          </li>
          <li>
            <t>The ExtendedTokenRequest.request.truncated_token_key_id corresponds to the truncated key
ID of an Issuer Public Key.</t>
          </li>
          <li>
            <t>The ExtendedTokenRequest.request.blinded_msg is of the correct size.</t>
          </li>
          <li>
            <t>The ExtendedTokenRequest.extensions value is permitted by the Issuer's policy.</t>
          </li>
        </ul>
        <t>If any of these conditions is not met, the Issuer MUST return an HTTP 400 error
to the Client, which will forward the error to the client. Otherwise, if the
Issuer is willing to produce a token token to the Client for the provided extensions,
the Issuer then tries to deseralize ExtendedTokenRequest.request.blinded_msg using
DeserializeElement from <xref section="2.1" sectionFormat="of" target="POPRF"/>, yielding <tt>blinded_element</tt>.
If this fails, the Issuer MUST return an HTTP 400 error to the client.
Otherwise, the Issuer completes the issuance flow by computing a blinded response as follows:</t>
        <artwork><![CDATA[
server_context = SetupPOPRFServer("P384-SHA384", skI, pkI)
evaluate_element, proof =
  server_context.BlindEvaluate(skI, blinded_element, ExtendedTokenRequest.extensions)
]]></artwork>
        <t>SetupPOPRFServer is defined in <xref section="3.2" sectionFormat="comma" target="POPRF"/> and BlindEvaluate is defined in
<xref section="3.3.3" sectionFormat="comma" target="POPRF"/>. The Issuer then creates a TokenResponse structured
as follows:</t>
        <artwork><![CDATA[
struct {
   uint8_t evaluate_msg[Ne];
   uint8_t evaluate_proof[Ns+Ns];
} TokenResponse;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t>"evaluate_msg" is the Ne-octet evaluated message, computed as
<tt>SerializeElement(evaluate_element)</tt>.</t>
          </li>
          <li>
            <t>"evaluate_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>.</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-response".</t>
        <artwork><![CDATA[
:status = 200
content-type = application/private-token-response
content-length = <Length of TokenResponse>

<Bytes containing the TokenResponse>
]]></artwork>
      </section>
      <section anchor="private-finalize">
        <name>Finalization</name>
        <t>Upon receipt, the Client handles the response and, if successful, deserializes
the content values TokenResponse.evaluate_msg and TokenResponse.evaluate_proof,
yielding <tt>evaluated_element</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 = client_context.Finalize(token_input, blind,
                                        evaluated_element,
                                        blinded_element,
                                        proof, extensions, tweaked_key)
]]></artwork>
        <t>The Finalize function is defined in <xref section="3.3.3" sectionFormat="comma" target="POPRF"/>. If this
succeeds, the Client then constructs a Token as follows:</t>
        <artwork><![CDATA[
struct {
  uint16_t token_type = 0xDA7B; /* Type POPRF(P-384, SHA-384) */
  uint8_t nonce[32];
  uint8_t challenge_digest[32];
  uint8_t token_key_id[32];
  uint8_t authenticator[Nk];
} Token;
]]></artwork>
        <t>The Token.nonce value is that which was sampled in <xref target="private-request"/>.
If the Finalize function fails, the Client aborts the protocol.</t>
        <t>The Client will send this Token to Origins for redemption in the "token" HTTP
authentication parameter as specified in <xref section="2.2" sectionFormat="of" target="AUTHSCHEME"/>.
The Client also supplies its extensions value as an additional authentication
parameter as specified in <xref target="TOKEN-EXTENSION"/>.</t>
      </section>
      <section anchor="token-verification">
        <name>Token Verification</name>
        <t>Verifying a Token requires creating a POPRF context using the Issuer Private
Key and Public Key, evaluating the token contents with the corresponding extensions,
and comparing the result against the token authenticator value:</t>
        <artwork><![CDATA[
server_context = SetupPOPRFServer("P384-SHA384", skI)
token_authenticator_input =
  concat(Token.token_type,
         Token.nonce,
         Token.challenge_digest,
         Token.token_key_id)
token_authenticator =
  server_context.Evaluate(skI, token_authenticator_input, extensions)
valid = (token_authenticator == Token.authenticator)
]]></artwork>
      </section>
      <section anchor="private-issuer-configuration">
        <name>Issuer Configuration</name>
        <t>Issuers are configured with Private and Public Key pairs, each denoted <tt>skI</tt>
and <tt>pkI</tt>, respectively, used to produce tokens. These keys MUST NOT be reused
in other protocols. A RECOMMENDED method for generating key pairs is as
follows:</t>
        <artwork><![CDATA[
seed = random(Ns)
(skI, pkI) = DeriveKeyPair(seed, "PrivacyPass-TypeDA7B")
]]></artwork>
        <t>The DeriveKeyPair function is defined in <xref section="3.3.1" sectionFormat="comma" target="POPRF"/>.
The key identifier for a public key <tt>pkI</tt>, denoted <tt>token_key_id</tt>, is computed
as follows:</t>
        <artwork><![CDATA[
token_key_id = SHA256(SerializeElement(pkI))
]]></artwork>
        <t>Since Clients truncate <tt>token_key_id</tt> in each <tt>TokenRequest</tt>, Issuers should
ensure that the truncated form of new key IDs do not collide with other
truncated key IDs in rotation.</t>
      </section>
    </section>
    <section anchor="public-flow">
      <name>Issuance Protocol for Publicly Verifiable Tokens</name>
      <t>This section describes a variant of the issuance protocol in <xref section="6" sectionFormat="of" target="BASIC-PROTOCOL"/>
for producing publicly verifiable tokens including public metadata using cryptography specified in <xref target="PBRSA"/>.
In particular, this variant of the issuance protocol works for the
<tt>RSAPBSSA-SHA384-PSSZERO-Deterministic</tt> or <tt>RSAPBSSA-SHA384-PSS-Deterministic</tt>
variant of the blind RSA protocol variants described in <xref section="6" sectionFormat="of" target="PBRSA"/>.</t>
      <t>The public metadata issuance protocol differs from the protocol in
<xref section="6" sectionFormat="of" target="BASIC-PROTOCOL"/> in that the issuance and redemption protocols carry metadata
provided by the Client and visible to the Attester, Issuer, and Origin. This means Clients
can set arbitrary metadata when requesting a token, but specific values of metadata may be
rejected by any of Attester, Issuer, or Origin. Similar to a token nonce, metadata is
cryptographically bound to a token and cannot be altered.</t>
      <t>Clients provide the following as input to the issuance protocol:</t>
      <ul spacing="normal">
        <li>
          <t>Issuer Request URI: A URI to which token request messages are sent. This can
be a URL derived from the "issuer-request-uri" value in the Issuer's
directory resource, or it can be another Client-configured URL. The value
of this parameter depends on the Client configuration and deployment model.
For example, in the 'Split Origin, Attester, Issuer' deployment model, the
Issuer Request URI might be correspond to the Client's configured Attester,
and the Attester is configured to relay requests to the Issuer.</t>
        </li>
        <li>
          <t>Issuer name: An identifier for the Issuer. This is typically a host name that
can be used to construct HTTP requests to the Issuer.</t>
        </li>
        <li>
          <t>Issuer Public Key: <tt>pkI</tt>, with a key identifier <tt>token_key_id</tt> computed as
described in <xref target="public-issuer-configuration"/>.</t>
        </li>
        <li>
          <t>Challenge value: <tt>challenge</tt>, an opaque byte string. For example, this might
be provided by the redemption protocol in <xref target="AUTHSCHEME"/>.</t>
        </li>
        <li>
          <t>Extensions: <tt>extensions</tt>, an Extensions structure as defined in <xref target="TOKEN-EXTENSION"/>.</t>
        </li>
      </ul>
      <t>Given this configuration and these inputs, the two messages exchanged in
this protocol are described below. The constant <tt>Nk</tt> is defined as 256 for token type 0xDA7A.</t>
      <section anchor="public-request">
        <name>Client-to-Issuer Request</name>
        <t>The Client first creates an issuance request message for a random value
<tt>nonce</tt> using the input challenge and Issuer key identifier as follows:</t>
        <artwork><![CDATA[
nonce = random(32)
challenge_digest = SHA256(challenge)
token_input = concat(0xDA7A, // Token type field is 2 bytes long
                     nonce,
                     challenge_digest,
                     token_key_id)
blinded_msg, blind_inv = Blind(pkI, PrepareIdentity(token_input), extensions)
]]></artwork>
        <t>Where <tt>PrepareIdentity</tt> is defined in <xref section="6" sectionFormat="of" target="PBRSA"/> and <tt>Blind</tt> is defined in <xref section="4.2" sectionFormat="of" target="PBRSA"/></t>
        <t>The Client stores the <tt>nonce</tt>, <tt>challenge_digest</tt>, and <tt>extensions</tt> values locally for use
when finalizing the issuance protocol to produce a token (as described in <xref target="public-finalize"/>).</t>
        <t>The Client then creates an ExtendedTokenRequest structured as follows:</t>
        <artwork><![CDATA[
struct {
  TokenRequest request;
  Extensions extensions;
} ExtendedTokenRequest;
]]></artwork>
        <t>The contents of ExtendedTokenRequest.request are as defined in <xref section="6" sectionFormat="of" target="BASIC-PROTOCOL"/>.
The contents of ExtendedTokenRequest.extensions match the Client's configured <tt>extensions</tt> value.</t>
        <t>The Client then generates an HTTP POST request to send to the Issuer Request
URI, with the ExtendedTokenRequest as the content. The media type for this request
is "application/private-token-request". An example request is shown below:</t>
        <artwork><![CDATA[
:method = POST
:scheme = https
:authority = issuer.example.net
:path = /request
accept = application/private-token-response
cache-control = no-cache, no-store
content-type = application/private-token-request
content-length = <Length of ExtendedTokenRequest>

<Bytes containing the ExtendedTokenRequest>
]]></artwork>
      </section>
      <section anchor="public-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 ExtendedTokenRequest.request contains a supported token_type.</t>
          </li>
          <li>
            <t>The ExtendedTokenRequest.request.truncated_token_key_id corresponds to the truncated key
ID of an Issuer Public Key.</t>
          </li>
          <li>
            <t>The ExtendedTokenRequest.request.blinded_msg is of the correct size.</t>
          </li>
          <li>
            <t>The ExtendedTokenRequest.extensions value is permitted by the Issuer's policy.</t>
          </li>
        </ul>
        <t>If any of these conditions is not met, the Issuer MUST return an HTTP 400 error
to the Client, which will forward the error to the client. Otherwise, if the
Issuer is willing to produce a token token to the Client for the provided extensions,
the Issuer completes the issuance flow by computing a blinded response as follows:</t>
        <artwork><![CDATA[
blind_sig = BlindSign(skI, ExtendedTokenRequest.request.blinded_msg, ExtendedTokenRequest.extensions)
]]></artwork>
        <t>Where <tt>BlindSign</tt> is defined in <xref section="4.3" sectionFormat="of" target="PBRSA"/>.</t>
        <t>The result is encoded and transmitted to the client in a TokenResponse structure as
defined in <xref section="6" sectionFormat="of" target="BASIC-PROTOCOL"/>.</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-response".</t>
        <artwork><![CDATA[
:status = 200
content-type = application/private-token-response
content-length = <Length of TokenResponse>

<Bytes containing the TokenResponse>
]]></artwork>
      </section>
      <section anchor="public-finalize">
        <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, nonce, extensions, blind_sig, blind_inv)
]]></artwork>
        <t>Where <tt>Finalize</tt> function is defined in <xref section="4.4" sectionFormat="of" target="PBRSA"/>.</t>
        <t>If this succeeds, the Client then constructs a Token as described in <xref target="AUTHSCHEME"/> as
follows:</t>
        <artwork><![CDATA[
struct {
  uint16_t token_type = 0xDA7A; /* Type Partially Blind RSA (2048-bit) */
  uint8_t nonce[32];
  uint8_t challenge_digest[32];
  uint8_t token_key_id[32];
  uint8_t authenticator[Nk];
} Token;
]]></artwork>
        <t>The Token.nonce value is that which was sampled in <xref section="5.1" sectionFormat="of" target="BASIC-PROTOCOL"/>.
If the Finalize function fails, the Client aborts the protocol.</t>
        <t>The Client will send this Token to Origins for redemption in the "token" HTTP
authentication parameter as specified in <xref section="2.2" sectionFormat="of" target="AUTHSCHEME"/>.
The Client also supplies its extensions value as an additional authentication
parameter as specified in <xref target="TOKEN-EXTENSION"/>.</t>
      </section>
      <section anchor="token-verification-1">
        <name>Token Verification</name>
        <t>Verifying a Token requires checking that Token.authenticator is a valid
signature over the remainder of the token input with respect to the corresponding
Extensions value <tt>extensions</tt> using the Augmented Issuer Public Key.
This involves invoking the verification procedure described in
<xref section="4.5" sectionFormat="of" target="PBRSA"/> using the following <tt>token_input</tt> value as
the input message, <tt>extensions</tt> as the input info (metadata), the Issuer
Public Key as the input public key, and the token authenticator (Token.authenticator)
as the signature.</t>
        <artwork><![CDATA[
token_input = concat(0xDA7A, // Token type field is 2 bytes long
                     Token.nonce,
                     Token.challenge_digest,
                     Token.token_key_id)
]]></artwork>
      </section>
      <section anchor="public-issuer-configuration">
        <name>Issuer Configuration</name>
        <t>Issuers are configured with Private and Public Key pairs, each denoted skI and
pkI, respectively, used to produce tokens. Each key pair SHALL be generated as
as specified in FIPS 186-4 <xref target="DSS"/>, where the RSA modulus
is 2048 bits in length. These key pairs MUST NOT be reused in other protocols.
Each key pair MUST comply with all requirements as specified in <xref section="5.2" sectionFormat="of" target="PBRSA"/>.</t>
        <t>The key identifier for a keypair (skI, pkI), denoted <tt>token_key_id</tt>, is
computed as SHA256(encoded_key), where encoded_key is a DER-encoded
SubjectPublicKeyInfo (SPKI) object carrying pkI. The SPKI object MUST use the
RSASSA-PSS OID <xref target="RFC5756"/>, which specifies the hash algorithm and salt size.
The salt size MUST match the output size of the hash function associated with
the public key and token type.</t>
        <t>Since Clients truncate <tt>token_key_id</tt> in each <tt>TokenRequest</tt>, Issuers should
ensure that the truncated form of new key IDs do not collide with other
truncated key IDs in rotation.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>By design, public metadata is known to both Client and Issuer. The mechanism by which public
metadata is made available to Client and Issuer is out of scope for this document. The
privacy considerations in <xref target="ARCHITECTURE"/> offer a guide for determining what type of
metadata is appropriate to include, and in what circumstances.</t>
      <t>Each metadata use case requires careful consideration to ensure it does not regress the
intended privacy properties of Privacy Pass. In general, however, metadata is meant primarily
for simplfiying Privacy Pass deployments, and such simplifications require analysis so as to
not invalidate Client privacy. As an example of metadata that would not regress
privacy, consider the use case of metadata for differentiating keys. It is currently possible
for an Issuer to assign a unique token key for each metadata value they support. This
design pattern yields an increase in keys and can therefore complicate deployments. As
an alternative, deployments can use one of the issuance protocols in this document with
a single issuance key and different metadata values as the issuance public metadata.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document extends the token type registry defined in <xref section="8.2.1" sectionFormat="of" target="BASIC-PROTOCOL"/> with two new
entries described in the following sub-sections.</t>
      <section anchor="privately-verifiable-token-type">
        <name>Privately Verifiable Token Type</name>
        <t>The contents of this token type registry entry are as follows:</t>
        <ul spacing="normal">
          <li>
            <t>Value: 0xDA7B</t>
          </li>
          <li>
            <t>Name: Partially Oblivious PRF, OPRF(P-384, SHA-384)</t>
          </li>
          <li>
            <t>Token Structure: As defined in <xref target="private-finalize"/></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: Y</t>
          </li>
          <li>
            <t>Private Metadata: N</t>
          </li>
          <li>
            <t>Nk: 48</t>
          </li>
          <li>
            <t>Nid: 32</t>
          </li>
          <li>
            <t>Notes: N/A</t>
          </li>
        </ul>
      </section>
      <section anchor="publicly-verifiable-token-type">
        <name>Publicly Verifiable Token Type</name>
        <t>The contents of this token type registry entry are as follows:</t>
        <ul spacing="normal">
          <li>
            <t>Value: 0xDA7A</t>
          </li>
          <li>
            <t>Name: Partially Blind RSA (2048-bit)</t>
          </li>
          <li>
            <t>Token Structure: As defined in <xref target="public-finalize"/></t>
          </li>
          <li>
            <t>TokenChallenge Structure: As defined in <xref section="2.1" sectionFormat="of" target="AUTHSCHEME"/></t>
          </li>
          <li>
            <t>Publicly Verifiable: Y</t>
          </li>
          <li>
            <t>Public Metadata: Y</t>
          </li>
          <li>
            <t>Private Metadata: N</t>
          </li>
          <li>
            <t>Nk: 256</t>
          </li>
          <li>
            <t>Nid: 32</t>
          </li>
          <li>
            <t>Notes: The RSAPBSSA-SHA384-PSS-Deterministic and
RSAPBSSA-SHA384-PSSZERO-Deterministic variants are supported; see <xref section="6" sectionFormat="of" target="PBRSA"/></t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="AUTHSCHEME">
          <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="BASIC-PROTOCOL">
          <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="POPRF">
          <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="PBRSA">
          <front>
            <title>Partially Blind RSA Signatures</title>
            <author fullname="Ghous Ali Amjad" initials="G. A." surname="Amjad">
              <organization>Google</organization>
            </author>
            <author fullname="Scott Hendrickson" initials="S." surname="Hendrickson">
              <organization>Google</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Kevin W. L. Yeo" initials="K. W. L." surname="Yeo">
              <organization>Google</organization>
            </author>
            <date day="15" month="August" year="2024"/>
            <abstract>
              <t>   This document specifies a blind RSA signature protocol that supports
   public metadata.  It is an extension to the RSABSSA protocol recently
   specified by the CFRG.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document takes place on the Crypto Forum Research
   Group mailing list (cfrg@ietf.org), which is archived at
   https://mailarchive.ietf.org/arch/search/?email_list=cfrg.

   Source for this draft and an issue tracker can be found at
   https://github.com/chris-wood/draft-amjad-cfrg-partially-blind-rsa.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-amjad-cfrg-partially-blind-rsa-03"/>
        </reference>
        <reference anchor="TOKEN-EXTENSION" target="https://ietf-wg-privacypass.github.io/draft-ietf-privacypass-auth-scheme-extensions/draft-ietf-privacypass-auth-scheme-extensions.html">
          <front>
            <title>The PrivateToken HTTP Authentication Scheme Extensions Parameter</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </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="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="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="ARCHITECTURE">
          <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="DSS">
          <front>
            <title>Digital signature standard (DSS)</title>
            <author>
              <organization/>
            </author>
            <date year="2013"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.186-4"/>
          <refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
        </reference>
      </references>
    </references>
    <?line 575?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This work benefited from input from Ghous Amjad and Kevin Yeo.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
CP6TygPxP9MZUqZgXgAA

-->

</rfc>
