<?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.6 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kiefer-mls-light-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title abbrev="Light MLS">Light Clients for MLS</title>
    <seriesInfo name="Internet-Draft" value="draft-kiefer-mls-light-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="2024" month="March" day="04"/>
    <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 cost, especially when joining a group.</t>
      <t>This document defines Light MLS, an extension that allows for "light clients".
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 66?>

<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 implicitly requires all members to download
and maintain the full MLS tree, validate the credentials and signatures of
all members, and process full commit messages. The size of the MLS tree
is linear in the size of the group, and each commit message can also grow
to be linear in the group size. Consequently, the MLS design results in high latency and performance bottlenecks at new members seeking to join a large group, or processing commits in large groups.</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 (logarithmic in the group size in the worst case).  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>We note that this document does not change the structure of the MLS
tree, or the contents of messages sent in the course of an MLS
session.  It only modifies the local state stored at light clients,
and changes how each light client downloads and checks group messages.
The only modifications required for standard clients are related to
the negotiation of an MLS extension, and additional data they need to
send with each commit.
Furthermore, we note that the changes in this
document only affects the component of MLS that manages, synchronizes,
and authenticates the public group state.
It does not affect the TreeKEM
key establishment or the application message sub-protocols.</t>
      <t>The rest of the documemt defines the behavior of light clients, and the required
modifications to standard MLS clients and the MLS infrastructure.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</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?>

</section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>This document introduces the following new concepts</t>
      <ul spacing="normal">
        <li>
          <t>Tree Slice: A tree slice is the direct path from a leaf node to the root, together with the tree hashes on the co-path.</t>
        </li>
        <li>
          <t>Proof of Membership: A proof of membership for leaf A is a tree slice that proves that leaf A is in the tree with the tree hash in the root of the tree slice.</t>
        </li>
        <li>
          <t>Light Commit: A light commit is a commit that the server stripped down to
hold only the encrypted path secret for the receiver.</t>
        </li>
        <li>
          <t>Light client: A light client is a client that does not know the
MLS tree but only its own tree slice.</t>
        </li>
        <li>
          <t>Full client: A full client is conversely a client that is running the full
MLS protocol from <xref target="RFC9420"/>.</t>
        </li>
      </ul>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <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="320" width="488" viewBox="0 0 488 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 24,64 L 24,304" fill="none" stroke="black"/>
              <path d="M 160,64 L 160,304" fill="none" stroke="black"/>
              <path d="M 280,64 L 280,184" fill="none" stroke="black"/>
              <path d="M 280,200 L 280,232" fill="none" stroke="black"/>
              <path d="M 280,248 L 280,304" fill="none" stroke="black"/>
              <path d="M 368,64 L 368,232" fill="none" stroke="black"/>
              <path d="M 368,248 L 368,304" fill="none" stroke="black"/>
              <path d="M 456,64 L 456,304" fill="none" stroke="black"/>
              <path d="M 24,128 L 152,128" fill="none" stroke="black"/>
              <path d="M 160,144 L 272,144" fill="none" stroke="black"/>
              <path d="M 160,192 L 360,192" fill="none" stroke="black"/>
              <path d="M 160,240 L 448,240" fill="none" stroke="black"/>
              <path d="M 160,288 L 272,288" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="456,240 444,234.4 444,245.6" fill="black" transform="rotate(0,448,240)"/>
              <polygon class="arrowhead" points="368,192 356,186.4 356,197.6" fill="black" transform="rotate(0,360,192)"/>
              <polygon class="arrowhead" points="280,288 268,282.4 268,293.6" fill="black" transform="rotate(0,272,288)"/>
              <polygon class="arrowhead" points="280,144 268,138.4 268,149.6" fill="black" transform="rotate(0,272,144)"/>
              <polygon class="arrowhead" points="160,128 148,122.4 148,133.6" fill="black" transform="rotate(0,152,128)"/>
              <g class="text">
                <text x="28" y="36">Full</text>
                <text x="164" y="36">Delivery</text>
                <text x="280" y="36">Light</text>
                <text x="368" y="36">Light</text>
                <text x="456" y="36">Light</text>
                <text x="28" y="52">Client</text>
                <text x="160" y="52">Service</text>
                <text x="268" y="52">Client</text>
                <text x="304" y="52">A</text>
                <text x="356" y="52">Client</text>
                <text x="392" y="52">B</text>
                <text x="444" y="52">Client</text>
                <text x="480" y="52">C</text>
                <text x="60" y="84">Commit</text>
                <text x="72" y="100">GroupInfo</text>
                <text x="64" y="116">Welcome</text>
                <text x="200" y="132">Welcome</text>
                <text x="220" y="180">LightCommitB</text>
                <text x="220" y="228">LightCommitC</text>
                <text x="212" y="276">TreeSliceB</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
 Full           Delivery        Light      Light      Light
