<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-moq-c4m-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="CAT-4-MOQT">Authorization scheme for MOQT using Common Access Tokens</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-moq-c4m-01"/>
    <author initials="W." surname="Law" fullname="Will Law">
      <organization>Akamai</organization>
      <address>
        <email>wilaw@akamai.com</email>
      </address>
    </author>
    <author initials="C." surname="Lemmons" fullname="Chris Lemmons">
      <organization>Comcast</organization>
      <address>
        <email>Chris_Lemmons@comcast.com</email>
      </address>
    </author>
    <author initials="G." surname="Simon" fullname="Gwendal Simon">
      <organization>Synamedia</organization>
      <address>
        <email>gsimon@synamedia.com</email>
      </address>
    </author>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <date year="2026" month="June" day="18"/>
    <area/>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword>
    <keyword>authorization</keyword>
    <keyword>common access token</keyword>
    <keyword>CAT</keyword>
    <abstract>
      <?line 75?>

<t>A token-based authorization scheme for use with Media Over QUIC Transport.</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/CAT-4-MOQT/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-moq-c4m/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC  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/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/moq-wg/CAT-4-MOQT"/>.</t>
    </note>
  </front>
  <middle>
    <?line 80?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This draft introduces a token-based authorization scheme for use with MOQT <xref target="MoQTransport"/>.
The scheme protects access to the relay during session establishment and also contrains the
actions which the client may take once connected.</t>
      <t>This draft defines version 1 of this specification.</t>
      <section anchor="overview-of-the-authorization-workflow">
        <name>Overview of the authorization workflow</name>
        <ul spacing="normal">
          <li>
            <t>An end-user logs-in to a distribution service. The service authenticates the user (via
username/password, OAuth, 2FA or another method). The methods involved in this authentication step
lie outside the scope of this draft.</t>
          </li>
          <li>
            <t>Based upon the identity and permissions granted to that end-user, the service generates a token. A
token is a data structure that has been serialized into a byte array. The token encodes information
such as the user's ID, constraints on how and when they can access the MOQT distribution network and
contraints on the actions they can take once connected. The token may be signed to make it
tamper-resistent.</t>
          </li>
          <li>
            <t>The token is given in the clear to the end-user, along with a URL to connect to the edge relay of a MOQT
distribution network. The edge relay is part of a trusted MOQT distribution network. It has previously
shared secrets with the distribution service, so that this relay is entitled to decrypt related tokens and
to validate signatures.</t>
          </li>
          <li>
            <t>The end-user client application provides the token to the MOQT distribution relay when it connects. This
connection may be established over WebTransport or raw QUIC.</t>
          </li>
          <li>
            <t>The relay decrypts the token upon receipt and validates the signature. Based upon claims conveyed in
the token, the relay accepts or rejects the connection.</t>
          </li>
          <li>
            <t>If the relay accepts the connection, then the client will take a series of MOQT actions: PUBLISH_NAMESPACE,
SUBSCRIBE_NAMESPACE, SUBSCRIBE or FETCH. For each of these, it will supply the token it received using
the AUTHENTICATION parameter.</t>
          </li>
          <li>
            <t>As an alternative to this workflow, the distribution service may vend multiple tokens to the client. The
client may use one of those tokens to establish the initial conneciton and others to authorize its actions.</t>
          </li>
        </ul>
        <sourcecode type="ascii"><![CDATA[
     End User              Distribution Service         MOQT Relay
        |                         |                         |
        |                         |  0. Share secrets       |
        |                         |<----------------------->|
        |                         |   (offline/pre-setup)   |
        |                         |                         |
        |  1. Login/Authenticate  |                         |
        |<----------------------->|                         |
        |                         |                         |
        |  2. Generate C4M Token  |                         |
        |       + Relay URL       |                         |
        |<------------------------|                         |
        |                         |                         |
        |  3. Connect to Relay with Token                   |
        |-------------------------------------------------->|
        |                         |                         |
        |                         |  4. Validate Token      |
        |                         |<----------------------->|
        |                         | (previously shared      |
        |                         |     secrets)            |
        |                         |                         |
        |  5. Accept/Reject Connection                      |
        |<--------------------------------------------------|
        |                         |                         |
        |  6. MOQT Actions with Token Authorization         |
        |<------------------------------------------------->|
        |     (PUBLISH_NAMESPACE, SUBSCRIBE, PUBLISH, FETCH)|
        |                         |                         |
        |                         |  7. Revalidate Token    |
        |                         |<----------------------->|
        |                         |   (if moqt-reval set,   |
        |                         |    repeats at interval  |
        |                         |    e.g., every 5 min)   |
]]></sourcecode>
      </section>
    </section>
    <section anchor="token-format">
      <name>Token format</name>
      <t>This draft uses a single token format, namely the Common Access Token (CAT) <xref target="CAT"/>. The token is supplied
as a byte array. When it must be cast to a string for inclusion in a URL, it is Base64 encoded <xref target="BASE64"/>.</t>
      <t>To provide control over the MOQT actions, this draft defines a new CBOR Web Token (CWT) Claim called "moqt".
Use of the moqt claim is optional for clients. Support for processing the moqt claim is mandatory for relays.</t>
      <t>The default for all actions is "Blocked" and this does not need to be communicated in the token.
As soon as a token is provided, all actions are explicitly blocked unless explicitly enabled.</t>
      <section anchor="moqt-claim">
        <name>moqt claim</name>
        <t>The "moqt" claim is defined by the following CDDL:</t>
        <artwork><![CDATA[
$$Claims-Set-Claims //= (moqt-label => moqt-value)
moqt-label = TBD_MOQT
moqt-value = [ + moqt-scope ]
moqt-scope = [ moqt-actions, ? [ + moqt-ns-match ], ? moqt-track-match ]
moqt-actions = [ + moqt-action ]
moqt-action = int
moqt-ns-match = bin-match / nil
moqt-track-match = bin-match

bin-match = bstr / [ match-type, match-value ]
match-type = prefix-match / suffix-match
match-value = bstr

prefix-match = 1
suffix-match = 2
]]></artwork>
        <t>The "moqt" claim bounds the scope of MOQT actions for which the token can provide
access. It is an array of action scopes. Each scope is an array with three
elements: an array of integers that identifies the actions, an array of match objects for
the namespace, and a match object for the track name.</t>
        <t>The actions are integers defined as follows:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Action</th>
              <th align="left">Key</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 target="MoQTransport"/> Section 9.3</td>
            </tr>
            <tr>
              <td align="left">SERVER_SETUP</td>
              <td align="left">1</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.3</td>
            </tr>
            <tr>
              <td align="left">PUBLISH_NAMESPACE</td>
              <td align="left">2</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.20</td>
            </tr>
            <tr>
              <td align="left">SUBSCRIBE_NAMESPACE</td>
              <td align="left">3</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.25</td>
            </tr>
            <tr>
              <td align="left">SUBSCRIBE</td>
              <td align="left">4</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.9</td>
            </tr>
            <tr>
              <td align="left">REQUEST_UPDATE</td>
              <td align="left">5</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.11</td>
            </tr>
            <tr>
              <td align="left">PUBLISH</td>
              <td align="left">6</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.13</td>
            </tr>
            <tr>
              <td align="left">FETCH</td>
              <td align="left">7</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.16</td>
            </tr>
            <tr>
              <td align="left">TRACK_STATUS</td>
              <td align="left">8</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.19</td>
            </tr>
          </tbody>
        </table>
        <t>The scope of the moqt claim is limited to the actions provided in the array.
