<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-moq-privacy-pass-auth-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="Privacy Pass MoQ Auth">Privacy Pass Authentication for Media over QUIC (MoQ)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-moq-privacy-pass-auth-02"/>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author initials="C." surname="Jennings" fullname="Cullen Jennings">
      <organization>Cisco</organization>
      <address>
        <email>fluffy@iii.ca</email>
      </address>
    </author>
    <author initials="T." surname="Meunier" fullname="Thibault Meunier">
      <organization>Cloudflare Inc.</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword>
    <keyword>privacy-pass</keyword>
    <abstract>
      <?line 59?>

<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>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://moq-wg.github.io/privacy-pass/draft-ietf-moq-privacy-pass-auth.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-moq-privacy-pass-auth/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
        Working Group information can be found at <eref target="https://datatracker.ietf.org/wg/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/moq-wg/privacy-pass"/>.</t>
    </note>
  </front>
  <middle>
    <?line 70?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Media over QUIC (MoQ) <xref target="MoQ-TRANSPORT"/> provides a transport protocol for live
and on-demand media delivery, real-time communication, and interactive content
distribution over QUIC connections. The protocol supports a wide range of
applications including video streaming, video conferencing, gaming, interactive
broadcasts, and other latency-sensitive use cases. MoQ includes mechanisms for
authorization through tokens that can be used to control access to media
streams, interactive sessions, and relay operations.</t>
      <t>Traditional authorization mechanisms often lack the privacy protection needed
for modern media distribution scenarios, where users' viewing patterns and
content preferences should remain private while still enabling fine-grained
access control, namespace restrictions, and operational constraints.</t>
      <t>Privacy Pass <xref target="RFC9576"/> provides a privacy-preserving authorization
architecture that enables anonymous authentication through unlinkable tokens.
The Privacy Pass architecture consists of four entities: Client, Origin, Issuer,
and Attester, which work together to provide token-based authorization without
compromising user privacy. The issuance protocols <xref target="RFC9578"/> define how these
tokens are created and verified.</t>
      <t>This document defines how Privacy Pass tokens can be integrated with MoQ's
authorization framework to provide comprehensive access control for media
streaming, real-time communication, and interactive content services while
preserving user privacy through unlinkable authentication tokens.</t>
      <section anchor="requirements-language">
        <name>Requirements Language</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?>

</section>
    </section>
    <section anchor="privacy-pass-architecture-for-moq">
      <name>Privacy Pass Architecture for MoQ</name>
      <t>Privacy Pass Terminology defined in <xref section="2" sectionFormat="of" target="RFC9576"/> is reused here.
The Privacy Pass MoQ integration involves the following entities and their
interactions:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Client</strong>: The MoQ client requesting authorization to subscribe to, fetch,
or publish media content. The client is responsible for obtaining Privacy Pass
tokens through the attestation and issuance process, and presenting these
tokens when requesting MoQ operations such as SUBSCRIBE, FETCH, PUBLISH, or
PUBLISH_NAMESPACE.</t>
        </li>
        <li>
          <t><strong>MoQ Relay</strong>: The MoQ relay server that forwards media content and verifies
that clients are authorized. The relay validates Privacy Pass tokens presented
by clients, enforces access policies, and forwards authorized requests to other
relays. Relays maintain configuration for trusted issuers and validate token
signatures and metadata.</t>
        </li>
        <li>
          <t><strong>Privacy Pass Issuer</strong>: The entity that issues Privacy Pass tokens to clients
after successful attestation. The issuer operates the token issuance protocol,
manages cryptographic keys. The issuer creates tokens with appropriate
MoQ-specific metadata.</t>
        </li>
        <li>
          <t><strong>Privacy Pass Attester</strong>: The entity that attests to properties of clients
for the purposes of token issuance. The attester verifies client credentials,
subscription status, or other eligibility criteria. Common attestation methods
include username/password, OAuth, device certificates, or other authentication
mechanisms.</t>
        </li>
      </ul>
      <section anchor="joint-issuer-attester">
        <name>Joint Attester and Issuer</name>
        <t>In the below deployment, the MoQ relay and Privacy Pass issuer are operated
by different entities to enhance privacy through separation of concerns.
This corresponds to <xref section="4.4" sectionFormat="of" target="RFC9576"/>.</t>
        <figure anchor="fig-overview">
          <name>Separated Issuer and Relay Architecture</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="224" width="544" viewBox="0 0 544 224" 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 56,64 L 56,208" fill="none" stroke="black"/>
                <path d="M 104,32 L 104,64" fill="none" stroke="black"/>
                <path d="M 208,32 L 208,64" fill="none" stroke="black"/>
                <path d="M 240,64 L 240,208" fill="none" stroke="black"/>
                <path d="M 280,32 L 280,64" fill="none" stroke="black"/>
                <path d="M 360,32 L 360,64" fill="none" stroke="black"/>
                <path d="M 400,64 L 400,144" fill="none" stroke="black"/>
                <path d="M 400,192 L 400,208" fill="none" stroke="black"/>
                <path d="M 448,32 L 448,64" fill="none" stroke="black"/>
                <path d="M 464,32 L 464,64" fill="none" stroke="black"/>
                <path d="M 496,64 L 496,208" fill="none" stroke="black"/>
                <path d="M 536,32 L 536,64" fill="none" stroke="black"/>
                <path d="M 8,32 L 104,32" fill="none" stroke="black"/>
                <path d="M 208,32 L 280,32" fill="none" stroke="black"/>
                <path d="M 360,32 L 448,32" fill="none" stroke="black"/>
                <path d="M 464,32 L 536,32" fill="none" stroke="black"/>
                <path d="M 8,64 L 104,64" fill="none" stroke="black"/>
                <path d="M 208,64 L 280,64" fill="none" stroke="black"/>
                <path d="M 360,64 L 448,64" fill="none" stroke="black"/>
                <path d="M 464,64 L 536,64" fill="none" stroke="black"/>
                <path d="M 64,96 L 112,96" fill="none" stroke="black"/>
                <path d="M 192,96 L 240,96" fill="none" stroke="black"/>
                <path d="M 56,112 L 80,112" fill="none" stroke="black"/>
                <path d="M 216,112 L 232,112" fill="none" stroke="black"/>
                <path d="M 248,126 L 264,126" fill="none" stroke="black"/>
                <path d="M 248,130 L 264,130" fill="none" stroke="black"/>
                <path d="M 376,126 L 392,126" fill="none" stroke="black"/>
                <path d="M 376,130 L 392,130" fill="none" stroke="black"/>
                <path d="M 240,160 L 312,160" fill="none" stroke="black"/>
                <path d="M 432,160 L 488,160" fill="none" stroke="black"/>
                <path d="M 248,176 L 312,176" fill="none" stroke="black"/>
                <path d="M 440,176 L 496,176" fill="none" stroke="black"/>
                <path d="M 64,192 L 88,192" fill="none" stroke="black"/>
                <path d="M 216,192 L 240,192" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="496,160 484,154.4 484,165.6" fill="black" transform="rotate(0,488,160)"/>
                <polygon class="arrowhead" points="400,128 388,122.4 388,133.6" fill="black" transform="rotate(0,392,128)"/>
                <polygon class="arrowhead" points="256,176 244,170.4 244,181.6" fill="black" transform="rotate(180,248,176)"/>
                <polygon class="arrowhead" points="256,128 244,122.4 244,133.6" fill="black" transform="rotate(180,248,128)"/>
                <polygon class="arrowhead" points="240,112 228,106.4 228,117.6" fill="black" transform="rotate(0,232,112)"/>
                <polygon class="arrowhead" points="72,192 60,186.4 60,197.6" fill="black" transform="rotate(180,64,192)"/>
                <polygon class="arrowhead" points="72,96 60,90.4 60,101.6" fill="black" transform="rotate(180,64,96)"/>
                <g class="text">
                  <text x="32" y="52">MoQ</text>
                  <text x="72" y="52">Relay</text>
                  <text x="244" y="52">Client</text>
                  <text x="404" y="52">Attester</text>
                  <text x="500" y="52">Issuer</text>
                  <text x="152" y="100">Request</text>
                  <text x="148" y="116">TokenChallenge</text>
                  <text x="320" y="132">Attestation</text>
                  <text x="372" y="164">TokenRequest</text>
                  <text x="376" y="180">TokenResponse</text>
                  <text x="152" y="196">Request+Token</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-----------+            +--------+         +----------+ +--------+
| MoQ Relay |            | Client |         | Attester | | Issuer |
+-----+-----+            +---+----+         +----+-----+ +---+----+
      |                      |                   |           |
      |<------ Request ------+                   |           |
      +--- TokenChallenge -->|                   |           |
      |                      |<== Attestation ==>|           |
      |                      |                   |           |
      |                      +--------- TokenRequest ------->|
      |                      |<-------- TokenResponse -------+
      |<--- Request+Token ---+                   |           |
      |                      |                   |           |
]]></artwork>
          </artset>
        </figure>
        <t>In certain deployments the MoQ relay and Privacy Pass issuer may be
operated by the same entity to simplify key management and policy coordination.
This is the Privacy Pass deployment described in <xref section="4.2" sectionFormat="of" target="RFC9576"/>.</t>
      </section>
      <section anchor="reverse-flow">
        <name>Shared Origin, Attester, Issuer with a Reverse Flow</name>
        <t>The flow described above can be used to bootstrap a shared origin-attester-issuer flow,
as described in <xref section="4.2" sectionFormat="of" target="RFC9576"/>. The MoQ relay plays all roles (origin,
attester, and issuer), allowing it to use privately verifiable token types registered
in <xref target="PRIVACYPASS-IANA"/>.</t>
        <t>In this scenario, the MoQ relay origin would accept tokens signed by two issuers:</t>
        <ol spacing="normal" type="1"><li>
            <t>Type <tt>0x0002</tt> token signed by the bootstrap issuer from <xref target="joint-issuer-attester"/></t>
          </li>
          <li>
            <t>Type <tt>0x0001</tt>, <tt>0x0005</tt>, or <tt>0xE5AC</tt> tokens signed by its own issuer.</t>
          </li>
        </ol>
        <t>This two-phase approach provides several advantages:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Bootstrapping</strong>: The initial publicly verifiable token (<tt>0x0002</tt>) establishes
trust without requiring the relay to share private keys with external verifiers.</t>
          </li>
          <li>
            <t><strong>Efficiency</strong>: Subsequent privately verifiable tokens allow batched issuance,
amortizing cryptographic costs across multiple operations.</t>
          </li>
          <li>
            <t><strong>Privacy</strong>: Each token presentation is unlinkable, even when obtained from
the same credential.</t>
          </li>
        </ul>
        <section anchor="reverse-flow-overview">
          <name>Reverse Flow Overview</name>
          <t>The reverse flow, as described in <xref section="4" sectionFormat="of" target="PRIVACYPASS-REVERSE-FLOW"/>,
