<?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.17 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-barnes-mls-appsync-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="MLS AppSync">Using Messaging Layer Security to Synchronize Application State</title>
    <seriesInfo name="Internet-Draft" value="draft-barnes-mls-appsync-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="July" day="07"/>
    <area>Security</area>
    <workgroup>Messaging Layer Security</workgroup>
    <keyword>messaging layer security</keyword>
    <keyword>end-to-end encryption</keyword>
    <abstract>
      <?line 40?>

<t>One feature that the Messaging Layer Security (MLS) protocol provides is that it
allows the members of a group to confirm that they agree on certain data.  In
this document, we define a mechanism 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.  We define a GroupContext
extension that captures the state of the application and an AppSync proposal
that can be used to update the application 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://bifurcation.github.io/mls-appsync/draft-barnes-mls-appsync.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-barnes-mls-appsync/"/>.
      </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/bifurcation/mls-appsync"/>.</t>
    </note>
  </front>
  <middle>
    <?line 50?>

<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>Here, we define two extensions to MLS to facilitate this application design:</t>
      <ol spacing="normal" type="1"><li>
          <t>A GroupContext extension <tt>application_states</tt> that confirms agreement on
application state from potentially multiple sources.</t>
        </li>
        <li>
          <t>A new proposal type AppSync that allows MLS group members to propose changes
to the agreed application state.</t>
        </li>
      </ol>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="application-state-synchronization">
      <name>Application State Synchronization</name>
      <t>This document defines a new AppSync proposal. AppSync is a Safe Extension as
defined in <xref section="2" sectionFormat="of" target="I-D.ietf-mls-extensions"/>, of type
<tt>extension_external_proposal</tt>.</t>
      <t>The <tt>application_states</tt> extension allows the application to inject state
objects into the MLS key schedule. Changes to this state can be made out of
band, or using the AppSync proposal. Using the AppSync proposal ensures that
members of the MLS group have received the relevant state changes before they
are reflected in the group's <tt>application_states</tt>.</t>
      <ul empty="true">
        <li>
          <t><strong>NOTE:</strong> This design exposes the high-level structure of the application state
to MLS.  An alternative design would be to have the application state be opaque
to MLS.  There is a trade-off between generality and the complexity of the API
between the MLS implementation and the application.  An opaque design would give
the application more freedom, but require the MLS stack to call out to the
application to get the updated state as part of Commit processing.  This design
allows the updates to happen within the MLS stack, so that no callback is
needed, at the cost of forcing the application state to fit a certain structure.
It also potentially can result in smaller state updates in large groups.</t>
        </li>
      </ul>
      <t>The state for Each <tt>applicationId</tt> in the <tt>application_states</tt> needs to conform
to one of four basic types: an ordered array, an unordered array, a map, or an
irreducible blob. This allows the AppSync proposal to efficiently modify a large
application state object.</t>
      <t>The content of the <tt>application_states</tt> extension and the <tt>AppSync</tt> proposal are
structured as follows:</t>
      <figure anchor="fig-app-state">
        <name>The `application_state` extension</name>
        <sourcecode type="tls"><![CDATA[
enum {
    irreducible(0),
    map(1),
    unorderedList(2),
    orderedArray(3),
    (255)
} StateType;

struct {
  opaque element<V>;
} OpaqueElement;

struct {
  opaque elementName<V>;
  opaque elementValue<V>;
} OpaqueMapElement;

struct {
  uint32 applicationId;
  StateType stateType;
  select (stateType) {
    case irreducible:
      OpaqueElement state;
    case map:
      OpaqueMapElement mapEntries<V>;
    case unorderedList:
      OpaqueElement unorderedEntries<V>;
    case orderedArray:
      OpaqueElement orderedEntries<V>;
  };
} ApplicationState;

struct {
  ApplicationState applicationStates<V>;
} ApplicationStatesExtension;
]]></sourcecode>
      </figure>
      <figure anchor="fig-app-sync">
        <name>The AppSync proposal type</name>
        <sourcecode type="tls"><![CDATA[
struct {
  uint32 index;
  opaque element<V>;
} ElementWithIndex;


struct {
  uint32 applicationId;
  StateType stateType;
  select (stateType) {
    case irreducible:
      OpaqueElement newState;
    case map:
      OpaqueElement removedKeys<V>;
      OpaqueMapElement newOrUpdatedElements<V>;
    case unorderedList:
      uint32 removedIndices<V>;
      OpaqueElement addedEntries<V>;
    case orderedArray:
      ElementWithIndex replacedElements<V>;
      uint32 removedIndices<V>;
      ElementWithIndex insertedElements<V>;
      OpaqueElement appenededEntries<V>;
  };
} AppSync;
]]></sourcecode>
      </figure>
      <t>The <tt>applicationId</tt> determines the structure and interpretation of the contents.
