<?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-meunier-privacypass-reverse-flow-02" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="Privacy Pass Reverse Flow">Privacy Pass Reverse Flow</title>
    <seriesInfo name="Internet-Draft" value="draft-meunier-privacypass-reverse-flow-02"/>
    <author fullname="Thibault Meunier">
      <organization>Cloudflare Inc.</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <date year="2025" month="October" day="20"/>
    <area>Security</area>
    <workgroup>Privacy Pass</workgroup>
    <abstract>
      <?line 43?>

<t>This document specifies an instantiation of Privacy Pass Architecture <xref target="RFC9576"/>
that allows for a "reverse" flow from the Origin to the Client.
It describes a method for an Origin to issue new tokens in response to a request in
which a token is redeemed.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://thibmeu.github.io/draft-meunier-privacypass-reverse-flow-informational/draft-meunier-privacypass-reverse-flow.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-meunier-privacypass-reverse-flow/"/>.
      </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/thibmeu/draft-meunier-privacypass-reverse-flow-informational"/>.</t>
    </note>
  </front>
  <middle>
    <?line 50?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies an instantiation of Privacy Pass Architecture <xref target="RFC9576"/>
that allows for a reverse flow from the Origin to the Client.</t>
      <t>In other words, it specifies a way for an Origin to act as an Attester + Issuer.</t>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>With Privacy Pass issuance as described in <xref target="RFC9576"/>, once a token is sent by a Client,
it is considered spent and cannot be reused in order to guarantee unlinkability. If a token
were to be spent twice, the two requests would be linkable by the Origin.</t>
      <t>However, requiring that all tokens are spent only once means that Clients might need
to request more tokens for new requests, even if the request that included the original
token doesn't need to "spend" that token from the Origin's perspective (due to the
request ending up being insignificant to the Origin).
This draft provides a mechanism for an Origin to provide tokens, allowing reuse without
reaching out to the initial Attester and Issuer.</t>
      <section anchor="refunding-tokens">
        <name>Refunding tokens</name>
        <t>Certain Origin use Privacy Pass tokens to rate-limit requests they receive over a certain
time window because of resource constraints. If a Client sends a request that can
be served without utilising that resource, the Origin would like to authorise them
to do a second request. This is the case for request requiring compute and the compute is low,
or when the request leads to a redirection instead of content generation for instance.</t>
        <t>With a reverse flow,
a Client that has already been authorised by an Origin can maintain that authorization,
without losing the unlinkability property provided by Privacy Pass.</t>
      </section>
      <section anchor="bootstraping-issuer">
        <name>Bootstraping issuer</name>
        <t>An Origin wants to grant 30 access for Clients that solved a
CAPTCHA. To do so, it consumes a type 0x0002 public veriable token from an initial issuer that guarantees
a CAPTCHA has been solved,
and use it to issue 30 type 0x0001 private tokens.
Without a reverse flow, the Origin would have to require 30 0x0002 issuer tokens, which
have lower performance and a higher number of requests going to the issuer.</t>
      </section>
      <section anchor="attester-feedback-loop">
        <name>Attester feedback loop</name>
        <t>In <xref target="RFC9576"/>, a Client gets a token from an Issuer and redeems it at an Origin.
However, if the Client's request is deemed unwanted by the Origin at redemption
time, there is no mechanism that prevents the Client from going back to
the initial Issuer to get a new token and be authorized again.</t>
        <t>With a reverse flow, the initial Issuer may require Clients to present an
Origin-issued token before providing them with a second token.
This allows for a feedback loop between the Origin and the initial Issuer,
without breaking Client unlinkability.</t>
      </section>
    </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>We reuse terminology from <xref target="RFC9576"/>.</t>
      <t>The following terms are used throughout this document:</t>
      <dl>
        <dt><strong>Flow:</strong></dt>
        <dd>
          <t>Direction from PrivateToken issuance to its redemption. The entity starting
the flow acts as an Issuer, while the end of the flow acts as an Origin. The
Client is always included, as it finalises the TokenResponse, and coordinate
interactions.</t>
        </dd>
        <dt><strong>Initial Flow:</strong></dt>
        <dd>
          <t>Issuer -&gt; Attester -&gt; Client -&gt; Origin. This flow produces a PrivateToken that
is used by the Origin to kickstart a Reverse Flow.</t>
        </dd>
        <dt><strong>Reverse Flow:</strong></dt>
        <dd>
          <t>Issuer &lt;- Attester &lt;- Client &lt;- Origin. This flow allows Origin to issues
PrivateToken. In the reverse flow, the Origin operates one or more Issuer, and
the Client <bcp14>MAY</bcp14> provide these tokens either to the Initial Attester/Issuer, or
use them against the Origin</t>
        </dd>
        <dt><strong>Initial Attester/Issuer:</strong></dt>
        <dd>
          <t>Attester/Issuer part of the Initial Flow</t>
        </dd>
        <dt><strong>Origin Issuer:</strong></dt>
        <dd>
          <t>Issuer operated by the Origin</t>
        </dd>
        <dt><strong>Origin PrivateToken:</strong></dt>
        <dd>
          <t>PrivateToken issued by the Origin</t>
        </dd>
        <dt><strong>Reverse Origin:</strong></dt>
        <dd>
          <t>An entity that consumes the Origin PrivateToken. It can be the Origin, or the
Initial Attester/Issuer</t>
        </dd>
      </dl>
    </section>
    <section anchor="architecture">
      <name>Architecture overview</name>
      <t>Along with sending their PrivateToken for authentication (as specified in <xref target="RFC9576"/>), Client
