<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-moq-secure-objects-00" 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-ietf-moq-secure-objects-00"/>
    <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="2026" month="March" day="02"/>
    <area>Applications and Real-Time</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 48?>

<t>This document specifies an end-to-end authenticated encryption scheme
for application objects transmitted via Media over QUIC (MoQ)
Transport. The scheme enables original publishers that share a symmetric
key with end subscribers, to ensuring that MoQ relays are unable to
decrypt object contents.  Additionally, subscribers can verify the
integrity and authenticity of received objects, confirming that the
content has not been modified in transit.  Additionally it allows MoQ
parameters to be protected so the publisher can select if they are
readable and/or modifiable by relays.</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/secure-objects/draft-ietf-moq-secure-objects.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-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/moq-wg/secure-objects"/>.</t>
    </note>
  </front>
  <middle>
    <?line 61?>

<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 endpoints.</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 ID values are 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="MoQ-TRANSPORT"/> variable length integer (Section 1.4.1).</t>
          </dd>
        </dl>
      </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 three parts: parts that Relays can read and
modify, parts that Relay can read but is not allowed to modify, and
parts the Relays cannot read or modify. 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.  Groups 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, referred to as Full
Object ID in this specification.</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 Full Object ID but different data.</t>
        </li>
      </ol>
      <t>One of the ways system keep the Full Object IDs unique is by using a fully
