<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-moq-privacy-pass-auth-01" 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-01"/>
    <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="2025" month="October" day="20"/>
    <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 access to 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.</t>
        </li>
        <li>
          <t><strong>MoQ Relay/Origin</strong>: The MoQ relay server or origin that forwards media
content and requires authorization. The relay validates Privacy Pass tokens,
enforces access policies, and forwards authorized requests to origins or 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="shared-origin-attester-issuer-with-a-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 role, 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>With <xref target="PRIVACYPASS-ARC"/>, the flow would look as follow</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="736" viewBox="0 0 736 256" 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 32,48 L 32,80" fill="none" stroke="black"/>
              <path d="M 64,80 L 64,240" fill="none" stroke="black"/>
              <path d="M 160,48 L 160,80" fill="none" stroke="black"/>
              <path d="M 176,48 L 176,80" fill="none" stroke="black"/>
              <path d="M 224,80 L 224,240" fill="none" stroke="black"/>
              <path d="M 272,48 L 272,80" fill="none" stroke="black"/>
              <path d="M 272,144 L 272,160" fill="none" stroke="black"/>
              <path d="M 296,48 L 296,80" fill="none" stroke="black"/>
              <path d="M 376,48 L 376,80" fill="none" stroke="black"/>
              <path d="M 408,80 L 408,240" fill="none" stroke="black"/>
              <path d="M 448,48 L 448,80" fill="none" stroke="black"/>
              <path d="M 504,32 L 504,80" fill="none" stroke="black"/>
              <path d="M 528,48 L 528,80" fill="none" stroke="black"/>
              <path d="M 568,80 L 568,96" fill="none" stroke="black"/>
              <path d="M 568,128 L 568,240" fill="none" stroke="black"/>
              <path d="M 616,48 L 616,80" fill="none" stroke="black"/>
              <path d="M 632,48 L 632,80" fill="none" stroke="black"/>
              <path d="M 664,80 L 664,240" fill="none" stroke="black"/>
              <path d="M 704,48 L 704,80" fill="none" stroke="black"/>
              <path d="M 728,48 L 728,80" fill="none" stroke="black"/>
              <path d="M 8,32 L 280,32" fill="none" stroke="black"/>
              <path d="M 504,32 L 712,32" fill="none" stroke="black"/>
              <path d="M 32,48 L 160,48" fill="none" stroke="black"/>
              <path d="M 176,48 L 272,48" fill="none" stroke="black"/>
              <path d="M 376,48 L 448,48" fill="none" stroke="black"/>
              <path d="M 528,48 L 616,48" fill="none" stroke="black"/>
              <path d="M 632,48 L 704,48" fill="none" stroke="black"/>
              <path d="M 32,80 L 160,80" fill="none" stroke="black"/>
              <path d="M 176,80 L 272,80" fill="none" stroke="black"/>
              <path d="M 376,80 L 448,80" fill="none" stroke="black"/>
              <path d="M 528,80 L 616,80" fill="none" stroke="black"/>
              <path d="M 632,80 L 704,80" fill="none" stroke="black"/>
              <path d="M 24,96 L 56,96" fill="none" stroke="black"/>
              <path d="M 72,96 L 216,96" fill="none" stroke="black"/>
              <path d="M 232,96 L 280,96" fill="none" stroke="black"/>
              <path d="M 520,96 L 560,96" fill="none" stroke="black"/>
              <path d="M 576,96 L 656,96" fill="none" stroke="black"/>
              <path d="M 672,96 L 712,96" fill="none" stroke="black"/>
              <path d="M 416,112 L 480,112" fill="none" stroke="black"/>
              <path d="M 608,112 L 664,112" fill="none" stroke="black"/>
              <path d="M 232,128 L 264,128" fill="none" stroke="black"/>
              <path d="M 368,128 L 408,128" fill="none" stroke="black"/>
              <path d="M 208,176 L 224,176" fill="none" stroke="black"/>
              <path d="M 224,208 L 264,208" fill="none" stroke="black"/>
              <path d="M 384,208 L 400,208" fill="none" stroke="black"/>
              <path d="M 280,32 C 288.83064,32 296,39.16936 296,48" fill="none" stroke="black"/>
              <path d="M 712,32 C 720.83064,32 728,39.16936 728,48" fill="none" stroke="black"/>
              <path d="M 24,96 C 15.16936,96 8,88.83064 8,80" fill="none" stroke="black"/>
              <path d="M 280,96 C 288.83064,96 296,88.83064 296,80" fill="none" stroke="black"/>
              <path d="M 520,96 C 511.16936,96 504,88.83064 504,80" fill="none" stroke="black"/>
              <path d="M 712,96 C 720.83064,96 728,88.83064 728,80" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="424,112 412,106.4 412,117.6" fill="black" transform="rotate(180,416,112)"/>
              <polygon class="arrowhead" points="408,208 396,202.4 396,213.6" fill="black" transform="rotate(0,400,208)"/>
              <polygon class="arrowhead" points="240,128 228,122.4 228,133.6" fill="black" transform="rotate(180,232,128)"/>
              <g class="text">
                <text x="68" y="68">Origin</text>
                <text x="124" y="68">Issuer</text>
                <text x="200" y="68">MoQ</text>
                <text x="240" y="68">Relay</text>
                <text x="412" y="68">Client</text>
                <text x="572" y="68">Attester</text>
                <text x="668" y="68">Issuer</text>
                <text x="544" y="116">TokenResponse</text>
                <text x="304" y="132">Request</text>
                <text x="296" y="148">Token</text>
                <text x="328" y="164">TokenRequestO</text>
                <text x="76" y="180">&lt;-</text>
                <text x="144" y="180">TokenRequestO</text>
                <text x="72" y="196">-</text>
                <text x="140" y="196">TokenResponseO</text>
                <text x="212" y="196">-&gt;</text>
                <text x="308" y="212">Response</text>
                <text x="328" y="228">+TokenResponseO</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+----------------------------------.                          +--------------------------.
