<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.2) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-jennings-moq-e2ee-mls-03" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="MoQ E2EE">End-to-end Security for Media over QUIC</title>
    <seriesInfo name="Internet-Draft" value="draft-jennings-moq-e2ee-mls-03"/>
    <author initials="C." surname="Jennings" fullname="Cullen Jennings">
      <organization>Cisco</organization>
      <address>
        <email>fluffy@cisco.com</email>
      </address>
    </author>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author initials="R. L." surname="Barnes" fullname="Richard L. Barnes">
      <organization>Cisco</organization>
      <address>
        <email>rlb@ipv.sx</email>
      </address>
    </author>
    <date/>
    <area>Applications and Real-Time</area>
    <workgroup>MOQ</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 53?>

<t>The Media over QUIC system allows relays to assist in the delivery of real-time
media.  While these relays are trusted to facilitate media delivery, they are
not trusted to access the media content.  The document describes an end-to-end
security system that prevents relays from accessing media content.  MLS is used
to establish keys that are available only to legitimate participants in a
session, which are then used to protect media data using SFrame.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://suhashere.github.io/moq-e2ee-mls"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-jennings-moq-e2ee-mls/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/suhasHere/moq-e2ee-mls"/>.</t>
    </note>
  </front>
  <middle>
    <?line 62?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Media over QUIC (MOQ) system allows relays to assist in the delivery of
real-time media. While these relays are trusted to facilitate media delivery,
they are not trusted to access the media content.  This distinction is
especially important in the more flexible relay topology that MOQ envisions,
where a client might enlist a local relay to assist in media distribution,
having no prior relationship with this relay.</t>
      <t>The document describes an end-to-end security system that prevents relays from
accessing media content.  MOQ tracks are associated to "security groups" so that
content in the track can only be accessed by clients that are part of the
security group.  Security groups also allow clients to authenticate one
anothers' identities, so that any client can verify that there are no
unauthorized parties in the security group.</t>
      <t>To create these security groups, we rely on two widely deployed security
technologies: MLS for group key exchange and SFrame for lightweight media
encryption <xref target="MLS"/> <xref target="SFrame"/>.  The security group maintains an MLS group that
establishes the identities of group members and sets up shared secrets.  The MLS
messages required to keep MLS state up to date as clients join and leave are
primarily distributed over MOQ.  The only additional infrastructure required is
a coordination service that can be provided either by a decentralized algorithm
or a lightweight HTTPS service.  Media is protected from relays simply by adding
a layer of SFrame encryption, using keys derived from the MLS group.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>This document makes extensive use of terminology from MOQT, MLS, and SFrame
<xref target="MOQT"/> <xref target="MLS"/> <xref target="SFrame"/>.  The few data structures we define use the TLS
presentation syntax, defined in <xref section="3" sectionFormat="of" target="RFC8446"/>, with the <tt>optional</tt>
extension defined in <xref section="2.1.1" sectionFormat="of" target="MLS"/>.</t>
      <t>We introduce the following terms:</t>
      <dl>
        <dt>Security group:</dt>
        <dd>
          <t>A logical grouping of clients that provides cryptographic security services to
MOQ tracks.</t>
        </dd>
        <dt>Coordination service:</dt>
        <dd>
          <t>A logical service that coordinates the operations required to maintain a
security group.</t>
        </dd>
      </dl>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>In the Media over QUIC Transport (MOQT), media streams are arranged in tracks,
each of which carries many individual media objects.  This document adds a
notion of "security groups", each of which is used to protect one or more
MOQT tracks.  (Each track has at most one security group.)</t>
      <section anchor="security-groups">
        <name>Security Groups</name>
        <t>Logically, a security group is a set of clients with the following properties:</t>
        <ul spacing="normal">
          <li>
            <t>Each client can authenticate the identity of every other client.</t>
          </li>
          <li>
            <t>Each client can encrypt media that can be decrypted by every other client.</t>
          </li>
        </ul>
        <t>A security group is represented on a client an MLS group and an SFrame context.
The MLS group stores information about the other clients pariticipating in the
security group, and information to facilitate updating the group's secrets as
clients join and leave.  The SFrame context uses secrets produced by the MLS
group to perform encryption and decryption operations.</t>
        <t>To facilitate the MLS interactions required to maintain the security group, the
