<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-yun-privacypass-athm-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="ATHM Privacy Pass Issuance and Authentication Protocols">Anonymous Token with Hidden Metadata Privacy Pass Issuance and Authentication Protocols</title>
    <seriesInfo name="Internet-Draft" value="draft-yun-privacypass-athm-00"/>
    <author initials="C." surname="Yun" fullname="Cathie Yun">
      <organization>Apple, Inc.</organization>
      <address>
        <email>cathieyun@gmail.com</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Apple, Inc.</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <author initials="M." surname="Raykova" fullname="Mariana Raykova">
      <organization>Google</organization>
      <address>
        <email>marianar@google.com</email>
      </address>
    </author>
    <author initials="S." surname="Schlesinger" fullname="Samuel Schlesinger">
      <organization>Google</organization>
      <address>
        <email>sgschlesinger@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="October" day="20"/>
    <abstract>
      <?line 49?>

<t>This document specifies the issuance and redemption protocols for
tokens based on the Anonymous Tokens with Hidden Metadata (ATHM) protocol.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://cathieyun.github.io/draft-athm/draft-yun-privacypass-athm.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-yun-privacypass-athm/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Privacy Pass  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/cathieyun/draft-athm"/>.</t>
    </note>
  </front>
  <middle>
    <?line 54?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Privacy Pass architecture introduced in <xref target="ARCHITECTURE"/> defines an anonymous, single use token scheme.
The strongest-anonymity instantiation of a Privacy Pass token scheme carries exactly one bit of information
about the client, namely the fact that the client was issued a valid token as a trust signal, and this bit
is known to the client who can verify that it received a valid token during issuance. The architecture further
defines options for private or public metadata that can be embeded in the token by the issuer.</t>
      <t>While in many applications the trust signals that are attributed to clients via anonymous credentials
should be known to them, there are cases where these signals need to remain hidden from the clients
as a prerequisite for the effectiveness of the token scheme as a trust conveying mechanism. These settings
relate to fraud detection, where allowing the attacker to learn that it has been flagged as fraudulent
enables them to adapt and update their attack strategies much more effectively.</t>
      <t>An Anonymous Token with Hidden Metadata (ATHM), as specified in <xref target="ATHM-SPEC"/>, allows the issuer to embed
a fixed number of hidden metadata bits in the issued token. These metadata bits are only readable at
token redemption by the party holding the secret key for the scheme. These bits reduce the anonymity
properties of the tokens by allowing the issuer to partition clients into as many groups as the domain of
metadata, in a secret way. That is why it is important to carefully choose the limit on the allowed metadata
bits. The client can verify that the token it was issued does not contain more metadata bits than allowed.</t>
      <t>The ATHM tokens provide a way to enable hidden trust signals in an authentication token, while achieving the
strongest anonymity properties possible in this setting. Such tokens provide a bridge for using anonymous
credentials in fraud applications.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>This document uses the terms Origin, Client, Issuer, and Token as defined in
<xref section="2" sectionFormat="of" target="ARCHITECTURE"/>. Moreover, the following additional terms are
used throughout this document.</t>
      <ul spacing="normal">
        <li>
          <t>Issuer Public Key: The public key (from a private-public key pair) used by
the Issuer for issuing and verifying Tokens.</t>
        </li>
        <li>
          <t>Issuer Private Key: The private key (from a private-public key pair) used by
the Issuer for issuing and verifying Tokens.</t>
        </li>
      </ul>
      <t>Unless otherwise specified, this document encodes protocol messages in TLS
notation from <xref section="3" sectionFormat="of" target="TLS13"/>. Moreover, all constants are in
network byte order.</t>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>The issuance and redemption protocols defined in this document are built on
an anonymous credential construction called ATHM, as specified in <xref target="ATHM-SPEC"/>.
ATHM is a privately verifiable token with support for n private metadata buckets.</t>
      <t>Unlike the core Privacy Pass token types specified in <xref target="ISSUANCE"/>, ATHM tokens