Any action not present in the array is not authorized by moqt claim.</t>
        <t>When a match object is a byte string, it is an exact match. When a match object is an array, the first element is the match type and the second is the match value.</t>
        <t>Matches are performed bytewise against the corresponding field of the Full Track Name (as defined in Section 2.4.1 of <xref target="MoQTransport"/>). The first namespace match object is applied to the first field in the Track Namespace, and so on. The match for the track name is matched against the Track Name.</t>
        <t>Exact matches must match exactly, prefix matches must match the beginning of the byte string, and suffix matches must match the end of the byte string.</t>
        <t>The track namespace match and track name match are optional. If the length of the scope array is two, then no track name match is performed at all and the scope of the token includes all track names. If the length is one, the scope includes all namespaces as well as no matching is performed. The list of actions is mandatory.</t>
        <t>A nil match object is special: it only matches the end of the list of namespaces. This allows the scope to be limited to a precise namespace length. If the list of namespace match objects does not end with a nil match object, then the scope includes all longer namespaces that start with fields that match. Note that nil <bcp14>MUST</bcp14> only appear as the last element in the namespace match array; placing nil elsewhere is invalid.</t>
        <t>No normalization is applied to the values against which to match; it is performed bytewise.</t>
        <section anchor="text-examples-of-permissions-to-help-with-cddl-construction">
          <name>Text examples of permissions to help with CDDL construction</name>
          <section anchor="notation-used-in-examples">
            <name>Notation Used in Examples</name>
            <t>Full Track Names in this draft are represented using Extended Diagnostic Notation (EDN) as defined in <xref target="EDN"/> as an array with two elements: an array of namespace fields and a track name.</t>
            <t>Example: Allow with an exact match <tt>[['example','com'],'/bob']</tt></t>
            <artwork><![CDATA[
{
    /moqt/ TBD_MOQT: [[
        [ /ANNOUNCE/ 2, /SUBSCRIBE_NAMESPACE/ 3, /PUBLISH/ 6, /FETCH/ 7 ],
        ['example','com',nil],
        '/bob'
    ]]
}
]]></artwork>
            <artwork><![CDATA[
Permits
* [['example','com'], '/bob']

Prohibits
* [['example','com'], '']
* [['example','com'], '/bob/123']
* [['example','com'], '/alice']
* [['example','com'], '/bob/logs']
* [['alternate','example','com'], '/bob']
* [['12345'], '']
* [['example'], 'com/bob']
* [['example','com','/bob'], '']
* [['example','com',''], '/bob']
]]></artwork>
            <t>Example: Allow with a prefix match <tt>[['example','com'],'/bob']</tt></t>
            <artwork><![CDATA[
{
    /moqt/ TBD_MOQT: [[
        [ /ANNOUNCE/ 2, /SUBSCRIBE_NAMESPACE/ 3, /PUBLISH/ 6, /FETCH/ 7 ],
        ['example','com',nil],
        [ /prefix/ 1, '/bob']
    ]]
}
]]></artwork>
            <artwork><![CDATA[
Permits
* [['example','com'], '/bob']
* [['example','com'], '/bob/123']
* [['example','com'], '/bob/logs']

Prohibits
* [['example','com'], '']
* [['example','com'], '/alice']
* [['alternate','example','com'], '/bob']
* [['12345'], '']
* [['example'], 'com/bob']
]]></artwork>
            <t>Example: Allow namespaces starting with <tt>['example','com']</tt> (any length) with exact track name <tt>'/bob'</tt></t>
            <artwork><![CDATA[
{
    /moqt/ TBD_MOQT: [[
        [ /PUBLISH_NAMESPACE/ 2, /SUBSCRIBE_NAMESPACE/ 3, /PUBLISH/ 6, /FETCH/ 7 ],
        { /exact/ 0: 'example.com'},
        { /exact/ 0: '/bob'}
    ]]
}
]]></artwork>
            <artwork><![CDATA[
Permits
* [['example','com'], '/bob']
* [['example','com',''], '/bob']
* [['example','com','bob'], '/bob']

Prohibits
* [['example','com'], '']
* [['example','com'], '/bob/123']
* [['example','com'], '/alice']
* [['example','com'], '/bob/logs']
* [['alternate','example','com'], '/bob']
* [['12345'], '']
* [['example'], 'com/bob']
* [['example','com','/bob'], '']
]]></artwork>
            <t>Example: Allow namespaces starting with <tt>['example','com']</tt> with any track name</t>
            <artwork><![CDATA[
{
    /moqt/ TBD_MOQT: [[
        [ /PUBLISH_NAMESPACE/ 2, /SUBSCRIBE_NAMESPACE/ 3, /PUBLISH/ 6, /FETCH/ 7 ],
        ['example','com']
    ]]
}
]]></artwork>
            <artwork><![CDATA[
Permits
* [['example','com'], '/bob']
* [['example','com',''], '/bob']
* [['example','com','bob'], '/bob']
* [['example','com'], '']
* [['example','com'], '/bob/123']
* [['example','com'], '/alice']
* [['example','com'], '/bob/logs']
* [['example','com','/bob'], '']

Prohibits
* [['alternate','example','com'], '/bob']
* [['12345'], '']
* [['example'], 'com/bob']
]]></artwork>
            <t>Example: Allow with a prefix match on an individual namespace element</t>
            <t>This example shows how to use a prefix match within a specific namespace field. The second namespace element must start with <tt>'user-'</tt>.</t>
            <artwork><![CDATA[
{
    /moqt/ TBD_MOQT: [[
        [ /ANNOUNCE/ 2, /SUBSCRIBE_NAMESPACE/ 3, /PUBLISH/ 6, /FETCH/ 7 ],
        ['example', [ /prefix/ 1, 'user-'], nil],
        '/data'
    ]]
}
]]></artwork>
            <artwork><![CDATA[
Permits
* [['example','user-alice'], '/data']
* [['example','user-bob'], '/data']
* [['example','user-'], '/data']

Prohibits
* [['example','alice'], '/data']
* [['example','user-alice','extra'], '/data']
* [['example','USER-alice'], '/data']
* [['example'], '/data']
]]></artwork>
            <t>Example: Allow with a suffix match on track name</t>
            <t>This example demonstrates suffix matching, which matches the end of a byte string.</t>
            <artwork><![CDATA[
{
    /moqt/ TBD_MOQT: [[
        [ /PUBLISH/ 6 ],
        ['example','com',nil],
        [ /suffix/ 2, '.json']
    ]]
}
]]></artwork>
            <artwork><![CDATA[
Permits
* [['example','com'], 'data.json']
* [['example','com'], '/api/response.json']
* [['example','com'], '.json']

Prohibits
* [['example','com'], 'data.xml']
* [['example','com'], 'json']
* [['example','com'], 'data.JSON']
* [['example','com'], 'data.json.bak']
]]></artwork>
          </section>
        </section>
        <section anchor="multiple-actions">
          <name>Multiple actions</name>
          <t>Multiple actions may be communicated within the same token, with different
permissions. This can be facilitated by the logical claims defined in
<xref target="Composite"/> or simply by defining multiple limits,
depending on the required restrictions. In both cases, the order in which
limits are declared and evaluated is unimportant. The evaluation stops after
the first acceptable result is discovered.</t>
          <section anchor="example-of-evaluating-multiple-actions-in-the-same-token">
            <name>Example of evaluating multiple actions in the same token:</name>
            <artwork><![CDATA[
{
    /moqt/ TBD_MOQT: [
        [[/PUBLISH/ 6], ['example','com',nil], [ /prefix/ 1, '/bob']],
        [[/PUBLISH/ 6], ['example','com',nil], '/logs/12345/bob']
    ],
    /exp/ 4: 1750000000
}
]]></artwork>
            <ul spacing="normal">
              <li>
                <t>(1) PUBLISH (Allow with a prefix match on track name) [['example','com'], '/bob*']</t>
              </li>
              <li>
                <t>(2) PUBLISH (Allow with an exact match) [['example','com'], '/logs/12345/bob']</t>
              </li>
            </ul>
            <t>Evaluating <tt>[['example','com'],'/bob/123']</tt> would succeed on test 1 and test 2 would never be evaluated.
Evaluating <tt>[['example','com'],'/logs/12345/bob']</tt> would fail on test 1 but then succeed on test 2.
Evaluating <tt>[['example','com'],'']</tt> would fail on test 1 and on test 2.</t>
            <t>In addition, the entire token expires at 2025-05-02T21:57:24+00:00.</t>
          </section>
          <section anchor="example-of-evaluating-multiple-actions-with-related-claims">
            <name>Example of evaluating multiple actions with related claims:</name>
            <t>If there are other claims that depend on which MOQT limit applies, a logical claim is required:</t>
            <artwork><![CDATA[
{
    /or/ TBD_OR: [
        {
            /moqt/ TBD_MOQT: [[[/PUBLISH/ 6], ['example','com'], [ /prefix/ 1, 'bob']]],
            /exp/ 4: 1750000000
        },
        {
            /moqt/ TBD_MOQT: [[[/PUBLISH/ 6], ['example','com'], 'logs/12345/bob']],
            /exp/ 4: 1750000600
        }
    ]
}
]]></artwork>
            <t>This provides access to the same tracks as the previous example, but in this
case, the token is valid for publishing logs up to 10 minutes after the time at
which the publishing of the bob track expires.</t>
          </section>
        </section>
      </section>
      <section anchor="moqt-reval-claim">
        <name>moqt-reval claim</name>
        <t>The "moqt-reval" claim is defined by the following CDDL:</t>
        <artwork><![CDATA[
$$Claims-Set-Claims //= (moqt-reval-label => moqt-reval-value)
moqt-reval-label = TBD_MOQT_REVAL
moqt-reval-value = number
]]></artwork>
        <t>The "moqt-reval" claim indicates that the token must be
revalidated for ongoing streams. If the token is no longer acceptable, the
actions authorized by it <bcp14>MUST NOT</bcp14> be permitted to continue.</t>
        <t>The "moqt-reval-value" is a revalidation interval, expressed in seconds.
It provides an upper bound on how long a
token may be considered acceptable for an ongoing stream. A revalidator <bcp14>MAY</bcp14>
revalidate sooner.</t>
        <t>If the revalidation interval is smaller than the recipient is prepared
or able to revalidate, the recipient <bcp14>MUST</bcp14> reject the token. If a recipient is
unable to revalidate tokens, it <bcp14>MUST</bcp14> reject all tokens with a "moqt-reval"
claim.</t>
        <t>A token can be revalidated by simply validating it again, just as if it were