sends TokenRequest</t>
      <figure anchor="fig-reverse-flow-architecture">
        <name>Architec ture of Privacy Pass with a Reverse Flow</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="352" width="856" viewBox="0 0 856 352" 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,336" fill="none" stroke="black"/>
              <path d="M 136,32 L 136,64" fill="none" stroke="black"/>
              <path d="M 176,32 L 176,64" fill="none" stroke="black"/>
              <path d="M 208,64 L 208,336" fill="none" stroke="black"/>
              <path d="M 248,32 L 248,64" fill="none" stroke="black"/>
              <path d="M 520,32 L 520,64" fill="none" stroke="black"/>
              <path d="M 552,64 L 552,192" fill="none" stroke="black"/>
              <path d="M 552,224 L 552,304" fill="none" stroke="black"/>
              <path d="M 592,32 L 592,64" fill="none" stroke="black"/>
              <path d="M 672,32 L 672,64" fill="none" stroke="black"/>
              <path d="M 712,64 L 712,144" fill="none" stroke="black"/>
              <path d="M 712,192 L 712,336" fill="none" stroke="black"/>
              <path d="M 760,32 L 760,64" fill="none" stroke="black"/>
              <path d="M 776,32 L 776,64" fill="none" stroke="black"/>
              <path d="M 808,64 L 808,336" fill="none" stroke="black"/>
              <path d="M 848,32 L 848,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 136,32" fill="none" stroke="black"/>
              <path d="M 176,32 L 248,32" fill="none" stroke="black"/>
              <path d="M 520,32 L 592,32" fill="none" stroke="black"/>
              <path d="M 672,32 L 760,32" fill="none" stroke="black"/>
              <path d="M 776,32 L 848,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 136,64" fill="none" stroke="black"/>
              <path d="M 176,64 L 248,64" fill="none" stroke="black"/>
              <path d="M 520,64 L 592,64" fill="none" stroke="black"/>
              <path d="M 672,64 L 760,64" fill="none" stroke="black"/>
              <path d="M 776,64 L 848,64" fill="none" stroke="black"/>
              <path d="M 216,96 L 344,96" fill="none" stroke="black"/>
              <path d="M 424,96 L 552,96" fill="none" stroke="black"/>
              <path d="M 208,112 L 272,112" fill="none" stroke="black"/>
              <path d="M 480,112 L 544,112" fill="none" stroke="black"/>
              <path d="M 560,126 L 576,126" fill="none" stroke="black"/>
              <path d="M 560,130 L 576,130" fill="none" stroke="black"/>
              <path d="M 688,126 L 704,126" fill="none" stroke="black"/>
              <path d="M 688,130 L 704,130" fill="none" stroke="black"/>
              <path d="M 552,160 L 624,160" fill="none" stroke="black"/>
              <path d="M 744,160 L 800,160" fill="none" stroke="black"/>
              <path d="M 560,176 L 624,176" fill="none" stroke="black"/>
              <path d="M 752,176 L 808,176" fill="none" stroke="black"/>
              <path d="M 216,240 L 232,240" fill="none" stroke="black"/>
              <path d="M 528,240 L 552,240" fill="none" stroke="black"/>
              <path d="M 48,256 L 64,256" fill="none" stroke="black"/>
              <path d="M 184,256 L 208,256" fill="none" stroke="black"/>
              <path d="M 40,272 L 64,272" fill="none" stroke="black"/>
              <path d="M 216,288 L 240,288" fill="none" stroke="black"/>
              <path d="M 504,288 L 544,288" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="808,160 796,154.4 796,165.6" fill="black" transform="rotate(0,800,160)"/>
              <polygon class="arrowhead" points="712,128 700,122.4 700,133.6" fill="black" transform="rotate(0,704,128)"/>
              <polygon class="arrowhead" points="568,176 556,170.4 556,181.6" fill="black" transform="rotate(180,560,176)"/>
              <polygon class="arrowhead" points="568,128 556,122.4 556,133.6" fill="black" transform="rotate(180,560,128)"/>
              <polygon class="arrowhead" points="552,288 540,282.4 540,293.6" fill="black" transform="rotate(0,544,288)"/>
              <polygon class="arrowhead" points="552,112 540,106.4 540,117.6" fill="black" transform="rotate(0,544,112)"/>
              <polygon class="arrowhead" points="224,240 212,234.4 212,245.6" fill="black" transform="rotate(180,216,240)"/>
              <polygon class="arrowhead" points="224,96 212,90.4 212,101.6" fill="black" transform="rotate(180,216,96)"/>
              <polygon class="arrowhead" points="56,256 44,250.4 44,261.6" fill="black" transform="rotate(180,48,256)"/>
              <g class="text">
                <text x="44" y="52">Origin</text>
                <text x="100" y="52">Issuer</text>
                <text x="212" y="52">Origin</text>
                <text x="556" y="52">Client</text>
                <text x="716" y="52">Attester</text>
                <text x="812" y="52">Issuer</text>
                <text x="384" y="100">Request</text>
                <text x="340" y="116">TokenChallenge</text>
                <text x="436" y="116">(Issuer)</text>
                <text x="632" y="132">Attestation</text>
                <text x="684" y="164">TokenRequest</text>
                <text x="688" y="180">TokenResponse</text>
                <text x="548" y="212">Finalisation</text>
                <text x="380" y="244">Request+Token+TokenRequest(Origin)</text>
                <text x="124" y="260">TokenRequest</text>
                <text x="128" y="276">TokenResponse</text>
                <text x="196" y="276">-&gt;</text>
                <text x="372" y="292">Response+TokenResponse(Origin)</text>
                <text x="548" y="324">Finalisation</text>
                <text x="552" y="340">|</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+---------------+    +--------+                                 +--------+         +----------+ +--------+
