<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-jennings-moq-mocha-mls-keying-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="mocha-mls-keying">MOCHA MLS Keying: End-to-End Encryption Key Management over MoQ</title>
    <seriesInfo name="Internet-Draft" value="draft-jennings-moq-mocha-mls-keying-00"/>
    <author fullname="Cullen Jennings">
      <organization>Cisco</organization>
      <address>
        <email>fluffy@iii.ca</email>
      </address>
    </author>
    <author fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <date year="2026" month="July" day="06"/>
    <area>Applications and Real-Time</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>MoQ</keyword>
    <keyword>MOQT</keyword>
    <keyword>MOCHA</keyword>
    <keyword>MLS</keyword>
    <keyword>E2EE</keyword>
    <keyword>Key Management</keyword>
    <abstract>
      <?line 49?>

<t>This document specifies MLS key management for MOCHA (MoQ Open
Communication &amp; Hosting Architecture). It defines how MLS groups
are created, how members are added and removed, how key material
is distributed over MOQT tracks, and how the MLS Delivery
Service is realized in a fully distributed manner using MOQT
publish/subscribe. For large channels, Partial MLS is used to
avoid requiring all members to process every membership change.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-jennings-moq-mocha-mls-keying/"/>.
      </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>
    </note>
  </front>
  <middle>
    <?line 59?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Keying for end-to-end encryption in MOCHA is provided by the
Message Layer Security (MLS) protocol <xref target="MLS"/>. MLS requires a
Delivery Service to distribute protocol messages (KeyPackages,
Commits, Welcome messages) between group members. Traditional
MLS deployments use a centralized server for this role.</t>
      <t>This document specifies how MOCHA realizes the MLS Delivery
Service in a fully distributed manner using MOQT's
publish/subscribe primitives. Each member publishes MLS
protocol messages on its own MOQT track, and other members
subscribe to receive them. This eliminates the single point
of failure and trust concentration inherent in a centralized
Delivery Service.</t>
      <t>For large channels where full MLS group membership becomes
impractical, this document specifies the use of Partial MLS
<xref target="MLS-PARTIAL"/>, which allows subgroups of members to
participate without processing every commit in the full group.</t>
      <t>Credentials used within MLS (signing keys, identity
assertions) are obtained via the mechanisms defined in
<xref target="MOCHA-IDENTITY"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>See BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>.</t>
      <t>This document uses terminology defined in <xref target="MOCHA-ARCH"/> and
<xref target="MLS"/>. The following additional terms are used:</t>
      <dl>
        <dt>MLS Group:</dt>
        <dd>
          <t>An MLS group instance associated with a MOCHA channel. All
members of the channel who participate in E2EE are members
of this group.</t>
        </dd>
        <dt>KeyPackage:</dt>
        <dd>
          <t>An MLS structure published by a device to advertise its
willingness to be added to a group. Contains the device's
public keys and supported ciphersuites.</t>
        </dd>
        <dt>Commit:</dt>
        <dd>
          <t>An MLS message that advances the group epoch. Commits
carry Add, Remove, or Update proposals.</t>
        </dd>
        <dt>Welcome:</dt>
        <dd>
          <t>An MLS message sent to a newly added member containing the
group state needed to participate from the current epoch.</t>
        </dd>
        <dt>Epoch:</dt>
        <dd>
          <t>A version of the MLS group state. Each Commit advances the
epoch by one.</t>
        </dd>
        <dt>Committer:</dt>
        <dd>
          <t>The designated group member responsible for collecting
Proposals and publishing Commits. Only the committer
advances the group epoch.</t>
        </dd>
      </dl>
    </section>
    <section anchor="mls-naming">
      <name>MLS Namespace and Track Structure</name>
      <section anchor="mls-namespace">
        <name>MLS Namespace</name>
        <t>MLS protocol messages for a channel use the following
namespace tuple:</t>
        <artwork><![CDATA[
  ("mocha_v1", <Provider>, <OrgID>, "mls", <TeamID>,
   <ChannelID>, <MLSParticipantID>)
]]></artwork>
        <t>KeyPackage advertisements use a separate namespace:</t>
        <artwork><![CDATA[
  ("mocha_v1", <Provider>, <OrgID>, "keypackage", <TeamID>,
   <ChannelID>, <MLSParticipantID>)
]]></artwork>
        <t>The MLSParticipantID is derived from the participant's MLS
