<?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-mahy-mls-gce-diff-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="MLS GroupContext diffs">Efficient Updates to Messaging Layer Security GroupContext Extension</title>
    <seriesInfo name="Internet-Draft" value="draft-mahy-mls-gce-diff-00"/>
    <author fullname="Richard Barnes">
      <organization>Cisco</organization>
      <address>
        <email>rlb@ipv.sx</email>
      </address>
    </author>
    <author fullname="Rohan Mahy">
      <organization>Rohan Mahy Consulting Services</organization>
      <address>
        <email>rohan.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="21"/>
    <area>Security</area>
    <workgroup>Messaging Layer Security</workgroup>
    <keyword>GroupContext</keyword>
    <keyword>GroupContextExtensions</keyword>
    <keyword>diffs</keyword>
    <keyword>efficient diffs</keyword>
    <abstract>
      <?line 42?>

<t>The Messaging Layer Security (MLS) protocol allows the members of the group to agree on a set of GroupContext extensions.
MLS includes a mechanism to do a wholesale replacements of all GroupContext extensions,
but not to modify individual extensions. In this document, we define a mechanism
that allows implementations to add, update, and remove each element of the
GroupContext individually. This also makes it practical for applications
using MLS to exploit this feature of MLS to ensure that the group members
are in agreement on the state of the application in addition to MLS-related state.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://rohanmahy.github.io/mls-gce-diff/draft-mahy-mls-gce-diff.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-mahy-mls-gce-diff/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Messaging Layer Security 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/rohanmahy/mls-gce-diff"/>.</t>
    </note>
  </front>
  <middle>
    <?line 52?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Messaging Layer Security (MLS) allows a group of clients to authenticate each
other and establish shared secret state <xref target="RFC9420"/>.  One of the primary
security benefits of MLS is that the MLS key schedule confirms that the group
agrees on certain metadata, such as the membership of the group. Members that
disagree on the relevant metadata will arrive at different keys and be unable to
communicate. Applications based on MLS can integrate their state into this
metadata in order to confirm that the members of an MLS group agree on
application state as well as MLS metadata.</t>
      <t>Unfortunately this state can only be modified using the
GroupContextExtensions Proposal, which needs to include the entire
GroupContext. This may include dozens of individual extensions and may be
quite large. MLS clients should be able to modify orthogonal aspects of the
GroupContext in separate Proposals and should not need to send large
amounts of data for a small change.</t>
      <t>Here, we define a new MLS proposal type GroupContextExtensionsDiff. This proposal type allows modification on a per extension basis. It also allows GroupContext extensions to define simple diff formats (for example, to add, remove, and update elements in a list or items in a map).</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>This document uses terms from <xref target="RFC9420"/>. Some are similar or may be
confusing, so they are summarized here:</t>
      <ul spacing="normal">
        <li>
          <t>GroupContext: The state of the group agreed on in a given epoch</t>
        </li>
        <li>
          <t>GroupContext extension: A (type, value) tuple included in the GroupContext</t>
        </li>
        <li>
          <t>ExtensionType: A two-byte identifier for the type of a GroupContext extension</t>
        </li>
        <li>
          <t>GroupContextExtensions proposal: A proposal to remove all of the extensions in the group's GroupContext and replace them with a new set of GroupContext extensions</t>
        </li>
      </ul>
      <t>Currently, the GroupContextExtensions proposal is the only mechanism defined for updating a group's GroupContext extensions.</t>
    </section>
    <section anchor="groupcontextdiff">
      <name>GroupContextDiff</name>
      <t>This document defines a new GroupContextExtensionsDiff proposal. It