group must have access to a Coordination Service (CS).  This function is shown
as a discrete role below, but could be provided either by a centralized service
or by a decentralized algorithm.  For example, MLS requires exactly one Commit
message per epoch of the group; in this system, the CS decides which Commit will
be sent to group members. The structure of the CS is not defined here, except
for one notional design in <xref target="http-cs"/>.</t>
        <t>A security group needs to be configured with three tracks:</t>
        <dl>
          <dt>CommitTrack:</dt>
          <dd>
            <t>A track on which MLS Commit messages will be sent to the group.</t>
          </dd>
          <dt>RequestTrack:</dt>
          <dd>
            <t>A track on which members attempting to join/leave will send requests for
action by other members of the group.</t>
          </dd>
          <dt>WelcomeTrack:</dt>
          <dd>
            <t>A track on which MLS Welcome messages will be sent to new joiners.</t>
          </dd>
        </dl>
        <t>All members of the security group subscribe to the CommitTrack so that they can
keep up to date on the state of the group.  "Committers", members who might make
Commits to add or remove other members subscribe to the RequestTrack in order to
learn what work needs to be done.  New joiners subscribe to the WelcomeTrack
temporarily, so that they can get the Welcome information they need to join the
group, then they unsubscribe.</t>
      </section>
      <section anchor="lifecycle-of-a-security-group">
        <name>Lifecycle of a Security Group</name>
        <t><xref target="fig-overview"/> summarizes the interactions involved in managing a security