of an ApplicationState object. AppSync proposals
contain changes to this state, which the client uses to update the
representation of the state in <tt>application_states</tt>.</t>
      <t>A client receiving an AppSync proposal applies it in the following way:</t>
      <ul spacing="normal">
        <li>
          <t>Identify an <tt>application_states</tt> GroupContext extension which contains the
same <tt>application_id</tt> state as the AppSync proposal</t>
        </li>
        <li>
          <t>Apply the relevant operations (replace, remove, update, append, insert)
according to the <tt>stateType</tt> to the relevant parts of the ApplicationState
object in <tt>application_states</tt> extension.</t>
        </li>
      </ul>
      <t>An AppSync for an irreducible state replaces its <tt>state</tt> element with a new
(possibly empty) <tt>newState</tt>. An AppSync for a map-based ApplicationState first
removes all the keys in <tt>removedKeys</tt> and than replaces or adds the elements in
<tt>newOrUpdatedElements</tt>. An AppSync for an unorderedList ApplicationState first
removes all the indexes in <tt>removedIndices</tt>, then adds the elements in
<tt>addedEntries</tt>. Finally an AppSync for an orderedArray, replaces all the
elements (index-by-index) in <tt>replacedElements</tt>, 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>Note that the <tt>application_states</tt> extension is updated directly by AppSync
proposals; a GroupContextExtensions proposal is not necessary. A proposal list
that contains both an AppSync proposal and a GroupContextExtensions proposal
is invalid.</t>
      <t>Likewise a proposal list in a Commit <bcp14>MAY</bcp14> contain more than one AppSync proposal,
but no more than one AppSync proposal per <tt>applicationId</tt>. The proposals are
applied in the order that they are sent in the Commit.</t>
      <t>AppSync proposals do not need to contain an UpdatePath. An AppSync proposal can
be sent by an authorized external sender.</t>
    </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 application state information it manages.
Nobody outside the group can make changes to the application state, and the
identity of the group member making each change is authenticated.</t>
      <t>The application data synchronized via this mechanism may or may not be
confidential to the group, depending on whether the AppSync 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>
      <ul empty="true">
        <li>
          <t><strong>TODO:</strong> Register new extension and proposal types.</t>
        </li>
      </ul>
      <ul empty="true">
        <li>
          <t><strong>TODO:</strong> IANA registry for <tt>application_id</tt>; register extension and proposal types
as safe extensions</t>
        </li>
      </ul>
    </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="24" month="April" 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-04"/>
      </reference>
    </references>
    <?line 247?>

<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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
UwzjpVUl6cGTOISNwYfysrjW1q/SaI8++MC1rjrXC49U1QiS8eSW4QCYUhWf
bKOtWBNin+/cHZy3fdQmyoFWqSkN00FPmC01K5uPObDHYkvUh6pEk68NhUu6
YnhsO6ZI/WscqknoS/VebpSlK47elq4hF8+gV2c/xd39Gdh5Gh2hdlkYMzoV
43T5+9M4ouNu6qNTk2xzkzuc+PjfND5C/7u9j8IelHrid88uhbPdTMczHXTs
L1iiNODPR4I3olr2YkDDKo6sLAn7JM4h/b2j+hWkYpeLPoM31/VtblzoQlBl
MQ/4fN9ehnU6bf2ea3NZh+SvKTHGWxnQHIf7AnpkZG6fuZ08xl/0QbWVirl8
6NTeXDMSjOlAUYoFNcmvdaKzLTUtiOvOHRsd2gvxXvbLhAHS43jYZMol5bZF
0+2oEy3ycbpgivzTcblz+ZSFk27vQoEuQWz7RwEZXyvhVdcqtRBbCvz0Q+ZO
JHMXCZlvQETGHTdjWIBCBbHiygHp7roGj+tUErmC0LJwvfKmTsCZv2wjYPI3
Rq3BeRih1pINSXFHhnHvCpTZpe84+UYXogjKqXngo7auSRFI85a275mRlIl0
RbQds6XeyLU0VLW5hlrlYpSV8zp3qcMVj4XMlDABHoglKyoQ9ht+oRUz5nK6
mI797Su1guCfGlO3DucXZ9dnexin5uPdzasbaj6+lQtEEshCneh+Q6JXDNtp
f50jbNxis3W871Zkz8Nn0P49uuwF3SJQj7ttV/vbU2p8ufZ6+r7Um1xmC5eC
UMj7v/uQ2dejOeKGHN33eWsX+KQ1Zf8DUWSfnNYiAAA=

-->

</rfc>
