<?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.23 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-meunier-privacypass-reverse-flow-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.26.0 -->
  <front>
    <title abbrev="Privacy Pass Reverse Flow">Privacy Pass Reverse Flow</title>
    <seriesInfo name="Internet-Draft" value="draft-meunier-privacypass-reverse-flow-00"/>
    <author fullname="Thibault Meunier">
      <organization>Cloudflare Inc.</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <date year="2025" month="February" day="11"/>
    <area>Security</area>
    <workgroup>Privacy Pass</workgroup>
    <abstract>
      <?line 33?>

<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/Attester/Issuer.
It describes a way for redeeming Origins to perform new issuances in the same request.</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 39?>

<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/Attester/Issuer.
In other words, it specifies a way for the Origin to act as a joint Attester/Issuer.
A Client that has already been authorised by an Origin can maintain that authorization,
without losing the unlinkability property provided by Privacy Pass. In addition, it allows
an Origin to define its own issuance policy based on an initial bootstraping attestation
method. For instance, an Origin that wants to grant 30 access for Clients that solved a
CAPTCHA might consume a type 0x0002 public veriable token, and use it to issue 30 type
0x0001 private tokens.</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>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="protocol-overview">
      <name>Protocol overview</name>
      <t>Along with sending their PrivateToken for authentication (as specified in <xref target="RFC9576"/>), Client
sends TokenRequest</t>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="904" viewBox="0 0 904 272" 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,256" 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,256" fill="none" stroke="black"/>
            <path d="M 248,32 L 248,64" fill="none" stroke="black"/>
            <path d="M 568,32 L 568,64" fill="none" stroke="black"/>
            <path d="M 600,64 L 600,256" fill="none" stroke="black"/>
            <path d="M 640,32 L 640,64" fill="none" stroke="black"/>
            <path d="M 720,32 L 720,64" fill="none" stroke="black"/>
            <path d="M 760,64 L 760,144" fill="none" stroke="black"/>
            <path d="M 760,192 L 760,256" fill="none" stroke="black"/>
            <path d="M 808,32 L 808,64" fill="none" stroke="black"/>
            <path d="M 824,32 L 824,64" fill="none" stroke="black"/>
            <path d="M 856,64 L 856,256" fill="none" stroke="black"/>
            <path d="M 896,32 L 896,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 568,32 L 640,32" fill="none" stroke="black"/>
            <path d="M 720,32 L 808,32" fill="none" stroke="black"/>
            <path d="M 824,32 L 896,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 568,64 L 640,64" fill="none" stroke="black"/>
            <path d="M 720,64 L 808,64" fill="none" stroke="black"/>
            <path d="M 824,64 L 896,64" fill="none" stroke="black"/>
            <path d="M 216,96 L 256,96" fill="none" stroke="black"/>
            <path d="M 336,96 L 600,96" fill="none" stroke="black"/>
            <path d="M 208,112 L 224,112" fill="none" stroke="black"/>
            <path d="M 432,112 L 592,112" fill="none" stroke="black"/>
            <path d="M 608,126 L 624,126" fill="none" stroke="black"/>
            <path d="M 608,130 L 624,130" fill="none" stroke="black"/>
            <path d="M 736,126 L 752,126" fill="none" stroke="black"/>
            <path d="M 736,130 L 752,130" fill="none" stroke="black"/>
            <path d="M 600,160 L 672,160" fill="none" stroke="black"/>
            <path d="M 792,160 L 848,160" fill="none" stroke="black"/>
            <path d="M 608,176 L 672,176" fill="none" stroke="black"/>
            <path d="M 800,176 L 856,176" fill="none" stroke="black"/>
            <path d="M 216,192 L 232,192" fill="none" stroke="black"/>
            <path d="M 584,192 L 600,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 216,240 L 232,240" fill="none" stroke="black"/>
            <path d="M 552,240 L 592,240" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="856,160 844,154.4 844,165.6" fill="black" transform="rotate(0,848,160)"/>
            <polygon class="arrowhead" points="760,128 748,122.4 748,133.6" fill="black" transform="rotate(0,752,128)"/>
            <polygon class="arrowhead" points="616,176 604,170.4 604,181.6" fill="black" transform="rotate(180,608,176)"/>
            <polygon class="arrowhead" points="616,128 604,122.4 604,133.6" fill="black" transform="rotate(180,608,128)"/>
            <polygon class="arrowhead" points="600,240 588,234.4 588,245.6" fill="black" transform="rotate(0,592,240)"/>
            <polygon class="arrowhead" points="600,112 588,106.4 588,117.6" fill="black" transform="rotate(0,592,112)"/>
            <polygon class="arrowhead" points="224,192 212,186.4 212,197.6" fill="black" transform="rotate(180,216,192)"/>
            <polygon class="arrowhead" points="224,96 212,90.4 212,101.6" fill="black" transform="rotate(180,216,96)"/>
            <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="52">Origin</text>
              <text x="100" y="52">Issuer</text>
              <text x="212" y="52">Origin</text>
              <text x="604" y="52">Client</text>
              <text x="764" y="52">Attester</text>
              <text x="860" y="52">Issuer</text>
              <text x="296" y="100">Request</text>
              <text x="292" y="116">TokenChallenge</text>
              <text x="388" y="116">(Issuer)</text>
              <text x="680" y="132">Attestation</text>
              <text x="732" y="164">TokenRequest</text>
              <text x="736" y="180">TokenResponse</text>
              <text x="376" y="196">Request+Token+TokenRequest(Origin</text>
              <text x="544" y="196">Issuer)</text>
              <text x="124" y="212">TokenRequest</text>
              <text x="120" y="228">TokenResponse</text>
              <text x="360" y="244">Response+TokenResponse(Origin</text>
              <text x="512" y="244">Issuer)</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