group.</t>
        <figure anchor="fig-overview">
          <name>Overview of E2EE Coordination</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="528" width="464" viewBox="0 0 464 528" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 32,48 L 32,368" fill="none" stroke="black"/>
                <path d="M 48,272 L 48,304" fill="none" stroke="black"/>
                <path d="M 64,224 L 64,264" fill="none" stroke="black"/>
                <path d="M 80,272 L 80,304" fill="none" stroke="black"/>
                <path d="M 128,352 L 128,384" fill="none" stroke="black"/>
                <path d="M 128,416 L 128,448" fill="none" stroke="black"/>
                <path d="M 144,296 L 144,344" fill="none" stroke="black"/>
                <path d="M 160,352 L 160,384" fill="none" stroke="black"/>
                <path d="M 160,416 L 160,448" fill="none" stroke="black"/>
                <path d="M 192,480 L 192,512" fill="none" stroke="black"/>
                <path d="M 200,80 L 200,112" fill="none" stroke="black"/>
                <path d="M 208,192 L 208,472" fill="none" stroke="black"/>
                <path d="M 224,480 L 224,512" fill="none" stroke="black"/>
                <path d="M 232,112 L 232,128" fill="none" stroke="black"/>
                <path d="M 232,160 L 232,176" fill="none" stroke="black"/>
                <path d="M 240,480 L 240,512" fill="none" stroke="black"/>
                <path d="M 256,48 L 256,80" fill="none" stroke="black"/>
                <path d="M 256,192 L 256,472" fill="none" stroke="black"/>
                <path d="M 272,480 L 272,512" fill="none" stroke="black"/>
                <path d="M 296,112 L 296,128" fill="none" stroke="black"/>
                <path d="M 296,160 L 296,192" fill="none" stroke="black"/>
                <path d="M 304,352 L 304,384" fill="none" stroke="black"/>
                <path d="M 304,416 L 304,448" fill="none" stroke="black"/>
                <path d="M 320,80 L 320,112" fill="none" stroke="black"/>
                <path d="M 320,296 L 320,344" fill="none" stroke="black"/>
                <path d="M 336,352 L 336,384" fill="none" stroke="black"/>
                <path d="M 336,416 L 336,448" fill="none" stroke="black"/>
                <path d="M 384,272 L 384,304" fill="none" stroke="black"/>
                <path d="M 400,224 L 400,264" fill="none" stroke="black"/>
                <path d="M 416,272 L 416,304" fill="none" stroke="black"/>
                <path d="M 456,96 L 456,288" fill="none" stroke="black"/>
                <path d="M 64,32 L 240,32" fill="none" stroke="black"/>
                <path d="M 200,80 L 320,80" fill="none" stroke="black"/>
                <path d="M 32,96 L 192,96" fill="none" stroke="black"/>
                <path d="M 328,96 L 456,96" fill="none" stroke="black"/>
                <path d="M 200,112 L 320,112" fill="none" stroke="black"/>
                <path d="M 224,176 L 240,176" fill="none" stroke="black"/>
                <path d="M 80,208 L 200,208" fill="none" stroke="black"/>
                <path d="M 216,208 L 248,208" fill="none" stroke="black"/>
                <path d="M 264,208 L 280,208" fill="none" stroke="black"/>
                <path d="M 312,208 L 384,208" fill="none" stroke="black"/>
                <path d="M 48,272 L 80,272" fill="none" stroke="black"/>
                <path d="M 384,272 L 416,272" fill="none" stroke="black"/>
                <path d="M 88,288 L 192,288" fill="none" stroke="black"/>
                <path d="M 272,288 L 376,288" fill="none" stroke="black"/>
                <path d="M 416,288 L 456,288" fill="none" stroke="black"/>
                <path d="M 48,304 L 80,304" fill="none" stroke="black"/>
                <path d="M 384,304 L 416,304" fill="none" stroke="black"/>
                <path d="M 128,352 L 160,352" fill="none" stroke="black"/>
                <path d="M 304,352 L 336,352" fill="none" stroke="black"/>
                <path d="M 32,368 L 128,368" fill="none" stroke="black"/>
                <path d="M 128,384 L 160,384" fill="none" stroke="black"/>
                <path d="M 304,384 L 336,384" fill="none" stroke="black"/>
                <path d="M 128,416 L 160,416" fill="none" stroke="black"/>
                <path d="M 304,416 L 336,416" fill="none" stroke="black"/>
                <path d="M 168,432 L 192,432" fill="none" stroke="black"/>
                <path d="M 272,432 L 296,432" fill="none" stroke="black"/>
                <path d="M 128,448 L 160,448" fill="none" stroke="black"/>
                <path d="M 304,448 L 336,448" fill="none" stroke="black"/>
                <path d="M 192,480 L 224,480" fill="none" stroke="black"/>
                <path d="M 240,480 L 272,480" fill="none" stroke="black"/>
                <path d="M 192,512 L 224,512" fill="none" stroke="black"/>
                <path d="M 240,512 L 272,512" fill="none" stroke="black"/>
                <path d="M 240,32 C 248.83064,32 256,39.16936 256,48" fill="none" stroke="black"/>
                <path d="M 224,176 C 215.16936,176 208,183.16936 208,192" fill="none" stroke="black"/>
                <path d="M 240,176 C 248.83064,176 256,183.16936 256,192" fill="none" stroke="black"/>
                <path d="M 80,208 C 71.16936,208 64,215.16936 64,224" fill="none" stroke="black"/>
                <path d="M 280,208 C 288.83064,208 296,200.83064 296,192" fill="none" stroke="black"/>
                <path d="M 312,208 C 303.16936,208 296,200.83064 296,192" fill="none" stroke="black"/>
                <path d="M 384,208 C 392.83064,208 400,215.16936 400,224" fill="none" stroke="black"/>
                <path d="M 160,288 C 151.16936,288 144,295.16936 144,304" fill="none" stroke="black"/>
                <path d="M 192,288 C 200.83064,288 208,280.83064 208,272" fill="none" stroke="black"/>
                <path d="M 272,288 C 263.16936,288 256,280.83064 256,272" fill="none" stroke="black"/>
                <path d="M 304,288 C 312.83064,288 320,295.16936 320,304" fill="none" stroke="black"/>
                <path d="M 192,432 C 200.83064,432 208,424.83064 208,416" fill="none" stroke="black"/>
                <path d="M 272,432 C 263.16936,432 256,424.83064 256,416" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,264 396,258.4 396,269.6" fill="black" transform="rotate(90,400,264)"/>
                <polygon class="arrowhead" points="384,288 372,282.4 372,293.6" fill="black" transform="rotate(0,376,288)"/>
                <polygon class="arrowhead" points="336,96 324,90.4 324,101.6" fill="black" transform="rotate(180,328,96)"/>
                <polygon class="arrowhead" points="328,344 316,338.4 316,349.6" fill="black" transform="rotate(90,320,344)"/>
                <polygon class="arrowhead" points="304,432 292,426.4 292,437.6" fill="black" transform="rotate(0,296,432)"/>
                <polygon class="arrowhead" points="264,472 252,466.4 252,477.6" fill="black" transform="rotate(90,256,472)"/>
                <polygon class="arrowhead" points="216,472 204,466.4 204,477.6" fill="black" transform="rotate(90,208,472)"/>
                <polygon class="arrowhead" points="200,96 188,90.4 188,101.6" fill="black" transform="rotate(0,192,96)"/>
                <polygon class="arrowhead" points="176,432 164,426.4 164,437.6" fill="black" transform="rotate(180,168,432)"/>
                <polygon class="arrowhead" points="152,344 140,338.4 140,349.6" fill="black" transform="rotate(90,144,344)"/>
                <polygon class="arrowhead" points="96,288 84,282.4 84,293.6" fill="black" transform="rotate(180,88,288)"/>
                <polygon class="arrowhead" points="72,264 60,258.4 60,269.6" fill="black" transform="rotate(90,64,264)"/>
                <polygon class="arrowhead" points="72,32 60,26.4 60,37.6" fill="black" transform="rotate(180,64,32)"/>
                <g class="text">
                  <text x="28" y="36">Joiner</text>
                  <text x="296" y="52">Welcome</text>
                  <text x="88" y="68">JoinRequest</text>
                  <text x="260" y="100">Coordination</text>
                  <text x="388" y="116">Commit</text>
                  <text x="424" y="116">+</text>
                  <text x="392" y="132">Welcome</text>
                  <text x="228" y="148">Commit</text>
                  <text x="296" y="148">Request</text>
                  <text x="64" y="292">A</text>
                  <text x="400" y="292">H</text>
                  <text x="144" y="372">B</text>
                  <text x="320" y="372">G</text>
                  <text x="52" y="388">LeaveRequest</text>
                  <text x="144" y="436">C</text>
                  <text x="320" y="436">F</text>
                  <text x="208" y="500">D</text>
                  <text x="256" y="500">E</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Joiner <----------------------.
   |                           | Welcome
   | JoinRequest               |
   |                    +------+-------+
   +------------------->| Coordination |<---------------+
   |                    +---+-------+--+     Commit +   |
   |                        |       |        Welcome    |
   |                     Commit  Request                |
   |                        |       |                   |
   |                      .-+-.     |                   |
   |                     |     |    |                   |
   |    .----------------|-----|---' '----------.       |
   |   |                 |     |                 |      |
   |   |                 |     |                 |      |
   |   V                 |     |                 V      |
   | +---+               |     |               +---+    |
   | | A |<-------.-----'|     |'-----.------->| H +----+
   | +---+       |       |     |       |       +---+
   |             |       |     |       |
   |             V       |     |       V
   |           +---+     |     |     +---+
   +-----------+ B |     |     |     | G |