credential and uniquely identifies a participant within the
channel's MLS group.</t>
      </section>
      <section anchor="track-names">
        <name>Track Names</name>
        <t>Each device publishes MLS protocol messages (Proposals,
Commits, Welcomes) on its own track within the MLS
namespace:</t>
        <artwork><![CDATA[
  mls_v1_<HDevID>
]]></artwork>
        <t>Each device publishes its KeyPackage on its own track within
the keypackage namespace:</t>
        <artwork><![CDATA[
  keypackage_v1_<HDevID>
]]></artwork>
      </section>
      <section anchor="object-semantics">
        <name>Object Semantics</name>
        <t>Each MLS protocol message (Proposal, Commit, or Welcome)
is published as a single MOQT object. Objects within a group
are sequentially numbered. The MOQT Group ID corresponds to
the MLS epoch number, providing natural alignment between
MLS state transitions and MOQT group boundaries.</t>
      </section>
      <section anchor="object-format">
        <name>Object Format</name>
        <t>Each MOQT object on an MLS track carries a 1-byte type
prefix followed by the raw MLS message bytes:</t>
        <artwork><![CDATA[
  +------+-----------------------------+
  | Type | MLS Message (raw bytes)     |
  | (1B) |                             |
  +------+-----------------------------+
]]></artwork>
        <t>The Type field values are:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x01</td>
              <td align="left">Proposal</td>
            </tr>
            <tr>
              <td align="left">0x02</td>
              <td align="left">Commit</td>
            </tr>
            <tr>
              <td align="left">0x03</td>
              <td align="left">Welcome</td>
            </tr>
            <tr>
              <td align="left">0x04</td>
              <td align="left">KeyPackage</td>
            </tr>
          </tbody>
        </table>
        <t>This prefix allows receivers to quickly dispatch messages
without parsing the MLS wire format. The MLS Message field
contains the unmodified MLSMessage struct as defined in
<xref target="MLS"/>, Section 6.</t>
      </section>
    </section>
    <section anchor="delivery-service">
      <name>Distributed Delivery Service</name>
      <section anchor="design">
        <name>Design</name>
        <t>Traditional MLS requires a Delivery Service that orders
Commits and ensures all members see the same sequence of
group operations. In MOCHA, this role is distributed across
the MOQT relay network.</t>
        <t>The key insight is that MOQT relays already provide:</t>
        <ul spacing="normal">
          <li>
            <t>Reliable delivery of published objects to all subscribers</t>
          </li>
          <li>
            <t>Caching for late-joining members</t>
          </li>
          <li>
            <t>Fan-out to all subscribers of a track</t>
          </li>
        </ul>
        <t>By assigning each member its own MLS track within the channel
namespace, the relay network collectively acts as the Delivery
Service without any single entity controlling message ordering
or having access to plaintext key material.</t>
      </section>
      <section anchor="propose-commit">
        <name>Propose/Commit Separation</name>
        <t>MLS requires that Commits are applied in a consistent order
by all members. MOCHA uses a leader-follower model to
achieve this without a centralized server:</t>
        <ul spacing="normal">
          <li>
            <t>Any member MAY publish Proposals (Add, Remove, Update) on
its own MLS track at any time.</t>
          </li>
          <li>
            <t>A single designated member (the "committer") collects
pending Proposals and publishes Commits that advance the
epoch.</t>
          </li>
          <li>
            <t>All other members ("followers") subscribe to the
committer's track and apply Commits as they arrive.</t>
          </li>
        </ul>
        <t>This separation ensures exactly one Commit per epoch
transition with no conflicts or rollbacks.</t>
        <t>The committer MAY batch multiple pending Proposals into a
