<?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.24 (Ruby 3.4.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kiefer-mls-light-02" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <front>
    <title abbrev="Light MLS">Light MLS</title>
    <seriesInfo name="Internet-Draft" value="draft-kiefer-mls-light-02"/>
    <author initials="F." surname="Kiefer" fullname="Franziskus Kiefer">
      <organization>Cryspen</organization>
      <address>
        <email>franziskuskiefer@gmail.com</email>
      </address>
    </author>
    <author initials="K." surname="Bhargavan" fullname="Karthikeyan Bhargavan">
      <organization>Cryspen</organization>
      <address>
        <email>karthik.bhargavan@gmail.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>
    <author initials="J." surname="Alwen" fullname="Joël Alwen">
      <organization>AWS Wickr</organization>
      <address>
        <email>alwenjo@amazon.com</email>
      </address>
    </author>
    <author initials="M." surname="Mularczyk" fullname="Marta Mularczyk">
      <organization>AWS Wickr</organization>
      <address>
        <email>mulmarta@amazon.ch</email>
      </address>
    </author>
    <date year="2025" month="March" day="03"/>
    <area>Security</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 50?>

<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 "light clients" that don't
undertake these costs. A light 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 light client can participate in an MLS group with significantly
lower requirements in terms of download, memory, and processing.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://example.com/LATEST"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-kiefer-mls-light/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        WG Working Group mailing list (<eref target="mailto:WG@example.com"/>),
        which is archived at <eref target="https://example.com/WG"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/USER/REPO"/>.</t>
    </note>
  </front>
  <middle>
    <?line 64?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Messaging Layer Security protocol <xref target="RFC9420"/> enables continuous group
authenticated key exchange among a group of clients. The design of MLS requires
all members to download, validate, and maintain the full MLS tree, including
validating the credentials and signatures of all members. The size of the MLS
tree is linear in the size of the group. Consequently, the MLS design results in
a performance bottleneck for new members seeking to join a large group, and
significant storage and memory requirements once the member has joined.</t>
      <t>This document defines an extension to MLS to allow for "light clients" --
clients that do not download, validate, or maintain the entire ratchet tree for
the group. On the one hand, this "lightness" allows a light client to
participate in the group with much significantly lower communication and
computation complexity. On the other hand, without the full ratchet tree, the
light client cannot create Commit messages to put changes to the group into
effect. Light clients also only have authentication information for the parts
of the tree they download, not the whole group.</t>
      <t>This document does not change the core logic of MLS, including: The structure of
the ratchet tree and its associated algorithms, the key schedule, the secret
tree, and application message protection. The messages sent and received by
normal clients in the course of an MLS session are likewise unchanged. With
proper modifications to the MLS Delivery Service, standard MLS clients can
participate in a group with light clients without any modification.</t>
      <t>The only modifications this document makes are to the local state stored at
light clients, namely the component of MLS that manages, synchronizes, and
authenticates the public group state. We also defines some "annotations" that
need to be appended to group messages so that they can be processed by light
clients. Light clients effectively run normal MLS algorithms, but with
just-in-time delivery of exactly the subset of the public group state needed by
a given algorithm. We achieve lightness due to the fact that aside from initial
tree validation and sending commits, a client only needs log-scale information.</t>
      <t>In summary, Light MLS allows light clients to obtain greater efficiency, at the
cost of lowering the authentication guarantees they receive and losing the
ability to make Commits.  We discuss a few scenarios that motivate this
trade-off in <xref target="use-cases"/>.  The difference in authentication properties, in
particular, is discussed in detail in <xref target="security-considerations"/>.</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?>

<dl>
        <dt>Tree slice:</dt>
        <dd>
          <t>A tree slice is the direct path from a leaf node to the root, together with
the tree hashes on the co-path.</t>
        </dd>
        <dt>Membership proof:</dt>
        <dd>
          <t>A tree slice that proves that a given leaf node is part of a ratchet tree with
a given tree hash.</t>
        </dd>
        <dt>Light client:</dt>
        <dd>
          <t>An MLS client that does not download, validate, and maintain a copy of the
group's ratchet tree. A light client does not store any public data about the
group's ratchet tree, only the HPKE decryption keys associated to nodes on the
client's direct path.</t>
        </dd>
        <dt>Full client:</dt>
        <dd>
          <t>A normal MLS client, in possession of the full MLS ratchet tree for the group.</t>
        </dd>
        <dt>Sender-authenticated message:</dt>
        <dd>
          <t>A signed MLS message such as Welcome or PublicMessage, together with a
membership proof that proves the sender's membership in the group.</t>
        </dd>
        <dt>Annotated Welcome:</dt>
        <dd>
          <t>A Welcome message together with information that a light client needs to
process it.</t>
        </dd>
        <dt>Annotated Commit:</dt>
        <dd>
          <t>A Commit message (as a PublicMessage or PrivateMessage) together with
information that a light client needs to process it.</t>
        </dd>
      </dl>
      <t>As in MLS, message structures are defined using the TLS presentation syntax
<xref target="RFC8446"/>. Unlike most MLS messages, however, these structures are not
encapsulated in a signed or MAC'ed structure. So it may be more convenient for
applications to encode these structures in application-specific encodings.</t>
    </section>
    <section anchor="use-cases">
      <name>Use Cases</name>
      <t>Light MLS is intended to support use cases where MLS groups are very large, from
thousands to millions of participants.  Application-level constraints arising
from these use cases align well with the trade-offs introduced by Light MLS.  It
is usually acceptable (even desirable) that only certain members are able to
send Commit messages.  And in such large groups, clients often do not care about
authenticating all members of the group.</t>
      <t>The following subsections outline two concrete use cases.</t>
      <section anchor="large-meetings-webinars">
        <name>Large Meetings / Webinars</name>
        <t>MLS can be used to establish end-to-end encryption keys in real-time
conferencing scenarios.  In such scenarios, a client joins the MLS group when
they are admitted to a meeting.  With normal MLS, the client is required to
download and validate the entire ratchet tree before being able to derive media
encryption keys.  In meetings with a thousand or more participants, this process
can take enough time that it introduces a noticeable delay in joining the
meeting.  If a client joins as a light client, then they can download a
log-sized AnnotatedWelcome message and immediately obtain the media encryption
keys.</t>
        <t>Such a client will not have authenticated the group when they join the meeting.
However, applications often do not display identity information in such setting
anyway.  In "webinar" settings, it is common attendee identities to be visible
only to panelists and administrators, not to other attendees.  Light MLS allows
MLS to align with this privacy property.  If attendees join as light clients,
they can be provided with membership proofs for attendees whom they are
authorized to see, and not for others.  Even in settings where attendees can all
see each others' identities, user interface constraints usually cause only a
small fraction of the attendee list to be visible at one time, so it is natural
to load the tree dynamically as the client needs access to the authenticated
identities of specific other clients.</t>
        <t>The constraint on clients sending Commits is also natural here.  In such large
gatherings, there are usually administrators who are authorized to see the
identities of all participants and control who is in the group, and conversely,
there are certain actions that are not available to non-admin participants.  So
it makes sense for the administrators to use full clients that are able to make
Commits to implement the actions they are authorized to take, and for more
limited clients to be unable to make commits.</t>
      </section>
      <section anchor="broadcast-sessions">
        <name>Broadcast sessions</name>
        <t>Internet streaming platforms frequently host broadcasts with large numbers of
viewers, but the entities providing these broadcasts might like to ensure that
the streaming platform cannot see the streamed content.  For example, the Media
over QUIC Transport protocol, designed to support streaming use cases, states as
a goal ensuring that "the media content itself remains opaque and private" from
the relays involved in its distribution <xref target="I-D.ietf-moq-transport"/>.</t>
        <t>In such settings, the light client / full client roles align with the viewer /
owner roles, respectively.  Viewers do not care about the identities of other
viewers (at most, they care that the stream comes from an authentic source) and
they aren't authorized to do anything in MLS besides join the group.  Viewers
are also typically in more constrained situations than the source of a stream.
So the reduced resource requirements are well worth the loss of full-group
authentication and the ability to Commit.</t>
      </section>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>A light client does not receive or validate a full copy of the ratchet tree for
a group, but still possesses the group's secrets, including receiving updated
secrets as the group evolves. When MLS messages are sent to a light client,
they need dto be accompanied by annotations that provide the light client with
just enough of information about the ratchet tree to process the message. These
annotations can be computed by any party with knowledge of the group's ratchet
tree, including the committer and sometimes the DS.</t>
      <figure anchor="fig-overview">
        <name>Overview of Light MLS</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="512" width="552" viewBox="0 0 552 512" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 32,64 L 32,496" fill="none" stroke="black"/>
              <path d="M 168,64 L 168,496" fill="none" stroke="black"/>
              <path d="M 344,64 L 344,232" fill="none" stroke="black"/>
              <path d="M 344,248 L 344,280" fill="none" stroke="black"/>
              <path d="M 344,296 L 344,376" fill="none" stroke="black"/>
              <path d="M 344,392 L 344,472" fill="none" stroke="black"/>
              <path d="M 432,64 L 432,280" fill="none" stroke="black"/>
              <path d="M 432,296 L 432,376" fill="none" stroke="black"/>
              <path d="M 432,392 L 432,472" fill="none" stroke="black"/>
              <path d="M 520,64 L 520,496" fill="none" stroke="black"/>
              <path d="M 32,112 L 160,112" fill="none" stroke="black"/>
              <path d="M 168,160 L 336,160" fill="none" stroke="black"/>
              <path d="M 168,240 L 424,240" fill="none" stroke="black"/>
              <path d="M 168,288 L 512,288" fill="none" stroke="black"/>
              <path d="M 32,336 L 160,336" fill="none" stroke="black"/>
              <path d="M 168,384 L 512,384" fill="none" stroke="black"/>
              <path d="M 168,464 L 336,464" fill="none" stroke="black"/>
              <path d="M 168,480 L 512,480" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="520,480 508,474.4 508,485.6" fill="black" transform="rotate(0,512,480)"/>
              <polygon class="arrowhead" points="520,384 508,378.4 508,389.6" fill="black" transform="rotate(0,512,384)"/>
              <polygon class="arrowhead" points="520,288 508,282.4 508,293.6" fill="black" transform="rotate(0,512,288)"/>
              <polygon class="arrowhead" points="432,240 420,234.4 420,245.6" fill="black" transform="rotate(0,424,240)"/>
              <polygon class="arrowhead" points="344,464 332,458.4 332,469.6" fill="black" transform="rotate(0,336,464)"/>
              <polygon class="arrowhead" points="344,160 332,154.4 332,165.6" fill="black" transform="rotate(0,336,160)"/>
              <polygon class="arrowhead" points="168,336 156,330.4 156,341.6" fill="black" transform="rotate(0,160,336)"/>
              <polygon class="arrowhead" points="168,112 156,106.4 156,117.6" fill="black" transform="rotate(0,160,112)"/>
              <g class="text">
                <text x="36" y="36">Full</text>
                <text x="164" y="36">Delivery</text>
                <text x="344" y="36">Light</text>
                <text x="432" y="36">Light</text>
                <text x="516" y="36">Full</text>
                <text x="28" y="52">Client</text>
                <text x="64" y="52">A</text>
                <text x="160" y="52">Service</text>
                <text x="332" y="52">Client</text>
                <text x="368" y="52">B</text>
                <text x="420" y="52">Client</text>
                <text x="456" y="52">C</text>
                <text x="508" y="52">Client</text>
                <text x="544" y="52">D</text>
                <text x="68" y="84">Commit</text>
                <text x="72" y="100">Welcome</text>
                <text x="244" y="132">AnnotatedWelcome</text>
                <text x="184" y="148">=</text>
                <text x="224" y="148">Welcome</text>
                <text x="264" y="148">+</text>
                <text x="300" y="148">Proofs</text>
                <text x="240" y="196">AnnotatedCommit</text>
                <text x="184" y="212">=</text>
                <text x="220" y="212">Commit</text>
                <text x="256" y="212">+</text>
                <text x="292" y="212">Proofs</text>
                <text x="200" y="228">+</text>
                <text x="252" y="228">Resolution</text>
                <text x="316" y="228">Info</text>
                <text x="204" y="276">Commit</text>
                <text x="100" y="324">PrivateMessage</text>
                <text x="236" y="372">PrivateMessage</text>
                <text x="248" y="420">SenderAuthMessage</text>
                <text x="184" y="436">=</text>
                <text x="252" y="436">PrivateMessage</text>
                <text x="200" y="452">+</text>
                <text x="244" y="452">Proof(A)</text>
                <text x="344" y="500">|</text>
                <text x="432" y="500">|</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
  Full          Delivery                Light      Light      Full
Client A        Service               Client B   Client C   Client D
   |                |                     |          |          |
   | Commit         |                     |          |          |
   | Welcome        |                     |          |          |
   +--------------->|                     |          |          |
   |                | AnnotatedWelcome    |          |          |
   |                | = Welcome + Proofs  |          |          |
   |                +-------------------->|          |          |
   |                |                     |          |          |
   |                | AnnotatedCommit     |          |          |
   |                | = Commit + Proofs   |          |          |
   |                |   + Resolution Info |          |          |
   |                +------------------------------->|          |
   |                |                     |          |          |
   |                | Commit              |          |          |
   |                +------------------------------------------>|
   |                |                     |          |          |
   | PrivateMessage |                     |          |          |
   +--------------->|                     |          |          |
   |                |                     |          |          |
   |                | PrivateMessage      |          |          |
   |                +------------------------------------------>|
   |                |                     |          |          |
   |                | SenderAuthMessage   |          |          |
   |                | = PrivateMessage    |          |          |
   |                |   + Proof(A)        |          |          |
   |                +-------------------->|          |          |
   |                +------------------------------------------>|
   |                |                     |          |          |
]]></artwork>
        </artset>
      </figure>
      <t><xref target="fig-overview"/> illustrates the main changes introduced by Light MLS:</t>
      <ol spacing="normal" type="1"><li>
          <t>When a light client is added to the group, they are provided an