Client          Service       Client A   Client B   Client C
  |                |              |          |          |
  | Commit         |              |          |          |
  | GroupInfo      |              |          |          |
  | Welcome        |              |          |          |
  +--------------->| Welcome      |          |          |
  |                +------------->|          |          |
  |                |              |          |          |
  |                | LightCommitB |          |          |
  |                +------------------------>|          |
  |                |              |          |          |
  |                | LightCommitC |          |          |
  |                +----------------------------------->|
  |                |              |          |          |
  |                | TreeSliceB   |          |          |
  |                +------------->|          |          |
  |                |              |          |          |
]]></artwork>
        </artset>
      </figure>
      <t><xref target="fig-overview"/> illustrates the three main changes introduced by Light MLS:</t>
      <ol spacing="normal" type="1"><li>
          <t>Light clients are always added to the group with a "light" Welcome message,
i.e., one that does not include the <tt>ratchet_tree</tt> extension.</t>
        </li>
        <li>
          <t>The MLS Delivery Service splits each Commit message into a set of LightCommit
messages, one per light client.</t>
        </li>
        <li>
          <t>Light clients can download "slices" of the tree to authenticate individual
other users (here, A authenticates B).</t>
        </li>
      </ol>
      <t>MLS groups that support light clients must use the <tt>light_clients</tt> extension
(<xref target="light-mls-extension"/>) in the required capabilities.
When this extension is present in the group context, all messages, except for
application messages, <bcp14>MUST</bcp14> use public messages.</t>
      <t>The changes are primarily on light clients.  When joining a group as a light
client, the client downloads the proof of memberships for the sender (committer)
and the receiver (the light client).  The sender's proof of membership can be
discarded after being checked such that only the client's direct path and hashes
on the co-path are stored.</t>
      <t>Light clients do not process proposals that modify the structure of the tree, in
particular Add, Update, or Remove proposals.</t>
      <t>When processing a commit, the client retrieves</t>
      <ul spacing="normal">
        <li>
          <t>the light commit that contains only the path secret encrypted for the client</t>
        </li>
        <li>
          <t>the sender's proof of membership</t>
        </li>
        <li>
          <t>the signed group info</t>
        </li>
      </ul>
      <t>The client <bcp14>MUST NOT</bcp14> check the signature and membership tag on the framed content,
but <bcp14>MUST</bcp14> check the sender's proof of membership, the signed group info, and the
confirmation tag.</t>
      <t>In groups with <tt>light_clients</tt> support, committers <bcp14>MUST</bcp14> send a signed group
info with every commit.</t>
      <t>The server <bcp14>MUST</bcp14> track the public group state together with the signed group info,
and provide endpoints for clients to retrieve light commits and light welcomes.
Further, it <bcp14>SHOULD</bcp14> provide an API to retrieve proof of memberships for arbitrary
leaves, and an API to retrieve the full tree.</t>
    </section>
    <section anchor="open-questions">
      <name>Open Questions</name>
      <t><strong>Proposals:</strong> In this document, we have assumed that light clients don't need
to see or validate proposals.  This is clearly true for proposals that just
modify the tree, e.g., Add/Update/Remove, but less clear for proposals such as
PreSharedKey and GroupContextExtensions, and even less clear for custom
proposals.  We may want to define a way that an application could enable light
clients to verify some proposals.  A light client can verify the signature on a
proposal given a tree slice for the signer, but more mechanism might be needed
to allow a light client to verify that a proposal was actually included in a
Commit.</t>
      <t><strong>Slimming Down Further:</strong> We have assumed that LeafNode and GroupInfo messages