is not a Safe Extension as defined in <xref section="2" sectionFormat="of" target="I-D.ietf-mls-extensions"/>, because it can modify any GroupContext
extension, including those defined in <xref target="RFC9420"/>.
The GroupContextExtensionsDiff proposal requires an UpdatePath,
and may be sent by an authorized external sender.</t>
      <sourcecode type="tls"><![CDATA[
enum {
    remove(0),
    add(1),
    replace(2),
    diff(3),
    (255)
} OperationType;

uint8 DiffType;

struct {
    /* MUST be a GroupContext extension */
    ExtensionType extension_type;
    OperationType operation;
    select (operation) {
        case remove:
            struct {};
        case add:
            opaque extension_data<V>;
        case replace:
            opaque extension_data<V>;
        case diff:
            opaque diff_data<V>;
    };
} ExtensionDiff;

struct {
    ExtensionDiff group_context_extension_diffs<V>;
} GroupContextExtensionsDiff;
]]></sourcecode>
      <t>The semantics of OperationType are as follows:</t>
      <ul spacing="normal">
        <li>
          <t><tt>remove</tt> means that the GroupContext extension was present, and will be
completely absent from the GroupContext.</t>
        </li>
        <li>
          <t><tt>add</tt> means that the GroupContext extension was absent, and will be
present with the value provided in <tt>extension_data</tt>.</t>
        </li>
        <li>
          <t><tt>replace</tt> means that the GroupContext extension was present and will
be completely replaced with the new value in <tt>extension_data</tt></t>
        </li>
        <li>
          <t><tt>diff</tt> means that the GroupContext extension will be modified according
to the diff format defined by that extension. (Two concrete diff formats are
defined in <xref target="diff-formats"/> which extension designers are free to use or
not use.)</t>
        </li>
      </ul>
      <t>A single GroupContextExtensionsDiff proposal can contain changes to multiple
extensions. Likewise a single Commit can include multiple
GroupContextExtensionsDiff proposals, however a single Commit <bcp14>MUST NOT</bcp14>
include multiple GroupContextExtensionsDiff proposals which refer to the
same ExtensionType. A GroupContextExtensions proposal <bcp14>MUST NOT</bcp14> appear in a
commit with any GroupContextExtensionsDiff proposal.</t>
      <t>The motivation for allowing multiple extensions in a single
GroupContextExtensionsDiff proposal is to allow a client to modify multiple
extensions in a single "transaction". A common example of this is to add a
GroupContext extension while also adding that extension to the
<tt>required_capabilities</tt> GroupContext extension.</t>
      <t>A proposal which removes a GroupContext extension that is present in the
<tt>required_capabilities</tt> list is invalid. Adding a required capability that is
not supported by all group members is already forbidden by <xref target="RFC9420"/>.</t>
      <t><strong>TODO</strong>: Fix the below</t>
      <ul empty="true">
        <li>
          <t>There's nothing in MLS that says that there can only be one extension per ExtensionType in the GroupContext. If there were duplicates, this would be ambiguous. Could fix this with something dumb like (a) defining a noop OperationType and (b) saying that the n-th ExtensionDiff of a given type affects the n-th entry. That has the benefit of degrading to the normal thing in the sane case.</t>
        </li>
      </ul>
    </section>
    <section anchor="diff-formats">
      <name>Diff Formats</name>
      <t>The following two subsections define two Diff Formats for very common
data structures.</t>
      <t>Both of the Diff Formats defined below use the following struct for an
opaque byte string.</t>
      <sourcecode type="tls"><![CDATA[
struct {
  opaque element<V>;
} OpaqueElement;
]]></sourcecode>
      <section anchor="map-diff-format">
        <name>Map Diff Format</name>
        <t>This Diff Format logically represents a map or dictionary that is not
allowed to have duplicate map keys.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque elementName<V>;
  opaque elementValue<V>;
} OpaqueMapElement;

struct {
      OpaqueElement removedKeys<V>;
      OpaqueMapElement newOrUpdatedElements<V>;
} MapDiff;
]]></sourcecode>
        <t>A diff using this format first removes all the keys in <tt>removedKeys</tt> and
than replaces or adds the elements in <tt>newOrUpdatedElements</tt>.</t>
        <t>Removing a non-existant map key renders the diff and its proposal invalid.</t>
      </section>
      <section anchor="list-diff-format">
        <name>List Diff Format</name>
        <t>This Diff Format logically represents changes to an ordered list.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  uint32 index;
  opaque element<V>;
} ElementWithIndex;