qualified domain names or UUIDs as part of the Track Namespace.</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 Encrypted Properties List <xref target="pvt-ext"/>.  The scheme
authenticates the <tt>Group ID</tt>, <tt>Object ID</tt>, <tt>Immutable Properties</tt>
(Section 11.6 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>
      <table anchor="tbl-protection-levels">
        <name>MoQ Object Security Protection Levels</name>
        <thead>
          <tr>
            <th align="left">Protection Level</th>
            <th align="left">Fields</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Unprotected and Unauthenticated (HBH only)</td>
            <td align="left">Track Alias, Priority, Mutable Properties</td>
          </tr>
          <tr>
            <td align="left">End-to-End Authenticated</td>
            <td align="left">Group ID, Object ID, Immutable Properties, Track Namespace, Track Name (including Key ID)</td>
          </tr>
          <tr>
            <td align="left">End-to-End Encrypted and Authenticated</td>
            <td align="left">Original Payload, Encrypted Properties List</td>
          </tr>
        </tbody>
      </table>
      <section anchor="properties">
        <name>Properties</name>
        <t>MoQT defines mutable and immutable properties for objects. This
specification uses MoQT immutable properties to convey end-to-end
authenticated metadata and adds encrypted object properties (see
<xref target="pvt-ext"/>). The Encrypted Properties List is serialized and encrypted
along with the Object payload, decrypted and deserialized by the
receiver.  This specification further defines the <tt>Secure Object Key ID</tt>
property (see <xref target="keyid-ext"/>), which is transmitted within the immutable
properties.</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 and their lifetimes 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 Key ID</tt> property (that is contained within the
immutable properties of the Object).
The scope of a Key ID is the namespace so if two tracks inside the same
namespace have different tracks_base_keys, then they need to have
different Key ID values. This design is to support a single key across many
tracks where a client uses subscribe namespace to get new tracks as they
are created in the namespace.</t>
        <t>Applications determine the ciphersuite to be used for each track's
encryption context.  See <xref target="ciphersuite"/> for the list of ciphersuites
that 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="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 sequences.</t>
        </section>
        <section anchor="object-encryption">
          <name>Object Encryption</name>
          <t>To encrypt a MoQT Object, the application constructs a plaintext from
the application data and any encrypted properties:</t>
          <artwork><![CDATA[
pt = Serialize(original_payload)
     + Serialize(Encrypted Properties List)
]]></artwork>
          <t>Where <tt>original_payload</tt> is the application's object data. The
serialization of <tt>original_payload</tt> consists of a varint-encoded byte
count followed by the payload bytes. The serialization for the Encrypted
Properties List follows the rules for immutable properties (as defined
in Section 11 of <xref target="MoQ-TRANSPORT"/>).</t>
          <t>The plaintext is then encrypted:</t>
          <artwork><![CDATA[
ciphertext = encrypt(pt)
]]></artwork>
          <t>The resulting ciphertext replaces the <tt>original_payload</tt> as the MoQT
Object Payload. The ciphertext length reflects the encrypted
<tt>original_payload</tt> plus any Encrypted Properties List plus the AEAD
authentication tag.</t>
          <t>The detailed encryption process is shown below:</t>
          <figure anchor="fig-encryption-process">
            <name>Object Encryption Process</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="704" width="576" viewBox="0 0 576 704" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,32 L 8,80" fill="none" stroke="black"/>
                  <path d="M 8,160 L 8,208" fill="none" stroke="black"/>
                  <path d="M 8,256 L 8,304" fill="none" stroke="black"/>
                  <path d="M 40,304 L 40,448" fill="none" stroke="black"/>
                  <path d="M 40,480 L 40,544" fill="none" stroke="black"/>
                  <path d="M 72,208 L 72,248" fill="none" stroke="black"/>
                  <path d="M 80,512 L 80,576" fill="none" stroke="black"/>
                  <path d="M 88,80 L 88,120" fill="none" stroke="black"/>
                  <path d="M 120,304 L 120,352" fill="none" stroke="black"/>
                  <path d="M 120,384 L 120,416" fill="none" stroke="black"/>
                  <path d="M 144,160 L 144,208" fill="none" stroke="black"/>
                  <path d="M 144,256 L 144,304" fill="none" stroke="black"/>
                  <path d="M 144,624 L 144,688" fill="none" stroke="black"/>
                  <path d="M 168,32 L 168,80" fill="none" stroke="black"/>
                  <path d="M 192,576 L 192,616" fill="none" stroke="black"/>
                  <path d="M 216,32 L 216,80" fill="none" stroke="black"/>
                  <path d="M 224,400 L 224,432" fill="none" stroke="black"/>
                  <path d="M 240,160 L 240,224" fill="none" stroke="black"/>
                  <path d="M 240,624 L 240,688" fill="none" stroke="black"/>
                  <path d="M 264,304 L 264,336" fill="none" stroke="black"/>
                  <path d="M 288,80 L 288,120" fill="none" stroke="black"/>
                  <path d="M 304,224 L 304,296" fill="none" stroke="black"/>
                  <path d="M 304,336 L 304,392" fill="none" stroke="black"/>
                  <path d="M 304,480 L 304,504" fill="none" stroke="black"/>
                  <path d="M 312,512 L 312,576" fill="none" stroke="black"/>
                  <path d="M 360,32 L 360,80" fill="none" stroke="black"/>
                  <path d="M 360,400 L 360,432" fill="none" stroke="black"/>
                  <path d="M 464,304 L 464,336" fill="none" stroke="black"/>
                  <path d="M 488,304 L 488,336" fill="none" stroke="black"/>
                  <path d="M 496,160 L 496,224" fill="none" stroke="black"/>
                  <path d="M 504,256 L 504,296" fill="none" stroke="black"/>
                  <path d="M 504,344 L 504,448" fill="none" stroke="black"/>
                  <path d="M 504,480 L 504,544" fill="none" stroke="black"/>
                  <path d="M 536,304 L 536,336" fill="none" stroke="black"/>
                  <path d="M 568,128 L 568,448" fill="none" stroke="black"/>
                  <path d="M 568,480 L 568,560" fill="none" stroke="black"/>
                  <path d="M 8,32 L 168,32" fill="none" stroke="black"/>
                  <path d="M 216,32 L 360,32" fill="none" stroke="black"/>
                  <path d="M 8,80 L 168,80" fill="none" stroke="black"/>
                  <path d="M 216,80 L 360,80" fill="none" stroke="black"/>
                  <path d="M 88,128 L 568,128" fill="none" stroke="black"/>
                  <path d="M 8,160 L 144,160" fill="none" stroke="black"/>
                  <path d="M 240,160 L 496,160" fill="none" stroke="black"/>
                  <path d="M 8,208 L 144,208" fill="none" stroke="black"/>
                  <path d="M 240,224 L 496,224" fill="none" stroke="black"/>
                  <path d="M 8,256 L 144,256" fill="none" stroke="black"/>
                  <path d="M 304,256 L 504,256" fill="none" stroke="black"/>
                  <path d="M 8,304 L 144,304" fill="none" stroke="black"/>
                  <path d="M 264,304 L 464,304" fill="none" stroke="black"/>
                  <path d="M 488,304 L 536,304" fill="none" stroke="black"/>
                  <path d="M 264,336 L 464,336" fill="none" stroke="black"/>
                  <path d="M 488,336 L 536,336" fill="none" stroke="black"/>
                  <path d="M 224,400 L 360,400" fill="none" stroke="black"/>
                  <path d="M 120,416 L 208,416" fill="none" stroke="black"/>
                  <path d="M 224,432 L 360,432" fill="none" stroke="black"/>
                  <path d="M 80,512 L 312,512" fill="none" stroke="black"/>
                  <path d="M 40,544 L 72,544" fill="none" stroke="black"/>
                  <path d="M 320,544 L 504,544" fill="none" stroke="black"/>
                  <path d="M 320,560 L 568,560" fill="none" stroke="black"/>
                  <path d="M 80,576 L 312,576" fill="none" stroke="black"/>
                  <path d="M 144,624 L 240,624" fill="none" stroke="black"/>
                  <path d="M 144,688 L 240,688" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="512,296 500,290.4 500,301.6" fill="black" transform="rotate(90,504,296)"/>
                  <polygon class="arrowhead" points="328,560 316,554.4 316,565.6" fill="black" transform="rotate(180,320,560)"/>
                  <polygon class="arrowhead" points="328,544 316,538.4 316,549.6" fill="black" transform="rotate(180,320,544)"/>
                  <polygon class="arrowhead" points="312,504 300,498.4 300,509.6" fill="black" transform="rotate(90,304,504)"/>
                  <polygon class="arrowhead" points="312,392 300,386.4 300,397.6" fill="black" transform="rotate(90,304,392)"/>
                  <polygon class="arrowhead" points="312,296 300,290.4 300,301.6" fill="black" transform="rotate(90,304,296)"/>
                  <polygon class="arrowhead" points="296,120 284,114.4 284,125.6" fill="black" transform="rotate(90,288,120)"/>
                  <polygon class="arrowhead" points="216,416 204,410.4 204,421.6" fill="black" transform="rotate(0,208,416)"/>
                  <polygon class="arrowhead" points="200,616 188,610.4 188,621.6" fill="black" transform="rotate(90,192,616)"/>
                  <polygon class="arrowhead" points="96,120 84,114.4 84,125.6" fill="black" transform="rotate(90,88,120)"/>
                  <polygon class="arrowhead" points="80,544 68,538.4 68,549.6" fill="black" transform="rotate(0,72,544)"/>
                  <polygon class="arrowhead" points="80,248 68,242.4 68,253.6" fill="black" transform="rotate(90,72,248)"/>
                  <g class="text">
                    <text x="84" y="52">original_payload</text>
                    <text x="256" y="52">Private</text>
                    <text x="316" y="52">Header</text>
                    <text x="68" y="68">(application</text>
                    <text x="144" y="68">data)</text>
                    <text x="268" y="68">Extensions</text>
                    <text x="76" y="180">track_base_key</text>
                    <text x="264" y="180">Key</text>
                    <text x="296" y="180">ID,</text>
                    <text x="336" y="180">Group</text>
                    <text x="376" y="180">ID,</text>
                    <text x="420" y="180">Object</text>
                    <text x="464" y="180">ID,</text>
                    <text x="36" y="196">(per</text>
                    <text x="72" y="196">Key</text>
                    <text x="104" y="196">ID)</text>
                    <text x="272" y="196">Track</text>
                    <text x="340" y="196">Namespace,</text>
                    <text x="408" y="196">Track</text>
                    <text x="456" y="196">Name,</text>
                    <text x="292" y="212">Serialized</text>
                    <text x="376" y="212">Immutable</text>
                    <text x="436" y="212">Ext.</text>
                    <text x="32" y="276">Key</text>
                    <text x="92" y="276">Derivation</text>
                    <text x="44" y="292">(HKDF)</text>
                    <text x="288" y="324">CTR</text>
                    <text x="312" y="324">=</text>
                    <text x="388" y="324">GID(64)||OID(32)</text>
                    <text x="512" y="324">AAD</text>
                    <text x="124" y="372">salt</text>
                    <text x="256" y="420">Nonce</text>
                    <text x="320" y="420">Formation</text>
                    <text x="304" y="452">|</text>
                    <text x="40" y="468">key</text>
                    <text x="304" y="468">nonce</text>
                    <text x="504" y="468">aad</text>
                    <text x="564" y="468">pt</text>
                    <text x="196" y="548">AEAD.Encrypt</text>
                    <text x="188" y="644">Ciphertext</text>
                    <text x="168" y="660">(MoQT</text>
                    <text x="208" y="660">Obj</text>
                    <text x="188" y="676">Payload)</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
+-------------------+     +-----------------+
| original_payload  |     | Private Header  |
| (application data)|     | Extensions      |
+---------+---------+     +--------+--------+
          |                        |
          v                        v
          +-----------------------------------------------------------+
                                                                      |
+----------------+           +-------------------------------+        |
| track_base_key |           | Key ID, Group ID, Object ID,  |        |
| (per Key ID)   |           | Track Namespace, Track Name,  |        |
+-------+--------+           | Serialized Immutable Ext.     |        |
        |                    +-------+-----------------------+        |
        v                            |                                |
+-------+--------+                   +------------+-----------+       |
| Key Derivation |                   |                        |       |
| (HKDF)         |                   v                        v       |
+---+---------+--+              +------------------------+  +-----+   |
    |         |                 | CTR = GID(64)||OID(32) |  | AAD |   |
    |         |                 +----+-------------------+  +-----+   |
    |         |                      |                        |       |
    |        salt                    |                        |       |
    |         |                      v                        |       |
    |         |            +----+-----------+                 |       |
    |         +----------> | Nonce Formation|                 |       |
    |                      +----+-----------+                 |       |
    |                                |                        |       |
   key                             nonce                     aad     pt
    |                                |                        |       |
    |                                v                        |       |
    |    +-------------+--------------+                       |       |
    |    |                            |                       |       |
    +--->+        AEAD.Encrypt        +<----------------------+       |
         |                            |<------------------------------+
         +-------------+--------------+
                       |
                       v
                 +-----+-----+
                 |Ciphertext |
                 |(MoQT Obj  |
                 | Payload)  |
                 +-----------+
]]></artwork>
            </artset>
          </figure>
        </section>
        <section anchor="object-decryption">
          <name>Object Decryption</name>
          <t>To decrypt a MoQT Object, the application provides the MoQT Object
