<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-jennings-moq-secure-objects-03" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="MOQT Secure Objects">End-to-End Secure Objects for Media over QUIC Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-jennings-moq-secure-objects-03"/>
    <author initials="C." surname="Jennings" fullname="Cullen Jennings">
      <organization>Cisco</organization>
      <address>
        <email>fluffy@cisco.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="R." surname="Barnes" fullname="Richard Barnes">
      <organization>Cisco</organization>
      <address>
        <email>rlb@ipv.sx</email>
      </address>
    </author>
    <date year="2025" month="October" day="20"/>
    <area>Applications and Real-Time</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 48?>

<t>This document describes an end-to-end authenticated encryption scheme for
application objects intended to be delivered over Media over QUIC Transport
(MOQT).  We reuse the SFrame scheme for authenticated encryption of media
objects, while suppressing data that would be redundant between SFrame and MOQT,
for an efficient on-the-wire representation.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://suhashere.github.io/moq-secure-objects/#go.draft-jennings-moq-secure-objects.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-jennings-moq-secure-objects/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/suhasHere/moq-secure-objects"/>.</t>
    </note>
  </front>
  <middle>
    <?line 56?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Media Over QUIC Transport (MOQT) is a protocol that is optimized for the QUIC
protocol, either directly or via WebTransport, for the dissemination of delivery
of low latency media <xref target="MoQ-TRANSPORT"/>. MOQT defines a
publish/subscribe media delivery layer across set of participating relays for
supporting wide range of use-cases with different resiliency and latency (live,
interactive) needs without compromising the scalability and cost effectiveness
associated with content delivery networks. It supports sending media objects
through sets of relays nodes.</t>
      <t>Typically a MOQ Relay doesn't need to access the media content, thus allowing
the media to be "end-to-end" encrypted so that it cannot be decrypted by the
relays. However for a relay to participate effectively in the media delivery, it
needs to  access naming information of a MOQT object to carryout the required
store and forward functions.</t>
      <t>As such, two layers of security are required:</t>
      <ol spacing="normal" type="1"><li>
          <t>Hop-by-hop (HBH) security between two MOQT relays</t>
        </li>
        <li>
          <t>End-to-end (E2E) security from the Original Publisher of an MOQT object to End
Subscribers</t>
        </li>
      </ol>
      <t>The HBH security is provided by TLS in the QUIC connection that MOQT
runs over. MOQT support different E2EE protection as well as allowing
for E2EE security.</t>
      <t>This document defines a scheme for E2E authenticated encryption of MOQT objects.
This scheme is based on the SFrame mechanism for authenticated encryption of
media objects <xref target="SFRAME"/>.</t>
      <t>However, a secondary goal of this design is to minimize the amount of additional
data the encryptions requires for each object. This is particularly important
for very low bit rate audio applications where the encryption overhead can
increase overall bandwidth usage by a significant percentage.  To minimize the
overhead added by end-to-end encryption, certain fields that would be redundant
between MOQT and SFrame are not transmitted.</t>
      <t>The encryption mechanism defined in this specification can only be used
in application context where object IDs never more than 32 bits long.</t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" 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>
        <dl>
          <dt>E2EE:</dt>
          <dd>
            <t>End to End Encryption</t>
          </dd>
          <dt>HBH:</dt>
          <dd>
            <t>Hop By Hop</t>
          </dd>
          <dt>varint:</dt>
          <dd>
            <t><xref target="QUIC"/> variable length integer, section 1.3</t>
          </dd>
        </dl>
      </section>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>This document uses the conventions detailed in (<xref target="QUIC"/> Section 1.3)
when describing the binary encoding.</t>
        <section anchor="ftn">
          <name>Serialized Full Track Name</name>
          <t>Serialized Full Track Name is composed of MOQT Track Namespace and
Track Name as shown below:</t>
          <artwork><![CDATA[
Serialized Full Track Name = Serialize(Track Namespace) +  Serialize(Track Name)
]]></artwork>
          <t>The <tt>Serialize</tt> operation follows the same on-the-wire
encoding for Track Name Space and Track Name as defined in Section 2.4.1 of
<xref target="MoQ-TRANSPORT"/>.</t>
          <t>This mandates that the serialization of Track Namespace tuples
starts with varint encoded count of tuples. This is followed by encoding
corresponding to each tuple. Each tuple's encoding starts with
varint encoded length for the count of bytes and  bytes
representing the content of the tuple.</t>
          <t>The Track Name is varint encoded length followed by sequence of bytes that