single Commit to minimize epoch churn. For example, if
several Add or Remove Proposals arrive in quick succession,
the committer can coalesce them into one Commit that
advances the epoch once rather than producing a separate
epoch transition for each Proposal.</t>
      </section>
      <section anchor="committer-selection">
        <name>Committer Selection</name>
        <section anchor="initial-committer">
          <name>Initial Committer</name>
          <t>The Provider designates the initial committer when the
channel is created. The channel metadata returned by the
Provider includes the creator's HDevID as the initial
committer. Since channel creation requires the Provider to
be reachable, the Provider serializes this assignment —
no race condition is possible.</t>
        </section>
        <section anchor="group-re-bootstrap">
          <name>Group Re-Bootstrap</name>
          <t>If the MLS group requires re-creation (all members have
left, or the group state is explicitly reset), the first
authorized member to join and observe no active keep-alive
track assumes the committer role and creates a new epoch 0.
If two members join simultaneously and both attempt epoch 0,
relays deliver both but members MUST accept only the first
valid Welcome they process and ignore subsequent attempts.
The losing bootstrapper observes the established group and
falls back to follower behavior.</t>
          <t>Because this fallback uses Provider-authorized channel
membership rather than always electing the lowest HDevID,
the attack surface is reduced — only devices the Provider
has authorized for the channel can assume the committer
role.</t>
        </section>
        <section anchor="committer-transfer">
          <name>Committer Transfer</name>
          <t>The current committer MAY designate a successor by including
a committer_transfer extension in a Commit. The successor's
HDevID is recorded in the group state.</t>
        </section>
      </section>
      <section anchor="committer-failover">
        <name>Committer Failover</name>
        <t>If the committer becomes unavailable (temporary disconnection
or permanent departure), the group must elect a new committer
to continue processing Proposals.</t>
        <t>Unavailability is detected when:</t>
        <ul spacing="normal">
          <li>
            <t>No valid keep-alive (<xref target="keep-alive"/>) is received within
the deployment-configured timeout (e.g., 30 seconds).</t>
          </li>
          <li>
            <t>The committer is explicitly removed from the group.</t>
          </li>
        </ul>
        <t>When unavailability is detected, the remaining members
elect a new committer using the following deterministic rule:</t>
        <ol spacing="normal" type="1"><li>
            <t>All active members (those with a currently published
roster entry with status "active") are eligible.</t>
          </li>
          <li>
            <t>If the departing committer's last Commit contained a
committer_transfer extension, the designated HDevID
becomes the new committer. Otherwise, the eligible
member with the lowest HDevID (lexicographic ordering)
becomes the new committer.</t>
          </li>
          <li>
            <t>The new committer publishes a Commit containing all
pending Proposals plus its own Update proposal to
signal committer succession.</t>
          </li>
        </ol>
        <t>This ensures all members independently arrive at the same
new committer without explicit coordination. The timeout
SHOULD be long enough to tolerate transient network
disruptions but short enough to avoid blocking group
operations.</t>
      </section>
      <section anchor="follower-behavior">
        <name>Follower Behavior</name>
        <t>Followers subscribe to all MLS tracks in the channel
namespace via SUBSCRIBE_NAMESPACE. They:</t>
        <ol spacing="normal" type="1"><li>
            <t>Publish Proposals on their own MLS tracks when they
wish to add, remove, or update members.</t>
          </li>
          <li>
            <t>Apply Commits only from the current committer's track.</t>
          </li>
          <li>
            <t>Ignore Commits published by non-committer members
(except during failover succession).</t>
          </li>
        </ol>
      </section>
      <section anchor="keep-alive">
        <name>Committer Keep-Alive</name>
        <t>The committer periodically publishes keep-alive objects to
prove liveness and current epoch membership. All members
MUST subscribe to the committer's keep-alive track:</t>
        <artwork><![CDATA[
  keepalive_v1_<HDevID>
]]></artwork>
        <section anchor="track-properties">
          <name>Track Properties</name>
          <t>The committer sets the following Track Property when
publishing to the keep-alive track:</t>
          <ul spacing="normal">
            <li>
              <t><strong>keepalive_interval</strong>: The expected interval in seconds