+---------------+    +--------+                                       +--------+         +----------+ +--------+
| Origin Issuer |    | Origin |                                       | Client |         | Attester | | Issuer |
+---+-----------+    +---+----+                                       +---+----+         +----+-----+ +---+----+
    |                    |                                                |                   |           |
    |                    |<----- Request ---------------------------------+                   |           |
    |                    +-- TokenChallenge (Issuer) -------------------->|                   |           |
    |                    |                                                |<== Attestation ==>|           |
    |                    |                                                |                   |           |
    |                    |                                                +--------- TokenRequest ------->|
    |                    |                                                |<-------- TokenResponse -------+
    |                    |<-- Request+Token+TokenRequest(Origin Issuer) --+                   |           |
    |<-- TokenRequest ---+                                                |                   |           |
    +-- TokenResponse -->|                                                |                   |           |
    |                    |--- Response+TokenResponse(Origin Issuer) ----->|                   |           |
    |                    |                                                |                   |           |
]]></artwork>
      </artset>
      <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 Client sends Request+Token+TokenRequest(Origin Issuer).
The Origin runs the issuance protocol based, and returns Response+TokenResponse(Origin Issuer).</t>
      <t>TokenRequest(Origin Issuer) and TokenResponse(Origin Issuer) happen through a new HTTP Header <tt>PrivacyPass-Reverse</tt>.
<tt>PrivacyPass-Reverse</tt> is a base64url (<xref target="RFC4648"/>) encoded BatchedTokenRequest as defined in <xref section="6" sectionFormat="comma" target="BATCHED_TOKENS"/>.</t>
      <ul empty="true">
        <li>
          <t>The use of arbitrary batched 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"/> or