identifies an individual track within the namespace.</t>
          <t>The <tt>+</tt> represents concatenation of byte strings.</t>
        </section>
      </section>
    </section>
    <section anchor="moqt">
      <name>MOQT Object Model Recap</name>
      <t>MOQT defines a publish/subscribe based media delivery protocol, where in
endpoints, called original publishers, publish objects which are delivered via
participating relays to receiving endpoints, called end subscribers.</t>
      <t>Section 2 of <xref target="MoQ-TRANSPORT"/> defines hierarchical object model for
application data, comprised of objects, groups and tracks.</t>
      <t>Objects defines the basic data element, an addressable unit whose
payload is sequence of bytes. All objects belong to a group, indicating
ordering and potential dependencies. A track contains has collection of
groups and serves as the entity against which a subscribers issue
subscription requests.</t>
      <figure anchor="fig-moqt-session">
        <name>Structure of an MOQT session</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="496" width="528" viewBox="0 0 528 496" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,48 L 8,368" fill="none" stroke="black"/>
              <path d="M 112,80 L 112,112" fill="none" stroke="black"/>
              <path d="M 112,160 L 112,256" fill="none" stroke="black"/>
              <path d="M 112,288 L 112,320" fill="none" stroke="black"/>
              <path d="M 112,368 L 112,400" fill="none" stroke="black"/>
              <path d="M 112,448 L 112,480" fill="none" stroke="black"/>
              <path d="M 152,112 L 152,160" fill="none" stroke="black"/>
              <path d="M 152,400 L 152,448" fill="none" stroke="black"/>
              <path d="M 192,80 L 192,112" fill="none" stroke="black"/>
              <path d="M 192,160 L 192,256" fill="none" stroke="black"/>
              <path d="M 192,288 L 192,320" fill="none" stroke="black"/>
              <path d="M 192,368 L 192,400" fill="none" stroke="black"/>
              <path d="M 192,448 L 192,480" fill="none" stroke="black"/>
              <path d="M 240,80 L 240,112" fill="none" stroke="black"/>
              <path d="M 240,160 L 240,256" fill="none" stroke="black"/>
              <path d="M 240,368 L 240,400" fill="none" stroke="black"/>
              <path d="M 240,448 L 240,480" fill="none" stroke="black"/>
              <path d="M 280,112 L 280,160" fill="none" stroke="black"/>
              <path d="M 280,400 L 280,448" fill="none" stroke="black"/>
              <path d="M 320,80 L 320,112" fill="none" stroke="black"/>
              <path d="M 320,160 L 320,256" fill="none" stroke="black"/>
              <path d="M 320,368 L 320,400" fill="none" stroke="black"/>
              <path d="M 320,448 L 320,480" fill="none" stroke="black"/>
              <path d="M 384,80 L 384,112" fill="none" stroke="black"/>
              <path d="M 384,368 L 384,400" fill="none" stroke="black"/>
              <path d="M 384,448 L 384,480" fill="none" stroke="black"/>
              <path d="M 424,400 L 424,448" fill="none" stroke="black"/>
              <path d="M 464,80 L 464,112" fill="none" stroke="black"/>
              <path d="M 464,368 L 464,400" fill="none" stroke="black"/>
              <path d="M 464,448 L 464,480" fill="none" stroke="black"/>
              <path d="M 8,80 L 24,80" fill="none" stroke="black"/>
              <path d="M 96,80 L 520,80" fill="none" stroke="black"/>
              <path d="M 112,112 L 192,112" fill="none" stroke="black"/>
              <path d="M 240,112 L 320,112" fill="none" stroke="black"/>
              <path d="M 384,112 L 464,112" fill="none" stroke="black"/>
              <path d="M 112,160 L 192,160" fill="none" stroke="black"/>
              <path d="M 240,160 L 320,160" fill="none" stroke="black"/>
              <path d="M 112,192 L 192,192" fill="none" stroke="black"/>
              <path d="M 240,192 L 320,192" fill="none" stroke="black"/>
              <path d="M 112,224 L 192,224" fill="none" stroke="black"/>
              <path d="M 240,224 L 320,224" fill="none" stroke="black"/>
              <path d="M 112,256 L 192,256" fill="none" stroke="black"/>
              <path d="M 240,256 L 320,256" fill="none" stroke="black"/>
              <path d="M 112,288 L 192,288" fill="none" stroke="black"/>
              <path d="M 112,320 L 192,320" fill="none" stroke="black"/>
              <path d="M 8,368 L 24,368" fill="none" stroke="black"/>
              <path d="M 96,368 L 520,368" fill="none" stroke="black"/>
              <path d="M 112,400 L 192,400" fill="none" stroke="black"/>
              <path d="M 240,400 L 320,400" fill="none" stroke="black"/>
              <path d="M 384,400 L 464,400" fill="none" stroke="black"/>
              <path d="M 112,448 L 192,448" fill="none" stroke="black"/>
              <path d="M 240,448 L 320,448" fill="none" stroke="black"/>
              <path d="M 384,448 L 464,448" fill="none" stroke="black"/>
              <path d="M 112,480 L 192,480" fill="none" stroke="black"/>
              <path d="M 240,480 L 320,480" fill="none" stroke="black"/>
              <path d="M 384,480 L 464,480" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="528,368 516,362.4 516,373.6" fill="black" transform="rotate(0,520,368)"/>
              <polygon class="arrowhead" points="528,80 516,74.4 516,85.6" fill="black" transform="rotate(0,520,80)"/>
              <g class="text">
                <text x="24" y="36">Media</text>
                <text x="68" y="36">Over</text>
                <text x="108" y="36">QUIC</text>
                <text x="176" y="36">Application</text>
                <text x="500" y="68">time</text>
                <text x="60" y="84">TrackA</text>
                <text x="148" y="100">Group1</text>
                <text x="276" y="100">Group2</text>
                <text x="352" y="100">...</text>
                <text x="420" y="100">GroupN</text>
                <text x="152" y="180">Object0</text>
                <text x="280" y="180">Object0</text>
                <text x="152" y="212">Object1</text>
                <text x="280" y="212">Object1</text>
                <text x="152" y="244">Object2</text>
                <text x="280" y="244">Object2</text>
                <text x="152" y="276">...</text>
                <text x="152" y="308">ObjectN</text>
                <text x="492" y="356">time</text>
                <text x="60" y="372">TrackB</text>
                <text x="148" y="388">Group1</text>
                <text x="276" y="388">Group2</text>
                <text x="352" y="388">...</text>
                <text x="420" y="388">GroupN</text>
                <text x="152" y="468">Object0</text>
                <text x="280" y="468">Object0</text>
                <text x="424" y="468">Object0</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
