<?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.6.35 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-hendrickson-privacypass-public-metadata-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.3 -->
  <front>
    <title abbrev="Public Metadata Issuance">Public Metadata Issuance</title>
    <seriesInfo name="Internet-Draft" value="draft-hendrickson-privacypass-public-metadata-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="2023" month="June" day="15"/>
    <area>Security</area>
    <workgroup>Privacy Pass</workgroup>
    <keyword>public metadata issuance</keyword>
    <abstract>
      <?line 44?>

<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://smhendrickson.github.io/draft-hendrickson-privacypass-public-metadata-issuance/draft-hendrickson-privacypass-public-metadata.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-hendrickson-privacypass-public-metadata/"/>.
      </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/smhendrickson/draft-hendrickson-privacypass-public-metadata-issuance"/>.</t>
    </note>
  </front>
  <middle>
    <?line 49?>

<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 aggreed 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>len(s): the length of a byte string, in bytes.</li>
        <li>concat(x0, ..., xN): Concatenation of byte strings. For example, concat(0x01, 0x0203, 0x040506) = 0x010203040506</li>
        <li>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.</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>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.</li>
        <li>Issuer name: An identifier for the Issuer. This is typically a host name that
can be used to construct HTTP requests to the Issuer.</li>
        <li>Issuer Public Key: <tt>pkI</tt>, with a key identifier <tt>token_key_id</tt> computed as
described in <xref target="public-issuer-configuration"/>.</li>
        <li>Challenge value: <tt>challenge</tt>, an opaque byte string. For example, this might
be provided by the redemption protocol in <xref target="AUTHSCHEME"/>.</li>
        <li>Extensions: <tt>extensions</tt>, an Extensions structure as defined in <xref target="TOKEN-EXTENSION"/>.</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>The ExtendedTokenRequest.request contains a supported token_type.</li>
          <li>The ExtendedTokenRequest.request.truncated_token_key_id corresponds to the truncated key
ID of an Issuer Public Key.</li>
          <li>The ExtendedTokenRequest.request.blinded_msg is of the correct size.</li>
          <li>The ExtendedTokenRequest.extensions value is permitted by the Issuer's policy.</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>"evaluate_msg" is the Ne-octet evaluated message, computed as
<tt>SerializeElement(evaluate_element)</tt>.</li>
          <li>"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>.</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>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.</li>
        <li>Issuer name: An identifier for the Issuer. This is typically a host name that
can be used to construct HTTP requests to the Issuer.</li>
        <li>Issuer Public Key: <tt>pkI</tt>, with a key identifier <tt>token_key_id</tt> computed as
described in <xref target="public-issuer-configuration"/>.</li>
        <li>Challenge value: <tt>challenge</tt>, an opaque byte string. For example, this might
be provided by the redemption protocol in <xref target="AUTHSCHEME"/>.</li>
        <li>Extensions: <tt>extensions</tt>, an Extensions structure as defined in <xref target="TOKEN-EXTENSION"/>.</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>The ExtendedTokenRequest.request contains a supported token_type.</li>
          <li>The ExtendedTokenRequest.request.truncated_token_key_id corresponds to the truncated key
ID of an Issuer Public Key.</li>
          <li>The ExtendedTokenRequest.request.blinded_msg is of the correct size.</li>
          <li>The ExtendedTokenRequest.extensions value is permitted by the Issuer's policy.</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.</t>
        <artwork><![CDATA[
pkM = AugmentPublicKey(pkI, extensions)
token_input = concat(0xDA7A, // Token type field is 2 bytes long
                     Token.nonce,
                     Token.challenge_digest,
                     Token.token_key_id)
token_authenticator_input =  concat("msg",
    int_to_bytes(len(extensions), 2),
    extensions,
    token_input)
valid = RSASSA-PSS-VERIFY(pkM,
                          token_authenticator_input,
                          Token.authenticator)
]]></artwork>
        <t>Where <tt>AugmentPublicKey</tt> is defined in <xref section="4.6" sectionFormat="of" target="PBRSA"/>,
and message verification is redefined in <xref section="4.5" sectionFormat="of" target="PBRSA"/>.</t>
        <t>The function <tt>RSASSA-PSS-VERIFY</tt> 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 PSS mask
generation function (MGF), and a 48-byte salt length (sLen).</t>
      </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>TODO Security</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>Value: 0xDA7B</li>
          <li>Name: Partially Oblivious PRF, OPRF(P-384, SHA-384)</li>
          <li>Token Structure: As defined in <xref target="private-finalize"/></li>
          <li>TokenChallenge Structure: As defined in <xref section="2.1" sectionFormat="of" target="AUTHSCHEME"/></li>
          <li>Publicly Verifiable: N</li>
          <li>Public Metadata: Y</li>
          <li>Private Metadata: N</li>
          <li>Nk: 48</li>
          <li>Nid: 32</li>
          <li>Notes: N/A</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>Value: 0xDA7A</li>
          <li>Name: Partially Blind RSA (2048-bit)</li>
          <li>Token Structure: As defined in <xref target="public-finalize"/></li>
          <li>TokenChallenge Structure: As defined in <xref section="2.1" sectionFormat="of" target="AUTHSCHEME"/></li>
          <li>Publicly Verifiable: Y</li>
          <li>Public Metadata: Y</li>
          <li>Private Metadata: N</li>
          <li>Nk: 256</li>
          <li>Nid: 32</li>
          <li>Notes: The RSABSSA-SHA384-PSS-Deterministic and
RSABSSA-SHA384-PSSZERO-Deterministic variants are supported</li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <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="8" month="May" year="2023"/>
            <abstract>
              <t>   This document defines an HTTP authentication scheme that 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 an acceptable
   Privacy Pass token.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-auth-scheme-10"/>
        </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="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare</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="6" month="March" 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-10"/>
        </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 A. 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="13" month="March" year="2023"/>
            <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-00"/>
        </reference>
        <reference anchor="TOKEN-EXTENSION" target="https://chris-wood.github.io/draft-wood-privacypass-extensible-token/draft-wood-privacypass-extensible-token.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>
        <name>Informative References</name>
        <reference anchor="DSS">
          <front>
            <title>Digital Signature Standard (DSS)</title>
            <author>
              <organization/>
            </author>
            <date month="July" year="2013"/>
          </front>
          <seriesInfo name="National Institute of Standards and Technology" value="report"/>
          <seriesInfo name="DOI" value="10.6028/nist.fips.186-4"/>
        </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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
Ag5ZVgZPWwAA

-->

</rfc>