LeaveRequest   +---+     |     |     +---+
                         |     |
               +---+     |     |     +---+
               | C |<---'|     |'--->| F |
               +---+     |     |     +---+
                         V     V
                       +---+ +---+
                       | D | | E |
                       +---+ +---+
]]></artwork>
          </artset>
        </figure>
        <t>The life of the security group begins when the first client seeks to join, say
client A.  Like any other joiner, A subscribes to the CommitTrack and the
WelcomeTrack.  A has been informed out of band that they will act as a
committer, so A also commits to the RequestTrack.</t>
        <t>When A sends a request to join the group, the CS informs A that the group does
not yet exist.  A then locally creates a one-member group.</t>
        <artwork><![CDATA[
# A joins
A->Relay: SUBSCRIBE(CommitTrack)
A->Relay: SUBSCRIBE(WelcomeTrack)
A->Relay: SUBSCRIBE(RequestTrack)
A -> CS: JoinRequest
CS -> A: Error(Group does not exist)
A: <Creates group, epoch=0>
A->Relay: UNSUBSCRIBE(WelcomeTrack)
]]></artwork>
        <t>When B joins, their JoinRequest is instead forwarded to the RequestTrack, and
thus to A.  A creates a Welcome message that adds B to the group, and a Commit
message that updates current members of the group.  A sends the Commit and the
Welcome to the CS, who forwards the Welcome to the WelcomeTrack (and thus to B),
and the Commit on the CommitTrack.</t>
        <t>When B receives the Welcome, it can initiate its MLS state.  When A receives
their Commit back, they know that their Commit has been selected by the CS, and
thus that it is safe to update to the next epoch, which includes B.</t>
        <t>At the end of this process, A and B are now both members of the security group.
They can authenticate each other, and they share secret keys that they can use
to encrypt media tracks associated to this security group.</t>
        <artwork><![CDATA[
# B joins
B: SUBSCRIBE(CommitTrack)
B: SUBSCRIBE(WelcomeTrack)
B -> CS: JoinRequest
CS -> RequestTrack: JoinRequest
RequestTrack -> A: JoinRequest
A -> CS: Commit + Welcome
CS -> WelcomeTrack: Welcome
CS -> CommitTrack: Commit

WelcomeTrack -> B: Welcome
B: <Uses Welcome to initialize state, epoch=1>
B->Relay: UNSUBSCRIBE(WelcomeTrack)

CommitTrack -> A: Commit
A: <Processes Commit, epoch=1>
]]></artwork>
        <t>The join process for subsequent members unfolds in the same way: A request