struct {
  ElementWithIndex replacedElements<V>;
  uint32 removedIndices<V>;
  ElementWithIndex insertedElements<V>;
  OpaqueElement appendedEntries<V>;
} ListDiff;
]]></sourcecode>
        <t>A diff using this format first replaces all the elements (index-by-index) in
<tt>replacedElements</tt>, then the removes the elements in <tt>removedIndices</tt>
according to the then order of the array, then inserts all the elements in
<tt>insertedElements</tt> according to the then order of the array, then
finally appends the <tt>appendedEntries</tt> (in order). All indices are zero-based.</t>
        <t>For the avoidance of doubt, two insertedElements with the same index will
cause the second inserted element to be <em>before</em> the first inserted element.</t>
        <t>Attempting to insert or replace at a non-existing index renders the diff
and its proposal invalid.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The mechanism defined in this document provides strong authenticity, integrity,
and change control properties to the state information it manages.
No unauthorized parties can make changes to the GroupContext, and the
identity of the group member making each change is authenticated.</t>
      <t>The data synchronized via this mechanism may or may not be confidential to
the group, depending on whether the GroupContextExtensionsDiff proposal is
sent as
an MLS PublicMessage or PrivateMessage.  As with application data, applications
should generally prefer the use of Private Message.  There may be cases,
however, where it is useful for intermediaries to inspect application state
updates, e.g., to enforce policy.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="groupcontextextensiondiff-proposal">
        <name>GroupContextExtensionDiff Proposal</name>
        <t>The <tt>gce_diff</tt> MLS Proposal Type is used to update Group Context Extensions
in a group more efficiently than using a <tt>group_context_extensions</tt> proposal
type. The <tt>gce_diff</tt> type is updating rather than replacing the extensions.</t>
        <ul spacing="normal">
          <li>
            <t>Value: 0x000d</t>
          </li>
          <li>
            <t>Name: gce_diff</t>
          </li>
          <li>
            <t>Recommended: Y</t>
          </li>
          <li>
            <t>External: Y</t>
          </li>
          <li>
            <t>Path Required: Y</t>
          </li>
        </ul>
      </section>
      <section anchor="change-to-the-mls-extension-types-registry">
        <name>Change to the MLS Extension Types registry</name>
        <t>This document adds a "Diff" column to the MLS Extension Types registry. In
the registration template this will be referred to as "Diff Type". The value
value can be "-" indicating no Diff Types are supported, or a value present
in the GroupContext Diff Types registry.</t>
      </section>
      <section anchor="groupcontext-diff-types-registry">
        <name>GroupContext Diff Types registry</name>
        <t>The "MLS GroupContext Diff Types" registry lists identifiers for types of
difference algorithms to be applied to GroupContext extension data. The
diff type field is one byte wide, so valid values are in the range 0x00 to
0xFF.</t>
        <t>Template:</t>
        <ul spacing="normal">
          <li>
            <t>Value: The numeric value of the diff type</t>
          </li>
          <li>
            <t>Name:  The name of the diff type</t>
          </li>
          <li>
            <t>Recommended: Same as in Section 17.1 of <xref target="RFC9420"/></t>
          </li>
          <li>
            <t>Reference: The document where this extensions is defined</t>
          </li>
        </ul>
        <t>Initial contents:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">R</th>
              <th align="left">Ref</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x00</td>
              <td align="left">reserved</td>
              <td align="left">-</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x01</td>
              <td align="left">list</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x02</td>
              <td align="left">map</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <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="I-D.ietf-mls-extensions">
        <front>
          <title>The Messaging Layer Security (MLS) Extensions</title>
          <author fullname="Raphael Robert" initials="R." surname="Robert">
            <organization>Phoenix R&amp;D</organization>
          </author>
          <date day="21" month="October" year="2024"/>
          <abstract>
            <t>   This document describes extensions to the Messaging Layer Security
   (MLS) protocol.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/mlswg/mls-extensions.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-05"/>
      </reference>
    </references>
    <?line 311?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <ul empty="true">
        <li>
          <t><strong>TODO:</strong> Acknowledgements.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
cIftC+5sTPb2Ogs4lRqL/wNxCYuvlSoAAA==

-->

</rfc>
