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

<t>This document specifies an instantiation of the Privacy Pass Architecture (RFC 9576)
that allows for a "reverse" flow from the Origin to the Client.
It describes a method for an Origin to issue a state update to the Client 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 53?>

<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>
      <t>This document does not replace <xref target="RFC9576"/>. Each issuance and redemption step
still follows that architecture. The gap is composition: <xref target="RFC9576"/> does not
define how token redemption at an Origin causes that Origin to issue new
Client-held state in the same exchange. Reverse Flow defines that composition,
including Client coordination, transport binding, and the privacy effects of
letting the Origin's redemption decision shape later tokens.</t>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>With Privacy Pass issuance as described in <xref target="RFC9576"/>, once a token is presented by a Client,
it is considered spent and cannot be reused. If a token were to be presented twice, the two
requests would be linkable by the Origin, which breaks unlinkability.</t>
      <t>However, requiring that all tokens are spent only once means that Clients need
to request more tokens to perform more requests. This is true even if the initial request
did not need a token presentation, for instance because its cost to the Origin was
insignificant.</t>
      <t>This draft gives an Origin a way to hand a requesting Client an updated state, so that the
Client can present new tokens on future requests. The Origin acts as a new Attester/Issuer
entity.</t>
      <t>Below, we present different use cases.</t>
      <section anchor="refunding-tokens">
        <name>Refunding tokens</name>
        <t>Certain Origins 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 make a second request. This is the case for a request that needs little compute, or one
that leads to a redirection instead of content generation.</t>
        <t>With a reverse flow,
a Client that has already been authorised by an Origin can maintain that authorisation,
without losing the unlinkability property provided by Privacy Pass.</t>
      </section>
      <section anchor="bootstrapping-issuer">
        <name>Bootstrapping Issuer</name>
        <t>An Origin wants to grant 30 accesses to Clients that solved a
CAPTCHA. To do so, it consumes a type 0x0002 publicly verifiable token from an initial Issuer
that guarantees a CAPTCHA has been solved,
and uses it to issue 30 type 0x0001 privately verifiable tokens.
Without a reverse flow, the Origin would have to require 30 tokens of type 0x0002, which are
more expensive and require more requests 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 authorised 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 anchor="anonymous-credential-composition">
        <name>Anonymous credential composition</name>
        <t>Privacy Pass Architecture as defined by <xref target="RFC9576"/> is built around tokens,
whose issuance flows are defined in <xref target="RFC9578"/>.</t>
        <t>More recent explorations (<xref target="PRIVACYPASS-ARC"/>, <xref target="PRIVACYPASS-BBS"/>, <xref target="PRIVACYPASS-ACT"/>)
provide Clients with credentials, whose presentation results in a scoped token.
These schemes are instantiations of a reverse flow, both because the Client holds a state
it can use to perform multiple token presentations, and because the Origin can
provide a requesting Client with an updated state.</t>
        <t>In addition, these schemes are more costly and usage specific.
With a reverse flow, the initial Issuer and the Origin Issuer may use
different credentials, each suited to their use case.
One use case is rate limiting and blocking. <xref target="PRIVACYPASS-ARC"/> provides
a per-Origin rate limit with a single credential, while <xref target="PRIVACYPASS-ACT"/>
allows an Origin to rate-limit a specific session once it has been established.</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 CredentialResponse, 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 the Origin to issue
a 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"/>), the
Client sends a CredentialRequest.</t>
      <figure anchor="fig-reverse-flow-architecture">
        <name>Architecture of Privacy Pass with a Reverse Flow</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="888" viewBox="0 0 888 336" 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 32,64 L 32,320" fill="none" stroke="black"/>
              <path d="M 136,32 L 136,64" fill="none" stroke="black"/>
              <path d="M 208,32 L 208,64" fill="none" stroke="black"/>
              <path d="M 240,64 L 240,320" fill="none" stroke="black"/>
              <path d="M 280,32 L 280,64" fill="none" stroke="black"/>
              <path d="M 552,32 L 552,64" fill="none" stroke="black"/>
              <path d="M 584,64 L 584,176" fill="none" stroke="black"/>
              <path d="M 584,240 L 584,288" fill="none" stroke="black"/>
              <path d="M 624,32 L 624,64" fill="none" stroke="black"/>
              <path d="M 704,32 L 704,64" fill="none" stroke="black"/>
              <path d="M 744,64 L 744,144" fill="none" stroke="black"/>
              <path d="M 744,192 L 744,320" fill="none" stroke="black"/>
              <path d="M 792,32 L 792,64" fill="none" stroke="black"/>
              <path d="M 808,32 L 808,64" fill="none" stroke="black"/>
              <path d="M 840,64 L 840,320" fill="none" stroke="black"/>
              <path d="M 880,32 L 880,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 136,32" fill="none" stroke="black"/>
              <path d="M 208,32 L 280,32" fill="none" stroke="black"/>
              <path d="M 552,32 L 624,32" fill="none" stroke="black"/>
              <path d="M 704,32 L 792,32" fill="none" stroke="black"/>
              <path d="M 808,32 L 880,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 136,64" fill="none" stroke="black"/>
              <path d="M 208,64 L 280,64" fill="none" stroke="black"/>
              <path d="M 552,64 L 624,64" fill="none" stroke="black"/>
              <path d="M 704,64 L 792,64" fill="none" stroke="black"/>
              <path d="M 808,64 L 880,64" fill="none" stroke="black"/>
              <path d="M 248,96 L 376,96" fill="none" stroke="black"/>
              <path d="M 456,96 L 584,96" fill="none" stroke="black"/>
              <path d="M 240,112 L 304,112" fill="none" stroke="black"/>
              <path d="M 512,112 L 576,112" fill="none" stroke="black"/>
              <path d="M 592,142 L 608,142" fill="none" stroke="black"/>
              <path d="M 592,146 L 608,146" fill="none" stroke="black"/>
              <path d="M 720,142 L 736,142" fill="none" stroke="black"/>
              <path d="M 720,146 L 736,146" fill="none" stroke="black"/>
              <path d="M 584,160 L 632,160" fill="none" stroke="black"/>
              <path d="M 792,160 L 832,160" fill="none" stroke="black"/>
              <path d="M 592,176 L 632,176" fill="none" stroke="black"/>
              <path d="M 800,176 L 840,176" fill="none" stroke="black"/>
              <path d="M 248,240 L 344,240" fill="none" stroke="black"/>
              <path d="M 472,240 L 584,240" fill="none" stroke="black"/>
              <path d="M 40,256 L 56,256" fill="none" stroke="black"/>
              <path d="M 216,256 L 240,256" fill="none" stroke="black"/>
              <path d="M 32,272 L 56,272" fill="none" stroke="black"/>
              <path d="M 560,288 L 576,288" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="840,160 828,154.4 828,165.6" fill="black" transform="rotate(0,832,160)"/>
              <polygon class="arrowhead" points="744,144 732,138.4 732,149.6" fill="black" transform="rotate(0,736,144)"/>
              <polygon class="arrowhead" points="600,176 588,170.4 588,181.6" fill="black" transform="rotate(180,592,176)"/>
              <polygon class="arrowhead" points="600,144 588,138.4 588,149.6" fill="black" transform="rotate(180,592,144)"/>
              <polygon class="arrowhead" points="584,288 572,282.4 572,293.6" fill="black" transform="rotate(0,576,288)"/>
              <polygon class="arrowhead" points="584,112 572,106.4 572,117.6" fill="black" transform="rotate(0,576,112)"/>
              <polygon class="arrowhead" points="256,240 244,234.4 244,245.6" fill="black" transform="rotate(180,248,240)"/>
              <polygon class="arrowhead" points="256,96 244,90.4 244,101.6" fill="black" transform="rotate(180,248,96)"/>
              <polygon class="arrowhead" points="48,256 36,250.4 36,261.6" fill="black" transform="rotate(180,40,256)"/>
              <g class="text">
                <text x="44" y="52">Origin</text>
                <text x="100" y="52">Issuer</text>
                <text x="244" y="52">Origin</text>
                <text x="588" y="52">Client</text>
                <text x="748" y="52">Attester</text>
                <text x="844" y="52">Issuer</text>
                <text x="416" y="100">Request</text>
                <text x="372" y="116">TokenChallenge</text>
                <text x="468" y="116">(Issuer)</text>
                <text x="664" y="148">Attestation</text>
                <text x="712" y="164">CredentialRequest</text>
                <text x="716" y="180">CredentialResponse</text>
                <text x="588" y="196">CredentialFinalization</text>
                <text x="584" y="212">|</text>
                <text x="588" y="228">CredentialPresentation</text>
                <text x="408" y="244">Request+Token</text>
                <text x="136" y="260">CredentialRequest</text>
                <text x="412" y="260">+CredentialRequest(Origin)</text>
                <text x="140" y="276">CredentialResponse</text>
                <text x="228" y="276">-&gt;</text>
                <text x="252" y="292">--</text>
                <text x="408" y="292">Response+CredentialResponse(Origin)</text>
                <text x="588" y="308">CredentialFinalization</text>
                <text x="584" y="324">|</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+---------------+        +--------+                                 +--------+         +----------+ +--------+