AnnotatedWelcome message, which comprises a normal Welcome message plus
membership proofs for the sender and joiner.</t>
        </li>
        <li>
          <t>From each Commit that is generated in the group, an individual
AnnotatedCommit is generated for each light client. An AnntatedCommit
comprises a normal MLS Commit message, together with membership proofs and
the information that the light client needs in order to process the update
path in the Commit.</t>
        </li>
        <li>
          <t>When messages are sent in the group, e.g., carrying application data,
they are extended with a membership proofs so that light clients can
authenticate the sender's membership in the group.</t>
        </li>
      </ol>
      <t>In this example, we have shown the required annotations being added by the DS.
This allows full clients to behave as they would in normal MLS, but requires
that the DS maintain a copy of the group's ratchet tree. It is also possible
for committers to generate the required annotated messages. This document does
not define who generates annotated messages from the base MLS messages, or how
this entity learns which clients are light or full clients.</t>
      <t>Light clients still need to be provided with access to any proposals sent in a
group outside of Commits. Light clients cannot process proposals that modify the
structure of the tree, in particular Add, Update, or Remove proposals. They
can, however, verify that these proposals were included in a given Commit. And
they need to see proposals such as PreSharedKey or GroupContextExtensions so
that they can update their state appropriately.</t>
      <t>Depending on how Light MLS is deployed, a client might need to inform the DS or