allows a client to exchange a publicly verifiable token for privately verifiable
tokens (or credentials) issued directly by the MoQ relay.</t>
          <figure anchor="fig-reverse-flow">
            <name>Complete Reverse Flow Authorization</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="592" width="672" viewBox="0 0 672 592" 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,96" fill="none" stroke="black"/>
                  <path d="M 72,128 L 72,272" fill="none" stroke="black"/>
                  <path d="M 72,304 L 72,464" fill="none" stroke="black"/>
                  <path d="M 72,496 L 72,576" fill="none" stroke="black"/>
                  <path d="M 136,32 L 136,64" fill="none" stroke="black"/>
                  <path d="M 160,32 L 160,64" fill="none" stroke="black"/>
                  <path d="M 216,64 L 216,96" fill="none" stroke="black"/>
                  <path d="M 216,128 L 216,272" fill="none" stroke="black"/>
                  <path d="M 216,304 L 216,464" fill="none" stroke="black"/>
                  <path d="M 216,496 L 216,576" fill="none" stroke="black"/>
                  <path d="M 264,32 L 264,64" fill="none" stroke="black"/>
                  <path d="M 336,32 L 336,64" fill="none" stroke="black"/>
                  <path d="M 376,64 L 376,96" fill="none" stroke="black"/>
                  <path d="M 376,128 L 376,272" fill="none" stroke="black"/>
                  <path d="M 376,304 L 376,464" fill="none" stroke="black"/>
                  <path d="M 376,496 L 376,576" fill="none" stroke="black"/>
                  <path d="M 408,32 L 408,64" fill="none" stroke="black"/>
                  <path d="M 480,32 L 480,64" fill="none" stroke="black"/>
                  <path d="M 528,64 L 528,96" fill="none" stroke="black"/>
                  <path d="M 528,128 L 528,192" fill="none" stroke="black"/>
                  <path d="M 528,304 L 528,464" fill="none" stroke="black"/>
                  <path d="M 528,496 L 528,576" fill="none" stroke="black"/>
                  <path d="M 568,32 L 568,64" fill="none" stroke="black"/>
                  <path d="M 592,32 L 592,64" fill="none" stroke="black"/>
                  <path d="M 624,72 L 624,96" fill="none" stroke="black"/>
                  <path d="M 624,128 L 624,272" fill="none" stroke="black"/>
                  <path d="M 624,304 L 624,464" fill="none" stroke="black"/>
                  <path d="M 624,496 L 624,576" fill="none" stroke="black"/>
                  <path d="M 664,32 L 664,64" fill="none" stroke="black"/>
                  <path d="M 8,32 L 136,32" fill="none" stroke="black"/>
                  <path d="M 160,32 L 264,32" fill="none" stroke="black"/>
                  <path d="M 336,32 L 408,32" fill="none" stroke="black"/>
                  <path d="M 480,32 L 568,32" fill="none" stroke="black"/>
                  <path d="M 592,32 L 664,32" fill="none" stroke="black"/>
                  <path d="M 8,64 L 136,64" fill="none" stroke="black"/>
                  <path d="M 160,64 L 264,64" fill="none" stroke="black"/>
                  <path d="M 336,64 L 408,64" fill="none" stroke="black"/>
                  <path d="M 480,64 L 568,64" fill="none" stroke="black"/>
                  <path d="M 592,64 L 664,64" fill="none" stroke="black"/>
                  <path d="M 216,160 L 232,160" fill="none" stroke="black"/>
                  <path d="M 352,160 L 368,160" fill="none" stroke="black"/>
                  <path d="M 384,206 L 400,206" fill="none" stroke="black"/>
                  <path d="M 384,210 L 400,210" fill="none" stroke="black"/>
                  <path d="M 512,206 L 528,206" fill="none" stroke="black"/>
                  <path d="M 512,210 L 528,210" fill="none" stroke="black"/>
                  <path d="M 376,240 L 408,240" fill="none" stroke="black"/>
                  <path d="M 528,240 L 616,240" fill="none" stroke="black"/>
                  <path d="M 384,256 L 408,256" fill="none" stroke="black"/>
                  <path d="M 536,256 L 624,256" fill="none" stroke="black"/>
                  <path d="M 352,320 L 376,320" fill="none" stroke="black"/>
                  <path d="M 200,384 L 216,384" fill="none" stroke="black"/>
                  <path d="M 72,400 L 88,400" fill="none" stroke="black"/>
                  <path d="M 216,432 L 232,432" fill="none" stroke="black"/>
                  <path d="M 352,432 L 368,432" fill="none" stroke="black"/>
                  <path d="M 224,512 L 240,512" fill="none" stroke="black"/>
                  <path d="M 336,512 L 376,512" fill="none" stroke="black"/>
                  <path d="M 216,560 L 232,560" fill="none" stroke="black"/>
                  <path d="M 352,560 L 368,560" fill="none" stroke="black"/>
                  <path d="M 640,64 C 631.16936,64 624,71.16936 624,80" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="624,240 612,234.4 612,245.6" fill="black" transform="rotate(0,616,240)"/>
                  <polygon class="arrowhead" points="536,208 524,202.4 524,213.6" fill="black" transform="rotate(0,528,208)"/>
                  <polygon class="arrowhead" points="392,256 380,250.4 380,261.6" fill="black" transform="rotate(180,384,256)"/>
                  <polygon class="arrowhead" points="392,208 380,202.4 380,213.6" fill="black" transform="rotate(180,384,208)"/>
                  <polygon class="arrowhead" points="376,560 364,554.4 364,565.6" fill="black" transform="rotate(0,368,560)"/>
                  <polygon class="arrowhead" points="376,432 364,426.4 364,437.6" fill="black" transform="rotate(0,368,432)"/>
                  <polygon class="arrowhead" points="376,160 364,154.4 364,165.6" fill="black" transform="rotate(0,368,160)"/>
                  <polygon class="arrowhead" points="232,512 220,506.4 220,517.6" fill="black" transform="rotate(180,224,512)"/>
                  <g class="text">
                    <text x="44" y="52">Origin</text>
                    <text x="100" y="52">Issuer</text>
                    <text x="192" y="52">MoQ</text>
                    <text x="232" y="52">Relay</text>
                    <text x="372" y="52">Client</text>
                    <text x="524" y="52">Attester</text>
                    <text x="628" y="52">Issuer</text>
                    <text x="72" y="116">:</text>
                    <text x="136" y="116">Phase</text>
                    <text x="172" y="116">1:</text>
                    <text x="224" y="116">Bootstrap</text>
                    <text x="288" y="116">Token</text>
                    <text x="360" y="116">Acquisition</text>
                    <text x="528" y="116">:</text>
                    <text x="624" y="116">:</text>
                    <text x="228" y="148">&lt;-</text>
                    <text x="300" y="148">CLIENT_SETUP[]</text>
                    <text x="368" y="148">-</text>
                    <text x="292" y="164">UNAUTHORIZED</text>
                    <text x="300" y="180">[TokenChallenge]</text>
                    <text x="456" y="212">Attestation</text>
                    <text x="528" y="228">|</text>
                    <text x="468" y="244">TokenRequest</text>
                    <text x="472" y="260">TokenResponse</text>
                    <text x="528" y="276">|</text>
                    <text x="72" y="292">:</text>
                    <text x="136" y="292">Phase</text>
                    <text x="172" y="292">2:</text>
                    <text x="208" y="292">Token</text>
                    <text x="268" y="292">Exchange</text>
                    <text x="320" y="292">via</text>
                    <text x="368" y="292">Reverse</text>
                    <text x="420" y="292">Flow</text>
                    <text x="528" y="292">:</text>
                    <text x="624" y="292">:</text>
                    <text x="228" y="324">&lt;-</text>
                    <text x="292" y="324">CLIENT_SETUP</text>
                    <text x="268" y="340">[Token</text>
                    <text x="308" y="356">CredentialReq]</text>
                    <text x="136" y="388">&lt;-CredentialReq</text>
                    <text x="152" y="404">CredentialRes-&gt;</text>
                    <text x="292" y="436">SERVER_SETUP</text>
                    <text x="300" y="452">[CredentialResp]</text>
                    <text x="72" y="484">:</text>
                    <text x="136" y="484">Phase</text>
                    <text x="172" y="484">3:</text>
                    <text x="212" y="484">Normal</text>
                    <text x="284" y="484">Operations</text>
                    <text x="348" y="484">with</text>
                    <text x="400" y="484">Derived</text>
                    <text x="460" y="484">Tokens</text>
                    <text x="528" y="484">:</text>
                    <text x="624" y="484">:</text>
                    <text x="288" y="516">SUBSCRIBE</text>
                    <text x="268" y="532">[Token</text>
                    <text x="316" y="532">from</text>
                    <text x="296" y="548">credential]</text>
                    <text x="292" y="564">SUBSCRIBE_OK</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
+---------------+  +------------+        +--------+        +----------+  +--------+
| Origin Issuer |  |  MoQ Relay |        | Client |        | Attester |  | Issuer |
+-------+-------+  +------+-----+        +----+---+        +-----+----+  +----+---+
        |                 |                   |                  |           |
        |                 |                   |                  |           |
        :     Phase 1: Bootstrap Token Acquisition               :           :
        |                 |                   |                  |           |
        |                 |<- CLIENT_SETUP[] -+                  |           |
        |                 +-- UNAUTHORIZED -->|                  |           |
        |                 |  [TokenChallenge] |                  |           |
        |                 |                   |                  |           |
        |                 |                   |<== Attestation ==>           |
        |                 |                   |                  |           |
        |                 |                   +---- TokenRequest ----------->|
        |                 |                   |<--- TokenResponse -----------+
        |                 |                   |                  |           |
        :     Phase 2: Token Exchange via Reverse Flow           :           :
        |                 |                   |                  |           |
        |                 |<- CLIENT_SETUP ---+                  |           |
        |                 |   [Token +        |                  |           |
        |                 |    CredentialReq] |                  |           |
        |                 |                   |                  |           |
        |<-CredentialReq--+                   |                  |           |
        +--CredentialRes->|                   |                  |           |
        |                 |                   |                  |           |
        |                 +-- SERVER_SETUP -->|                  |           |
        |                 |  [CredentialResp] |                  |           |
        |                 |                   |                  |           |
        :     Phase 3: Normal Operations with Derived Tokens     :           :
        |                 |                   |                  |           |
        |                 |<-- SUBSCRIBE -----+                  |           |
        |                 |   [Token from     |                  |           |
        |                 |    credential]    |                  |           |
        |                 +-- SUBSCRIBE_OK -->|                  |           |
        |                 |                   |                  |           |
]]></artwork>
            </artset>
          </figure>
        </section>
        <section anchor="detailed-reverse-flow-steps">
          <name>Detailed Reverse Flow Steps</name>
          <t><strong>Phase 1: Bootstrap Token Acquisition</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>The client initiates a connection with <tt>CLIENT_SETUP</tt> without authorization.</t>
            </li>
            <li>
              <t>The MoQ relay responds with <tt>UNAUTHORIZED</tt> containing a <tt>TokenChallenge</tt>