| Origin Issuer |    | Origin |                                 | Client |         | Attester | | Issuer |
+---+-----------+    +---+----+                                 +---+----+         +----+-----+ +---+----+
    |                    |                                          |                   |           |
    |                    |<---------------- Request ----------------+                   |           |
    |                    +-------- TokenChallenge (Issuer) -------->|                   |           |
    |                    |                                          |<== Attestation ==>|           |
    |                    |                                          |                   |           |
    |                    |                                          +--------- TokenRequest ------->|
    |                    |                                          |<-------- TokenResponse -------+
    |                    |                                          |                   |           |
    |                    |                                    Finalisation              |           |
    |                    |                                          |                   |           |
    |                    |<-- Request+Token+TokenRequest(Origin) ---+                   |           |
    |<-- TokenRequest ---+                                          |                   |           |
    +--- TokenResponse ->|                                          |                   |           |
    |                    |---- Response+TokenResponse(Origin) ----->|                   |           |
    |                    |                                          |                   |           |
    |                    |                                    Finalisation              |           |
    |                    |                                          |                   |           |
]]></artwork>
        </artset>
      </figure>
      <t>The initial flow matches the one defined by <xref target="RFC9576"/>. A Client gets challenged when
accessing a resource on an Origin. The Client goes to the Attester to get issue a Token.</t>
      <t>Through configuration mechanism not defined in this document, the Client is aware the Origin
acts as a Reverse Flow issuer.</t>
      <t>This is an extension of <xref target="RFC9576"/>. The redemption flow of a Privacy Pass token is defined in
<xref section="3.6.4" sectionFormat="of" target="RFC9576"/>. Reverse flow extends this so that redemption flow is interleaved with
the issuance flow described in <xref section="3.6.3" sectionFormat="of" target="RFC9576"/>.
This is denoted in the diagram above by the Client sending <tt>Request</tt>+<tt>Token</tt>+<tt>TokenRequest(Origin Issuer)</tt>.
The Origin runs the issuance protocol, and returns <tt>Response</tt>+<tt>TokenResponse(Origin Issuer)</tt>.</t>
      <t>Such flow can be performed through various means. This document introduces one to serve as example and
first basis.</t>
    </section>
    <section anchor="tokenrequest-tokenresponse-and-finalisation">
      <name>TokenRequest, TokenResponse, and Finalisation</name>
      <t>In <xref target="fig-reverse-flow-architecture"/>, the Client sends an <tt>TokenRequest</tt> and receives an <tt>TokenResponse</tt>.
These are meant to abstract request from different protocol to the Issuer.</t>
      <t>As specified in <xref section="3.5" sectionFormat="of" target="RFC9576"/>,</t>
      <ul empty="true">
        <li>
          <t>The structure and semantics of the TokenRequest and TokenResponse messages depend on the issuance protocol and token type being used.</t>
        </li>
      </ul>
      <t>The introducion of Privacy Pass issuance protocol based on Anonymous credential, such as <xref target="PRIVACYPASS-ARC"/> or <xref target="PRIVACYPASS-ACT"/>,
modifies <tt>TokenRequest</tt> to use <tt>CredentialRequest</tt> instead.</t>
      <t>Upon receiving an <tt>TokenResponse</tt>, the Client has to finalise the <tt>Token</tt> so it can be presented to an origin.
This may be a <tt>Finalisation</tt> for type 0x0002 as defined in <xref section="7" sectionFormat="of" target="RFC9578"/>,
a presentation for <xref section="7" sectionFormat="of" target="PRIVACYPASS-ARC"/>,
or even a refund for <xref target="PRIVACYPASS-ACT"/>.</t>
    </section>
    <section anchor="reverse-flow-with-an-http-header">
      <name>Reverse flow with an HTTP header</name>
      <t>This section defines a Reverse Flow, as presented in <xref target="architecture"/>, leveraging a new HTTP headers.</t>
      <t><tt>TokenRequest(Origin)</tt> and <tt>TokenResponse(Origin)</tt> happen through a new HTTP Header <tt>PrivacyPass-Reverse</tt>.
<tt>PrivacyPass-Reverse</tt> is a base64url (<xref target="RFC4648"/>) encoded <tt>GenericBatchTokenRequest</tt> as defined in <xref section="6" sectionFormat="of" target="BATCHED-TOKENS"/>.</t>
      <ul empty="true">
        <li>
          <t>The use of generic batch tokens as defined in <xref section="6" sectionFormat="of" target="BATCHED-TOKENS"/> is
because this already provides encoding for request and response, error wrapping, and
a concise format. One could use binary http or a new format</t>
        </li>
      </ul>
      <section anchor="client-behaviour">
        <name>Client behaviour</name>
        <t>Along with sending PrivateToken from the Initial Issuer to the Origin, the
Client sends a TokenRequest as defined in <xref target="RFC9578"/>,
<xref target="BATCHED-TOKENS"/>, or <xref target="PRIVACYPASS-ARC"/>. In all these definitions, TokenRequest <bcp14>MUST</bcp14>
prepended by a <tt>uint16_t</tt> representing the token type.
The Client <bcp14>SHOULD</bcp14> consider Privacy Pass Reverse Flow like the initial flow.
The Client is responsible to coordinate between the different entities.
Specifically, if the Reverse Origin is the Initial Attester/Issuer, the Client
<bcp14>SHOULD</bcp14> account for possible privacy leakage.</t>
      </section>
      <section anchor="originissuerattester-deployment">
        <name>Origin/Issuer/Attester deployment</name>
        <t>In this model, the Origin, Attester, and Issuer are all operated by the same