other members of its status (light or full), so that the proper annotations can
be generated when it is light. It is harmless for a full client to receive an
AnnotatedCommit; the annotations can simply be ignored.</t>
    </section>
    <section anchor="upgrading-and-downgrading">
      <name>Upgrading and Downgrading</name>
      <t>A light client can upgrade to being a full client at any time by downloading the
full ratchet tree; a full client can downgrade by deleting its local copy of the
ratchet tree.  Before a light client uses a copy of the ratchet tree to upgrade
to being a full client, it <bcp14>MUST</bcp14> verify the integrity of the ratchet tree in the
same way it would when joining as a full client, following the steps in
<xref section="12.4.3.1" sectionFormat="of" target="RFC9420"/>.</t>
    </section>
    <section anchor="membership-proofs-and-partial-trees">
      <name>Membership Proofs and Partial Trees</name>
      <t>Although light clients do not have a copy of the group's ratchet tree, they
still agree on the root tree hash of the ratchet tree, via the MLS key schedule
as usual. This fact, together with the Merkle-tree-like structure of the MLS
tree hash, allows a light client to verify the legitimacy of partial information
about the ratchet tree. In particular, for any leaf in the tree, anyone in
possession of the public data of the ratchet tree can construct a "membership
proof" that proves that a leaf node with specific contents is located at a
specific leaf index in the tree.</t>
      <t>A membership proof for a leaf node comprises:</t>
      <ul spacing="normal">
        <li>
          <t>The number of leaves in the tree.</t>
        </li>
        <li>
          <t>The leaf index of the member's leaf.</t>
        </li>
        <li>
          <t>The values of the nodes from the leaf node to the root of the tree, including