specifying a publicly verifiable token type (<tt>0x0002</tt>).</t>
            </li>
            <li>
              <t>The client performs attestation with an external attester/issuer.</t>
            </li>
            <li>
              <t>The client obtains a publicly verifiable token.</t>
            </li>
          </ol>
          <t><strong>Phase 2: Token Exchange via Reverse Flow</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>The client sends <tt>CLIENT_SETUP</tt> with:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The publicly verifiable <tt>Token</tt> from Phase 1</t>
                </li>
                <li>
                  <t>A <tt>CredentialRequest</tt> (or <tt>TokenRequest</tt>) for a privately verifiable
token type (<tt>0x0001</tt>, <tt>0x0005</tt>, or <tt>0xE5AC</tt>)</t>
                </li>
              </ul>
            </li>
            <li>
              <t>The MoQ relay validates the bootstrap token, then processes the credential
request using its internal issuer.</t>
            </li>
            <li>
              <t>The MoQ relay responds with <tt>SERVER_SETUP</tt> containing:
              </t>
              <ul spacing="normal">
                <li>
                  <t>A <tt>CredentialResponse</tt> (or <tt>TokenResponse</tt>) with the privately verifiable
credential/tokens</t>
                </li>
              </ul>
            </li>
          </ol>
          <t><strong>Phase 3: Normal Operations</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>For subsequent operations (SUBSCRIBE, PUBLISH, FETCH), the client presents
tokens derived from the credential obtained in Phase 2.</t>
            </li>
            <li>
              <t>The MoQ relay validates tokens locally using its private verification key.</t>
            </li>
          </ol>
        </section>
        <section anchor="credential-requestresponse-encoding">
          <name>Credential Request/Response Encoding</name>
          <t>When using the reverse flow, the <tt>GenericBatchTokenRequest</tt> in <tt>ClientPrivateTokenAuth</tt>
contains the credential or token request for the privately verifiable token type:</t>
          <ul spacing="normal">
            <li>
              <t>For <tt>0x0001</tt> or <tt>0x0005</tt>: <tt>TokenRequest</tt> as defined in <xref section="5.1" sectionFormat="of" target="PRIVACYPASS-BATCHED"/></t>
            </li>
            <li>
              <t>For <tt>0xE5AC</tt>: <tt>CredentialRequest</tt> as defined in <xref section="7.1" sectionFormat="of" target="PRIVACYPASS-ARC"/></t>
            </li>
          </ul>
          <t>Similarly, <tt>GenericBatchTokenResponse</tt> in <tt>ServerPrivateTokenAuth</tt> contains:</t>
          <ul spacing="normal">
            <li>
              <t>For <tt>0x0001</tt> or <tt>0x0005</tt>: <tt>TokenResponse</tt> as defined in <xref section="5.2" sectionFormat="of" target="PRIVACYPASS-BATCHED"/></t>
            </li>
            <li>
              <t>For <tt>0xE5AC</tt>: <tt>CredentialResponse</tt> as defined in <xref section="7.2" sectionFormat="of" target="PRIVACYPASS-ARC"/></t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="trust-model">
        <name>Trust Model</name>
        <t>The architecture assumes the following trust relationships based on
<xref section="3" sectionFormat="of" target="RFC9576"/>:</t>
        <ul spacing="normal">
          <li>
            <t>Relays trust issuers to properly validate client eligibility
before issuing tokens</t>
          </li>
          <li>
            <t>Issuers trust attesters to accurately verify client eligibility</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="privacy-pass-token-integration">
      <name>Privacy Pass Token Integration</name>
      <t>This section describes how Privacy Pass tokens are integrated into the MoQ
transport protocol to provide privacy-preserving authorization for various
media operations.</t>
      <section anchor="moq-token-types">
        <name>Token Types for MoQ Authorization</name>
        <t>This specification uses the below existing Privacy Pass token types:</t>
        <t><strong>Publicly verifiable token types</strong></t>
        <ul spacing="normal">
          <li>
            <t><tt>0x0002 (Blind RSA (2048-bit))</tt>: Defined in <xref section="6" sectionFormat="of" target="RFC9578"/>. Uses
blind RSA signatures (<xref target="RFC9474"/>) for deployments requiring distributed validation
across multiple relays.</t>
          </li>
        </ul>
        <t><strong>Privately verifiable token types</strong></t>
        <ul spacing="normal">
          <li>
            <t><tt>0x0001 (VOPRF(P-384, SHA-384))</tt>: Defined in <xref section="6" sectionFormat="of" target="RFC9578"/>. Uses VOPRF (<xref target="RFC9497"/>) for
deployments where the origin is the issuer. Issuance can be batched as defined in <xref section="5" sectionFormat="of" target="PRIVACYPASS-BATCHED"/>.</t>
          </li>
          <li>
            <t><tt>0x0005 (VOPRF(ristretto255, SHA-512))</tt>: Defined in <xref section="8.1" sectionFormat="of" target="PRIVACYPASS-BATCHED"/>. Uses VOPRF (<xref target="RFC9497"/>) for
deployments where the origin is the issuer. Issuance can be batched as defined in <xref section="5" sectionFormat="of" target="PRIVACYPASS-BATCHED"/>.</t>
          </li>
          <li>
            <t><tt>0xE5AC (ARC(P-256))</tt>: Anonymous Rate Limit Credentials Token using <xref target="ARC"/>.
Tokens are presented by clients based on an issued credential and up to a <tt>presentation_limit</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="token-structure">
        <name>Token Structure</name>
        <t>Privacy Pass tokens used in MoQ <bcp14>MUST</bcp14> follow the structure defined in
<xref section="2.2" sectionFormat="of" target="RFC9577"/> for the PrivateToken HTTP authentication scheme. The token
structure includes:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Token Type</strong>: 2-byte identifier specifying the issuance protocol used</t>
          </li>
          <li>
            <t><strong>Nonce</strong>: 32-byte client-generated random value for uniqueness</t>
          </li>
          <li>
            <t><strong>Challenge Digest</strong>: 32-byte SHA-256 hash of the TokenChallenge</t>
          </li>
          <li>
            <t><strong>Token Key ID</strong>: Variable-length identifier for the issuer's public key</t>
          </li>
          <li>
            <t><strong>Authenticator</strong>: Variable-length cryptographic proof bound to the token</t>
          </li>
        </ul>
        <section anchor="token-challenge-structure-for-moq">
          <name>Token Challenge Structure for MoQ</name>
          <t>MoQ-specific TokenChallenge structures use the default format defined in
<xref section="2.1" sectionFormat="of" target="RFC9577"/> with MoQ-specific parameters in the origin_info field,
reproduced thereafter for convenience:</t>
          <artwork><![CDATA[
struct {
    uint16_t token_type;
    opaque issuer_name<1..2^16-1>;
    opaque redemption_context<0..32>;
    opaque origin_info<0..2^16-1>;
} TokenChallenge;
]]></artwork>
          <t>For MoQ usage, authorization scope information can be encoded by the origin
within <tt>origin_info</tt> field. This is encoded in the Token at issuance time when
types <tt>0x0001</tt>, <tt>0x0002</tt>, <tt>0x0005</tt> are used. When clients present a credential
such as with <xref target="ARC"/>, the scope may be restricted at presentation time.</t>
          <t>Origins <bcp14>MAY</bcp14> use <tt>redemption_context</tt> to scope token use to properties of the client
session. As described in <xref section="2.1.1.2" sectionFormat="of" target="RFC9577"/>, <tt>redemption context</tt> can
be set to 32-byte random nonce, to the hash of a specific time window, or even
derived from the client's ASN.</t>
        </section>
        <section anchor="moq-actions">
          <name>MoQ Actions</name>
          <t>MoQ operations are identified by the following action values, aligned with
MoQTransport control message types:</t>
          <table anchor="moq-actions-table">
            <name>MoQ Action Values</name>
            <thead>
              <tr>
                <th align="left">Action</th>
                <th align="left">Value</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">CLIENT_SETUP</td>
                <td align="left">0</td>
                <td align="left">
                  <xref section="9.3" sectionFormat="of" target="MoQ-TRANSPORT"/></td>
              </tr>
              <tr>
                <td align="left">SERVER_SETUP</td>
                <td align="left">1</td>
                <td align="left">
                  <xref section="9.3" sectionFormat="of" target="MoQ-TRANSPORT"/></td>
              </tr>
              <tr>
                <td align="left">PUBLISH_NAMESPACE</td>
                <td align="left">2</td>
                <td align="left">
                  <xref section="9.20" sectionFormat="of" target="MoQ-TRANSPORT"/></td>
              </tr>
              <tr>
                <td align="left">SUBSCRIBE_NAMESPACE</td>
                <td align="left">3</td>
                <td align="left">
                  <xref section="9.25" sectionFormat="of" target="MoQ-TRANSPORT"/></td>
              </tr>
              <tr>
                <td align="left">SUBSCRIBE</td>
                <td align="left">4</td>
                <td align="left">
                  <xref section="9.9" sectionFormat="of" target="MoQ-TRANSPORT"/></td>
              </tr>
              <tr>
                <td align="left">REQUEST_UPDATE</td>
                <td align="left">5</td>
                <td align="left">
                  <xref section="9.11" sectionFormat="of" target="MoQ-TRANSPORT"/></td>
              </tr>
              <tr>
                <td align="left">PUBLISH</td>
                <td align="left">6</td>
                <td align="left">
                  <xref section="9.13" sectionFormat="of" target="MoQ-TRANSPORT"/></td>
              </tr>
              <tr>
                <td align="left">FETCH</td>
                <td align="left">7</td>
                <td align="left">
                  <xref section="9.16" sectionFormat="of" target="MoQ-TRANSPORT"/></td>
              </tr>
              <tr>
                <td align="left">TRACK_STATUS</td>
                <td align="left">8</td>
                <td align="left">
                  <xref section="9.19" sectionFormat="of" target="MoQ-TRANSPORT"/></td>
              </tr>
            </tbody>
          </table>
          <t>The default authorization policy is "blocked" - all actions are denied unless
