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

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

<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>
          <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>
      <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 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="6" month="July" 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-01"/>
        </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 anchor="sec-informative-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="DOI" value="10.6028/nist.fips.186-4"/>
          <refcontent>National Institute of Standards and Technology</refcontent>
        </reference>
      </references>
    </references>
    <?line 577?>

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

-->

</rfc>