both the leaf node and the root.</t>
        </li>
        <li>
          <t>The tree hash values for the nodes on the copath of the leaf node.</t>
        </li>
      </ul>
      <artwork><![CDATA[
struct {
    opaque hash_value<V>;
} CopathHash;

struct {
  uint32 leaf_index;
  uint32 n_leaves;
  optional<Node> direct_path_nodes<V>;
  CopathHash copath_hashes<V>;
} MembershipProof;
]]></artwork>
      <t>From these values, the root tree hash of the ratchet tree can be recomputed,
following the same recursive algorithm specified in <xref section="7.8" sectionFormat="of" target="RFC9420"/>.
The selection of nodes and subtree hashes provides the precise collection of
inputs required by the algorithm.</t>
      <t>A membership proof is said to be valid relative to a given tree hash if the tree
hash recomputed in this way is equal to the given tree hash.</t>
      <t>Two membership proofs are said to reference the same tree if their <tt>n_leaves</tt>
fields are equal, and they produce identical root tree hashes.</t>
    </section>
    <section anchor="sender-authenticated-messages">
      <name>Sender-Authenticated Messages</name>
      <t>For several types of message, MLS authenticates that a message was created by
the member at a specific leaf node of the group's ratchet tree by signing the
message with the private key corresponding to the <tt>signature_key</tt> in the leaf
node. Full clients verify these messages by looking up the required signature
verification key in their local copy of the ratchet tree.</t>
      <t>Since light clients do not store the group's ratchet tree, they cannot perform
this lookup. A SenderAuthenticatedMessage presents a message along with a
membership proof for the sender of a message, which provides the required leaf
node and a proof of its inclusion in the tree.</t>
      <sourcecode type="tls-syntax"><![CDATA[
struct {
    T message;
    MembershipProof sender_membership_proof;
} SenderAuthenticatedMessage<T>;
]]></sourcecode>
      <t>Before using the <tt>sender_membership_proof</tt> to verify the included message, a client
processing a SenderAuthenticatedMessage <bcp14>MUST</bcp14> verify that the proof is valid
relative to the group's tree hash for the epoch in which the message was sent.
For a PublicMessage or PrivateMessage, this is the tree hash for the epoch
indicated in the FramedContent. For a GroupInfo or Welcome, it is the tree hash
in the object itself.</t>
    </section>
    <section anchor="joining-via-annotated-welcome">
      <name>Joining via Annotated Welcome</name>
      <t>An AnnotatedWelcome message provides a client joining a group with membership