<xref target="BATCHED_TOKENS"/>, and wraps them as an arbitrary batched token request.
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="272" width="528" viewBox="0 0 528 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 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,104" fill="none" stroke="black"/>
                <path d="M 216,120 L 216,160" fill="none" stroke="black"/>
                <path d="M 256,48 L 256,80" fill="none" stroke="black"/>
                <path d="M 304,48 L 304,80" fill="none" stroke="black"/>
                <path d="M 344,80 L 344,96" fill="none" stroke="black"/>
                <path d="M 344,128 L 344,192" fill="none" stroke="black"/>
                <path d="M 376,48 L 376,80" fill="none" stroke="black"/>
                <path d="M 424,48 L 424,80" fill="none" stroke="black"/>
                <path d="M 456,80 L 456,256" fill="none" stroke="black"/>
                <path d="M 496,48 L 496,80" fill="none" stroke="black"/>
                <path d="M 520,48 L 520,80" fill="none" stroke="black"/>
                <path d="M 144,32 L 504,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 304,48 L 376,48" fill="none" stroke="black"/>
                <path d="M 424,48 L 496,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 304,80 L 376,80" fill="none" stroke="black"/>
                <path d="M 424,80 L 496,80" fill="none" stroke="black"/>
                <path d="M 160,96 L 208,96" fill="none" stroke="black"/>
                <path d="M 224,96 L 336,96" fill="none" stroke="black"/>
                <path d="M 352,96 L 448,96" fill="none" stroke="black"/>
                <path d="M 464,96 L 504,96" fill="none" stroke="black"/>
                <path d="M 48,112 L 232,112" fill="none" stroke="black"/>
                <path d="M 440,112 L 456,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 336,176" fill="none" stroke="black"/>
                <path d="M 48,192 L 128,192" fill="none" stroke="black"/>
                <path d="M 256,192 L 344,192" fill="none" stroke="black"/>
                <path d="M 40,224 L 96,224" fill="none" stroke="black"/>
                <path d="M 384,224 L 448,224" fill="none" stroke="black"/>
                <path d="M 48,240 L 120,240" fill="none" stroke="black"/>
                <path d="M 368,240 L 448,240" fill="none" stroke="black"/>
                <path d="M 504,32 C 512.83064,32 520,39.16936 520,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 504,96 C 512.83064,96 520,88.83064 520,80" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="456,224 444,218.4 444,229.6" fill="black" transform="rotate(0,448,224)"/>
                <polygon class="arrowhead" points="344,176 332,170.4 332,181.6" fill="black" transform="rotate(0,336,176)"/>
                <polygon class="arrowhead" points="216,144 204,138.4 204,149.6" fill="black" transform="rotate(0,208,144)"/>
                <polygon class="arrowhead" points="56,240 44,234.4 44,245.6" fill="black" transform="rotate(180,48,240)"/>
                <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="340" y="68">Issuer</text>
                  <text x="460" y="68">Origin</text>
                  <text x="300" y="116">TokenChallenge</text>
                  <text x="396" 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="208" y="228">Token+TokenRequest(Origin</text>
                  <text x="344" y="228">Issuer)</text>
                  <text x="212" y="244">TokenResponse(Origin</text>
                  <text x="328" y="244">Issuer)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                 +---------------------------------------------.
