<?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-kiefer-mls-partial-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="Partial MLS">Partial MLS</title>
    <seriesInfo name="Internet-Draft" value="draft-kiefer-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="June" day="28"/>
    <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-kiefer-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/cryspen/scalable-mls-id"/>.</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="23" month="June" year="2025"/>
            <abstract>
              <t>   This document defines the core behavior for Media over QUIC Transport
   (MOQT), a media transport protocol designed to operate over QUIC and
   WebTransport, which have similar functionality.  MOQT allows a
   producer of media to publish data and have it consumed via
   subscription by a multiplicity of endpoints.  It supports
   intermediate content distribution networks and is designed for high
   scale and low latency distribution.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-12"/>
        </reference>
        <reference anchor="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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
RaJfjn5SlKqg6ts3dsxM6phJ5thXC5cCREgew890IHnLMMZjK00t7XRaPAyU
xWx5Y2oC5iEZrA3JHmZTGSVdu6hFO74bqtOTgiVu7EQq4/0KPqQ6RyKFmRVG
yCwi7aiISENfW0SjuJyt+54AmgTf7918HULIWmR1LcXv82w1Iq8lEngoEsbb
XvuWyOWqq9dJjZYA+dP84nu/0CtWpzi2Mqzy2J3ozkzlYDso3EvQM+oz7Uf3
ToUW8hi7/etf271+c5XPZ084Cne9d/2LnWsA9tP8QQYnqX6GaOsu5O13yhi3
8AVSJFz+wqFgrhsl7/Z2PMu9BUeFIeYFsC9GCHUFTXU018G0OIh6D3HxGmXT
Kf6L5+b0qCgehe3AUO/jeqrEW5HhdoPpRpBiJ17Xwwd0k2k05tBxf4DoEW/5
YljShu1icT1c/bcOHX6zYspOYhV4fFWWmEzYrxvnJwm7oE6iEFIoqEra3hSl
YpLSiRVjovBYQqh6KwrGRnlhFrLJnsqsWELG63suzf+kLQJm5RJHEtt+5rUx
AYzy/tM29WAJV2yrEK1lAlqDPuIGUleGuUs6/tAGuW5mhzCiHw6VM976a4Iy
VydjOP+52Ajx4fPYi80PemQfm6BiWg2IZbhwTisExK9Wq5AlMJdoIK0nwyHo
KDXPTjC3MCCbz6O5OKfOmGnsh/f1OPjlYkKA2XnCHjHXAchWtUph56JlGdzy
llfYjqdN1b6XvHpd7CdvokQcHUol6zbZ1XWKkTAQNqMlB2KgY231dRs6oQUC
+cBiOo1dywKiYT2SYoFdMYs4y5YvEbSCyhzpO+Hm7xJUJeJXqEQQCoPngAyJ
ADXUcjhaajudzLcbW6NEd6dvJxhI1xwmuwYJ9ns39NJIMWbBEVgyUt5qS6xO
EtbzlB4ltkNYFGil0Z0o/dN9JFZmtvjSnBGWFTjSjj13C0/lV7Ia6q7CMF+K
N58sxu/O8G+Tf0LSKfKQaa9ghF+Chrj0hXK1GLFKblJxcpKQ4L+1v7n7Hyep
ZqV4Y1I3H4sxilarseN1WpugXR/K0nsStLKxIiqy6OkYPOn0KnZY6bcjyXyq
Q4Q8RdpMmFs87qkLBsB2A6z9+cxQlFt2a41hoC13ssUYn6/6TZF011MASb2C
RCSj6bPv3dA/TO2lYIqa2Mb72plDZxluTgZqHgv3pt25Zs3FPeWDy9hTCX53
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

-->

</rfc>