| Origin Issuer |        | Origin |                                 | Client |         | Attester | | Issuer |
+--+------------+        +---+----+                                 +---+----+         +----+-----+ +---+----+
   |                         |                                          |                   |           |
   |                         |<---------------- Request ----------------+                   |           |
   |                         +-------- TokenChallenge (Issuer) -------->|                   |           |
   |                         |                                          |                   |           |
   |                         |                                          |<== Attestation ==>|           |
   |                         |                                          +------ CredentialRequest ----->|
   |                         |                                          |<----- CredentialResponse -----+
   |                         |                                CredentialFinalization        |           |
   |                         |                                          |                   |           |
   |                         |                                CredentialPresentation        |           |
   |                         |<------------ Request+Token --------------+                   |           |
   |<-- CredentialRequest ---+        +CredentialRequest(Origin)        |                   |           |
   +--- CredentialResponse ->|                                          |                   |           |
   |                         |-- Response+CredentialResponse(Origin) -->|                   |           |
   |                         |                                CredentialFinalization        |           |
   |                         |                                          |                   |           |
]]></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 issued a Token.</t>
      <t>The Client learns that the Origin operates an Origin Issuer through the
Origin Issuer's configuration (<xref target="discovery"/>).</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>CredentialRequest(Origin)</tt>.
The Origin runs the issuance protocol, and returns <tt>Response</tt>+<tt>CredentialResponse(Origin)</tt>.</t>
      <t>Seen from the Origin Issuer, the redeemed token is what attests the Client. A reverse flow
is the architecture of <xref target="RFC9576"/> with redemption in the place of attestation. The
difference is that the Origin does not decide on token validity alone. It may also use
what it learned serving the request, such as whether the request consumed the resource the
token vouched for.</t>
      <t>Such flow can be performed through various means, such as HTTP headers (<xref target="REVERSE-FLOW-HTTP-HEADER"/>), MOQ Parameters (<xref target="MOQ-PRIVACYPASS"/>), or even a dedicated endpoint.</t>
      <section anchor="credentialrequest-credentialresponse-and-credentialfinalization">
        <name>CredentialRequest, CredentialResponse, and CredentialFinalization</name>
        <t>In <xref target="fig-reverse-flow-architecture"/>, the Client sends a <tt>CredentialRequest</tt> and receives a <tt>CredentialResponse</tt>.
These are meant to abstract requests from different protocols 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 introduction of Privacy Pass issuance protocol based on Anonymous Credentials, such as <xref target="PRIVACYPASS-ARC"/> or <xref target="PRIVACYPASS-ACT"/>,
modifies <tt>TokenRequest</tt> (resp. <tt>TokenResponse</tt>) to use <tt>CredentialRequest</tt> instead (resp. <tt>CredentialResponse</tt>).</t>
        <t>Upon receiving a <tt>CredentialResponse</tt>, the Client has to finalise the <tt>Credential</tt> so it can be
presented to an Origin.
This may be a <tt>Finalization</tt> for type 0x0002 as defined in <xref section="7" sectionFormat="of" target="RFC9578"/>,
a presentation for <xref target="PRIVACYPASS-ARC"/>,
or even a <tt>TokenRefund</tt> for <xref target="PRIVACYPASS-ACT"/>.</t>
        <t>All three examples ensure that an Origin Issuer provides the Client with a state update that it needs to finalize, and present.</t>
      </section>
      <section anchor="client-behaviour">
        <name>Client behaviour</name>
        <t>Along with sending a finalised token from the Initial Issuer to the Origin that it sends through an authorization response as defined in
<xref target="RFC9577"/>, the Client may send a <tt>TokenRequest</tt> as defined in <xref target="RFC9578"/>,
<xref target="BATCHED-TOKENS"/>, or <xref target="PRIVACYPASS-ARC"/>. In all these definitions, <tt>CredentialRequest</tt> <bcp14>MUST</bcp14>
be prepended by a <tt>uint16_t</tt> representing the token type.</t>
        <t>The same security and privacy guarantees apply as to the initial issuance flow.
The Client is responsible for coordinating 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="state">
        <name>State</name>
        <t>An Origin PrivateToken outlives the request it was obtained on, so a Client has to decide
where to keep it and when to drop it. Both choices rely on the unlinkability goals of
<xref section="3.3" sectionFormat="of" target="RFC9576"/>.</t>
        <t>An Origin PrivateToken either replaces the token that was spent, or carries something the
spent token did not. In the first case, the Origin Issuer uses the same configuration as
the Issuer of the spent token, and the Client <bcp14>MAY</bcp14> store the new token with the ones it
already holds for that Issuer. In the second case, the Origin PrivateToken differs in
issuance protocol, key, or metadata, and the Client <bcp14>MUST</bcp14> store it separately. A Client
drawing from a single pool cannot tell which Reverse Origin accepts a given token, nor what
it discloses by presenting it.</t>
        <t>Origin PrivateTokens are state the Origin caused the Client to keep. A Client that lets a