Payload as ciphertext input to obtain the plaintext:</t>
          <artwork><![CDATA[
pt = decrypt(ciphertext)
]]></artwork>
          <t>The plaintext is then deserialized to extract the application's
<tt>original_payload</tt> and the Encrypted Properties List:</t>
          <ol spacing="normal" type="1"><li>
              <t>Read a varint to obtain the <tt>original_payload</tt> length.</t>
            </li>
            <li>
              <t>Read that many bytes as <tt>original_payload</tt>.</t>
            </li>
            <li>
              <t>If no bytes remain, there is no Encrypted Properties List.</t>
            </li>
            <li>
              <t>Otherwise, read the property type (16 bits). If the value is not 0xA,
drop the object. Parse the remaining bytes as the Encrypted
Properties List structure.</t>
            </li>
          </ol>
          <t>If parsing fails at any stage, the receiver MUST drop the MoQT Object.</t>
          <t>The detailed decryption process is shown below:</t>
          <figure anchor="fig-decryption-process">
            <name>Object Decryption Process</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="768" width="576" viewBox="0 0 576 768" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,160 L 8,208" fill="none" stroke="black"/>
                  <path d="M 8,256 L 8,304" fill="none" stroke="black"/>
                  <path d="M 40,304 L 40,448" fill="none" stroke="black"/>
                  <path d="M 40,480 L 40,544" fill="none" stroke="black"/>
                  <path d="M 56,704 L 56,752" fill="none" stroke="black"/>
                  <path d="M 72,208 L 72,248" fill="none" stroke="black"/>
                  <path d="M 80,512 L 80,576" fill="none" stroke="black"/>
                  <path d="M 104,656 L 104,696" fill="none" stroke="black"/>
                  <path d="M 120,312 L 120,352" fill="none" stroke="black"/>
                  <path d="M 120,384 L 120,416" fill="none" stroke="black"/>
                  <path d="M 144,32 L 144,96" fill="none" stroke="black"/>
                  <path d="M 144,160 L 144,208" fill="none" stroke="black"/>
                  <path d="M 144,256 L 144,304" fill="none" stroke="black"/>
                  <path d="M 192,96 L 192,128" fill="none" stroke="black"/>
                  <path d="M 192,576 L 192,592" fill="none" stroke="black"/>
                  <path d="M 192,624 L 192,648" fill="none" stroke="black"/>
                  <path d="M 216,704 L 216,752" fill="none" stroke="black"/>
                  <path d="M 224,400 L 224,432" fill="none" stroke="black"/>
                  <path d="M 240,32 L 240,96" fill="none" stroke="black"/>
                  <path d="M 240,160 L 240,224" fill="none" stroke="black"/>
                  <path d="M 264,304 L 264,336" fill="none" stroke="black"/>
                  <path d="M 264,704 L 264,752" fill="none" stroke="black"/>
                  <path d="M 304,224 L 304,296" fill="none" stroke="black"/>
                  <path d="M 304,336 L 304,392" fill="none" stroke="black"/>
                  <path d="M 304,480 L 304,504" fill="none" stroke="black"/>
                  <path d="M 312,512 L 312,576" fill="none" stroke="black"/>
                  <path d="M 328,656 L 328,696" fill="none" stroke="black"/>
                  <path d="M 360,400 L 360,432" fill="none" stroke="black"/>
                  <path d="M 408,704 L 408,752" fill="none" stroke="black"/>
                  <path d="M 464,304 L 464,336" fill="none" stroke="black"/>
                  <path d="M 488,304 L 488,336" fill="none" stroke="black"/>
                  <path d="M 496,160 L 496,224" fill="none" stroke="black"/>
                  <path d="M 504,256 L 504,296" fill="none" stroke="black"/>
                  <path d="M 504,344 L 504,448" fill="none" stroke="black"/>
                  <path d="M 504,480 L 504,544" fill="none" stroke="black"/>
                  <path d="M 536,304 L 536,336" fill="none" stroke="black"/>
                  <path d="M 568,128 L 568,448" fill="none" stroke="black"/>
                  <path d="M 568,480 L 568,560" fill="none" stroke="black"/>
                  <path d="M 144,32 L 240,32" fill="none" stroke="black"/>
                  <path d="M 144,96 L 240,96" fill="none" stroke="black"/>
                  <path d="M 192,128 L 568,128" fill="none" stroke="black"/>
                  <path d="M 8,160 L 144,160" fill="none" stroke="black"/>
                  <path d="M 240,160 L 496,160" fill="none" stroke="black"/>
                  <path d="M 8,208 L 144,208" fill="none" stroke="black"/>
                  <path d="M 240,224 L 496,224" fill="none" stroke="black"/>
                  <path d="M 8,256 L 144,256" fill="none" stroke="black"/>
                  <path d="M 304,256 L 504,256" fill="none" stroke="black"/>
                  <path d="M 8,304 L 144,304" fill="none" stroke="black"/>
                  <path d="M 264,304 L 464,304" fill="none" stroke="black"/>
                  <path d="M 488,304 L 536,304" fill="none" stroke="black"/>
                  <path d="M 264,336 L 464,336" fill="none" stroke="black"/>
                  <path d="M 488,336 L 536,336" fill="none" stroke="black"/>
                  <path d="M 224,400 L 360,400" fill="none" stroke="black"/>
                  <path d="M 120,416 L 208,416" fill="none" stroke="black"/>
                  <path d="M 224,432 L 360,432" fill="none" stroke="black"/>
                  <path d="M 80,512 L 312,512" fill="none" stroke="black"/>
                  <path d="M 40,544 L 72,544" fill="none" stroke="black"/>
                  <path d="M 320,544 L 504,544" fill="none" stroke="black"/>
                  <path d="M 320,560 L 568,560" fill="none" stroke="black"/>
                  <path d="M 80,576 L 312,576" fill="none" stroke="black"/>
                  <path d="M 104,656 L 328,656" fill="none" stroke="black"/>
                  <path d="M 56,704 L 216,704" fill="none" stroke="black"/>
                  <path d="M 264,704 L 408,704" fill="none" stroke="black"/>
                  <path d="M 56,752 L 216,752" fill="none" stroke="black"/>
                  <path d="M 264,752 L 408,752" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="512,296 500,290.4 500,301.6" fill="black" transform="rotate(90,504,296)"/>
                  <polygon class="arrowhead" points="336,696 324,690.4 324,701.6" fill="black" transform="rotate(90,328,696)"/>
                  <polygon class="arrowhead" points="328,560 316,554.4 316,565.6" fill="black" transform="rotate(180,320,560)"/>
                  <polygon class="arrowhead" points="328,544 316,538.4 316,549.6" fill="black" transform="rotate(180,320,544)"/>
                  <polygon class="arrowhead" points="312,504 300,498.4 300,509.6" fill="black" transform="rotate(90,304,504)"/>
                  <polygon class="arrowhead" points="312,392 300,386.4 300,397.6" fill="black" transform="rotate(90,304,392)"/>
                  <polygon class="arrowhead" points="312,296 300,290.4 300,301.6" fill="black" transform="rotate(90,304,296)"/>
                  <polygon class="arrowhead" points="216,416 204,410.4 204,421.6" fill="black" transform="rotate(0,208,416)"/>
                  <polygon class="arrowhead" points="200,648 188,642.4 188,653.6" fill="black" transform="rotate(90,192,648)"/>
                  <polygon class="arrowhead" points="112,696 100,690.4 100,701.6" fill="black" transform="rotate(90,104,696)"/>
                  <polygon class="arrowhead" points="80,544 68,538.4 68,549.6" fill="black" transform="rotate(0,72,544)"/>
                  <polygon class="arrowhead" points="80,248 68,242.4 68,253.6" fill="black" transform="rotate(90,72,248)"/>
                  <g class="text">
                    <text x="188" y="52">Ciphertext</text>
                    <text x="168" y="68">(MoQT</text>
                    <text x="208" y="68">Obj</text>
                    <text x="188" y="84">Payload)</text>
                    <text x="76" y="180">track_base_key</text>
                    <text x="264" y="180">Key</text>
                    <text x="296" y="180">ID,</text>
                    <text x="336" y="180">Group</text>
                    <text x="376" y="180">ID,</text>
                    <text x="420" y="180">Object</text>
                    <text x="464" y="180">ID,</text>
                    <text x="36" y="196">(per</text>
                    <text x="72" y="196">Key</text>
                    <text x="104" y="196">ID)</text>
                    <text x="272" y="196">Track</text>
                    <text x="340" y="196">Namespace,</text>
                    <text x="408" y="196">Track</text>
                    <text x="456" y="196">Name,</text>
                    <text x="292" y="212">Serialized</text>
                    <text x="376" y="212">Immutable</text>
                    <text x="436" y="212">Ext.</text>
                    <text x="32" y="276">Key</text>
                    <text x="92" y="276">Derivation</text>
                    <text x="44" y="292">(HKDF)</text>
                    <text x="288" y="324">CTR</text>
                    <text x="312" y="324">=</text>
                    <text x="388" y="324">GID(64)||OID(32)</text>
                    <text x="512" y="324">AAD</text>
                    <text x="116" y="372">salt</text>
                    <text x="256" y="420">Nonce</text>
                    <text x="320" y="420">Formation</text>
                    <text x="304" y="452">|</text>
                    <text x="40" y="468">key</text>
                    <text x="304" y="468">nonce</text>
                    <text x="504" y="468">aad</text>
                    <text x="564" y="468">ct</text>
                    <text x="196" y="548">AEAD.Decrypt</text>
                    <text x="188" y="612">pt</text>
                    <text x="132" y="724">original_payload</text>
                    <text x="304" y="724">Private</text>
                    <text x="364" y="724">Header</text>
                    <text x="116" y="740">(application</text>
                    <text x="192" y="740">data)</text>
                    <text x="316" y="740">Extensions</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
                 +-----------+
                 |Ciphertext |
                 |(MoQT Obj  |
                 | Payload)  |
                 +-----+-----+
                       |
                       +----------------------------------------------+
                                                                      |