proofs for the sender and the joiner (i.e., the recipient of the message).</t>
      <sourcecode type="tls-syntax"><![CDATA[
struct {
    SenderAuthenticatedMessage<Welcome> welcome;
    MembershipProof joiner_membership_proof;
} AnnotatedWelcome;
]]></sourcecode>
      <t>The fields in the AnnotatedWelcome have the following semantics:</t>
      <dl>
        <dt><tt>welcome</tt>:</dt>
        <dd>
          <t>A Welcome message, together with a membership proof for the sender relative to
the ratchet tree specified in the Welcome.</t>
        </dd>
        <dt><tt>joiner_membership_proof</tt>:</dt>
        <dd>
          <t>A proof of the receipient's membership in the ratchet tree specified in the
Welcome.</t>
        </dd>
      </dl>
      <t>An AnnotatedWelcome can be generated by any party that knows the group's ratchet
tree and the indices of the sender and joiner in the tree.</t>
      <t>A light client processes an AnnotatedWelcome in the following way:</t>
      <ol spacing="normal" type="1"><li>
          <t>Verify that the <tt>sender_membership_proof</tt> and <tt>joiner_membership_proof</tt>
reference the same tree.</t>
        </li>
        <li>
          <t>Join the group using the procedure defined in <xref section="12.4.3.1" sectionFormat="of" target="RFC9420"/>, with the following modifications:  </t>
          <ul spacing="normal">
            <li>
              <t>When verifying the signature on the GroupInfo object, the signature public
key is taken from the LeafNode in the <tt>sender_membership_proof</tt> tree slice.
The <tt>signer</tt> field of the <tt>group_info</tt> object <bcp14>MUST</bcp14> be equal to the
<tt>leaf_index</tt> field of the <tt>sender_membership_proof</tt>.</t>
            </li>
            <li>
              <t>The "Verify the integrity of the ratchet tree" step is replaced with a
check that the <tt>tree_hash</tt> in the GroupInfo matches the root tree hash
produced by the membership proofs.</t>
            </li>
            <li>
              <t>The <tt>my_leaf</tt> value is taken from the the <tt>leaf_index</tt> field of the
<tt>joiner_membership_proof</tt>, instead of found by searching the tree.</t>
            </li>
          </ul>
        </li>
      </ol>
    </section>
    <section anchor="joining-via-external-commit">
      <name>Joining via External Commit</name>
      <t>A light client cannot join via an external Commit, because light clients cannot
generate commits. A client could, however, join as a full client via an
external commit, then transition to being a light client by deleting its copy of
the tree. This would still require the client to download and validate the
tree, but would save the client the effort of maintaining their copy of the
tree.</t>
    </section>
    <section anchor="annotated-commit">
      <name>Annotated Commit</name>
      <t>There are two main challenges for a light client processing a Commit. First,
the light client cannot compute the resolution of the committer's copath, so
they cannot determine which of the HPKECiphertext objects in the UpdatePath they
should decrypt to obtain a path secret. Second, the light client cannot compute
the updated tree hash, since they don't have the full tree. An AnnotatedCommit
provides these pieces of information, along with proof that the sender and
receiver are both still in the group after the Commit.</t>
      <sourcecode type="tls-syntax"><![CDATA[
struct {
    MLSMessage commit;
    optional<MembershipProof> sender_membership_proof;

    opaque tree_hash_after<V>;
    optional<uint32> resolution_index;

    MembershipProof sender_membership_proof_after;
    MembershipProof receiver_membership_proof_after;
} AnnotatedCommit;
]]></sourcecode>
      <t>The fields in the AnnotatedCommit have the following semantics:</t>
      <dl>
        <dt><tt>commit</tt>:</dt>
        <dd>
          <t>An MLSMessage containing PrivateMessage or PublicMessage with <tt>content_type</tt>
            <tt>commit</tt>.</t>
        </dd>
        <dt><tt>sender_membership_proof</tt>:</dt>
        <dd>
          <t>A membership proof for the sender of the Commit relative to the tree for the
epoch in which the Commit is sent. This field <bcp14>MUST</bcp14> be present if the
<tt>sender_type</tt> for the Commit is <tt>member</tt>, and otherwise <bcp14>MUST</bcp14> be absent.</t>
        </dd>
        <dt><tt>tree_hash_after</tt>:</dt>
        <dd>
          <t>The tree hash of the group's ratchet tree after the Commit has been applied.</t>
        </dd>
        <dt><tt>resolution_index</tt>:</dt>
        <dd>
          <t>The recipient can compute which entry in the UpdatePath in the Commit it
should use based on the sender index in the Commit. This index specifies which
HPKECiphertext in the UpdatePathNode to use. This field <bcp14>MUST</bcp14> be included if and
only if the Commit has a <tt>path</tt> field populated.</t>
        </dd>
        <dt><tt>sender_membership_proof_after</tt>:</dt>
        <dd>
          <t>A membership proof for the sender of the Commit relative to the tree after the
Commit has been applied.</t>
        </dd>
        <dt><tt>receiver_membership_proof_after</tt>:</dt>
        <dd>
          <t>A membership proof for the receiver of the Commit relative to the tree after the
Commit has been applied.</t>
        </dd>
      </dl>
      <t>An AnnotatedCommit can be generated by any party that knows the group's ratchet