between keep-alive objects. Members use this value as the
basis for failover timeout detection.</t>
            </li>
          </ul>
        </section>
        <section anchor="keep-alive-object-format">
          <name>Keep-Alive Object Format</name>
          <sourcecode type="json"><![CDATA[
{
  "epoch": 5,
  "ts": 1715788800,
  "interval": 10,
  "nonce": "<16 bytes, hex-encoded>",
  "mac": "<HMAC output, hex-encoded>"
}
]]></sourcecode>
          <t>The <tt>interval</tt> field is the keep-alive interval in seconds,
matching the Track Property value. This allows new joiners
who FETCH the latest object to learn the timeout without
having received the original SUBSCRIBE Track Properties.</t>
          <t>The MAC is computed as:</t>
          <artwork><![CDATA[
  mac = HMAC(confirmation_key,
             big_endian_uint64(epoch) ||
             big_endian_uint64(ts) ||
             nonce_bytes)
]]></artwork>
          <t>where confirmation_key is the MLS confirmation key for the
current epoch (<xref target="MLS"/>, Section 8). All group members hold
this key as part of the MLS key schedule.</t>
        </section>
        <section anchor="verification">
          <name>Verification</name>
          <t>Upon receiving a keep-alive object, each member:</t>
          <ol spacing="normal" type="1"><li>
              <t>Reads the epoch, ts, and nonce fields from the object.</t>
            </li>
            <li>
              <t>Computes the HMAC using its own confirmation_key for the
indicated epoch.</t>
            </li>
            <li>
              <t>Compares the computed MAC against the received mac field.</t>
            </li>
            <li>
              <t>If verification succeeds, the committer is confirmed as
live and in possession of current epoch secrets.</t>
            </li>
            <li>
              <t>If verification fails, the member SHOULD treat the
committer as potentially compromised or out of sync and
initiate failover (<xref target="committer-failover"/>).</t>
            </li>
          </ol>
        </section>
        <section anchor="timing">
          <name>Timing</name>
          <t>The committer MUST publish a keep-alive at the interval
advertised in the keepalive_interval Track Property and
the object's interval field. Members trigger failover if
no valid keep-alive is received within twice the advertised
interval (<xref target="committer-failover"/>).</t>
          <t>The nonce field (random bytes generated per keep-alive)
ensures each object produces a unique MAC, preventing relays
from replaying a previously observed keep-alive within the
same epoch.</t>
        </section>
      </section>
      <section anchor="keypackage-distribution">
        <name>KeyPackage Distribution</name>
        <t>Each device publishes its current KeyPackage on its
keypackage track within the channel's keypackage namespace:</t>
        <artwork><![CDATA[
  Namespace: ("mocha_v1", <Provider>, <OrgID>, "keypackage",
              <TeamID>, <ChannelID>, <MLSParticipantID>)
  Track: keypackage_v1_<HDevID>
]]></artwork>
        <t>The committer MUST subscribe to the KeyPackage namespace
(SUBSCRIBE_NAMESPACE) to be notified when new devices
publish KeyPackages. Upon receiving a new KeyPackage, the
committer creates an Add Proposal and includes it in its
next Commit.</t>
        <t>Other members MAY also subscribe to the KeyPackage namespace
and publish Add Proposals on their own MLS tracks, but
only the committer produces the Commit that incorporates
the Proposal.</t>
        <t>KeyPackages are rotated by publishing a new object on the
track. Each KeyPackage is single-use; after being consumed
in an Add Proposal, the device MUST publish a fresh
KeyPackage.</t>
      </section>
      <section anchor="welcome-message-delivery">
        <name>Welcome Message Delivery</name>
        <t>When a member issues a Commit that adds a new participant,
it publishes the Welcome message as an object on its own
MLS track. The Welcome is addressed to the new member by
including the target HDevID in an object property, allowing
the new member to identify which object contains its Welcome.</t>
      </section>
    </section>
    <section anchor="lifecycle">
      <name>Group Lifecycle</name>
      <section anchor="group-creation">
        <name>Group Creation</name>
        <t>When a channel is created, the creator (designated as the
initial committer by the Provider) initializes a new MLS
group:</t>
        <ol spacing="normal" type="1"><li>
            <t>Creator generates an MLS group with a fresh group ID