explicitly permitted by a token scope.</t>
          <t><tt>MoQAction</tt> wire representation is as follows</t>
          <artwork><![CDATA[
enum {
    CLIENT_SETUP(0),
    SERVER_SETUP(1),
    PUBLISH_NAMESPACE(2),
    SUBSCRIBE_NAMESPACE(3),
    SUBSCRIBE(4),
    REQUEST_UPDATE(5),
    PUBLISH(6),
    FETCH(7),
    TRACK_STATUS(8),
    (255)
} MoQAction;
]]></artwork>
        </section>
        <section anchor="match-types">
          <name>Match Types</name>
          <t>Match rules for namespaces and track names support the following types:</t>
          <table anchor="match-types-table">
            <name>Match Type Values</name>
            <thead>
              <tr>
                <th align="left">Match Type</th>
                <th align="left">Value</th>
                <th align="left">Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">MATCH_EXACT</td>
                <td align="left">0</td>
                <td align="left">Value must equal the pattern exactly</td>
              </tr>
              <tr>
                <td align="left">MATCH_PREFIX</td>
                <td align="left">1</td>
                <td align="left">Value must start with the pattern</td>
              </tr>
              <tr>
                <td align="left">MATCH_SUFFIX</td>
                <td align="left">2</td>
                <td align="left">Value must end with the pattern</td>
              </tr>
              <tr>
                <td align="left">MATCH_CONTAINS</td>
                <td align="left">3</td>
                <td align="left">Value must contain the pattern as substring</td>
              </tr>
            </tbody>
          </table>
          <t>Track namespaces in MoQ are represented as ordered tuples of byte strings
(e.g., <tt>["example.com", "live", "sports"]</tt>). Match rules operate on these
tuples at tuple element boundaries. The pattern in a <tt>MatchRule</tt> (defined in <xref target="scope-origin-info"/>) is also a
tuple of byte strings, and matching is performed element-by-element.</t>
          <t>As for track names, match rules can be applied directly given there is a single
tuple element.</t>
          <t>No normalization is performed on namespace tuple elements or track name values
before matching. Comparisons are performed as byte-level operations on each
tuple element.</t>
          <t><tt>MatchType</tt> wire representation is as follows</t>
          <artwork><![CDATA[
enum {
    MATCH_EXACT(0),
    MATCH_PREFIX(1),
    MATCH_SUFFIX(2),
    MATCH_CONTAINS(3),
    (255)
} MatchType;
]]></artwork>
        </section>
        <section anchor="scope-origin-info">
          <name>Authorization Scope Structure (origin_info)</name>
          <t>When authorization scope is bound at issuance time, the <tt>origin_info</tt> field
contains a binary-encoded <tt>MoQAuthorizationInfo</tt> structure:</t>
          <artwork><![CDATA[
struct {
    opaque element<0..2^16-1>;
} TupleElement;

struct {
    TupleElement elements<0..2^16-1>;
} NamespaceTuple;

struct {
    MatchType match_type;
    NamespaceTuple value;
} NamespaceMatchRule;

struct {
    MatchType match_type;
    opaque value<0..2^16-1>;
} TrackNameMatchRule;

struct {
    MoQAction actions<1..2^8-1>;
    NamespaceMatchRule namespace_match;
    TrackNameMatchRule track_name_match;
} MoQAuthScope;

struct {
    MoQAuthScope scopes<1..2^8-1>;
} MoQAuthorizationInfo;
]]></artwork>
          <t>A token <bcp14>MAY</bcp14> contain multiple <tt>MoQAuthScope</tt> entries to authorize different
combinations of actions and resource patterns. Authorization succeeds if
ANY scope in the token permits the requested operation.</t>
        </section>
        <section anchor="examples">
          <name>Examples</name>
          <t>The following examples illustrate authorization scope configurations:</t>
          <t>Subscribe to live sports namespace (prefix match):</t>
          <artwork><![CDATA[
MoQAuthScope {
    actions = [SUBSCRIBE(4)],
    namespace_match = {
        match_type = MATCH_PREFIX(1),
        value = ["sports.example.com", "live"]
    },
    track_name_match = {
        match_type = MATCH_PREFIX(1),
        value = ""
    }
}
]]></artwork>
          <t>This matches namespace tuples like <tt>["sports.example.com", "live", "soccer"]</tt>
and <tt>["sports.example.com", "live", "tennis", "finals"]</tt>.</t>
          <t>Publish to specific meeting track (exact match):</t>
          <artwork><![CDATA[
MoQAuthScope {
    actions = [PUBLISH(6)],
    namespace_match = {
        match_type = MATCH_EXACT(0),
        value = ["meetings.example.com", "meeting", "m123"]
    },
    track_name_match = {
        match_type = MATCH_PREFIX(1),
        value = "audio-"
    }
}
]]></artwork>
          <t>This matches only the exact namespace tuple <tt>["meetings.example.com", "meeting", "m123"]</tt>
with track names starting with "audio-".</t>
          <t>Fetch video-on-demand with suffix matching:</t>
          <artwork><![CDATA[
MoQAuthScope {
    actions = [FETCH(7)],
    namespace_match = {
        match_type = MATCH_CONTAINS(3),
        value = ["vod", "movies"]
    },
    track_name_match = {
        match_type = MATCH_SUFFIX(2),
        value = ".mp4"
    }
}
]]></artwork>
          <t>This matches namespace tuples containing the contiguous subsequence
<tt>["vod", "movies"]</tt>, such as <tt>["example.com", "vod", "movies", "action"]</tt>.</t>
        </section>
      </section>
      <section anchor="track-namespace-and-track-name-matching-rules">
        <name>Track Namespace and Track Name Matching Rules</name>
        <t>This specification defines matching rules for track namespaces and track names
to enable fine-grained access control while maintaining privacy. Both namespace
and track name matching use the same <tt>MatchRule</tt> structure and algorithm.</t>
        <section anchor="match-rule-evaluation">
          <name>Match Rule Evaluation</name>
          <t>Given a <tt>MatchRule</tt> and a target value (namespace tuple or track name), the
match succeeds according to the following rules. For namespace matching, both
the pattern and target are tuples of byte strings; matching operates at tuple
element boundaries.</t>
          <t><tt>MATCH_EXACT (0)</tt>:</t>
          <t>The target <bcp14>MUST</bcp14> be identical to the pattern. For namespace
tuples, this means the same number of elements with each element byte-for-byte
identical. The pattern tuple <tt>["example.com", "live"]</tt> matches only
<tt>["example.com", "live"]</tt>, not <tt>["example.com", "live", "sports"]</tt>.</t>
          <t><tt>MATCH_PREFIX (1)</tt>:</t>
          <t>The target <bcp14>MUST</bcp14> start with the pattern at tuple element
boundaries. The pattern tuple <tt>["example.com", "live"]</tt> matches
<tt>["example.com", "live", "sports"]</tt> and <tt>["example.com", "live", "news", "breaking"]</tt>
but not <tt>["example.com", "vod"]</tt>. Note that <tt>["example.com", "liv"]</tt> does NOT
match <tt>["example.com", "live"]</tt> since matching is at element boundaries.</t>
          <t><tt>MATCH_SUFFIX (2)</tt>:</t>
          <t>The target <bcp14>MUST</bcp14> end with the pattern at tuple element
boundaries. The pattern tuple <tt>["audio"]</tt> matches <tt>["meeting123", "audio"]</tt> and
<tt>["conference", "room1", "audio"]</tt> but not <tt>["audio", "opus"]</tt>.</t>
          <t><tt>MATCH_CONTAINS (3)</tt>:</t>
          <t>The target <bcp14>MUST</bcp14> contain the pattern as a contiguous
subsequence of tuple elements. The pattern tuple <tt>["live", "sports"]</tt> matches
<tt>["example.com", "live", "sports", "soccer"]</tt> but the single-element pattern
<tt>["sports"]</tt> does NOT match <tt>["live-sports", "channel"]</tt> since "sports" is a
substring within an element, not a complete element.</t>
          <t>Note: To match all values, use MATCH_PREFIX with an empty pattern (<tt>[]</tt> for
namespaces or <tt>""</tt> for track names). An empty pattern is a prefix of every value.</t>
        </section>
        <section anchor="matching-algorithm">
          <name>Matching Algorithm</name>
          <t>When a MoQ relay receives a request with a Privacy Pass token, it performs the