are not cryptographically bound to TokenChallenge messages; see <xref target="AUTHSCHEME"/>
for details about how this binding typically works. Instead, with ATHM, Clients
can request tokens from an Issuer without a preceding TokenChallenge, and
present these tokens to the Origin during presentation. This interaction is
shown below.</t>
      <figure anchor="fig-overview">
        <name>Issuance and Redemption Overview</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="520" viewBox="0 0 520 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 40,64 L 40,176" fill="none" stroke="black"/>
              <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
              <path d="M 184,32 L 184,64" fill="none" stroke="black"/>
              <path d="M 216,64 L 216,176" fill="none" stroke="black"/>
              <path d="M 256,32 L 256,64" fill="none" stroke="black"/>
              <path d="M 336,32 L 336,64" fill="none" stroke="black"/>
              <path d="M 376,64 L 376,112" fill="none" stroke="black"/>
              <path d="M 376,160 L 376,176" fill="none" stroke="black"/>
              <path d="M 424,32 L 424,64" fill="none" stroke="black"/>
              <path d="M 440,32 L 440,64" fill="none" stroke="black"/>
              <path d="M 472,64 L 472,176" fill="none" stroke="black"/>
              <path d="M 512,32 L 512,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
              <path d="M 184,32 L 256,32" fill="none" stroke="black"/>
              <path d="M 336,32 L 424,32" fill="none" stroke="black"/>
              <path d="M 440,32 L 512,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 80,64" fill="none" stroke="black"/>
              <path d="M 184,64 L 256,64" fill="none" stroke="black"/>
              <path d="M 336,64 L 424,64" fill="none" stroke="black"/>
              <path d="M 440,64 L 512,64" fill="none" stroke="black"/>
              <path d="M 224,94 L 240,94" fill="none" stroke="black"/>
              <path d="M 224,98 L 240,98" fill="none" stroke="black"/>
              <path d="M 352,94 L 368,94" fill="none" stroke="black"/>
              <path d="M 352,98 L 368,98" fill="none" stroke="black"/>
              <path d="M 216,128 L 288,128" fill="none" stroke="black"/>
              <path d="M 408,128 L 464,128" fill="none" stroke="black"/>
              <path d="M 224,144 L 280,144" fill="none" stroke="black"/>
              <path d="M 408,144 L 472,144" fill="none" stroke="black"/>
              <path d="M 48,160 L 64,160" fill="none" stroke="black"/>
              <path d="M 192,160 L 216,160" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="472,128 460,122.4 460,133.6" fill="black" transform="rotate(0,464,128)"/>
              <polygon class="arrowhead" points="376,96 364,90.4 364,101.6" fill="black" transform="rotate(0,368,96)"/>
              <polygon class="arrowhead" points="232,144 220,138.4 220,149.6" fill="black" transform="rotate(180,224,144)"/>
              <polygon class="arrowhead" points="232,96 220,90.4 220,101.6" fill="black" transform="rotate(180,224,96)"/>
              <polygon class="arrowhead" points="56,160 44,154.4 44,165.6" fill="black" transform="rotate(180,48,160)"/>
              <g class="text">
                <text x="44" y="52">Origin</text>
                <text x="220" y="52">Client</text>
                <text x="380" y="52">Attester</text>
                <text x="476" y="52">Issuer</text>
                <text x="296" y="100">Attestation</text>
                <text x="348" y="132">TokenRequest</text>
                <text x="344" y="148">TokenResponse</text>
                <text x="128" y="164">Request+Token</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------+            +--------+         +----------+ +--------+
| Origin |            | Client |         | Attester | | Issuer |
+---+----+            +---+----+         +----+-----+ +---+----+
    |                     |                   |           |
    |                     |<== Attestation ==>|           |
    |                     |                   |           |
    |                     +--------- TokenRequest ------->|
    |                     |<------- TokenResponse --------+
    |<-- Request+Token ---+                   |           |
    |                     |                   |           |
]]></artwork>
        </artset>
      </figure>
      <t>Unlike the core Privacy Pass protocols, TokenChallenge values
are not inputs to the issuance protocol or redemption protocols.
As such, ATHM tokens require their own Token format, which is specified
in <xref target="redemption"/>.</t>
      <t>ATHM is only compatible with deployment models where the Issuer and Origin
are operated by the same entity (see <xref section="4" sectionFormat="of" target="ARCHITECTURE"/>), as
tokens produced from a credential are not publicly verifiable. The details
of attestation are outside the scope of the issuance protocol; see
<xref section="4" sectionFormat="of" target="ARCHITECTURE"/> for information about how attestation can
be implemented in each of the relevant deployment models.</t>
    </section>
    <section anchor="setup">
      <name>Configuration</name>
      <t>ATHM issuers are configured with key material used for issuance and credential