entity, as shown in <xref target="fig-deploy-shared"/>. The Reverse Flow is the same as
the Initial Flow, except for the request/response encapsulation.
The Origin is the Reverse Origin.</t>
        <figure anchor="fig-deploy-shared">
          <name>Shared Deployment Model</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="288" width="464" viewBox="0 0 464 288" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,80" fill="none" stroke="black"/>
                <path d="M 40,80 L 40,272" fill="none" stroke="black"/>
                <path d="M 80,48 L 80,80" fill="none" stroke="black"/>
                <path d="M 144,32 L 144,80" fill="none" stroke="black"/>
                <path d="M 168,48 L 168,80" fill="none" stroke="black"/>
                <path d="M 216,80 L 216,96" fill="none" stroke="black"/>
                <path d="M 216,128 L 216,160" fill="none" stroke="black"/>
                <path d="M 256,48 L 256,80" fill="none" stroke="black"/>
                <path d="M 272,48 L 272,80" fill="none" stroke="black"/>
                <path d="M 312,80 L 312,96" fill="none" stroke="black"/>
                <path d="M 312,128 L 312,208" fill="none" stroke="black"/>
                <path d="M 344,48 L 344,80" fill="none" stroke="black"/>
                <path d="M 360,48 L 360,80" fill="none" stroke="black"/>
                <path d="M 392,80 L 392,272" fill="none" stroke="black"/>
                <path d="M 432,48 L 432,80" fill="none" stroke="black"/>
                <path d="M 456,48 L 456,80" fill="none" stroke="black"/>
                <path d="M 144,32 L 440,32" fill="none" stroke="black"/>
                <path d="M 8,48 L 80,48" fill="none" stroke="black"/>
                <path d="M 168,48 L 256,48" fill="none" stroke="black"/>
                <path d="M 272,48 L 344,48" fill="none" stroke="black"/>
                <path d="M 360,48 L 432,48" fill="none" stroke="black"/>
                <path d="M 8,80 L 80,80" fill="none" stroke="black"/>
                <path d="M 168,80 L 256,80" fill="none" stroke="black"/>
                <path d="M 272,80 L 344,80" fill="none" stroke="black"/>
                <path d="M 360,80 L 432,80" fill="none" stroke="black"/>
                <path d="M 160,96 L 208,96" fill="none" stroke="black"/>
                <path d="M 224,96 L 304,96" fill="none" stroke="black"/>
                <path d="M 320,96 L 384,96" fill="none" stroke="black"/>
                <path d="M 400,96 L 440,96" fill="none" stroke="black"/>
                <path d="M 48,112 L 168,112" fill="none" stroke="black"/>
                <path d="M 376,112 L 392,112" fill="none" stroke="black"/>
                <path d="M 48,142 L 72,142" fill="none" stroke="black"/>
                <path d="M 48,146 L 72,146" fill="none" stroke="black"/>
                <path d="M 184,142 L 208,142" fill="none" stroke="black"/>
                <path d="M 184,146 L 208,146" fill="none" stroke="black"/>
                <path d="M 40,176 L 128,176" fill="none" stroke="black"/>
                <path d="M 248,176 L 304,176" fill="none" stroke="black"/>
                <path d="M 48,192 L 128,192" fill="none" stroke="black"/>
                <path d="M 256,192 L 312,192" fill="none" stroke="black"/>
                <path d="M 40,240 L 96,240" fill="none" stroke="black"/>
                <path d="M 328,240 L 384,240" fill="none" stroke="black"/>
                <path d="M 48,256 L 120,256" fill="none" stroke="black"/>
                <path d="M 312,256 L 392,256" fill="none" stroke="black"/>
                <path d="M 440,32 C 448.83064,32 456,39.16936 456,48" fill="none" stroke="black"/>
                <path d="M 160,96 C 151.16936,96 144,88.83064 144,80" fill="none" stroke="black"/>
                <path d="M 440,96 C 448.83064,96 456,88.83064 456,80" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="392,240 380,234.4 380,245.6" fill="black" transform="rotate(0,384,240)"/>
                <polygon class="arrowhead" points="216,144 204,138.4 204,149.6" fill="black" transform="rotate(0,208,144)"/>
                <polygon class="arrowhead" points="56,256 44,250.4 44,261.6" fill="black" transform="rotate(180,48,256)"/>
                <polygon class="arrowhead" points="56,192 44,186.4 44,197.6" fill="black" transform="rotate(180,48,192)"/>
                <polygon class="arrowhead" points="56,144 44,138.4 44,149.6" fill="black" transform="rotate(180,48,144)"/>
                <polygon class="arrowhead" points="56,112 44,106.4 44,117.6" fill="black" transform="rotate(180,48,112)"/>
                <g class="text">
                  <text x="44" y="68">Client</text>
                  <text x="212" y="68">Attester</text>
                  <text x="308" y="68">Issuer</text>
                  <text x="396" y="68">Origin</text>
                  <text x="236" y="116">TokenChallenge</text>
                  <text x="332" y="116">(Issuer)</text>
                  <text x="128" y="148">Attestation</text>
                  <text x="188" y="180">TokenRequest</text>
                  <text x="192" y="196">TokenResponse</text>
                  <text x="216" y="212">|</text>
                  <text x="212" y="244">Token+TokenRequest(Origin)</text>
                  <text x="216" y="260">TokenResponse(Origin)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                 +-------------------------------------.