following validation steps to determine whether to authorize the requested
operation:</t>
          <figure anchor="fig-matching-algorithm">
            <name>Token Validation and Matching Algorithm</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="880" width="448" viewBox="0 0 448 880" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,32 L 8,80" fill="none" stroke="black"/>
                  <path d="M 8,128 L 8,176" fill="none" stroke="black"/>
                  <path d="M 8,224 L 8,272" fill="none" stroke="black"/>
                  <path d="M 8,320 L 8,368" fill="none" stroke="black"/>
                  <path d="M 8,416 L 8,480" fill="none" stroke="black"/>
                  <path d="M 8,528 L 8,576" fill="none" stroke="black"/>
                  <path d="M 8,624 L 8,672" fill="none" stroke="black"/>
                  <path d="M 8,720 L 8,768" fill="none" stroke="black"/>
                  <path d="M 8,816 L 8,864" fill="none" stroke="black"/>
                  <path d="M 80,80 L 80,120" fill="none" stroke="black"/>
                  <path d="M 80,176 L 80,216" fill="none" stroke="black"/>
                  <path d="M 80,272 L 80,312" fill="none" stroke="black"/>
                  <path d="M 80,368 L 80,408" fill="none" stroke="black"/>
                  <path d="M 80,480 L 80,520" fill="none" stroke="black"/>
                  <path d="M 80,576 L 80,616" fill="none" stroke="black"/>
                  <path d="M 80,672 L 80,712" fill="none" stroke="black"/>
                  <path d="M 80,768 L 80,808" fill="none" stroke="black"/>
                  <path d="M 160,32 L 160,80" fill="none" stroke="black"/>
                  <path d="M 160,128 L 160,176" fill="none" stroke="black"/>
                  <path d="M 160,224 L 160,272" fill="none" stroke="black"/>
                  <path d="M 160,320 L 160,368" fill="none" stroke="black"/>
                  <path d="M 160,416 L 160,480" fill="none" stroke="black"/>
                  <path d="M 160,528 L 160,576" fill="none" stroke="black"/>
                  <path d="M 160,624 L 160,672" fill="none" stroke="black"/>
                  <path d="M 160,720 L 160,768" fill="none" stroke="black"/>
                  <path d="M 160,816 L 160,864" fill="none" stroke="black"/>
                  <path d="M 208,128 L 208,176" fill="none" stroke="black"/>
                  <path d="M 208,224 L 208,272" fill="none" stroke="black"/>
                  <path d="M 248,464 L 248,736" fill="none" stroke="black"/>
                  <path d="M 304,416 L 304,464" fill="none" stroke="black"/>
                  <path d="M 344,128 L 344,176" fill="none" stroke="black"/>
                  <path d="M 344,224 L 344,272" fill="none" stroke="black"/>
                  <path d="M 440,416 L 440,464" fill="none" stroke="black"/>
                  <path d="M 8,32 L 160,32" fill="none" stroke="black"/>
                  <path d="M 8,80 L 160,80" fill="none" stroke="black"/>
                  <path d="M 8,128 L 160,128" fill="none" stroke="black"/>
                  <path d="M 208,128 L 344,128" fill="none" stroke="black"/>
                  <path d="M 168,144 L 200,144" fill="none" stroke="black"/>
                  <path d="M 8,176 L 160,176" fill="none" stroke="black"/>
                  <path d="M 208,176 L 344,176" fill="none" stroke="black"/>
                  <path d="M 8,224 L 160,224" fill="none" stroke="black"/>
                  <path d="M 208,224 L 344,224" fill="none" stroke="black"/>
                  <path d="M 168,240 L 200,240" fill="none" stroke="black"/>
                  <path d="M 8,272 L 160,272" fill="none" stroke="black"/>
                  <path d="M 208,272 L 344,272" fill="none" stroke="black"/>
                  <path d="M 8,320 L 160,320" fill="none" stroke="black"/>
                  <path d="M 8,368 L 160,368" fill="none" stroke="black"/>
                  <path d="M 8,416 L 160,416" fill="none" stroke="black"/>
                  <path d="M 304,416 L 440,416" fill="none" stroke="black"/>
                  <path d="M 160,432 L 296,432" fill="none" stroke="black"/>
                  <path d="M 168,464 L 248,464" fill="none" stroke="black"/>
                  <path d="M 304,464 L 440,464" fill="none" stroke="black"/>
                  <path d="M 8,480 L 160,480" fill="none" stroke="black"/>
                  <path d="M 8,528 L 160,528" fill="none" stroke="black"/>
                  <path d="M 168,544 L 248,544" fill="none" stroke="black"/>
                  <path d="M 8,576 L 160,576" fill="none" stroke="black"/>
                  <path d="M 8,624 L 160,624" fill="none" stroke="black"/>
                  <path d="M 168,640 L 248,640" fill="none" stroke="black"/>
                  <path d="M 8,672 L 160,672" fill="none" stroke="black"/>
                  <path d="M 8,720 L 160,720" fill="none" stroke="black"/>
                  <path d="M 168,736 L 248,736" fill="none" stroke="black"/>
                  <path d="M 8,768 L 160,768" fill="none" stroke="black"/>
                  <path d="M 8,816 L 160,816" fill="none" stroke="black"/>
                  <path d="M 8,864 L 160,864" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="304,432 292,426.4 292,437.6" fill="black" transform="rotate(0,296,432)"/>
                  <polygon class="arrowhead" points="208,240 196,234.4 196,245.6" fill="black" transform="rotate(0,200,240)"/>
                  <polygon class="arrowhead" points="208,144 196,138.4 196,149.6" fill="black" transform="rotate(0,200,144)"/>
                  <polygon class="arrowhead" points="176,464 164,458.4 164,469.6" fill="black" transform="rotate(180,168,464)"/>
                  <polygon class="arrowhead" points="88,808 76,802.4 76,813.6" fill="black" transform="rotate(90,80,808)"/>
                  <polygon class="arrowhead" points="88,712 76,706.4 76,717.6" fill="black" transform="rotate(90,80,712)"/>
                  <polygon class="arrowhead" points="88,616 76,610.4 76,621.6" fill="black" transform="rotate(90,80,616)"/>
                  <polygon class="arrowhead" points="88,520 76,514.4 76,525.6" fill="black" transform="rotate(90,80,520)"/>
                  <polygon class="arrowhead" points="88,408 76,402.4 76,413.6" fill="black" transform="rotate(90,80,408)"/>
                  <polygon class="arrowhead" points="88,312 76,306.4 76,317.6" fill="black" transform="rotate(90,80,312)"/>
                  <polygon class="arrowhead" points="88,216 76,210.4 76,221.6" fill="black" transform="rotate(90,80,216)"/>
                  <polygon class="arrowhead" points="88,120 76,114.4 76,125.6" fill="black" transform="rotate(90,80,120)"/>
                  <g class="text">
                    <text x="48" y="52">Extract</text>
                    <text x="104" y="52">Token</text>
                    <text x="36" y="68">from</text>
                    <text x="72" y="68">MoQ</text>
                    <text x="120" y="68">Message</text>
                    <text x="104" y="100">Yes</text>
                    <text x="40" y="148">Check</text>
                    <text x="92" y="148">Replay</text>
                    <text x="272" y="148">Authorization</text>
                    <text x="60" y="164">Protection</text>
                    <text x="180" y="164">No</text>
                    <text x="244" y="164">Failed</text>
                    <text x="44" y="244">Verify</text>
                    <text x="96" y="244">Token</text>
                    <text x="272" y="244">Authorization</text>
                    <text x="80" y="260">(Type-specific)</text>
                    <text x="180" y="260">No</text>
                    <text x="244" y="260">Failed</text>
                    <text x="104" y="292">Yes</text>
                    <text x="48" y="340">Extract</text>
                    <text x="104" y="340">Scope</text>
                    <text x="72" y="356">(origin_info)</text>
                    <text x="368" y="436">Authorization</text>
                    <text x="32" y="452">For</text>
                    <text x="68" y="452">each</text>
                    <text x="112" y="452">Scope</text>
                    <text x="180" y="452">No</text>
                    <text x="212" y="452">more</text>
                    <text x="260" y="452">scopes</text>
                    <text x="340" y="452">Failed</text>
                    <text x="44" y="548">Action</text>
                    <text x="84" y="548">in</text>
                    <text x="76" y="564">scope.actions?</text>
                    <text x="204" y="564">No</text>
                    <text x="104" y="596">Yes</text>
                    <text x="56" y="644">Namespace</text>
                    <text x="120" y="644">Match</text>
                    <text x="36" y="660">Rule</text>
                    <text x="88" y="660">passes?</text>
                    <text x="204" y="660">No</text>
                    <text x="104" y="692">Yes</text>
                    <text x="40" y="740">Track</text>
                    <text x="84" y="740">Name</text>
                    <text x="128" y="740">Match</text>
                    <text x="36" y="756">Rule</text>
                    <text x="88" y="756">passes?</text>
                    <text x="104" y="788">Yes</text>
                    <text x="72" y="836">Authorization</text>
                    <text x="48" y="852">Granted</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
+------------------+
| Extract Token    |
| from MoQ Message |
+--------+---------+
         | Yes
         v
+------------------+     +----------------+
| Check Replay     |---->| Authorization  |
| Protection       | No  | Failed         |
+--------+---------+     +----------------+
         |
         v
+------------------+     +----------------+
| Verify Token     |---->| Authorization  |
| (Type-specific)  | No  | Failed         |
+--------+---------+     +----------------+
         | Yes
         v
+------------------+
| Extract Scope    |
| (origin_info)    |
+--------+---------+
         |
         v
+------------------+                 +----------------+
|                  +---------------->| Authorization  |
| For each Scope   | No more scopes  | Failed         |
|                  |<---------+      +----------------+
+--------+---------+          |
         |                    |
         v                    |
+------------------+          |
| Action in        |----------+
| scope.actions?   |    No    |
+--------+---------+          |
         | Yes                |
         v                    |
+------------------+          |
| Namespace Match  |----------+
| Rule passes?     |    No    |
+--------+---------+          |
         | Yes                |
         v                    |
+------------------+          |
| Track Name Match |----------+
| Rule passes?     |
+--------+---------+
         | Yes
         v
+------------------+
| Authorization    |
| Granted          |
+------------------+
]]></artwork>
            </artset>
          </figure>
          <ol spacing="normal" type="1"><li>
              <t><strong>Token Extraction</strong>: Extract the Privacy Pass token from the MoQ control
message (SETUP, SUBSCRIBE, FETCH, PUBLISH, PUBLISH_NAMESPACE, or other operation).</t>
            </li>
            <li>
              <t><strong>Token Verification</strong>: Verify the token using the appropriate method for
the token type:  </t>
              <ul spacing="normal">
                <li>
                  <t>Token Type <tt>0x0001</tt> or <tt>0x0005</tt> (VOPRF): Verify using the issuer's
private validation key</t>
                </li>
                <li>
                  <t>Token Type <tt>0x0002</tt> (Blind RSA): Verify using the issuer's public
verification key</t>
                </li>
                <li>
                  <t>Token Type <tt>0xE5AC</tt> (ARC): Verify the presentation proof using the
issuer's public parameters</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Replay Protection</strong>: Validate that the token has not been replayed:  </t>
              <ul spacing="normal">
                <li>
                  <t>Check token nonce uniqueness within the configured replay window</t>
                </li>
                <li>
                  <t>Verify token expiration timestamp if present in token metadata</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Scope Extraction</strong>: Extract authorization scope from the token:  </t>
              <ul spacing="normal">
                <li>
                  <t>If using <tt>origin_info</tt>: Decode the <tt>MoQAuthorizationInfo</tt> structure</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Scope Evaluation</strong>: For each <tt>MoQAuthScope</tt> in the token, check if the
requested operation is authorized:  </t>
              <t>
a. <strong>Action Check</strong>: Verify the requested MoQ action (from <xref target="moq-actions"/>)
   is present in the scope's <tt>actions</tt> list  </t>
              <t>
b. <strong>Namespace Match</strong>: Apply the <tt>namespace_match</tt> rule to the requested
   track namespace using the algorithm in <xref target="match-types"/>  </t>
              <t>
c. <strong>Track Name Match</strong>: Apply the <tt>track_name_match</tt> rule to the requested
   track name using the algorithm in <xref target="match-types"/>  </t>
              <t>
d. If all three checks pass, authorization succeeds for this scope</t>
            </li>
            <li>
              <t><strong>Authorization Decision</strong>: Access is granted if and only if:  </t>
              <ul spacing="normal">
                <li>
                  <t>Token verification succeeds (step 2)</t>
                </li>
                <li>
                  <t>Replay protection passes (step 3)</t>
                </li>
                <li>
                  <t>At least one scope in the token authorizes the operation (step 5)</t>
                </li>
              </ul>
            </li>
          </ol>
          <t>If authorization fails, an error is returned as specified in <xref target="errors"/>.</t>
        </section>
      </section>
      <section anchor="token-in-moq-messages">
        <name>Token in MOQ Messages</name>
        <t>Privacy Pass tokens are provided to MoQ relays using the existing MoQ
authorization framework with the following adaptations:</t>
        <section anchor="setup-message-authorization">
          <name>SETUP Message Authorization</name>
          <t>For connection-level authorization, Privacy Pass tokens are included in the
SETUP message's authorization parameter (<xref section="9.3.1.5" sectionFormat="of" target="MoQ-TRANSPORT"/>).</t>
          <artwork><![CDATA[
SETUP {
    Version = 1,
    Parameters = [
        {
            Type = AUTHORIZATION,
            Value = PrivateTokenAuth
        }
    ]
}

type PrivateTokenAuth = ClientPrivateTokenAuth | ServerPrivateTokenAuth;
]]></artwork>
          <t>For <tt>CLIENT_SETUP</tt>, the authorization value uses <tt>GenericBatchTokenRequest</tt>