new. However, since some claims, signatures, MACs, and other attributes that
could contribute to unacceptability may be incapable of changing acceptability
in the duration, a revalidator may optimize by skipping some of the checks as
long as the outcome of the validation is the same. Revalidators <bcp14>SHOULD</bcp14> skip
reverifying MACs and signatures when the list of acceptable issuer keys is
unchanged.</t>
        <t>When the value of this claim is zero, the token <bcp14>MUST NOT</bcp14> be revalidated. This
is the default behaviour when the claim is not present.</t>
        <t>This claim <bcp14>MUST NOT</bcp14> be used outside of a base claimset. If used within a composition
claims, the token is not well-formed.</t>
        <t>The claim key for this claim is TBD_MOQT_REVAL and the claim value is a number.
Recipients <bcp14>MUST</bcp14> support this claim. This claim is <bcp14>OPTIONAL</bcp14> for issuers.</t>
      </section>
    </section>
    <section anchor="dpop-integration-with-cat-for-moqt">
      <name>DPoP Integration with CAT for MOQT</name>
      <t>This section defines the use of CAT's Demonstrating Proof of Possession (DPoP)
claims <xref target="DPoP"/> to enhance security in MOQT environments. This approach
leverages the CAT token's "cnf" (confirmation) claim with JWK Thumbprint
binding and the "catdpop" (CAT DPoP Settings) claim to provide
proof-of-possession capabilities that prevent token theft and replay
attacks in MOQT systems.</t>
      <section anchor="cat-dpop-claims-for-moqt">
        <name>CAT DPoP Claims for MOQT</name>
        <t>This proposal extends the CAT authorization model by binding tokens to
client cryptographic key pairs. To enable sender-constrained token usage,
the CAT tokens include DPoP-related claims as defined <xref target="CAT"/> Section 4.8,
ensuring that only the legitimate token holder can use the token for MOQT
operations.</t>
        <section anchor="confirmation-cnf-claim-with-jwk-thumbprint">
          <name>Confirmation (cnf) Claim with JWK Thumbprint</name>
          <t>DPoP binding is accomplished by providing the "cnf" claim with the "jkt"
(JWK Thumbprint) confirmation method.</t>
          <t>Below is an example showing jkt token binding.</t>
          <artwork><![CDATA[
{
  / cnf / 8: {
    / jkt / 3: h'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'  / 32-byte SHA-256 JWK thumbprint (hex-encoded) /
  },
  / moqt / TBD_MOQT: [
    [
      [/PUBLISH_NAMESPACE/ 2, /SUBSCRIBE_NAMESPACE/ 3, /PUBLISH/ 6, /FETCH/ 7],
      ['cdn','example','com',nil],
      [ /prefix/ 1, '/sports/']
    ]
  ],
  / catdpop /
  321: {
    0: 300,  / 5-minute window /
    1: 1     / Honor jti for replay protection /
  },
  / exp /
  4: 1750000000
}
]]></artwork>
          <t>Implementation Requirements:</t>
          <ul spacing="normal">
            <li>
              <t>Relay Validation: MOQT relays <bcp14>MUST</bcp14> verify that DPoP proofs are signed with
the private key corresponding to the "jkt" value</t>
            </li>
            <li>
              <t>Proof Binding: Relays <bcp14>MUST</bcp14> reject requests where DPoP proof validation or
key binding fails</t>
            </li>
            <li>
              <t>Processing Semantics: Relays <bcp14>MUST</bcp14> process DPoP proofs as Protected Resource
Access requests per <xref target="DPoP"/> Section 7</t>
            </li>
          </ul>
        </section>
        <section anchor="dpop-extension-with-application-agnostic-proof-framework">
          <name>DPoP Extension with Application-Agnostic Proof Framework</name>
          <t>This section defines the use of DPoP with an application-agnostic proof
framework as specified in <xref target="DPOP-PROOF"/>, which
extends the traditional HTTP-centric DPoP model to support arbitrary
protocols including MOQT. This approach replaces HTTP-specific claims
with a flexible authorization context structure that can accommodate
protocol-specific command representations.</t>
          <t>The DPoP proof JWT follows the structure defined in Section 4 of
<xref target="DPOP-PROOF"/> with the following required claims:</t>
          <t>JWT Header:</t>
          <ul spacing="normal">
            <li>
              <t>"typ": "dpop-proof+jwt"</t>
            </li>
            <li>
              <t>"alg": Asymmetric signature algorithm identifier</t>
            </li>
            <li>
              <t>"jwk": Public key for verification</t>
            </li>
          </ul>
          <t>JWT Payload:</t>
          <ul spacing="normal">
            <li>
              <t>"jti": Unique identifier for the JWT</t>
            </li>
            <li>
              <t>"iat": Issued-at time</t>
            </li>
            <li>
              <t>"actx": Authorization Context object</t>
            </li>
          </ul>
          <t>For MOQT operations, the Authorization Context ("actx") object contains:</t>
          <ul spacing="normal">
            <li>
              <t>"type": "moqt" (registered identifier for MOQT protocol)</t>
            </li>
            <li>
              <t>"action": MOQT action identifier</t>
            </li>
            <li>
              <t>"tns": Track namespace (required)</t>
            </li>
            <li>
              <t>"tn": Track name (required)</t>
            </li>
            <li>
              <t>"resource": MOQT resource identifier (optional)</t>
            </li>
          </ul>
          <t>When the optional "resource" parameter is included, it <bcp14>MUST</bcp14> be consistent with the
"tns" and "tn" parameters. The resource URI should follow the format
<tt>moqt://&lt;relay-endpoint&gt;?tns=&lt;namespace&gt;&amp;tn=&lt;track&gt;</tt> where the tns and tn query
parameters match the respective "tns" and "tn" fields in the Authorization Context.</t>
          <t>Example DPoP proof for MOQT PUBLISH_NAMESPACE operation:</t>
          <artwork><![CDATA[
{
  "typ": "dpop-proof+jwt",
  "alg": "ES256",
  "jwk": { ... }
}
.
{
  "jti": "unique-request-id",
  "iat": 1705123456,
  "actx": {
    "type": "moqt",
    "action": "PUB_NS",
    "tns": "sports",
    "tn": "live-feed"
  }
}
]]></artwork>
          <t>MOQT action mapping for Authorization Context:</t>
          <table>
            <thead>
              <tr>
                <th align="left">MOQT Action</th>
                <th align="left">actx.action</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">CLIENT_SETUP</td>
                <td align="left">SETUP</td>
              </tr>
              <tr>
                <td align="left">SERVER_SETUP</td>
                <td align="left">SETUP</td>
              </tr>
              <tr>
                <td align="left">PUBLISH_NAMESPACE</td>
                <td align="left">PUB_NS</td>
              </tr>
              <tr>
                <td align="left">SUBSCRIBE_NAMESPACE</td>
                <td align="left">SUB_NS</td>
              </tr>
              <tr>
                <td align="left">SUBSCRIBE</td>
                <td align="left">SUBSCRIBE</td>
              </tr>
              <tr>
                <td align="left">REQUEST_UPDATE</td>
                <td align="left">REQ_UPDATE</td>
              </tr>
              <tr>
                <td align="left">PUBLISH</td>
                <td align="left">PUBLISH</td>
              </tr>
              <tr>
                <td align="left">FETCH</td>
                <td align="left">FETCH</td>
              </tr>
              <tr>
                <td align="left">TRACK_STATUS</td>
                <td align="left">TRK_STATUS</td>
              </tr>
            </tbody>
          </table>
          <t>Relays supporting this application-agnostic DPoP framework <bcp14>MUST</bcp14>:</t>
          <ul spacing="normal">
            <li>
              <t>Validate DPoP proofs according to <xref target="DPOP-PROOF"/></t>
            </li>
            <li>
              <t>Verify that the "actx.type" is "moqt" for MOQT operations</t>
            </li>
            <li>
              <t>Validate that the "actx.action" matches the requested MOQT action</t>
            </li>
            <li>
              <t>Verify that the "actx.tns" corresponds to the target track namespace</t>
            </li>
            <li>
              <t>Verify that the "actx.tn" corresponds to the target track name</t>
            </li>
            <li>
              <t>If present, verify the "actx.resource" is consistent with "tns" and "tn"</t>
            </li>
            <li>
              <t>Reject requests where Authorization Context validation fails</t>
            </li>
          </ul>
        </section>
        <section anchor="moqt-resource-uri-construction">
          <name>MOQT Resource URI Construction</name>
          <t>The Authorization Context "resource" field should specify track namespace (tns) and track name (tn) parameters for MOQT resources:</t>
          <ul spacing="normal">
            <li>
              <t>Connection setup: <tt>moqt://&lt;relay-endpoint&gt;</tt></t>
            </li>
            <li>
              <t>Namespace operations: <tt>moqt://&lt;relay-endpoint&gt;?tns=&lt;namespace&gt;</tt></t>
            </li>
            <li>
              <t>Track operations: <tt>moqt://&lt;relay-endpoint&gt;?tns=&lt;namespace&gt;&amp;tn=&lt;track&gt;</tt></t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="dpop-proof-process-and-token-binding-flow">
        <name>DPoP Proof Process and Token Binding Flow</name>
        <t>The following process illustrates how DPoP proof provision results in CAT
