<?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.19 (Ruby 3.3.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kiefer-mls-light-01" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="Light MLS">Light MLS</title>
    <seriesInfo name="Internet-Draft" value="draft-kiefer-mls-light-01"/>
    <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="October" day="21"/>
    <area>Security</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 50?>

<t>The Messaging Layer Security (MLS) protocol provides efficient asynchronous
group key establishment for large groups with up to thousands of clients. In
MLS, any member can commit a change to the group, and consequently, all members
must download, validate, and maintain the full group state which can incur a
significant communication and computational costs, especially when joining a
group. This document defines an MLS extension to support "light clients" that don't
undertake these costs. A light client cannot commit changes to the group, and
only has partial authentication information for the other members of the group,
but is otherwise able to participate in the group. In exchange for these
limitations, a light client can participate in an MLS group with significantly
lower requirements in terms of download, memory, and processing.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://example.com/LATEST"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-kiefer-mls-light/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        WG Working Group mailing list (<eref target="mailto:WG@example.com"/>),
        which is archived at <eref target="https://example.com/WG"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/USER/REPO"/>.</t>
    </note>
  </front>
  <middle>
    <?line 64?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Messaging Layer Security protocol <xref target="RFC9420"/> enables continuous group
authenticated key exchange among a group of clients. The design of MLS requires
all members to download, validate, and maintain the full MLS tree, including
validating the credentials and signatures of all members. The size of the MLS
tree is linear in the size of the group. Consequently, the MLS design results in
a performance bottleneck for new members seeking to join a large group, and
significant storage and memory requirements once the member has joined.</t>
      <t>This document defines an extension to MLS to allow for "light clients" --
clients that do not download, validate, or maintain the entire ratchet tree for
the group. On the one hand, this "lightness" allows a light client to
participate in the group with much significantly lower communication and
computation complexity. On the other hand, without the full ratchet tree, the
light client cannot create Commit messages to put changes to the group into
effect. Light clients also only have authentication information for the parts
of the tree they download, not the whole group.</t>
      <t>This document does not change the core logic of MLS, including: The structure of
the ratchet tree and its associated algorithms, the key schedule, the secret
tree, and application message protection. The messages sent and received by
normal clients in the course of an MLS session are likewise unchanged. With
proper modifications to the MLS Delivery Service, standard MLS clients can
participate in a group with light client without any modification.</t>
      <t>The only modifications this document makes are to the local state stored at
light clients, namely the component of MLS that manages, synchronizes, and
authenticates the public group state. We also defines some "annotations" that
need to be appended to group messages so that they can be processed by light
clients. Light clients effectively run normal MLS algorithms, but with
just-in-time delivery of exactly the subset of the public group state needed by
a given algorithm. We achieve lightness due to the fact that aside from initial
tree validation and sending commits, a client only needs log-scale information.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<dl>
        <dt>Tree slice:</dt>
        <dd>
          <t>A tree slice is the direct path from a leaf node to the root, together with
the tree hashes on the co-path.</t>
        </dd>
        <dt>Membership proof:</dt>
        <dd>
          <t>A tree slice that proves that a given leaf node is part of a ratchet tree with
a given tree hash.</t>
        </dd>
        <dt>Light client:</dt>
        <dd>
          <t>An MLS client that does not download, validate, and maintain a copy of the
group's ratchet tree. A light client does not store any public data about the
group's ratchet tree, only the HPKE decryption keys associated to nodes on the
client's direct path.</t>
        </dd>
        <dt>Full client:</dt>
        <dd>
          <t>A normal MLS client, in possession of the full MLS ratchet tree for the group.</t>
        </dd>
        <dt>Sender-authenticated message:</dt>
        <dd>
          <t>A signed MLS message such as Welcome or PublicMessage, together with a
membership proof that proves the sender's membership in the group.</t>
        </dd>
        <dt>Annotated Welcome:</dt>
        <dd>
          <t>A Welcome message together with information that a light client needs to
process it.</t>
        </dd>
        <dt>Annotated Commit:</dt>
        <dd>
          <t>A Commit message (as a PublicMessage or PrivateMessage) together with
information that a light client needs to process it.</t>
        </dd>
      </dl>
      <t>As in MLS, message structures are defined using the TLS presentation syntax
<xref target="RFC8446"/>. Unlike most MLS messages, however, these structures are not
encapsulated in a signed or MAC'ed structure. So it may be more convenient for
applications to encode these structures in application-specific encodings.</t>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>A light client does not receive or validate a full copy of the ratchet tree for
a group, but still possesses the group's secrets, including receiving updated
secrets as the group evolves. When MLS messages are sent to a light client,
they need dto be accompanied by annotations that provide the light client with
just enough of information about the ratchet tree to process the message. These
annotations can be computed by any party with knowledge of the group's ratchet
tree, including the committer and sometimes the DS.</t>
      <figure anchor="fig-overview">
        <name>Overview of Light MLS</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="544" width="552" viewBox="0 0 552 544" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 32,64 L 32,528" fill="none" stroke="black"/>
              <path d="M 168,64 L 168,528" 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,456" fill="none" stroke="black"/>
              <path d="M 344,472 L 344,528" 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,456" fill="none" stroke="black"/>
              <path d="M 432,472 L 432,528" fill="none" stroke="black"/>
              <path d="M 520,64 L 520,528" 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 512,464" fill="none" stroke="black"/>
              <path d="M 168,512 L 336,512" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="520,464 508,458.4 508,469.6" fill="black" transform="rotate(0,512,464)"/>
              <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,512 332,506.4 332,517.6" fill="black" transform="rotate(0,336,512)"/>
              <polygon class="arrowhead" points="344,160 332,154.4 332,165.6" fill="black" transform="rotate(0,336,160)"/>
              <polygon class="arrowhead" points="168,336 156,330.4 156,341.6" fill="black" transform="rotate(0,160,336)"/>
              <polygon class="arrowhead" points="168,112 156,106.4 156,117.6" fill="black" transform="rotate(0,160,112)"/>
              <g class="text">
                <text x="36" y="36">Full</text>
                <text x="164" y="36">Delivery</text>
                <text x="344" y="36">Light</text>
                <text x="432" y="36">Light</text>
                <text x="516" y="36">Full</text>
                <text x="28" y="52">Client</text>
                <text x="64" y="52">A</text>
                <text x="160" y="52">Service</text>
                <text x="332" y="52">Client</text>
                <text x="368" y="52">B</text>
                <text x="420" y="52">Client</text>
                <text x="456" y="52">C</text>
                <text x="508" y="52">Client</text>
                <text x="544" y="52">D</text>
                <text x="68" y="84">Commit</text>
                <text x="72" y="100">Welcome</text>
                <text x="244" y="132">AnnotatedWelcome</text>
                <text x="184" y="148">=</text>
                <text x="224" y="148">Welcome</text>
                <text x="264" y="148">+</text>
                <text x="300" y="148">Proofs</text>
                <text x="240" y="196">AnnotatedCommit</text>
                <text x="184" y="212">=</text>
                <text x="220" y="212">Commit</text>
                <text x="256" y="212">+</text>
                <text x="292" y="212">Proofs</text>
                <text x="200" y="228">+</text>
                <text x="252" y="228">Resolution</text>
                <text x="316" y="228">Info</text>
                <text x="204" y="276">Commit</text>
                <text x="100" y="324">PrivateMessage</text>
                <text x="236" y="372">PrivateMessage</text>
                <text x="248" y="420">SenderAuthMessage</text>
                <text x="184" y="436">=</text>
                <text x="252" y="436">PrivateMessage</text>
                <text x="200" y="452">+</text>
                <text x="244" y="452">Proof(D)</text>
                <text x="212" y="500">Proof(C)</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
  Full          Delivery                Light      Light      Full
Client A        Service               Client B   Client C   Client D
   |                |                     |          |          |
   | Commit         |                     |          |          |
   | Welcome        |                     |          |          |
   +--------------->|                     |          |          |
   |                | AnnotatedWelcome    |          |          |
   |                | = Welcome + Proofs  |          |          |
   |                +-------------------->|          |          |
   |                |                     |          |          |
   |                | AnnotatedCommit     |          |          |
   |                | = Commit + Proofs   |          |          |
   |                |   + Resolution Info |          |          |
   |                +------------------------------->|          |
   |                |                     |          |          |
   |                | Commit              |          |          |
   |                +------------------------------------------>|
   |                |                     |          |          |
   | PrivateMessage |                     |          |          |
   +--------------->|                     |          |          |
   |                |                     |          |          |
   |                | PrivateMessage      |          |          |
   |                +------------------------------------------>|
   |                |                     |          |          |
   |                | SenderAuthMessage   |          |          |
   |                | = PrivateMessage    |          |          |
   |                |   + Proof(D)        |          |          |
   |                +------------------------------------------>|
   |                |                     |          |          |
   |                | Proof(C)            |          |          |
   |                +-------------------->|          |          |
   |                |                     |          |          |
]]></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>When a light client is added to the group, they are provided an
AnnotatedWelcome message, which comprises a normal Welcome message plus
membership proofs for the sender and joiner.</t>
        </li>
        <li>
          <t>From each Commit that is generated in the group, an individual