as defined in <xref section="6.1" sectionFormat="of" target="PRIVACYPASS-BATCHED"/> as follows:</t>
          <artwork><![CDATA[
struct {
    uint8_t auth_scheme = 0x01;
    Token token;
    GenericBatchTokenRequest token_requests;
} ClientPrivateTokenAuth;
]]></artwork>
          <t>For <tt>SERVER_SETUP</tt>, the authorization value uses <tt>GenericBatchTokenResponse</tt>
as defined in <xref section="6.2" sectionFormat="of" target="PRIVACYPASS-BATCHED"/> as follows:</t>
          <artwork><![CDATA[
struct {
    uint8_t auth_scheme = 0x01;
    Token token;
    GenericBatchTokenResponse token_responses;
} ServerPrivateTokenAuth;
]]></artwork>
          <t>When batch issuance is not used, <tt>token_requests</tt> and <tt>token_responses</tt>
are empty (length = 0).</t>
          <t>The <tt>Token</tt> structure is prepended by a two-byte token type identifier
as registered with IANA:</t>
          <artwork><![CDATA[
struct {
   uint16_t token_type; /* From the IANA Privacy Pass Token Types Registry */
   select (token_type) { /* Rest of the token */
     case (0x0001, 0x0002, 0x0005):
         uint8_t nonce[32];
         uint8_t challenge_digest[32];
         uint8_t token_key_id[Nid];
         uint8_t authenticator[Nk];
     case (other): /* Other token types from the IANA Privacy Pass Token Types Registry */
         opaque remainder<0..2^16-1>;
   }
} Token;
]]></artwork>
          <t>Where <tt>Nk</tt> is determined by token_type per the <xref target="PRIVACYPASS-IANA"/>.</t>
          <t>Unknown token types <bcp14>MUST</bcp14> be rejected.</t>
        </section>
        <section anchor="moq-operation-level-authorization">
          <name>MoQ Operation-Level Authorization</name>
          <t>For individual MoQ operation authorization, tokens are included in
operation-specific control messages:</t>
          <artwork><![CDATA[
SUBSCRIBE {
    Track_Namespace = "sports.example.com/live/soccer",
    Track_Name = "video",
    Parameters = [
        {
            Type = AUTHORIZATION,
            Value = PrivateTokenAuth
        }
    ]
}
]]></artwork>
        </section>
        <section anchor="continuous-auth-batched">
          <name>Continuous Authorization with Batched Tokens</name>
          <t>Long-lived MoQ sessions (such as live streaming or real-time communication)
require periodic re-authorization to ensure continued eligibility. Unlike
JWT-based approaches that use explicit revalidation intervals, Privacy Pass
can achieve continuous authorization through batched token issuance.</t>
          <t>During the initial SETUP exchange, clients can request multiple tokens via
<tt>GenericBatchTokenRequest</tt> (defined in <xref section="6.1" sectionFormat="of" target="PRIVACYPASS-BATCHED"/>).
Each token in the batch is independently valid
and can be presented for subsequent operations or periodic re-authorization.</t>
          <artwork><![CDATA[
Batched Token Usage Timeline:

Time 0:     CLIENT_SETUP with Token_1, request batch of N tokens
            SERVER_SETUP with batch of N tokens

Time T:     SUBSCRIBE with Token_2 (from batch)

Time 2T:    Client presents Token_3 for continued authorization
            (proactive re-auth before relay requests it)

Time 3T:    Relay requests re-authorization
            Client presents Token_4
]]></artwork>
          <t>Relays <bcp14>MAY</bcp14> request periodic re-authorization by sending a <tt>TokenChallenge</tt>
in a <tt>REQUEST_ERROR</tt> message. Clients <bcp14>SHOULD</bcp14> present a fresh token from their
batch in response if any satisfy the new <tt>TokenChallenge</tt>. If not, they <bcp14>SHOULD</bcp14>
perform a new issuance process.</t>
          <t>When using <xref target="ARC"/> tokens (<tt>0xE5AC</tt>), the credential's <tt>presentation_limit</tt> controls
how many times the client can present tokens from a single credential issuance.
This provides rate limiting while preserving unlinkability between presentations.</t>
          <t><strong>Deployment Considerations</strong>:</t>
          <ul spacing="normal">
            <li>
              <t>Batch size <bcp14>SHOULD</bcp14> be sufficient for the expected session duration</t>
            </li>
            <li>
              <t>Relays <bcp14>SHOULD</bcp14> configure re-authorization intervals based on content
sensitivity and trust requirements</t>
            </li>
            <li>
              <t>Clients <bcp14>SHOULD</bcp14> request new token batches before exhausting their supply</t>
            </li>
            <li>
              <t>For high-security deployments, shorter re-authorization intervals with
smaller batches provide stronger revocation guarantees</t>
            </li>
          </ul>
        </section>
        <section anchor="continuous-auth-reverse">
          <name>Continuous Authorization with Reverse Flow</name>
          <t>If the client and the relay support it, a Relay <bcp14>MAY</bcp14> perform continuous
authentication using a reverse flow.</t>
          <t>To do so, when presenting <tt>PrivateTokenAuth</tt>, a client <bcp14>MUST</bcp14> send at least one
<tt>GenericBatchTokenRequest</tt>. The Relay then acts as a reverse issuer, and issues
the corresponding number of <tt>GenericBatchTokenResponse</tt>.</t>
          <t>Tokens obtained this way can be presented by the Client to maintain
the continuity of the session without linkability.</t>
          <artwork><![CDATA[
Reverse Flow Token Usage Timeline:

Time 0:     CLIENT_SETUP with Token_1, request batch of 1 token
            SERVER_SETUP with batch of 1 token

Time T:     SUBSCRIBE with Token_2 (from batch), request batch of 1 token
            Relay responds with batch of 1 token

Time 2T:    Client presents Token_3 (from batch of time T), request batch of 1 token
            Relay responds with batch of 1 token
]]></artwork>
        </section>
        <section anchor="errors">
          <name>Errors</name>
          <t>If the authentication fails for any reason, the server <bcp14>MUST</bcp14> send an error.
The error response includes a <tt>TokenChallenge</tt> to enable the client to obtain
a valid token and retry the operation.</t>
          <section anchor="setup-errors">
            <name>SETUP Errors</name>
            <t>If authentication fails during SETUP, the Relay <bcp14>MUST</bcp14> terminate the connection
with the <tt>UNAUTHORIZED</tt> (0x02) Termination Error Code defined in
<xref section="3.4" sectionFormat="of" target="MoQ-TRANSPORT"/>. The termination reason phrase <bcp14>MUST</bcp14> contain
a <tt>MoQAuthChallenge</tt> structure:</t>
            <artwork><![CDATA[
struct {
    TokenChallenge challenges<1..2^16-1>;
} MoQAuthChallenge;
]]></artwork>
            <t>The <tt>challenges</tt> field lists token challenges the relay accepts, ordered
by preference (most preferred first). This allows clients to select an appropriate
issuance protocol based on supported token types and issuers. Each challenge
specifies a token type, issuer, and optional scope, enabling relays to accept
different issuers or scopes for different token types. Relay <bcp14>MUST</bcp14> include at
least one challenge.</t>
          </section>
          <section anchor="operation-errors">
            <name>Operation Errors</name>
            <t>If the error occurs over an established connection, the Relay <bcp14>MUST</bcp14> send a <tt>REQUEST_ERROR</tt>
defined in <xref section="9.8" sectionFormat="of" target="MoQ-TRANSPORT"/>.</t>
            <t>The error code <bcp14>MUST</bcp14> be one of:</t>
            <table anchor="error-codes-table">
              <name>Privacy Pass Authorization Error Codes</name>
              <thead>
                <tr>
                  <th align="left">Error Code</th>
                  <th align="left">Name</th>
                  <th align="left">Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">0x0100</td>
                  <td align="left">TOKEN_MISSING</td>
                  <td align="left">No token provided when required</td>
                </tr>
                <tr>
                  <td align="left">0x0101</td>
                  <td align="left">TOKEN_INVALID</td>
                  <td align="left">Token signature verification failed</td>
                </tr>
                <tr>
                  <td align="left">0x0102</td>
                  <td align="left">TOKEN_EXPIRED</td>
                  <td align="left">Token has expired or been revoked</td>
                </tr>
                <tr>
                  <td align="left">0x0103</td>
                  <td align="left">TOKEN_REPLAYED</td>
                  <td align="left">Token nonce has been seen before</td>
                </tr>
                <tr>
                  <td align="left">0x0104</td>
                  <td align="left">SCOPE_MISMATCH</td>
                  <td align="left">Token scope does not authorize this operation</td>
                </tr>
                <tr>
                  <td align="left">0x0105</td>
                  <td align="left">ISSUER_UNKNOWN</td>
                  <td align="left">Token issuer is not trusted by this relay</td>
                </tr>
                <tr>
                  <td align="left">0x0106</td>
                  <td align="left">TOKEN_MALFORMED</td>
                  <td align="left">Token cannot be parsed correctly</td>
                </tr>
              </tbody>
            </table>
            <t>The reason phrase in <tt>REQUEST_ERROR</tt> <bcp14>MUST</bcp14> contain a <tt>MoQAuthChallenge</tt> structure
when the client should retry with a new token, encoded as a byte-string.</t>
          </section>
          <section anchor="tokenchallenge-construction">
            <name>TokenChallenge Construction</name>
            <t>Each <tt>TokenChallenge</tt> in <tt>MoQAuthChallenge</tt> <bcp14>MUST</bcp14> be constructed as follows:</t>
            <ul spacing="normal">
              <li>
                <t><tt>token_type</tt>: The token type for this challenge</t>
              </li>
              <li>
                <t><tt>issuer_name</tt>: The issuer name that can issue tokens for this challenge</t>
              </li>
              <li>
                <t><tt>redemption_context</tt>: A fresh 32-byte random value, or empty if the relay
accepts tokens with any redemption context</t>
              </li>
              <li>
                <t><tt>origin_info</tt>: The relay's origin identifier, optionally including the
required authorization scope</t>
              </li>
            </ul>
            <t>Different challenges <bcp14>MAY</bcp14> specify different issuers or scopes for different
token types. When <tt>origin_info</tt> is empty, the relay accepts tokens with any
scope and performs authorization based solely on the token's embedded scope
information.</t>
          </section>
          <section anchor="error-response-example">
            <name>Error Response Example</name>
            <artwork><![CDATA[
REQUEST_ERROR {
    Request_ID = 42,
    Error_Code = 0x0104,  /* SCOPE_MISMATCH */
    Reason = MoQAuthChallenge {
        challenges = [
            TokenChallenge {
                token_type = 0x0002,
                issuer_name = "public-issuer.example.com",
                redemption_context = <32 random bytes>,
                origin_info = <authorization scope>
            },
            TokenChallenge {
                token_type = 0xE5AC,
                issuer_name = "relay.example.com",
                redemption_context = <32 random bytes>,
                origin_info = <authorization scope>
            },
            TokenChallenge {
                token_type = 0x0001,
                issuer_name = "relay.example.com",
                redemption_context = <32 random bytes>,
                origin_info = <authorization scope>
            }
        ]
    }
}
]]></artwork>
          </section>
          <section anchor="control-message-authz">
            <name>Control Message Authorization Failures</name>
            <t>When authorization fails for MoQ control messages other than SETUP, the relay