verification. Concretely, Issuers run the <tt>KeyGen</tt> function from <xref target="ATHM-SPEC"/>
to produce a secret and public key, denoted skI and pkI, respectively.</t>
      <artwork><![CDATA[
skI, pkI = KeyGen()
]]></artwork>
      <t>The Issuer Public Key ID, denoted <tt>issuer_key_id</tt>, is computed as the SHA-256
hash of the Verified Issuer Public Key, i.e., <tt>issuer_key_id = SHA-256(Serialize(verifiedPublicKey))</tt>.</t>
    </section>
    <section anchor="token-issuance-protocol">
      <name>Token Issuance Protocol</name>
      <t>Issuers provide a Issuer 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="setup"/> for how these keys are generated.</t>
      <t>Clients provide the following as input to the issuance protocol:</t>
      <ul spacing="normal">
        <li>
          <t>Issuer Request URL: A URL identifying the location to which issuance requests
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 'Joint Origin and Issuer' deployment model, the Issuer
Request URL 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="setup"/>.</t>
        </li>
      </ul>
      <t>Given this configuration and these inputs, the two messages exchanged in
this protocol to produce a credential are described below.</t>
      <section anchor="client-to-issuer-request">
        <name>Client-to-Issuer Request</name>
        <t>Given Issuer Public Key <tt>pkI</tt>, the Client first verifies the public key to make
a verified public key:</t>
        <artwork><![CDATA[
verifiedPublicKey = VerifyPublicKeyProof(publicKey, pi)
]]></artwork>
        <t>Next, it creates a token request message using the <tt>TokenRequest</tt> function from