derived from the channel namespace.</t>
          </li>
          <li>
            <t>Creator publishes (PUBLISH) its KeyPackage on track
<tt>keypackage_v1_&lt;HDevID&gt;</tt> within the keypackage namespace:
("mocha_v1", &lt;Provider&gt;, &lt;OrgID&gt;, "keypackage",
&lt;TeamID&gt;, &lt;ChannelID&gt;, &lt;MLSParticipantID&gt;).</t>
          </li>
          <li>
            <t>Creator publishes the initial Commit (epoch 0 to epoch 1)
on track <tt>mls_v1_&lt;HDevID&gt;</tt> within the MLS namespace:
("mocha_v1", &lt;Provider&gt;, &lt;OrgID&gt;, "mls",
&lt;TeamID&gt;, &lt;ChannelID&gt;, &lt;MLSParticipantID&gt;).</t>
          </li>
          <li>
            <t>Creator publishes its initial keep-alive on track
<tt>keepalive_v1_&lt;HDevID&gt;</tt> within the MLS namespace.</t>
          </li>
          <li>
            <t>Creator subscribes (SUBSCRIBE_NAMESPACE) to the keypackage
namespace to receive KeyPackages from new joiners.</t>
          </li>
          <li>
            <t>Creator subscribes (SUBSCRIBE_NAMESPACE) to the MLS
namespace to receive Proposals from other members.</t>
          </li>
        </ol>
      </section>
      <section anchor="adding-members">
        <name>Adding Members</name>
        <t>To add a member to the channel:</t>
        <ol spacing="normal" type="1"><li>
            <t>The new device publishes (PUBLISH) its KeyPackage on track
<tt>keypackage_v1_&lt;HDevID&gt;</tt> within the keypackage namespace.</t>
          </li>
          <li>
            <t>The committer, subscribed to the keypackage namespace,
receives the new KeyPackage via the relay.</t>
          </li>
          <li>
            <t>The committer creates an MLS Commit containing an Add
Proposal referencing the received KeyPackage. Only the
current committer MUST produce Commits.</t>
          </li>
          <li>
            <t>The committer publishes the Commit and the Welcome message
on track <tt>mls_v1_&lt;HDevID&gt;</tt> within the MLS namespace.</t>
          </li>
          <li>
            <t>All existing members, subscribed to the MLS namespace,
receive the Commit and advance to the new epoch. Members
MUST cache received Proposals locally until the
corresponding Commit from the committer is received.</t>
          </li>
          <li>
            <t>The new member subscribes (SUBSCRIBE) to the committer's
track <tt>mls_v1_&lt;committer-HDevID&gt;</tt>, receives the Welcome,
and initializes its group state at the new epoch.</t>
          </li>
          <li>
            <t>The new member subscribes (SUBSCRIBE_NAMESPACE) to the
MLS namespace to receive future Proposals and Commits.</t>
          </li>
          <li>
            <t>The new member subscribes (SUBSCRIBE) to the committer's
keep-alive track <tt>keepalive_v1_&lt;committer-HDevID&gt;</tt>.</t>
          </li>
        </ol>
        <t>Alternatively, any member subscribed to the keypackage
namespace MAY create an Add Proposal and publish it on its
own track <tt>mls_v1_&lt;HDevID&gt;</tt>. The committer incorporates such
Proposals into its next Commit.</t>
      </section>
      <section anchor="removing-members">
        <name>Removing Members</name>
        <t>To remove a member:</t>
        <ol spacing="normal" type="1"><li>
            <t>The remover creates an MLS Remove Proposal for the target
member's leaf index and publishes (PUBLISH) it on track
<tt>mls_v1_&lt;HDevID&gt;</tt> within the MLS namespace.</t>
          </li>
          <li>
            <t>The committer, subscribed to the MLS namespace, receives
the Remove Proposal and creates an MLS Commit
incorporating it. Only the current committer MUST produce
Commits.</t>
          </li>
          <li>
            <t>The committer publishes the Commit on its track
<tt>mls_v1_&lt;HDevID&gt;</tt> within the MLS namespace.</t>
          </li>
          <li>
            <t>All remaining members, subscribed to the MLS namespace,