are small enough that it's acceptable for light clients to have to download
them.  However, these messages themselves can be large, e.g., due to large
extensions.  It may be desireable to define lighter variants of these structs,
for example:</t>
      <ul spacing="normal">
        <li>
          <t>Defining a variant of GroupInfo that is intended for members of the group, who
do not need to receive a copy of the GroupContext extensions.</t>
        </li>
        <li>
          <t>Updating the tree hash algorithm for leaf nodes so that a light client could
receive and verify a subset of a leaf node (e.g. only the signature key and
credential)</t>
        </li>
      </ul>
    </section>
    <section anchor="tree-slices">
      <name>Tree Slices</name>
      <t>A light client does not download or store the whole MLS ratchet tree, but still
needs to download parts of the tree to verify the membership and identity of
specific members.  For example, the client needs to verify that it is in fact a
member of the group, and that the sender of a Welcome adding it to the group is
a member.</t>
      <t>A tree slice provides one or more leaf nodes from the tree, together with the
nodes and node hashes that are required to verify that those leaves are included
in a tree with a given tree hash.  A tree slice can thus function as a proof of
membership for the members at the included leaf nodes.</t>
      <figure anchor="fig-tree-slice">
        <name>Tree slice for leaf 2 in an 8-member tree.  For nodes with 'X', the full node is included; with '#', only the hash.</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="240" viewBox="0 0 240 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 56,112 L 56,128" fill="none" stroke="black"/>
              <path d="M 120,48 L 120,64" fill="none" stroke="black"/>
              <path d="M 72,64 L 168,64" fill="none" stroke="black"/>
              <path d="M 40,128 L 72,128" fill="none" stroke="black"/>
              <path d="M 72,128 L 80,144" fill="none" stroke="black"/>
              <path d="M 168,64 L 176,80" fill="none" stroke="black"/>
              <path d="M 32,144 L 40,128" fill="none" stroke="black"/>
              <path d="M 64,80 L 72,64" fill="none" stroke="black"/>
              <g class="text">
                <text x="120" y="36">X</text>
                <text x="136" y="36">=</text>
                <text x="164" y="36">root</text>
                <text x="56" y="100">X</text>
                <text x="184" y="100">#</text>
                <text x="24" y="164">#</text>
                <text x="88" y="164">X</text>
                <text x="80" y="180">/</text>
                <text x="96" y="180">\</text>
                <text x="72" y="196">X</text>
                <text x="104" y="196">#</text>
                <text x="8" y="228">0</text>
                <text x="40" y="228">1</text>
                <text x="72" y="228">2</text>
                <text x="104" y="228">3</text>
                <text x="136" y="228">4</text>
                <text x="168" y="228">5</text>
                <text x="200" y="228">6</text>
                <text x="232" y="228">7</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
              X = root
              |
        .-----+-----.
       /             \
      X               #
      |
    .-+-.
   /     \
  #       X
         / \
        X   #

0   1   2   3   4   5   6   7
]]></artwork>
        </artset>
      </figure>
      <sourcecode type="tls"><![CDATA[
struct {
  uint32 index;
  opaque tree_hash<V>;
} Hashes;

enum {
  reserved(0),
  xnode(1),
  hashes(2),
  (255)
} XNodeType;

struct {
  optional<Node> node;
  uint32 index;
} XNode;

struct {
  XNodeType node_type;
  select (XNode.node_type) {
    case xnode:  XNode xnode;
    case hashes: Hashes hashes;
  }
} SliceNode;

struct {
  SliceNode nodes<V>;
  uint32 leaf_index;
  uint32 n_leaves;
} TreeSlice;
]]></sourcecode>
      <t>Tree slices are used to prove group membership of leaves.
The <tt>tree_info</tt> in light MLS messages always contains the sender's and may contain the receiver's
tree slices to allow the receiver to check the proof of membership.</t>
      <t>To verify the correctness of the group on a light client, the client checks its