Media Over QUIC Application
|
|                                                           time
+-- TrackA --+---------+-----+---------+-------+---------+------>
|            | Group1  |     | Group2  |  ...  | GroupN  |
|            +----+----+     +----+----+       +---------+
|                 |               |
|                 |               |
|            +----+----+     +----+----+
|            | Object0 |     | Object0 |
|            +---------+     +---------+
|            | Object1 |     | Object1 |
|            +---------+     +---------+
|            | Object2 |     | Object2 |
|            +---------+     +---------+
|                ...
|            +---------+
|            | ObjectN |
|            +---------+
|
|                                                          time
+-- TrackB --+---------+-----+---------+-------+---------+------>
             | Group1  |     | Group2  |  ...  | GroupN  |
             +----+----+     +----+----+       +----+----+
                  |               |                 |
                  |               |                 |
             +----+----+     +----+----+       +----+----+
             | Object0 |     | Object0 |       | Object0 |
             +---------+     +---------+       +---------+
]]></artwork>
        </artset>
      </figure>
      <t>Objects are comprised of two parts: envolope and a payload. The envelope
is never end to end encrypted and is always visible to relays. The
payload portion MAY be end to end encrypted, in which case it is only
visible to the original publisher and the end subscribers. The application is
solely responsible for the content of the object payload.</t>
      <t>Tracks are identified by a combination of its Track Namespace and
Track Name.  Tuples of the Track Namespace and Track Name are treated
as a sequence of binary bytes.  Group and Objects are represented as
variable length integers called GroupID and ObjectID respectively.</t>
      <t>Two important properties of objects are:</t>
      <ol spacing="normal" type="1"><li>
          <t>The combination of Track Namespace, Track Name, Group ID and Object ID are
globally unique in a given relay network.</t>
        </li>
        <li>
          <t>The data inside an MOQT Object (and its size) can never change after the