to join results in a Commit and Welcome from an existing member, which are
distributed to the group and the joiner.  The only difference is that now there
are members of the group other than the joiner and the committer.  These passive
members simply apply the Commits as they arrive.</t>
        <artwork><![CDATA[
# C joins
C->Relay: SUBSCRIBE(CommitTrack)
C->Relay: SUBSCRIBE(WelcomeTrack)
C -> CS: JoinRequest
CS -> RequestTrack: JoinRequest
RequestTrack -> A: JoinRequest
A -> CS: Commit + Welcome
CS -> WelcomeTrack: Welcome
CS -> CommitTrack: Commit

WelcomeTrack -> C: Welcome
C: <Uses Welcome to initialize state, epoch=2>
C->Relay: UNSUBSCRIBE(WelcomeTrack)

CommitTrack -> A: Commit
A: <Processes Commit, epoch=2>

CommitTrack -> B: Commit
B: <Processes Commit, epoch=2>
]]></artwork>
        <t>A member leaving works similarly.  The member sends a LeaveRequest to the CS,
who forwards it on the RequestTrack.  Another member generates a Commit that
removes the leaving member; no Welcome is needed in this case.</t>
        <artwork><![CDATA[
# B Leaves
B->Relay: UNSUBSCRIBE(CommitTrack)
B -> CS: LeaveRequest
CS -> RequestTrack: LeaveRequest
RequestTrack -> A: LeaveRequest
A -> CS: Commit
CS -> CommitTrack: Commit

WelcomeTrack -> C: Commit
B: <Processes Commit, epoch=3>

CommitTrack -> A: Commit
A: <Processes Commit, epoch=3>
]]></artwork>
      </section>
    </section>
    <section anchor="group-management">
      <name>Group Management</name>
      <t>A security group is managed using three tracks and a Coordination Service (CS).</t>
      <t>All members of the group subscribe to the CommitTrack.  Each object sent on this
track contains an MLS PrivateMessage object, with content type <tt>commit</tt>.  The
MOQT group ID for this object <bcp14>MUST</bcp14> be the epoch number in which the Commit is
sent.  The MOQT object ID for this object <bcp14>MUST</bcp14> be zero.  When a client receives
an object on the CommitTrack, it applies the enclosed Commit to its local MLS
state in order to advance to the next epoch.</t>
      <t>Members of the group that might make Commits subscribe to the RequestTrack.
Each object sent on this track contains a Request object in the format described
in <xref target="requests"/>.  The MOQT group ID and object ID for objects sent within this
track are set by the CS.</t>
      <t>Clients seeking to join the group subscribe to the WelcomeTrack.  Each object
sent in this track contains an MLS Welcome object.  A client uses information in
the Welcome to detect with one is intended for them, and ignores others.  The
MOQT group ID and object ID for objects sent within this track are set by the
CS.</t>
      <t>The CS must present two interfaces:</t>
      <ul spacing="normal">
        <li>
          <t>A <strong>request interface</strong> that clients can use to ask to join and leave the
group.  If a request is accepted, it is forwarded on the RequestTrack.</t>
        </li>
        <li>
          <t>A <strong>commit interface</strong> that allows a group member to submit an MLS Commit
that changes the state of the group, together with an optional MLS Welcome
message that adds any new members.  If a Commit+Welcome is accepted, the
Commit is forwarded on the CommitTrack and the Welcome (if present) is
forwarded on the WelcomeTrack.</t>
        </li>
      </ul>
      <section anchor="requests">
        <name>Join and Leave Requests</name>
        <t>A client requests to join a group by submitting an MLS KeyPackage object.
This object provides the information that a group member needs to add the new
client to the group.</t>
        <t>A client requests to leave a group by submitting an MLS SelfRemove proposal that
proposes the client's own removal <xref target="I-D.ietf-mls-extensions"/>.  This proposal
<bcp14>MUST</bcp14> be sent within an MLS PrivateMessage structure to allow other clients to
verify its authenticity.</t>
        <artwork><![CDATA[
struct {
    RequestType request_type;
    switch (request_type) {
        case join:
            KeyPackage key_package;
        case leave:
            PrivateMessage remove;
    }
} Request;
]]></artwork>
      </section>
      <section anchor="http-cs">
        <name>HTTPS-based Coordination Service</name>
        <t>This section describes a simple HTTPS-based CS.  The CS has two HTTP endpoints,
a request endpoint and a commit endpoint.  The only state that the CS keeps is
the current epoch, which is initally set to an unknown value.</t>
        <t>The request endpoint accepts POST requests from clients.  The body of the POST