|  +---------------+ +-----------+  |         +--------+      |  +----------+ +--------+  |
|  | Origin Issuer | | MoQ Relay |  |         | Client |      |  | Attester | | Issuer |  |
|  +---+-----------+ +-----+-----+  |         +---+----+      |  +----+-----+ +---+----+  |
 `-----|-------------------|-------'              |            `------|-----------|------'
       |                   |                      |<-------- TokenResponse -------+
       |                   |<---- Request    -----+                   |           |
       |                   |     +Token           |                   |           |
       |                   |     +TokenRequestO   |                   |           |
       |<- TokenRequestO --+                      |                   |           |
       +- TokenResponseO ->|                      |                   |           |
       |                   +----- Response     -->|                   |           |
       |                   |     +TokenResponseO  |                   |           |
       |                   |                      |                   |           |
]]></artwork>
        </artset>
        <t><tt>TokenRequestO</tt> and <tt>TokenResponseO</tt> are part of a reverse flow. The client request a
new token/credential to the origin. It allows the client to exchange
its initial 0x0002 <tt>Token</tt> against a privately verifiable token
issued by the origin.</t>
        <t><tt>TokenRequestO</tt> should correspond to the associated privately verifiable token
definition. These are listed in <xref target="moq-token-types"/>.</t>
        <t>All privately verifiable scheme allow to amortise token issuance cost, making them
more compelling in a streaming case. This is specified in <xref section="5" sectionFormat="of" target="PRIVACYPASS-BATCHED"/>.</t>
        <t>When using <tt>0xE5AC</tt>, <tt>TokenRequestO</tt> is a <tt>CredentialRequest</tt> defined in <xref section="7.1" sectionFormat="of" target="PRIVACYPASS-ARC"/>.</t>
      </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>Issuer and attesters do not collude to guarantee
unlinkability properties</t>
          </li>
          <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:</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, the origin_info field contains MoQ-specific authorization scope
information encoded as a UTF-8 string with the following format:</t>
          <ul empty="true">
            <li>
              <t>TODO: Define origin_info to be binary format using TLS presentation language