+--------+       |  +----------+     +--------+     +--------+  |
| Client |       |  | Attester |     | Issuer |     | Origin |  |
+---+----+       |  +-----+----+     +----+---+     +---+----+  |
    |             `-------|---------------|-------------|------'
    |<----------------------- TokenChallenge (Issuer) --+
    |                     |               |             |
    |<=== Attestation ===>|               |             |
    |                     |               |             |
    +----------- TokenRequest ----------->|             |
    |<---------- TokenResponse -----------+             |
    |                                                   |
    +------- Token+TokenRequest(Origin Issuer) -------->+
    |<--------- TokenResponse(Origin Issuer) -----------|
    |                                                   |
]]></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>
      </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="920" viewBox="0 0 920 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 568,48 L 568,80" fill="none" stroke="black"/>
                <path d="M 600,80 L 600,256" fill="none" stroke="black"/>
                <path d="M 640,48 L 640,80" fill="none" stroke="black"/>
                <path d="M 688,32 L 688,80" fill="none" stroke="black"/>
                <path d="M 712,48 L 712,80" fill="none" stroke="black"/>
                <path d="M 760,80 L 760,144" fill="none" stroke="black"/>
                <path d="M 760,192 L 760,256" fill="none" stroke="black"/>
                <path d="M 800,48 L 800,80" fill="none" stroke="black"/>
                <path d="M 816,48 L 816,80" fill="none" stroke="black"/>
                <path d="M 856,80 L 856,256" fill="none" stroke="black"/>
                <path d="M 888,48 L 888,80" fill="none" stroke="black"/>
                <path d="M 912,48 L 912,80" fill="none" stroke="black"/>
                <path d="M 688,32 L 896,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 568,48 L 640,48" fill="none" stroke="black"/>
                <path d="M 712,48 L 800,48" fill="none" stroke="black"/>
                <path d="M 816,48 L 888,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 568,80 L 640,80" fill="none" stroke="black"/>
                <path d="M 712,80 L 800,80" fill="none" stroke="black"/>
                <path d="M 816,80 L 888,80" fill="none" stroke="black"/>
                <path d="M 704,96 L 752,96" fill="none" stroke="black"/>
                <path d="M 768,96 L 848,96" fill="none" stroke="black"/>
                <path d="M 864,96 L 896,96" fill="none" stroke="black"/>
                <path d="M 208,112 L 224,112" fill="none" stroke="black"/>
                <path d="M 432,112 L 592,112" fill="none" stroke="black"/>
                <path d="M 608,126 L 624,126" fill="none" stroke="black"/>
                <path d="M 608,130 L 624,130" fill="none" stroke="black"/>
                <path d="M 736,126 L 752,126" fill="none" stroke="black"/>
                <path d="M 736,130 L 752,130" fill="none" stroke="black"/>
                <path d="M 600,160 L 672,160" fill="none" stroke="black"/>
                <path d="M 792,160 L 848,160" fill="none" stroke="black"/>
                <path d="M 608,176 L 672,176" fill="none" stroke="black"/>
                <path d="M 800,176 L 856,176" fill="none" stroke="black"/>
                <path d="M 216,192 L 232,192" fill="none" stroke="black"/>
                <path d="M 584,192 L 600,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 216,240 L 232,240" fill="none" stroke="black"/>
                <path d="M 552,240 L 592,240" fill="none" stroke="black"/>
                <path d="M 896,32 C 904.83064,32 912,39.16936 912,48" fill="none" stroke="black"/>
                <path d="M 704,96 C 695.16936,96 688,88.83064 688,80" fill="none" stroke="black"/>
                <path d="M 896,96 C 904.83064,96 912,88.83064 912,80" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="856,160 844,154.4 844,165.6" fill="black" transform="rotate(0,848,160)"/>
                <polygon class="arrowhead" points="760,128 748,122.4 748,133.6" fill="black" transform="rotate(0,752,128)"/>
                <polygon class="arrowhead" points="616,176 604,170.4 604,181.6" fill="black" transform="rotate(180,608,176)"/>
                <polygon class="arrowhead" points="616,128 604,122.4 604,133.6" fill="black" transform="rotate(180,608,128)"/>
                <polygon class="arrowhead" points="600,240 588,234.4 588,245.6" fill="black" transform="rotate(0,592,240)"/>
                <polygon class="arrowhead" points="600,112 588,106.4 588,117.6" fill="black" transform="rotate(0,592,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="604" y="68">Client</text>
                  <text x="756" y="68">Attester</text>
                  <text x="852" y="68">Issuer</text>
                  <text x="292" y="116">TokenChallenge</text>
                  <text x="388" y="116">(Issuer)</text>
                  <text x="680" y="132">Attestation</text>
                  <text x="732" y="164">TokenRequest</text>
                  <text x="736" y="180">TokenResponse</text>
                  <text x="376" y="196">Request+Token+TokenRequest(Origin</text>
                  <text x="544" y="196">Issuer)</text>
                  <text x="124" y="212">TokenRequest</text>
                  <text x="120" y="228">TokenResponse</text>
                  <text x="360" y="244">Response+TokenResponse(Origin</text>
                  <text x="512" y="244">Issuer)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                                                                                     +--------------------------.
+---------------+    +--------+                                       +--------+     |  +----------+ +--------+  |
| Origin Issuer |    | Origin |                                       | Client |     |  | Attester | | Issuer |  |
+---+-----------+    +---+----+                                       +---+----+     |  +-----+----+ +----+---+  |
    |                    |                                                |           `-------|-----------|-----'
    |                    +-- TokenChallenge (Issuer) -------------------->|                   |           |
    |                    |                                                |<== Attestation ==>|           |
    |                    |                                                |                   |           |
    |                    |                                                +--------- TokenRequest ------->|
    |                    |                                                |<-------- TokenResponse -------+
    |                    |<-- Request+Token+TokenRequest(Origin Issuer) --+                   |           |
    |<-- TokenRequest ---+                                                |                   |           |
    +-- TokenResponse -->|                                                |                   |           |
    |                    |--- Response+TokenResponse(Origin Issuer) ----->|                   |           |
    |                    |                                                |                   |           |
]]></artwork>
          </artset>
        </figure>
        <t>The Origin Issuer <bcp14>MUST</bcp14> not 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="920" viewBox="0 0 920 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 568,48 L 568,80" fill="none" stroke="black"/>
                <path d="M 600,80 L 600,272" fill="none" stroke="black"/>
                <path d="M 640,48 L 640,80" fill="none" stroke="black"/>
                <path d="M 688,32 L 688,80" fill="none" stroke="black"/>
                <path d="M 712,48 L 712,80" fill="none" stroke="black"/>
                <path d="M 760,80 L 760,144" fill="none" stroke="black"/>
                <path d="M 760,192 L 760,248" fill="none" stroke="black"/>
                <path d="M 800,48 L 800,80" fill="none" stroke="black"/>
                <path d="M 816,48 L 816,80" fill="none" stroke="black"/>
                <path d="M 856,80 L 856,272" fill="none" stroke="black"/>
                <path d="M 888,48 L 888,80" fill="none" stroke="black"/>
                <path d="M 912,48 L 912,80" fill="none" stroke="black"/>
                <path d="M 688,32 L 896,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 568,48 L 640,48" fill="none" stroke="black"/>
                <path d="M 712,48 L 800,48" fill="none" stroke="black"/>
                <path d="M 816,48 L 888,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 568,80 L 640,80" fill="none" stroke="black"/>
                <path d="M 712,80 L 800,80" fill="none" stroke="black"/>
                <path d="M 816,80 L 888,80" fill="none" stroke="black"/>
                <path d="M 704,96 L 752,96" fill="none" stroke="black"/>
                <path d="M 768,96 L 848,96" fill="none" stroke="black"/>
                <path d="M 864,96 L 896,96" fill="none" stroke="black"/>
                <path d="M 208,112 L 224,112" fill="none" stroke="black"/>
                <path d="M 432,112 L 592,112" fill="none" stroke="black"/>
                <path d="M 608,126 L 624,126" fill="none" stroke="black"/>
                <path d="M 608,130 L 624,130" fill="none" stroke="black"/>
                <path d="M 736,126 L 752,126" fill="none" stroke="black"/>
                <path d="M 736,130 L 752,130" fill="none" stroke="black"/>
                <path d="M 600,160 L 672,160" fill="none" stroke="black"/>
                <path d="M 792,160 L 848,160" fill="none" stroke="black"/>
                <path d="M 608,176 L 672,176" fill="none" stroke="black"/>
                <path d="M 800,176 L 856,176" fill="none" stroke="black"/>
                <path d="M 216,192 L 232,192" fill="none" stroke="black"/>
                <path d="M 584,192 L 600,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 216,240 L 232,240" fill="none" stroke="black"/>
                <path d="M 552,240 L 592,240" fill="none" stroke="black"/>
                <path d="M 600,256 L 696,256" fill="none" stroke="black"/>
                <path d="M 760,256 L 848,256" fill="none" stroke="black"/>
                <path d="M 896,32 C 904.83064,32 912,39.16936 912,48" fill="none" stroke="black"/>
                <path d="M 704,96 C 695.16936,96 688,88.83064 688,80" fill="none" stroke="black"/>
                <path d="M 896,96 C 904.83064,96 912,88.83064 912,80" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="856,256 844,250.4 844,261.6" fill="black" transform="rotate(0,848,256)"/>
                <polygon class="arrowhead" points="856,160 844,154.4 844,165.6" fill="black" transform="rotate(0,848,160)"/>
                <polygon class="arrowhead" points="760,128 748,122.4 748,133.6" fill="black" transform="rotate(0,752,128)"/>
                <polygon class="arrowhead" points="616,176 604,170.4 604,181.6" fill="black" transform="rotate(180,608,176)"/>
                <polygon class="arrowhead" points="616,128 604,122.4 604,133.6" fill="black" transform="rotate(180,608,128)"/>
                <polygon class="arrowhead" points="600,240 588,234.4 588,245.6" fill="black" transform="rotate(0,592,240)"/>
                <polygon class="arrowhead" points="600,112 588,106.4 588,117.6" fill="black" transform="rotate(0,592,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="604" y="68">Client</text>
                  <text x="756" y="68">Attester</text>
                  <text x="852" y="68">Issuer</text>
                  <text x="292" y="116">TokenChallenge</text>
                  <text x="388" y="116">(Issuer)</text>
                  <text x="680" y="132">Attestation</text>
                  <text x="732" y="164">TokenRequest</text>
                  <text x="736" y="180">TokenResponse</text>
                  <text x="376" y="196">Request+Token+TokenRequest(Origin</text>
                  <text x="544" y="196">Issuer)</text>
                  <text x="124" y="212">TokenRequest</text>
                  <text x="120" y="228">TokenResponse</text>
                  <text x="360" y="244">Response+TokenResponse(Origin</text>
                  <text x="512" y="244">Issuer)</text>
                  <text x="728" y="260">Token</text>
                  <text x="760" 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 Issuer) --+                   |           |
    |<-- TokenRequest ---+                                                |                   |           |
    +-- TokenResponse -->|                                                |                   |           |
    |                    |--- Response+TokenResponse(Origin Issuer) ----->|                   |           |
    |                    |                                                +------------ 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-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC9576">
        <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="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="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="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="2" month="February" year="2025"/>
          <abstract>
            <t>   This document specifies a variant of the Privacy Pass issuance
   protocol that allows for batched issuance of tokens.  This allows
   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-04"/>
      </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>
    </references>
    <?line 331?>

<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>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