request <bcp14>MUST</bcp14> be a Request object in the format defined in <xref target="requests"/>.
The response to a request indicates the disposition of the request using an HTTP
status code:</t>
        <dl>
          <dt>200 (OK):</dt>
          <dd>
            <t>The group exists, and the request has been accepted and forwarded on the
RequestTrack for the group.</t>
          </dd>
          <dt>201 (Created):</dt>
          <dd>
            <t>The group did not exist prior to this request.  The CS has updated its
internal epoch counter to 0, and the requestor should locally create a
one-member group.</t>
          </dd>
        </dl>
        <t>The CS <bcp14>MUST</bcp14> ensure that only one client receives a 201 response per group.  If
the CS receives initial requests from two clients simultaneously, it <bcp14>MUST</bcp14> return
201 to one of them and 200 to the other, and perform the corresponding actions.</t>
        <t>The commit endpoint accepts POST requests from clients.  The body of the POST
request <bcp14>MUST</bcp14> be a CommitRequest object of the following form:</t>
        <artwork><![CDATA[
struct {
    PrivateMessage commit;
    optional<Welcome> welcome;
} CommitRequest;
]]></artwork>
        <t>The response to a request indicates the disposition of the request using an HTTP
status code:</t>
        <dl>
          <dt>200 (OK):</dt>
          <dd>
            <t>The group exists and the CS's internal epoch counter matches the <tt>epoch</tt> value
in the PrivateMessage <tt>commit</tt>.  The <tt>commit</tt> data has been forwarded on the
CommitTrack and the <tt>welcome</tt> data, if present, has been forwarded on the
WelcomeTrack.  The CS has incremented its internal epoch counter by one.</t>
          </dd>
          <dt>409 (Conflict):</dt>
          <dd>
            <t>The group exists and the CS's internal epoch counter does not match the
<tt>epoch</tt> value in the PrivateMessage <tt>commit</tt>.  No further action has been taken.</t>
          </dd>
        </dl>
      </section>
      <section anchor="optimizations-for-large-groups">
        <name>Optimizations for Large Groups</name>
        <t>MOQT sessions are envisioned to include large numbers of clients.  In such
settings, MLS Commit and Welcome messages can become large, slowing down MLS
operations and potentially causing gaps in media.  Commit messages can be
optimized from linear size to constant size at the expense of putting more
processing in the CS <xref target="I-D.mularczyk-mls-splitcommit"/>.  Welcome messages can
be similarly optimized, but only by reducing the authentication guarantees that
clients receive <xref target="I-D.kiefer-mls-partial"/>.</t>
      </section>
    </section>
    <section anchor="media-protection">
      <name>Media Protection</name>
      <t>In a track with an assiciated security group, each object contains an SFrame
ciphertext, as specified in <xref target="SFrame"/>.  A media sender applies SFrame
encryption immediately before sending the object; the plaintext encapsulated in
the ciphertext is the data that would have been sent in the object if a security
group were not associated.</t>
      <t>SFrame parameters are set using the MLS-based key management framewrok described
in <xref section="5.2" sectionFormat="of" target="RFC9605"/>.  This scheme automatically sets the SFrame KID
and CTR values based on the sender's MLS state, and automatically derives
per-sender keys and nonces.</t>
      <t>The <tt>metadata</tt> input to SFrame computations comprises the unique MOQT identifier
for the object, namely the track namespace, track name, group ID, and object ID.</t>
      <ul empty="true">
        <li>
          <t>TODO: Define a serialization for the metadata.</t>
        </li>
      </ul>
      <section anchor="key-roll-over">
        <name>Key Roll-Over</name>
        <ul empty="true">
          <li>
            <t>TODO: In practice, it has been useful to have coordinated key roll-over, where
clients report that they have received a new key and wait for a quorum before
starting to encrypt with it.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <ul empty="true">
        <li>
          <t>TODO: Document security properties, in particular the significance of forward
secrecy and post-compromise security in this setting.  Note that these
properties do not take effect until the media keys have rolled over.</t>
        </li>
      </ul>
      <ul empty="true">
        <li>
          <t>TODO: Define some sort of identity story.  How might clients authenticate one
