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

<t>A token-based authentication 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://wilaw.github.io/CAT-4-MOQT/draft-law-moq-cat4moqt.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-law-moq-cat4moqt/"/>.
      </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/wilaw/CAT-4-MOQT"/>.</t>
    </note>
  </front>
  <middle>
    <?line 71?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This draft introduces a token-based authentication 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-authentication-workflow">
        <name>Overview of the authentication 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: ANNOUNCE,
SUBSCRIBE_ANNOUNCES, 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 authenticate its actions.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="token-format">
      <name>Token format</name>
      <t>This draft uses a single token format, namely the Common Access Token (CAT) <xref target="CAT"/>. The token is supplied
as a byte array. When it must be cast to a string for inclusion in a URL, it is Base64 encoded <xref target="BASE64"/>.</t>
      <t>To provide control over the MOQT actions, this draft defines a new CBOR Web Token (CWT) Claim called "moqt".
Use of the moqt claim is optional for clients. Support for processing the moqt claim is mandatory for relays.</t>
      <t>The default for all actions is "Blocked" and this does not need to be communicated in the token.
As soon as a token is provided, all actions are explicitly blocked unless explicitly enabled.</t>
      <section anchor="moqt-claim">
        <name>moqt claim</name>
        <t>The "moqt" claim is defined by the following CDDL:</t>
        <artwork><![CDATA[
$$Claims-Set-Claims //= (moqt-label => moqt-value)
moqt-label = TBD_MOQT
moqt-value = [ + moqt-scope ]
moqt-scope = [ moqt-actions, moqt-ns-match, moqt-track-match ]
moqt-actions = [ + moqt-action ]
moqt-action = int
moqt-ns-match = bin-match
moqt-track-match = bin-match

bin-match = {
  ? exact-match ^ => bstr,
  ? prefix-match ^ => bstr,
  ? suffix-match ^ => bstr,
  ? contains-match ^ => bstr,
}

/ match labels defined in CTA-5007-B 4.6.1 /
exact-match = 0
prefix-match = 1
suffix-match = 2
contains-match = 3
]]></artwork>
        <t>The "moqt" claim bounds the scope of MOQT actions for which the token can provide
access. It is an array of action scopes. Each scope is an array with three
elements: an array of integers that identifies the actions, a match object for
the namespace, and a match object for the track name.</t>
        <t>The actions are integers defined as follows:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Action</th>
              <th align="left">Key</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">CLIENT_SETUP</td>
              <td align="left">0</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 8.3</td>
            </tr>
            <tr>
              <td align="left">SERVER_SETUP</td>
              <td align="left">1</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 8.3</td>
            </tr>
            <tr>
              <td align="left">ANNOUNCE</td>
              <td align="left">2</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 8.23</td>
            </tr>
            <tr>
              <td align="left">SUBSCRIBE_NAMESPACE</td>
              <td align="left">3</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 8.28</td>
            </tr>
            <tr>
              <td align="left">SUBSCRIBE</td>
              <td align="left">4</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 8.7</td>
            </tr>
            <tr>
              <td align="left">SUBSCRIBE_UPDATE</td>
              <td align="left">5</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 8.10</td>
            </tr>
            <tr>
              <td align="left">PUBLISH</td>
              <td align="left">6</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 8.13</td>
            </tr>
            <tr>
              <td align="left">FETCH</td>
              <td align="left">7</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 8.16</td>
            </tr>
            <tr>
              <td align="left">TRACK_STATUS</td>
              <td align="left">8</td>
              <td align="left">
                <xref target="MoQTransport"/> Section 8.20</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>The match object is defined to be a binary form of the match object defined in
<xref target="CAT"/> Section 4.6.1. The regex and hash match types are not defined for use
with binary values in this document.</t>
        <t>The first match operation is performed against the namespace and the second