Object is first published. There can never be two Objects with the same
name but different data.</t>
        </li>
      </ol>
      <t>One of the ways system keep the Object names unique is by using a fully
qualified domain names or UUIDs as part of the TrackNamespace.</t>
    </section>
    <section anchor="secure-objects">
      <name>Secure Objects</name>
      <t>Section 10.2.1 <xref target="MoQ-TRANSPORT"/> defines fields of a canonical
MOQT Object. The protection scheme defined in this draft encrypts the
<tt>Object Payload</tt> and Private header extensions. The scheme authenticates
the  <tt>Group ID</tt>, <tt>Object ID</tt>, <tt>Immutable Header Extensions</tt>
(Section 11.2 of <xref target="MoQ-TRANSPORT"/> }} and <tt>Object Payload</tt> fields,
regardless of the on-the-wire encoding of the objects over QUIC Datagrams or
QUIC streams.</t>
      <section anchor="extensions">
        <name>Extensions</name>
        <t>MOQT defines two types of Object Header Extensions, public (or mutable) and
immutable. This specification uses MOQT immutable extensions to convey
authenticated metadata and adds Private Object header extensions
(see <xref target="pvt-ext"/>). Private extensions are serialized and encrypted along with
the Object payload, decrypted and deserialized by the receiver. This specification
further defines <tt>Secure Object KID</tt> extension (see <xref target="keyid-ext"/>),
which is transmitted within the immutable extensions.</t>
      </section>
      <section anchor="setup-assumptions">
        <name>Setup Assumptions</name>
        <t>The application assigns each track a set of (Key ID, <tt>track_base_key</tt>)
tuples, where each <tt>track_base_key</tt> is known only to authorized original publishers
and end subscribers for a given track. How these per-track secrets are established
is outside the scope of this specification. The application also
defines which Key ID should be used for a given encryption operation.
For decryption, the Key ID is obtained from the <tt>Secure Object KID</tt> header
extension that is contained with in the immutable header extension of the
Object).</t>
        <t>Applications determine the ciphersuite to be used for each
track's encryption context.  Any SFrame ciphersuite can be used.</t>
      </section>
      <section anchor="app">
        <name>Application Procedure</name>
        <t>This section provides steps for applications over MOQT to
use mechanisms defined in this specification.</t>
        <section anchor="object-encryption">
          <name>Object Encryption</name>
          <t>To encrypt a MOQT Object, the application performs the following to
produce the plaintext input:</t>
          <t>Call the MOQT Object's payload as <tt>original_payload</tt>.</t>
          <t><tt>pt = Serialize(original_payload) + Serialize(Private header extensions)</tt></t>
          <t>The serialization for Private header extensions follows the rules defined in
section 10.2.1.2 of <xref target="MoQ-TRANSPORT"/>. The serialzation of the MOQT Object
Payload, i.e <tt>original_payload</tt>, has varint encoded count
of the bytes in the payload followed by the original_payload bytes.</t>
          <t><tt>MOQT Object Payload = encrypt(pt)</tt></t>
          <t>The output of the encrypt operation is a chiphertext which is set as
the payload for the MOQT Object, thus replacing the <tt>original_payload</tt>.
The length of the ciphertext now reflects the encrypted length of
<tt>original_payload</tt> as well as the private header extensions.</t>
        </section>
        <section anchor="object-decryption">
          <name>Object Decryption</name>
          <t>To decrypt a MOQT Object, the Object payload is provided as ciphertext input, to
obtain the plaintext. Applications deserialize the plaintext to extract
private header extensions and the application's <tt>original_payload</tt>.</t>
          <t>The following deserialization steps are performed:</t>
          <t>Let <tt>input_payload</tt> be the decrypted MOQT Object Payload.</t>
          <ol spacing="normal" type="1"><li>
              <t>original_payload_length = read_varint(input_payload)</t>
            </li>
            <li>
              <t>original_payload = read_bytes(input_payload, original_payload_length)</t>
            </li>
          </ol>
          <ul spacing="normal">
            <li>
              <t>Read varint to obtain the <tt>original_payload</tt> length.</t>
            </li>
            <li>
              <t>Read <tt>original_payload</tt> length bytes, call it <tt>output_payload</tt>.</t>
            </li>
            <li>
              <t>If there exists no more data, this is the case of zero private header extensions.