receive the Commit and advance to the new epoch. Members
MUST cache received Proposals locally until the
corresponding Commit from the committer is received.</t>
          </li>
          <li>
            <t>The removed member can no longer decrypt messages sent
in subsequent epochs.</t>
          </li>
        </ol>
      </section>
      <section anchor="key-update">
        <name>Key Update</name>
        <t>Any member can rotate its own key material:</t>
        <ol spacing="normal" type="1"><li>
            <t>The member creates an MLS Update Proposal with fresh key
material and publishes (PUBLISH) it on track
<tt>mls_v1_&lt;HDevID&gt;</tt> within the MLS namespace.</t>
          </li>
          <li>
            <t>The committer, subscribed to the MLS namespace, receives
the Update Proposal and creates an MLS Commit
incorporating it. Only the current committer MUST produce
Commits.</t>
          </li>
          <li>
            <t>The committer publishes the Commit on its track
<tt>mls_v1_&lt;HDevID&gt;</tt> within the MLS namespace.</t>
          </li>
          <li>
            <t>All members, subscribed to the MLS namespace, receive the
Commit and advance to the new epoch with updated key
material. Members MUST cache received Proposals locally
until the corresponding Commit from the committer is
received.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="partial-mls">
      <name>Partial MLS for Large Channels</name>
      <t>For channels with many members (hundreds or thousands), full
MLS becomes impractical because every member must download
and process every Commit. Partial MLS <xref target="MLS-PARTIAL"/> allows
members to participate in the group without tracking the
full ratchet tree.</t>
      <section anchor="when-to-use-partial-mls">
        <name>When to Use Partial MLS</name>
        <t>Channels SHOULD use Partial MLS when the member count exceeds
a deployment-configured threshold (e.g., 100 members).
Channels MAY start with full MLS and transition to Partial
MLS as membership grows.</t>
      </section>
      <section anchor="partial-mls-operation">
        <name>Partial MLS Operation</name>
        <t>In Partial MLS mode:</t>
        <ol spacing="normal" type="1"><li>
            <t>A subset of members (the "core group") maintains the full
MLS tree state and processes all Commits.</t>
          </li>
          <li>
            <t>Other members ("partial members") hold only their own
leaf state and the path to the root. They can encrypt
and decrypt application messages using the group's
application secret, but do not process every Commit.</t>
          </li>
          <li>
            <t>When a partial member needs to send a Commit (e.g., to
update its own keys), it publishes a partial Commit that
the core group integrates into the full tree.</t>
          </li>
          <li>
            <t>The core group periodically publishes "sync" objects that
provide partial members with updated path secrets, allowing
them to remain in sync without processing the full Commit
history.</t>
          </li>
        </ol>
      </section>
      <section anchor="sync-track">
        <name>Sync Track</name>
        <t>A dedicated sync track carries periodic state updates for
partial members:</t>
        <artwork><![CDATA[
  sync_v1_<HDevID>
]]></artwork>
        <t>Core group members publish sync objects containing the path
secrets needed by partial members to derive current
application keys.</t>
      </section>
    </section>
    <section anchor="key-derivation">
      <name>Key Derivation for Message Encryption</name>
      <t>MLS-derived keys are used with MoQ Secure Objects
<xref target="SecureObjects"/> to encrypt MOCHA message payloads.</t>
      <section anchor="application-secret-to-track-key">
        <name>Application Secret to Track Key</name>
        <t>The MLS application secret for each epoch is used to derive
per-track encryption keys:</t>
        <artwork><![CDATA[
  track_key = HKDF-Expand(application_secret,
                          "mocha_track" || track_name,
                          key_length)

  track_nonce = HKDF-Expand(application_secret,
                            "mocha_nonce" || track_name,
                            nonce_length)
]]></artwork>
      </section>
      <section anchor="key-id-kid-encoding">
        <name>Key ID (KID) Encoding</name>
        <t>The KID carried in MoQ Secure Objects encodes the MLS epoch
