<?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.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mls-partial-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.0 -->
  <front>
    <title abbrev="Partial MLS">Partial MLS</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mls-partial-00"/>
    <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="September" day="02"/>
    <area>Security</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 47?>

<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>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-mls-partial/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        MLS WG Working Group mailing list (<eref target="mailto:mls@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/mls/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/mls/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/mlswg/mls-partial"/>.</t>
    </note>
  </front>
  <middle>
    <?line 61?>

<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 "partial clients" --
clients that do not download, validate, or maintain the entire ratchet tree for
the group. On the one hand, this property allows a partial client to
participate in the group with much significantly lower communication and
computation complexity. On the other hand, without the full ratchet tree, the
partial client cannot create Commit messages to put changes to the group into
effect. Partial 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 partial clients without any modification.</t>
      <t>The only modifications this document makes are to the local state stored at
partial 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 partial
clients. Partial 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 this property due to the fact that aside from initial
tree validation and sending commits, a client only needs log-scale information.</t>
      <t>In summary, Partial MLS allows partial 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>Partial client:</dt>
        <dd>
          <t>An MLS client that does not download, validate, and maintain a copy of the
group's ratchet tree. A partial 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 partial 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 partial 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>Partial 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 Partial 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 partial 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 for attendee identities to be visible
only to panelists and administrators, not to other attendees.  Partial MLS allows
MLS to align with this privacy property.  If attendees join as partial 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 partial 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 partial 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 partial client,
they need to be accompanied by annotations that provide the partial 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 Partial 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="20" y="36">Full</text>
                <text x="164" y="36">Delivery</text>
                <text x="336" y="36">Partial</text>
                <text x="424" y="36">Partial</text>
                <text x="500" 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              Partial    Partial    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 Partial MLS:</t>
      <ol spacing="normal" type="1"><li>
          <t>When a partial 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 partial client. An AnntatedCommit
comprises a normal MLS Commit message, together with membership proofs and
the information that the partial 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 partial 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 partial or full clients.</t>
      <t>Partial clients still need to be provided with access to any proposals sent in a
group outside of Commits. Partial 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 Partial MLS is deployed, a client might need to inform the DS or
other members of its status (partial or full), so that the proper annotations can
be generated when it is partial. 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 partial 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 partial 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 partial 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 partial 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 partial 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 partial 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 partial client cannot join via an external Commit, because partial clients cannot
generate commits. A client could, however, join as a full client via an
external commit, then transition to being a partial 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 partial client processing a Commit. First,
the partial 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 partial 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 partial 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 partial 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 partial clients are present, these
messages should be further encapsulated in a SenderAuthenticatedMessage, so that
partial 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 Partial MLS is ensuring that partial
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>Partial 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. Partial MLS does not address the potentially linear scaling of
Commit messages; in fact, it makes Commits spartially 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 Partial 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">Partial MLS</th>
            <th align="center">Split Commits</th>
            <th align="center">Partial + 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 Partial 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 partial 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>Partial MLS preserves the invariants above and thereby all the security goals of
MLS continue to hold at full members. However, a partial 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 partial clients. Furthermore, since partial 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>Partial Membership Agreement</strong>: If a partial 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>Partial Member Identity Authentication</strong>: If a partial 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>Partial Group Key Secrecy</strong>: If a partial 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 Partial 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 partial 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
partial 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 partial 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 partial
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="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="7" month="July" 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-13"/>
        </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 708?>

<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 partial
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 partial 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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

-->

</rfc>