+--------+       |  +----------+ +--------+ +--------+  |
| Client |       |  | Attester | | Issuer | | Origin |  |
+---+----+       |  +-----+----+ +----+---+ +---+----+  |
    |             `-------|-----------|---------|------'
    |<--------------- TokenChallenge (Issuer) --+
    |                     |           |         |
    |<=== Attestation ===>|           |         |
    |                     |           |         |
    +----------- TokenRequest --------|         |
    |<---------- TokenResponse -------+         |
    |                     |           |         |
    |                                           |
    +------- Token+TokenRequest(Origin) ------->|
    |<--------- TokenResponse(Origin) ----------+
    |                                           |
]]></artwork>
          </artset>
        </figure>
        <t>Similar to the original Shared Deployment Model, the Attester,
Issuer, and Origin share the attestation, issuance, and redemption
contexts. Even if this context changes between the Initial and
Reverse Flow, attestation mechanism that can uniquely identify
a Client are not appropriate as they could lead to unlinkability violations.</t>
        <ul empty="true">
          <li>
            <t>This model allows for private verifiability. Even though no optimised
scheme is available at the time of writting, the author recommends to follow
advances of anonymous credential within the Privacy Pass group.</t>
            <t>Specifically</t>
            <ol spacing="normal" type="1"><li>
                <t><xref target="PRIVACYPASS-ARC"/></t>
              </li>
              <li>
                <t><xref target="PRIVACYPASS-BBS"/></t>
              </li>
              <li>
                <t><xref target="PRIVACYPASS-ACT"/></t>
              </li>
            </ol>
            <t>These scheme allow for optimisation of Token finalisation by the Client.</t>
          </li>
        </ul>
      </section>
      <section anchor="split-origin-attester-deployment">
        <name>Split Origin-Attester deployment</name>
        <t>In this model, the Attester and Issuer are operated by the same entity
that is separate from the Origin. The Origin trusts the joint Attester
and Issuer to perform attestation and issue Tokens.
Origin Tokens can then be sent by Client on new requests, as long as the
Reverse Origin trusts the Origin to perform attestation and issue Tokens.</t>
        <figure anchor="fig-deploy-joint-issuer">
          <name>Joint Attester and Issuer Deployment Model</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="864" viewBox="0 0 864 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,80" fill="none" stroke="black"/>
                <path d="M 40,80 L 40,256" fill="none" stroke="black"/>
                <path d="M 136,48 L 136,80" fill="none" stroke="black"/>
                <path d="M 176,48 L 176,80" fill="none" stroke="black"/>
                <path d="M 208,80 L 208,256" fill="none" stroke="black"/>
                <path d="M 248,48 L 248,80" fill="none" stroke="black"/>
                <path d="M 512,48 L 512,80" fill="none" stroke="black"/>
                <path d="M 544,80 L 544,256" fill="none" stroke="black"/>
                <path d="M 584,48 L 584,80" fill="none" stroke="black"/>
                <path d="M 632,32 L 632,80" fill="none" stroke="black"/>
                <path d="M 656,48 L 656,80" fill="none" stroke="black"/>
                <path d="M 704,80 L 704,144" fill="none" stroke="black"/>
                <path d="M 704,192 L 704,256" fill="none" stroke="black"/>
                <path d="M 744,48 L 744,80" fill="none" stroke="black"/>
                <path d="M 760,48 L 760,80" fill="none" stroke="black"/>
                <path d="M 800,80 L 800,256" fill="none" stroke="black"/>
                <path d="M 832,48 L 832,80" fill="none" stroke="black"/>
                <path d="M 856,48 L 856,80" fill="none" stroke="black"/>
                <path d="M 632,32 L 840,32" fill="none" stroke="black"/>
                <path d="M 8,48 L 136,48" fill="none" stroke="black"/>
                <path d="M 176,48 L 248,48" fill="none" stroke="black"/>
                <path d="M 512,48 L 584,48" fill="none" stroke="black"/>
                <path d="M 656,48 L 744,48" fill="none" stroke="black"/>
                <path d="M 760,48 L 832,48" fill="none" stroke="black"/>
                <path d="M 8,80 L 136,80" fill="none" stroke="black"/>
                <path d="M 176,80 L 248,80" fill="none" stroke="black"/>
                <path d="M 512,80 L 584,80" fill="none" stroke="black"/>
                <path d="M 656,80 L 744,80" fill="none" stroke="black"/>
                <path d="M 760,80 L 832,80" fill="none" stroke="black"/>
                <path d="M 648,96 L 696,96" fill="none" stroke="black"/>
                <path d="M 712,96 L 792,96" fill="none" stroke="black"/>
                <path d="M 808,96 L 840,96" fill="none" stroke="black"/>
                <path d="M 208,112 L 224,112" fill="none" stroke="black"/>
                <path d="M 432,112 L 536,112" fill="none" stroke="black"/>
                <path d="M 552,126 L 568,126" fill="none" stroke="black"/>
                <path d="M 552,130 L 568,130" fill="none" stroke="black"/>
                <path d="M 680,126 L 696,126" fill="none" stroke="black"/>
                <path d="M 680,130 L 696,130" fill="none" stroke="black"/>
                <path d="M 544,160 L 616,160" fill="none" stroke="black"/>
                <path d="M 736,160 L 792,160" fill="none" stroke="black"/>
                <path d="M 552,176 L 616,176" fill="none" stroke="black"/>
                <path d="M 744,176 L 800,176" fill="none" stroke="black"/>
                <path d="M 216,192 L 232,192" fill="none" stroke="black"/>
                <path d="M 528,192 L 544,192" fill="none" stroke="black"/>
                <path d="M 48,208 L 64,208" fill="none" stroke="black"/>
                <path d="M 184,208 L 208,208" fill="none" stroke="black"/>
                <path d="M 40,224 L 56,224" fill="none" stroke="black"/>
                <path d="M 184,224 L 200,224" fill="none" stroke="black"/>
                <path d="M 208,240 L 232,240" fill="none" stroke="black"/>
                <path d="M 496,240 L 536,240" fill="none" stroke="black"/>
                <path d="M 840,32 C 848.83064,32 856,39.16936 856,48" fill="none" stroke="black"/>
                <path d="M 648,96 C 639.16936,96 632,88.83064 632,80" fill="none" stroke="black"/>
                <path d="M 840,96 C 848.83064,96 856,88.83064 856,80" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="800,160 788,154.4 788,165.6" fill="black" transform="rotate(0,792,160)"/>
                <polygon class="arrowhead" points="704,128 692,122.4 692,133.6" fill="black" transform="rotate(0,696,128)"/>
                <polygon class="arrowhead" points="560,176 548,170.4 548,181.6" fill="black" transform="rotate(180,552,176)"/>
                <polygon class="arrowhead" points="560,128 548,122.4 548,133.6" fill="black" transform="rotate(180,552,128)"/>
                <polygon class="arrowhead" points="544,240 532,234.4 532,245.6" fill="black" transform="rotate(0,536,240)"/>
                <polygon class="arrowhead" points="544,112 532,106.4 532,117.6" fill="black" transform="rotate(0,536,112)"/>
                <polygon class="arrowhead" points="224,192 212,186.4 212,197.6" fill="black" transform="rotate(180,216,192)"/>
                <polygon class="arrowhead" points="208,224 196,218.4 196,229.6" fill="black" transform="rotate(0,200,224)"/>
                <polygon class="arrowhead" points="56,208 44,202.4 44,213.6" fill="black" transform="rotate(180,48,208)"/>
                <g class="text">
                  <text x="44" y="68">Origin</text>
                  <text x="100" y="68">Issuer</text>
                  <text x="212" y="68">Origin</text>
                  <text x="548" y="68">Client</text>
                  <text x="700" y="68">Attester</text>
                  <text x="796" y="68">Issuer</text>
                  <text x="292" y="116">TokenChallenge</text>
                  <text x="388" y="116">(Issuer)</text>
                  <text x="624" y="132">Attestation</text>
                  <text x="676" y="164">TokenRequest</text>
                  <text x="680" y="180">TokenResponse</text>
                  <text x="380" y="196">Request+Token+TokenRequest(Origin)</text>
                  <text x="124" y="212">TokenRequest</text>
                  <text x="120" y="228">TokenResponse</text>
                  <text x="364" y="244">Response+TokenResponse(Origin)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                                                                              +--------------------------.
+---------------+    +--------+                                +--------+     |  +----------+ +--------+  |
| Origin Issuer |    | Origin |                                | Client |     |  | Attester | | Issuer |  |
+---+-----------+    +---+----+                                +---+----+     |  +-----+----+ +----+---+  |
    |                    |                                         |           `-------|-----------|-----'
    |                    +-- TokenChallenge (Issuer) ------------->|                   |           |
    |                    |                                         |<== Attestation ==>|           |
    |                    |                                         |                   |           |
    |                    |                                         +--------- TokenRequest ------->|
    |                    |                                         |<-------- TokenResponse -------+
    |                    |<-- Request+Token+TokenRequest(Origin) --+                   |           |
    |<-- TokenRequest ---+                                         |                   |           |
    +-- TokenResponse -->|                                         |                   |           |
    |                    +--- Response+TokenResponse(Origin) ----->|                   |           |
    |                    |                                         |                   |           |
]]></artwork>
          </artset>
        </figure>
        <t>The Origin Issuer <bcp14>MUST NOT</bcp14> issue privately verifiable tokens, as this would