AnnotatedCommit is generated for each light client. An AnntatedCommit
comprises a normal MLS Commit message, together with membership proofs and
the information that the light client needs in order to process the update
path in the Commit.</t>
        </li>
        <li>
          <t>When messages are sent in the group, e.g., carrying application data,
they are extended with a membership proofs so that light clients can
authenticate the sender's membership in the group.</t>
        </li>
        <li>
          <t>Light clients can download membership proofs to authenticate individual other
users. Here B authenticates C.</t>
        </li>
      </ol>
      <t>In this example, we have shown the required annotations being added by the DS.
This allows full clients to behave as they would in normal MLS, but requires
that the DS maintain a copy of the group's ratchet tree. It is also possible
for committers to generate the required annotated messages. This document does
not define who generates annotated messages from the base MLS messages, or how
this entity learns which clients are light or full clients.</t>
      <t>Light clients still need to be provided with access to any proposals sent in a
group outside of Commits. Light clients cannot process proposals that modify the
structure of the tree, in particular Add, Update, or Remove proposals. They
can, however, verify that these proposals were included in a given Commit. And
they need to see proposals such as PreSharedKey or GroupContextExtensions so
that they can update their state appropriately.</t>
      <t>Depending on how light MLS is deployed, a client might need to inform the DS or
other members of its status (light or full), so that the proper annotations can
be generated when it is light. It is harmless for a full client to receive an
AnnotatedCommit; the annotations can simply be ignored.</t>
    </section>
    <section anchor="upgrading-and-downgrading">
      <name>Upgrading and Downgrading</name>
      <t>A light client can upgrade to being a full client at any time by downloading the
full ratchet tree; a full client can downgrade by deleting its local copy of the
ratchet tree.  Before a light client uses a copy of the ratchet tree to upgrade
ot being a full client, it <bcp14>MUST</bcp14> verify the integrity of the ratchet tree in the
same way it would when joining as a full client, following the steps in
<xref section="12.4.3.1" sectionFormat="of" target="RFC9420"/>.</t>
    </section>
    <section anchor="membership-proofs-and-partial-trees">
      <name>Membership Proofs and Partial Trees</name>
      <t>Although light clients do not have a copy of the group's ratchet tree, they
still agree on the root tree hash of the ratchet tree, via the MLS key schedule
as usual. This fact, together with the Merkle-tree-like structure of the MLS
tree hash, allows a light client to verify the legitimacy of partial information
about the ratchet tree. In particular, for any leaf in the tree, anyone in
possession of the public data of the ratchet tree can construct a "membership
proof" that proves that a leaf node with specific contents is located at a
specific leaf index in the tree.</t>
      <t>A membership proof for a leaf node comprises:</t>
      <ul spacing="normal">
        <li>
          <t>The number of leaves in the tree.</t>
        </li>
        <li>
          <t>The leaf index of the member's leaf.</t>
        </li>
        <li>
          <t>The values of the nodes from the leaf node to the root of the tree, including
both the leaf node and the root.</t>
        </li>
        <li>
          <t>The tree hash values for the nodes on the copath of the leaf node.</t>
        </li>
      </ul>
      <artwork><![CDATA[
struct {
    opaque hash_value;
} CopathHash;

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

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

    MembershipProof sender_membership_proof_after;
    MembershipProof receiver_membership_proof_after;
} AnnotatedCommit;
]]></sourcecode>
      <t>The fields in the AnnotatedCommit have the following semantics:</t>
      <dl>
        <dt><tt>commit</tt>:</dt>
        <dd>
          <t>An MLSMessage containing PrivateMessage or PublicMessage with <tt>content_type</tt>
            <tt>commit</tt>, together with a membership proof for the sender.</t>
        </dd>
        <dt><tt>sender_membership_proof</tt>:</dt>
        <dd>
          <t>A membership proof for the sender of the Commit relative to the tree for the
