<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-moq-c4m-02" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="CAT-4-MOQT">Authorization scheme for MOQT using Common Access Tokens</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-moq-c4m-02"/>
    <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>
    <author initials="W." surname="Law" fullname="Will Law">
      <organization>Akamai</organization>
      <address>
        <email>wilaw@akamai.com</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area/>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword>
    <keyword>authorization</keyword>
    <keyword>common access token</keyword>
    <keyword>CAT</keyword>
    <abstract>
      <?line 73?>

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

<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         |
        |<------------------------------------------------->|
        |     (SETUP, PUBLISH_NAMESPACE, SUBSCRIBE,         |
        |      SUBSCRIBE_NAMESPACE, PUBLISH, FETCH,         |
        |        REQUEST_UPDATE)                            |
        |                         |                         |
        |                         |  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-scopes-key => moqt-scopes, * int => any }
moqt-scopes-key = 0
moqt-scopes = [ + 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. The claim value is a CBOR map. Key 0 holds the scopes array. Each scope
is itself an array of one to three elements: the actions (an array of integers), the
namespace matches (an array of match objects), and the track match (a single match
object).</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">SETUP</td>
              <td align="left">1</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.1</td>
            </tr>
            <tr>
              <td align="left">PUBLISH_NAMESPACE</td>
              <td align="left">2</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.14</td>
            </tr>
            <tr>
              <td align="left">SUBSCRIBE_NAMESPACE</td>
              <td align="left">3</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.15</td>
            </tr>
            <tr>
              <td align="left">SUBSCRIBE</td>
              <td align="left">4</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.6</td>
            </tr>
            <tr>
              <td align="left">REQUEST_UPDATE</td>
              <td align="left">5</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.5</td>
            </tr>
            <tr>
              <td align="left">PUBLISH</td>
              <td align="left">6</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.8</td>
            </tr>
            <tr>
              <td align="left">FETCH</td>
              <td align="left">7</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.11</td>
            </tr>
            <tr>
              <td align="left">TRACK_STATUS</td>
              <td align="left">8</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.13</td>
            </tr>
            <tr>
              <td align="left">SUBSCRIBE_TRACKS</td>
              <td align="left">9</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 9.18</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="extensibility">
          <name>Extensibility</name>
          <t>Map keys other than 0 are reserved for future revisions of this
specification. A recipient that finds a key it does not recognize in the
"moqt" claim map <bcp14>MUST</bcp14> treat the claim set containing that claim as not
acceptable. When that claim set is the token's top-level claim set, the
token is rejected. This fail-closed behavior ensures that new keys which
restrict authorization scope cannot be silently skipped.</t>
          <t>Issuers that need to offer alternative scope formats can place each in a
separate claim set within an "or" claim <xref target="Composite"/>, so recipients that
do not understand one format can still accept another.</t>
        </section>
        <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: { 0: [[
        [ /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: { 0: [[
        [ /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: { 0: [[
        [ /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: { 0: [[
        [ /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: { 0: [[
        [ /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: { 0: [[
        [ /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: { 0: [
        [[/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: { 0: [[[/PUBLISH/ 6], ['example','com'], [ /prefix/ 1, 'bob']]]},
            /exp/ 4: 1750000000
        },
        {
            /moqt/ TBD_MOQT: { 0: [[[/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="replay-protection-without-dpop">
      <name>Replay Protection without DPoP</name>
      <t>In MOQT, the same token <bcp14>MAY</bcp14> be presented for SETUP and again for
subsequent actions (SUBSCRIBE, PUBLISH, FETCH, etc.) on the same
connection. <xref target="CAT"/> defines "catreplay" value 1 as single use, which
would cause these subsequent actions to fail. For MOQT, this
specification therefore interprets "catreplay" value 1 as single
connection: the token may be used for any number of actions, but only
on one connection.</t>
      <t>When "catreplay" is 1, a relay binds the token's "cti" to the QUIC or
WebTransport connection on which the token is first accepted. The
relay <bcp14>MUST NOT</bcp14> reject the token solely because it was previously
accepted on that connection. All other validation and authorization
requirements continue to apply. The relay <bcp14>MUST</bcp14> reject the token on
any other connection. A token with "catreplay" 1 that lacks a "cti"
or an "exp" claim <bcp14>MUST</bcp14> be rejected. After the connection terminates,
the relay <bcp14>MUST</bcp14> retain sufficient replay state to prevent reuse for
as long as the token could otherwise be accepted, including any
permitted expiration-time leeway.</t>
      <t>When "catreplay" is 2, replay semantics are implementation-defined.</t>
      <t>When "catreplay" is absent or 0, no replay protection is applied.</t>
    </section>
    <section anchor="dpop-for-moqt">
      <name>DPoP for MOQT</name>
      <t>Demonstrating Proof of Possession (DPoP) <xref target="DPoP"/> binds a token to a
client key pair, so that a stolen token cannot be used without the
corresponding private key. This section defines how DPoP is used with
CAT tokens in MOQT.</t>
      <t><xref target="DPoP"/> has two parts. The first (Sections 4, 5, 6 and 8 of <xref target="DPoP"/>)
covers how a client obtains a DPoP-bound token from an authorization
server; it is used unchanged. The second (Sections 7 and 9 of <xref target="DPoP"/>)
covers how the client proves possession of the key when it uses the
token. That part is HTTP-specific: the proof is a JWT that identifies
the request by HTTP method and URI ("htm" and "htu"). For MOQT, this
section replaces it with a CWT proof whose "actx" claim identifies the
MOQT action, Track Namespace and Track Name, using the same encoding as
the "moqt" claim.</t>
      <section anchor="token-binding">
        <name>Token Binding</name>
        <t>The authorization server binds the CAT token to the client's public key
with the "cnf" claim <xref target="CWT-CNF"/>. Because the DPoP proof carries the
key as a COSE_Key, the "cnf" claim <bcp14>SHOULD</bcp14> use the "ckt" confirmation
method (key 5), the COSE Key Thumbprint <xref target="RFC9679"/> of the client's
public key. Relays <bcp14>MUST</bcp14> support "ckt". For compatibility with existing
CAT issuers, the "cnf" claim <bcp14>MAY</bcp14> instead use the "jkt" confirmation
method of <xref target="CAT"/>, the JWK SHA-256 Thumbprint <xref target="JWK-THUMB"/>; relays
<bcp14>SHOULD</bcp14> support "jkt". The "catdpop" claim (<xref target="CAT"/> Section 4.8) sets the window
within which a proof is fresh and whether relays use the proof's "cti"
for replay detection.</t>
        <t>A relay <bcp14>MUST NOT</bcp14> accept a token that contains a "cnf" claim for an MOQT
action unless the action is accompanied by a valid DPoP proof.</t>
      </section>
      <section anchor="dpop-proof">
        <name>DPoP Proof</name>
        <t>For each MOQT action, the client creates a new DPoP proof: a
COSE_Sign1 <xref target="COSE"/> signed with the private key bound to the token.</t>
        <t>The protected header contains:</t>
        <ul spacing="normal">
          <li>
            <t>"alg" (label 1): an asymmetric signature algorithm. Symmetric
algorithms <bcp14>MUST NOT</bcp14> be used. Relays <bcp14>MUST</bcp14> support ES256 (-7) and
<bcp14>SHOULD</bcp14> support ES384 (-35) and EdDSA (-8) <xref target="COSE-ALG"/>.</t>
          </li>
          <li>
            <t>"typ" (label 16): "dpop-proof+cwt".</t>
          </li>
          <li>
            <t>"kccs" (label 14) <xref target="RFC9528"/>: a CWT Claims Set whose "cnf" claim
carries the client's public key as a COSE_Key.</t>
          </li>
        </ul>
        <t>The payload is a CWT Claims Set <xref target="CWT"/>:</t>
        <sourcecode type="cddl"><![CDATA[
dpop-proof-claims = {
  7 => bstr,               ; cti: unique proof identifier
  6 => int,                ; iat: creation time
  actx-label => moqt-actx, ; actx: the MOQT action being authorized
  ath-label => bstr,       ; ath: SHA-256 hash of the CAT token
}

moqt-actx = {
  0 => "moqt",             ; type
  1 => moqt-action,        ; action
  ? 2 => [ * bstr ],       ; Track Namespace fields
  ? 3 => bstr,             ; Track Name
}

actx-label = TBD_ACTX
ath-label = TBD_ATH
]]></sourcecode>
        <t>The action in "actx" uses the action codes defined for the "moqt"
claim. The Track Namespace (key 2) is present for actions that target a
namespace or track, and the Track Name (key 3) for actions that target a
track. Both carry the exact bytes from the MOQT message, with no
serialization or normalization.</t>
        <t>The "type" value "moqt" prevents a proof created for MOQT from being
accepted by another protocol that uses the "actx" claim.</t>
        <t>The "ath" claim is the SHA-256 hash of the CAT token bytes exactly as
presented to the relay. It binds the proof to one token.</t>
        <section anchor="dpop-example">
          <name>Example</name>
          <t>A CAT token that allows SUBSCRIBE and FETCH on namespace
("cdn", "example.com") for tracks starting with "/sports/", bound to
the client's key:</t>
          <artwork><![CDATA[
{
  / exp / 4: 1750000000,
  / cnf / 8: {
    / ckt / 5: h'750ca40795ab23e51a75dc76fa12c052
                 f6f6c57ba8a732337b91f096592b6ef6'
  },
  / catdpop / 321: {
    / window / 0: 300,
    / jti / 1: 1
  },
  / moqt / TBD_MOQT: {0: [
    [
      [/SUBSCRIBE/ 4, /FETCH/ 7],
      ['cdn', 'example.com', nil],
      [/prefix/ 1, '/sports/']
    ]
  ]}
}
]]></artwork>
          <t>The DPoP proof the client sends with a SUBSCRIBE to track
"/sports/live" in that namespace:</t>
          <artwork><![CDATA[
Protected header:
{
  / alg / 1: -7,
  / typ / 16: "dpop-proof+cwt",
  / kccs / 14: {
    / cnf / 8: {
      / COSE_Key / 1: {
        / kty / 1: 2,
        / crv / -1: 1,
        / x / -2: h'60fed4ba255a9d31c961eb74c6356d68
                    c049b8923b61fa6ce669622e60f29fb6',
        / y / -3: h'7903fe1008b8bc99a41ae9e95628bc64
                    f2f1b20c2d7e9f5177a3c294d4462299'
      }
    }
  }
}

Payload:
{
  / iat / 6: 1749999000,
  / cti / 7: h'a1b2c3d4e5f60718',
  / actx / TBD_ACTX: {
    / type / 0: "moqt",
    / action / 1: 4,
    / namespace / 2: ['cdn', 'example.com'],
    / track / 3: '/sports/live'
  },
  / ath / TBD_ATH: h'...'  / SHA-256 of the CAT token /
}
]]></artwork>
          <t>The "ckt" value in the token is the COSE Key Thumbprint of the key in
the proof's header (the ES256 test key from Appendix A).</t>
        </section>
      </section>
      <section anchor="relay-validation">
        <name>Relay Validation</name>
        <t>A relay that receives an MOQT action with a DPoP-bound CAT token <bcp14>MUST</bcp14>
reject the action unless all of the following hold:</t>
        <ol spacing="normal" type="1"><li>
            <t>The CAT token is valid according to this document.</t>
          </li>
          <li>
            <t>A DPoP proof accompanies the action, and is a COSE_Sign1 whose
"typ" is "dpop-proof+cwt" and whose "alg" is a supported asymmetric
algorithm.</t>
          </li>
          <li>
            <t>The proof's signature verifies with the COSE_Key in its "kccs"
header parameter.</t>
          </li>
          <li>
            <t>The key matches the token's "cnf" claim: for "ckt", its COSE Key
Thumbprint <xref target="RFC9679"/> equals the "ckt" value; for "jkt", the JWK
SHA-256 Thumbprint <xref target="JWK-THUMB"/> of the equivalent JWK (for an EC2
key: "crv", "kty", "x" and "y") equals the "jkt" value.</t>
          </li>
          <li>
            <t>"ath" equals the SHA-256 hash of the token as presented.</t>
          </li>
          <li>
            <t>"iat" is within the window set by the "catdpop" claim.</t>
          </li>
          <li>
            <t>If the "catdpop" claim requests replay detection, the relay has not
accepted another proof with the same "cti" within that window.</t>
          </li>
          <li>
            <t>In "actx", "type" is "moqt", the action equals the requested action,
and the Track Namespace and Track Name equal those in the MOQT
message.</t>
          </li>
        </ol>
        <t>The relay then authorizes the action against the token's "moqt" claim
as for any other token.</t>
      </section>
      <section anchor="dpop-security-considerations">
        <name>DPoP Security Considerations</name>
        <t>The security considerations of <xref target="DPoP"/> apply. In addition:</t>
        <ul spacing="normal">
          <li>
            <t>A proof authorizes exactly one MOQT action. Because "actx" carries
the full action, namespace and track, a captured proof cannot be used
for a different action or track, and the "iat" window and "cti"
replay detection limit its reuse for the same one.</t>
          </li>
          <li>
            <t>DPoP relies on the QUIC or WebTransport connection for integrity and
confidentiality; it does not protect the MOQT messages themselves.</t>
          </li>
          <li>
            <t>Clients <bcp14>SHOULD NOT</bcp14> use the same key pair across unrelated deployments.</t>
          </li>
          <li>
            <t>Each proof adds to the size of the message that carries it.
Implementations need to keep the token and proof within the size
limits of that message.</t>
          </li>
        </ul>
      </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>DPoP security considerations are covered in the "DPoP for MOQT" section.</t>
      </section>
      <section anchor="replay-protection-for-bearer-tokens">
        <name>Replay Protection for Bearer Tokens</name>
        <t>Without DPoP, connection-scoped replay protection limits but does not
eliminate token theft risk; an attacker who intercepts the token
before the client connects can still use it. Deployments that need
stronger guarantees <bcp14>SHOULD</bcp14> use DPoP.</t>
        <t>The binding of a token to a connection is state held by the relay that
accepted it. In deployments with multiple relays, such as a CDN or
relay cluster, the same token can be replayed against another relay
unless the relays share this state. Such deployments <bcp14>SHOULD</bcp14> share
"cti" bindings among relays that accept the same tokens, or use DPoP.</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">Claim Name</th>
            <th align="left">Key</th>
            <th align="left">Description</th>
            <th align="left">Value Type</th>
            <th align="left">JWT</th>
            <th align="left">Ref</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">moqt</td>
            <td align="left">TBD_MOQT (1+2)</td>
            <td align="left">MOQT Action Scope</td>
            <td align="left">map</td>
            <td align="left">N/A</td>
            <td align="left">RFCXXXX</td>
          </tr>
          <tr>
            <td align="left">moqt-reval</td>
            <td align="left">TBD_MOQT (1+2)</td>
            <td align="left">MOQT Revalidation</td>
            <td align="left">number</td>
            <td align="left">N/A</td>
            <td align="left">RFCXXXX</td>
          </tr>
        </tbody>
      </table>
      <t>[RFC Editor: Please replace RFCXXXX with the published RFC number for this
document.]</t>
      <t>IANA will also register the following claims, used in DPoP proofs, in
the "CBOR Web Token (CWT) Claims" registry. The "ath" claim corresponds
to the JWT claim of the same name defined in <xref target="DPoP"/>.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Claim Name</th>
            <th align="left">Key</th>
            <th align="left">Description</th>
            <th align="left">Value Type</th>
            <th align="left">JWT</th>
            <th align="left">Ref</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">actx</td>
            <td align="left">TBD_ACTX</td>
            <td align="left">Authorization Context</td>
            <td align="left">map</td>
            <td align="left">N/A</td>
            <td align="left">RFCXXXX</td>
          </tr>
          <tr>
            <td align="left">ath</td>
            <td align="left">TBD_ATH</td>
            <td align="left">Access Token Hash</td>
            <td align="left">bstr</td>
            <td align="left">ath</td>
            <td align="left">RFCXXXX</td>
          </tr>
        </tbody>
      </table>
      <section anchor="media-type-registration">
        <name>Media Type Registration</name>
        <t>IANA will register the following media type in the "Media Types"
registry, for use as the "typ" of DPoP proofs:</t>
        <ul spacing="normal">
          <li>
            <t>Type name: application</t>
          </li>
          <li>
            <t>Subtype name: dpop-proof+cwt</t>
          </li>
          <li>
            <t>Required parameters: N/A</t>
          </li>
          <li>
            <t>Optional parameters: N/A</t>
          </li>
          <li>
            <t>Encoding considerations: binary (CBOR)</t>
          </li>
          <li>
            <t>Security considerations: see the "DPoP for MOQT" section of RFCXXXX</t>
          </li>
          <li>
            <t>Interoperability considerations: N/A</t>
          </li>
          <li>
            <t>Published specification: RFCXXXX</t>
          </li>
          <li>
            <t>Applications that use this media type: MOQT clients and relays that
use DPoP-bound CAT tokens</t>
          </li>
          <li>
            <t>Fragment identifier considerations: N/A</t>
          </li>
          <li>
            <t>Additional information: N/A</t>
          </li>
          <li>
            <t>Person and email address to contact for further information: Media
Over QUIC Working Group, moq@ietf.org</t>
          </li>
          <li>
            <t>Intended usage: COMMON</t>
          </li>
          <li>
            <t>Restrictions on usage: N/A</t>
          </li>
          <li>
            <t>Author: Media Over QUIC Working Group</t>
          </li>
          <li>
            <t>Change controller: IETF</t>
          </li>
        </ul>
      </section>
      <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">This document</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 the "DPoP for MOQT" section</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="6" month="July" year="2026"/>
          <abstract>
            <t>   Composite claims are claims for CBOR Web Tokens (CWTs) and JSON Web
   Tokens (JWTs) that define logical relationships between sets of
   claims.  This document also defines a CWT representation of the
   "crit" (Critical) claim.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-lemmons-cose-composite-claims-03"/>
      </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="1" month="October" 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-22"/>
      </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="31" month="October" 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:) This revision -29
   // attempts to implement various change requests not covered in -28
   // that have been discussed in the 2026-08-19 and 2026-09-30 WG
   // interim meetings, but does not attempt to reflect the outcome of
   // those discussions.  The text also does not have WG input yet on
   // any renaming decisions (CDN name, b1/t1 name).

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-edn-literals-29"/>
      </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="JWK-THUMB">
        <front>
          <title>JSON Web Key (JWK) Thumbprint</title>
          <author fullname="M. Jones" initials="M." surname="Jones"/>
          <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
          <date month="September" year="2015"/>
          <abstract>
            <t>This specification defines a method for computing a hash value over a JSON Web Key (JWK). It defines which fields in a JWK are used in the hash computation, the method of creating a canonical form for those fields, and how to convert the resulting Unicode string into a byte sequence to be hashed. The resulting hash value can be used for identifying or selecting the key represented by the JWK that is the subject of the thumbprint.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7638"/>
        <seriesInfo name="DOI" value="10.17487/RFC7638"/>
      </reference>
      <reference anchor="COSE">
        <front>
          <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
          <author fullname="J. Schaad" initials="J." surname="Schaad"/>
          <date month="August" year="2022"/>
          <abstract>
            <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
            <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="96"/>
        <seriesInfo name="RFC" value="9052"/>
        <seriesInfo name="DOI" value="10.17487/RFC9052"/>
      </reference>
      <reference anchor="COSE-ALG">
        <front>
          <title>CBOR Object Signing and Encryption (COSE): Initial Algorithms</title>
          <author fullname="J. Schaad" initials="J." surname="Schaad"/>
          <date month="August" year="2022"/>
          <abstract>
            <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines a set of algorithms that can be used with the CBOR Object Signing and Encryption (COSE) protocol (RFC 9052).</t>
            <t>This document, along with RFC 9052, obsoletes RFC 8152.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9053"/>
        <seriesInfo name="DOI" value="10.17487/RFC9053"/>
      </reference>
      <reference anchor="CWT">
        <front>
          <title>CBOR Web Token (CWT)</title>
          <author fullname="M. Jones" initials="M." surname="Jones"/>
          <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
          <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
          <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
          <date month="May" year="2018"/>
          <abstract>
            <t>CBOR Web Token (CWT) is a compact means of representing claims to be transferred between two parties. The claims in a CWT are encoded in the Concise Binary Object Representation (CBOR), and CBOR Object Signing and Encryption (COSE) is used for added application-layer security protection. A claim is a piece of information asserted about a subject and is represented as a name/value pair consisting of a claim name and a claim value. CWT is derived from JSON Web Token (JWT) but uses CBOR rather than JSON.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8392"/>
        <seriesInfo name="DOI" value="10.17487/RFC8392"/>
      </reference>
      <reference anchor="CWT-CNF">
        <front>
          <title>Proof-of-Possession Key Semantics for CBOR Web Tokens (CWTs)</title>
          <author fullname="M. Jones" initials="M." surname="Jones"/>
          <author fullname="L. Seitz" initials="L." surname="Seitz"/>
          <author fullname="G. Selander" initials="G." surname="Selander"/>
          <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
          <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
          <date month="March" year="2020"/>
          <abstract>
            <t>This specification describes how to declare in a CBOR Web Token (CWT) (which is defined by RFC 8392) that the presenter of the CWT possesses a particular proof-of-possession key. Being able to prove possession of a key is also sometimes described as being the holder-of-key. This specification provides equivalent functionality to "Proof-of-Possession Key Semantics for JSON Web Tokens (JWTs)" (RFC 7800) but using Concise Binary Object Representation (CBOR) and CWTs rather than JavaScript Object Notation (JSON) and JSON Web Tokens (JWTs).</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8747"/>
        <seriesInfo name="DOI" value="10.17487/RFC8747"/>
      </reference>
      <reference anchor="RFC9679">
        <front>
          <title>CBOR Object Signing and Encryption (COSE) Key Thumbprint</title>
          <author fullname="K. Isobe" initials="K." surname="Isobe"/>
          <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
          <author fullname="O. Steele" initials="O." surname="Steele"/>
          <date month="December" year="2024"/>
          <abstract>
            <t>This specification defines a method for computing a hash value over a CBOR Object Signing and Encryption (COSE) Key. It specifies which fields within the COSE Key structure are included in the cryptographic hash computation, the process for creating a canonical representation of these fields, and how to hash the resulting byte sequence. The resulting hash value, referred to as a "thumbprint", can be used to identify or select the corresponding key.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9679"/>
        <seriesInfo name="DOI" value="10.17487/RFC9679"/>
      </reference>
      <reference anchor="RFC9528">
        <front>
          <title>Ephemeral Diffie-Hellman Over COSE (EDHOC)</title>
          <author fullname="G. Selander" initials="G." surname="Selander"/>
          <author fullname="J. Preuß Mattsson" initials="J." surname="Preuß Mattsson"/>
          <author fullname="F. Palombini" initials="F." surname="Palombini"/>
          <date month="March" year="2024"/>
          <abstract>
            <t>This document specifies Ephemeral Diffie-Hellman Over COSE (EDHOC), a very compact and lightweight authenticated Diffie-Hellman key exchange with ephemeral keys. EDHOC provides mutual authentication, forward secrecy, and identity protection. EDHOC is intended for usage in constrained scenarios, and a main use case is to establish an Object Security for Constrained RESTful Environments (OSCORE) security context. By reusing CBOR Object Signing and Encryption (COSE) for cryptography, Concise Binary Object Representation (CBOR) for encoding, and Constrained Application Protocol (CoAP) for transport, the additional code size can be kept very low.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9528"/>
        <seriesInfo name="DOI" value="10.17487/RFC9528"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC8392">
        <front>
          <title>CBOR Web Token (CWT)</title>
          <author fullname="M. Jones" initials="M." surname="Jones"/>
          <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
          <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
          <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
          <date month="May" year="2018"/>
          <abstract>
            <t>CBOR Web Token (CWT) is a compact means of representing claims to be transferred between two parties. The claims in a CWT are encoded in the Concise Binary Object Representation (CBOR), and CBOR Object Signing and Encryption (COSE) is used for added application-layer security protection. A claim is a piece of information asserted about a subject and is represented as a name/value pair consisting of a claim name and a claim value. CWT is derived from JSON Web Token (JWT) but uses CBOR rather than JSON.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8392"/>
        <seriesInfo name="DOI" value="10.17487/RFC8392"/>
      </reference>
    </references>
    <?line 867?>

<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. Tokens use COSE_Mac0 (CBOR tag 17) for
HMAC-SHA256 or COSE_Sign1 (CBOR tag 18) for ES256. Token strings are the
base64url encoding of the full COSE structure.</t>
      <t>The JSON is only a container for the vectors; it does not define a JSON
representation of CAT claims. The "payload_cbor_hex" value is the
normative claim set. The "claims_edn" value shows the same claim set in
CBOR Extended Diagnostic Notation <xref target="EDN"/>, with claim names as comments.</t>
      <t>Long string values are folded across lines to fit this document. The line
breaks and the indentation that follows them are not part of the JSON
string. To unfold a hex or base64url value, remove each line break and the
indentation after it. In "description" and "claims_edn" values, replace
each line break and its indentation with a single space.</t>
      <t>The moqt and moqt-reval claims do not yet have assigned claim keys
(TBD_MOQT and TBD_MOQT_REVAL). These vectors use the Private Use claim keys
-65537 for moqt and -65538 for moqt-reval <xref target="RFC8392"/> as placeholders.</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_edn":
      "{1 /iss/: \"https://auth.example.com\"}",
    "payload_cbor_hex":
      "a101781868747470733a2f2f617574682e6578616d706c652e636f6d"
  },
  {
    "id": "cbor_core_claims",
    "description": "All core CWT claims (iss, aud, exp, nbf, cti)",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\",
       3 /aud/: [\"https://relay.example.com\"], 4 /exp/: 1700086400,
       5 /nbf/: 1700000000, 7 /cti/: h'746573742d746f6b656e2d303031'}",
    "payload_cbor_hex":
      "a501781868747470733a2f2f617574682e6578616d706c652e636f6d
       0381781968747470733a2f2f72656c61792e6578616d706c652e636f
       6d041a65554280051a6553f100074e746573742d746f6b656e2d3030
       31"
  },
  {
    "id": "cbor_cat_version_uri",
    "description": "CAT version (uint 1) and URI match rule",
    "claims_edn":
      "{310 /catv/: 1,
       312 /catu/: {1 /host/: {0 /exact/: \"example.com\"}}}",
    "payload_cbor_hex":
      "a219013601190138a101a1006b6578616d706c652e636f6d"
  },
  {
    "id": "cbor_network_identifiers",
    "description": "Network identifiers: IP, CIDR, ASN, ASN range",
    "claims_edn":
      "{311 /catnip/: [52(h'c0a80164'), 52([8, h'0a']), 64512, [64512,
       64768]]}",
    "payload_cbor_hex":
      "a119013784d83444c0a80164d8348208410a19fc008219fc0019fd00"
  },
  {
    "id": "cbor_geographic_claims",
    "description":
      "Geographic claims: coordinates, geohash, ISO 3166, altitude",
    "claims_edn":
      "{282 /geohash/: \"9q8yyk\", 316 /catgeoiso3166/: [\"US\",
       \"CA\"], 317 /catgeocoord/: [[37.7749, -122.4194, 100]],
       318 /catgeoalt/: [10, 5]}",
    "payload_cbor_hex":
      "a419011a6639713879796b19013c8262555362434119013d8183fb40
       42e32fec56d5d0fbc05e9ad77318fc50186419013e820a05"
  },
  {
    "id": "cbor_uri_match_rules",
    "description":
      "URI match rules: host exact, path prefix, extension exact",
    "claims_edn":
      "{312 /catu/: {1 /host/: {0 /exact/: \"example.com\"},
       3 /path/: {1 /prefix/: \"/vod/\"},
       8 /extension/: {0 /exact/: \".m3u8\"}}}",
    "payload_cbor_hex":
      "a1190138a301a1006b6578616d706c652e636f6d03a101652f766f64
       2f08a100652e6d337538"
  },
  {
    "id": "cbor_catu_with_moqt",
    "description":
      "catu (HTTP) and moqt (MOQT) in one token: host
       exact + path prefix, and Subscribe/Fetch on namespace
       (example.com, vod)",
    "claims_edn":
      "{312 /catu/: {1 /host/: {0 /exact/: \"example.com\"},
       3 /path/: {1 /prefix/: \"/vod/\"}}, -65537 /moqt/: {0: [[[4,
       7], [h'6578616d706c652e636f6d', h'766f64']]]}}",
    "payload_cbor_hex":
      "a2190138a201a1006b6578616d706c652e636f6d03a101652f766f64
       2f3a00010000a1008182820407824b6578616d706c652e636f6d4376
       6f64"
  },
  {
    "id": "cbor_alpn",
    "description": "ALPN protocol identifiers",
    "claims_edn":
      "{314 /catalpn/: [h'6d6f712d3030', h'6833']}",
    "payload_cbor_hex":
      "a119013a82466d6f712d3030426833"
  }
]
]]></sourcecode>
      </section>
      <section anchor="token-structure">
        <name>Token Structure</name>
        <t>These vectors validate the full COSE_Mac0 (tag 17) and COSE_Sign1 (tag 18)
token structure with cryptographic verification. Each vector includes the
COSE binary encoding (cose_hex) and its base64url representation (cose_b64).</t>
        <sourcecode type="json"><![CDATA[
[
  {
    "id": "token_hmac_minimal",
    "description": "Minimal COSE_Mac0 token signed with HMAC-SHA256",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\",
       3 /aud/: [\"https://relay.example.com\"], 4 /exp/: 1700086400}",
    "algorithm": "HMAC-SHA256",
    "algorithm_id": 5,
    "header_cbor_hex": "a201051063434154",
    "payload_cbor_hex":
      "a301781868747470733a2f2f617574682e6578616d706c652e636f6d
       0381781968747470733a2f2f72656c61792e6578616d706c652e636f
       6d041a65554280",
    "tag_hex":
      "16ca16a2d4e2476528ae858d91b00f257a507fe57284bfb13d7d6ca1
       f065e230",
    "key_hex":
      "000102030405060708090a0b0c0d0e0f101112131415161718191a1b
       1c1d1e1f",
    "cose_hex":
      "d18448a201051063434154a0583fa301781868747470733a2f2f6175
       74682e6578616d706c652e636f6d0381781968747470733a2f2f7265
       6c61792e6578616d706c652e636f6d041a65554280582016ca16a2d4
       e2476528ae858d91b00f257a507fe57284bfb13d7d6ca1f065e230",
    "cose_b64":
      "0YRIogEFEGNDQVSgWD-jAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       A4F4GWh0dHBzOi8vcmVsYXkuZXhhbXBsZS5jb20EGmVVQoBYIBbKFqLU
       4kdlKK6FjZGwDyV6UH_lcoS_sT19bKHwZeIw",
    "valid": true
  },
  {
    "id": "token_hmac_full",
    "description":
      "COSE_Mac0 token with core + CAT + informational claims,
       HMAC-SHA256",
    "claims_edn":
      "{1 /iss/: \"https://issuer.moq.example\",
       2 /sub/: \"user:alice@example.com\",
       3 /aud/: [\"https://relay1.example.com\",
       \"https://relay2.example.com\"], 4 /exp/: 1700086400,
       5 /nbf/: 1700000000, 6 /iat/: 1700000000,
       7 /cti/: h'766563746f722d303032', 310 /catv/: 1,
       311 /catnip/: [52(h'cb007132')],
       312 /catu/: {3 /path/: {1 /prefix/: \"/live/\"}}}",
    "algorithm": "HMAC-SHA256",
    "algorithm_id": 5,
    "header_cbor_hex": "a201051063434154",
    "payload_cbor_hex":
      "aa01781a68747470733a2f2f6973737565722e6d6f712e6578616d70
       6c650276757365723a616c696365406578616d706c652e636f6d0382
       781a68747470733a2f2f72656c6179312e6578616d706c652e636f6d
       781a68747470733a2f2f72656c6179322e6578616d706c652e636f6d
       041a65554280051a6553f100061a6553f100074a766563746f722d30
       30321901360119013781d83444cb007132190138a103a101662f6c69
       76652f",
    "tag_hex":
      "29c1a6612ce6d49273fd8c0116b9decbc287662d5ba5d67defafaf6f
       f0c11278",
    "key_hex":
      "000102030405060708090a0b0c0d0e0f101112131415161718191a1b
       1c1d1e1f",
    "cose_hex":
      "d18448a201051063434154a058abaa01781a68747470733a2f2f6973
       737565722e6d6f712e6578616d706c650276757365723a616c696365
       406578616d706c652e636f6d0382781a68747470733a2f2f72656c61
       79312e6578616d706c652e636f6d781a68747470733a2f2f72656c61
       79322e6578616d706c652e636f6d041a65554280051a6553f100061a
       6553f100074a766563746f722d3030321901360119013781d83444cb
       007132190138a103a101662f6c6976652f582029c1a6612ce6d49273
       fd8c0116b9decbc287662d5ba5d67defafaf6ff0c11278",
    "cose_b64":
      "0YRIogEFEGNDQVSgWKuqAXgaaHR0cHM6Ly9pc3N1ZXIubW9xLmV4YW1w
       bGUCdnVzZXI6YWxpY2VAZXhhbXBsZS5jb20DgngaaHR0cHM6Ly9yZWxh
       eTEuZXhhbXBsZS5jb214Gmh0dHBzOi8vcmVsYXkyLmV4YW1wbGUuY29t
       BBplVUKABRplU_EABhplU_EAB0p2ZWN0b3ItMDAyGQE2ARkBN4HYNETL
       AHEyGQE4oQOhAWYvbGl2ZS9YICnBpmEs5tSSc_2MARa53svCh2YtW6XW
       fe-vr2_wwRJ4",
    "valid": true
  },
  {
    "id": "token_es256",
    "description":
      "COSE_Sign1 token signed with ES256
       (P-256 ECDSA, deterministic RFC 6979)",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\",
       3 /aud/: [\"https://moq-relay.example.com\"],
       4 /exp/: 1700086400, 5 /nbf/: 1700000000}",
    "algorithm": "ES256",
    "algorithm_id": -7,
    "header_cbor_hex": "a201261063434154",
    "payload_cbor_hex":
      "a401781868747470733a2f2f617574682e6578616d706c652e636f6d
       0381781d68747470733a2f2f6d6f712d72656c61792e6578616d706c
       652e636f6d041a65554280051a6553f100",
    "signature_hex":
      "ed8cf586f32ba410f2b3097642eb32255c8dc555e9e058c48084809d
       f557887bc5ee4974a9ef5c4557c1557de799628b634cafaa1b74c936
       968e0c9c3a48f222",
    "private_key_hex":
      "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b
       120f6721",
    "public_key_x_hex":
      "60fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e
       60f29fb6",
    "public_key_y_hex":
      "7903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294
       d4462299",
    "cose_hex":
      "d28448a201261063434154a05849a401781868747470733a2f2f6175
       74682e6578616d706c652e636f6d0381781d68747470733a2f2f6d6f
       712d72656c61792e6578616d706c652e636f6d041a65554280051a65
       53f1005840ed8cf586f32ba410f2b3097642eb32255c8dc555e9e058
       c48084809df557887bc5ee4974a9ef5c4557c1557de799628b634caf
       aa1b74c936968e0c9c3a48f222",
    "cose_b64":
      "0oRIogEmEGNDQVSgWEmkAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       A4F4HWh0dHBzOi8vbW9xLXJlbGF5LmV4YW1wbGUuY29tBBplVUKABRpl
       U_EAWEDtjPWG8yukEPKzCXZC6zIlXI3FVengWMSAhICd9VeIe8XuSXSp
       71xFV8FVfeeZYotjTK-qG3TJNpaODJw6SPIi",
    "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":
      "HMAC token with DPoP cnf-jkt derived from the fixed ES256
       test key (RFC 7638 JWK thumbprint)",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\", 4 /exp/: 1700086400,
       8 /cnf/: {323: h'0cebf1bc9880748a95588905b79843b42ba75cb174055
       e3e246bf87fe00b4a6d'}, 321 /catdpop/: {0: 60, 1: 1}}",
    "dpop": {
      "cnf_jkt_hex":
        "0cebf1bc9880748a95588905b79843b42ba75cb174055e3e246bf87f
         e00b4a6d",
      "cnf_jkt_source":
        "SHA-256(RFC 7638 canonical JWK of ES256 test key)",
      "window_seconds": 60,
      "honor_jti": true
    },
    "payload_cbor_hex":
      "a401781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a6555428008a119014358200cebf1bc9880748a95588905b79843
       b42ba75cb174055e3e246bf87fe00b4a6d190141a200183c0101",
    "cose_hex":
      "d18448a201051063434154a05852a401781868747470733a2f2f6175
       74682e6578616d706c652e636f6d041a6555428008a119014358200c
       ebf1bc9880748a95588905b79843b42ba75cb174055e3e246bf87fe0
       0b4a6d190141a200183c01015820cef11ccef3533e37884638bbff1e
       08cbcf3d6846afcc0257bf2530416b076242",
    "cose_b64":
      "0YRIogEFEGNDQVSgWFKkAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       BBplVUKACKEZAUNYIAzr8byYgHSKlViJBbeYQ7Qrp1yxdAVePiRr-H_g
       C0ptGQFBogAYPAEBWCDO8RzO81M-N4hGOLv_HgjLzz1oRq_MAle_JTBB
       awdiQg"
  },
  {
    "id": "dpop_no_jti",
    "description":
      "DPoP binding with longer window, JTI processing disabled",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\", 4 /exp/: 1700086400,
       8 /cnf/: {323: h'3c82dfd6358ba804bd90879c34e743bbe13aeab798066
       4944f37a0ec0063fe95'}, 321 /catdpop/: {0: 300, 1: 0}}",
    "dpop": {
      "cnf_jkt_hex":
        "3c82dfd6358ba804bd90879c34e743bbe13aeab7980664944f37a0ec
         0063fe95",
      "cnf_jkt_source": "SHA-256 of 'test-public-key-material'",
      "window_seconds": 300,
      "honor_jti": false
    },
    "payload_cbor_hex":
      "a401781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a6555428008a119014358203c82dfd6358ba804bd90879c34e743
       bbe13aeab7980664944f37a0ec0063fe95190141a20019012c0100",
    "cose_hex":
      "d18448a201051063434154a05853a401781868747470733a2f2f6175
       74682e6578616d706c652e636f6d041a6555428008a119014358203c
       82dfd6358ba804bd90879c34e743bbe13aeab7980664944f37a0ec00
       63fe95190141a20019012c01005820ecb7a5b5667b95f20c67341771
       8eac9f5d997fd427485942a61048cdd8c50e0c",
    "cose_b64":
      "0YRIogEFEGNDQVSgWFOkAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       BBplVUKACKEZAUNYIDyC39Y1i6gEvZCHnDTnQ7vhOuq3mAZklE83oOwA
       Y_6VGQFBogAZASwBAFgg7LeltWZ7lfIMZzQXcY6sn12Zf9QnSFlCphBI
       zdjFDgw"
  },
  {
    "id": "dpop_es256_real_binding",
    "description":
      "ES256 token with real JWK thumbprint binding to the
       signing key",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\",
       3 /aud/: [\"https://relay.example.com\"], 4 /exp/: 1700086400,
       8 /cnf/: {323: h'0cebf1bc9880748a95588905b79843b42ba75cb174055
       e3e246bf87fe00b4a6d'}, 321 /catdpop/: {0: 120}}",
    "algorithm": "ES256",
    "jwk_thumbprint_input":
      "{\"crv\":\"P-256\",\"kty\":\"EC\",\"x\":\"YP7UuiVanTHJYet0
       xjVtaMBJuJI7Yfps5mliLmDyn7Y\",\"y\":\"eQP-EAi4vJmkGunpVii
       8ZPLxsgwtfp9Rd6PClNRGIpk\"}",
    "dpop": {
      "cnf_jkt_hex":
        "0cebf1bc9880748a95588905b79843b42ba75cb174055e3e246bf87f
         e00b4a6d",
      "window_seconds": 120,
      "honor_jti": null
    },
    "public_key_x_hex":
      "60fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e
       60f29fb6",
    "public_key_y_hex":
      "7903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294
       d4462299",
    "payload_cbor_hex":
      "a501781868747470733a2f2f617574682e6578616d706c652e636f6d
       0381781968747470733a2f2f72656c61792e6578616d706c652e636f
       6d041a6555428008a119014358200cebf1bc9880748a95588905b798
       43b42ba75cb174055e3e246bf87fe00b4a6d190141a1001878",
    "cose_hex":
      "d28448a201261063434154a0586da501781868747470733a2f2f6175
       74682e6578616d706c652e636f6d0381781968747470733a2f2f7265
       6c61792e6578616d706c652e636f6d041a6555428008a11901435820
       0cebf1bc9880748a95588905b79843b42ba75cb174055e3e246bf87f
       e00b4a6d190141a10018785840cdb69dc3db876b1d05a8f808e5286a
       861026fc8b58b9a9aa97f23bdf0253ff56357f9129ee9b0966770135
       7c8d700721b3029928d4fe573d56a88744dce04f82",
    "cose_b64":
      "0oRIogEmEGNDQVSgWG2lAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       A4F4GWh0dHBzOi8vcmVsYXkuZXhhbXBsZS5jb20EGmVVQoAIoRkBQ1gg
       DOvxvJiAdIqVWIkFt5hDtCunXLF0BV4-JGv4f-ALSm0ZAUGhABh4WEDN
       tp3D24drHQWo-AjlKGqGECb8i1i5qaqX8jvfAlP_VjV_kSnumwlmdwE1
       fI1wByGzApko1P5XPVaoh0Tc4E-C"
  }
]
]]></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",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\", 4 /exp/: 1700086400,
       -65537 /moqt/: {0: [[[2, 6], [h'6578616d706c652e636f6d',
       h'616c696365'], [1, h'766964656f2d']]]}}",
    "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
       041a655542803a00010000a1008183820206824b6578616d706c652e
       636f6d45616c696365820146766964656f2d",
    "cose_hex":
      "d18448a201051063434154a0584aa301781868747470733a2f2f6175
       74682e6578616d706c652e636f6d041a655542803a00010000a10081
       83820206824b6578616d706c652e636f6d45616c6963658201467669
       64656f2d5820467c57ade72d6be629b745ef33d6e28ec38ba1ca8bd3
       feb851f3832af94fe686",
    "cose_b64":
      "0YRIogEFEGNDQVSgWEqjAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       BBplVUKAOgABAAChAIGDggIGgktleGFtcGxlLmNvbUVhbGljZYIBRnZp
       ZGVvLVggRnxXrecta-Ypt0XvM9bijsOLocqL0_64UfODKvlP5oY",
    "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",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\", 4 /exp/: 1700086400,
       -65537 /moqt/: {0: [[[3, 4, 7], [[1,
       h'636f6e666572656e63652e6578616d706c65']]]]}}",
    "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
       041a655542803a00010000a10081828303040781820152636f6e6665
       72656e63652e6578616d706c65",
    "cose_hex":
      "d18448a201051063434154a05845a301781868747470733a2f2f6175
       74682e6578616d706c652e636f6d041a655542803a00010000a10081
       828303040781820152636f6e666572656e63652e6578616d706c6558
       20e0502202b8c01d5ab61508cd19b7dd943b287be0f26c3d37c12e58
       3ca87a937b",
    "cose_b64":
      "0YRIogEFEGNDQVSgWEWjAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       BBplVUKAOgABAAChAIGCgwMEB4GCAVJjb25mZXJlbmNlLmV4YW1wbGVY
       IOBQIgK4wB1athUIzRm33ZQ7KHvg8mw9N8EuWDyoepN7",
    "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",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\", 4 /exp/: 1700086400,
       -65537 /moqt/: {0: [[[2, 6], [h'6c6976652e6578616d706c65',
       h'73747564696f2d61']], [[4, 7], [[1,
       h'6c6976652e6578616d706c65']]]]}, -65538 /moqt-reval/: 300}",
    "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
       041a655542803a00010000a1008282820206824c6c6976652e657861
       6d706c654873747564696f2d61828204078182014c6c6976652e6578
       616d706c653a0001000119012c",
    "cose_hex":
      "d18448a201051063434154a05861a401781868747470733a2f2f6175
       74682e6578616d706c652e636f6d041a655542803a00010000a10082
       82820206824c6c6976652e6578616d706c654873747564696f2d6182
       8204078182014c6c6976652e6578616d706c653a0001000119012c58
       20f1080af59a719fbcb7a036aa6f9714f52ada467b8c1677c87ade0f
       cfccaaf50f",
    "cose_b64":
      "0YRIogEFEGNDQVSgWGGkAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       BBplVUKAOgABAAChAIKCggIGgkxsaXZlLmV4YW1wbGVIc3R1ZGlvLWGC
       ggQHgYIBTGxpdmUuZXhhbXBsZToAAQABGQEsWCDxCAr1mnGfvLegNqpv
       lxT1KtpGe4wWd8h63g_PzKr1Dw",
    "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",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\", 4 /exp/: 1700086400,
       -65537 /moqt/: {0: [[[0, 1, 2, 3, 4, 5, 6, 7, 8]]]}}",
    "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
       041a655542803a00010000a100818189000102030405060708",
    "cose_hex":
      "d18448a201051063434154a05835a301781868747470733a2f2f6175
       74682e6578616d706c652e636f6d041a655542803a00010000a10081
       81890001020304050607085820172ebe07f227a41c319684ef916fdb
       f142d391fac6902e38bcdcfb3966b46a50",
    "cose_b64":
      "0YRIogEFEGNDQVSgWDWjAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       BBplVUKAOgABAAChAIGBiQABAgMEBQYHCFggFy6-B_InpBwxloTvkW_b
       8ULTkfrGkC44vNz7OWa0alA",
    "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",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\", 4 /exp/: 1700086400,
       -65537 /moqt/: {0: [[[4], [[2, h'2e6578616d706c652e636f6d']],
       [2, h'2d617564696f']]]}}",
    "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
       041a655542803a00010000a100818381048182024c2e6578616d706c
       652e636f6d8202462d617564696f",
    "cose_hex":
      "d18448a201051063434154a05846a301781868747470733a2f2f6175
       74682e6578616d706c652e636f6d041a655542803a00010000a10081
       8381048182024c2e6578616d706c652e636f6d8202462d617564696f
       5820602c1ceb2729485a2b5eb09249e254a41d42abd0b63b2846fd67
       7d7fbf593920",
    "cose_b64":
      "0YRIogEFEGNDQVSgWEajAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       BBplVUKAOgABAAChAIGDgQSBggJMLmV4YW1wbGUuY29tggJGLWF1ZGlv
       WCBgLBzrJylIWitesJJJ4lSkHUKr0LY7KEb9Z31_v1k5IA",
    "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="composite-claims">
        <name>Composite Claims</name>
        <t>These vectors validate composite claim encoding per
<xref target="Composite"/>. Each vector includes an outer
token (iss, exp) with embedded composite claims. Tokens use COSE_Mac0 with
HMAC-SHA256.</t>
        <t>The or, nor and and claims do not yet have assigned claim keys. Until they
are allocated, these vectors encode every composite claim key as 0. 0 is
not a valid claim key, so a verifier fails to parse these claims. The
"claims_edn" value and the "operator" field identify which composite claim
each 0 key stands for.</t>
        <sourcecode type="json"><![CDATA[
[
  {
    "id": "composite_or_simple",
    "description":
      "OR composite: at least one of two alternative claim sets
       must be acceptable",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\", 4 /exp/: 1700086400,
       0 /or/: [{1 /iss/: \"https://auth.example.com\",
       4 /exp/: 1700086400, 310 /catv/: 1},
       {1 /iss/: \"https://auth-backup.example.com\",
       4 /exp/: 1700090000, 310 /catv/: 1}]}",
    "composite": {"operator": "OR", "claim_key": 0},
    "payload_cbor_hex":
      "a301781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a655542800082a301781868747470733a2f2f617574682e657861
       6d706c652e636f6d041a6555428019013601a301781f68747470733a
       2f2f617574682d6261636b75702e6578616d706c652e636f6d041a65
       55509019013601",
    "cose_hex":
      "d18448a201051063434154a05877a301781868747470733a2f2f6175
       74682e6578616d706c652e636f6d041a655542800082a30178186874
       7470733a2f2f617574682e6578616d706c652e636f6d041a65554280
       19013601a301781f68747470733a2f2f617574682d6261636b75702e
       6578616d706c652e636f6d041a655550901901360158208ebb4ac5a3
       4771116903baff5e544f3047468faeb077820f26ea2df940b6c58d",
    "cose_b64":
      "0YRIogEFEGNDQVSgWHejAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       BBplVUKAAIKjAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29tBBplVUKA
       GQE2AaMBeB9odHRwczovL2F1dGgtYmFja3VwLmV4YW1wbGUuY29tBBpl
       VVCQGQE2AVggjrtKxaNHcRFpA7r_XlRPMEdGj66wd4IPJuot-UC2xY0"
  },
  {
    "id": "composite_and",
    "description":
      "AND composite: both claim sets must be acceptable",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\", 4 /exp/: 1700086400,
       0 /and/: [{4 /exp/: 1700086400, 310 /catv/: 1},
       {4 /exp/: 1700086400, 311 /catnip/: [52(h'0a000000')]}]}",
    "composite": {"operator": "AND", "claim_key": 0},
    "payload_cbor_hex":
      "a301781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a655542800082a2041a6555428019013601a2041a655542801901
       3781d834440a000000",
    "cose_hex":
      "d18448a201051063434154a05841a301781868747470733a2f2f6175
       74682e6578616d706c652e636f6d041a655542800082a2041a655542
       8019013601a2041a6555428019013781d834440a00000058208ca321
       3e71dfe3900fd910fcb7f6d365949e72e81ceba80f2ff24048502e9a
       1a",
    "cose_b64":
      "0YRIogEFEGNDQVSgWEGjAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       BBplVUKAAIKiBBplVUKAGQE2AaIEGmVVQoAZATeB2DRECgAAAFggjKMh
       PnHf45AP2RD8t_bTZZSecugc66gPL_JASFAumho"
  },
  {
    "id": "composite_nor",
    "description":
      "NOR composite: none of the listed claim sets can be
       acceptable",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\", 4 /exp/: 1700086400,
       0 /nor/: [{1 /iss/: \"https://revoked.example.com\",
       4 /exp/: 1700086400}]}",
    "composite": {"operator": "NOR", "claim_key": 0},
    "payload_cbor_hex":
      "a301781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a655542800081a201781b68747470733a2f2f7265766f6b65642e
       6578616d706c652e636f6d041a65554280",
    "cose_hex":
      "d18448a201051063434154a05849a301781868747470733a2f2f6175
       74682e6578616d706c652e636f6d041a655542800081a201781b6874
       7470733a2f2f7265766f6b65642e6578616d706c652e636f6d041a65
       5542805820a5419cd0db084ac9efc26c21ff2663b4ec0cff6622ae48
       719f65738cb93fd19e",
    "cose_b64":
      "0YRIogEFEGNDQVSgWEmjAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       BBplVUKAAIGiAXgbaHR0cHM6Ly9yZXZva2VkLmV4YW1wbGUuY29tBBpl
       VUKAWCClQZzQ2whKye_CbCH_JmO07Az_ZiKuSHGfZXOMuT_Rng"
  },
  {
    "id": "composite_nested",
    "description":
      "Nested composite: OR containing a standalone claim set
       and a nested AND",
    "claims_edn":
      "{1 /iss/: \"https://auth.example.com\", 4 /exp/: 1700086400,
       0 /or/: [{1 /iss/: \"https://primary.example.com\",
       4 /exp/: 1700086400},
       {0 /and/: [{1 /iss/: \"https://secondary.example.com\",
       4 /exp/: 1700086400}, {4 /exp/: 1700086400, 310 /catv/: 1}]}]}",
    "composite": {"operator": "OR", "claim_key": 0},
    "payload_cbor_hex":
      "a301781868747470733a2f2f617574682e6578616d706c652e636f6d
       041a655542800082a201781b68747470733a2f2f7072696d6172792e
       6578616d706c652e636f6d041a65554280a10082a201781d68747470
       733a2f2f7365636f6e646172792e6578616d706c652e636f6d041a65
       554280a2041a6555428019013601",
    "cose_hex":
      "d18448a201051063434154a0587ea301781868747470733a2f2f6175
       74682e6578616d706c652e636f6d041a655542800082a201781b6874
       7470733a2f2f7072696d6172792e6578616d706c652e636f6d041a65
       554280a10082a201781d68747470733a2f2f7365636f6e646172792e
       6578616d706c652e636f6d041a65554280a2041a6555428019013601
       5820c60304bcd67f2f78bf9e83e84fe3a2d13f8e809659a32cc480c7
       6cfe5ae1da06",
    "cose_b64":
      "0YRIogEFEGNDQVSgWH6jAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29t
       BBplVUKAAIKiAXgbaHR0cHM6Ly9wcmltYXJ5LmV4YW1wbGUuY29tBBpl
       VUKAoQCCogF4HWh0dHBzOi8vc2Vjb25kYXJ5LmV4YW1wbGUuY29tBBpl
       VUKAogQaZVVCgBkBNgFYIMYDBLzWfy94v56D6E_jotE_joCWWaMsxIDH
       bP5a4doG"
  }
]
]]></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 (algorithm_id 5) with the key specified in the
Keys section unless otherwise noted. Token values are the base64url encoding
of the full COSE_Mac0 structure.</t>
        <sourcecode type="json"><![CDATA[
[
  {
    "id": "valid_basic",
    "description":
      "Valid token with correct issuer, audience, and time bounds",
    "token":
      "0YRIogEFEGNDQVSgWEWkAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUu
       Y29tA4F4GWh0dHBzOi8vcmVsYXkuZXhhbXBsZS5jb20EGmVVQoAFGm
       VT8QBYIP30vfENhlwaLMuZjMPeYXjz8QWuqCDlyzStGQVQ4_xi",
    "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":
      "0YRIogEFEGNDQVSgWCKiAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUu
       Y29tBBpfXhAAWCDNInUDQ2qsHo8l8Gj0tzb1HIYIpBheVbVoItgT7U
       a6aA",
    "validation": {
      "reference_time": 1700000000,
      "expected_result": "error",
      "expected_error": "TokenExpired"
    }
  },
  {
    "id": "invalid_not_yet_valid",
    "description": "Token with not-before in the future",
    "token":
      "0YRIogEFEGNDQVSgWCijAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUu
       Y29tBBplVpQABRplVUKAWCArREpqUH1KiIrMzevyeLr6t_y-L6oheaJ
       GUU9hwhYRbg",
    "validation": {
      "reference_time": 1700000000,
      "expected_result": "error",
      "expected_error": "TokenNotYetValid"
    }
  },
  {
    "id": "invalid_wrong_issuer",
    "description": "Token from untrusted issuer",
    "token":
      "0YRIogEFEGNDQVSgWD-jAXgYaHR0cHM6Ly9ldmlsLmV4YW1wbGUu
       Y29tA4F4GWh0dHBzOi8vcmVsYXkuZXhhbXBsZS5jb20EGmVVQoBYIO
       mQtbjAMxCnCDlMbHiF-XZlN1SV6QSqkZWTguttCpaC",
    "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":
      "0YRIogEFEGNDQVSgWEWjAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUu
       Y29tA4F4H2h0dHBzOi8vb3RoZXItcmVsYXkuZXhhbXBsZS5jb20EGm
       VVQoBYIOeCJJJNAkaNHBBkOdcSFVXKNNj0D8GdGkLmOriIB2pX",
    "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":
      "COSE_Mac0 token with corrupted tag (first byte flipped)",
    "original_cose_hex":
      "d18448a201051063434154a0583fa301781868747470733a2f2f61757
       4682e6578616d706c652e636f6d0381781968747470733a2f2f72656c
       61792e6578616d706c652e636f6d041a65554280582016ca16a2d4e24
       76528ae858d91b00f257a507fe57284bfb13d7d6ca1f065e230",
    "token":
      "0YRIogEFEGNDQVSgWD-jAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUu
       Y29tA4F4GWh0dHBzOi8vcmVsYXkuZXhhbXBsZS5jb20EGmVVQoBYIO
       nKFqLU4kdlKK6FjZGwDyV6UH_lcoS_sT19bKHwZeIw",
    "validation": {
      "expected_result": "error",
      "expected_error": "SignatureVerificationFailed",
      "key_hex":
        "000102030405060708090a0b0c0d0e0f101112131415161718191a1b
         1c1d1e1f"
    }
  },
  {
    "id": "invalid_wrong_key",
    "description": "Token verified with incorrect key",
    "token":
      "0YRIogEFEGNDQVSgWCKiAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUu
       Y29tBBplVUKAWCCqD2TUB2jOEalC6kta2ptR7vx6flZ0I9L0RV3MCb
       Z-Aw",
    "validation": {
      "correct_key_hex":
        "000102030405060708090a0b0c0d0e0f101112131415161718191a1b
         1c1d1e1f",
      "wrong_key_hex":
        "ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
         ffffffff",
      "expected_result": "error",
      "expected_error": "SignatureVerificationFailed"
    }
  },
  {
    "id": "invalid_algorithm_mismatch",
    "description":
      "COSE_Mac0 token but verifier expects COSE_Sign1/ES256",
    "token":
      "0YRIogEFEGNDQVSgWCKiAXgYaHR0cHM6Ly9hdXRoLmV4YW1wbGUu
       Y29tBBplVUKAWCCqD2TUB2jOEalC6kta2ptR7vx6flZ0I9L0RV3MCb
       Z-Aw",
    "validation": {
      "token_algorithm_id": 5,
      "verifier_algorithm_id": -7,
      "expected_result": "error",
      "expected_error": "InvalidTokenFormat"
    }
  }
]
]]></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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
iP8PWm/+YyK+X6xzSBloriReksBNlMDHvBEvtGg5wTw4vcKi9ZPiLspwkmvx
g/toOrzQQuYHntMK0AbabDieGRh1txk1jWZYt5qO9ErBoA3LifymB0y/5bZc
F1gv7IYgAs2lFkV12CeNqGVarTBseUYLeHfDMGsF/PwmzNloWKZXMwB7rWZg
Y8BILag7bhMAZwd+aNhR8zUWsm2r99vFirR305O79WOzK7WejcP7x/t3cTvY
/XJxuXu3lddvN/LOKPmwt2WsX9jVd9v3dlRt7532DZAKtm/b67f25ebGgTT0
DGoblh0Md44v02r7c+/99pftzY7XjM24/sX98qH5+T5q945uLj5f3NydJqP+
Q68fPGwW4Uu75sP60/bX9uAuNY/qH44u3PTWOPPtzWpnPIhQHrkvEn1QqpvZ
x5WoBsvXVtyLNH6NHIuJxsOH2tTIwHLhnLLV0sFGdur6CQ/hsCzqAxeEATwH
rLFr5dlZ2Xt3SHcdT+Q1rRSJTfFkJgYe0oHnuXY8jI29EYluhjel+OypYpDI
VzFkgFjjEcNFdlWafkVc1s6GQ89+a61yerivVWGXV8+O8xX1oYT0lNOF2yYP
AW45NlDzyArKgcAEOgICMliR17/IQ7/AD5zjSzaK8Vc3BDV8L8Aq8/5iukv+
bEGtKOF8w1NPL6h3jUP3LAnxGt3YgEuJ3C8HFTK5GeVRk7+QVzlUlKpFSe68
m3GApnTF9wv6o/ioZ3qSgF/4Lsup0yY0YlNeWCtdXy77Zwg3bQB4aj2tlkYw
PgB1lRdkOTEWflP5bx8jqvC4iVDwGoYkGM60UPBCZ6SQ8HoBTgxQtJ3S7N6g
MdvuD8ddzpmZ5J9zZjhvZnL2fIb4Ct749YYbhA0rcLzQsVogqNbDqFYLnNBq
hn4N9HLTd5teUER1hF6zbka1Zs1yoxawXqfpvEI/3vzyqqhMoR8fdtvr7Xbn
tr27vdHt7m537/JeuL2V+9uPvb3+wb13fnHrbfc+X1/trp8k19KXdL19cb93
0e2eJI8f8AytW70a5MaH+/2WF3/ODvdS/8uecePY59Hhxvv73lE9vZJal8qB
bogDqQSME6cFvD5DIThEpkq0Q2ztYqOyfVrsuduA3R3DGBo35kv6ofTk/GhP
2e/QE2jbcVrtu3Ey1hfZ2aZ1Zv90AM7s6tl5ean3+o4Y4ZtqQ2HsT5wKGt4I
+jtHdpBniKTwwKWECekBk86zEf4hQkOtgktH54M+mqqAgGQI9FoMrMPjt0iI
xkkeCglvlBJkt3MEBQnDkqggn+IPOqD1RqmhtIqi+jhDxazymA3fDwWon2Hv
LwDbixi/tFb8SXiy1aQzSgZ2APyobhUzlVxx9ozfwonrvwsnnjOv2fMpYkMs
IzTqhgXc3MNAyaDueo5ZN5o+6NZeIwhaoI5bzYYXGpHlgFpda/imFRb1a8CY
G26r1vBew38vf5T/droP+5vr9nanffEOtNx6/xpjQ/oHvaKNiytRf/dw/Xi3
+95+WDfd/PZ89+tJv1a7Pm6837nvNvsPrYPm5uhy4ykNBweNVzPeSb4xueVW
hmnaN2czqhfyw8ZLu7Jmc48XdjU5K0rztRKkxFNfOpNXsMAfhtrLuCClaGZE
fi7/28dyLB+2OHvLVW90GEwmVcdcz5yuSwNJKk/lcidEkVjrD1ewRfj0OEdU
OCgmsGjUQVRvoajumMAtkclO57az2iMOWxE5h1aLhEOr5Ast816W2o1erBj/
4ao7HpR5IcudAbtXa+9ZTlKvO7+78WV9NTevzF2Dl0tFP0v++W1g/xuJOD/R
dT8mElh0Ap0p5f74vKTizdu1m+NoIM+vkxgx3oKsL0cmezeZu/stIpJj/kz3
/jg8FBFpJlzmwaOoPxsus+GhiliRaTQNN6q33IbZijwMCDBqjus6Uath2lHd
cgPXdhoggZlOo+E30RpiSGeHH/m+C7WN6BUi1vb2m0IAChHrfYeZOB4z98O1
Klbt+rUT83q7d793ud0R9bvd453u1e762fbjIOifF06Is7TdPm6vbx9vZped
jcdOe2j2k+3ofi/sHnwZ3Iv6vccz830+2A7th8ugeevUujdHX98PzY2HVwtk
k6JFmRwodHKaaOG7IHO8VUhSe1rh3UxX5V/RzYsn9OKeZoplk1YkJva9FHhv
EsncoB8nNw9xL/DdYTBXKmtjUWGQcOWNcRneIVTIYqvMkzEsckv/MeIWRrJV
EKbMWFCv4FKCEN98s9VhdotzOK7C/xbY/XCnYT4akC0iHN6HQ/lzUjxS677A
nHHCrks8H6APrlxbiFmS6cMXuizxNHfzUVZY8p8VBv5zbA5mszV5QvVN2RR+
H1vC1PGS+b5hhV5oNCLLari26dcwPMAOo5bpRIE8XRSZthXUWmbkAo80rLDW
9PzAj7xay3E823Hrr8qc8MM2gvUYGE+7u7+5fny109nqdreenOr6zW4yWH94
7KVn93eXN3LszfO9s7touH3Xse37g6+Nw0vXcHvtV3MfY4KCusnTSvFkqjab
PFW5BfWNDOHn99F8Qx8Z28lTOniOBWSjCET5m5LveYZZGgtKvz2mtvKARU27
MfSPofk2qcYWuqNnbcVFJRUdLxngNmay59sd1/YL1a63aVtsiaZpWysv9lLP
zJP6Zk/y7FFVuY1ImzMcBex/Wk8yBgGj6gHKy3OnYKmUU5rVW+zWzu/kQZ45
s3kzEvWRKzmG5Zt+6FkNq2U3667l1UPPaFl2K7RgLrYZ2JbrBYbnoA3bBlbl
NOT4g0bkgUZWa1mv4Uqb7o97jo9P17vdd/vjdeDZ9t7lFqlWov5lZ727t/51
+O6pt3sZA9t59+6d3Tu92zl/PzT2rhrvN73Wdc28uTfv6ruvZ1ZTbNdBUtrO
08n8MASdovoa0/WP9TTNcv0KRy52xfSYdNh99ZTGlRglLK2T9gdpBuvyfPJs
UZClyJYhaYNwqH37JtvBO4SnR6IleBEpFGZB7SwPNAxymZmWw74XBpi9f6yj
bMZNDVhJvZyBJ65Ph6hIDVmgXBK8Imn9in6e5HGPX7A7DFE5S/Hu0KDCU8EL
mLDbUfQQ9I6nCbjguVE3040V3dDjTKOLSPn9pLJARc/w3kaW2A9vc6DbN9DY
7g5ZMvwsVG9o0KZctCAvAqdLn2BcC/z2F55PEe8Ljv3b8fGxewEMGiZdeEJh
fvNTnYsWboBvZLFikZwu4ByeFJ2CipvrePFdTilA8c6EhxRT7AIPG7tSIhM4
3R9ldCU6u8ERj4j91nKQoa+mQzza8MozEVOzXJRyWBX271lNV/FmlNHgRT20
WI6tcg9FvksJdRQ1CrxYwyVBikDgY7cU6MYLzmj9RKkAjZkvbW/c0DuNJ4uc
O7zNSG1TGi3VtgPHgpHWHA9+G/O5vuTP9TpAXPT0FjkETwr8xLNfYzAs6r98
bdT2RP15sJwHw0J6m9eTCkOUeJqh59muX3dlJJzdaJimCep2zXOjqB7W8Xya
YWOXkQvSUKMB1SLLCV0riFo2yEJ+vRm8QuLZCd8k8bR337+onigv6lP+IXd/
PVxvpcHOyYP/Nb3fs7bMYLubX/W3Pru1i4dpbYj6FxedY2rjotv9PMzfP7oH
O/7J1qDdGN586J0c7W8G258d5yGwd4/ejdK8et6xHq9m5UyXxBto/XzD5MGG
SrdJJy2I8x9DlWHMRJZfRWhnFJ7MIWi4LAnR4vKnF1FRgNCfgYxaUwnhxFNR
v0hJJub7JpXK/OmkTBmxVKnmzGdyHkROfLdmFXMNG2YQhTVglFHQMo3I9xrQ
dc2pt0CjalhhE5UttwnkJIosG7S3OhCylmQZpvsaRWr7rWQlFt8ZqdgVB1yu
22fhurVxstnpttt4BPXz+32ZPu0o2YnsevvIOtlo5jfe2fU13hza9R2ne7R3
8659utUe9W/T58gACMdzycBBWXxLhNhGF2ZluRSZiSiw277FCH9X0pDMltiG
4T1oDMHLhbYX7f6DP4MQhfsC2/OmHW2j/O54UYv9UuasJnd+FTVo/WRqUJrX
NMFmfH4vE+BE2mS3bpstPzACz2iC8NEKI99yfMsEIuA4Nc8OfcOPIsexLDe0
pdcbPd14CU7T91q1KDBb4WuoQ/+N1GE7hnpeKYnih+t717q4mys0QN3LTqd3
fP312Hq4ff8U3nS8zs7Nu/6h0Wh/vbmO349Od7aj6w+H+6Ozm5NkRrIPhVCE
uNvn04qQEYSCXBDxoEsK2c2d7E7NHhIRSTYkuUAVXWfd6MRb/0AtbzCM++7w
6RU0oxA4FEFlSsvsVPQr254pxZQ1v/8c3W8W2TJgY7cctI5aeBr35WSLBcjw
dmXuOrl1Rfs1zNdK0cS26OPlpGO6qPUmTTD8DcSn+QRzDLKvmPVUyM6D6CtW
bSpEVYu476Dn1vMDp4G9Nb2oFTZrYdMGsQ4UQLMWNcOm0QKJDgQ/H/MC+tIi
7vhRWHdDM3CN15yl2nHeLMiNkeoHv9/Lrz68m5rfTyXV6XGnk3bL+QF96wLj
wO9eVL977F6Dothdv1s/6G5d7e5fbazvfb2Mnlr2fd3ZcDZvPqc5/ulcXrr7
2ePuxo6o7x3VXTtIt6dfc3IhA3xn33NCBYtMTmvlQ8RE2NGkqWd+mOD54WxF
w6sA88KOq96qu6RmeNXry+Ki55AZKVmcMt0XTVlO8A5PcYuxPkp6eB0ymcYf
4oyuZwXJj89FuRoWm5u8gVcbv4GX2ZbVa3hn20UJHjfQaOzP5ZIE0bFLBege
Spb3ny5DjDFqnB+pjvsw1HSEmTR4s1R37mGEZyPlxOIjMr3y2P3Wdl+i3lnz
eP1q96hm3EebB7e9B3dvf3T9ef8ovPrw+Wvz+HL0pbPRe/p6mm8fXxzbN4/l
BJMu92/IHCXDkAfM3+CsF0RmYKAJRf4QgVv8tk3mCp4lAxSukaKeAG+55kTu
mmlV2Ul4udjMw/p9quAUJwwf6GrxGXKTvnBWYIFyBznDbNw8+UuXvEO058VL
DvQj+nDbBhFx42A3Od84tr5kO2mz19z+bORfPXNn92p3sH4bXngX6W7ePWvI
+zhcx22/aRHVqx+mQZRuB1+YLMGeC1htcnC+APKw9W+ewvyGLdWz8IfiVS+M
8IIPDv9ohHv+xSsQP8s1xlagdzE4pgyvTFhvD082B1/Od8z38e5w/2t4/xTu
DR2YQ3XPSW9D9500KJ6ft24fbq9OvO4fuBIHaX4V5hcv3QcPwzTp8j07dzEo
E+soAZJLikC5xnOLMHk5TS/o97KfQ/mA0h2K2v3j3Pvc3n/sJEDg9r2deKv6
4bp3YJ5eOMenX+6uL8+6ozzvDNzOn4DivWJpd9ly7TKov3hdBU2du7Lo+4wT
ft07u7E+zvTxqs8zt1ftM8q6bClZl2sn6fWH3Xz2Ukvmxpc87Lx79+6gfece
7Kyv3x0G/unWxYf3BwefjY3mdrANavjhMN5dtwYf/gRL/VOY20uxpC2W7gV4
kkPfMP3gRiauf/7+gym3Lw1HA6QKeF3eUhQP0QfxBCJo1IsHg7C48RHkx26c
uL2bn3fBl9Qq3phoSglvetMFX6FV6HVvv+Dr9QT0J4qOKgFN6JavV9/uNbGr
3oK+pwIFL5SrFLdAQwmVJHbjNxXoP343j3I7z4spq5K1cSpR5UEj/GaQOBHK
hFLv58uOXGLpfNmwzs7Xrc+Hm26v49zlrjXITxr3j07UuzZ2W3vGyUVtvyPn
f11tP7OafPQT10T8XODLNZYgHu8seuOn6Ew8mYKHPwlTX4BChSbdj7PnQ5HH
ia43yougJDa4TLm1dLWUM/M/CMvYJTzTb3HDSnzK4yXEVTM/xjRp227RxYHK
Ekq7i97275L0ARa42w+TPNO+rSWjvoes8+8LFLi38J2Ftu1unm3hvco6Xgbf
Haajgfb/AvqUTOouBwEA

-->

</rfc>