For anonymous credentials, it would make a lot more sense to use redemption_context
instead of origin_info, as redemption_context is decided upon at presentation time
rather than at issuance time.
Question that I don't have the answer yet: are 32-bytes enough? we might need to say
something like "first 2 bytes represent the type of rule, then data"</t>
            </li>
          </ul>
          <artwork><![CDATA[
moq-scope = operation ":" namespace-pattern [":" track-pattern]
operation = "subscribe" / "fetch" / "publish" / "announce"
namespace-pattern = exact-match / prefix-match
track-pattern = exact-match / prefix-match
exact-match = namespace/name-string
prefix-match = namespace/name-string"*"
]]></artwork>
          <t>Examples:</t>
          <ul spacing="normal">
            <li>
              <t><tt>subscribe:sports.example.com/live/*</tt> - Subscribe to any track under live
sports</t>
            </li>
            <li>
              <t><tt>fetch:vod.example.com/movies/action*</tt> - Fetch video-on-demand action content</t>
            </li>
            <li>
              <t><tt>publish:meetings.example.com/meeting/m123/audio/opus48000</tt> - Publish content
for meeting m123</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="track-namespace-and-track-name-matching-rules">
        <name>Track Namespace and Track Name Matching Rules</name>
        <t>This specification defines prefix-based matching rules for track namespaces
and track names to enable fine-grained access control while maintaining
privacy.</t>
        <section anchor="namespace-matching">
          <name>Namespace Matching</name>
          <t>Track namespace matching supports three modes:</t>
          <t><strong>Exact Match</strong>:</t>
          <ul spacing="normal">
            <li>
              <t>Pattern: <tt>"example.com/live/sports/soccer"</tt></t>
            </li>
            <li>
              <t>Matches: Only the exact namespace <tt>example.com/live/sports/soccer</tt></t>
            </li>
          </ul>
          <t><strong>Prefix Match</strong>:</t>
          <ul spacing="normal">
            <li>
              <t>Pattern: <tt>"example.com/live/sports/*"</tt></t>
            </li>
            <li>
              <t>Matches: Any namespace starting with <tt>example.com/live/sports/</tt></t>
            </li>
            <li>
              <t>Examples: <tt>example.com/live/sports/soccer</tt>,
<tt>example.com/live/sports/tennis</tt></t>
            </li>
          </ul>
        </section>
        <section anchor="track-name-matching">
          <name>Track Name Matching</name>
          <t>Track name matching within authorized namespaces follows the same pattern:</t>
          <t><strong>Exact Match</strong>:</t>
          <ul spacing="normal">
            <li>
              <t>Pattern: <tt>"video"</tt></t>
            </li>
            <li>
              <t>Matches: Only tracks named exactly <tt>video</tt></t>
            </li>
          </ul>
          <t><strong>Prefix Match</strong>:</t>
          <ul spacing="normal">
            <li>
              <t>Pattern: <tt>"video*"</tt></t>
            </li>
            <li>
              <t>Matches: Any track name starting with <tt>video</tt></t>
            </li>
            <li>
              <t>Examples: <tt>video-med</tt>, <tt>video-high</tt>, <tt>video-low</tt></t>
            </li>
          </ul>
        </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>
          <ol spacing="normal" type="1"><li>
              <t>Extract the Privacy Pass token from the MoQ control
message (SETUP, SUBSCRIBE, FETCH, PUBLISH, or ANNOUNCE)</t>
            </li>
            <li>
              <t>Verify the token signature using the appropriate
issuer public key based on the token type:  </t>
              <ul spacing="normal">
                <li>
                  <t>For Token Type 0x0001 (VOPRF(P-384, SHA-384)): Use the issuer's private validation key</t>
                </li>
                <li>
                  <t>For Token Type 0x0002 (Blind RSA(2048 bits)): Use the issuer's public verification key</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Validate that the token has not been replayed by checking:  </t>
              <ul spacing="normal">
                <li>
                  <t>Token nonce uniqueness within the issuer's replay window</t>
                </li>
                <li>
                  <t>Token expiration timestamp (if present in token metadata)</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Extract the MoQ-specific authorization scope from the token's origin_info
field:  </t>
              <ul spacing="normal">
                <li>
                  <t>Authorized operation type (subscribe, fetch, publish, announce)</t>
                </li>
                <li>
                  <t>Namespace pattern (exact match or prefix match)</t>
                </li>
                <li>
                  <t>Track name pattern (exact match or prefix match, optional)</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Verify that the requested MoQ operation matches the operation specified
in the token scope:  </t>
              <ul spacing="normal">
                <li>
                  <t>SUBSCRIBE operations require "subscribe" scope</t>
                </li>
                <li>
                  <t>FETCH operations require "fetch" scope</t>
                </li>
                <li>
                  <t>PUBLISH operations require "publish" scope</t>
                </li>
                <li>
                  <t>ANNOUNCE operations require "announce" scope</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Apply namespace/name matching rules based on the pattern type:  </t>
              <ul spacing="normal">
                <li>
                  <t>If Exact Match, the requested namespace/name <bcp14>MUST</bcp14> exactly equal the pattern</t>
                </li>
                <li>
                  <t>If Prefix Match, the requested namespace/name <bcp14>MUST</bcp14> start with the pattern prefix</t>
                </li>
              </ul>
            </li>
          </ol>
          <t>Access is granded to the requested resource if and only if ALL of the following
conditions are met:</t>
          <ul spacing="normal">
            <li>
              <t>Token signature verification succeeds</t>
            </li>
            <li>
              <t>Token nonce has not been previously used (replay protection)</t>
            </li>
            <li>
              <t>Token has not expired (if applicable)</t>
            </li>
            <li>
              <t>Requested operation matches token operation scope</t>
            </li>
            <li>
              <t>Requested namespace matches token namespace pattern</t>
            </li>
            <li>
              <t>Requested track name matches token track name pattern (if specified)
specified)</t>
            </li>
          </ul>
          <t>else, authorzation error is returned to the requesting client.</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:</t>
          <artwork><![CDATA[
SETUP {
    Version = 1,
    Parameters = [
        {
            Type = AUTHORIZATION,
            Value = base64url(PrivateTokenAuth)
        }
    ]
}

struct {
    uint8_t auth_scheme = 0x01; // Privacy Pass
    opaque token_data<1..2^16-1>;
} PrivateTokenAuth;
]]></artwork>
        </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 = base64url(PrivateTokenAuth)
        }
    ]
}
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="example-authorization-flow">
      <name>Example Authorization Flow</name>
      <t>Below shows an example deployment scenarios 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 uses token with public verifiability.</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="304" width="576" viewBox="0 0 576 304" 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,224" fill="none" stroke="black"/>
              <path d="M 56,256 L 56,288" fill="none" stroke="black"/>
              <path d="M 104,32 L 104,64" fill="none" stroke="black"/>
              <path d="M 240,32 L 240,64" fill="none" stroke="black"/>
              <path d="M 272,64 L 272,288" fill="none" stroke="black"/>
              <path d="M 312,32 L 312,64" fill="none" stroke="black"/>
              <path d="M 392,32 L 392,64" fill="none" stroke="black"/>
              <path d="M 432,64 L 432,144" fill="none" stroke="black"/>
              <path d="M 432,192 L 432,288" fill="none" stroke="black"/>
              <path d="M 480,32 L 480,64" fill="none" stroke="black"/>
              <path d="M 496,32 L 496,64" fill="none" stroke="black"/>
              <path d="M 528,64 L 528,288" fill="none" stroke="black"/>
              <path d="M 568,32 L 568,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 104,32" fill="none" stroke="black"/>
              <path d="M 240,32 L 312,32" fill="none" stroke="black"/>
              <path d="M 392,32 L 480,32" fill="none" stroke="black"/>
              <path d="M 496,32 L 568,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 104,64" fill="none" stroke="black"/>
              <path d="M 240,64 L 312,64" fill="none" stroke="black"/>
              <path d="M 392,64 L 480,64" fill="none" stroke="black"/>
              <path d="M 496,64 L 568,64" fill="none" stroke="black"/>
              <path d="M 56,112 L 80,112" fill="none" stroke="black"/>
              <path d="M 216,112 L 264,112" fill="none" stroke="black"/>
              <path d="M 280,126 L 296,126" fill="none" stroke="black"/>
              <path d="M 280,130 L 296,130" fill="none" stroke="black"/>
              <path d="M 408,126 L 424,126" fill="none" stroke="black"/>
              <path d="M 408,130 L 424,130" fill="none" stroke="black"/>
              <path d="M 272,160 L 344,160" fill="none" stroke="black"/>
              <path d="M 464,160 L 520,160" fill="none" stroke="black"/>
              <path d="M 280,176 L 344,176" fill="none" stroke="black"/>
              <path d="M 472,176 L 528,176" fill="none" stroke="black"/>
              <path d="M 64,208 L 96,208" fill="none" stroke="black"/>
              <path d="M 240,208 L 272,208" fill="none" stroke="black"/>
              <path d="M 24,224 L 144,224" fill="none" stroke="black"/>
              <path d="M 24,256 L 144,256" fill="none" stroke="black"/>
              <path d="M 56,272 L 72,272" fill="none" stroke="black"/>
              <path d="M 240,272 L 264,272" fill="none" stroke="black"/>
              <path d="M 24,224 C 15.16936,224 8,231.16936 8,240" fill="none" stroke="black"/>
              <path d="M 144,224 C 152.83064,224 160,231.16936 160,240" fill="none" stroke="black"/>
              <path d="M 24,256 C 15.16936,256 8,248.83064 8,240" fill="none" stroke="black"/>
              <path d="M 144,256 C 152.83064,256 160,248.83064 160,240" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="528,160 516,154.4 516,165.6" fill="black" transform="rotate(0,520,160)"/>
              <polygon class="arrowhead" points="432,128 420,122.4 420,133.6" fill="black" transform="rotate(0,424,128)"/>
              <polygon class="arrowhead" points="288,176 276,170.4 276,181.6" fill="black" transform="rotate(180,280,176)"/>
              <polygon class="arrowhead" points="288,128 276,122.4 276,133.6" fill="black" transform="rotate(180,280,128)"/>
              <polygon class="arrowhead" points="272,272 260,266.4 260,277.6" fill="black" transform="rotate(0,264,272)"/>
              <polygon class="arrowhead" points="272,112 260,106.4 260,117.6" fill="black" transform="rotate(0,264,112)"/>
              <polygon class="arrowhead" points="72,208 60,202.4 60,213.6" fill="black" transform="rotate(180,64,208)"/>
              <g class="text">
                <text x="32" y="52">MoQ</text>
                <text x="72" y="52">Relay</text>
                <text x="276" y="52">Client</text>
                <text x="436" y="52">Attester</text>
                <text x="532" y="52">Issuer</text>
                <text x="68" y="100">&lt;-</text>
                <text x="112" y="100">Request</text>
                <text x="176" y="100">Service</text>
                <text x="236" y="100">Access</text>
                <text x="148" y="116">TokenChallenge</text>
                <text x="352" y="132">Attestation</text>
                <text x="404" y="164">TokenRequest</text>
                <text x="408" y="180">TokenResponse</text>
                <text x="168" y="212">SUBSCRIBE+Token</text>
                <text x="40" y="244">Local</text>
                <text x="108" y="244">validation</text>
                <text x="156" y="276">SUBSCRIBE_OK+Media</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+-----------+                +--------+         +----------+ +--------+
| MoQ Relay |                | Client |         | Attester | | Issuer |
+-----+-----+                +---+----+         +----+-----+ +---+----+
      |                          |                   |           |
      |<- Request Service Access +                   |           |
      +--- TokenChallenge ------>|                   |           |
      |                          |<== Attestation ==>|           |
      |                          |                   |           |
      |                          +--------- TokenRequest ------->|
      |                          |<-------- TokenResponse -------+
      |                          |                   |           |
      |<---- SUBSCRIBE+Token ----+                   |           |
 .----+-----------.              |                   |           |
| Local validation |             |                   |           |
 `----+-----------'              |                   |           |
      +-- SUBSCRIBE_OK+Media --->|                   |           |
      |                          |                   |           |
]]></artwork>
        </artset>
      </figure>
    </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>
      <t>TODO</t>
      <ul spacing="normal">
        <li>
          <t>Register namespace?</t>
        </li>
        <li>
          <t>New registry for auth_scheme with 0x01 as the first registered auth_scheme</t>
        </li>
      </ul>
    </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</title>
            <author fullname="Cathie Yun" initials="C." surname="Yun">
              <organization>Apple, Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Apple, Inc.</organization>
            </author>
            <date day="6" month="August" year="2025"/>
            <abstract>
              <t>   This document specifies the 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-yun-cfrg-arc-01"/>
        </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="2" month="September" year="2025"/>
            <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-14"/>
        </reference>
        <reference anchor="PRIVACYPASS-ARC">
          <front>
            <title>Privacy Pass Issuance Protocol for Anonymous Rate-Limited Credentials</title>
            <author fullname="Cathie Yun" initials="C." surname="Yun">
              <organization>Apple, Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Apple, Inc.</organization>
            </author>
            <date day="6" month="August" year="2025"/>
            <abstract>
              <t>   This document specifies the issuance and redemption protocols for
   tokens based on the Anonymous Rate-Limited Credential (ARC) protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-yun-privacypass-arc-01"/>
        </reference>
        <reference anchor="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="3" month="July" year="2025"/>
            <abstract>
              <t>   This document specifies two variants of the Privacy Pass issuance
   protocol that allow for batched issuance of tokens.  These allow
   clients to request more than one token at a time and for issuers to
   issue more than one token at a time.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-batched-tokens-05"/>
        </reference>
        <reference anchor="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>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
      </references>
    </references>
    <?line 497?>

<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-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>