against the track name (as defined in Section 2.4.1 of
{draft-ietf-moq-transport}). Since the match is not being performed against a
URI, no normalization is performed and the matches are performed against the
entire string. An empty match object is a legal construct that matches all
names.</t>
        <section anchor="text-examples-of-permissions-to-help-with-cddl-construction">
          <name>Text examples of permissions to help with CDDL construction</name>
          <t>Example: Allow with an exact match "example.com/bob"</t>
          <artwork><![CDATA[
{
    /moqt/ TBD_MOQT: [[
        [ /ANNOUNCE/ 2, /SUBSCRIBE_NAMESPACE/ 3, /PUBLISH/ 6, /FETCH/ 7 ],
        { /exact/ 0: 'example.com'},
        { /exact/ 0: '/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'
]]></artwork>
          <t>Example: Allow with a prefix match "example.com/bob"</t>
          <artwork><![CDATA[
{
    /moqt/ TBD_MOQT: [[
        [ /ANNOUNCE/ 2, /SUBSCRIBE_NAMESPACE/ 3, /PUBLISH/ 6, /FETCH/ 7 ],
        { /exact/ 0: 'example.com'},
        { /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>
        </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
{draft-lemmons-composite-claims} or simply by defining multiple limits,
depending on the required restrictions. In both cases, the order in which
limits are declared and evaluated is unimportant. The evaluation stops after
the first acceptable result is discovered.</t>
          <section anchor="example-of-evaluating-multiple-actions-in-the-same-token">
            <name>Example of evaluating multiple actions in the same token:</name>
            <artwork><![CDATA[
{
    /moqt/ TBD_MOQT: [
        [/PUBLISH/ 6, { /exact/ 0: 'example.com'}, { /prefix/ 1: 'bob'}],
        [/PUBLISH/ 6, { /exact/ 0: 'example.com'}, { /exact/ 0: 'logs/12345/bob'}]
    ],
    /exp/ 4: 1750000000
}
]]></artwork>
            <ul spacing="normal">
              <li>
                <t>(1) PUBLISH (Allow with a prefix match) example.com/bob</t>
              </li>
              <li>
                <t>(2) PUBLISH (Allow with an exact match) example.com/logs/12345/bob</t>
              </li>
            </ul>
            <t>Evaluating "example.com/bob/123" would succeed on test 1 and test 2 would never be evaluated.
Evaluating "example.com/logs/12345/bob" would fail on test 1 but then succeed on test 2.
Evaluating "example.com" would fail on test 1 and on test 2.</t>
            <t>In addition, the entire token expires at 2025-05-02T21:57:24+00:00.</t>
          </section>
          <section anchor="example-of-evaluating-multiple-actions-with-related-claims">
            <name>Example of evaluating multiple actions with related claims:</name>
            <t>If there are other claims that depend on which MOQT limit applies, a logical claim is required:</t>
            <artwork><![CDATA[
{
    /or/ TBD_OR: [
        {
            /moqt/ TBD_MOQT: [[/PUBLISH/ 6, { /exact/ 0: 'example.com'}, { /prefix/ 1: 'bob'}]],
            /exp/ 4: 1750000000
        },
        {
            /moqt/ TBD_MOQT: [[/PUBLISH/ 6, { /exact/ 0: 'example.com'}, { /exact/ 0: '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>
            <t>DISCUSS: Because tokens are designed for instantanous evaluation, they
naturally only evaluate to an "acceptable" or an "unacceptable". It's somewhat
tricky to turn an evaluation into a complete bound on any particular value. The
CAT has a number of claims about the context of the request that can change
while the stream is open. The most obvious of these is the expiration time. The
"catnip" (Network IP) and geographic claims can also change mid-stream if the
connection is migrated or the client moves. Do we need to do something special
to require periodic re-evalution?</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</bcp14> not 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="authenticating-the-connection">
      <name>Authenticating the connection</name>
      <t>The connection to a MOQT distribution relay can take place over a WebTransport or native QUIC connection. In
both cases, the token is transferred as a query parameter or else embedded in the URI PATH.</t>
      <section anchor="appending-a-token-as-a-query-parameter">
        <name>Appending a token as a query parameter</name>
        <t>The query parameter name <bcp14>SHOULD</bcp14> be "CAT" (case-sensitive) and the query parameter value <bcp14>SHOULD</bcp14> be the
Base64 encoded <xref target="BASE64"/> token. If more than one token is transferred, then the sequential query parameter
names "CAT1", "CAT2" .. "CATN" <bcp14>SHOULD</bcp14> be used.</t>
      </section>
      <section anchor="embedding-a-token-in-a-path">
        <name>Embedding a token in a PATH</name>
        <t>The token <bcp14>SHOULD</bcp14> span only a single PATH component and the component <bcp14>SHOULD</bcp14> be prefixed with the string "CAT-".
If more than one token is transferred, then they <bcp14>SHOULD</bcp14> occupy different components and <bcp14>SHOULD</bcp14> carry sequential
prefixes of "CAT1", "CAT2" .. "CATN".</t>
      </section>
      <section anchor="usage-with-webtransport">
        <name>Usage with WebTransport</name>
        <t>With a WebTransport connection, the token can be transferred as a query parameter or as part of the PATH.</t>
        <t>Example of a single token in a query arg:</t>
        <ul empty="true">
          <li>
            <t>https://example.com/service?CAT=oRkBDqMAoQBlaHR0cHMDoQFoL2NvbnRlbnQIoQBlLm0zdTg=</t>
          </li>
        </ul>
        <t>Example of multiple tokens in query args:</t>
        <ul empty="true">
          <li>
            <t>https://example.com/service?CAT1=oRkBDqMAoQBlaHR0cHMDoQFoL2NvbnRlbnQIoQBlLm0zdTg=
&amp;CAT2=IHNramRoZmtjc2pkaGYgc2pkaCBhaCBzIGFzS0pEIDthbGtqIA==</t>
          </li>
        </ul>
        <t>Example of a single token in the PATH</t>
        <ul empty="true">
          <li>
            <t>https://example.com/service/CAT-oRkBDqMAoQBlaHR0cHMDoQFoL2NvbnRlbnQIoQBlLm0zdTg=/</t>
          </li>
        </ul>
        <t>Example of multiple tokens in the PATH:</t>
        <ul empty="true">
          <li>
            <t>https://example.com/service/CAT1-oRkBDqMAoQBlaHR0cHMDoQFoL2NvbnRlbnQIoQBlLm0zdTg=/CAT2-IHN
ramRoZmtjc2pkaGYgc2pkaCBhaCBzIGFzS0pEIDthbGtqIA==/</t>
          </li>
        </ul>
      </section>
      <section anchor="usage-with-native-quic">
        <name>Usage with Native QUIC</name>
        <t>With a native QUIC connection, the query components and PATH are transmitted via the "PATH"
parameter in the CLIENT_SETUP message.</t>
        <t>Example of a single token in a query arg:</t>
        <ul empty="true">
          <li>
            <t>moqt://203.0.113.0:4443
PATH parameter in the CLIENT_SETUP message = "service?CAT=oRkBDqMAoQBlaHR0cHMDoQFoL2NvbnRlbnQIoQBlLm0zdTg="</t>
          </li>
        </ul>
        <t>Example of multiple tokens in query args:</t>
        <ul empty="true">
          <li>
            <t>moqt://203.0.113.0:4443
PATH parameter in the CLIENT_SETUP message = "service?CAT1=oRkBDqMAoQBlaHR0cHMDoQFoL2NvbnRlbnQIoQBlLm0zdTg=
&amp;CAT2=IHNramRoZmtjc2pkaGYgc2pkaCBhaCBzIGFzS0pEIDthbGtqIA=="</t>
          </li>
        </ul>
        <t>Example of a single token in the PATH</t>
        <ul empty="true">
          <li>
            <t>moqt://203.0.113.0:4443
PATH parameter in the CLIENT_SETUP message = "service/CAT-oRkBDqMAoQBlaHR0cHMDoQFoL2NvbnRlbnQIoQBlLm0zdTg=/"</t>
          </li>
        </ul>
        <t>Example of multiple tokens in the PATH:</t>
        <ul empty="true">
          <li>
            <t>moqt://203.0.113.0:4443
PATH parameter in the CLIENT_SETUP message = "service/CAT1-oRkBDqMAoQBlaHR0cHMDoQFoL2NvbnRlbnQIoQBlLm0zdTg=/CAT2-IHN
ramRoZmtjc2pkaGYgc2pkaCBhaCBzIGFzS0pEIDthbGtqIA==/"</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="controlling-access-to-moqt-actions">
      <name>Controlling access to MOQT actions</name>
      <t>TODO</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>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA will register the following claim in the "CBOR Web Token (CWT) Claims" registry:</t>
      <table>
        <thead>
          <tr>
            <th align="left"> </th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Claim Name</td>
            <td align="left">moqt</td>
          </tr>
          <tr>
            <td align="left">Claim Description</td>
            <td align="left">MOQT Action</td>
          </tr>
          <tr>
            <td align="left">JWT Claim Name</td>
            <td align="left">N/A</td>
          </tr>
          <tr>
            <td align="left">Claim Key</td>
            <td align="left">TBD_MOQT (1+2)</td>
          </tr>
          <tr>
            <td align="left">Claim Value Type</td>
            <td align="left">array</td>
          </tr>
          <tr>
            <td align="left">Change Controller</td>
            <td align="left">IESG</td>
          </tr>
          <tr>
            <td align="left">Specification Document</td>
            <td align="left">RFCthis</td>
          </tr>
        </tbody>
      </table>
      <t>[RFC Editor: Please replace RFCthis with the published RFC number for this
document.]</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="MoQTransport">
        <front>
          <title>Media over QUIC Transport</title>
          <author fullname="Luke Curley" initials="L." surname="Curley">
            <organization>Discord</organization>
          </author>
          <author fullname="Kirill Pugin" initials="K." surname="Pugin">
            <organization>Meta</organization>
          </author>
          <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>
          <date day="3" month="March" year="2025"/>
          <abstract>
            <t>   This document defines the core behavior for Media over QUIC Transport
   (MOQT), a media transport protocol designed to operate over QUIC and
   WebTransport, which have similar functionality.  MOQT allows a
   producer of media to publish data and have it consumed via
   subscription by a multiplicity of endpoints.  It supports
   intermediate content distribution networks and is designed for high
   scale and low latency distribution.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-10"/>
      </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-A Common Access Token</title>
          <author>
            <organization/>
          </author>
          <date year="2024" month="December"/>
        </front>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <?line 461?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The IETF moq workgroup</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
4WBl8YfV4v8A7K68f2k+AAA=

-->

</rfc>