and sender leaf index, allowing receivers to select the
correct decryption key:</t>
        <artwork><![CDATA[
  KID = (epoch << 24) | leaf_index
]]></artwork>
        <t>The KID is encoded as a MoQ Varint (64 bits). This yields
40 bits for the epoch (practically unlimited) and 24 bits
for the leaf_index, supporting up to 16,777,215 members in
a single MLS group. Channels exceeding this limit use
Partial MLS (<xref target="partial-mls"/>).</t>
        <t>Receivers use the epoch to identify which application secret
to derive keys from, and the leaf index to identify the
sender's position in the tree.</t>
      </section>
    </section>
    <section anchor="credentials">
      <name>Credentials</name>
      <t>MLS requires each member to present a credential binding
their identity to their signing key. In MOCHA, credentials
are obtained through the identity system defined in
<xref target="MOCHA-IDENTITY"/>.</t>
      <t>The MLS credential contains:</t>
      <ul spacing="normal">
        <li>
          <t>The member's userId (as used in MOCHA message sender fields)</t>
        </li>
        <li>
          <t>The member's signing public key</t>
        </li>
        <li>
          <t>A signature from the Provider's Token Service binding the
userId to the public key</t>
        </li>
      </ul>
      <t>Credential validation follows the trust model established
by the Provider's identity infrastructure. Members MUST
verify credentials against the Provider's public key before
accepting any MLS protocol message.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document makes no requests of IANA.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="MoQTransport">
        <front>
          <title>Media over QUIC Transport</title>
          <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
            <organization>Cisco</organization>
          </author>
          <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
            <organization>Google</organization>
          </author>
          <author fullname="Ian Swett" initials="I." surname="Swett">
            <organization>Google</organization>
          </author>
          <author fullname="Alan Frindell" initials="A." surname="Frindell">
            <organization>Meta</organization>
          </author>
          <date day="12" month="May" year="2026"/>
          <abstract>
            <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-18"/>
      </reference>
      <reference anchor="MOCHA-ARCH">
        <front>
          <title>*** BROKEN REFERENCE ***</title>
          <author>
            <organization/>
          </author>
          <date/>
        </front>
      </reference>
      <reference anchor="MOCHA-IDENTITY">
        <front>
          <title>*** BROKEN REFERENCE ***</title>
          <author>
            <organization/>
          </author>
          <date/>
        </front>
      </reference>
      <reference anchor="MOCHA-CHAT">
        <front>
          <title>*** BROKEN REFERENCE ***</title>
          <author>
            <organization/>
          </author>
          <date/>
        </front>
      </reference>
      <reference anchor="MLS">
        <front>
          <title>The Messaging Layer Security (MLS) Protocol</title>
          <author fullname="R. Barnes" initials="R." surname="Barnes"/>
          <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
          <author fullname="R. Robert" initials="R." surname="Robert"/>
          <author fullname="J. Millican" initials="J." surname="Millican"/>
          <author fullname="E. Omara" initials="E." surname="Omara"/>
          <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
          <date month="July" year="2023"/>
          <abstract>
            <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9420"/>
        <seriesInfo name="DOI" value="10.17487/RFC9420"/>
      </reference>
      <reference anchor="SecureObjects">
        <front>
          <title>End-to-End Secure Objects for Media over QUIC Transport</title>
          <author fullname="Cullen Fluffy Jennings" initials="C. F." surname="Jennings">
            <organization>Cisco</organization>
          </author>
          <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
            <organization>Cisco</organization>
          </author>
          <author fullname="Richard Barnes" initials="R." surname="Barnes">
            <organization>Cisco</organization>
          </author>
          <date day="8" month="February" year="2026"/>
          <abstract>
            <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 to securely share
   a symmetric key with end subscribers, 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.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-jennings-moq-secure-objects-04"/>
      </reference>
      <reference anchor="MLS-PARTIAL">
        <front>
          <title>Partial MLS</title>
          <author fullname="Franziskus Kiefer" initials="F." surname="Kiefer">
            <organization>Cryspen</organization>
          </author>
          <author fullname="Karthikeyan Bhargavan" initials="K." surname="Bhargavan">
            <organization>Cryspen</organization>
          </author>
          <author fullname="Richard Barnes" initials="R." surname="Barnes">
            <organization>Cisco</organization>
          </author>
          <author fullname="Joël" initials="" surname="Joël">
            <organization>AWS Wickr</organization>
          </author>
          <author fullname="Marta Mularczyk" initials="M." surname="Mularczyk">
            <organization>AWS Wickr</organization>
          </author>
          <date day="7" month="May" year="2026"/>
          <abstract>
            <t>   The Messaging Layer Security (MLS) protocol provides efficient
   asynchronous group key establishment for large groups with up to
   thousands of clients.  In MLS, any member can commit a change to the
   group, and consequently, all members must download, validate, and
   maintain the full group state, which can incur a significant
   communication and computational costs, especially when joining a
   group.  This document defines an MLS extension to support "partial
   MLS clients" that don't undertake these costs.  A partial client
   cannot commit changes to the group, and only has partial
   authentication information for the other members of the group, but is
   otherwise able to participate in the group.  In exchange for these
   limitations, a partial MLS client can participate in an MLS group
   with significantly lower requirements in terms of download, memory,
   and processing.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-mls-partial-02"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAHs+TGoAA91c627cRpb+X09RKwNrdaZbthwnzmg9wciSPdbGjj2WPIMB