tree hash and parent hashes.
For each direct path from a leaf to the root that the client has (tree slices),
it checks the parent hash value on each node by using <tt>original_tree_hash</tt> of
the co-path nodes.
The tree hash on the root node is computed similarly, using the <tt>tree_hash</tt> values
for all nodes where the client does not have the full nodes.</t>
      <t>The delivery service should allow to query <tt>TreeSlice</tt> for proof of memberships at any point for any member in the tree.</t>
    </section>
    <section anchor="light-mls">
      <name>Light MLS</name>
      <t>Light MLS is a variant of MLS run by light clients.</t>
      <t>For light welcomes the necessary tree information can be retrieved from the delivery server, or provided
via the <tt>tree_info</tt> GroupInfo extension.</t>
      <sourcecode type="tls"><![CDATA[
struct {
    TreeSlice tree_info<V>;
} TreeInfo
]]></sourcecode>
      <t>Light commit messages are defined as a new content type for the FramedContent.
A light commit contains a GroupInfo with a LightPathSecret extension, which contains
the commit secret for the receiving light client and the corresponding node index.
In addition, the GroupInfo contains a TreeInfo extension with the committer's
direct paths.</t>
      <sourcecode type="tls"><![CDATA[
enum {
    reserved(0),
    application(1),
    proposal(2),
    commit(3),
    light_commit(4),
    (255)
} ContentType;

struct {
    HPKECiphertext encrypted_path_secret;
    uint32 decryption_node_index;
} LightPathSecret;

struct {
    GroupInfo group_info;
} LightCommit;
]]></sourcecode>
      <t>Full MLS clients do not need to implement these types.
The delivery service can build these messages instead.</t>
      <t>The committer's new leaf node is not part of the LightCommit message.
Instead, it is part of the <tt>tree_info</tt> extension in the GroupInfo.</t>
      <section anchor="verifying-group-validity">
        <name>Verifying Group Validity</name>
        <t>A light client can not do all the checks that a client with the MLS tree can do.
We therefore update the checks performed on tree modifications.
Instead of verifying the MLS tree, light clients verify that they are in a group
with a certain tree hash value.
In particular the validation of commits and welcome packages are modified compared
to <xref target="RFC9420"/>.</t>
        <section anchor="joining-as-a-light-client">
          <name>Joining as a Light Client</name>
          <t>When a new member joins the group with a Light Welcome message
(Section 12.4.3.1. <xref target="RFC9420"/>) without the ratchet tree extension the checks
are updated as follows.</t>
          <ol spacing="normal" type="1"><li>
              <t>Verify the <tt>GroupInfo</tt>
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>signature</t>
                </li>
                <li>
                  <t>confirmation tag</t>
                </li>
                <li>
                  <t>tree hash</t>
                </li>
              </ol>
            </li>
            <li>
              <t>Verify the sender's membership (see <xref target="tree-slices"/>).</t>
            </li>
            <li>
              <t>Check the own direct path to the root (see <xref target="tree-slices"/>).</t>
            </li>
            <li>
              <t>Do <em>not</em> verify leaves in the tree.</t>
            </li>
          </ol>
        </section>
        <section anchor="processing-a-light-commit">
          <name>Processing a Light Commit</name>
          <t>Because the the signature and membership tag on the <tt>FramedContent</tt> in Light Commit
messages is broken, these <bcp14>MUST NOT</bcp14> be checked by the receiver.</t>
          <t>Instead, the proof of membership in the <tt>tree_info</tt> is verified for the sender.</t>
          <t>Note that while a light client can check the parent hashes when verifying the new