epoch in which the Commit is sent. This field <bcp14>MUST</bcp14> be present if the
<tt>sender_type</tt> for the Commit is <tt>member</tt>, and otherwise <bcp14>MUST</bcp14> be absent.</t>
        </dd>
        <dt><tt>tree_hash_after</tt>:</dt>
        <dd>
          <t>The tree hash of the group's ratchet tree after the Commit has been applied.</t>
        </dd>
        <dt><tt>resolution_index</tt>:</dt>
        <dd>
          <t>The recipient can compute which entry in the UpdatePath in the Commit it
should use based on the sender index in the Commit. This index specifies which
HPKECiphertext in the UpdatePathNode to use. This field <bcp14>MUST</bcp14> be included if and
only if the Commit has a <tt>path</tt> field populated.</t>
        </dd>
        <dt><tt>sender_membership_proof_after</tt>:</dt>
        <dd>
          <t>A membership proof for the sender of the Commit relative to the tree after the
Commit has been applied.</t>
        </dd>
        <dt><tt>receiver_membership_proof_after</tt>:</dt>
        <dd>
          <t>A membership proof for the receiver of the Commit relative to the tree after the
Commit has been applied.</t>
        </dd>
      </dl>
      <t>An AnnotatedCommit can be generated by any party that knows the group's ratchet
tree (both before and after the Commit) and the indices of the sender and joiner
in the tree. It is safe for the recipient to accept the <tt>tree_hash</tt> supplied by
an unauthenticated party because the tree hash is authenticated by the
<tt>confirmation_tag</tt> in the Commit.</t>
      <t>A light client processes an AnnotatedCommit in the following way:</t>
      <ol spacing="normal" type="1"><li>
          <t>Verify that the <tt>sender_membership_proof</tt> in the <tt>commit</tt> field 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
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>group_info</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.</t>
        </li>
        <li>
          <t>When applying proposals, only the proposals that do not modify the tree are
applied, in particular, PreSharedKey and GroupContextExtensions proposals.</t>
        </li>
        <li>
          <t>Likewise, the creation of the new ratchet tree is omitted.</t>
        </li>
        <li>
          <t>In processing the <tt>path</tt> value, if present, replace the path node decryption
steps with the following steps:  </t>
          <ul spacing="normal">
            <li>
              <t>Use the <tt>leaf_index</tt> field of the <tt>sender_membership_proof</tt> to identify
the lowest common ancestor between the committer. This is the node where
the new path_secret will be inserted into the tree.</t>
            </li>
            <li>
              <t>Determine the index <tt>update_path_index</tt> of the lowest common ancestor
among the non-blank nodes in the committer's direct path, as provided in
the <tt>sender_membership_proof_after</tt> field.</t>
            </li>
            <li>
              <t>From the entry at index <tt>update_path_index</tt> of the <tt>nodes</tt> vector in the
UpdatePath, select the HPKECiphertext at index <tt>resolution_index</tt> from the
<tt>encrypted_path_secret</tt>.</t>
            </li>
            <li>
              <t>Identify the next non-blank node in the recipient's direct path under the
lowest common ancestor, using the direct path provided in the
<tt>recipient_membership_proof_after</tt> field. Retrieve the private HPKE
decryption key for this node.</t>
            </li>
            <li>
              <t>Decrypt the encrypted path secret as normal, using the tree hash in the
<tt>tree_hash_after</tt> field in the provisional GroupContext.</t>
            </li>
            <li>
              <t>Derive the remaining path secrets corresponding to the non-blank nodes in
the recipient's new direct path, as provided in the
<tt>recipient_membership_proof_after</tt> field.</t>
            </li>
            <li>
              <t>Define the <tt>commit_secret</tt> to be <tt>path_secret[n+1]</tt>, as normal.</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="application-messages">
      <name>Application Messages</name>
      <t>MLS clients can exchange messages by sending application data within the
PrivateMessage framing. In a group where light clients are present, these
messages should be further encapsulated in a SenderAuthenticatedMessage, so that
light clients have the membership proof necessary to verify the sender's
membership, the public key necessary to verify the message signature, and the
credential necessary to verify the sender's identity.</t>
      <t>As noted above, this can be accomplished either by the sender creating a
SenderAuthenticatedMessage, or by the DS adding the relevant membership proof
while the message is in transit.</t>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <t>The major operational challenge in deploying Light MLS is ensuring that light
clients receive the proper annotations to Welcome and Commit messages. As
discussed in <xref target="protocol-overview"/>, this is up to the application. Since full
clients don't need the annotations, applications will be more robust if they
send annotations in a way that they can be cleanly ignored by full clients.</t>
      <t>Light MLS substantially reduces the amount of data required to join an MLS
group, since it replaces the linear-scale ratchet tree with two log-scale
membership proofs. Light MLS does not address the potentially linear scaling of
Commit messages; in fact, it makes Commits slightly bigger. There are other
approaches to reducing Commit sizes, e.g., the SplitCommit approach in
<xref target="I-D.mularczyk-mls-splitmls"/>.  These approaches can be cleanly integrated
with Light MLS via the AnnotatedCommit structure.  <xref target="download-cost"/> summarizes
the scaling of the amount of data that a client needs to download in order to
perform various MLS operations.</t>
      <table anchor="download-cost">
        <name>Download scaling under protocol variations</name>
        <thead>
          <tr>
            <th align="left">Operation</th>
            <th align="center">RFC MLS</th>
            <th align="center">Light MLS</th>
            <th align="center">Split Commits</th>
            <th align="center">Light + Split</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Join</td>
            <td align="center">O(N)</td>
            <td align="center">O(log N)</td>
            <td align="center">O(N)</td>
            <td align="center">O(log N)</td>
          </tr>
          <tr>
            <td align="left">Process Commit</td>
            <td align="center">O(N)</td>
            <td align="center">O(N)</td>
            <td align="center">O(log N)</td>
            <td align="center">O(log N)</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="security-consideratiosn">
      <name>Security Consideratiosn</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 clients, a new security
analysis was needed. We have analyzed the security of the protocol using two
verification tools ProVerif and F*. The security analysis, and design of the
security mechanisms, are inspired by work from Alwen et al.
<xref target="AHKM22"/>.</t>
      <t>Light MLS preserves the invariants above and thereby all the security goals of