user clear the state held for an Origin <bcp14>SHOULD</bcp14> clear the Origin PrivateTokens for that
Origin at the same time. A token that survives such a reset lets the Origin recognise a
Client the user believes has been reset.</t>
        <section anchor="retry-and-duplicate-issuance">
          <name>Retry and duplicate issuance</name>
          <t>A Client that presents a token and receives no response does not know whether the Origin
redeemed it. If it did, the token is spent and the Client has nothing to show for it. To
recover, the Client <bcp14>MAY</bcp14> record that it sent the token before
sending it, and <bcp14>MAY</bcp14> send the same token and the same CredentialRequest again.</t>
          <figure anchor="fig-retry">
            <name>Retry after a lost response</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="560" viewBox="0 0 560 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 72,64 L 72,256" fill="none" stroke="black"/>
                  <path d="M 136,32 L 136,64" fill="none" stroke="black"/>
                  <path d="M 208,32 L 208,64" fill="none" stroke="black"/>
                  <path d="M 240,64 L 240,256" fill="none" stroke="black"/>
                  <path d="M 280,32 L 280,64" fill="none" stroke="black"/>
                  <path d="M 480,32 L 480,64" fill="none" stroke="black"/>
                  <path d="M 512,64 L 512,256" fill="none" stroke="black"/>
                  <path d="M 552,32 L 552,64" fill="none" stroke="black"/>
                  <path d="M 8,32 L 136,32" fill="none" stroke="black"/>
                  <path d="M 208,32 L 280,32" fill="none" stroke="black"/>
                  <path d="M 480,32 L 552,32" fill="none" stroke="black"/>
                  <path d="M 8,64 L 136,64" fill="none" stroke="black"/>
                  <path d="M 208,64 L 280,64" fill="none" stroke="black"/>
                  <path d="M 480,64 L 552,64" fill="none" stroke="black"/>
                  <path d="M 248,96 L 272,96" fill="none" stroke="black"/>
                  <path d="M 464,96 L 512,96" fill="none" stroke="black"/>
                  <path d="M 80,112 L 112,112" fill="none" stroke="black"/>
                  <path d="M 192,112 L 240,112" fill="none" stroke="black"/>
                  <path d="M 72,128 L 112,128" fill="none" stroke="black"/>
                  <path d="M 200,128 L 232,128" fill="none" stroke="black"/>
                  <path d="M 240,144 L 264,144" fill="none" stroke="black"/>
                  <path d="M 424,144 L 440,144" fill="none" stroke="black"/>
                  <path d="M 248,192 L 272,192" fill="none" stroke="black"/>
                  <path d="M 464,192 L 512,192" fill="none" stroke="black"/>
                  <path d="M 80,208 L 112,208" fill="none" stroke="black"/>
                  <path d="M 192,208 L 240,208" fill="none" stroke="black"/>
                  <path d="M 72,224 L 112,224" fill="none" stroke="black"/>
                  <path d="M 200,224 L 232,224" fill="none" stroke="black"/>
                  <path d="M 240,240 L 264,240" fill="none" stroke="black"/>
                  <path d="M 424,240 L 504,240" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="512,240 500,234.4 500,245.6" fill="black" transform="rotate(0,504,240)"/>
                  <polygon class="arrowhead" points="256,192 244,186.4 244,197.6" fill="black" transform="rotate(180,248,192)"/>
                  <polygon class="arrowhead" points="256,96 244,90.4 244,101.6" fill="black" transform="rotate(180,248,96)"/>
                  <polygon class="arrowhead" points="240,224 228,218.4 228,229.6" fill="black" transform="rotate(0,232,224)"/>
                  <polygon class="arrowhead" points="240,128 228,122.4 228,133.6" fill="black" transform="rotate(0,232,128)"/>
                  <polygon class="arrowhead" points="88,208 76,202.4 76,213.6" fill="black" transform="rotate(180,80,208)"/>
                  <polygon class="arrowhead" points="88,112 76,106.4 76,117.6" fill="black" transform="rotate(180,80,112)"/>
                  <g class="text">
                    <text x="44" y="52">Origin</text>
                    <text x="100" y="52">Issuer</text>
                    <text x="244" y="52">Origin</text>
                    <text x="516" y="52">Client</text>
                    <text x="368" y="100">Request+Token+CredReq</text>
                    <text x="152" y="116">CredReq</text>
                    <text x="156" y="132">CredResp</text>
                    <text x="344" y="148">Response+CredResp</text>
                    <text x="448" y="148">X</text>
                    <text x="444" y="164">lost</text>
                    <text x="368" y="196">Request+Token+CredReq</text>
                    <text x="152" y="212">CredReq</text>
                    <text x="332" y="212">same</text>
                    <text x="384" y="212">request</text>
                    <text x="156" y="228">CredResp</text>
                    <text x="116" y="244">same</text>
                    <text x="172" y="244">response</text>
                    <text x="344" y="244">Response+CredResp</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
+---------------+        +--------+                        +--------+
| Origin Issuer |        | Origin |                        | Client |
+-------+-------+        +---+----+                        +---+----+
        |                    |                                 |
        |                    |<--- Request+Token+CredReq ------+
        |<---- CredReq ------+                                 |
        +----- CredResp ---->|                                 |
        |                    +--- Response+CredResp ---X       |
        |                    |                       lost      |
        |                    |                                 |
        |                    |<--- Request+Token+CredReq ------+
        |<---- CredReq ------+         same request            |
        +----- CredResp ---->|                                 |
        |   same response    +--- Response+CredResp ---------->|
        |                    |                                 |
]]></artwork>
            </artset>
          </figure>
          <t>This works only if the Origin Issuer treats the redeemed token as the key to the issuance.
An Origin Issuer that accepts the second presentation <bcp14>MUST</bcp14> return the CredentialResponse it
returned for the first, and <bcp14>MUST NOT</bcp14> issue a second credential for the same token. An
Origin Issuer that does not keep this state <bcp14>MUST</bcp14> reject the second presentation as a double
spend (<xref section="7.1" sectionFormat="of" target="RFC9576"/>).</t>
          <t>A Client <bcp14>MUST NOT</bcp14> send the same token with a different CredentialRequest. The Origin Issuer
cannot tell such a request apart from a retry, so it either issues twice for one redemption
or returns a response the Client cannot finalise.</t>
          <t>Retrying has a cost. The same token reaching the Origin twice tells it the two requests come
from one Client, and re-sending an identical request does not avoid this (<xref target="privacy"/>).</t>
        </section>
      </section>
      <section anchor="discovery">
        <name>Origin Issuer discovery and consistency</name>
        <t>An Origin Issuer is an Issuer. It advertises its token types and keys in a
directory as defined in <xref section="4" sectionFormat="of" target="RFC9578"/>, and Clients retrieve this
configuration as they would for any other Issuer.</t>
        <t>If an Origin Issuer can vary this configuration freely, it can partition or
track Clients, for instance by serving a targeted Client a unique configuration
it can later recognise. This is the partitioning described in
<xref section="6.2" sectionFormat="of" target="RFC9576"/>. A reverse flow does not detect it. It assumes an Origin
Issuer that serves one configuration to every Client, and the anonymity set of a
Client is at most the set of Clients that were served the same configuration.</t>
        <t>Deployments that cannot make that assumption need a mechanism that shows the