returns a <tt>REQUEST_ERROR</tt> with the appropriate error code from <xref target="error-codes-table"/>.
The client <bcp14>MAY</bcp14> retry the operation with a valid token obtained using the
<tt>TokenChallenge</tt> from the error response.</t>
            <t>As per <xref section="3.4.4" sectionFormat="of" target="MoQ-TRANSPORT"/>, implementations <bcp14>MAY</bcp14> elevate
request-specific errors to session-level errors. This elevation is appropriate
when:</t>
            <ul spacing="normal">
              <li>
                <t>The authorization failure indicates a systemic issue (e.g., all client tokens
are from an untrusted issuer)</t>
              </li>
              <li>
                <t>Continuing the session would be futile due to policy restrictions</t>
              </li>
              <li>
                <t>The error represents a security concern requiring session termination</t>
              </li>
            </ul>
            <t>Implementations need to consider the impact on other outstanding subscriptions
before elevating to session-level errors.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="example-authorization-flow">
      <name>Example Authorization Flow</name>
      <t>Below shows an example deployment scenario where the relay has been
configured with the necessary validation keys and content policies. The
relay can verify Privacy Pass tokens locally and deliver media directly
without contacting the Issuer. This example uses publicly verifiable tokens.</t>
      <figure anchor="direct-relay-authorization-flow">
        <name>Direct Relay Authorization Flow</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="528" width="712" viewBox="0 0 712 528" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
              <path d="M 128,64 L 128,368" fill="none" stroke="black"/>
              <path d="M 128,400 L 128,512" fill="none" stroke="black"/>
              <path d="M 176,32 L 176,64" fill="none" stroke="black"/>
              <path d="M 376,32 L 376,64" fill="none" stroke="black"/>
              <path d="M 408,64 L 408,240" fill="none" stroke="black"/>
              <path d="M 408,272 L 408,480" fill="none" stroke="black"/>
              <path d="M 448,32 L 448,64" fill="none" stroke="black"/>
              <path d="M 528,32 L 528,64" fill="none" stroke="black"/>
              <path d="M 568,64 L 568,192" fill="none" stroke="black"/>
              <path d="M 568,240 L 568,512" fill="none" stroke="black"/>
              <path d="M 616,32 L 616,64" fill="none" stroke="black"/>
              <path d="M 632,32 L 632,64" fill="none" stroke="black"/>
              <path d="M 664,64 L 664,512" fill="none" stroke="black"/>
              <path d="M 704,32 L 704,64" fill="none" stroke="black"/>
              <path d="M 80,32 L 176,32" fill="none" stroke="black"/>
              <path d="M 376,32 L 448,32" fill="none" stroke="black"/>
              <path d="M 528,32 L 616,32" fill="none" stroke="black"/>
              <path d="M 632,32 L 704,32" fill="none" stroke="black"/>
              <path d="M 80,64 L 176,64" fill="none" stroke="black"/>
              <path d="M 376,64 L 448,64" fill="none" stroke="black"/>
              <path d="M 528,64 L 616,64" fill="none" stroke="black"/>
              <path d="M 632,64 L 704,64" fill="none" stroke="black"/>
              <path d="M 136,96 L 256,96" fill="none" stroke="black"/>
              <path d="M 392,96 L 408,96" fill="none" stroke="black"/>
              <path d="M 128,128 L 144,128" fill="none" stroke="black"/>
              <path d="M 368,128 L 400,128" fill="none" stroke="black"/>
              <path d="M 416,174 L 432,174" fill="none" stroke="black"/>
              <path d="M 416,178 L 432,178" fill="none" stroke="black"/>
              <path d="M 544,174 L 560,174" fill="none" stroke="black"/>
              <path d="M 544,178 L 560,178" fill="none" stroke="black"/>
              <path d="M 408,208 L 480,208" fill="none" stroke="black"/>
              <path d="M 600,208 L 656,208" fill="none" stroke="black"/>
              <path d="M 416,224 L 480,224" fill="none" stroke="black"/>
              <path d="M 608,224 L 664,224" fill="none" stroke="black"/>
              <path d="M 136,304 L 216,304" fill="none" stroke="black"/>
              <path d="M 392,304 L 408,304" fill="none" stroke="black"/>
              <path d="M 24,368 L 144,368" fill="none" stroke="black"/>
              <path d="M 24,400 L 144,400" fill="none" stroke="black"/>
              <path d="M 128,432 L 144,432" fill="none" stroke="black"/>
              <path d="M 288,432 L 400,432" fill="none" stroke="black"/>
              <path d="M 24,368 C 15.16936,368 8,375.16936 8,384" fill="none" stroke="black"/>
              <path d="M 144,368 C 152.83064,368 160,375.16936 160,384" fill="none" stroke="black"/>
              <path d="M 24,400 C 15.16936,400 8,392.83064 8,384" fill="none" stroke="black"/>
              <path d="M 144,400 C 152.83064,400 160,392.83064 160,384" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="664,208 652,202.4 652,213.6" fill="black" transform="rotate(0,656,208)"/>
              <polygon class="arrowhead" points="568,176 556,170.4 556,181.6" fill="black" transform="rotate(0,560,176)"/>
              <polygon class="arrowhead" points="424,224 412,218.4 412,229.6" fill="black" transform="rotate(180,416,224)"/>
              <polygon class="arrowhead" points="424,176 412,170.4 412,181.6" fill="black" transform="rotate(180,416,176)"/>
              <polygon class="arrowhead" points="408,432 396,426.4 396,437.6" fill="black" transform="rotate(0,400,432)"/>
              <polygon class="arrowhead" points="408,128 396,122.4 396,133.6" fill="black" transform="rotate(0,400,128)"/>
              <polygon class="arrowhead" points="144,304 132,298.4 132,309.6" fill="black" transform="rotate(180,136,304)"/>
              <polygon class="arrowhead" points="144,96 132,90.4 132,101.6" fill="black" transform="rotate(180,136,96)"/>
              <g class="text">
                <text x="104" y="52">MoQ</text>
                <text x="144" y="52">Relay</text>
                <text x="412" y="52">Client</text>
                <text x="572" y="52">Attester</text>
                <text x="668" y="52">Issuer</text>
                <text x="324" y="100">CLIENT_SETUP[]</text>
                <text x="204" y="116">UNAUTHORIZED</text>
                <text x="280" y="116">(0x2)</text>
                <text x="336" y="116">[</text>
                <text x="264" y="132">Reason=MoQAuthChallenge</text>
                <text x="160" y="148">]</text>
                <text x="488" y="180">Attestation</text>
                <text x="540" y="212">TokenRequest</text>
                <text x="544" y="228">TokenResponse</text>
                <text x="400" y="260">FinalizeToken</text>
                <text x="284" y="292">CLIENT_SETUP[{</text>
                <text x="308" y="308">AUTHORIZATION,</text>
                <text x="320" y="324">PrivateTokenAuth,</text>
                <text x="236" y="340">}]</text>
                <text x="40" y="388">Local</text>
                <text x="108" y="388">validation</text>
                <text x="212" y="436">SERVER_SETUP[{</text>
                <text x="228" y="452">AUTHORIZATION,</text>
                <text x="240" y="468">PrivateTokenAuth,</text>
                <text x="164" y="484">}]</text>
                <text x="400" y="500">FinalizeToken</text>
                <text x="408" y="516">|</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
         +-----------+                        +--------+         +----------+ +--------+
         | MoQ Relay |                        | Client |         | Attester | | Issuer |
         +-----+-----+                        +---+----+         +----+-----+ +---+----+
               |                                  |                   |           |
               |<--------------- CLIENT_SETUP[] --+                   |           |
               |   UNAUTHORIZED (0x2)    [        |                   |           |
               +--   Reason=MoQAuthChallenge ---->|                   |           |
               |   ]                              |                   |           |
               |                                  |                   |           |
               |                                  |<== Attestation ==>|           |
               |                                  |                   |           |
               |                                  +--------- TokenRequest ------->|
               |                                  |<-------- TokenResponse -------+
               |                                  |                   |           |
               |                           FinalizeToken              |           |
               |                                  |                   |           |
               |            CLIENT_SETUP[{        |                   |           |
               |<----------    AUTHORIZATION,   --+                   |           |
               |               PrivateTokenAuth,  |                   |           |
               |            }]                    |                   |           |
               |                                  |                   |           |
 .-------------+--.                               |                   |           |