lead to secret material being shared between the Origin and the Reverse Origin.</t>
        <t>A particular deployment model is when the Reverse Origin is the Attester/Issuer.
This model is described in <xref target="fig-deploy-joint-issuer-reserve"/></t>
        <figure anchor="fig-deploy-joint-issuer-reserve">
          <name>Joint Attester and Issuer Deployment Model with reverse</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="288" width="864" viewBox="0 0 864 288" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,80" fill="none" stroke="black"/>
                <path d="M 40,80 L 40,272" fill="none" stroke="black"/>
                <path d="M 136,48 L 136,80" fill="none" stroke="black"/>
                <path d="M 176,48 L 176,80" fill="none" stroke="black"/>
                <path d="M 208,80 L 208,272" fill="none" stroke="black"/>
                <path d="M 248,48 L 248,80" fill="none" stroke="black"/>
                <path d="M 512,48 L 512,80" fill="none" stroke="black"/>
                <path d="M 544,80 L 544,272" fill="none" stroke="black"/>
                <path d="M 584,48 L 584,80" fill="none" stroke="black"/>
                <path d="M 632,32 L 632,80" fill="none" stroke="black"/>
                <path d="M 656,48 L 656,80" fill="none" stroke="black"/>
                <path d="M 704,80 L 704,144" fill="none" stroke="black"/>
                <path d="M 704,192 L 704,248" fill="none" stroke="black"/>
                <path d="M 744,48 L 744,80" fill="none" stroke="black"/>
                <path d="M 760,48 L 760,80" fill="none" stroke="black"/>
                <path d="M 800,80 L 800,272" fill="none" stroke="black"/>
                <path d="M 832,48 L 832,80" fill="none" stroke="black"/>
                <path d="M 856,48 L 856,80" fill="none" stroke="black"/>
                <path d="M 632,32 L 840,32" fill="none" stroke="black"/>
                <path d="M 8,48 L 136,48" fill="none" stroke="black"/>
                <path d="M 176,48 L 248,48" fill="none" stroke="black"/>
                <path d="M 512,48 L 584,48" fill="none" stroke="black"/>
                <path d="M 656,48 L 744,48" fill="none" stroke="black"/>
                <path d="M 760,48 L 832,48" fill="none" stroke="black"/>
                <path d="M 8,80 L 136,80" fill="none" stroke="black"/>
                <path d="M 176,80 L 248,80" fill="none" stroke="black"/>
                <path d="M 512,80 L 584,80" fill="none" stroke="black"/>
                <path d="M 656,80 L 744,80" fill="none" stroke="black"/>
                <path d="M 760,80 L 832,80" fill="none" stroke="black"/>
                <path d="M 648,96 L 696,96" fill="none" stroke="black"/>
                <path d="M 712,96 L 792,96" fill="none" stroke="black"/>
                <path d="M 808,96 L 840,96" fill="none" stroke="black"/>
                <path d="M 208,112 L 224,112" fill="none" stroke="black"/>
                <path d="M 432,112 L 536,112" fill="none" stroke="black"/>
                <path d="M 552,126 L 568,126" fill="none" stroke="black"/>
                <path d="M 552,130 L 568,130" fill="none" stroke="black"/>
                <path d="M 680,126 L 696,126" fill="none" stroke="black"/>
                <path d="M 680,130 L 696,130" fill="none" stroke="black"/>
                <path d="M 544,160 L 616,160" fill="none" stroke="black"/>
                <path d="M 736,160 L 792,160" fill="none" stroke="black"/>
                <path d="M 552,176 L 616,176" fill="none" stroke="black"/>
                <path d="M 744,176 L 800,176" fill="none" stroke="black"/>
                <path d="M 216,192 L 232,192" fill="none" stroke="black"/>
                <path d="M 528,192 L 544,192" fill="none" stroke="black"/>
                <path d="M 48,208 L 64,208" fill="none" stroke="black"/>
                <path d="M 184,208 L 208,208" fill="none" stroke="black"/>
                <path d="M 40,224 L 64,224" fill="none" stroke="black"/>
                <path d="M 208,240 L 232,240" fill="none" stroke="black"/>
                <path d="M 496,240 L 536,240" fill="none" stroke="black"/>
                <path d="M 544,256 L 640,256" fill="none" stroke="black"/>
                <path d="M 704,256 L 792,256" fill="none" stroke="black"/>
                <path d="M 840,32 C 848.83064,32 856,39.16936 856,48" fill="none" stroke="black"/>
                <path d="M 648,96 C 639.16936,96 632,88.83064 632,80" fill="none" stroke="black"/>
                <path d="M 840,96 C 848.83064,96 856,88.83064 856,80" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="800,256 788,250.4 788,261.6" fill="black" transform="rotate(0,792,256)"/>
                <polygon class="arrowhead" points="800,160 788,154.4 788,165.6" fill="black" transform="rotate(0,792,160)"/>
                <polygon class="arrowhead" points="704,128 692,122.4 692,133.6" fill="black" transform="rotate(0,696,128)"/>
                <polygon class="arrowhead" points="560,176 548,170.4 548,181.6" fill="black" transform="rotate(180,552,176)"/>
                <polygon class="arrowhead" points="560,128 548,122.4 548,133.6" fill="black" transform="rotate(180,552,128)"/>
                <polygon class="arrowhead" points="544,240 532,234.4 532,245.6" fill="black" transform="rotate(0,536,240)"/>
                <polygon class="arrowhead" points="544,112 532,106.4 532,117.6" fill="black" transform="rotate(0,536,112)"/>
                <polygon class="arrowhead" points="224,192 212,186.4 212,197.6" fill="black" transform="rotate(180,216,192)"/>
                <polygon class="arrowhead" points="56,208 44,202.4 44,213.6" fill="black" transform="rotate(180,48,208)"/>
                <g class="text">
                  <text x="44" y="68">Origin</text>
                  <text x="100" y="68">Issuer</text>
                  <text x="212" y="68">Origin</text>
                  <text x="548" y="68">Client</text>
                  <text x="700" y="68">Attester</text>
                  <text x="796" y="68">Issuer</text>
                  <text x="292" y="116">TokenChallenge</text>
                  <text x="388" y="116">(Issuer)</text>
                  <text x="624" y="132">Attestation</text>
                  <text x="676" y="164">TokenRequest</text>
                  <text x="680" y="180">TokenResponse</text>
                  <text x="380" y="196">Request+Token+TokenRequest(Origin)</text>
                  <text x="124" y="212">TokenRequest</text>
                  <text x="128" y="228">TokenResponse</text>
                  <text x="196" y="228">-&gt;</text>
                  <text x="364" y="244">Response+TokenResponse(Origin)</text>
                  <text x="672" y="260">Token</text>
                  <text x="704" y="276">|</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                                                                              +--------------------------.