token binding and subsequent MOQT relay validation:</t>
        <section anchor="phase-1-token-acquisition-with-dpop-binding">
          <name>Phase 1: Token Acquisition with DPoP Binding</name>
          <artwork><![CDATA[
┌──────────────┐                ┌─────────────────────┐                ┌──────┐
│MOQT Client   │                │Authorization Server │                │MOQT  │
│              │                │                     │                │Relay │
└──────┬───────┘                └──────────┬──────────┘                └──────┘
       │                                   │                                │
       │ (1) Generate Key Pair             │                                │
       │     EC P-256/RSA                  │                                │
       │     private_key, public_key       │                                │
       │                                   │                                │
       │ (2) Authentication Request        │                                │
       │     + User Credentials            │                                │
       │     + Public Key (JWK format)     │                                │
       ├──────────────────────────────────►│                                │
       │                                   │                                │
       │                                   │ (3) User Authentication        │
       │                                   │     & Authorization            │
       │                                   │                                │
       │                                   │ (4) Generate CAT Token:        │
       │                                   │     • "cnf" claim with         │
       │                                   │       "jkt": SHA256(public_key)│
       │                                   │     • "catdpop" processing     │
       │                                   │       settings                 │
       │                                   │     • "moqt" action scope      │
       │                                   │     • Sign with shared secret  │
       │                                   │                                │
       │ (5) CAT Token Response            │                                │
       │     + Bound CAT Token             │                                │
       │     + Relay Endpoint URL          │                                │
       |◄──────────────────────────────────┤                                │
       │                                   │                                │
]]></artwork>
          <t>Steps 1-5 Detail:</t>
          <ol spacing="normal" type="1"><li>
              <t>Client Key Generation: The MOQT client generates an asymmetric key pair
(typically EC P-256) for DPoP operations</t>
            </li>
            <li>
              <t>Authentication with Public Key: Client authenticates with the authorization
server, providing user credentials and the public key</t>
            </li>
            <li>
              <t>User Authentication: Authorization server validates user identity and
permissions</t>
            </li>
            <li>
              <t>CAT Token Generation: Server creates a CAT token containing:
              </t>
              <ul spacing="normal">
                <li>
                  <t>"cnf" claim: JWK Thumbprint ("jkt") of the client's public key
(32-byte SHA-256 hash)</t>
                </li>
                <li>
                  <t>"catdpop" claim: DPoP processing settings (window, jti handling,
critical settings)</t>
                </li>
                <li>
                  <t>"moqt" claim: Authorized MOQT actions and scope restrictions</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Token Delivery: Server provides the bound CAT token and relay endpoint
information to the client</t>
            </li>
          </ol>
        </section>
        <section anchor="phase-2-moqt-operations-with-dpop-proof-validation">
          <name>Phase 2: MOQT Operations with DPoP Proof Validation</name>
          <artwork><![CDATA[
┌──────────────┐                ┌─────────────────────┐                ┌───────┐
│MOQT Client   │                │Authorization Server │                │MOQT   │
│              │                │                     │                │Relay  │
└──────┬───────┘                └──────────┬──────────┘                └──────┬┘
       │                                   │                                  │
       │                                   │                                  │
       │ (6) For each MOQT action:         │                                  │
       │     Create fresh DPoP proof JWT   │                                  │
       │     • Header: typ="dpop-proof+jwt"│                                  │
       │     •         alg, jwk            │                                  │
       │     • Claims: jti, iat, actx      │                                  │
       │     • Sign with private_key       │                                  │
       │                                   │                                  │
       │ (7) MOQT Request                  │                                  │
       │     + CAT Token                   │                                  │
       │     + Fresh DPoP Proof            │                                  │
       │     (CLIENT_SETUP, PUBLISH_NAMESPACE,│                                │
       │      SUBSCRIBE, PUBLISH, FETCH)   │                                  │
       ├─────────────────────────────────────────────────────────────────────►│
       │                                   │                                  │
       │                                   │                               (8)│
       │                                   │                  CAT Validation: │
       │                                   │                 • Verify token   │
       │                                   │                   signature      │
       │                                   │                 • Validate claims│
       │                                   │                   including exp, |
       |                                   |                   scope          │
       │                                   │                                  │
       │                                   │                               (9)│
       │                                   │                 DPoP Validation: │
       │                                   │                  • Extract "jkt" │
       │                                   │                    from token    │
       │                                   │                  • Verify DPoP   │
       │                                   │                    JWT signature │
       │                                   │                  • Validate key  │
       │                                   │                    binding       │
       │                                   │                  • Check         │
       │                                   │                    freshness     │
       │                                   │                                  │
       │                                   │                              (10)│
       │                                   │              Action Authorization│
       │                                   │                  • Match action  │
       │                                   │                    to token scope│
       │                                   │                  • Check ns/track│
       │                                   │                    permissions   │
       │                                   │                                  │
       │ (11) Response                     │                                  │
       │      Success/Error                │                                  │
       ◄─────────────────────────────────────────────────────────────────────┤
       │                                   │                                  │
]]></artwork>
          <t>Steps 6-11 Detail:</t>
          <ol spacing="normal" type="1"><li>
              <t>DPoP Proof Creation: For each MOQT action, the client creates a fresh
  DPoP proof JWT with:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Header: <tt>typ: "dpop-proof+jwt"</tt>, <tt>alg</tt>, <tt>jwk</tt> (public key)</t>
                </li>
                <li>
                  <t>Claims: <tt>jti</tt> (unique ID), <tt>iat</tt> (timestamp), <tt>actx</tt>
        (Authorization Context with type, action, tns, tn)</t>
                </li>
              </ul>
            </li>
            <li>
              <t>MOQT Request: Client sends MOQT action with both CAT token and fresh DPoP
  proof</t>
            </li>
            <li>
              <t>CAT Token Validation: Relay validates:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Token signature using shared secret with authorization server</t>
                </li>
                <li>
                  <t>Token expiration time</t>
                </li>
                <li>
                  <t>"moqt" claim scope for requested action</t>
                </li>
              </ul>
            </li>
            <li>
              <t>DPoP Proof Validation: Relay performs:  </t>
              <ul spacing="normal">
                <li>
                  <t>Extract "jkt" (JWK Thumbprint) from CAT token's "cnf" claim</t>
                </li>
                <li>
                  <t>Verify DPoP JWT signature using embedded public key</t>
                </li>
                <li>
                  <t>Confirm that SHA-256 hash of DPoP public key matches "jkt" value</t>
                </li>
                <li>
                  <t>Check proof freshness within "catdpop" window settings</t>
                </li>
                <li>
                  <t>Process replay protection based on "jti" settings</t>
                </li>
                <li>
                  <t>Validate Authorization Context ("actx") according to <xref target="DPOP-PROOF"/></t>
                </li>
                <li>
                  <t>Verify "actx.type" is "moqt"</t>
                </li>
                <li>
                  <t>Validate "actx.action" matches the requested MOQT action</t>
                </li>
                <li>
                  <t>Verify "actx.tns" and "actx.tn" correspond to target resources</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Action Authorization: Relay validates the specific MOQT action against
token scope and namespace/track permissions</t>
            </li>
            <li>
              <t>Response: Relay responds with success or appropriate error information</t>
            </li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="adding-a-token-to-a-url">
      <name>Adding a token to a URL</name>
      <t>Any time an application wishes to add a CAT token to a URL or path element, the token <bcp14>SHOULD</bcp14> first
be Base64 encoded <xref target="BASE64"/>. The syntax and method of modifying the URL is left to the application
to define and is not constrained by this specification.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</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 anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="authentication-vs-authorization">
        <name>Authentication vs Authorization</name>
        <t>This specification defines an authorization scheme, not an authentication scheme.
User authentication (verifying the identity of a user via credentials, OAuth, 2FA, etc.)
occurs prior to token issuance and is outside the scope of this document.</t>
        <t>The tokens defined in this specification convey authorization - they grant permissions
for specific MOQT actions (such as SUBSCRIBE, PUBLISH, ANNOUNCE) on specific namespaces
and tracks. A valid token does not authenticate a user; rather, it authorizes
the bearer to perform the actions specified in the token's claims.</t>
        <t>Implementers should ensure that user authentication is performed by appropriate
mechanisms before tokens are issued. The security of the authorization scheme
depends on the security of the token issuance process, including proper user
authentication.</t>
        <t>TODO Add security considerations for DPoP Claims</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA will register the following claims in the "CBOR Web Token (CWT) Claims" registry:</t>
      <table>
        <thead>
          <tr>
            <th align="left"> </th>
            <th align="left">moqt</th>
            <th align="left">moqt-reval</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Claim Name</td>
            <td align="left">moqt</td>
            <td align="left">moqt-reval</td>
          </tr>
          <tr>
            <td align="left">Claim Description</td>
            <td align="left">MOQT Action</td>
            <td align="left">MOQT revalidation</td>
          </tr>
          <tr>
            <td align="left">JWT Claim Name</td>
            <td align="left">N/A</td>
            <td align="left">N/A</td>
          </tr>
          <tr>
            <td align="left">Claim Key</td>
            <td align="left">TBD_MOQT (1+2)</td>
            <td align="left">TBD_MOQT (1+2)</td>
          </tr>
          <tr>
            <td align="left">Claim Value Type</td>
            <td align="left">array</td>
            <td align="left">number</td>
          </tr>
          <tr>
            <td align="left">Change Controller</td>
            <td align="left">IESG</td>
            <td align="left">IESG</td>
          </tr>
          <tr>
            <td align="left">Specification Document</td>
            <td align="left">RFCXXXX</td>
            <td align="left">RFCXXXX</td>
          </tr>
        </tbody>
      </table>
      <t>[RFC Editor: Please replace RFCXXXX with the published RFC number for this
document.]</t>
      <section anchor="moqt-auth-token-type-registry">
        <name>MOQT Auth Token Type Registry</name>
        <t>This document registers the following entry in the "MOQT Auth Token Type"