tree (both before and after the Commit) and the indices of the sender and joiner
in the tree. It is safe for the recipient to accept the <tt>tree_hash</tt> supplied by
an unauthenticated party because the tree hash is authenticated by the
<tt>confirmation_tag</tt> in the Commit.</t>
      <t>A light client processes an AnnotatedCommit in the following way:</t>
      <ol spacing="normal" type="1"><li>
          <t>Verify that the <tt>sender_membership_proof</tt> in the <tt>commit</tt> field, if present,
is valid relative to the group's current tree hash.</t>
        </li>
        <li>
          <t>Verify that the <tt>sender_membership_proof_after</tt> and
<tt>receiver_membership_proof_after</tt> reference the same tree, and that they are
valid relative to <tt>tree_hash_after</tt>.</t>
        </li>
        <li>
          <t>Process the Commit using the procedure defined in <xref section="12.4.2" sectionFormat="of" target="RFC9420"/>, with the following modifications:</t>
        </li>
      </ol>
      <ul spacing="normal">
        <li>
          <t>When validating a FramedContent with <tt>sender_type</tt> set to <tt>member</tt>, the
<tt>sender_membership_proof</tt> field <bcp14>MUST</bcp14> be present, and the signature public
key is taken from the LeafNode in the <tt>sender_membership_proof</tt> tree slice.
The <tt>leaf_index</tt> field of the <tt>Sender</tt> object <bcp14>MUST</bcp14> be equal to the
<tt>leaf_index</tt> field of the <tt>sender_membership_proof</tt>.  </t>
          <ul spacing="normal">
            <li>
              <t>If the <tt>sender_type</tt> is set to <tt>new_member_commit</tt> (the only other valid
value), then the signature public key is looked up in the included Add
proposal, as normal. In this case, there is no further validation of the
<tt>leaf_index</tt> field of of the <tt>sender_membership_proof</tt>.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>The proposal list validation step is omitted, because a light client doesn't
have sufficient information to check all of the validation rules.</t>
        </li>
        <li>
          <t>When applying proposals, only the proposals that do not modify the tree are
applied, in particular, PreSharedKey and GroupContextExtensions proposals.</t>
        </li>
        <li>
          <t>Likewise, the creation of the new ratchet tree is omitted.</t>
        </li>
        <li>
          <t>In processing the <tt>path</tt> value, if present, replace the path node decryption
steps with the following steps:  </t>
          <ul spacing="normal">
            <li>
              <t>Use the <tt>leaf_index</tt> field of the <tt>sender_membership_proof</tt> to identify
the lowest common ancestor between the committer. This is the node where
the new path_secret will be inserted into the tree.</t>
            </li>
            <li>
              <t>Determine the index <tt>update_path_index</tt> of the lowest common ancestor
among the non-blank nodes in the committer's direct path, as provided in
the <tt>sender_membership_proof_after</tt> field.</t>
            </li>
            <li>
              <t>From the entry at index <tt>update_path_index</tt> of the <tt>nodes</tt> vector in the
UpdatePath, select the HPKECiphertext at index <tt>resolution_index</tt> from the
<tt>encrypted_path_secret</tt>.</t>
            </li>
            <li>
              <t>Identify the next non-blank node in the recipient's direct path under the
lowest common ancestor, using the direct path provided in the
<tt>recipient_membership_proof_after</tt> field. Retrieve the private HPKE
decryption key for this node.</t>
            </li>
            <li>
              <t>Decrypt the encrypted path secret as normal, using the tree hash in the
<tt>tree_hash_after</tt> field in the provisional GroupContext.</t>
            </li>
            <li>
              <t>Derive the remaining path secrets corresponding to the non-blank nodes in
the recipient's new direct path, as provided in the
<tt>recipient_membership_proof_after</tt> field.</t>
            </li>
            <li>
              <t>Define the <tt>commit_secret</tt> to be <tt>path_secret[n+1]</tt>, as normal.</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="application-messages">
      <name>Application Messages</name>
      <t>MLS clients can exchange messages by sending application data within the
PrivateMessage framing. In a group where light clients are present, these
messages should be further encapsulated in a SenderAuthenticatedMessage, so that
light clients have the membership proof necessary to verify the sender's
membership, the public key necessary to verify the message signature, and the
credential necessary to verify the sender's identity.</t>
      <t>As noted above, this can be accomplished either by the sender creating a
SenderAuthenticatedMessage, or by the DS adding the relevant membership proof
while the message is in transit.</t>
      <t>Note that encapsulating a message as a SenderAuthenticatedMessage leaks
information about the sender to the DS, including the sender's index in the tree
and the sender's LeafNode.  See <xref target="metadata-privacy"/> for more discussion of
metadata privacy.</t>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <t>The major operational challenge in deploying Light MLS is ensuring that light
clients receive the proper annotations to Welcome and Commit messages. As
discussed in <xref target="protocol-overview"/>, this is up to the application. Since full
clients don't need the annotations, applications will be more robust if they
send annotations in a way that they can be cleanly ignored by full clients.</t>
      <t>Light MLS substantially reduces the amount of data required to join an MLS