So return an empty private extension stucture by setting Type to 0xA and
length to 0 and  MOQT Object after updating the <tt>input_payload</tt> and its
length to the output_payload.</t>
            </li>
            <li>
              <t>Else, read 16 bits and if its value doesn't match 0XA, drop the incoming object, else
parse the rest of bits as Private header extension. Finally return
parsed private extensions and MOQT object after updating the
<tt>input_payload</tt> and its length to the <tt>output_payload</tt>.</t>
            </li>
          </ul>
          <t>If parsing fails at any stage, drop the received MOQT Object.</t>
        </section>
      </section>
      <section anchor="encryption-schema">
        <name>Encryption Schema</name>
        <t>MOQT secure object protection relies on an SFrame cipher suite to define the
AEAD encryption algorithm and hash algorithm in use <xref target="RFC9605"/>.  We
will refer to the following aspects of the AEAD and the hash algorithm below:</t>
        <ul spacing="normal">
          <li>
            <t><tt>AEAD.Encrypt</tt> and <tt>AEAD.Decrypt</tt> - The encryption and decryption functions
for the AEAD.  We follow the convention of RFC 5116 <xref target="RFC5116"/> and consider
the authentication tag part of the ciphertext produced by <tt>AEAD.Encrypt</tt> (as
opposed to a separate field as in SRTP <xref target="RFC3711"/>).</t>
          </li>
          <li>
            <t><tt>AEAD.Nk</tt> - The size in bytes of a key for the encryption algorithm</t>
          </li>
          <li>
            <t><tt>AEAD.Nn</tt> - The size in bytes of a nonce for the encryption algorithm</t>
          </li>
          <li>
            <t><tt>AEAD.Nt</tt> - The overhead in bytes of the encryption algorithm (typically the
size of a "tag" that is added to the plaintext)</t>
          </li>
          <li>
            <t><tt>AEAD.Nka</tt> - For cipher suites using the compound AEAD described in <xref section="4.5.1" sectionFormat="of" target="RFC9605"/>, the size in bytes of a key for the underlying encryption
algorithm</t>
          </li>
          <li>
            <t><tt>Hash.Nh</tt> - The size in bytes of the output of the hash function</t>
          </li>
        </ul>
      </section>
      <section anchor="aad">
        <name>Metadata Authentication</name>
        <t>The Key ID, Full Track Name, Immutable Header Extensions, Group ID, and Object ID
for a given MOQT Object are authenticated as part of secure object encryption.
This ensures, for example, that encrypted objects cannot be replayed across tracks.</t>
        <t>When protecting or unprotecting a secure object, the following data structure
captures the input to the AEAD function's AAD argument:</t>
        <sourcecode type="pseudocode"><![CDATA[
SECURE_OBJECT_AAD {
    Key ID (i),
    Group ID (i),
    Object ID (i),
    Track Namespace (..),
    Track Name Length (i),
    Track Name (..),
    Serialized Immutable Extensions (..)
}
]]></sourcecode>
        <ul spacing="normal">
          <li>
            <t>Track Namespace is serialized as in section 2.4.1 of MOQT.</t>
          </li>
        </ul>
        <t>Serialized Immutable Extensions MUST include the <tt>Secure Object KID header
extension</tt> containing the Key ID.</t>
      </section>
      <section anchor="nonce">
        <name>Nonce Formation</name>
        <t>The Group ID and Object ID for an object are used to form a 96-bit counter (CTR)
value, which XORed with a salt to form the nonce used in AEAD encryption.  The
counter value is formed by bitwise concatenating the  Group ID as 64 bit integer
and  Object ID as 32 bit integer. This encryption/decryption  will fail
if applied to an object where group ID is larger than 2<sup>64</sup> or
the object ID is larger than 2<sup>32</sup> and the MOQT Object MUST NOT
be processed further.</t>
      </section>
      <section anchor="keys">
        <name>Key Derivation</name>
        <t>Encryption and decryption use a key and salt derived from the <tt>track_base_key</tt>