+----------------+           +-------------------------------+        |
| track_base_key |           | Key ID, Group ID, Object ID,  |        |
| (per Key ID)   |           | Track Namespace, Track Name,  |        |
+-------+--------+           | Serialized Immutable Ext.     |        |
        |                    +-------+-----------------------+        |
        v                            |                                |
+-------+--------+                   +------------------------+       |
| Key Derivation |                   |                        |       |
| (HKDF)         |                   v                        v       |
+---+------------+              +------------------------+  +-----+   |
    |         |                 | CTR = GID(64)||OID(32) |  | AAD |   |
    |         |                 +----+-------------------+  +-----+   |
    |         |                      |                        |       |
    |       salt                     |                        |       |
    |         |                      v                        |       |
    |         |            +----------------+                 |       |
    |         +----------> | Nonce Formation|                 |       |
    |                      +----------------+                 |       |
    |                                |                        |       |
   key                             nonce                     aad     ct
    |                                |                        |       |
    |                                v                        |       |
    |    +----------------------------+                       |       |
    |    |                            |                       |       |
    +--->|        AEAD.Decrypt        |<----------------------+       |
         |                            |<------------------------------+
         +-------------+--------------+
                       |
                      pt
                       |
                       v
            +----------+----------------+
            |                           |
            v                           v
      +-------------------+     +-----------------+
      | original_payload  |     | Private Header  |
      | (application data)|     | Extensions      |
      +-------------------+     +-----------------+
]]></artwork>
            </artset>
          </figure>
        </section>
      </section>
      <section anchor="encryption-schema">
        <name>Encryption Schema</name>
        <t>MoQT secure object protection relies on an ciphersute to define the AEAD