group, since it replaces the linear-scale ratchet tree with two log-scale
membership proofs. Light MLS does not address the potentially linear scaling of
Commit messages; in fact, it makes Commits slightly bigger. There are other
approaches to reducing Commit sizes, e.g., the SplitCommit approach in
<xref target="I-D.mularczyk-mls-splitmls"/>.  These approaches can be cleanly integrated
with Light MLS via the AnnotatedCommit structure.  <xref target="download-cost"/> summarizes
the scaling of the amount of data that a client needs to download in order to
perform various MLS operations.  Sending a Commit requires linear-scale work in
any case.</t>
      <table anchor="download-cost">
        <name>Download scaling under protocol variations</name>
        <thead>
          <tr>
            <th align="left">Operation</th>
            <th align="center">RFC MLS</th>
            <th align="center">Light MLS</th>
            <th align="center">Split Commits</th>
            <th align="center">Light + Split</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Join</td>
            <td align="center">O(N)</td>
            <td align="center">O(log N)</td>
            <td align="center">O(N)</td>
            <td align="center">O(log N)</td>
          </tr>
          <tr>
            <td align="left">Process Commit</td>
            <td align="center">O(N)</td>
            <td align="center">O(N)</td>
            <td align="center">O(log N)</td>
            <td align="center">O(log N)</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The MLS protocol in <xref target="RFC9420"/> has a number of security analyses attached. To
describe the security of Light MLS and how it relates to the security of full
MLS we summarize the following main high-level guarantees of MLS as follows:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Membership Agreement</strong>: If a client B has a local group state for group G in
epoch N, and it receives (and accepts) an application message from a sender A
for group G in epoch N, then A must be a member of G in epoch N at B, and if A
is honest, then A and B agree on the full membership of the group G in
epoch N.</t>
        </li>
        <li>
          <t><strong>Member Identity Authentication</strong>: If a client B has a local group state for
group G in epoch N, and B believes that A is a member of G in epoch N, and
that A is linked to a user identity U, then either the signature key of U’s
credential is compromised, or A belongs to U.</t>
        </li>
        <li>
          <t><strong>Group Key Secrecy</strong>: If B has a local group state for group G in epoch N
with group key K (init secret), then K can only be known to members of G in
epoch N. That is, if the attacker knows K, then one of the signature or
decryption keys corresponding to one of the leaves of the tree stored at B for
G in epoch N must be compromised. To obtain these properties, each member in
MLS verifies a number of signatures and MACs, and seeks to preserve the
TreeKEM Tree Invariants:</t>
        </li>
        <li>
          <t><strong>Public Key Tree Invariant</strong>: At each node of the tree at a member B, the
public key, if set, was set by one of the members currently underneath that
node</t>
        </li>
        <li>
          <t><strong>Path Secret Invariant</strong>: At each node, the path secret stored at a member B,
if set, was created by one of the members currently underneath that node</t>
        </li>
      </ul>
      <t>As a corollary of Group Key Secrecy, we also obtain authentication and
confidentiality guarantees for application messages sent and received within a
group.</t>
      <t>To verify the security guarantees provided to light clients, a new security
analysis was needed. We have analyzed the security of the protocol using two
verification tools ProVerif and F*. The security analysis, and design of the
security mechanisms, are inspired by work from Alwen et al.
<xref target="AHKM22"/>.</t>
      <t>Light MLS preserves the invariants above and thereby all the security goals of
MLS continue to hold at full members. However, a light member may not know the
identities of all other members in the group, and it may only discover these
identities on-demand. Consequently, the Member Identity Authentication
guarantee is weaker on light clients. Furthermore, since light members do not
store the MLS tree, membership agreement only holds for the hash of the MLS
tree:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Light Membership Agreement</strong>: If a light client B has a local group state
for group G in epoch N, and it receives (and accepts) an application message
from a sender A for group G in epoch N, then A must be a member of G in
epoch N at B, and if A is honest, then A and B agree on the GroupContext
of the group G in epoch N.</t>
        </li>
        <li>
          <t><strong>Light Member Identity Authentication</strong>: If a light client B has a local
group state for group G in epoch N, and B has verified A’s membership proof in
G, and A is linked to a user identity U, then either the signature key of U’s
credential is compromised, or A belongs to U.</t>
        </li>
        <li>
          <t><strong>Light Group Key Secrecy</strong>: If a light client B has a local group state for
group G in epoch N with group key K (init secret), and if the tree hash at B
corresponds to a full tree, then K can only be known to members at the leaves
of this tree. That is, if the attacker knows K, then the signature or
decryption keys at one of the leaves must have been compromised.</t>
        </li>
      </ul>
      <t>Note that the Light Membership Agreement property holds irrespective of whether
B has verified a membership proof from A.  The membership proofs in this
protocol are thus more about providing precise source authentication within the
group, rather than simply proving membership in the group.  Simply knowing the
group's symmetric secrets suffices for the latter.</t>
      <t>Another technical caveat is that since light members do not have the full tree,