registry established by <xref target="MoQTransport"/>:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Token Type</th>
              <th align="left">Token Name</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x01</td>
              <td align="left">CAT</td>
              <td align="left">RFCXXXX</td>
            </tr>
          </tbody>
        </table>
        <section anchor="cat-token-type-0x01">
          <name>CAT Token Type (0x01)</name>
          <t>When the Auth Token Type is set to 0x01, the Token Payload field contains
a Common Access Token (CAT) <xref target="CAT"/> serialized as a CBOR-encoded CWT
(CBOR Web Token).</t>
          <t>The token <bcp14>MUST</bcp14> be processed according to the validation rules defined in
this specification. Relays receiving a token with this type <bcp14>MUST</bcp14>:</t>
          <ul spacing="normal">
            <li>
              <t>Validate the token signature or MAC</t>
            </li>
            <li>
              <t>Verify token expiration and other standard CWT claims</t>
            </li>
            <li>
              <t>Process the "moqt" claim (if present) to authorize MOQT actions</t>
            </li>
            <li>
              <t>Process the "moqt-reval" claim (if present) for revalidation requirements</t>
            </li>
            <li>
              <t>Process DPoP claims (if present) according to Section 3 of this document</t>
            </li>
          </ul>
          <t>If the token fails validation, the relay <bcp14>MUST</bcp14> reject the connection or
action with an appropriate error.</t>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="Composite">
        <front>
          <title>Composite Token Claims</title>
          <author fullname="Chris Lemmons" initials="C." surname="Lemmons">
            <organization>Comcast</organization>
          </author>
          <date day="17" month="February" year="2026"/>
          <abstract>
            <t>   Composition claims are claims for CBOR Web Tokens (CWTs) and JSON Web
   Tokens (JWTs) that define logical relationships between sets of
   claims.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-lemmons-cose-composite-claims-02"/>
      </reference>
      <reference anchor="MoQTransport">
        <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="12" month="May" year="2026"/>
          <abstract>
            <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-18"/>
      </reference>
      <reference anchor="EDN">
        <front>
          <title>Concise Diagnostic Notation (CDN)</title>
          <author fullname="Carsten Bormann" initials="C." surname="Bormann">
            <organization>Universität Bremen TZI</organization>
          </author>
          <date day="15" month="June" year="2026"/>
          <abstract>
            <t>   This document formalizes and consolidates the definition of the
   Concise Diagnostic Notation (CDN) of the Concise Binary Object
   Representation (CBOR), addressing implementer experience.

   Replacing CDN's previous informal descriptions, it updates RFC 8949,
   obsoleting its Section 8, and RFC 8610, obsoleting its Appendix G.

   It also specifies registry-based extension points and uses them to
   support text representations such as of epoch-based dates/times and
   of IP addresses and prefixes.


   // (This cref will be removed by the RFC editor:) -26 is intended to
   // address the May/June 2026 Working Group Last Call comments on -25
   // and the ensuing WG discussions.  Specifically, this update: • is
   // going further with the idea to entirely replace the non- backwards
   // compatible update considered for the RFC 8610/G.4 concatenation by
   // two new application extensions (temporarily named b1/t1), and to
   // add related application-oriented extensions that deprecate the
   // original streamstring syntax. • includes the float'' application-
   // extension so that the entire CBOR format can be covered. • now
   // uses rules closer to those of markdown for handling data
   // transparency in raw strings, simplifying their implementation. •
   // adds security considerations. • proactively reserves the
   // application-extension identifier "pragma" for potential future
   // standardization. • This update does not address certain comments
   // that propose some editorial restructuring requiring moving text
   // around; this is best done in a next revision after the technical
   // comments are addressed.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-edn-literals-26"/>
      </reference>
      <reference anchor="BASE64">
        <front>
          <title>The Base16, Base32, and Base64 Data Encodings</title>
          <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
          <date month="October" year="2006"/>
          <abstract>
            <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4648"/>
        <seriesInfo name="DOI" value="10.17487/RFC4648"/>
      </reference>
      <reference anchor="CAT" target="https://shop.cta.tech/products/cta-5007">
        <front>
          <title>CTA 5007-B Common Access Token</title>
          <author>
            <organization/>
          </author>
          <date year="2025" month="April"/>
        </front>
      </reference>
      <reference anchor="DPoP">
        <front>
          <title>OAuth 2.0 Demonstrating Proof of Possession (DPoP)</title>
          <author fullname="D. Fett" initials="D." surname="Fett"/>
          <author fullname="B. Campbell" initials="B." surname="Campbell"/>
          <author fullname="J. Bradley" initials="J." surname="Bradley"/>
          <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
          <author fullname="M. Jones" initials="M." surname="Jones"/>
          <author fullname="D. Waite" initials="D." surname="Waite"/>
          <date month="September" year="2023"/>
          <abstract>
            <t>This document describes a mechanism for sender-constraining OAuth 2.0 tokens via a proof-of-possession mechanism on the application level. This mechanism allows for the detection of replay attacks with access and refresh tokens.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9449"/>
        <seriesInfo name="DOI" value="10.17487/RFC9449"/>
      </reference>
      <reference anchor="DPOP-PROOF" target="https://datatracker.ietf.org/doc/draft-nandakumar-moq-generic-dpop-proof/">
        <front>
          <title>Application-Agnostic Demonstrating Proof-of-Possession</title>
          <author initials="S." surname="Nandakumar" fullname="S. Nandakumar">
            <organization/>
          </author>
          <date year="2024" month="December"/>
        </front>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <?line 877?>

<section anchor="appendix-a-test-vectors">
      <name>Appendix A: Test Vectors</name>
      <t>This appendix provides test vectors in JSON format for cross-implementation
validation of CAT tokens for MOQT. Token strings use the base64url encoding
defined in <xref target="BASE64"/> with the three-part structure: header.payload.signature.</t>
      <section anchor="keys">
        <name>Keys</name>
        <t>The following keys are used throughout these test vectors:</t>
        <sourcecode type="json"><![CDATA[
{
  "es256_private_key":
    "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721",
  "es256_public_key_x":
    "60fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb6",
  "es256_public_key_y":
    "7903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299",
  "hmac_sha256":
    "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
}
]]></sourcecode>
      </section>
      <section anchor="cbor-encoding-of-claims">
        <name>CBOR Encoding of Claims</name>
        <t>These vectors validate correct CBOR encoding of individual claim types.</t>
        <sourcecode type="json"><![CDATA[
[
  {
    "id": "cbor_issuer_only",
    "description": "Minimal token with only issuer claim",
    "claims": {
      "iss": "https://auth.example.com"
    },
    "payload_cbor_hex":
      "a101781868747470733a2f2f617574682e6578616d706c652e636f6d"
  },
  {
    "id": "cbor_core_claims",
    "description": "All core CWT claims (iss, aud, exp, nbf, cti)",
    "claims": {
      "iss": "https://auth.example.com",
      "aud": ["https://relay.example.com"],
      "exp": 1700086400,
      "nbf": 1700000000,
      "cti": "test-token-001"
    },
    "payload_cbor_hex":
      "a501781868747470733a2f2f617574682e6578616d706c652e636f6d03
       81781968747470733a2f2f72656c61792e6578616d706c652e636f6d04
       1a65554280051a6553f100074e746573742d746f6b656e2d303031"
  },
  {
    "id": "cbor_cat_version_usage",
    "description": "CAT version string and usage limit",
    "claims": {
      "catv": "CAT-v1",
      "catu": 5
    },
    "payload_cbor_hex":
      "a2190136664341542d763119013805"
  },
  {
    "id": "cbor_network_identifiers",
    "description": "Network identifiers: IP, CIDR, ASN, ASN range",
    "claims": {
      "catnip": [
        {"type": "ip_address", "value": "192.168.1.100"},
        {"type": "ip_range", "value": "10.0.0.0/8"},
        {"type": "asn", "value": 64512},
        {"type": "asn_range", "value": [64512, 64768]}
      ]
    },
    "payload_cbor_hex":
      "a1190137846d3139322e3136382e312e313030a16869705f72616e6765
       6a31302e302e302e302f38a16361736e19fc00a16961736e5f72616e67
       658219fc0019fd00"
  },
  {
    "id": "cbor_geographic_claims",
    "description": "Geographic claims: coordinates, geohash, ISO 3166, altitude",
    "claims": {
      "geohash": "9q8yyk",
      "catgeoiso3166": ["US", "CA"],
      "catgeocoord": {"lat": 37.7749, "lon": -122.4194, "accuracy": 100.0},
      "catgeoalt": 10
    },
    "payload_cbor_hex":
      "a419011a6639713879796b19013c8262555362434119013da3636c6174
       fb4042e32fec56d5d0636c6f6efbc05e9ad77318fc506861636375726
       16379f956401901 3e0a"
  },
  {
    "id": "cbor_uri_patterns",
    "description": "URI patterns: exact, prefix, suffix",
    "claims": {
      "cath": [
        {"type": "exact", "value": "https://example.com/live/stream1"},
        {"type": "prefix", "value": "https://example.com/vod/"},
        {"type": "suffix", "value": ".m3u8"}
      ]
    },
    "payload_cbor_hex":
      "a119013b83782068747470733a2f2f6578616d706c652e636f6d2f6c6
       976652f73747265616d31a166707265666978781868747470733a2f2f65
       78616d706c652e636f6d2f766f642fa166737566666978652e6d337538"
  },
  {
    "id": "cbor_alpn",
    "description": "ALPN protocol identifiers",
    "claims": {
      "catalpn": ["moq-00", "h3"]
    },
    "payload_cbor_hex":
      "a119013a82666d6f712d3030626833"
  }
]
]]></sourcecode>
      </section>
      <section anchor="token-structure">
        <name>Token Structure</name>
        <t>These vectors validate the full token structure (header.payload.signature)