associated with a Key ID. Given a <tt>track_base_key</tt> value, the key and salt are
derived using HMAC-based Key Derivation Function (HKDF) <xref target="RFC5869"/> as follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
def derive_key_salt(key_id, track_base_key, serialized_full_track_name):
  moq_secret = HKDF-Extract("", track_base_key)
  moq_key_label = "MOQ 1.0 Secret key " + serialized_full_track_name + cipher_suite + key_id
  moq_key =
    HKDF-Expand(moq_secret, moq_key_label, AEAD.Nk)
  moq_salt_label = "MOQ 1.0 Secret salt " + serialized_full_track_name + cipher_suite + key_id
  moq_salt =
    HKDF-Expand(moq_secret, moq_salt_label, AEAD.Nn)

  return moq_key, moq_salt
]]></sourcecode>
        <t>In the derivation of <tt>moq_secret</tt>:</t>
        <ul spacing="normal">
          <li>
            <t>The <tt>+</tt> operator represents concatenation of byte strings.</t>
          </li>
          <li>
            <t>The Key ID value is encoded as an 8-byte big-endian integer.</t>
          </li>
          <li>
            <t>The <tt>cipher_suite</tt> value is a 2-byte big-endian integer representing the
cipher suite in use (see <xref target="SFRAME"/>).</t>
          </li>
        </ul>
        <t>The hash function used for HKDF is determined by the cipher suite in use.</t>
      </section>
      <section anchor="encrypt">
        <name>Encryption</name>
        <t>MOQT secure object encryption uses the AEAD encryption algorithm for the cipher
suite in use.  The key for the encryption is the <tt>moq_key</tt> derived
from the <tt>track_base_key</tt> <xref target="keys"/>.  The nonce is
formed by first XORing the <tt>moq_salt</tt> with the current CTR value <xref target="nonce"/>, and
then encoding the result as a big-endian integer of length <tt>AEAD.Nn</tt>.</t>
        <t>The Private extensions and Object payload field from the MOQT object is used
by the AEAD algorithm for the plaintext.</t>
        <t>The encryptor forms an SecObj header using the Key ID value provided.</t>
        <t>The encryption procedure is as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Obtain the plaintext payload to encrypt from the MOQT object. Extract
the Group ID, Object ID, and the Serialized Immutable Header Extension from
the MOQT object envelope. Ensure the Secure Object KID header extension is
included, with the Key ID set as its value.</t>
          </li>
          <li>
            <t>Retrieve the <tt>moq_key</tt> and <tt>moq_salt</tt> matching the Key ID.</t>
          </li>
          <li>
            <t>Form the aad input as described in <xref target="aad"/>.</t>
          </li>
          <li>
            <t>Form the nonce by as described in <xref target="nonce"/>.</t>
          </li>
          <li>
            <t>Apply the AEAD encryption function with moq_key, nonce, aad,
MOQT Object payload and serialized private header exntenions as inputs (see <xref target="app"/>).</t>
          </li>
        </ol>
        <t>The final SecureObject is formed from the MOQT transport headers,
followed by the output of the encryption.</t>
      </section>
      <section anchor="decryption">
        <name>Decryption</name>
        <t>For decrypting, the Key ID from the <tt>Secure Object KID</tt> header extension
contained within immutable header extension is
used to find the right key and salt for the encrypted object. The MOQT
track information matching the Key ID along with  <tt>Group ID</tt> and <tt>Object ID</tt>
fields of the MOQT object header are used to form the nonce.</t>
        <t>The decryption procedure is as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Parse the SecureObject to obtain Key ID, the ciphertext corresponding
to MOQT object payload and the Group ID and Object ID from the MOQT
object envelope.</t>
          </li>
          <li>
            <t>Retrieve the <tt>moq_key</tt>, <tt>moq_salt</tt> and MOQT track information matching the Key ID.</t>
          </li>
          <li>
            <t>Form the aad input as described in <xref target="aad"/>.</t>
          </li>
          <li>
            <t>Form the nonce by as described in <xref target="nonce"/>.</t>
          </li>
          <li>
            <t>Apply the AEAD decryption function with moq_key, nonce, aad and
ciphertext as inputs.</t>
          </li>
          <li>
            <t>Decode the private extension headers, returning both the headers and
the object payload.</t>
          </li>
        </ol>
        <t>If extracting Key ID fails either due to missing <tt>Secure Object KID</tt> extension
within immutable haeader extension or error from parsing, the client MUST
discard the received MOQT Object.</t>
        <t>If a ciphertext fails to decrypt because there is no key available for the Key ID