| Local validation |                              |                   |           |
 `-------------+--'                               |                   |           |
               |                                  |                   |           |
               +-- SERVER_SETUP[{  -------------->|                   |           |
               |     AUTHORIZATION,               |                   |           |
               |     PrivateTokenAuth,            |                   |           |
               |   }]                             |                   |           |
               |                           FinalizeToken              |           |
               |                                  |                   |           |
]]></artwork>
        </artset>
      </figure>
      <t>The <tt>MoQAuthChallenge</tt> in the <tt>UNAUTHORIZED</tt> response contains:</t>
      <ul spacing="normal">
        <li>
          <t>A <tt>TokenChallenge</tt> with the relay's issuer configuration</t>
        </li>
        <li>
          <t>A list of <tt>supported_token_types</tt> (e.g., <tt>[0x0002, 0xE5AC]</tt>)</t>
        </li>
      </ul>
      <t>This allows the client to select the appropriate issuance protocol based on
its capabilities and the available attesters/issuers.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO: Add considerations for the security and privacy of the Privacy Pass
tokens.</t>
      <ul spacing="normal">
        <li>
          <t>Token Replay</t>
        </li>
        <li>
          <t>Token harvest</t>
        </li>
        <li>
          <t>Key rotation</t>
        </li>
        <li>
          <t>Use of TLS</t>
        </li>
      </ul>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="moq-privacy-pass-auth-scheme-registry">
        <name>MoQ Privacy Pass Auth Scheme Registry</name>
        <t>IANA is requested to create a new registry titled "MoQ Privacy Pass Auth
Schemes" with the following initial contents:</t>
        <table anchor="auth-scheme-registry">
          <name>MoQ Privacy Pass Auth Schemes</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x00</td>
              <td align="left">Reserved</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">0x01</td>
              <td align="left">PrivateTokenAuth</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
        <t>New entries in this registry require Specification Required registration policy.</t>
      </section>
      <section anchor="moq-action-registry">
        <name>MoQ Action Registry</name>
        <t>IANA is requested to create a new registry titled "MoQ Actions for Privacy
Pass Authorization" with the following initial contents:</t>
        <table anchor="moq-action-registry-table">
          <name>MoQ Actions Registry</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Action</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">CLIENT_SETUP</td>
              <td align="left">
                <xref target="moq-actions"/></td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">SERVER_SETUP</td>
              <td align="left">
                <xref target="moq-actions"/></td>
            </tr>
            <tr>
              <td align="left">2</td>
              <td align="left">PUBLISH_NAMESPACE</td>
              <td align="left">
                <xref target="moq-actions"/></td>
            </tr>
            <tr>
              <td align="left">3</td>
              <td align="left">SUBSCRIBE_NAMESPACE</td>
              <td align="left">
                <xref target="moq-actions"/></td>
            </tr>
            <tr>
              <td align="left">4</td>
              <td align="left">SUBSCRIBE</td>
              <td align="left">
                <xref target="moq-actions"/></td>
            </tr>
            <tr>
              <td align="left">5</td>
              <td align="left">REQUEST_UPDATE</td>
              <td align="left">
                <xref target="moq-actions"/></td>
            </tr>
            <tr>
              <td align="left">6</td>
              <td align="left">PUBLISH</td>
              <td align="left">
                <xref target="moq-actions"/></td>
            </tr>
            <tr>
              <td align="left">7</td>
              <td align="left">FETCH</td>
              <td align="left">
                <xref target="moq-actions"/></td>
            </tr>
            <tr>
              <td align="left">8</td>
              <td align="left">TRACK_STATUS</td>
              <td align="left">
                <xref target="moq-actions"/></td>
            </tr>
            <tr>
              <td align="left">9-254</td>
              <td align="left">Unassigned</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">255</td>
              <td align="left">Reserved</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
        <t>New entries in this registry require Specification Required registration policy.
Values <bcp14>SHOULD</bcp14> align with MoQTransport control message types where applicable.</t>
      </section>
      <section anchor="moq-match-type-registry">
        <name>MoQ Match Type Registry</name>
        <t>IANA is requested to create a new registry titled "MoQ Match Types for Privacy
Pass Authorization" with the following initial contents:</t>
        <table anchor="match-type-registry">
          <name>MoQ Match Types Registry</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Match Type</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">MATCH_EXACT</td>
              <td align="left">
                <xref target="match-types"/></td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">MATCH_PREFIX</td>
              <td align="left">
                <xref target="match-types"/></td>
            </tr>
            <tr>
              <td align="left">2</td>
              <td align="left">MATCH_SUFFIX</td>
              <td align="left">
                <xref target="match-types"/></td>
            </tr>
            <tr>
              <td align="left">3</td>
              <td align="left">MATCH_CONTAINS</td>
              <td align="left">
                <xref target="match-types"/></td>
            </tr>
            <tr>
              <td align="left">4-254</td>
              <td align="left">Unassigned</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">255</td>
              <td align="left">Reserved</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
        <t>New entries in this registry require Specification Required registration policy.</t>
      </section>
      <section anchor="moq-privacy-pass-error-code-registry">
        <name>MoQ Privacy Pass Error Code Registry</name>
        <t>IANA is requested to create a new registry titled "MoQ Privacy Pass Authorization
Error Codes" with the following initial contents:</t>
        <table anchor="error-code-registry">
          <name>MoQ Privacy Pass Error Codes Registry</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0100</td>
              <td align="left">TOKEN_MISSING</td>
              <td align="left">
                <xref target="errors"/></td>
            </tr>
            <tr>
              <td align="left">0x0101</td>
              <td align="left">TOKEN_INVALID</td>
              <td align="left">
                <xref target="errors"/></td>
            </tr>
            <tr>
              <td align="left">0x0102</td>
              <td align="left">TOKEN_EXPIRED</td>
              <td align="left">
                <xref target="errors"/></td>
            </tr>
            <tr>
              <td align="left">0x0103</td>
              <td align="left">TOKEN_REPLAYED</td>
              <td align="left">
                <xref target="errors"/></td>
            </tr>
            <tr>
              <td align="left">0x0104</td>
              <td align="left">SCOPE_MISMATCH</td>
              <td align="left">
                <xref target="errors"/></td>
            </tr>
            <tr>
              <td align="left">0x0105</td>
              <td align="left">ISSUER_UNKNOWN</td>
              <td align="left">
                <xref target="errors"/></td>
            </tr>
            <tr>
              <td align="left">0x0106</td>
              <td align="left">TOKEN_MALFORMED</td>
              <td align="left">
                <xref target="errors"/></td>
            </tr>
            <tr>
              <td align="left">0x0107-0x01FF</td>
              <td align="left">Unassigned</td>
              <td align="left"> </td>
            </tr>
          </tbody>
        </table>
        <t>New entries in this registry require Specification Required registration policy.
Values are allocated from the 0x0100-0x01FF range reserved for Privacy Pass
authorization errors.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="ARC">
          <front>
            <title>Anonymous Rate-Limited Credentials Cryptography</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="3" month="February" year="2026"/>
            <abstract>
              <t>   This document specifies the Anonymous Rate-Limited Credential (ARC)
   protocol, a specialization of keyed-verification anonymous
   credentials with support for rate limiting.  ARC credentials can be
   presented from client to server up to some fixed number of times,
   where each presentation is cryptographically bound to client secrets
   and application-specific public information, such that each
   presentation is unlinkable from the others as well as the original
   credential creation.  ARC is useful in applications where a server
   needs to throttle or rate-limit access from anonymous clients.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-arc-crypto-00"/>
        </reference>
        <reference anchor="MoQ-TRANSPORT">
          <front>
            <title>Media over QUIC Transport</title>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <date day="13" month="January" year="2026"/>
            <abstract>
              <t>   This document defines the core behavior for Media over QUIC Transport
   (MOQT), a media transport protocol designed to operate over QUIC and
   WebTransport, which have similar functionality.  MOQT allows a
   producer of media to publish data and have it consumed via
   subscription by a multiplicity of endpoints.  It supports
   intermediate content distribution networks and is designed for high
   scale and low latency distribution.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-16"/>
        </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="4" month="February" 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-00"/>
        </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="RFC9474">
          <front>
            <title>RSA Blind Signatures</title>
            <author fullname="F. Denis" initials="F." surname="Denis"/>
            <author fullname="F. Jacobs" initials="F." surname="Jacobs"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document specifies an RSA-based blind signature protocol. RSA blind signatures were first introduced by Chaum for untraceable payments. A signature that is output from this protocol can be verified as an RSA-PSS signature.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9474"/>
          <seriesInfo name="DOI" value="10.17487/RFC9474"/>
        </reference>
        <reference anchor="RFC9497">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) Using Prime-Order Groups</title>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="December" year="2023"/>
            <abstract>
              <t>An Oblivious Pseudorandom Function (OPRF) is a two-party protocol between a client and a server for computing the output of a Pseudorandom Function (PRF). The server provides the PRF private key, and the client provides the PRF input. At the end of the protocol, the client learns the PRF output without learning anything about the PRF private key, and the server learns neither the PRF input nor output. An OPRF can also satisfy a notion of 'verifiability', called a VOPRF. A VOPRF ensures clients can verify that the server used a specific private key during the execution of the protocol. A VOPRF can also be partially oblivious, called a POPRF. A POPRF allows clients and servers to provide public input to the PRF computation. This document specifies an OPRF, VOPRF, and POPRF instantiated within standard prime-order groups, including elliptic curves. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9497"/>
          <seriesInfo name="DOI" value="10.17487/RFC9497"/>
        </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="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="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="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="RFC9458">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="January" year="2024"/>
            <abstract>
              <t>This document describes Oblivious HTTP, a protocol for forwarding encrypted HTTP messages. Oblivious HTTP allows a client to make multiple requests to an origin server without that server being able to link those requests to the client or to identify the requests as having come from the same client, while placing only limited trust in the nodes used to forward the messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9458"/>
          <seriesInfo name="DOI" value="10.17487/RFC9458"/>
        </reference>
        <reference anchor="PRIVACYPASS-BATCHED">
          <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="25" month="February" 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-07"/>
        </reference>
        <reference anchor="PRIVACYPASS-IANA" target="https://www.iana.org/assignments/privacy-pass/privacy-pass.xhtml">
          <front>
            <title>Privacy Pass IANA</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="PRIVACYPASS-REVERSE-FLOW">
          <front>
            <title>Privacy Pass Reverse Flow</title>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare Inc.</organization>
            </author>
            <date day="16" month="February" year="2026"/>
            <abstract>
              <t>   This document specifies an instantiation of Privacy Pass Architecture
   [RFC9576] 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>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-meunier-privacypass-reverse-flow-03"/>
        </reference>
      </references>
    </references>
    <?line 1094?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
    <section anchor="change-log">
      <name>Change Log</name>
      <t>RFC Editor's Note: Please remove this section prior to publication of
a final version of this document.</t>
      <section anchor="since-draft-ietf-moq-privacy-pass-auth-02">
        <name>Since draft-ietf-moq-privacy-pass-auth-02</name>
        <ul spacing="normal">
          <li>
            <t>Expanded reverse flow documentation with three-phase flow (bootstrap, exchange, operations)</t>
          </li>
          <li>
            <t>Defined MoQAuthChallenge structure for error responses with supported_token_types</t>
          </li>
          <li>
            <t>Added TokenChallenge construction requirements</t>
          </li>
          <li>
            <t>Added control message authorization failure handling section</t>
          </li>
          <li>
            <t>Documented credential request/response encoding for different token types</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-moq-privacy-pass-auth-01">
        <name>Since draft-ietf-moq-privacy-pass-auth-01</name>
        <ul spacing="normal">
          <li>
            <t>Replace text-based moq-scope with binary TLS presentation language structures</t>
          </li>
          <li>
            <t>Add MoQ Actions registry aligned with MoQTransport control message types</t>
          </li>
          <li>
            <t>Add Match Types registry with exact, prefix, suffix, and contains matching</t>
          </li>
          <li>
            <t>Define MoQAuthorizationInfo structure for origin_info encoding</t>
          </li>
          <li>
            <t>Add continuous authorization section using reverse flow</t>
          </li>
          <li>
            <t>Add continuous authorization section using batched tokens</t>
          </li>
          <li>
            <t>Add IANA registries for auth schemes, actions, and match types</t>
          </li>
          <li>
            <t>Define error handling</t>
          </li>
          <li>
            <t>Integrate privacy pass reverse flow within PrivateTokenAuth</t>
          </li>
          <li>
            <t>MoQ definition now follow draft-ietf-moq-transport-16</t>
          </li>
          <li>
            <t>Update dependencies</t>
          </li>
          <li>
            <t>Removed b64 encoding given MoQ can use bytes directly</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-moq-privacy-pass-auth-00">
        <name>Since draft-ietf-moq-privacy-pass-auth-00</name>
        <ul spacing="normal">
          <li>
            <t>Add Thibault Meunier as Coauthor</t>
          </li>
          <li>
            <t>Add support for Reverse flow to be deploy and scale friendly way to get tokens</t>
          </li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