with cryptographic verification.</t>
        <sourcecode type="json"><![CDATA[
[
  {
    "id": "token_hmac_minimal",
    "description": "Minimal token signed with HMAC-SHA256",
    "algorithm": "HMAC-SHA256",
    "algorithm_id": -4,
    "claims": {
      "iss": "https://auth.example.com",
      "aud": ["https://relay.example.com"],
      "exp": 1700086400
    },
    "header_cbor_hex": "a201231063434154",
    "header_b64": "ogEjEGNDQVQ",
    "payload_cbor_hex":
      "a301781868747470733a2f2f617574682e6578616d706c652e636f6d
       0381781968747470733a2f2f72656c61792e6578616d706c652e636f
       6d041a65554280",
    "payload_b64":
      "owF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQOBeBlodHRwczovL3
       JlbGF5LmV4YW1wbGUuY29tBBplVUKA",
    "signature_hex":
      "5b5ec60fb1a3f81d18b5e8d7edf4702e55261248def8c13cd6809cf6
       865a6986",
    "signature_b64":
      "W17GD7Gj-B0YtejX7fRwLlUmEkje-ME81oCc9oZaaYY",
    "key_hex":
      "000102030405060708090a0b0c0d0e0f101112131415161718191a1b
       1c1d1e1f",
    "token":
      "ogEjEGNDQVQ.owF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQOBeB
       lodHRwczovL3JlbGF5LmV4YW1wbGUuY29tBBplVUKA.W17GD7Gj-B0Y
       tejX7fRwLlUmEkje-ME81oCc9oZaaYY",
    "valid": true
  },
  {
    "id": "token_hmac_full",
    "description":
      "Token with core + CAT + informational claims, HMAC-SHA256",
    "algorithm": "HMAC-SHA256",
    "algorithm_id": -4,
    "claims": {
      "iss": "https://issuer.moq.example",
      "sub": "user:alice@example.com",
      "aud": [
        "https://relay1.example.com",
        "https://relay2.example.com"
      ],
      "exp": 1700086400,
      "nbf": 1700000000,
      "iat": 1700000000,
      "cti": "vector-002",
      "catv": "CAT-v1",
      "catnip": [{"type": "ip_address", "value": "203.0.113.50"}],
      "catu": 10
    },
    "header_cbor_hex": "a201231063434154",
    "header_b64": "ogEjEGNDQVQ",
    "payload_cbor_hex":
      "aa01781a68747470733a2f2f6973737565722e6d6f712e6578616d70
       6c650276757365723a616c696365406578616d706c652e636f6d0382
       781a68747470733a2f2f72656c6179312e6578616d706c652e636f6d
       781a68747470733a2f2f72656c6179322e6578616d706c652e636f6d
       041a65554280051a6553f100061a6553f100074a766563746f722d30
       3032190136664341542d7631190137816c3230332e302e3131332e35
       301901380a",
    "payload_b64":
      "qgF4Gmh0dHBzOi8vaXNzdWVyLm1vcS5leGFtcGxlAnZ1c2VyOmFsa
       WNlQGV4YW1wbGUuY29tA4J4Gmh0dHBzOi8vcmVsYXkxLmV4YW1wbG
       UuY29teBpodHRwczovL3JlbGF5Mi5leGFtcGxlLmNvbQQaZVVCgAUa
       ZVPxAAYaZVPxAAdKdmVjdG9yLTAwMhkBNmZDQVQtdjEZATeBbDIwMy
       4wLjExMy41MBkBOAo",
    "signature_hex":
      "02aa58a31e34ab53fab3c755b47cf08f458a3603da4d933d7c0b1ce4
       614f44da",
    "signature_b64":
      "AqpYox40q1P6s8dVtHzwj0WKNgPaTZM9fAsc5GFPRNo",
    "key_hex":
      "000102030405060708090a0b0c0d0e0f101112131415161718191a1b
       1c1d1e1f",
    "token":
      "ogEjEGNDQVQ.qgF4Gmh0dHBzOi8vaXNzdWVyLm1vcS5leGFtcGxlAn
       Z1c2VyOmFsaWNlQGV4YW1wbGUuY29tA4J4Gmh0dHBzOi8vcmVsYXkx
       LmV4YW1wbGUuY29teBpodHRwczovL3JlbGF5Mi5leGFtcGxlLmNvbQQ
       aZVVCgAUaZVPxAAYaZVPxAAdKdmVjdG9yLTAwMhkBNmZDQVQtdjEZAT
       eBbDIwMy4wLjExMy41MBkBOAo.AqpYox40q1P6s8dVtHzwj0WKNgPaTZ
       M9fAsc5GFPRNo",
    "valid": true
  },
  {
    "id": "token_es256",
    "description":
      "Token signed with ES256 (P-256 ECDSA, deterministic RFC 6979)",
    "algorithm": "ES256",
    "algorithm_id": -7,
    "claims": {
      "iss": "https://auth.example.com",
      "aud": ["https://moq-relay.example.com"],
      "exp": 1700086400,
      "nbf": 1700000000
    },
    "header_cbor_hex": "a201261063434154",
    "header_b64": "ogEmEGNDQVQ",
    "payload_cbor_hex":
      "a401781868747470733a2f2f617574682e6578616d706c652e636f6d
       0381781d68747470733a2f2f6d6f712d72656c61792e6578616d706c
       652e636f6d041a65554280051a6553f100",
    "payload_b64":
      "pAF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQOBeB1odHRwczovL2
       1vcS1yZWxheS5leGFtcGxlLmNvbQQaZVVCgAUaZVPxAA",
    "signature_hex":
      "fa3315e9de061fd77d814394428ae61da3d7a21fdffb19802b0c575c
       578098e7cd4b6b75a1690deed4c2baae994bfc462e0d8a2006f3e897
       80f3435738294d7a",
    "signature_b64":
      "-jMV6d4GH9d9gUOUQormHaPXoh_f-xmAKwxXXFeAmOfNS2t1oWkN7t
       TCuq6ZS_xGLg2KIAbz6JeA80NXOClNeg",
    "private_key_hex":
      "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b
       120f6721",
    "public_key_x_hex":
      "60fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e
       60f29fb6",
    "public_key_y_hex":
      "7903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294
       d4462299",
    "token":
      "ogEmEGNDQVQ.pAF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQOBeB
       1odHRwczovL21vcS1yZWxheS5leGFtcGxlLmNvbQQaZVVCgAUaZVPxA
       A.-jMV6d4GH9d9gUOUQormHaPXoh_f-xmAKwxXXFeAmOfNS2t1oWkN7
       tTCuq6ZS_xGLg2KIAbz6JeA80NXOClNeg",
    "valid": true
  }
]
]]></sourcecode>
      </section>
      <section anchor="dpop-binding">
        <name>DPoP Binding</name>
        <t>These vectors validate DPoP (Demonstrating Proof-of-Possession) key binding