AjhsslpizCY7LFJyj6zBPsQ+4T7Jnu+cupHdcpwMFliMAUNSd7Eu5/Kda3E2
m6mu7CpzoHdevjp6fqhfvjjV35l1WZ8f6Kd1MeuaGf2gX/N2verKpsa3+mVW
Z+dmaepON5em1S+bP++obD5vzSXNtGzyi2y2rOzsPc+0o/KsM+dNuz7QtiuU
Kpq8zpa0aNFmi272k6lrGmZny+bn2fjh2f37yvbzZWktrd6tV/TYydOzZ6ru
l3PTHqiC5j5QeVNbU9veHuiu7Y2ifXypstZktJ/D1aoqaQv0vNUZneaNyarZ
Wbk0O+qqad+ft02/AgVMUWb6FQ7057cnRzuKdkDfFwdKz3BE/vHqz2fyk6jF
v7w4xY+nD54+xc8hddSlqXvanda3rqG1nGnnr7QTOq/+E0bi82VWVkzNn/9Y
mm6x17Tn+Dhr8wv6+KLrVvbg3j2Mwkflpdnzw+7hg3vztrmy5h49f29Hqazv
LpoWW5nRf60XfVUJE47oN1Pr/3Rc4G9pkqwu/840oxGlzRv+3MimFlW/WKz/
WJblXp6pLXOe9heZ1d8TsbP3/TJrP2dSW8vwP+b4Zi9vlkrVTbuk8ZdMQ2LB
WZvVdtW0HQnB7HhP5AfHZtnp/LcYDAbNDt8cPU+HbhE10CqMPzl++v3Zydnf
fuGZsiDmlt06PEf/z37hGfrP+3pxeqDfPDv6/cMH9+nPU5P3rXk1/8nknb11
BsujZo0Mk1lmrw/fnJ0cvtikBOnOKmu7MquUKutFJKGazWY6m1uiU94pdXZR
Wk262LMi25XJy0VpLGMAiT4JYNBymkROqneJC/rVytTqqFku+9oplv53/byx
HQT4ENLY0UZpy5M9fdLpwizKmia+aK54clYGC/XUOaloZ4opf7c0UGnSUfoi
KwpTsLa2Zkkg44bIvjrT4nTYfkmnKec9zeGgiBRU44Dv7ZQfx1PdheGFj01F
hGjX6tS0l2VuNM1AG6jKv9PjZa0zFuH1YFaiQk3z9hZnY/Vf9fOqtBf3CJZs
TsPMnn5G9CE1PKcDXWB8RYu/Fh7wwrROb2myrlHZZVPiUD/3ZYsps6oKB+8a
vWqb3FirDfbpv7goVzzxudkTJi7LoqiMUnf0Sd21TdHnYIJSAt3MLiPoTT/o
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
wu0V9b/1w632q1EAAA==

-->

</rfc>