group state, it can not verify all points from Sec. 7.9.2 in <xref target="RFC9420"/>.
In particular, the check that "D is in the resolution of C, and the intersection of P's
<tt>unmerged_leaves</tt>` with the subtree under C is equal to the resolution of C with D removed."
can not be performed because the light client can not compute the resolution.
But this property always holds on correctly generated tree, which the light client
has to trust, not knowing the MLS tree.</t>
          <t>Taking the confirmed transcript hash from the GroupInfo, a light client checks
the confirmation tag.
Otherwise, a Light Commit is applied like a regular commit.</t>
          <t>In summary, when a member receives a Light Commit message the checks are updated as follows.</t>
          <ol spacing="normal" type="1"><li>
              <t>Verify the sender's membership (see <xref target="tree-slices"/>) and leaf node (see Section 7.3 <xref target="RFC9420"/>).</t>
            </li>
            <li>
              <t>Verify the own path (see <xref target="tree-slices"/>).</t>
            </li>
            <li>
              <t>Verify the GroupInfo signature.</t>
            </li>
            <li>
              <t>Check the tree hash in the GroupInfo matches the clients own tree hash.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="light-mls-extension">
        <name>Light MLS Extension</name>
        <t>The <tt>light_clients</tt> group context extension is used to signal that the group
supports Light MLS clients.</t>
        <sourcecode type="tls"><![CDATA[
enum LightClientType {
  reserved(0),
  no_upgrade(1),
  resync_upgrade(2),
  self_upgrade(3),
  any_upgrade(4),
  (255)
}

struct {
  LightClientType upgrade_policy;
} LightMlsExtension;
]]></sourcecode>
        <t>The extension must be present and set in the required capabilities of a group
when supporting light clients.
It further defines ways light clients may upgrade to a full client.</t>
        <ul spacing="normal">
          <li>
            <t><tt>no_upgrade</tt> does not allow light clients to upgrade to full MLS.</t>
          </li>
          <li>
            <t><tt>resync_upgrade</tt> allows light clients to upgrade to full MLS by using an external commit.
The resync removes the old client from the group and adds a new client with full MLS.</t>
          </li>
          <li>
            <t><tt>self_upgrade</tt> allows light clients to upgrade to full MLS by retrieving the full tree
from the server. Together with the signed group info of the current epoch the
client "silently" upgrades to full MLS with security equivalent to joining a new
group. The client <bcp14>MUST</bcp14> perform all checks from Section 12.4.3.1 <xref target="RFC9420"/>.</t>
          </li>
          <li>
            <t><tt>any_upgrade</tt> allows light clients to use either of the two upgrade mechanisms.</t>
          </li>
        </ul>
        <section anchor="light-mls-leafnode">
          <name>Light MLS LeafNode</name>
          <t>The <tt>light_client</tt> leaf node extension signals that a leaf node is a light client.
The extension is an empty struct.</t>
          <sourcecode type="tls"><![CDATA[
struct {

} LightMlsClient;
]]></sourcecode>
        </section>
      </section>
      <section anchor="committing-with-a-light-client">
        <name>Committing with a Light Client</name>
        <t>A light client <em>cannot commit</em> because it doesn't know the necessary
public keys in the tree to encrypt to.
Therefore, if a light client wants to commit, it first has to upgrade to full MLS.
Because a light client is not able to fully verify incoming
proposals, it <bcp14>MUST NOT</bcp14> commit to proposals it received while not holding a full tree.
A client that is upgrading to a full MLS tree is therefore
considered to be a new client that has no knowledge of proposals before it joined.
Note that this restriction can not be enforced.
However, since each client in <xref target="RFC9420"/> must check the proposals, a misbehaving
client that upgraded can only successfully commit bogus
proposals when all other clients and the delivery service agree.</t>
        <t>The light clients extension (<xref target="light-mls-extension"/>) defines the possible
upgrade paths for light clients.</t>
        <t>In order to ensure that the tree retrieved from the server contains the tree
slice known to the client, the upgrading client <bcp14>MUST</bcp14> perform the following checks:</t>
        <ul spacing="normal">
          <li>
            <t>Verify that the tree hash of the tree slice and the full tree are equivalent.</t>
          </li>
          <li>
            <t>Verify that all full nodes (<tt>XNode</tt>) in the client's state are equivalent to
the corresponding nodes in the full tree.</t>
          </li>
          <li>
            <t>Perform all checks on the tree as if joining the group with a <tt>Welcome</tt> message
(see Section 12.4.3.1. in <xref target="RFC9420"/>).</t>
          </li>
        </ul>
        <t>Note that the client already checked the signed group info.</t>
        <t>To retrieve the full tree, the delivery service must provide an end point,
equivalent to the one used to retrieve the full tree for a new member that wants
to join with a commit.</t>
        <section anchor="maintaining-state">
          <name>Maintaining state</name>
          <t>After committing, the client can decide to switch to regular MLS and process the
full tree as described in <xref target="RFC9420"/>.
This will cause the client's performance to degrade to the performance of regular
MLS, but allows it to commit again without the necessity to download the full
tree again.</t>
          <t>If the client does not expect to commit regularly, only the own tree slice should
be kept after a commit.</t>
        </section>
      </section>
    </section>
    <section anchor="full-members">
      <name>Full Members</name>
      <t>Full MLS members in groups with light clients don't need significant changes.
Any changes can always be built on top of regular MLS clients.
In particular, full MLS clients are required to send a <tt>GroupInfo</tt> alongside
every commit message to the delivery service.
Depending on the deployment, the delivery service might also ask the client to
send a ratchet tree for each commit.
But the delivery service can track the tree based on commit messages such that
sending ratchet trees with commits is not recommended.</t>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <t>The delivery service for MLS groups with light clients must provide additional
endpoints for Light Welcome and Light Commit messages.
In order to provide these endpoints the server must keep track of the public
group state.</t>
      <section anchor="delivery-service-commit-processing">
        <name>Delivery Service Commit Processing</name>
        <t>The delivery service processes Commits for light clients and produces <tt>LightCommit</tt>
messages for them.
To do this, the server creates the sender and receiver proof of memberships (<tt>tree_info</tt>),
adds the <tt>group_info</tt> of the current epoch, and removes all information from the
<tt>Commit</tt> struct that is not needed by the receiver.
In particular, only the required <tt>UpdatePathNode</tt> is kept from the <tt>nodes</tt> vector,
and only the <tt>HPKECiphertext</tt> the receiver can process is kept from the <tt>encrypted_path_secret</tt>
vector.
For the receiver to identify the decryption key for the ciphertext, the server
adds the <tt>decryption_node_index</tt> to the <tt>LightCommit</tt>.</t>
      </section>
      <section anchor="how-to-use-light-mls">
        <name>How to use Light MLS</name>
        <t>Bootstrapping large groups can be particularly costly in MLS.
Light MLS can be used to bootstrap large groups before lazily upgrading light
clients to full clients.
This distributes the load on the server and clients.</t>
        <t>Light MLS may also be used on low powered devices that only occasionally upgrade
to full MLS clients to commit to the group, for example when charging.</t>
        <t>Light clients can decide to store the tree slices and build up a tree over time
when other members commit.
But client may decide to delete the sender paths it gets after verifying it's
correctness.</t>
      </section>
      <section anchor="light-messages-from-the-sender">
        <name>Light Messages from the Sender</name>
        <t>When the delivery service does not provide the necessary endpoints for light messages, the committer can build and end the light commit and welcome messages directly.</t>
      </section>
    </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 by light members, a new security analysis is 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>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.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document defines two new message types for MLS Wire Formats, and a new
MLS Extension Type</t>
      <section anchor="mls-wire-formats">
        <name>MLS Wire Formats</name>
        <table>
          <name>MLS Wire Formats Registry</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">R</th>
              <th align="left">Ref</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0006</td>
              <td align="left">mls_light_welcome</td>
              <td align="left">-</td>
              <td align="left">This Document</td>
            </tr>
            <tr>
              <td align="left">0x0007</td>
              <td align="left">mls_light_commit</td>
              <td align="left">-</td>
              <td align="left">This Document</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="mls-extension-types">
        <name>MLS Extension Types</name>
        <table>
          <name>MLS Extension Types Registry</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Message(s)</th>
              <th align="left">R</th>
              <th align="left">Ref</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0006</td>
              <td align="left">light_clients</td>
              <td align="left">GC</td>
              <td align="left">-</td>
              <td align="left">This Document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <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" value="Security"/>
          <seriesInfo name="DOI" value="10.1145/3548606.3560632"/>
          <refcontent>ACM</refcontent>
        </reference>
      </references>
    </references>
    <?line 616?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
wWD7eoux+n9/faAppWMAAA==

-->

</rfc>