+---------------+    +--------+                                +--------+     |  +----------+ +--------+  |
| Origin Issuer |    | Origin |                                | Client |     |  | Attester | | Issuer |  |
+---+-----------+    +---+----+                                +---+----+     |  +-----+----+ +----+---+  |
    |                    |                                         |           `-------|-----------|-----'
    |                    +-- TokenChallenge (Issuer) ------------->|                   |           |
    |                    |                                         |<== Attestation ==>|           |
    |                    |                                         |                   |           |
    |                    |                                         +--------- TokenRequest ------->|
    |                    |                                         |<-------- TokenResponse -------+
    |                    |<-- Request+Token+TokenRequest(Origin) --+                   |           |
    |<-- TokenRequest ---+                                         |                   |           |
    +--- TokenResponse ->|                                         |                   |           |
    |                    +--- Response+TokenResponse(Origin) ----->|                   |           |
    |                    |                                         +------------ Token ----------->|
    |                    |                                         |                   |           |
]]></artwork>
          </artset>
        </figure>
        <t>This deployment <bcp14>SHOULD</bcp14> not allow the Reverse Origin to infer the request made
to the Origin, as it would break unlinkability.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>Privacy Pass <xref target="RFC9576"/> states</t>
      <ul empty="true">
        <li>
          <t>In general, limiting the amount of metadata permitted helps limit the extent
to which metadata can uniquely identify individual Clients. Failure to bound the
number of possible metadata values can therefore lead to a reduction in Client
privacy. Most token types do not admit any metadata, so this bound is implicitly
enforced.</t>
        </li>
      </ul>
      <t>In Privacy Pass with a reverse flow, Clients are provided with new PrivateTokens
depending on their request. They can spend these tokens to continue making further
requests.</t>
      <t>While the token are still unlinkable, the token_key_id associated to them
represent metadata. It leaks some information about the Client. The following
subsections discuss the issues that influence the anonymity set, and possible
mitigations/safeguards to protect against this underlying problem.</t>
      <section anchor="issuer-face-values">
        <name>Issuer face values</name>
        <t>When setting up a reverse flow deployment, an Origin <bcp14>MAY</bcp14> operate multiple
Issuers, and assign them some metadata to them. The amount of possible metadata
grows as 2^(origin_issuers).</t>
        <t>We RECOMMEND that:</t>
        <ol spacing="normal" type="1"><li>
            <t>Origin defines their anonimity sets, and deploy no more than
log2(#anonimity_sets). This bounds the possible anonimity sets by design.</t>
          </li>
          <li>
            <t>Client to only send 1 PrivateToken per request. This is inline with RFC9577
and RFC (Web Authentication) which only allows one challenge response to be
provided as part of Authorization HTTP header.</t>
          </li>
          <li>
            <t>Issuers metadata to be publicly disclosed via an origin endpoint, and
externally monitored</t>
          </li>
        </ol>
      </section>
      <section anchor="token-for-specific-clients">
        <name>Token for specific Clients</name>
        <t>In Privacy Pass with a reverse flow, an Origin <bcp14>MAY</bcp14> operate multiple Issuers,
with arbitrary metadata associated to them. A malicious Origin <bcp14>MAY</bcp14> uses this
opportunity to associate certain token values to a specific set of Clients.</t>
        <t>Let's consider the following deployment: the Origin operates two issuers A and
B. The Client sends Token_A, and (TokenRequest_A, TokenRequest_B). Issuer B is
associated to croissant aficionados.</t>
        <t>If a Client requests croissant, or sends Token_B, the origin provides
TokenResponse_B. If not, it provides TokenResponse_A.</t>
        <t>Over time, this means the Origin is able to track croissants aficionados.</t>
        <t>To mitigate this, we RECOMMEND:</t>
        <ol spacing="normal" type="1"><li>
            <t>The initial PrivateToken to be provided by an Issuer not in control of the
Origin. The joint Origin/Attester/Issuer model <bcp14>SHOULD NOT</bcp14> be used.</t>
          </li>
          <li>
            <t>Clients to reset their state regularly with the initial Issuer.</t>
          </li>
        </ol>
      </section>
      <section anchor="sending-more-than-one-token">
        <name>Sending more than one token</name>
        <t>While that's not part of Privacy Pass with a reverse flow, some deployment might
consider allowing Clients to send multiple PrivateToken, similar to how normal
Privacy Pass deployment allow two distinct PrivateToken to be sent.</t>
        <t>In Privacy Pass with a reverse flow deployment, there are as many bits as
Issuers; each token is one bit. We RECOMMEND to have a maximum of 6 Origin
operated Issuers, bounding Client information to 2^6 = 64. Accounting for the
initial Issuer, this means a total of log2(64)+1=7 issuers.</t>
        <t>Origin should have sufficient traffic to not single-out particular Client based
on timings of requests.</t>
      </section>
      <section anchor="swap-endpoint-and-its-privacy-implication">
        <name>Swap endpoint and its privacy implication</name>
        <t>With multiple Issuers, a Client <bcp14>MAY</bcp14> end up with a bunch of tokens, for various
Issuers. Origins <bcp14>MAY</bcp14> propose a swap endpoint at which a Client can exchange one
or more Origin tokens against one or more new Origin tokens.</t>
        <t>The Origin <bcp14>SHOULD</bcp14> ensure this endpoint receives enough traffic to not reduce the
anonymity sets.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="BATCHED-TOKENS">
          <front>
            <title>Batched Token Issuance Protocol</title>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare Inc.</organization>
            </author>
            <date day="3" month="July" year="2025"/>
            <abstract>
              <t>   This document specifies two variants of the Privacy Pass issuance
   protocol that allow for batched issuance of tokens.  These allow
   clients to request more than one token at a time and for issuers to
   issue more than one token at a time.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-batched-tokens-05"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC9576">
          <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="RFC9578">
          <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="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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="PRIVACYPASS-ACT" target="https://samuelschlesinger.github.io/draft-act/draft-schlesinger-privacypass-act.html">
          <front>
            <title>Anonymous Credit Tokens</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="PRIVACYPASS-ARC">
          <front>
            <title>Privacy Pass Issuance Protocol for Anonymous Rate-Limited Credentials</title>
            <author fullname="Cathie Yun" initials="C." surname="Yun">
              <organization>Apple, Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Apple, Inc.</organization>
            </author>
            <date day="6" month="August" year="2025"/>
            <abstract>
              <t>   This document specifies the issuance and redemption protocols for
   tokens based on the Anonymous Rate-Limited Credential (ARC) protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-yun-privacypass-arc-01"/>
        </reference>
        <reference anchor="PRIVACYPASS-BBS">
          <front>
            <title>BBS for PrivacyPass</title>
            <author fullname="Watson Ladd" initials="W." surname="Ladd">
              <organization>Akamai Technologies</organization>
            </author>
            <date day="26" month="February" year="2024"/>
            <abstract>
              <t>   Existing token types in privacy pass conflate attribution with rate
   limiting.  This document describes a token type where the issuer
   attests to a set of properties of the client, which the client can
   then selectively prove to the origin.  Repeated showings of the same
   credential are unlinkable, unlike other token types in privacy pass.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ladd-privacypass-bbs-01"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
      </references>
    </references>
    <?line 430?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author would like to thank Tommy Pauly, Chris Wood, Raphael Robert, and Armando Faz Hernandez
for helpful discussion on Privacy Pass architecture and its considerations.</t>
    </section>
    <section numbered="false" anchor="changelog">
      <name>Changelog</name>
      <t>v01</t>
      <ul spacing="normal">
        <li>
          <t>Editorial pass on the introduction</t>
        </li>
        <li>
          <t>Add a motivation section: refunding tokens, bootstraping issuer, attester feeback loop</t>
        </li>
        <li>
          <t>Split protocol overview via HTTP headers in its own section</t>
        </li>
        <li>
          <t>Add consideration about anonymous credentials in joint origin/issuer deployment</t>
        </li>
      </ul>
      <t>v00</t>
      <ul spacing="normal">
        <li>
          <t>Initial draft</t>
        </li>
        <li>
          <t>Possibility of a new HTTP request for inlining request</t>
        </li>
        <li>
          <t>Privacy considerations about additional metadata</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