<xref target="ATHM-SPEC"/> as follows:</t>
        <artwork><![CDATA[
(context, request) = TokenRequest(verifiedPublicKey)
]]></artwork>
        <t>The Client then creates a TokenRequest structure as follows:</t>
        <artwork><![CDATA[
struct {
  uint16_t token_type = 0xC07E; /* Type ATHM(P-256) */
  uint8_t truncated_issuer_key_id;
  uint8_t encoded_request[Nrequest];
} TokenRequest;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t>"token_type" is a 2-octet integer.</t>
          </li>
          <li>
            <t>"truncated_issuer_key_id" is the least significant byte of the <tt>issuer_key_id</tt>,
the Issuer Public Key ID corresponding to <tt>pkI</tt>, in network byte order (in other words, the last 8
bits of <tt>issuer_key_id</tt>). This value is truncated so that Issuers cannot use
<tt>issuer_key_id</tt> as a way of uniquely identifying Clients; see <xref target="security"/>
and referenced information for more details.</t>
          </li>
          <li>
            <t>"encoded_request" is the Nrequest-octet request, computed as the serialization
of the <tt>request</tt> value as defined in <xref target="ATHM-SPEC"/>.</t>
          </li>
        </ul>
        <t>The Client then generates an HTTP POST request to send to the Issuer Request URL,
with the TokenRequest as the content. The media type for this request is
"application/private-token-request". An example request for the Issuer Request URL
"https://issuer.example.net/request" is shown below.</t>
        <t>[[QUESTION: Should we reuse the same content type for this request, or should we introduce a new content type?]]</t>
        <artwork><![CDATA[
POST /request HTTP/1.1
Host: issuer.example.net
Accept: application/private-token-response
Content-Type: application/private-token-request
Content-Length: <Length of TokenRequest>

<Bytes containing the TokenRequest>
]]></artwork>
      </section>
      <section anchor="issuer-to-client-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 TokenRequest contains a supported token_type equal to value 0xC07E.</t>
          </li>
          <li>
            <t>The TokenRequest.truncated_token_key_id corresponds to the truncated key ID
of an Issuer Public Key, with corresponding secret key <tt>skI</tt>, owned by
the Issuer.</t>
          </li>
          <li>
            <t>The TokenRequest.encoded_request is of the correct size (<tt>Nrequest</tt>).</t>
          </li>
        </ul>
        <t>If any of these conditions is not met, the Issuer <bcp14>MUST</bcp14> return an HTTP 422
(Unprocessable Content) error to the client.</t>
        <t>If these conditions are met, the Issuer then tries to deserialize
TokenRequest.encoded_request according to <xref target="ATHM-SPEC"/>, yielding <tt>request</tt>.
If this fails, the Issuer <bcp14>MUST</bcp14> return an HTTP 422 (Unprocessable Content)
error to the client. Otherwise, if the Issuer is willing to produce a token
for the Client with a hidden metadata bucket, denoted <tt>hiddenMetadata</tt>, the Issuer
completes the issuance flow by an issuance response as follows:</t>
        <artwork><![CDATA[
response = TokenResponse(skI, pkI, request, hiddenMetadata)
]]></artwork>
        <t>The Issuer then creates a TokenResponse structured as follows:</t>
        <artwork><![CDATA[
struct {
   uint8_t encoded_response[Nresponse];
} TokenResponse;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t>"encoded_response" is the Nresponse-octet encoded issuance response message, computed
as the serialization of <tt>response</tt> as specified in <xref target="ATHM-SPEC"/>.</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[
HTTP/1.1 200 OK
Content-Type: application/private-token-response
Content-Length: <Length of TokenResponse>

<Bytes containing the TokenResponse>
]]></artwork>
      </section>
      <section anchor="token-finalization">
        <name>Token Finalization</name>
        <t>Upon receipt, the Client handles the response and, if successful, deserializes
the content values <tt>TokenResponse.encoded_response</tt> according to <xref target="ATHM-SPEC"/>
yielding <tt>response</tt>. If deserialization fails, the Client aborts the protocol.
Otherwise, the Client processes the response as follows:</t>
        <artwork><![CDATA[
token = FinalizeToken(context, verifiedPublicKey, request, response)
]]></artwork>
        <t>The Client then saves the resulting token structure for use with a future redemption.</t>
      </section>
    </section>
    <section anchor="redemption">
      <name>Token Redemption Protocol</name>
      <t>The token redemption protocol presents a Token to the Origin for redemption. This section
describes how the Token values are encoded in the redemption protocol and then verified
by the Origin.</t>
      <section anchor="token-structure">
        <name>Token Structure</name>
        <artwork><![CDATA[
struct {
    uint16_t token_type = 0xC07E; /* Type ATHM(P-256) */
    uint8_t issuer_key_id[Nid];
    uint8_t token[Ntoken];
} Token;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t>"token_type" is a 2-octet integer, in network byte order, equal to 0xC7D3.</t>
          </li>
          <li>
            <t>"issuer_key_id" is a Nid-octet identifier for the Issuer Public Key, computed
as defined in <xref target="setup"/>.</t>
          </li>
          <li>
            <t>"token" is a Ntoken-octet token, set to the serialized <tt>token</tt> value (see <xref target="ATHM-SPEC"/>
for serialization details); see <xref target="verification"/> for more information
about how this field is used in verifying a token.</t>
          </li>
        </ul>
      </section>
      <section anchor="verification">
        <name>Token Verification</name>
        <t>Verifying a Token requires invoking the VerifyToken function from <xref target="ATHM-SPEC"/>
with input <tt>skI</tt>, <tt>pkI</tt>, and <tt>token</tt> in the following way:</t>
        <artwork><![CDATA[
hiddenMetadata = VerifyToken(skI, pkI, token)
]]></artwork>
        <t>This function will fail with an error if the token is invalid. Otherwise, it will
return an integer value corresponding to the bucket bound to the token during issuance.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>ATHM is a privately verifiable token scheme, and therefore, the Issuer and Origin have
joint configuration. The privacy consideration from <xref section="6" sectionFormat="of" target="ARCHITECTURE"/> apply
to deployments of the ATHM scheme. The Origin-Client unlinkability of the ATHM depends on
the size of the hidden metadata, which reduced the size of the anonymity sets allowing the
issuer to partition clients according to their token metedata bits. As discussed in <xref section="6.1" sectionFormat="of" target="ARCHITECTURE"/>
this could enable the Issuer to track as many clients as the domain size of the metadata.
Since the metadata is private the assigned anonymity sets to clients remain hidden, e.g.,
if the issuer is trying to track a small set of client, it can hide which these clients are.
As suggested in <xref section="6.1" sectionFormat="of" target="ARCHITECTURE"/> each deployment should carefully consider the
balance of the utility obtained by the private metadata and the reduction of privacy and chose
a setting that most closely alignes with its goals.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document updates the "Privacy Pass Token Type" Registry with the
following entries.</t>
      <ul spacing="normal">
        <li>
          <t>Value: 0xC07E</t>
        </li>
        <li>
          <t>Name: ATHM(P-256)</t>
        </li>
        <li>
          <t>Token Structure: As defined in <xref section="2.2" sectionFormat="of" target="AUTHSCHEME"/></t>
        </li>
        <li>
          <t>Token Key Encoding: Serialized as described in <xref target="setup"/></t>
        </li>
        <li>
          <t>TokenChallenge Structure: As defined in <xref section="2.1" sectionFormat="of" target="AUTHSCHEME"/></t>
        </li>
        <li>
          <t>Public Verifiability: N</t>
        </li>
        <li>
          <t>Public Metadata: N</t>
        </li>
        <li>
          <t>Private Metadata: Y</t>
        </li>
        <li>
          <t>Nk: 48</t>
        </li>
        <li>
          <t>Nid: 32</t>
        </li>
        <li>
          <t>Reference: This document</t>
        </li>
        <li>
          <t>Notes: None</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="AUTHSCHEME">
        <front>
          <title>The Privacy Pass HTTP Authentication Scheme</title>
          <author fullname="T. Pauly" initials="T." surname="Pauly"/>
          <author fullname="S. Valdez" initials="S." surname="Valdez"/>
          <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
          <date month="June" year="2024"/>
          <abstract>
            <t>This document defines an HTTP authentication scheme for Privacy Pass, a privacy-preserving authentication mechanism used for authorization. The authentication scheme specified in this document can be used by Clients to redeem Privacy Pass tokens with an Origin. It can also be used by Origins to challenge Clients to present Privacy Pass tokens.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9577"/>
        <seriesInfo name="DOI" value="10.17487/RFC9577"/>
      </reference>
      <reference anchor="ARCHITECTURE">
        <front>
          <title>The Privacy Pass Architecture</title>
          <author fullname="A. Davidson" initials="A." surname="Davidson"/>
          <author fullname="J. Iyengar" initials="J." surname="Iyengar"/>
          <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
          <date month="June" year="2024"/>
          <abstract>
            <t>This document specifies the Privacy Pass architecture and requirements for its constituent protocols used for authorization based on privacy-preserving authentication mechanisms. It describes the conceptual model of Privacy Pass and its protocols, its security and privacy goals, practical deployment models, and recommendations for each deployment model, to help ensure that the desired security and privacy goals are fulfilled.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9576"/>
        <seriesInfo name="DOI" value="10.17487/RFC9576"/>
      </reference>
      <reference anchor="ISSUANCE">
        <front>
          <title>Privacy Pass Issuance Protocols</title>
          <author fullname="S. Celi" initials="S." surname="Celi"/>
          <author fullname="A. Davidson" initials="A." surname="Davidson"/>
          <author fullname="S. Valdez" initials="S." surname="Valdez"/>
          <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
          <date month="June" year="2024"/>
          <abstract>
            <t>This document specifies two variants of the two-message issuance protocol for Privacy Pass tokens: one that produces tokens that are privately verifiable using the Issuer Private Key and one that produces tokens that are publicly verifiable using the Issuer Public Key. Instances of "issuance protocol" and "issuance protocols" in the text of this document are used interchangeably to refer to the two variants of the Privacy Pass issuance protocol.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9578"/>
        <seriesInfo name="DOI" value="10.17487/RFC9578"/>
      </reference>
      <reference anchor="ATHM-SPEC">
        <front>
          <title>*** BROKEN REFERENCE ***</title>
          <author>
            <organization/>
          </author>
          <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="TLS13">
        <front>
          <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
          <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
          <date month="August" year="2018"/>
          <abstract>
            <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
            <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8446"/>
        <seriesInfo name="DOI" value="10.17487/RFC8446"/>
      </reference>
    </references>
    <?line 383?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Melissa Chase for discussion about the ATHM paper. Thanks also to Tommy Pauly, Phillipp Schoppmann and Ghous Amjad for collaboration on the ATHM specifications.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