value presented, the client MAY buffer the ciphertext and retry decryption once
a key with that Key ID is received.  If a ciphertext fails to decrypt for any other
reason, the client MUST discard the ciphertext. Invalid ciphertexts SHOULD be
discarded in a way that is indistinguishable (to an external observer) from
having processed a valid ciphertext.  In other words, the decryption
operation should take the same amount of time regardless of whether decryption
succeeds or fails.</t>
      </section>
    </section>
    <section anchor="header-extensions">
      <name>Header Extensions</name>
      <section anchor="keyid-ext">
        <name>Key ID Extension</name>
        <t>Key ID  (Extension Header Type 0x2) is a variable length integer and
identifies the keying material (keys, nonces and associated context
for the MOQT Track) to be used for a given MOQT track.</t>
        <t>The Key ID extension is included within the Immutable Header extension.
All objects encoded MUST include the Key ID header extension when
using this specification for object encryption.</t>
      </section>
      <section anchor="pvt-ext">
        <name>Private Extension</name>
        <t>The Private Extensions (Extension Header Type 0xA) contains a sequence of
Key-Value-Pairs (see section 1.4.2 <xref target="MoQ-TRANSPORT"/>) which are also
Object Extension Headers of the Object. This extension can be added by the
Original Publisher and considered part of the Object Payload.</t>
        <artwork><![CDATA[
Private Extensions {
  Type (0xA),
  Length (i),
  Key-Value-Pair (..) ...
}
]]></artwork>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>The cryptographic computations described in this document are exactly those
performed in the SFrame encryption scheme defined in <xref target="SFRAME"/>,
The scheme in this document is effectively a "virtualized" version of SFrame:</t>
      <ul spacing="normal">
        <li>
          <t>The CTR value used in nonce formation is not carried in the object payload,
but instead synthesized from the GroupID and ObjectID.</t>
        </li>
        <li>
          <t>The AAD for the AEAD operation is not sent on the wire (as with the SFrame
Header), but constructed locally by the encrypting and decrypting endpoints.</t>
        </li>
        <li>
          <t>The format of the AAD is different:  </t>
          <ul spacing="normal">
            <li>
              <t>The SFrame Header is constructed using QUIC-style varints, instead of the
variable-length integer scheme defined in SFrame.</t>
            </li>
            <li>
              <t>The GroupID and GroupID are sent directly, not as the packed CTR value.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>The <tt>metadata</tt> input in to SFrame operations is defined to be the
FullTrackName value for the object.</t>
        </li>
        <li>
          <t>The labels used in key derivation reflect MOQ usage, not generic SFrame.</t>
        </li>
      </ul>
      <t>The security considerations discussed in the SFrame specification thus also
apply here.</t>
      <t>The SFrame specification lists several things that an application needs to
account for in order to use SFrame securely, which are all accounted for here:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Header value uniqueness:</strong> Uniqueness of CTR values follows from the
uniqueness of MOQT (GroupID, ObjectID) pairs. We only use one Key ID value, but
instead use distinct SFrame contexts with distinct keys per track. This
assures that the same (<tt>track_base_key</tt>, Key ID, CTR) tuple is never used twice.</t>
        </li>
        <li>
          <t><strong>Key management:</strong> We delegate this to the MOQT application, with subject to
the assumptions described in <xref target="setup-assumptions"/>.</t>
        </li>
        <li>
          <t><strong>Anti-replay:</strong> Replay is not possible within the MOQT framework because of
the uniqueness constraints on ObjectIDs and objects, and because the group
ID and object ID are cryptographically bound to the secure object payload.</t>
        </li>
        <li>
          <t><strong>Metadata:</strong> The analogue of the SFrame metadata input is
defined in <xref target="aad"/>.</t>
        </li>
      </ol>
      <t>Any of the SFrame ciphersuites defined in the IANA SFrame Cipher Suites registry <xref target="CIPHERS"/> can be used
to protect MOQT objects.  The caution against short tags in <xref section="7.5" sectionFormat="of" target="SFRAME"/>
still applies here, but the MOQT environment provides some safeguards that make
it safer to use short tags, namely:</t>
      <ul spacing="normal">
        <li>
          <t>MOQT has hop-by-hop protections provided by the underlying QUIC layer, so a
brute-force attack could only be mounted by a relay.</t>
        </li>
        <li>
          <t>MOQT tracks have predictable object arrival rates, so a receiver can interpret