they cannot validate the uniqueness of all HPKE and signature keys in the tree,
as required by RFC MLS. The exact security implications of removing this
uniqueness check is not clear but is not expected to be significant.  In a group
where full clients are honest, there is no practical difference, since a full
client will verify that all of the required uniqness properties hold before
issuing a Commit.  The main risk is that a malicious full client could cause a
light client to accept a tree hash representing a tree with duplicate keys.</t>
      <section anchor="metadata-privacy">
        <name>Metadata Privacy</name>
        <t>The protocol described in this document assumes that the DS is trusted to know
information about the group's ratchet tree.  The scenario described in
<xref target="protocol-overview"/> assumes that the DS is maintaining a view of the ratchet
tree and distributing appropriate portions of it to clients.  In fact, if the DS
is to generate membership proofs to accompany PrivateMessage messages, then it
will need to know the index of the sender in the tree, information that is
normally encrypted as part of the SenderData.</t>
        <t>It is possible to operate this protocol in a more restrictive mode, where
Commits are sent as PrivateMessage objects and the committer generates the
required annotations for any light clients in the group.  However, because there
is no confidentiality protection for the annotations, they will leak information
to the DS about the ratchet tree.</t>
        <t>Fixing this leakage would require changes to logic at the committer and light
clients.  The annotations attached to a Welcome message could be sent as
GroupInfo extensions; effectively a partial version of the <tt>ratchet_tree</tt>
extension.  The annotations attached to a Commit could be moved inside the
PrivateMessage content, and the receiver signature validation logic updated to
use the public key in the attached membership proof to validate the message
signature.</t>
        <t>Thus, while a more metadata-private mode could be added to this protocol, it has
been omitted for now in the interest of avoiding changes to full endpoints.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document makes no request of IANA.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9420">
          <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="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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-moq-transport">
          <front>
            <title>Media over QUIC Transport</title>
            <author fullname="Luke Curley" initials="L." surname="Curley">
              <organization>Discord</organization>
            </author>
            <author fullname="Kirill Pugin" initials="K." surname="Pugin">
              <organization>Meta</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <date day="1" month="March" year="2025"/>
            <abstract>
              <t>   This document defines the core behavior for Media over QUIC Transport
   (MOQT), a media transport protocol designed to operate over QUIC and
   WebTransport, which have similar functionality.  MOQT allows a
   producer of media to publish data and have it consumed via
   subscription by a multiplicity of endpoints.  It supports
   intermediate content distribution networks and is designed for high
   scale and low latency distribution.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-09"/>
        </reference>
        <reference anchor="I-D.mularczyk-mls-splitmls">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="AHKM22">
          <front>
            <title>Server-Aided Continuous Group Key Agreement</title>
            <author fullname="Joël Alwen" initials="J." surname="Alwen">
              <organization>AWS-Wickr, New York, NY, USA</organization>
            </author>
            <author fullname="Dominik Hartmann" initials="D." surname="Hartmann">
              <organization>Ruhr-University Bochum, Bochum, Germany</organization>
            </author>
            <author fullname="Eike Kiltz" initials="E." surname="Kiltz">
              <organization>Ruhr-University Bochum, Bochum, Germany</organization>
            </author>
            <author fullname="Marta Mularczyk" initials="M." surname="Mularczyk">
              <organization>AWS-Wickr, New York, NY, USA</organization>
            </author>
            <date month="November" year="2022"/>
          </front>
          <seriesInfo name="Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security" value="pp. 69-82"/>
          <seriesInfo name="DOI" value="10.1145/3548606.3560632"/>
          <refcontent>ACM</refcontent>
        </reference>
      </references>
    </references>
    <?line 711?>

<section anchor="known-issues">
      <name>Known Issues</name>
      <ul spacing="normal">
        <li>
          <t>To realize the completely optimized performance profile discussed on
<xref target="operational-considerations"/>, we should define a version of AnnotatedCommit
that sends a SplitCommit instead of a normal Commit.</t>
        </li>
        <li>
          <t>There is no signaling within the group of whether any members are light
clients, and if so which ones. This was omitted because it didn't seem
clearly necessary, but it could be useful. For example, if a client could
include a LeafNode extension that declares that it is a light client, then a
committer could use this signal to proactively generate AnnotatedCommits for
the members. An approach like this might be necessary if we wanted to enable
cases where annotations were confidential to the group.</t>
        </li>
        <li>
          <t>There are no WireFormat values registered for the new messages defined here
that are likely to be sent on the wire: AnnotatedCommit,
AnnotatedWelcome, or SenderAuthenticatedMessage&lt;PrivateMessage&gt;. It's not
clear that these WireFormat values would be needed or useful, though, since
the annotations added in these messages are effectively outside the bounds of
MLS. They're more like how the delivery of the ratchet tree is unspecified in
RFC MLS.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
H0Egvnz4EoyzeJ8AvPkfcpQYPKWIAAA=

-->

</rfc>