MLS continue to hold at full members. However, a light member may not know the
identities of all other members in the group, and it may only discover these
identities on-demand. Consequently, the Member Identity Authentication
guarantee is weaker on light clients. Furthermore, since light members do not
store the MLS tree, membership agreement only holds for the hash of the MLS
tree:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Light Membership Agreement</strong>: If a light client B has a local group state
for group G in epoch N, and it receives (and accepts) an application message
from a sender A for group G in epoch N, then A must be a member of G in
epoch N at B, and if A is honest, then A and B agree on the GroupContext
of the group G in epoch N.</t>
        </li>
        <li>
          <t><strong>Light Member Identity Authentication</strong>: If a light client B has a local
group state for group G in epoch N, and B has verified A’s membership proof in
G, and A is linked to a user identity U, then either the signature key of U’s
credential is compromised, or A belongs to U.</t>
        </li>
        <li>
          <t><strong>Light Group Key Secrecy</strong>: If a light client B has a local group state for
group G in epoch N with group key K (init secret), and if the tree hash at B
corresponds to a full tree, then K can only be known to members at the leaves
of this tree. That is, if the attacker knows K, then the signature or
decryption keys at one of the leaves must have been compromised.</t>
        </li>
      </ul>
      <t>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 makes no request of IANA.</t>
      <t>[[ NOTE: We could registere new WireFormat values for AnnotatedCommit and
AnnotatedWelcome. It's not clear that this is necessary or useful, though,
since the annotations are basically outside the MLS envelope. ]]</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.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" value="Security"/>
          <seriesInfo name="DOI" value="10.1145/3548606.3560632"/>
          <refcontent>ACM</refcontent>
        </reference>
      </references>
    </references>
    <?line 610?>

<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 currently no confidentiality or authenticity provided for the
annotations in the annotated messages, except that (a) the membership proofs
are matched against the appropriate tree hashes, and (b) the <tt>tree_hash_after</tt>
and <tt>resolution_index</tt> fields are authenticated by the <tt>confirmation_tag</tt> in a
Commit (the latter rather indirectly). It could be useful to be able to make
the annotations private within a group, especially in cases where tree
information is not otherwise available to the DS.</t>
        </li>
        <li>
          <t>There is no signaling within the group of whether any members are light
clients, and if so which ones. This was omitted because it didn't seem
clearly necessary, but it could be useful. For example, if a client could
include a LeafNode extension that declares that it is a light client, then a
committer could use this signal to proactively generate AnnotatedCommits for
the members. An approach like this might be necessary if we wanted to enable
cases where annotations were confidential to the group.</t>
        </li>
        <li>
          <t>There are no WireFormat values registered for the new messages defined here