another?  Does this interact with the MOQ authorization story?</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="MOQT">
          <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="23" month="June" year="2025"/>
            <abstract>
              <t>   This document defines the core behavior for Media over QUIC Transport
   (MOQT), a media transport protocol designed to operate over QUIC and
   WebTransport, which have similar functionality.  MOQT allows a
   producer of media to publish data and have it consumed via
   subscription by a multiplicity of endpoints.  It supports
   intermediate content distribution networks and is designed for high
   scale and low latency distribution.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-12"/>
        </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="SFrame">
          <front>
            <title>Secure Frame (SFrame): Lightweight Authenticated Encryption for Real-Time Media</title>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="J. Uberti" initials="J." surname="Uberti"/>
            <author fullname="S. G. Murillo" initials="S. G." surname="Murillo"/>
            <author fullname="R. Barnes" initials="R." role="editor" surname="Barnes"/>
            <author fullname="Y. Fablet" initials="Y." surname="Fablet"/>
            <date month="August" year="2024"/>
            <abstract>
              <t>This document describes the Secure Frame (SFrame) end-to-end encryption and authentication mechanism for media frames in a multiparty conference call, in which central media servers (Selective Forwarding Units or SFUs) can access the media metadata needed to make forwarding decisions without having access to the actual media.</t>
              <t>This mechanism differs from the Secure Real-Time Protocol (SRTP) in that it is independent of RTP (thus compatible with non-RTP media transport) and can be applied to whole media frames in order to be more bandwidth efficient.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9605"/>
          <seriesInfo name="DOI" value="10.17487/RFC9605"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9605">
          <front>
            <title>Secure Frame (SFrame): Lightweight Authenticated Encryption for Real-Time Media</title>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="J. Uberti" initials="J." surname="Uberti"/>
            <author fullname="S. G. Murillo" initials="S. G." surname="Murillo"/>
            <author fullname="R. Barnes" initials="R." role="editor" surname="Barnes"/>
            <author fullname="Y. Fablet" initials="Y." surname="Fablet"/>
            <date month="August" year="2024"/>
            <abstract>
              <t>This document describes the Secure Frame (SFrame) end-to-end encryption and authentication mechanism for media frames in a multiparty conference call, in which central media servers (Selective Forwarding Units or SFUs) can access the media metadata needed to make forwarding decisions without having access to the actual media.</t>
              <t>This mechanism differs from the Secure Real-Time Protocol (SRTP) in that it is independent of RTP (thus compatible with non-RTP media transport) and can be applied to whole media frames in order to be more bandwidth efficient.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9605"/>
          <seriesInfo name="DOI" value="10.17487/RFC9605"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-mls-extensions">
          <front>
            <title>The Messaging Layer Security (MLS) Extensions</title>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <date day="19" month="February" year="2025"/>
            <abstract>
              <t>   The Messaging Layer Security (MLS) protocol is an asynchronous group
   authenticated key exchange protocol.  MLS provides a number of
   capabilities to applications, as well as several extension points
   internal to the protocol.  This document provides a consolidated
   application API, guidance for how the protocol's extension points
   should be used, and a few concrete examples of both core protocol
   extensions and uses of the application API.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-06"/>
        </reference>
        <reference anchor="I-D.mularczyk-mls-splitcommit">
          <front>
            <title>MLS Split Commits</title>
            <author fullname="Joël" initials="" surname="Joël">
              <organization>Amazon</organization>
            </author>
            <author fullname="Marta Mularczyk" initials="M." surname="Mularczyk">
              <organization>Amazon</organization>
            </author>
            <date day="21" month="October" year="2024"/>
            <abstract>
              <t>   This document describes an extension to the MLS protocol [RFC940]
   that improves its efficiency in terms of per-member download size.
   This comes at essentially no cost.  In essence, this document defines
   a new message type called split commit which replaces regular MLS
   commits.  Unlike regular commits, a split commit can be "split" by
   the Delivery Service (DS) into much smaller per-member commits, one
   for each receiving member.  The size of a per-member commit is always
   logarithmic in the group size, while the size of a regular MLS commit
   can be linear.  This extension works in settings with a DS that can
   do the splitting which can be demanding with encrypted MLS handshake
   messages.  This is motivated by academic research [KKP22], [HKPPW22],
   [AHKM22].

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mularczyk-mls-splitcommit-00"/>
        </reference>
        <reference anchor="I-D.kiefer-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="28" month="June" year="2025"/>
            <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-kiefer-mls-partial-00"/>
        </reference>
      </references>
    </references>
    <?line 460?>



  </back>
  <!-- ##markdown-source:
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
Jm5xWUm1DtPev/+q7/wv3Th2KwU9KPE376mCmUkldrPF7AvPbeizHfZLtLXy
/bIcLYTYHJ6C97pkB/2ek6hBlsjketz8TPb3EX/rAAq04q30m9t+Jf2QL8dE
3xlkZBMiI9j/eSF/PxouY+wP161cVVxMWfZRfQywPvJe0Q1p0BxPMzGmG3yb
9zdCad03xTnfG5b0aEukZYabHXtLBZVIyRnShPQ9JU8WuG7rRqrXWWHQe1le
FYXRNJR0vrXDZ0OxO5WPHUkm85FPmQ1zOI6DF06KktYmskO/VpRLqjQ4rTNe
f6/Dw0rE6VdH4K6+AE9RsucWD9y0LpZBx9FkFbYKfPlJg5/03yXm3oPlFuB6
Ydhe0VcFJ4xEghCWQxBs6PZqk9uIN4srEwHYN+pgYuqC3sQ82N7Wt46+v03N
ASfR0nP472L6Ke4U02xBufKMVYU4DBi8NY6K5MH2fXjMnDAtVo4tbNGnff27
gZCx8iAMuUqydwXJqWLDRRZE3Ne87miA1m+vXYTyKGfcbzNMlutMbciV+wOZ
klBArDmIAZkhyflYcWZBI7pkpNoi7kXGSnm+jbN9YL3CXiQwQSFBvrqyzSpT
d466Bqxnq8ZAjVWMUVyTm/WY8nO+L5HWK/EkmxhaqiSH0giQBTNIHvuoYn7l
f0cSxN6uyINf0nf3EZg7GxTuio4TQEXHBS/isTfJu/pS/ngE5Tc49VGfYvs/
kq7IkwfHN8V53cC9UA15eIvwlr96KwpLefWxgoxhzBc/SndxlN41gd3kAL31
qJPFYLroB42u2WklJEhk1VaQsbm0Ptr2yhtPWaTAhA+3v4SeqKtZafP2n8dg
rCUxKhnGASL1JxH5stazrmEPwXddxeu3iAwrcfmOwHpz/8JRMrXPswYbhXZX
jjj8Wzfp/A3vriSP6gsNuuRVEny7pP+VdEcF/yo/Q2zFHpYbpe1oaRY3NnJJ
ryqP8b4j7bxwFWT6KFROWqBZPdSUQJD3ZHkmvH2aLVx85jWJnvTKKaoWDIRX
GNRPn0HPUsKwpcpo5fhtGg94823eLUwlzfSLTtxG7jX2Ce++W5WYyLuDUIVZ
k/+2PGef0C1KOFgMEDuFm1DAjYgh4acjmNJ2Ke+3lhDnostDg2tSjyF6n3ZZ
A9CNkeR1bHb1KjxAdm7NzDQMFr+kykruR7zh+8JfSVM1P0t8Rk6+xJIhAqLs
ta/SrPaimiSpkEbR/oFBbhdgTmqtldcb9CBwZmMzf//WYC/0n1Oc3MSUit8m
abK1c57YGn7bNqs53BUrweaEQXnEfy9K6qLldEqVg1G6UiyyROw9aJL5N6KJ
WmmlIwPMjbW+dNe/rws+0myttwwa3b+Z7MtaQLJvMQbe8U/LHZU+Rg+5PG4G
9t4pPf+Zx1wg+BWLLpv6fDXvEh5C/GnyIDynoIfFffjhoJ3nzC81hVl58DHl
rh6o75894QLqwclr0TnQHgxG6HRkctxMCqK+OjzYVZ44OQV5HXsCch2QZlZ1
BXnxlvstEJARmt8Cm4uO/d3YgT3HgBd3+tDYEIF1lYU9k8SS9MmDhRoVvLeQ
ZqRH3r6cIuxLAw7xCWDuB0YxtzIaJlcA4q4+OXpytKOfyOsWom/DdQWRtXBg
uIRoV8RD+jU8gzH1nfR7PKPaGCnlXErMUTF3zsy6km7O/NW/+xDaN7QVtbRQ
iEBFqF3dyzQ/2Oirq7yBl3QKTij5QHvQvS4zHDrjZ2+/dnXTzb20YD/QsQnt
vKEqy6JuW9YJsQsTJs4B4V4JJ/gJLzmiNuifO4xITuQpNWlD4SJ7WoFmOac5
wazeNBMoVDXOl16/u3bMlK/nNn3CGbu7xbiw3UsiLUd36gGA/ZB3y5QaNbMZ
URf21paedqRlmDsFe0C3f6i4zgCO1DX9/0kQ0PGFBvnoVJx5iuhcsrCBQGsP
YXe1fwr7lQbSmJ19NpBYo383Qg+HwmNX/2CIDvlKHpBTj4FS/wP4XJclAEQA
AA==

-->

</rfc>