a large deviation from this rate as a sign of an attack.</t>
        </li>
        <li>
          <t>The the binding of the secure object payload to other MOQT parameters (as
metadata), together with MOQT's uniqueness properties ensure that a valid
secure object payload cannot be replayed in a different context.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document defines a new MOQT Object extension header for carrying Key ID value,
under the <tt>MOQ Extension Headers</tt> registry.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Type</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">0x2</td>
            <td align="left">Seucure Object KID - see <xref target="keyid-ext"/></td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="MoQ-TRANSPORT">
          <front>
            <title>Media over QUIC Transport</title>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <date day="2" month="September" year="2025"/>
            <abstract>
              <t>   This document defines the core behavior for Media over QUIC Transport
   (MOQT), a media transport protocol designed to operate over QUIC and
   WebTransport, which have similar functionality.  MOQT allows a
   producer of media to publish data and have it consumed via
   subscription by a multiplicity of endpoints.  It supports
   intermediate content distribution networks and is designed for high
   scale and low latency distribution.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-14"/>
        </reference>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="SFRAME">
          <front>
            <title>Secure Frame (SFrame): Lightweight Authenticated Encryption for Real-Time Media</title>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="J. Uberti" initials="J." surname="Uberti"/>
            <author fullname="S. G. Murillo" initials="S. G." surname="Murillo"/>
            <author fullname="R. Barnes" initials="R." role="editor" surname="Barnes"/>
            <author fullname="Y. Fablet" initials="Y." surname="Fablet"/>
            <date month="August" year="2024"/>
            <abstract>
              <t>This document describes the Secure Frame (SFrame) end-to-end encryption and authentication mechanism for media frames in a multiparty conference call, in which central media servers (Selective Forwarding Units or SFUs) can access the media metadata needed to make forwarding decisions without having access to the actual media.</t>
              <t>This mechanism differs from the Secure Real-Time Protocol (SRTP) in that it is independent of RTP (thus compatible with non-RTP media transport) and can be applied to whole media frames in order to be more bandwidth efficient.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9605"/>
          <seriesInfo name="DOI" value="10.17487/RFC9605"/>
        </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="RFC9605">
          <front>
            <title>Secure Frame (SFrame): Lightweight Authenticated Encryption for Real-Time Media</title>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="J. Uberti" initials="J." surname="Uberti"/>
            <author fullname="S. G. Murillo" initials="S. G." surname="Murillo"/>
            <author fullname="R. Barnes" initials="R." role="editor" surname="Barnes"/>
            <author fullname="Y. Fablet" initials="Y." surname="Fablet"/>
            <date month="August" year="2024"/>
            <abstract>
              <t>This document describes the Secure Frame (SFrame) end-to-end encryption and authentication mechanism for media frames in a multiparty conference call, in which central media servers (Selective Forwarding Units or SFUs) can access the media metadata needed to make forwarding decisions without having access to the actual media.</t>
              <t>This mechanism differs from the Secure Real-Time Protocol (SRTP) in that it is independent of RTP (thus compatible with non-RTP media transport) and can be applied to whole media frames in order to be more bandwidth efficient.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9605"/>
          <seriesInfo name="DOI" value="10.17487/RFC9605"/>
        </reference>
        <reference anchor="RFC5116">
          <front>
            <title>An Interface and Algorithms for Authenticated Encryption</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms. The interface and registry can be used as an application-independent set of cryptoalgorithm suites. This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CIPHERS" target="https://www.iana.org/assignments/sframe/sframe.xhtml#sframe-cipher-suites">
          <front>
            <title>SFrame Cipher Suites</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC3711">
          <front>
            <title>The Secure Real-time Transport Protocol (SRTP)</title>
            <author fullname="M. Baugher" initials="M." surname="Baugher"/>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <author fullname="M. Naslund" initials="M." surname="Naslund"/>
            <author fullname="E. Carrara" initials="E." surname="Carrara"/>
            <author fullname="K. Norrman" initials="K." surname="Norrman"/>
            <date month="March" year="2004"/>
            <abstract>
              <t>This document describes the Secure Real-time Transport Protocol (SRTP), a profile of the Real-time Transport Protocol (RTP), which can provide confidentiality, message authentication, and replay protection to the RTP traffic and to the control traffic for RTP, the Real-time Transport Control Protocol (RTCP). [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3711"/>
          <seriesInfo name="DOI" value="10.17487/RFC3711"/>
        </reference>
      </references>
    </references>
    <?line 573?>

<section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Thanks to Alan Frindell for providing text on adding private
extensions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