that are likely to be sent on the wire: AnnotatedCommit,
AnnotatedWelcome, or SenderAuthenticatedMessage&lt;PrivateMessage&gt;. It's not
clear that these WireFormat values would be needed or useful, though, since
the annotations added in these messages are effectively outside the bounds of
MLS. They're more like how the delivery of the ratchet tree is unspecified in
RFC MLS.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA81d23Ibx5m+76foZS4syQBsHZI4lK0YIiVb0XFFKq6U4yIH
Mw1gzMEMMj1DGpaU2tfYu73ft9h9k32S/U/d0z0YkJTsVMIqyzhMn/7+D99/
6MZ4PFZN3hRmX+89yxfLRj9/drSnktmsNufxZ2nSmEVVb/Z1Xs4rpbIqLZMV
NMzqZN6Mz3IzN/V4VdhxgY3Gn99Wtp2tcmvzqmw2a3jyyaPjx1r/RieFraDz
vMzM2sA/ZbM30ntPpg/hf1UNr14fP95TZbuamXpfZTDwvkqr0prStnZfz6G9
UTC9uyqpTbKvj0za1nmzURdVfbaoq3a9r1+YBt/p7+CfvFzob/BjdWY28GkG
UykbU5emGR/i7NW5KVsYRGtp/d038JonHXeg9SrJC3zga/NTsloXZpJWK/g4
qdPlvl42zdruf/ZZ8N1n1Ncib5btbF+/OXr0+rPXj169hM8KWJhthhs9mx4/
OjpWKmmbZQVE0GMNdIfFP57op0Rq6EDreVsUvAuP66T8ObdnrQ2/r+pFUuY/
Jw3swb4+qDcWCE7fGF7H3DfjDfx6gZ/zmtyQTyf64TKBns6Tsjfq06RuljlQ
NSl7z1w58hk3ncxcs6GhX0+eweAJ7JTtjfw6T6FhpuPve6PmNq3CMeti9nW+
Pp/Yn7oh/jTR0+LC9Ff2p+p//7sIvol7nn53pL/L07M67D3Bh3+svk5Wyc9V
GS/k+UQ/bwtgkp83Z72RngMhkt631xht1RYrbOmHWypVVvUK2pwDKyuU0u6d
Go/HOpnZpk7SRqnjpdHPjbXJAln7WbIxtZcifQPk/aZe11VTpVWBL87zzFht
5vM8zUFadWI3Zbqsq7JqrSKR0cADGrg5mRW5Xa7wIRgeWLxeGBYqqy9ABjQ8
2lQamLq1SZlZXc11WmCndgJCqWDokU7KjV4ZlH6dAmMBIVc5DKphx0vojtpL
r/hwpkk5/K2FXooNfFIU0tyqVWsbnVUXZVEl2UifJ0WO+oSbASHLBv6j7nBD
uE8Ny2iMvlgCi9EE8hIooxNl80WZAw0SWB1Oqi3hNW6RTGK1bht6nxTwzjZ2
BCRZmzSHGW2gP1PqH6u8RJInTLaJPl7mFiaYtkSzzMxz4GXoD5WuNj81oPNw
AFizbdfrqm70HulXR7U9mHyCSyw/aVQLyhRY4szgiqzhSQB/67AJLqmsGkdW
JqrdpqqqSpj1MrF6DXwGa9CojKADt2jPYfAaNxubV/BP7aiPm9v1qWZto2Gx
9MhFDtMDZqHdpP7TfI1Ul90Q6jwpgQay7TIEqP4ih4nTuEDhZGtx/f6EmLy3
xITBRhYbVVQXMOcaGCivDW6DpVmYekUr6LgHlgUGkHkHpCIFAYK9nLBwrfIs
K4xSv0HbUldZm+IErxA1L2Rv3/7b68cHf7h35/P377UpkTIW2brJyxZEhSev
gg0wGYuco06yqpCtZJWhVOEEQHxhyfgxUkKWalUgKbgP15cT7KWpDXwPslG0
GSxNSRtcJT6X1gYtO/CNpU5wAknTwrA4jWBknqHNfzaOX6B3hb0jtxQgD0nt
2CJ8SljkIJJ9ae4WDKO1Be2nSvTa1MSwZWr0rGoA9ZQmPSO+Ks2FJ4Q1hgw+
EASlFRms02IsGaEisE1VJ7gBSChikJiVKhwOpyUaDQUK+zXZBJljh/RHkk/U
rpBm1QVNt68CAMXJa6cNNEr40H5C62g7cYtqo+ukSZemoU3FIVRA4Zf8ZFUa
mHyZIZFh1jwHmC6MTzOzfVFsKrVLslkMV23ak0XNsrilXFWgXEnRFuYnkJ9u
bqR2eHbYdQWqxjNruDbiEDWoDgFKwiwPWCuuSGJZLcLAg1oSVgRLBKto0mai
n4VbQhBXiwI9N9fRnEgqq4S3aRvgxSbYQ5wkfnexrAq3N1scVMEcaTViKlEQ
K9jfolrkqch/ILT7LHtNDdoKRBMeoI2PuAEZO8clWVuBKUPNkxTgCQCZV5Yl
DjWRhRZZWzCFQYiAno1ikmMPyXpduOULcUn7GVKTrAM80S2BDGhVm9QAgMn0
bMPgpvAUFnZKq7a2pBNEzVtDHgcAclg1QFOyNG3JBMkmAKSapYKR12inqoxY
j0yJ21vs5NAUMCyI8pGpz/MU1gCYoMwQcOLXbg7AOn0WT0IGj/jM8SWhm2Dg
CdsIYpbehKK9XYFdt7QsmWhRpUAPBiuohXBjmoi3YXsQY0LHTKrVGoQYuhI7
QLoC9CHSHFYomA5UrGU1F5oby0zaAr5LQ5gEBDXM7U572Wpl9B4JFa+DIYoq
DUwQpj4zyAzo99Fb7qvb+oqnRcyPxnxmnK0lNmCaKm/dYrFjYYStgyXXbamF
Z3CxIc8iEsHtUD8CPBzn5bjJV2gkZdOBPOCLpY3QDdxYaxpndrZJoHFlzKOw
+9BF2Q3G5EmXuTk32mtMnbV+F+cwEC85sQCzwSOrVsBIOVpOtoLOsArOBOFA
0RX8RghIOIxYCCdjUd7HFtjDhLpmgujkGHBNXlbwwIYZD4UXnWJQ6c/fHB2j
K47/1y9e0uvXj/79zZPXjw7x9dG302fP/AslTxx9+/LNs8PuVdfy4OXz549e
HHJj+FRHH6m959O/7LF62Hv56vjJyxfTZ3ss2CHjC8vPcC2AytagWJDVrQIj
n9b5DN5Am4cHr/7nv27fEyR15/btPwCS4jdf3P79PXiDAJxHI0LxW+QzhfzI
IANxSZqsAV4WSFngxyUoYA3WxQD1bn2PlPlhX385S9e37z2QD3DB0YeOZtGH
RLPtT7YaMxEHPhoYxlMz+rxH6Xi+079E7x3dgw+//COCLj2+/cUfH4DneIw8
aIHnwY8EX5SNAr1HfIYsnAGCACYGFbhk9gUgYJI5SF/m2byuqgaoXS0MmWqS
Pm/pABMtERc6lT7GroDezxmSLfM16oBqvjUBkht0UI0gHyeA3fg5+y9kIWLD
RnNwDfw8YNhQp9CQZaD1HcISQ3slZgbprNYb0R7s9X1io4lsOWi+c9LqZDBE
60D/CbhNAm8GexsxdyMhv3319BFotbTerEl7gKRHZrypiESO8KJUob9gQ4Ec
jxFEBdQItSp/jIhCryvrbK+oSu8q9NFlgN+VOkJTUI9j30bsAY+HENGw5XXQ
wSJ0BPH8zhQp2hvo8xWRiF0t02M18LdXPV7q8Y4hvWpqWH3wZOSNKjVlowZz
kXF5fm4SbnLx0CHYEx6NdpsVNoJlNnMAtqKhGJHySDE61TcSBN3RwokSdX4O
TeWTmz2pu+58dDwfQlyEHv0eONjIqITtf6Zb61zAY9gw0NaI5ng4gBhN8pMS
rXzv3u/ev5/oNyXCNIA+tgm3GNQvqF4wm/VIohm98YA+ypSgrMHFI0KRsAmv
ABWeTw8+gVe+1UQfVRqJl2zQlqxQtMDDBuHPJVylApBKFIDuSYX1h8eRukfH
FOMB2MbPw+otWdpXzrl/eY4o0lwAFXcIuuBcnLZTI7AWkp9Ae2x7aYnzShHR
2CaH50UMhamdhmA8bgPoL2Piq3aNA4Jbyw+hXHVOjjmvChARADIYvwo3iHbB
sqfXY6KRIvxGkC8TzJci/kyA2ATjAnzYSWLOxN7GzQTUgLxVu1giMUIe9uow
Jk/AwE3nW5CjYY0KhxeUyS6mm92GrMaGRfisrC4Kky3i2EOneFUvFuLgNsgq
ABZGbaAgEGXybA6PgEP+/ve/6ySx5wulNelY/+fdj94fG6b+S2yrDphYU/eo
OC69DuSph93Lg+7lIYaX3/XH3Pqg/2n4knsQLfULenAa9WN7+HQc/z34iDls
PetVcjC7D+vhK7+wT1E7VHP7YT30l7W1tmvMYejvI+kQ7POH0kGadmT4wB6A
Fvq1sVXRkg54Avrgl1NyF1H/YZTsCcoH93DVKqIF/VqriNHFv4hs/vIeesv6
4B7+KXux9SyD6Slg6W4hHyqb25T4cNkksb5xePNjVvGvQUlewcHN+NNfuIp/
oK4GNKHe7uvfzPPFuBLAqam246s9B0ARvnQlHfq9AigePv/+vQYI2WKW2EX8
miWCKfRmfQw8l/wWQyXf375StwUl9jwKcMGTTMJ9QY6RICJiSIF+mebagS07
u3I+naRkAajVOSLcxLmifQ9sDYvArvpOn/XeJ3t7BM0oG1MDILsz0Y8xfGES
GEV0M2FTWMDCwDPOzYgSpfBBBjg6a5Mimr10ELXF0an3kD4TDDBAs6AVdjSw
TETfsQvY93O3F4yBXOgNp7zl+W1hbfb9YIVVjdTpYWj2E7A3CvUIIXhCQL67
svvb/kFMMjNZTEaAuut6Q6nwIDOA8Y2RTJd5gxJhyBvsxg8s0EWMo8A3heah
nzCqcF0v/14/qowOgovzDEwAvZ9wmI4fOC+F82gtZTq/NbCkhzoOrB/AmE8k
6Ck1QMDqhjNHHH8k74azilnkOs0MkTDj+LP3LSgrJFm5eRe+sRxH5ZSUZSJf
VG1BTN3xGLuTPkvsWeXwaEdYq+8PSVjrCYs+JgfQK81nhVEoAd4zovk46Rhc
ZBcKslu1EuA8KwrBUeAB82K+LzvQnkOTOMgssaYXaoBZAaEV7wHsDHh+hUlq
oLDoHJfXq53EQIuQsr2woRVvPEh6eC3HnJyyWFXsa9YVUAhT5U5epEBEg29L
aQEgNAvaVs5D8pdOULuuOL2DGSViDBWm+XyWkUN3lMPCCiQ9zbKRfrP2yeLX
ZgXWoeuVHOiNgkGD+Az8w4Mwo9jgeWDk2ohn7GI0HHEVvQGaLwuiBVjoYsL2
LtL3qjZHSyB/9hQehYlRPd5BVTagIR65bDlqAxXnj1hp4fu8lnwNaBzovsYg
aLGBjTukMkQUJFBBsCjZYeQQZDizLqqNyYJEy4q+d/NlteokpKrVVhFMTvyQ
NK3VNyLuuTkKE15a0pK94IQC5ulMCJURsV2hrpyYAW1WBTIASlgS8ibO0QWY
oLeegbpPI/fjITYHNURxsnxRYmqRIlpv1os6IUKh3TwEzSTvtyJbTHn8VnI3
1CiaVcKpUEq9zbpEt4RP1Fbq/n6vvdPKPAj2YApD5SdIbk6OhqH3WDfph2ZO
wfV43i3b251BN1iLLAt2eWhZI9wbSgp5oeC81YIKfob6ZPOjbAKEuEg22AEr
5bhizPYHmleo4F24yTZmTYUub98ecVJd374zuTe5O7mNo/rqItrIILHyysME
/UrqvDDjY2FLC0xYL5Y9yyrFJWxErrQCkmFjbZgscL2S5sGMUJd2GaIMKJY8
8Tn5sMhAATVaCxZWjAImUftQiNqZ+qwwY+xsTFHmLR3oa41wEqOdlSzhbhZm
kQPXJikt3BXHBeBKDYckqZytU7UjltRyw8kqASGuYmKD5Tawm9tZlTAVNMRO
XDJZ8kphJXsdYlGEWPaG0mZdwowr5FxIG2vQuN6CZYpSrw0WQ7onZPaZ+Slc
A6YMtrCS6KZuLI9xwXm4RTUgXPWNC4Onzo3t9ckPBUMKBXgk4D38yj93nhSt
8WWInOvyKGAwRdk3ja64TWPF2LLXDmXGNfRjdhwtozuPI0y1odgghJbRfJcc
FRZLrd9yLfA6+VvLXZ5Ql/fVezCe2P5b+Oy+Ch9vQdXcvUMdnhCB7ncflidM
UvyoWnOd6pcvYNQHkvA7wT5PaJ5f/vkBPtYNIzM+4VQtff0+UCOkRe7T5NVj
obB1GzC6pry7SDzMRWLxI9VTcqgja6yetGTNXJmF41dGGJ0G/P3ki57yo3on
MBT8fTWXbaEQfTsLs9G+7pktM/RPFbVF11blJczSdqBVEHhX/TEoBCBJNskd
LKR8D3RRUKk2p1J6KWmdd0yp6IOOQr5cgiwHgNe/od/hHO2t1PbxRTXkI6Kj
JlOq8RiAcUWLRHC2UnPBUKeOj04VELzIuDmNO3IiQYgWQwQ6z9jRKXr7bzhH
JsnfaZT8lcgTmKDHIDsWMSauabNmWfauL5X19GqUSJm5MMAFmAmu66PqnE5R
kArTsQojkb7EkuHuUrGiABQ/iDM2a46bkaFKqxpcp3XFsFK249TXwJ7AM6dO
teHoiqRfPw59tc7k2KA2DkugquqM83axz+S7V9TUOdU4Hx4Kdm8LF8UmSqmj
HPd+0ORzOcLllt67I1xsyx4VThgrSadBfNJvt4szSqbYBvuXFFjUvCuB3wvl
UIFHL1QUybCnkyc4VyZKd4LTSedbrtIMLQ9m65rCjiWHHanoYzfufXrbU4sy
wZNuASdrVpfvL6GHKFOBqV1S/XRHb6c9lOJdLk8S5764QgPGrpfsSAxjOx+F
dRgpLhUqrpAzOuXltsmsq5SCRrw1QVKW5BT3fkICf2VFg1QgS/XRjpEUhmHS
MGL3uAZllh0woAFZo6HIjaT0EbyVMOJI/KuodyW9VLMfsTYGWMUUc9JhfxKE
jmB1q0IEKzl2RjQ7/vSupYf7UaF0D8ENhjHxLYcy9Y18YiZidUHFrXMp+gxo
fvMKlh5giy9l9g/Ap6cXw9zOcxjk9j4dhMfRJospESJvEYy8DfymwwPWrBKc
GmLHU5nRKZfJgGFwzIP4NWGS9vIa/ZIhJvWpAN4TNDen6pRjVadb9UTD2Lbb
EiDv6Q5KyCS91pFtMrxPg6HJyA5FWActkRBpMsxrAqq6CEJU30ByjfUNdkix
K18BzioFJKrD01sh9C38HzlRroqXzjdszdKdLvHbC3iGMwp/7img3QoQZ7KT
6MirO7ANh/5RjDsaBBqXJp61QYlThDEDLxvH8Fhz1CGDblVRgTesDxrc4qg5
61kPdJ0pdw5DoKdIAY16j7FXSALJBh/2MzmDfr2/8wys3guqiCyvMiS+wHLC
HR478GLqU5ZUxwOnRKwTdH5PnWokszEzERTlfk47v6Tfz67JTIRGOIW9P18z
pLJH0RCkQW3WRZL6oCtPA55LzwKGwibk2HhI1lF7Rd3aAQ+G+1oHqbAOXwbg
OlzA6WqD2BlITI7RwCbRfHZRSYi4i8PRX4V1J/T4vGpLmpQ1eDTZ8ZWwe2y0
MHxa46FFST4NBPMQ0tFpKHxezicFTUaw32nS2j5w5JbKh/hTF8Ke+r4x0hWE
kvnIVS/WJaMqP2oqo6J1gjUlpc0bOSzlYnLRCvrRQcG/vgJZwkgcduNYlaBF
9tZ9GMingVDX+FI93BuGwHSygHtxFsuXDRs8nlBxKbLLo8i+5HUUqvS71K8C
JVuJUUucGLpykpcFp5RSsxJfGVC7TBQXc3+c15aL9HYdDUXnUiyTr7IRSfPp
m0+sRAVGHHbv0H9mGjpm4E7RSkssSD7I17AEjNqLvvBGn7MOrxJWmhtll0RI
KWBG6lczyT1R8ITLFSd4mrLiY2mXroZWK6WOnRTD1HMxCBs+RRtgDeRAqdAu
+4ldFfoWmPHIjdjGIBI4Cl2YoOw4Np9KovM17SsFmpgHI4OUzLGWEN/7jOtl
AC7CQBTol2iSBH56sO3Bbi8ljEJ5VXlC05EwUdAtx5oeBGzj4lAf4hpx78P4
0hFrZ6P3/a26GmZKUv0qlClgsDsT8K+AMndZTkaZ1/CaO5bSfW8uLNhXAw5c
V+NA7psE48lkORQgbr3Ej/x0aeF+Ml0/pzzhUzmo07iz4q67ZMaOojrtsSKt
Nw7AXhbM6UsTncudGSOV3ZTwOu0zsR+j86rkggJSl0wX+LTeDOi0qFwCrJDT
b2g1MSOdOagnOxOF1J3iJgLzN84NkBS16inXrQm8kFA3jDe4UV2Odt4d/8/n
fRol+hS1r0Mm62rN5feXsGKwQb8KQ/q9U5fu3aVq4qrZeJX8K81n24D8Co7Z
DbIVM8lkYiyrx9U3r+27qdB3k5SyTeYmJIiwPIao09Sst9EzXlFR5HIUstRt
GR/q4YU5pBjHbrBQJHqY8TSqxnKeizk9aZLFaU8krulnOrH7FdxM5z+J0hZB
8BEx8jOHg2JpW9dEwSAif+f6QwvnupKuK1l8l7/rwvSuTAJQB/a3nYnY0rFc
5fUqqAkTun6Yt3znI31l5yp3N00kcVRPrGtkY/DsLq7FGxbnSfWd5+v5zdT0
Wr4zu3yXOnPXdZ+v6uZy7xno9iR2s5kyZLaZOKW5kNYnjq1vYAMyAlzP4rmb
WaU1N53/NRCIcLTEyD+eCfORLG9lppnrzNX60HlbrkKjVDkFeVOwjDROTe5y
WQEqr7v5JIFjIt0Nk+pacQb20t18QK3YJhzGBRUqcn+yScCSqOgpeOMLl4Jz
mL2SLMmmdJVZYkVYCp3N6BVmjeICKBTgHRVQXakWz++ZXILADhKlwwJnDm8+
iatR+uvDooXOhyQiMgAgJhghRBCMN3LhFl41gh7KsnRHUFnuqFJlQODpi33H
sm/sFeGQy1MhnHicb4QryDmsLozli4/oLD2sqQHrNjPNhTEuLy++rYNarOW4
MAKZMOgOSUc5cXZEYUXgshGQsojBMrofJIy68LoOvW8sdhmw3Cn7pZyAl6W6
2oDBScs0+NYfnmE5nhVJeSYJ7by3nvhUL4maL0jMy2BVVxkf2gG/GJfrF9SL
tdJXLeiUJgjsA5Op6lCr6gCtjiRLPxQ36EbZAuhebTtlANYPec9kJ8FWBXpR
uEQ2FDqPCekD8A79xHTUdONWMN7wbo0C+xi2DnYgnLMf7IpN0K9NU9PNEqxl
OP2MxJKe4rPfAuVIi2YhP0p8hXZRqBVGWDq1HK4jgG7R5PuQwcGj0qnC89zy
FWmh/gpmU+fnLvK0Ep86mIwdTq1vs3/A0uHmodBeIggfsw3d1OdOqgUbOnaT
Uo/TgAW/Lz+9/cNpaPIo3hfUwndVEL0rZ7pLv8KiAHctSL+cnhStLKwXm5gD
dMILzFDF+3wjWdo4istnNETFU7RL+ZHFiZ0Zb5e3z2TvTjH78tf42pouELPl
n5UYZbMJ6Jo43e3q+oMyATZ4AR7Z1dYfaHcgxtexqO4WsytHFovTbPi0PJh4
LJWbVecuXy3+Hh+ExmsS4XuTE81mYVdio+mWwMtIV9VdyT8eAXCSCQjenOPV
ZH3iqYtlXphoyTlbCo6gEwu+XKM3yhKKd6vBqvi95QjaKvkRBq6Cp3z8Gbvi
amm66i4sosarW2ueoDuq4a8sc7XJDir1KqCB2i5JiLvSu6BroqdWZblNW7og
iHwNd6tecK6pKxlwF1CaUFImmsteMOKruqoXjAZzlfcyKpEe6eimAGf46UqB
uprhWXUOnGwUbmm0HJIILNbauuYoBaBDMReuuMbNHTxhQLdctTO8karhqyXh
6TaVJBVAgpaz/ST9vujFX2dHgUslZ3E4+E2BDUJu3AdfuicXCG3dmUKZB3/B
0FZdjj+gQPfwuRsOgD9r5zOuq8a4qcv9ftgVFeDPVW+D7yPFuL43d5dgyUkI
9LNgIKxTzxcLxmwuO8Inb6jSP+EEXsVkwlFkCMtXXfF5JJzYEWxqI1+6plxS
/ccn48PJyt3RStccW3wYXuAdFnyrgA6G6+8ppSvplgUiYUchV+Lcj1QE91YA
S7u80xiv9Hz/HvZ/tUpqnD+lNTryDfGAVMX17/fwuazgvJeSui0A93WOF0/i
FL2wIw++6zQE20n9Dv14evBdsK53TE2/V+67T+Xzd+rdfv94pP9kP/huv/fc
9nuYEyXvg793Wr+88eImvXp5A5hV45t37kP/VPcdvVfvfHDDnc2Oe/JP9ltu
9YRnMaNdc4cxDx3Z3aYxhvRXgSLl3cVp77lGUm4LDdWxdVeL0h0r0pS0X3CR
KMdru5Jq63pKQG9vKETWNMivgCWPK3+fltgieRZLsf2uogbGEzIuFNpdiRg+
T2oUH78wHaf2ozuYyVtCx2OwVqbQizYBK9QYjlHSWFYeR59wrG/dCk4tTPEk
AR4Du3VrH4MbnrsfyqK5zjG8pQ3RL7//huEh5zNejOSGQ2eHrL5BoVQKcVqM
oA5eXigXXYnJnkJ/8QBd9xQkmWq6ihjtv6tBhWWGD6Jb81AmM6cO8VRPVYIH
4fvALx/GxyjIRAQ6OEx69FY6Cckorg9s2DS6nPKDCKr04Ip5mjNToHMiUY8p
hXh3rH0kMc3uSZCMM7ZaCR2e9OhKvxFqCHSKo08I86DvN//3H/+JB4AD+IYA
DE8bVKvcYnQFNmuKUwQHmnj4jVCHvBKNMZYjBOrpRghyXcZyS4LRSdN312M/
1TfwXj9xZFz07CmZCooVAXNgwJ/KGILTY71NBFtDR5JHLjlDMnwGpOBswVPp
GA+QuGh/V02EW9a/EmzLowqayimM8F5Sf9ck0IR5IGJjx+cBtVG7uOR9488H
gjefk/1FKyt8QSsls0gVzKanv7o7hJHFnk8P+KZKurNX7qyC3msGk9ATnmR6
+ug5/R+8HFKtAKVEn3BilvY6fgC3fNrwxMKycI7TNR0bP3TR5M7LoG2xBmSW
q1qp+CQgqNtYyQXAtpP+BxRE8bAEz37jmDJF/PSI3fCd0xt18Tbx2LstCqaK
GiWYWlcY/0HTk8lN+ZhcDQo64SsztwSHDjHzRbhStxHfgsv3+pbzXEQUhTuw
AlTLsq14h26HFRfXXaoOlrHnoYlpCnr3Pr+7UrS7MjWhIIFrpNhW0gkLK1d9
0q2efAAOv/xZPITQBIozw3ZZoiYXVVyY31RVgQdbK0oA0ZIe35LrsGNLnQuf
d/d4I9v5h1YGAwK5xbtNEzpua9fuQAr9CgYZK/oxA43xnGKCkHb67dPnd+58
dfjyyeT255Pbt+/99rO7v733xe8+/93k7m/h37t36LRgB+mccFmJXDpxYi/X
+cy1wTwmVs5EpK8w/g3wnoIZfLE55ZiWVUGMGtqxif7W1YO5aibhYry8Dd0J
VHVEAzELeXeteHz6tn9bQ+augCONi44jOokS1Qg7K8cZln5kgzeMX2pBlWcz
NDoXJkHdDNsdsRme9aB4CTqNzg8Ll+pOXaju1EV363pg7xOHhOS66QrrW1zS
NiyDcCcdRfnJtl4GqaK06k77dwny+Rhghd3F0OpjgVVnM3vQ6nrAKgxP4om5
Pq7qoaqQnldiq92U9YjqMmzhEBa2E0OZ6SlinoHTZkiHb7jFPxdZMYV24avr
sttO2Hkl3JLtj4PXyBm4HA+B+E6GrvbvejDNXaZCaMlxS259cem1ENs1oFrS
DIAzEgAyR1R0EgIvLDxhhdiAjSjpIF4KTyZywCVpLlE9A5WQo6jMMyyABZyQ
o5JE31k0Md0/G/32Ay8iPOqMJ7nD85MSSmArSLdwdzYE7yTwQTeqBFxV5xxU
zK0KxucC71yuwseLPLT8+Ah+YH5am7Tx93IEP0BAAdAn0xfTgcjn9lXsZUUz
x3wPTAabQfvvv8drmh/tI0Kg2mZ4ZpHbBuNSCCu+g4U+pvLQ8HxwP/iD0Kh/
RAKrcj4JlyQBRA5rdtFp6A7EGnYMuQrP74+UL3GNIpFUbJpY5AlM8stFI87Q
mBK8cgDpE/3DD/wLJzPgWSTQU2L+J9a2mJy4hdgeoGThXHz+eQa8WoOqQlc5
wqPwtzeAOecYh+6itpQYfvs2CCqP02gDqELEaF8RTImWBHWfOxnfr84VXxJt
CKqRMLIXVMn7m5V8MdEtiSHmIQSGne4DVQSnTrfLL7kwnnTVkrof9Q3IH9xK
M8JsDtdSwXRvJDcH0x6oUnC7+DQC2NBFgqtwYWx3m0l4vJb13Y0Zd7iVlqP5
ZYMZ1O5Q71BFlh6uyErotDjRlwpHioSuPoX9W3ItI+Xcis1NKi5LXdKIOdX9
LID8HhCKl9Jb/OoSnA7t+/ukut9Ywmr4xFJJJG4iHZjW0b1XogOCHyE6T/LC
jczJlJgNYPNJf1Gsrkumdb+0A2PRIrufrQruCULb4h0LNkDgEElVfOlvNULf
QsoufIEckDLLM8xBgHu7oo5A7Isgj8XnDfItevLhRn+XVB6Ec+hJognV4cAX
vr4p+M0ZKlMxKbh2LnzD1bm9W37ZbCVkP91lt6kvaiXVxKSTm8QS99sM/kBI
T2ytWPdABqj23gfj6RIP6pjv4JmZQPPBOi/wMGkpyp1/RwlnF/BEyFF0N1Eo
2VHBXsAGfN/0gPL2yt0LvvyWkPiqrgZOSkc4Ei+/TFJsnAVi9E6tL2CI/T5Z
0HXvmwPCWbvTg3/9Mk72/vVBZz8cK/kUFGzW9tIuHE/Jz1ts2xWGDgOSyveR
+WBPdCFc+BMdoc2Z4YEly4WBDgBsPqklq0b7vmSfL/qhDkp49uqX2jI8Iqm0
BxWUYk/dbc70+0zq7T7Hl0z21R79suTeezD3Lw9fgqPi732Glv8PFWtv/itz
AAA=

-->

</rfc>