in CAT tokens.</t>
        <sourcecode type="json"><![CDATA[
[
  {
    "id": "dpop_jwk_binding",
    "description":
      "Token with DPoP key binding (JWK thumbprint in cnf claim)",
    "dpop": {
      "cnf_jkt_hex":
        "a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1",
      "window_seconds": 60,
      "honor_jti": true
    },
    "payload_cbor_hex":
      "a401781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a6555428008a1035820a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6
       f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1190141a200183c0101",
    "token":
      "ogEjEGNDQVQ.pAF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQQaZV
       VCgAihA1ggoLHC0-T1prfI2eDxorPE1eb3qLnA0eLzpLXG1-j5oLEZA
       UGiABg8AQE.sN9kLIp64zIN9zDXoTLYC0xsJU_1FNF3kaO0CbdA_3M"
  },
  {
    "id": "dpop_no_jti",
    "description":
      "DPoP binding with longer window, JTI processing disabled",
    "dpop": {
      "cnf_jkt_hex":
        "3c82dfd6358ba804bd90879c34e743bbe13aeab7980664944f37a0ec0063fe95",
      "cnf_jkt_source": "SHA-256 of 'test-public-key-material'",
      "window_seconds": 300,
      "honor_jti": false
    },
    "payload_cbor_hex":
      "a401781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a6555428008a10358203c82dfd6358ba804bd90879c34e743bbe13a
       eab7980664944f37a0ec0063fe95190141a20019012c0100",
    "token":
      "ogEjEGNDQVQ.pAF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQQaZV
       VCgAihA1ggPILf1jWLqAS9kIecNOdDu-E66reYBmSUTzeg7ABj_pUZA
       UGiABkBLAEA.M4lF5pQdxav6eIWqDjbchDkijVYOM7xa3oJR2IwWt9g"
  },
  {
    "id": "dpop_es256_real_binding",
    "description":
      "ES256 token with real JWK thumbprint binding to the signing key",
    "algorithm": "ES256",
    "jwk_thumbprint_input":
      "{\"crv\":\"P-256\",\"kty\":\"EC\",\"x\":\"YP7UuiVanTHJYet0xjVtaMBJuJI7Yfps5mliLmDyn7Y\",\"y\":\"eQP-EAi4vJmkGunpVii8ZPLxsgwtfp9Rd6PClNRGIpk\"}",
    "dpop": {
      "cnf_jkt_hex":
        "0cebf1bc9880748a95588905b79843b42ba75cb174055e3e246bf87fe00b4a6d",
      "window_seconds": 120,
      "honor_jti": null
    },
    "public_key_x_hex":
      "60fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb6",
    "public_key_y_hex":
      "7903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299",
    "payload_cbor_hex":
      "a501781868747470733a2f2f617574682e6578616d706c652e636f6d
       0381781968747470733a2f2f72656c61792e6578616d706c652e636f6d
       041a6555428008a10358200cebf1bc9880748a95588905b79843b42ba7
       5cb174055e3e246bf87fe00b4a6d190141a1001878",
    "token":
      "ogEmEGNDQVQ.pQF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQOBeB
       lodHRwczovL3JlbGF5LmV4YW1wbGUuY29tBBplVUKACKEDWCAM6_G8m
       IB0ipVYiQW3mEO0K6dcsXQFXj4ka_h_4AtKbRkBQaEAGHg.5andoxOh
       WXQIKWR3EMHWT-WIMPBDMYQFc61nzlfZs8zmgzwcOARpmlaB3ZS5MbJ
       9iCYWykYAcIzJ81nMyyZoQw"
  }
]
]]></sourcecode>
      </section>
      <section anchor="moqt-authorization-scopes">
        <name>MOQT Authorization Scopes</name>
        <t>These vectors validate MOQT scope encoding and authorization matching.
Each vector includes authorization tests that specify expected pass/fail
results for various action, namespace, and track combinations.</t>
        <sourcecode type="json"><![CDATA[
[
  {
    "id": "moqt_publisher_exact",
    "description":
      "Publisher scope: exact namespace match, prefix track match",
    "moqt_scopes": [
      {
        "actions": [2, 6],
        "action_names": ["PublishNamespace", "Publish"],
        "namespace_matches": [
          {"type": "exact", "pattern_utf8": "example.com",
           "pattern_hex": "6578616d706c652e636f6d"},
          {"type": "exact", "pattern_utf8": "alice",
           "pattern_hex": "616c696365"}
        ],
        "track_match": {
          "type": "prefix", "pattern_utf8": "video-",
          "pattern_hex": "766964656f2d"
        }
      }
    ],
    "payload_cbor_hex":
      "a301781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a6555428019014781838202068 24b6578616d706c652e636f6d4561
       6c696365820146766964656f2d",
    "token":
      "ogEjEGNDQVQ.owF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQQaZV
       VCgBkBR4GDggIGgktleGFtcGxlLmNvbUVhbGljZYIBRnZpZGVvLQ.oA
       PD24Wu_zHnDcuM6a-ePeGvRJjbCa6U7iswdsKzFDk",
    "authorization_tests": [
      {"action": 2, "namespace": ["example.com", "alice"],
       "track": "video-hd", "expected": true},
      {"action": 6, "namespace": ["example.com", "alice"],
       "track": "video-sd", "expected": true},
      {"action": 6, "namespace": ["example.com", "alice"],
       "track": "audio-main", "expected": false},
      {"action": 4, "namespace": ["example.com", "alice"],
       "track": "video-hd", "expected": false},
      {"action": 6, "namespace": ["example.com", "bob"],
       "track": "video-hd", "expected": false}
    ]
  },
  {
    "id": "moqt_subscriber_prefix",
    "description":
      "Subscriber scope: prefix namespace match, any track",
    "moqt_scopes": [
      {
        "actions": [3, 4, 7],
        "action_names": ["SubscribeNamespace", "Subscribe", "Fetch"],
        "namespace_matches": [
          {"type": "prefix",
           "pattern_utf8": "conference.example",
           "pattern_hex": "636f6e666572656e63652e6578616d706c65"}
        ],
        "track_match": null
      }
    ],
    "payload_cbor_hex":
      "a301781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a65554280190147818283030407818201 52636f6e666572656e6365
       2e6578616d706c65",
    "token":
      "ogEjEGNDQVQ.owF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQQaZV
       VCgBkBR4GCgwMEB4GCAVJjb25mZXJlbmNlLmV4YW1wbGU.pfUPZultm
       yCm1GF2PvPXAYXzvK6d1D-OFNBLG1AwjDg",
    "authorization_tests": [
      {"action": 4, "namespace": ["conference.example.room1"],
       "track": "audio", "expected": true},
      {"action": 7, "namespace": ["conference.example.room2"],
       "track": "video", "expected": true},
      {"action": 4, "namespace": ["other.domain"],
       "track": "audio", "expected": false},
      {"action": 6, "namespace": ["conference.example.room1"],
       "track": "audio", "expected": false}
    ]
  },
  {
    "id": "moqt_multi_scope",
    "description":
      "Multi-scope token: publish to specific namespace, subscribe to prefix, with revalidation",
    "moqt_reval": 300.0,
    "moqt_scopes": [
      {
        "actions": [2, 6],
        "action_names": ["PublishNamespace", "Publish"],
        "namespace_matches": [
          {"type": "exact", "pattern_utf8": "live.example",
           "pattern_hex": "6c6976652e6578616d706c65"},
          {"type": "exact", "pattern_utf8": "studio-a",
           "pattern_hex": "73747564696f2d61"}
        ],
        "track_match": null
      },
      {
        "actions": [4, 7],
        "action_names": ["Subscribe", "Fetch"],
        "namespace_matches": [
          {"type": "prefix", "pattern_utf8": "live.example",
           "pattern_hex": "6c6976652e6578616d706c65"}
        ],
        "track_match": null
      }
    ],
    "payload_cbor_hex":
      "a401781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a655542801901478282820206824c6c6976652e6578616d706c6548
       73747564696f2d61828204078182014c6c6976652e6578616d706c6519
       0148f95cb0",
    "token":
      "ogEjEGNDQVQ.pAF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQQaZV
       VCgBkBR4KCggIGgkxsaXZlLmV4YW1wbGVIc3R1ZGlvLWGCggQHgYIBT
       GxpdmUuZXhhbXBsZRkBSPlcsA.byEzQmxc28UXFyFekHtgOtaVmWyIPl
       -63xNMOF0Q_IU",
    "authorization_tests": [
      {"action": 6, "namespace": ["live.example", "studio-a"],
       "track": "cam1", "expected": true},
      {"action": 4, "namespace": ["live.example.studio-b"],
       "track": "cam1", "expected": true},
      {"action": 6, "namespace": ["live.example", "studio-b"],
       "track": "cam1", "expected": false},
      {"action": 2, "namespace": ["other.example", "studio-a"],
       "track": "", "expected": false}
    ]
  },
  {
    "id": "moqt_admin_wildcard",
    "description":
      "Admin scope: all actions, no namespace/track restriction",
    "moqt_scopes": [
      {
        "actions": [0, 1, 2, 3, 4, 5, 6, 7, 8],
        "action_names": [
          "ClientSetup", "ServerSetup", "PublishNamespace",
          "SubscribeNamespace", "Subscribe", "RequestUpdate",
          "Publish", "Fetch", "TrackStatus"
        ],
        "namespace_matches": [],
        "track_match": null
      }
    ],
    "payload_cbor_hex":
      "a301781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a65554280190147818189000102030405060708",
    "token":
      "ogEjEGNDQVQ.owF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQQaZV
       VCgBkBR4GBiQABAgMEBQYHCA.XlNItz7OGqnNEbaqZ_bQh6TL-wV6SDr
       8hXyOLmtQkj4",
    "authorization_tests": [
      {"action": 0, "namespace": ["any.namespace"],
       "track": "any-track", "expected": true},
      {"action": 6, "namespace": ["any.namespace"],
       "track": "any-track", "expected": true},
      {"action": 8, "namespace": ["any.namespace"],
       "track": "status", "expected": true}
    ]
  },
  {
    "id": "moqt_suffix_match",
    "description":
      "Suffix matching on both namespace and track",
    "moqt_scopes": [
      {
        "actions": [4],
        "action_names": ["Subscribe"],
        "namespace_matches": [
          {"type": "suffix", "pattern_utf8": ".example.com",
           "pattern_hex": "2e6578616d706c652e636f6d"}
        ],
        "track_match": {
          "type": "suffix", "pattern_utf8": "-audio",
          "pattern_hex": "2d617564696f"
        }
      }
    ],
    "payload_cbor_hex":
      "a301781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a6555428019014781838104818202 4c2e6578616d706c652e636f6d
       8202462d617564696f",
    "token":
      "ogEjEGNDQVQ.owF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQQaZV
       VCgBkBR4GDgQSBggJMLmV4YW1wbGUuY29tggJGLWF1ZGlv.-eGYTPe_n
       1PeC0sgHdWCqgnKRHGYF-T89WTk269liBg",
    "authorization_tests": [
      {"action": 4, "namespace": ["cdn.example.com"],
       "track": "stream1-audio", "expected": true},
      {"action": 4, "namespace": ["cdn.example.com"],
       "track": "stream1-video", "expected": false},
      {"action": 4, "namespace": ["cdn.other.org"],
       "track": "stream1-audio", "expected": false}
    ]
  }
]
]]></sourcecode>
      </section>
      <section anchor="token-validation">
        <name>Token Validation</name>
        <t>These vectors validate token processing: expected pass and fail scenarios.