configuration is the same for everyone. This is the case when several independent
Client implementations talk to the same Origin Issuer, since none of them can
vouch for what the others were served. <xref target="CONSISTENCY-MIRROR"/>, <xref target="KEYTRANS"/>, and
<xref target="SCITT"/> are examples of such a mechanism. Choosing one is out of scope for this
document.</t>
      </section>
    </section>
    <section anchor="deployment-modes">
      <name>Deployment modes</name>
      <t>Similar to <xref section="5" sectionFormat="of" target="RFC9576"/>, Privacy Pass with a Reverse Flow supports multiple
deployment modes.</t>
      <t>Any deployment needs a transport to carry the CredentialRequest and CredentialResponse from
<xref target="architecture"/> alongside the regular Client-Origin exchange. Transport and deployment model
are independent choices. Options include MOQ Parameters (<xref target="MOQ-PRIVACYPASS"/>), an HTTP header
(<xref target="REVERSE-FLOW-HTTP-HEADER"/>), or a dedicated endpoint. Each is covered in its own document.</t>
      <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="304" width="552" viewBox="0 0 552 304" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 56,48 L 56,80" fill="none" stroke="black"/>
                <path d="M 88,80 L 88,192" fill="none" stroke="black"/>
                <path d="M 88,256 L 88,288" fill="none" stroke="black"/>
                <path d="M 128,48 L 128,80" fill="none" stroke="black"/>
                <path d="M 232,32 L 232,80" fill="none" stroke="black"/>
                <path d="M 256,48 L 256,80" fill="none" stroke="black"/>
                <path d="M 304,80 L 304,96" fill="none" stroke="black"/>
                <path d="M 304,144 L 304,160" 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 400,80 L 400,104" fill="none" stroke="black"/>
                <path d="M 400,136 L 400,208" fill="none" stroke="black"/>
                <path d="M 432,48 L 432,80" fill="none" stroke="black"/>
                <path d="M 448,48 L 448,80" fill="none" stroke="black"/>
                <path d="M 480,80 L 480,288" fill="none" stroke="black"/>
                <path d="M 520,48 L 520,80" fill="none" stroke="black"/>
                <path d="M 544,48 L 544,80" fill="none" stroke="black"/>
                <path d="M 232,32 L 528,32" fill="none" stroke="black"/>
                <path d="M 56,48 L 128,48" fill="none" stroke="black"/>
                <path d="M 256,48 L 344,48" fill="none" stroke="black"/>
                <path d="M 360,48 L 432,48" fill="none" stroke="black"/>
                <path d="M 448,48 L 520,48" fill="none" stroke="black"/>
                <path d="M 56,80 L 128,80" fill="none" stroke="black"/>
                <path d="M 256,80 L 344,80" fill="none" stroke="black"/>
                <path d="M 360,80 L 432,80" fill="none" stroke="black"/>
                <path d="M 448,80 L 520,80" fill="none" stroke="black"/>
                <path d="M 248,96 L 296,96" fill="none" stroke="black"/>
                <path d="M 312,96 L 392,96" fill="none" stroke="black"/>
                <path d="M 408,96 L 472,96" fill="none" stroke="black"/>
                <path d="M 488,96 L 528,96" fill="none" stroke="black"/>
                <path d="M 88,112 L 240,112" fill="none" stroke="black"/>
                <path d="M 320,112 L 472,112" fill="none" stroke="black"/>
                <path d="M 96,128 L 216,128" fill="none" stroke="black"/>
                <path d="M 352,128 L 480,128" fill="none" stroke="black"/>
                <path d="M 96,158 L 144,158" fill="none" stroke="black"/>
                <path d="M 96,162 L 144,162" fill="none" stroke="black"/>
                <path d="M 256,158 L 296,158" fill="none" stroke="black"/>
                <path d="M 256,162 L 296,162" fill="none" stroke="black"/>
                <path d="M 88,176 L 160,176" fill="none" stroke="black"/>
                <path d="M 320,176 L 392,176" fill="none" stroke="black"/>
                <path d="M 96,192 L 160,192" fill="none" stroke="black"/>
                <path d="M 328,192 L 400,192" fill="none" stroke="black"/>
                <path d="M 88,256 L 112,256" fill="none" stroke="black"/>
                <path d="M 448,256 L 472,256" fill="none" stroke="black"/>
                <path d="M 96,272 L 136,272" fill="none" stroke="black"/>
                <path d="M 440,272 L 480,272" fill="none" stroke="black"/>
                <path d="M 528,32 C 536.83064,32 544,39.16936 544,48" fill="none" stroke="black"/>
                <path d="M 248,96 C 239.16936,96 232,88.83064 232,80" fill="none" stroke="black"/>
                <path d="M 528,96 C 536.83064,96 544,88.83064 544,80" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="480,256 468,250.4 468,261.6" fill="black" transform="rotate(0,472,256)"/>
                <polygon class="arrowhead" points="480,112 468,106.4 468,117.6" fill="black" transform="rotate(0,472,112)"/>
                <polygon class="arrowhead" points="400,176 388,170.4 388,181.6" fill="black" transform="rotate(0,392,176)"/>
                <polygon class="arrowhead" points="304,160 292,154.4 292,165.6" fill="black" transform="rotate(0,296,160)"/>
                <polygon class="arrowhead" points="104,272 92,266.4 92,277.6" fill="black" transform="rotate(180,96,272)"/>
                <polygon class="arrowhead" points="104,192 92,186.4 92,197.6" fill="black" transform="rotate(180,96,192)"/>
                <polygon class="arrowhead" points="104,160 92,154.4 92,165.6" fill="black" transform="rotate(180,96,160)"/>
                <polygon class="arrowhead" points="104,128 92,122.4 92,133.6" fill="black" transform="rotate(180,96,128)"/>
                <g class="text">
                  <text x="92" y="68">Client</text>
                  <text x="300" y="68">Attester</text>
                  <text x="396" y="68">Issuer</text>
                  <text x="484" y="68">Origin</text>
                  <text x="280" y="116">Request</text>
                  <text x="284" y="132">TokenChallenge</text>
                  <text x="200" y="164">Attestation</text>
                  <text x="240" y="180">CredentialRequest</text>
                  <text x="244" y="196">CredentialResponse</text>
                  <text x="92" y="212">CredentialFinalization</text>
                  <text x="304" y="212">|</text>
                  <text x="88" y="228">|</text>
                  <text x="92" y="244">CredentialPresentation</text>
                  <text x="280" y="260">Request+Token+CredentialRequest(Origin)</text>
                  <text x="288" y="276">Response+CredentialResponse(Origin)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                            +-------------------------------------.
      +--------+            |  +----------+ +--------+ +--------+  |
      | Client |            |  | Attester | | Issuer | | Origin |  |
      +---+----+            |  +-----+----+ +----+---+ +---+----+  |
          |                  `-------|-----------|---------|------'
          +------------------- Request ------------------->|
          |<--------------- TokenChallenge ----------------+
          |                          |           |         |
          |<====== Attestation =====>|           |         |
          +--------- CredentialRequest --------->|         |
          |<-------- CredentialResponse ---------+         |
CredentialFinalization               |           |         |
          |                                                |
CredentialPresentation                                     |
          +--- Request+Token+CredentialRequest(Origin) --->|
          |<----- Response+CredentialResponse(Origin) -----+
          |                                                |
]]></artwork>
          </artset>
        </figure>
        <t>Similar to the original Shared Deployment Model (<xref section="4.1" sectionFormat="of" target="RFC9576"/>), 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="320" width="944" viewBox="0 0 944 320" 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,304" fill="none" stroke="black"/>
                <path d="M 136,48 L 136,80" fill="none" stroke="black"/>
                <path d="M 216,48 L 216,80" fill="none" stroke="black"/>
                <path d="M 248,80 L 248,304" fill="none" stroke="black"/>
                <path d="M 288,48 L 288,80" fill="none" stroke="black"/>
                <path d="M 592,48 L 592,80" fill="none" stroke="black"/>
                <path d="M 624,80 L 624,176" fill="none" stroke="black"/>
                <path d="M 624,240 L 624,304" fill="none" stroke="black"/>
                <path d="M 664,48 L 664,80" fill="none" stroke="black"/>
                <path d="M 712,32 L 712,80" fill="none" stroke="black"/>
                <path d="M 736,48 L 736,80" fill="none" stroke="black"/>
                <path d="M 784,80 L 784,144" fill="none" stroke="black"/>
                <path d="M 784,192 L 784,304" fill="none" stroke="black"/>
                <path d="M 824,48 L 824,80" fill="none" stroke="black"/>
                <path d="M 840,48 L 840,80" fill="none" stroke="black"/>
                <path d="M 880,80 L 880,304" fill="none" stroke="black"/>
                <path d="M 912,48 L 912,80" fill="none" stroke="black"/>
                <path d="M 936,48 L 936,80" fill="none" stroke="black"/>
                <path d="M 712,32 L 920,32" fill="none" stroke="black"/>
                <path d="M 8,48 L 136,48" fill="none" stroke="black"/>
                <path d="M 216,48 L 288,48" fill="none" stroke="black"/>
                <path d="M 592,48 L 664,48" fill="none" stroke="black"/>
                <path d="M 736,48 L 824,48" fill="none" stroke="black"/>
                <path d="M 840,48 L 912,48" fill="none" stroke="black"/>
                <path d="M 8,80 L 136,80" fill="none" stroke="black"/>
                <path d="M 216,80 L 288,80" fill="none" stroke="black"/>
                <path d="M 592,80 L 664,80" fill="none" stroke="black"/>
                <path d="M 736,80 L 824,80" fill="none" stroke="black"/>
                <path d="M 840,80 L 912,80" fill="none" stroke="black"/>
                <path d="M 728,96 L 776,96" fill="none" stroke="black"/>
                <path d="M 792,96 L 872,96" fill="none" stroke="black"/>
                <path d="M 888,96 L 920,96" fill="none" stroke="black"/>
                <path d="M 248,112 L 264,112" fill="none" stroke="black"/>
                <path d="M 472,112 L 616,112" fill="none" stroke="black"/>
                <path d="M 632,142 L 648,142" fill="none" stroke="black"/>
                <path d="M 632,146 L 648,146" fill="none" stroke="black"/>
                <path d="M 760,142 L 776,142" fill="none" stroke="black"/>
                <path d="M 760,146 L 776,146" fill="none" stroke="black"/>
                <path d="M 624,160 L 672,160" fill="none" stroke="black"/>
                <path d="M 832,160 L 872,160" fill="none" stroke="black"/>
                <path d="M 632,176 L 672,176" fill="none" stroke="black"/>
                <path d="M 840,176 L 880,176" fill="none" stroke="black"/>
                <path d="M 256,240 L 272,240" fill="none" stroke="black"/>
                <path d="M 608,240 L 624,240" fill="none" stroke="black"/>
                <path d="M 48,256 L 64,256" fill="none" stroke="black"/>
                <path d="M 224,256 L 248,256" fill="none" stroke="black"/>
                <path d="M 40,272 L 56,272" fill="none" stroke="black"/>
                <path d="M 224,272 L 240,272" fill="none" stroke="black"/>
                <path d="M 248,288 L 272,288" fill="none" stroke="black"/>
                <path d="M 576,288 L 616,288" fill="none" stroke="black"/>
                <path d="M 920,32 C 928.83064,32 936,39.16936 936,48" fill="none" stroke="black"/>
                <path d="M 728,96 C 719.16936,96 712,88.83064 712,80" fill="none" stroke="black"/>
                <path d="M 920,96 C 928.83064,96 936,88.83064 936,80" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="880,160 868,154.4 868,165.6" fill="black" transform="rotate(0,872,160)"/>
                <polygon class="arrowhead" points="784,144 772,138.4 772,149.6" fill="black" transform="rotate(0,776,144)"/>
                <polygon class="arrowhead" points="640,176 628,170.4 628,181.6" fill="black" transform="rotate(180,632,176)"/>
                <polygon class="arrowhead" points="640,144 628,138.4 628,149.6" fill="black" transform="rotate(180,632,144)"/>
                <polygon class="arrowhead" points="624,288 612,282.4 612,293.6" fill="black" transform="rotate(0,616,288)"/>
                <polygon class="arrowhead" points="624,112 612,106.4 612,117.6" fill="black" transform="rotate(0,616,112)"/>
                <polygon class="arrowhead" points="264,240 252,234.4 252,245.6" fill="black" transform="rotate(180,256,240)"/>
                <polygon class="arrowhead" points="248,272 236,266.4 236,277.6" fill="black" transform="rotate(0,240,272)"/>
                <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="68">Origin</text>
                  <text x="100" y="68">Issuer</text>
                  <text x="252" y="68">Origin</text>
                  <text x="628" y="68">Client</text>
                  <text x="780" y="68">Attester</text>
                  <text x="876" y="68">Issuer</text>
                  <text x="332" y="116">TokenChallenge</text>
                  <text x="428" y="116">(Issuer)</text>
                  <text x="704" y="148">Attestation</text>
                  <text x="752" y="164">CredentialRequest</text>
                  <text x="756" y="180">CredentialResponse</text>
                  <text x="628" y="196">CredentialFinalization</text>
                  <text x="624" y="212">|</text>
                  <text x="628" y="228">CredentialPresentation</text>
                  <text x="440" y="244">Request+Token+CredentialRequest(Origin)</text>
                  <text x="144" y="260">CredentialRequest</text>
                  <text x="140" y="276">CredentialResponse</text>
                  <text x="424" y="292">Response+CredentialResponse(Origin)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                                                                                        +--------------------------.
+---------------+         +--------+                                     +--------+     |  +----------+ +--------+  |
| Origin Issuer |         | Origin |                                     | Client |     |  | Attester | | Issuer |  |
+---+-----------+         +---+----+                                     +---+----+     |  +-----+----+ +----+---+  |
    |                         |                                              |           `-------|-----------|-----'
    |                         +-- TokenChallenge (Issuer) ------------------>|                   |           |
    |                         |                                              |                   |           |
    |                         |                                              |<== Attestation ==>|           |
    |                         |                                              +------ CredentialRequest ----->|
    |                         |                                              |<----- CredentialResponse -----+
    |                         |                                    CredentialFinalization        |           |
    |                         |                                              |                   |           |
    |                         |                                    CredentialPresentation        |           |
    |                         |<-- Request+Token+CredentialRequest(Origin) --+                   |           |
    |<-- CredentialRequest ---+                                              |                   |           |
    +-- CredentialResponse -->|                                              |                   |           |
    |                         +--- Response+CredentialResponse(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,
implying they are not split deployments.</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="384" width="944" viewBox="0 0 944 384" 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,368" fill="none" stroke="black"/>
                <path d="M 136,48 L 136,80" fill="none" stroke="black"/>
                <path d="M 216,48 L 216,80" fill="none" stroke="black"/>
                <path d="M 248,80 L 248,368" fill="none" stroke="black"/>
                <path d="M 288,48 L 288,80" fill="none" stroke="black"/>
                <path d="M 592,48 L 592,80" fill="none" stroke="black"/>
                <path d="M 624,80 L 624,176" fill="none" stroke="black"/>
                <path d="M 624,240 L 624,288" fill="none" stroke="black"/>
                <path d="M 624,352 L 624,368" fill="none" stroke="black"/>
                <path d="M 664,48 L 664,80" fill="none" stroke="black"/>
                <path d="M 712,32 L 712,80" fill="none" stroke="black"/>
                <path d="M 736,48 L 736,80" fill="none" stroke="black"/>
                <path d="M 784,80 L 784,144" fill="none" stroke="black"/>
                <path d="M 784,192 L 784,344" fill="none" stroke="black"/>
                <path d="M 824,48 L 824,80" fill="none" stroke="black"/>
                <path d="M 840,48 L 840,80" fill="none" stroke="black"/>
                <path d="M 880,80 L 880,368" fill="none" stroke="black"/>
                <path d="M 912,48 L 912,80" fill="none" stroke="black"/>
                <path d="M 936,48 L 936,80" fill="none" stroke="black"/>
                <path d="M 712,32 L 920,32" fill="none" stroke="black"/>
                <path d="M 8,48 L 136,48" fill="none" stroke="black"/>
                <path d="M 216,48 L 288,48" fill="none" stroke="black"/>
                <path d="M 592,48 L 664,48" fill="none" stroke="black"/>
                <path d="M 736,48 L 824,48" fill="none" stroke="black"/>
                <path d="M 840,48 L 912,48" fill="none" stroke="black"/>
                <path d="M 8,80 L 136,80" fill="none" stroke="black"/>
                <path d="M 216,80 L 288,80" fill="none" stroke="black"/>
                <path d="M 592,80 L 664,80" fill="none" stroke="black"/>
                <path d="M 736,80 L 824,80" fill="none" stroke="black"/>
                <path d="M 840,80 L 912,80" fill="none" stroke="black"/>
                <path d="M 728,96 L 776,96" fill="none" stroke="black"/>
                <path d="M 792,96 L 872,96" fill="none" stroke="black"/>
                <path d="M 888,96 L 920,96" fill="none" stroke="black"/>
                <path d="M 248,112 L 264,112" fill="none" stroke="black"/>
                <path d="M 472,112 L 616,112" fill="none" stroke="black"/>
                <path d="M 632,142 L 648,142" fill="none" stroke="black"/>
                <path d="M 632,146 L 648,146" fill="none" stroke="black"/>
                <path d="M 760,142 L 776,142" fill="none" stroke="black"/>
                <path d="M 760,146 L 776,146" fill="none" stroke="black"/>
                <path d="M 624,160 L 672,160" fill="none" stroke="black"/>
                <path d="M 832,160 L 872,160" fill="none" stroke="black"/>
                <path d="M 632,176 L 672,176" fill="none" stroke="black"/>
                <path d="M 840,176 L 880,176" fill="none" stroke="black"/>
                <path d="M 256,240 L 272,240" fill="none" stroke="black"/>
                <path d="M 608,240 L 624,240" fill="none" stroke="black"/>
                <path d="M 48,256 L 64,256" fill="none" stroke="black"/>
                <path d="M 224,256 L 248,256" fill="none" stroke="black"/>
                <path d="M 40,272 L 64,272" fill="none" stroke="black"/>
                <path d="M 248,288 L 272,288" fill="none" stroke="black"/>
                <path d="M 576,288 L 616,288" fill="none" stroke="black"/>
                <path d="M 624,352 L 720,352" fill="none" stroke="black"/>
                <path d="M 784,352 L 872,352" fill="none" stroke="black"/>
                <path d="M 920,32 C 928.83064,32 936,39.16936 936,48" fill="none" stroke="black"/>
                <path d="M 728,96 C 719.16936,96 712,88.83064 712,80" fill="none" stroke="black"/>
                <path d="M 920,96 C 928.83064,96 936,88.83064 936,80" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="880,352 868,346.4 868,357.6" fill="black" transform="rotate(0,872,352)"/>
                <polygon class="arrowhead" points="880,160 868,154.4 868,165.6" fill="black" transform="rotate(0,872,160)"/>
                <polygon class="arrowhead" points="784,144 772,138.4 772,149.6" fill="black" transform="rotate(0,776,144)"/>
                <polygon class="arrowhead" points="640,176 628,170.4 628,181.6" fill="black" transform="rotate(180,632,176)"/>
                <polygon class="arrowhead" points="640,144 628,138.4 628,149.6" fill="black" transform="rotate(180,632,144)"/>
                <polygon class="arrowhead" points="624,288 612,282.4 612,293.6" fill="black" transform="rotate(0,616,288)"/>
                <polygon class="arrowhead" points="624,112 612,106.4 612,117.6" fill="black" transform="rotate(0,616,112)"/>
                <polygon class="arrowhead" points="264,240 252,234.4 252,245.6" fill="black" transform="rotate(180,256,240)"/>
                <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="68">Origin</text>
                  <text x="100" y="68">Issuer</text>
                  <text x="252" y="68">Origin</text>
                  <text x="628" y="68">Client</text>
                  <text x="780" y="68">Attester</text>
                  <text x="876" y="68">Issuer</text>
                  <text x="332" y="116">TokenChallenge</text>
                  <text x="428" y="116">(Issuer)</text>
                  <text x="704" y="148">Attestation</text>
                  <text x="752" y="164">CredentialRequest</text>
                  <text x="756" y="180">CredentialResponse</text>
                  <text x="620" y="196">CredentialFinalization</text>
                  <text x="624" y="212">|</text>
                  <text x="620" y="228">CredentialPresentation</text>
                  <text x="440" y="244">Request+Token+CredentialRequest(Origin)</text>
                  <text x="144" y="260">CredentialRequest</text>
                  <text x="148" y="276">CredentialResponse</text>
                  <text x="236" y="276">-&gt;</text>
                  <text x="424" y="292">Response+CredentialResponse(Origin)</text>
                  <text x="620" y="308">CredentialFinalization</text>
                  <text x="624" y="324">|</text>
                  <text x="620" y="340">CredentialPresentation</text>
                  <text x="752" y="356">Token</text>
                  <text x="784" y="372">|</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                                                                                        +--------------------------.
+---------------+         +--------+                                     +--------+     |  +----------+ +--------+  |
| Origin Issuer |         | Origin |                                     | Client |     |  | Attester | | Issuer |  |
+---+-----------+         +---+----+                                     +---+----+     |  +-----+----+ +----+---+  |
    |                         |                                              |           `-------|-----------|-----'
    |                         +-- TokenChallenge (Issuer) ------------------>|                   |           |
    |                         |                                              |                   |           |
    |                         |                                              |<== Attestation ==>|           |
    |                         |                                              +------ CredentialRequest ----->|
    |                         |                                              |<----- CredentialResponse -----+
    |                         |                                   CredentialFinalization         |           |
    |                         |                                              |                   |           |
    |                         |                                   CredentialPresentation         |           |
    |                         |<-- Request+Token+CredentialRequest(Origin) --+                   |           |
    |<-- CredentialRequest ---+                                              |                   |           |
    +--- CredentialResponse ->|                                              |                   |           |
    |                         +--- Response+CredentialResponse(Origin) ----->|                   |           |
    |                         |                                   CredentialFinalization         |           |
    |                         |                                              |                   |           |
    |                         |                                   CredentialPresentation         |           |
    |                         |                                              +------------ Token ----------->|
    |                         |                                              |                   |           |
]]></artwork>
          </artset>
        </figure>
        <t>This deployment <bcp14>SHOULD NOT</bcp14> allow the Reverse Origin, such as an Initial Issuer,
to infer the request made to the Origin, as it would break unlinkability.</t>
      </section>
    </section>
    <section anchor="privacy">
      <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 present these tokens to continue making further
requests.</t>
      <t>While the tokens are still unlinkable, the <tt>token_key_id</tt> 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 metadata to them. The amount of possible metadata
grows as <tt>2^(origin_issuers)</tt>.</t>
        <t>We RECOMMEND that:</t>
        <ol spacing="normal" type="1"><li>
            <t>Origins define their anonymity sets, and deploy no more than
<tt>log2(#anonymity_sets)</tt> Origin Issuers. This bounds the possible anonymity sets by design.</t>
          </li>
          <li>
            <t>Clients only send 1 PrivateToken per request. This is consistent with <xref section="3.2" sectionFormat="of" target="RFC9577"/>
and <xref section="11.6.2" sectionFormat="of" target="RFC9110"/> which only allows one challenge response to be
provided as part of the Authorization HTTP header.</t>
          </li>
          <li>
            <t>Issuer metadata 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 with them. A malicious Origin can use this
opportunity to associate certain token values with 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 (CredentialRequest_A, CredentialRequest_B). Issuer B is
associated to people that like croissant. Issuer A is for the rest of the clients.</t>
        <t>If a Client requests croissant, or sends Token_B, the Origin provides
CredentialResponse_B. If not, it provides CredentialResponse_A.</t>
        <t>Over time, this means the Origin is able to track people that like croissants.</t>
        <t>To mitigate this, we RECOMMEND:</t>
        <ol spacing="normal" type="1"><li>
            <t>The initial PrivateToken be provided by an Issuer not controlled by the
Origin.</t>
          </li>
          <li>
            <t>Clients reset their state regularly with the initial Issuer.</t>
          </li>
        </ol>
      </section>
      <section anchor="swap-endpoint-and-its-privacy-implication">
        <name>Swap endpoint and its privacy implication</name>
        <t>With multiple Issuers, a Client can end up holding tokens for various
Issuers. Origins <bcp14>MAY</bcp14> propose a swap endpoint at which a Client can exchange one
or more Origin tokens for 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="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations of <xref target="RFC9576"/> apply. Each issuance and redemption
step in a reverse flow is a regular Privacy Pass exchange; this section covers
risks introduced by their composition.</t>
      <section anchor="redemption-gates-issuance">
        <name>Redemption gates issuance</name>
        <t>The redeemed token is the attestation for the reverse flow. An Origin <bcp14>MUST</bcp14>
verify the presented token before processing the accompanying
CredentialRequest, and <bcp14>MUST NOT</bcp14> return a CredentialResponse if verification
fails or the Client presents no token.</t>
      </section>
      <section anchor="issuance-amplification">
        <name>Issuance amplification</name>
        <t>A reverse flow can issue more value than it redeems (<xref target="bootstrapping-issuer"/>),
and Origin PrivateTokens can themselves start further reverse flows, so
issuance compounds. Origins <bcp14>MUST</bcp14> bound the total value issued per redeemed
token, and <bcp14>SHOULD</bcp14> limit Origin PrivateToken validity, for instance by rotating
Origin Issuer keys, so stockpiled tokens expire.</t>
      </section>
      <section anchor="double-spend-prevention">
        <name>Double-spend prevention</name>
        <t>Double-spend prevention follows <xref section="7.1" sectionFormat="of" target="RFC9576"/>. When the Reverse
Origin is not the Origin Issuer (<xref target="fig-deploy-joint-issuer-reserve"/>), the two
<bcp14>MUST</bcp14> share redemption state, or each token <bcp14>MUST</bcp14> be redeemable at exactly one
Reverse Origin.</t>
        <t>A Client retrying a lost response presents the same token twice (<xref target="state"/>). An Origin
Issuer either answers such a retry from stored issuance state, or rejects it. It <bcp14>MUST NOT</bcp14>
issue twice for one redeemed token.</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="4" month="May" year="2026"/>
            <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-08"/>
        </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="CONSISTENCY-MIRROR">
          <front>
            <title>Checking Resource Consistency with HTTP Mirrors</title>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Matthew Finkel" initials="M." surname="Finkel">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <date day="30" month="January" year="2024"/>
            <abstract>
              <t>   This document describes the mirror protocol, an HTTP-based protocol
   for fetching mirrored HTTP resources.  The primary use case for the
   mirror protocol is to support HTTP resource consistency checks in
   protocols that require clients have a consistent view of some
   protocol-specific resource (typically, a public key) for security or
   privacy reasons, including Privacy Pass and Oblivious HTTP.  To that
   end, this document also describes how to use the mirror protocol to
   implement these consistency checks.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-consistency-mirror-00"/>
        </reference>
        <reference anchor="KEYTRANS">
          <front>
            <title>Key Transparency Architecture</title>
            <author fullname="Brendan McMillion" initials="B." surname="McMillion">
         </author>
            <date day="29" month="June" year="2026"/>
            <abstract>
              <t>   This document defines the terminology and interaction patterns
   involved in the deployment of Key Transparency in a general secure
   group messaging infrastructure, and specifies the security properties
   that the protocol provides.  It also gives more general, non-
   prescriptive guidance on how to securely apply Key Transparency to a
   number of common applications.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-keytrans-architecture-09"/>
        </reference>
        <reference anchor="MOQ-PRIVACYPASS">
          <front>
            <title>Privacy Pass Authentication for Media over QUIC (MoQ)</title>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Cullen Fluffy Jennings" initials="C. F." surname="Jennings">
              <organization>Cisco</organization>
            </author>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare Inc.</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   This document specifies the use of Privacy Pass architecture and
   issuance protocols for authorization in Media over QUIC (MoQ)
   transport protocol.  It defines how Privacy Pass tokens can be
   integrated with MoQ's authorization framework to provide privacy-
   preserving authentication for subscriptions, fetches, publications,
   and relay operations while supporting fine-grained access control
   through prefix-based track namespace and track name matching rules.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-privacy-pass-auth-03"/>
        </reference>
        <reference anchor="PRIVACYPASS-ACT">
          <front>
            <title>Privacy Pass Issuance Protocol for Anonymous Credit Tokens</title>
            <author fullname="Samuel Schlesinger" initials="S." surname="Schlesinger">
              <organization>Google</organization>
            </author>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare Inc.</organization>
            </author>
            <date day="13" month="February" year="2026"/>
            <abstract>
              <t>   This document specifies the issuance and redemption protocols for
   tokens based on the Anonymous Credit Tokens (ACT) protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schlesinger-privacypass-act-01"/>
        </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>
            <author fullname="Armando Faz-Hernandez" initials="A. F." surname="Faz-Hernandez">
              <organization>Cloudflare</organization>
            </author>
            <date day="2" month="March" year="2026"/>
            <abstract>
              <t>   This document specifies the issuance and redemption protocols for
   tokens based on the Anonymous Rate-Limited Credential (ARC)
   cryptographic protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-arc-protocol-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="REVERSE-FLOW-HTTP-HEADER">
          <front>
            <title>Privacy Pass Reverse Flow HTTP Transport</title>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare Inc.</organization>
            </author>
            <date day="18" month="June" year="2026"/>
            <abstract>
              <t>   This document specifies an instantiation of Privacy Pass Reverse Flow
   [REVERSE-FLOW] where HTTP is used as a transport mechanism.

   It describes a novel HTTP header field that Clients and Origins can
   use to carry reverse flow data.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-meunier-privacypass-reverse-flow-http-00"/>
        </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>
        <reference anchor="RFC9577">
          <front>
            <title>The Privacy Pass HTTP Authentication Scheme</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="S. Valdez" initials="S." surname="Valdez"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <abstract>
              <t>This document defines an HTTP authentication scheme for Privacy Pass, a privacy-preserving authentication mechanism used for authorization. The authentication scheme specified in this document can be used by Clients to redeem Privacy Pass tokens with an Origin. It can also be used by Origins to challenge Clients to present Privacy Pass tokens.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9577"/>
          <seriesInfo name="DOI" value="10.17487/RFC9577"/>
        </reference>
        <reference anchor="SCITT">
          <front>
            <title>An Architecture for Trustworthy and Transparent Digital Supply Chains</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="A. Delignat-Lavaud" initials="A." surname="Delignat-Lavaud"/>
            <author fullname="C. Fournet" initials="C." surname="Fournet"/>
            <author fullname="Y. Deshpande" initials="Y." surname="Deshpande"/>
            <author fullname="S. Lasker" initials="S." surname="Lasker"/>
            <date month="June" year="2026"/>
            <abstract>
              <t>Traceability in supply chains is a growing security concern. While Verifiable Data Structures (VDSs) have addressed specific issues, such as equivocation over digital certificates, they lack a universal architecture for all supply chains. This document defines such an architecture for single-issuer signed statement transparency. It ensures extensibility and interoperability between different transparency services as well as compliance with various auditing procedures and regulatory requirements.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9943"/>
          <seriesInfo name="DOI" value="10.17487/RFC9943"/>
        </reference>
      </references>
    </references>
    <?line 563?>

<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>v07</t>
      <ul spacing="normal">
        <li>
          <t>Add State section: storage of Origin PrivateTokens, clearing, and retry after a lost response</t>
        </li>
        <li>
          <t>State the trust assumption on Origin Issuer configuration, and make consistency mechanisms an example rather than a requirement</t>
        </li>
        <li>
          <t>Fix incorrect section references to <xref target="RFC9576"/> and <xref target="RFC9578"/></t>
        </li>
        <li>
          <t>Editorial pass on the Motivation, Architecture, and Privacy Considerations sections</t>
        </li>
        <li>
          <t>Say that a reverse flow puts redemption in the place of attestation</t>
        </li>
      </ul>
      <t>v06</t>
      <ul spacing="normal">
        <li>
          <t>Add Security Considerations: redemption gates issuance, issuance amplification, double-spend prevention</t>
        </li>
        <li>
          <t>Add Origin Issuer discovery and consistency section, following <xref target="RFC9578"/> directory and referencing consistency mechanisms</t>
        </li>
      </ul>
      <t>v05</t>
      <ul spacing="normal">
        <li>
          <t>Clarify why Reverse Flow is more than applying <xref target="RFC9576"/> twice</t>
        </li>
        <li>
          <t>Add transport requirement text to Deployment Modes</t>
        </li>
        <li>
          <t>Add anonymous credential composition motivation</t>
        </li>
        <li>
          <t>Update terminology and diagrams to use Credential vocabulary</t>
        </li>
        <li>
          <t>Use "Origin Issuer" consistently for the entity providing Client state updates</t>
        </li>
      </ul>
      <t>v04</t>
      <ul spacing="normal">
        <li>
          <t>Fix: Client finalises a <tt>Credential</tt>, not a <tt>Token</tt>, upon receiving a <tt>CredentialResponse</tt></t>
        </li>
        <li>
          <t>Use "Origin Issuer" consistently when referring to the entity that provides the Client with a state update</t>
        </li>
      </ul>
      <t>v03</t>
      <ul spacing="normal">
        <li>
          <t>Add "Anonymous credential composition" motivation use case</t>
        </li>
        <li>
          <t>Rename section and update diagrams to use Credential vocabulary: <tt>CredentialRequest</tt>, <tt>CredentialResponse</tt>, <tt>CredentialFinalization</tt>, <tt>CredentialPresentation</tt> (previously <tt>TokenRequest</tt>, <tt>TokenResponse</tt>, <tt>Finalisation</tt>)</t>
        </li>
        <li>
          <t>Update PRIVACYPASS-ARC reference to IETF working group draft (<tt>draft-ietf-privacypass-arc-protocol</tt>)</t>
        </li>
        <li>
          <t>Update PRIVACYPASS-ACT reference to use proper I-D reference (<tt>draft-schlesinger-privacypass-act</tt>)</t>
        </li>
        <li>
          <t>Add normative reference to RFC9577</t>
        </li>
        <li>
          <t>Editorial pass and spelling fixes</t>
        </li>
      </ul>
      <t>v02</t>
      <ul spacing="normal">
        <li>
          <t>Diagrams now use Credential instead of Token, and use both Finalization and Presentation as keyword</t>
        </li>
        <li>
          <t>Rework the intro to make it consistent with Anonymous credentials evolutions</t>
        </li>
        <li>
          <t>Have Anonymous credentials use case, given it needs a new architecture</t>
        </li>
        <li>
          <t>Editorial pass on PrivacyPass-Reverse header</t>
        </li>
      </ul>
      <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 feedback 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>