encryption algorithm and hash algorithm in use (<xref target="ciphersuite"/>).  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
(Section 4.5.1 of <xref target="SFRAME"/>), 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 Properties, 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 Properties (..)
}
]]></sourcecode>
        <t>Open Issue: We need to sort out of we can remove most the things from
SECURE_OBJECT_AAD because they are already bound to the keys.</t>
        <ul spacing="normal">
          <li>
            <t>Track Namespace is serialized as in section 2.4.1 of MoQT.</t>
          </li>
        </ul>
        <t>Serialized Immutable Properties MUST include the <tt>Secure Object Key ID</tt>
property 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 and Salt 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 Secure Objects 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 sequences.</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 Encrypted Properties List and Object payload field from the MoQT
object are 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 Properties from
the MoQT object headers. Ensure the Secure Object Key ID property 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 Encrypted Properties List 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 Key ID</tt> property
contained within the immutable properties 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 headers.</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 Encrypted Properties List, returning both the properties
and the object payload.</t>
          </li>
        </ol>
        <t>If extracting Key ID fails either due to missing <tt>Secure Object Key ID</tt>
property within immutable properties 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="object-properties">
      <name>Object Properties</name>
      <section anchor="keyid-ext">
        <name>Key ID Property</name>
        <t>Key ID (Property 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 property is included within the Immutable Properties.  All
objects encoded MUST include the Key ID property when using this
specification for object encryption.</t>
      </section>
      <section anchor="pvt-ext">
        <name>Encrypted Properties List</name>
        <t>The Encrypted Properties List (Property Type 0xA) is a container that
holds a sequence of Key-Value-Pairs (see Section 1.4.3 of
<xref target="MoQ-TRANSPORT"/>) representing one or more Object Properties. These
properties can be added by the Original Publisher and are encrypted
along with the Object Payload, making them accessible only to End
Subscribers.</t>
        <artwork><![CDATA[
Encrypted Properties List {
  Type (0xA),
  Length (i),
  Key-Value-Pair (..) ...
}
]]></artwork>
      </section>
    </section>
    <section anchor="usage-considerations">
      <name>Usage Considerations</name>
      <t>To implement the protection mechanisms specified herein, a secure object
requires the complete object before any validity checks can be
performed. This introduces latency proportional to the object size; if
the application aggregates excessive data into a single object (e.g.,
encapsulating 6 seconds of video), the entire segment must be received
before processing or validation can commence, delaying access to all
contained data until transfer completion.</t>
    </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 MoQT-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 ciphersuites defined in <xref target="ciphersuite"/> registry 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>In some usecases 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 anchor="aead-invocation-limits">
        <name>AEAD Invocation Limits</name>
        <t>AEAD algorithms have limits on how many times a single key can be used
before the cryptographic guarantees begin to degrade. Exceeding these
limits can compromise confidentiality (allowing an attacker to
distinguish encrypted content from random data) or integrity (allowing
an attacker to forge valid ciphertexts). The severity of these risks
depends on the specific algorithm in use.</t>
        <t>Implementations MUST track the number of encryption and decryption
operations performed with each <tt>moq_key</tt> and ensure that these counts
remain within the limits specified in <xref target="AEAD-LIMITS"/> for the cipher
suite in use. When approaching these limits, implementations MUST
arrange for new keying material to be established (e.g., by rotating to
a new Key ID with a fresh <tt>track_base_key</tt>) before the limits are
exceeded.</t>
        <t>For the AES-GCM cipher suites defined in this document, the primary
concern is the confidentiality limit, which restricts the number of
encryptions performed with a single key. For AES-CTR-HMAC cipher suites,
both encryption and decryption operations count toward the applicable
limits.</t>
      </section>
      <section anchor="deletion-detection">
        <name>Detecting Deletion by Malicious Relays</name>
        <t>A malicious relay could selectively delete objects or groups before
forwarding them to subscribers. While this specification does not
mandate detection of such deletions, it does provide mechanisms that
applications can use to detect when content has been removed.</t>
        <t>Some applications may not require deletion detection, or may be able to
detect missing data based on the internal structure of the object
payload (e.g., sequence numbers embedded in the media format). For
applications that do require deletion detection at the MoQT layer, the
following approaches are available:</t>
        <section anchor="monotonically-incrementing-identifiers">
          <name>Monotonically Incrementing Identifiers</name>
          <t>Applications that assign Group IDs and Object IDs in a strictly
monotonic sequence (incrementing by 1 for each successive group or
object) can straightforwardly detect gaps. A subscriber receiving Group
ID N followed by Group ID N+2, or Object ID M followed by Object ID M+3,
can conclude that intervening content was not delivered.</t>
        </section>
        <section anchor="non-sequential-identifiers-with-gap-properties">
          <name>Non-Sequential Identifiers with Gap Properties</name>
          <t>Applications that use Group IDs or Object IDs with intentional gaps
(e.g., for sparse data or timestamp-based identifiers) MUST include the
Prior Group ID Gap and/or Prior Object ID Gap properties as immutable
properties. These properties indicate the expected distance to the next
identifier. If the Prior Object ID Gap property is absent from a secure
object, receivers MUST assume a gap value of 1. Similarly, if the Prior
Group ID Gap property is absent, receivers MUST assume a gap value of 1.</t>
        </section>
      </section>
      <section anchor="signaling-end-of-content">
        <name>Signaling End of Content</name>
        <t>For applications that need to reliably detect lost objects at the end of
a subgroup, group, or track, it is RECOMMENDED to signal completion
using object status values defined in <xref target="MoQ-TRANSPORT"/>. By explicitly
marking the final object in a sequence, subscribers can distinguish
between "more objects may arrive" and "all objects have been sent,"
enabling detection of trailing deletions that would otherwise be
undetectable.</t>
        <t>Publishers SHOULD send an End of Group status (0x3) as the final object
in each group. This allows subscribers to determine whether all objects
up to that Object ID have been received, enabling detection of any
missing objects at the end of the group.</t>
        <t>Publishers SHOULD send an End of Track status (0x4) when the track is
complete (e.g., end of a recorded stream or live session). This allows
subscribers to determine whether all objects up to that location have
been received, enabling detection of any missing objects at the end of
the track.</t>
        <t>For subgroup boundaries, the transport stream closure (FIN) signals that
all objects in the subgroup have been delivered.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <section anchor="moq-object-properties-registry">
        <name>MOQ Object Properties Registry</name>
        <t>This document defines new MoQT Object properties under the
<tt>MOQ Object Properties</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">Secure Object Key ID - see <xref target="keyid-ext"/></td>
            </tr>
            <tr>
              <td align="left">0xA</td>
              <td align="left">Encrypted Properties List - see <xref target="pvt-ext"/></td>
            </tr>
          </tbody>
        </table>
        <t>Note: The Encrypted Properties List type (0xA) appears only within the
encrypted payload structure defined in <xref target="app"/>, not as a regular MoQT
Object Property. It is registered here to reserve the type value and
prevent conflicts with the property type field used in the encrypted
payload format.</t>
      </section>
      <section anchor="ciphersuite">
        <name>Cipher Suites</name>
        <t>This document establishes a "MoQ Secure Objects Cipher Suites" registry.
Each cipher suite specifies an AEAD encryption algorithm and a hash
algorithm used for key derivation.</t>
        <t>The following values are defined for each cipher suite:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Nh</tt>: The size in bytes of the hash function output</t>
          </li>
          <li>
            <t><tt>Nka</tt>: The size in bytes of the encryption key for the underlying
cipher (CTR suites only)</t>
          </li>
          <li>
            <t><tt>Nk</tt>: The size in bytes of the AEAD key</t>
          </li>
          <li>
            <t><tt>Nn</tt>: The size in bytes of the AEAD nonce</t>
          </li>
          <li>
            <t><tt>Nt</tt>: The size in bytes of the AEAD authentication tag</t>
          </li>
        </ul>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">R</th>
              <th align="left">Nh</th>
              <th align="left">Nka</th>
              <th align="left">Nk</th>
              <th align="left">Nn</th>
              <th align="left">Nt</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0000</td>
              <td align="left">Reserved</td>
              <td align="left">-</td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">0x0001</td>
              <td align="left">AES_128_CTR_HMAC_SHA256_80</td>
              <td align="left">Y</td>
              <td align="left">32</td>
              <td align="left">16</td>
              <td align="left">48</td>
              <td align="left">12</td>
              <td align="left">10</td>
            </tr>
            <tr>
              <td align="left">0x0002</td>
              <td align="left">AES_128_CTR_HMAC_SHA256_64</td>
              <td align="left">Y</td>
              <td align="left">32</td>
              <td align="left">16</td>
              <td align="left">48</td>
              <td align="left">12</td>
              <td align="left">8</td>
            </tr>
            <tr>
              <td align="left">0x0003</td>
              <td align="left">AES_128_CTR_HMAC_SHA256_32</td>
              <td align="left">N</td>
              <td align="left">32</td>
              <td align="left">16</td>
              <td align="left">48</td>
              <td align="left">12</td>
              <td align="left">4</td>
            </tr>
            <tr>
              <td align="left">0x0004</td>
              <td align="left">AES_128_GCM_SHA256_128</td>
              <td align="left">Y</td>
              <td align="left">32</td>
              <td align="left">n/a</td>
              <td align="left">16</td>
              <td align="left">12</td>
              <td align="left">16</td>
            </tr>
            <tr>
              <td align="left">0x0005</td>
              <td align="left">AES_256_GCM_SHA512_128</td>
              <td align="left">Y</td>
              <td align="left">64</td>
              <td align="left">n/a</td>
              <td align="left">32</td>
              <td align="left">12</td>
              <td align="left">16</td>
            </tr>
            <tr>
              <td align="left">0xF000-0xFFFF</td>
              <td align="left">Reserved for private use</td>
              <td align="left">-</td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
            </tr>
          </tbody>
        </table>
        <t>The "R" column indicates whether the cipher suite is Recommended:</t>
        <ul spacing="normal">
          <li>
            <t>Y: Indicates that the IETF has consensus that the item is
   RECOMMENDED. Requires Standard Action as defined <xref target="RFC8126"/>.</t>
          </li>
          <li>
            <t>N: Indicates the IETF has made no statement about the suitability of
   the associated mechanism. Requires First Come First Serve as
   defined in <xref target="RFC8126"/>.</t>
          </li>
          <li>
            <t>D: Indicates that the item is discouraged and SHOULD NOT be
   used. Requires Standard Action or IESG Approval as defined in
   <xref target="RFC8126"/>.</t>
          </li>
        </ul>
        <t>Cipher suite values are 2-byte big-endian integers.  The algorithms are
the same as defined in SFrame ciphersuites defined in the IANA SFrame
Cipher Suites -registry <xref target="CIPHERS"/>.</t>
        <t><strong>AES-GCM cipher suites</strong> (0x0004, 0x0005) use AES-GCM for authenticated
encryption with a full 128-bit authentication tag.</t>
        <t><strong>AES-CTR-HMAC cipher suites</strong> (0x0001, 0x0002, 0x0003) use AES in
counter mode combined with HMAC for authentication in an
encrypt-then-MAC construction. These suites support truncated
authentication tags, providing lower overhead at the cost of reduced
forgery resistance.</t>
        <t>Implementations MUST support <tt>AES_128_GCM_SHA256_128</tt> (0x0004).
Implementations SHOULD support <tt>AES_128_CTR_HMAC_SHA256_80</tt> (0x0001).</t>
      </section>
    </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="13" month="January" year="2026"/>
            <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-16"/>
        </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="AEAD-LIMITS">
          <front>
            <title>Usage Limits on AEAD Algorithms</title>
            <author fullname="Felix Günther" initials="F." surname="Günther">
              <organization>IBM Research Europe - Zurich</organization>
            </author>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="4" month="December" year="2025"/>
            <abstract>
              <t>   An Authenticated Encryption with Associated Data (AEAD) algorithm
   provides confidentiality and integrity.  Excessive use of the same
   key can give an attacker advantages in breaking these properties.
   This document provides simple guidance for users of common AEAD
   functions about how to limit the use of keys in order to bound the
   advantage given to an attacker.  It considers limits in both single-
   and multi-key settings.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aead-limits-11"/>
        </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="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>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </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 875?>

<section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Thanks to Alan Frindell for providing text on adding encrypted
properties. Thank you to Magnus Westerlund for doing a thorough
security review.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
3pmau7H6/wMyraYOjAAA

-->

</rfc>