All tokens use HMAC-SHA256 with the key specified in the Keys section unless
otherwise noted.</t>
        <sourcecode type="json"><![CDATA[
[
  {
    "id": "valid_basic",
    "description":
      "Valid token with correct issuer, audience, and time bounds",
    "token":
      "ogEjEGNDQVQ.pAF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQOBeBlodHRwczovL3JlbGF5LmV4YW1wbGUuY29tBBplVUKABRplU_EA.9SztgnG4xgw8U9zDFnqPIuPn6hLwuilSigQcfPsArSg",
    "validation": {
      "reference_time": 1700003600,
      "expected_issuers": ["https://auth.example.com"],
      "expected_audiences": ["https://relay.example.com"],
      "expected_result": "valid"
    }
  },
  {
    "id": "invalid_expired",
    "description": "Token with expiration in the past",
    "token":
      "ogEjEGNDQVQ.ogF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQQaX14QAA.lq8nGBiZm80yUwl1kH_Tv2prKu_nV20JvxVJW8ZGkho",
    "validation": {
      "reference_time": 1700000000,
      "expected_result": "error",
      "expected_error": "TokenExpired"
    }
  },
  {
    "id": "invalid_not_yet_valid",
    "description": "Token with not-before in the future",
    "token":
      "ogEjEGNDQVQ.owF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQQaZVaUAAUaZVVCgA.fPIUugY7_oSeHlheu83_8Yyljsk3iP2zGeWRUi7NtUs",
    "validation": {
      "reference_time": 1700000000,
      "expected_result": "error",
      "expected_error": "TokenNotYetValid"
    }
  },
  {
    "id": "invalid_wrong_issuer",
    "description": "Token from untrusted issuer",
    "token":
      "ogEjEGNDQVQ.owF4GGh0dHBzOi8vZXZpbC5leGFtcGxlLmNvbQOBeBlodHRwczovL3JlbGF5LmV4YW1wbGUuY29tBBplVUKA.Xo7FCr_MGSyVX0C9sueeapSfboIHkrkysurn2VjC9PU",
    "validation": {
      "reference_time": 1700003600,
      "expected_issuers": ["https://auth.example.com"],
      "expected_result": "error",
      "expected_error": "InvalidIssuer"
    }
  },
  {
    "id": "invalid_wrong_audience",
    "description": "Token not intended for this audience",
    "token":
      "ogEjEGNDQVQ.owF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQOBeB9odHRwczovL290aGVyLXJlbGF5LmV4YW1wbGUuY29tBBplVUKA.b8KxAKxJglzhELMuc9bYmsikrx3F9Y3YdvpfHLbsyk0",
    "validation": {
      "reference_time": 1700003600,
      "expected_issuers": ["https://auth.example.com"],
      "expected_audiences": ["https://relay.example.com"],
      "expected_result": "error",
      "expected_error": "InvalidAudience"
    }
  },
  {
    "id": "invalid_tampered_signature",
    "description":
      "Token with corrupted signature (first byte flipped)",
    "original_token":
      "ogEjEGNDQVQ.owF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQOBeBlodHRwczovL3JlbGF5LmV4YW1wbGUuY29tBBplVUKA.W17GD7Gj-B0YtejX7fRwLlUmEkje-ME81oCc9oZaaYY",
    "token":
      "ogEjEGNDQVQ.owF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQOBeBlodHRwczovL3JlbGF5LmV4YW1wbGUuY29tBBplVUKA.pF7GD7Gj-B0YtejX7fRwLlUmEkje-ME81oCc9oZaaYY",
    "validation": {
      "expected_result": "error",
      "expected_error": "SignatureVerificationFailed",
      "key_hex":
        "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
    }
  },
  {
    "id": "invalid_wrong_key",
    "description": "Token verified with incorrect key",
    "token":
      "ogEjEGNDQVQ.ogF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQQaZVVCgA.zmbxdkvbWtGtX0DExLC2nIxPDDmgAVImqk4rRSCCkCY",
    "validation": {
      "correct_key_hex":
        "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
      "wrong_key_hex":
        "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "expected_result": "error",
      "expected_error": "SignatureVerificationFailed"
    }
  },
  {
    "id": "invalid_algorithm_mismatch",
    "description":
      "Token header says HMAC-SHA256 but verifier expects ES256",
    "token":
      "ogEjEGNDQVQ.ogF4GGh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbQQaZVVCgA.zmbxdkvbWtGtX0DExLC2nIxPDDmgAVImqk4rRSCCkCY",
    "validation": {
      "token_algorithm_id": -4,
      "verifier_algorithm_id": -7,
      "expected_result": "error",
      "expected_error": "AlgorithmMismatch"
    }
  }
]
]]></sourcecode>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The IETF moq workgroup</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
q9qlIpQpCV0SqCJ9ryT1hTXBmsuZPvWAEA4SQmi92//sXJyPdwfmrX2SEMSm
9960i+fjg8FWaMk+Lvb7R9tpItgsv0m1Zw/Ow8t3N/cJsZSVeXm2PpwgrHtu
lhAfWe/Pz1u95lnc9fvzw/tm89Li/zpvncH5tbPdGO+eNu/2rm7W9wfvEU8j
53rzffOUrXc2du72xrJ2+W73evN+b1w299Zv1g+a/gNM1ChaVqUO+jsrla0O
LJ7VKdm1SqVTrtldo94t48uqAYpg2WmUSk7NNjqmzWJtsGqWu+WyYz3ARJuf
hpf+fdn4ZB5Ww7pzHr3+fHdtXLzd7x1ap+/3Gt1maFe2tw6P9/3fAxNdHHfi
VUtw6BG4I2tnGe6CuCOrxzj0ONyR1SUOTeBOYf6yyfpTl29Bfk+nIgvwelWn
oCzE+jKladE3WxsnzZzuYDZMVFIoBys6HAA5bqxM5fdJFuMpnL728toGapAv
YiFfiNlVF2B2g8WZXflFVBFnor5QimepJDF9Uczr09nOXCYwbC4qDZvJhos5
LW52c/z+4v6Kncwm3HyzPUBnu1apZFZYw2HAJrtOrebUzXKpUYbZWKxqOhaQ
VqsIb7qgzzTqRhHIWqVWieEAoDEadVaznXKn2qlV0JhqOIw5ZbvYsSzWaJQ7
XbtcLTLDqQMeGNVuidUbsYG1bnQBKUDiqOPBYe0hep2/3juvOuXt1w2n0Ts7
ODsCsfq1dfjOv2p38/eD5tu7+3fvtlhzcNDdPylGpn9xs1+LZGenrdGn6vuT
9v32bq/4dqfZ+Vx9w5p1Y//dQau/z3rxkiVnuWloPfVEN1449WQXO1JOddM9
PfVsN8ZP9Yw33VNmTk895ZU9pU57p7IvuasLi2N9DDAF+x+B9bJ6s/AkhIlV
yEURJstUFBtaOs/uDAMaFVqechEX3k6VXMS1ol6tovEMwcK3Yq69DINq2td3
N21RdVEdloal3uaynLk1CIaAFxcRT4p5GoXwqEZLr9u+volSWIcUHAU2kL9Z
uVuxgHTYdaeB0pJVBEmv7FQYEGKr3mmAFGWyYrdklWGzARFm9W4D6yZ8jUcL
tcUdkHhMlbCqK7zAp82z/4vVWew44pnsRWUKdcs0SpV60Xh4yrL+/KmjngEd
ADU16yUbpE9zAdlxsc2HG0kOAjeUe9U0ez1/93XLyJ+aw6C7U2Qb935wuAnk
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
FLX0S1XoAAA=

-->

</rfc>
