<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-privacypass-public-metadata-issuance-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <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-01"/>
    <author fullname="Scott Hendrickson">
      <organization>Google</organization>
      <address>
        <email>scott@shendrickson.com</email>
      </address>
    </author>
    <author fullname="Christopher A. Wood">
      <organization>Cloudflare, Inc.</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2024" month="October" day="14"/>
    <area>Security</area>
    <workgroup>Privacy Pass</workgroup>
    <keyword>next generation</keyword>
    <keyword>unicorn</keyword>
    <keyword>sparkling distributed ledger</keyword>
    <abstract>
      <?line 47?>

<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 52?>

<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 TokenChallenges 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="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="23" month="October" year="2023"/>
            <abstract>
              <t>   This document defines an HTTP authentication scheme for Privacy Pass,
   a privacy-preserving authentication mechanism used for authorization.
   The authentication scheme in this document can be used by clients to
   redeem Privacy Pass tokens with an origin.  It can also be used by
   origins to challenge clients to present Privacy Pass tokens.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-16"/>
        </reference>
        <reference anchor="ARCHITECTURE">
          <front>
            <title>The Privacy Pass Architecture</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="September" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for authorization
   based on privacy-preserving authentication mechanisms.  It describes
   the conceptual model of Privacy Pass and its protocols, its security
   and privacy goals, practical deployment models, and recommendations
   for each deployment model that helps ensure the desired security and
   privacy goals are fulfilled.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-voprf-21"/>
        </reference>
        <reference anchor="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="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 579?>

<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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

-->

</rfc>
