<?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.23 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mls-extensions-06" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.27.0 -->
  <front>
    <title abbrev="MLS">The Messaging Layer Security (MLS) Extensions</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-06"/>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2025" month="February" day="20"/>
    <area>Security</area>
    <workgroup>Messaging Layer Security</workgroup>
    <keyword>messaging layer security</keyword>
    <keyword>end-to-end encryption</keyword>
    <keyword>application api</keyword>
    <keyword>extension</keyword>
    <keyword>extensibility</keyword>
    <abstract>
      <?line 55?>

<t>The Messaging Layer Security (MLS) protocol is an asynchronous group
authenticated key exchange protocol.  MLS provides a number of capabilities
to applications, as well as several extension points internal to the protocol.  This
document provides a consolidated application API, guidance for how the
protocol's extension points should be used, and a few concrete examples of both
core protocol extensions and uses of the application API.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://mlswg.github.io/mls-extensions/draft-ietf-mls-extensions.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-mls-extensions/"/>.
      </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/mlswg/mls-extensions"/>.</t>
    </note>
  </front>
  <middle>
    <?line 64?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document defines extensions to MLS <xref target="RFC9420"/> that are not part of the
main protocol specification, and uses them to explain how to extend the
core operation of the MLS protocol. It also describes how applications can
safely interact with the MLS to take advantage of security features of MLS.</t>
      <t>The MLS protocol is designed to be integrated into applications, in order to
provide security services that the application requires.  There are two
questions to answer when designing such an integration:</t>
      <ol spacing="normal" type="1"><li>
          <t>How does the application provide the services that MLS requires?</t>
        </li>
        <li>
          <t>How does the application use MLS to get security benefits?</t>
        </li>
      </ol>
      <t>The MLS Architecture <xref target="I-D.ietf-mls-architecture"/> describes the requirements
for the first of these questions, namely the structure of the Delivery Service
and Authentication Service that MLS requires. The next section of this document
focuses on the second question.</t>
      <t>MLS itself offers some basic functions that applications can use, such as the
secure message encapsulation (PrivateMessage), the MLS exporter, and the epoch
authenticator.  Current MLS applications make use of these mechanisms to acheive
a variety of confidentiality and authentication properties.</t>
      <t>As application designers become familiar with MLS, there is
interest in leveraging other cryptographic tools that an MLS group provides:</t>
      <ul spacing="normal">
        <li>
          <t>HPKE (Hybrid Public Key Encryption <xref target="RFC9180"/>) and signature key pairs for
each member, where the private key is known only to that member, and the
public key is authenticated to the other members.</t>
        </li>
        <li>
          <t>A pre-shared key mechanism that can allow an application to inject data into
the MLS key schedule.</t>
        </li>
        <li>
          <t>An exporter mechanism that allows applications to derive secrets from the MLS
key schedule.</t>
        </li>
        <li>
          <t>Association of data with Commits as a synchronization mechanism.</t>
        </li>
        <li>
          <t>Binding of information to the GroupContext to confirm group agreement.</t>
        </li>
      </ul>
      <t>There is also interest in exposing an MLS group to multiple loosely-coordinated
components of an application.  To accommodate such cases, the above mechanisms
need to be exposed in such a way that the usage of different components do not
conflict with each other, or with MLS itself.</t>
      <t>This document defines a set of mechanisms that application components can use to
ensure that their use of these facilities is properly domain-separated from MLS
itself, and from other application components that might be using the same MLS
group.</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 makes heavy use of the terminology and the names of structs in the
MLS specification <xref target="RFC9420"/>.  In addition, we introduce the following new terms:</t>
      <dl>
        <dt>Application:</dt>
        <dd>
          <t>The system that instantiates, manages, and uses an MLS group.  Each MLS group
is used by exactly one application, but an application may maintain multiple
groups.</t>
        </dd>
        <dt>Application component:</dt>
        <dd>
          <t>A subsystem of an application that has access to an MLS group.</t>
        </dd>
        <dt>Component ID:</dt>
        <dd>
          <t>An identifier for an application component.  These identifiers are assigned by
the application.</t>
        </dd>
      </dl>
    </section>
    <section anchor="developing-extensions-for-the-mls-protocol">
      <name>Developing Extensions for the MLS Protocol</name>
      <t>MLS is highly extensible, and was designed to be used in a variety of different
applications. As such, it is important to separate extensions that change the
behavior of an MLS stack, and application usages of MLS that just take advantage
of features of MLS or specific extensions (hereafter referred to as <em>components</em>). Furthermore it is essential that application components do not change the security properties of MLS or require new security analysis of the MLS protocol itself.</t>
    </section>
    <section anchor="the-safe-application-interface">
      <name>The Safe Application Interface</name>
      <t>The mechansms in this section take MLS mechanisms that are either not
inherently designed to be used by applications, or not inherently designed to be
used by multiple application components, and adds a domain separator that
separates application usage from MLS usage, and application components' usage
from each other:</t>
      <ul spacing="normal">
        <li>
          <t>Public-key encryption operations are tagged so that encrypted data
will only decrypt in the context of a given component.</t>
        </li>
        <li>
          <t>Signing operations are similarly tagged so that signatures will only verify
in the context of a given component.</t>
        </li>
        <li>
          <t>Exported values include an identifier for the component to which they are
being exported, so that different components will get different exported
values.</t>
        </li>
        <li>
          <t>Pre-shared keys are identified as originating from a specific component, so
that differnet components' contributions to the MLS key schedule will not
collide.</t>
        </li>
        <li>
          <t>Additional Authenticated Data (AAD) can be domain separated by component.</t>
        </li>
      </ul>
      <t>Similarly, the content of application messages (<tt>application_data</tt>) can be
distinguished and routed to different parts of an application according to
the media type of that content using the content negotiation mechanism defined
in <xref target="content-advertisement"/>.</t>
      <t>We also define new general mechanisms that allow applications to take advantage
of the extensibility mechanisms of MLS without having to define extensions
themselves:</t>
      <ul spacing="normal">
        <li>
          <t>An <tt>app_data_dictionary</tt> extension type that associates application data with
MLS messages, or with the state of the group.</t>
        </li>
        <li>
          <t>An AppEphemeral proposal type that enables arbitrary application data to
be associated to a Commit.</t>
        </li>
        <li>
          <t>An AppDataUpdate proposal type that enables efficient updates to
an <tt>app_data_dictionary</tt> GroupContext extension.</t>
        </li>
      </ul>
      <t>As with the above, information carried in these proposals and extension marked
as belonging to a specific application component, so that components can manage
their information independently.</t>
      <t>The separation between components is acheived by the application assigning each
component a unique component ID number.  These numbers are then incorporated
into the appopriate calculations in the protocol to achieve the required
separation.</t>
      <section anchor="component-ids">
        <name>Component IDs</name>
        <t>A component ID is a four-byte value that uniquely identifies a component within
the scope of an application.</t>
        <artwork><![CDATA[
uint32 ComponentID;
]]></artwork>
        <ul empty="true">
          <li>
            <t>TODO: What are the uniqueness requirements on these?  It seems like the more
diversity, the better.  For example, if a ComponentID is reused across
applications (e.g., via an IANA registry), then there will be a risk of replay
across applications.  Maybe we should include a binder to the group/epoch as
well, something derived from the key schedule.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>TODO: It might be better to frame these in terms of "data types" instead of
components, to avoid presuming software architecture.  Though that makes less
sense for the more "active" portions of the API, e.g., signing and encryption.</t>
          </li>
        </ul>
        <t>When a label is required for an operation, the following data structure is used.
The <tt>label</tt> field identifies the operation being performed.  The <tt>component_id</tt>
field identifies the component performing the operation.  The <tt>context</tt> field is
specified by the operation in question.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque label<V>;
  ComponentID component_id;
  opaque context<V>;
} ComponentOperationLabel;
]]></sourcecode>
      </section>
      <section anchor="safe-hpke">
        <name>Hybrid Public Key Encryption (HPKE) Keys</name>
        <t>This component of the API allows components to make use of the HPKE key pairs
generated by MLS. A component identified by a ComponentID can use any HPKE
key pair for any operation defined in <xref target="RFC9180"/>, such as encryption,
exporting keys and the PSK mode, as long as the <tt>info</tt> input to <tt>Setup&lt;MODE&gt;S</tt>
and <tt>Setup&lt;MODE&gt;R</tt> is set to ComponentOperationLabel with <tt>component_id</tt> set
to the appopriate ComponentID. The <tt>context</tt> can be set to an arbitrary Context
specified by the application designer and can be empty if not needed. For
example, a component can use a key pair PublicKey, PrivateKey to encrypt data
as follows:</t>
        <sourcecode type="tls"><![CDATA[
SafeEncryptWithContext(ComponentID, PublicKey, Context, Plaintext) =
  SealBase(PublicKey, ComponentOperationLabel, "", Plaintext)

SafeDecryptWithContext(ComponentID, PrivateKey, Context,
  KEMOutput, Ciphertext) = OpenBase(KEMOutput, PrivateKey,
                             ComponentOperationLabel, "", Ciphertext)
]]></sourcecode>
        <t>Where the fields of ComponentOperationLabel are set to</t>
        <sourcecode type="tls"><![CDATA[
label = "MLS 1.0 Application"
component_id = ComponentID
context = Context
]]></sourcecode>
        <ul empty="true">
          <li>
            <t>TODO: Should this use EncryptWithLabel / DecryptWithLabel?  That wouldn't
cover other modes / exports, but you could say "mutatis mutandis".</t>
          </li>
        </ul>
        <t>For operations involving the secret key, ComponentID <bcp14>MUST</bcp14> be set to the
ComponentID of the component performing the operation, and not to the ID of
any other component. In particular, this means that a component cannot decrypt
data meant for another component, while components can encrypt data that other
components can decrypt.</t>
        <t>In general, a ciphertext encrypted with a PublicKey can be decrypted by any
entity who has the corresponding PrivateKey at a given point in time according
to the MLS protocol (or application component). For convenience, the following
list summarizes lifetimes of MLS key pairs.</t>
        <ul spacing="normal">
          <li>
            <t>The key pair of a non-blank ratchet tree node. The PrivateKey of such a key pair
is known to all members in the node’s subtree. In particular, a PrivateKey of a
leaf node is known only to the member in that leaf. A member in the subtree
stores the PrivateKey for a number of epochs, as long as the PublicKey does not
change. The key pair of the root node <bcp14>SHOULD NOT</bcp14> be used, since the external key
pair recalled below gives better security.</t>
          </li>
          <li>
            <t>The external_priv, external_pub key pair used for external initialization. The
external_priv key is known to all group members in the current epoch. A member
stores external_priv only for the current epoch. Using this key pair gives
better security guarantees than using the key pair of the root of the ratchet
tree and should always be preferred.</t>
          </li>
          <li>
            <t>The init_key in a KeyPackage and the corresponding secret key. The secret key
is known only to the owner of the KeyPackage and is deleted immediately after it
is used to join a group.</t>
          </li>
        </ul>
      </section>
      <section anchor="signature-keys">
        <name>Signature Keys</name>
        <t>MLS session states contain a number of signature keys including the ones in the
LeafNode structs. Application components can safely sign content and verify
signatures using these keys via the SafeSignWithLabel and SafeVerifyWithLabel
functions, respectively, much like how the basic MLS protocol uses SignWithLabel
and VerifyWithLabel.</t>
        <t>In more detail, a component identified by ComponentID should sign and verify
using:</t>
        <sourcecode type="tls"><![CDATA[
SafeSignWithLabel(ComponentID, SignatureKey, Label, Content) =
   SignWithLabel(SignatureKey, "ComponentOperationLabel",
      ComponentOperationLabel)

SafeVerifyWithLabel(ComponentID, VerificationKey, Label, Content,
  SignatureValue) = VerifyWithLabel(VerificationKey,
                      "ComponentOperationLabel",
                       ComponentOperationLabel,
                       SignatureValue)
]]></sourcecode>
        <t>Where the fields of ComponentOperationLabel are set to</t>
        <sourcecode type="tls"><![CDATA[
label = Label
component_id = ComponentID
context = Content
]]></sourcecode>
        <t>For signing operations, the ComponentID <bcp14>MUST</bcp14> be set to the ComponentID of the
component performing the signature, and not to the ID of any other component.
This means that a component cannot produce signatures in place of other
component. However, components can verify signatures computed by other
components. Domain separation is ensured by explicitly including the ComponentID
with every operation.</t>
      </section>
      <section anchor="exported-secrets">
        <name>Exported Secrets</name>
        <t>An application component can use MLS as a group key agreement protocol by
exporting symmetric keys.  Such keys can be exported (i.e. derived from MLS key
material) in two phases per epoch: Either at the start of the epoch, or during
the epoch. Derivation at the start of the epoch has the added advantage that the
source key material is deleted after use, allowing the derived key material to
be deleted later even during the same MLS epoch to achieve forward secrecy. The
following protocol secrets can be used to derive key from for use by application
components:</t>
        <ul spacing="normal">
          <li>
            <t><tt>exporter_secret</tt> at the beginning of an epoch</t>
          </li>
          <li>
            <t><tt>application_export_secret</tt> during an epoch</t>
          </li>
        </ul>
        <t>The <tt>application_export_secret</tt> is an additional secret derived from the
<tt>epoch_secret</tt> at the beginning of the epoch in the same way as the other
secrets listed in Table 4 of <xref target="RFC9420"/> using the label "application_export".</t>
        <t>Any derivation performed by an application component either from the
<tt>exporter_secret</tt> or the <tt>application_export_secret</tt> has to use the following
function:</t>
        <sourcecode type="tls"><![CDATA[
DeriveApplicationSecret(Secret, Label) =
  ExpandWithLabel(Secret, "ApplicationExport " +
                  ComponentID + " " + Label)
]]></sourcecode>
        <t>Where ExpandWithLabel is defined in <xref section="8" sectionFormat="of" target="RFC9420"/> and where
ComponentID <bcp14>MUST</bcp14> be set to the ComponentID of the component performing the
export.</t>
        <ul empty="true">
          <li>
            <t>TODO: This section seems over-complicated to me.  Why is it not sufficient to
just use the <tt>exporter_secret</tt>?  Or the <tt>MLS-Exporter</tt> mechanism with a
label structured to include the ComponentID?</t>
          </li>
        </ul>
      </section>
      <section anchor="pre-shared-keys-psks">
        <name>Pre-Shared Keys (PSKs)</name>
        <t>PSKs represent key material that is injected into the MLS key schedule when
creating or processing a commit as defined in <xref section="8.4" sectionFormat="of" target="RFC9420"/>. Its
injection into the key schedule means that all group members have to agree on
the value of the PSK.</t>
        <t>While PSKs are typically cryptographic keys which due to their properties add to
the overall security of the group, the PSK mechanism can also be used to ensure
that all members of a group agree on arbitrary pieces of data represented as
octet strings (without the necessity of sending the data itself over the wire).
For example, a component can use the PSK mechanism to enforce that all group
members have access to and agree on a password or a shared file.</t>
        <t>This is achieved by creating a new epoch via a PSK proposal. Transitioning to
the new epoch requires using the information agreed upon.</t>
        <t>To facilitate using PSKs in a safe way, this document defines a new PSKType for
application components. This provides domain separation between pre-shared keys
used by the core MLS protocol and applications, and between those used by
different components.</t>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  // ...
  application(3),
  (255)
} PSKType;

struct {
  PSKType psktype;
  select (PreSharedKeyID.psktype) {
    // ...
    case application:
      ComponentID component_id;
      opaque psk_id<V>;
  };
  opaque psk_nonce<V>;
} PreSharedKeyID;
]]></sourcecode>
        <ul empty="true">
          <li>
            <t>TODO: It seems like you could also do this by structuring the <tt>external</tt>
PSKType as (component_id, psk_id).  I guess this approach separates this API
from other external PSKs.</t>
          </li>
        </ul>
      </section>
      <section anchor="attaching-application-data-to-mls-messages">
        <name>Attaching Application Data to MLS Messages</name>
        <t>The MLS GroupContext, LeafNode, KeyPackage, and GroupInfo objects each have an
<tt>extensions</tt> field that can carry additional data not defined by the MLS
specification.  The <tt>app_data_dictionary</tt> extension provides a generic container
that applications can use to attach application data to these messages.  Each
usage of the extension serves a slightly different purpose:</t>
        <ul spacing="normal">
          <li>
            <t>GroupContext: Confirms that all members of the group agree on the application
data, and automatically distributes it to new joiners.</t>
          </li>
          <li>
            <t>KeyPackage and LeafNode: Associates the application data to a particular
client, and advertises it to the other members of the group.</t>
          </li>
          <li>
            <t>GroupInfo: Distributes the application data confidentially to the new joiners
for whom the GroupInfo is encrypted (as a Welcome message).</t>
          </li>
        </ul>
        <t>The content of the <tt>app_data_dictionary</tt> extension is a serialized
AppDataDictionary object:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
    ComponentID component_id;
    opaque data<V>;
} ComponentData;

struct {
    ComponentData component_data<V>;
} AppDataDictionary;
]]></sourcecode>
        <t>The entries in the <tt>component_data</tt> <bcp14>MUST</bcp14> be sorted by <tt>component_id</tt>, and there
<bcp14>MUST</bcp14> be at most one entry for each <tt>component_id</tt>.</t>
        <t>An <tt>app_data_dictionary</tt> extension in a LeafNode, KeyPackage, or GroupInfo can
be set when the object is created.  An <tt>app_data_dictionary</tt> extension in the
GroupContext needs to be managed using the tools available to update GroupContext extensions. The creator of the group can set extensions unilaterally. Thereafter, the AppDataUpdate proposal described in the next section is used to update the <tt>app_data_dictionary</tt> extension.</t>
      </section>
      <section anchor="appdataupdate">
        <name>Updating Application Data in the GroupContext</name>
        <t>Updating the <tt>app_data_dictionary</tt> with a GroupContextExtensions proposal is
cumbersome.  The application data needs to be transmitted in its entirety,
along with any other extensions, whether or not they are being changed.  And a
GroupContextExtensions proposal always requires an UpdatePath, which updating
application state never should.</t>
        <t>The AppDataUpdate proposal allows the <tt>app_data_dictionary</tt> extension to
be updated without these costs.  Instead of sending the whole value of the
extension, it sends only an update, which is interpreted by the application to
provide the new content for the <tt>app_data_dictionary</tt> extension.  No other
extensions are sent or updated, and no UpdatePath is required.</t>
        <artwork><![CDATA[
enum {
    invalid(0),
    update(1),
    remove(2),
    (255)
} AppDataUpdateOperation;

struct {
    ComponentID component_id;
    AppDataUpdateOperation op;

    select (AppDataUpdate.op) {
        case update: opaque update<V>;
        case remove: struct{};
    };
} AppDataUpdate;
]]></artwork>
        <t>An AppDataUpdate proposal is invalid if its <tt>component_id</tt> references a
component that is not known to the application, or if it specifies the removal
of state for a <tt>component_id</tt> that has no state present.  A proposal list is
invalid if it includes multiple AppDataUpdate proposals that <tt>remove</tt>
state for the same <tt>component_id</tt>, or proposals that both <tt>update</tt> and <tt>remove</tt>
state for the same <tt>component_id</tt>.  In other words, for a given <tt>component_id</tt>,
a proposal list is valid only if it contains (a) a single <tt>remove</tt> operation or
(b) one or more <tt>update</tt> operation.</t>
        <t>AppDataUpdate proposals are processed after any default proposals (i.e., those
defined in <xref target="RFC9420"/>), and any AppEphemeral proposals (defined in
<xref target="app-ephemeral"/>).</t>
        <t>When an MLS group contains the AppDataUpdate proposal type in the
<tt>proposal_types</tt> list in the group's <tt>required_capabilities</tt> extension, a
GroupContextExtensions proposal <bcp14>MUST NOT</bcp14> add, remove, or modify the
<tt>app_data_dictionary</tt> GroupContext extension. In other words, when every member of
the group supports the AppDataUpdate proposal, a GroupContextExtensions proposal
could be sent to update some other extension(s), but the <tt>app_data_dictionary</tt>
GroupContext extension, if it exists, is left as it was.</t>
        <t>A commit can contain a GroupContextExtensions proposal which modifies
GroupContext extensions other than <tt>app_data_dictionary</tt>, and can be followed by
zero or more AppDataUpdate proposals.  This allows modifications to both the
<tt>app_data_dictionary</tt> extension (via AppDataUpdate) and other extensions (via
GroupContextExtensions) in the same Commit.</t>
        <t>A client applies AppDataUpdate proposals by component ID.  For each
<tt>component_id</tt> field that appears in an AppDataUpdate proposal in the
Commit, the client assembles a list of AppDataUpdate proposals with that
<tt>component_id</tt>, in the order in which they appear in the Commit, and processes
them in the following way:</t>
        <ul spacing="normal">
          <li>
            <t>If the list comprises a single proposal with the <tt>op</tt> field set to <tt>remove</tt>:  </t>
            <ul spacing="normal">
              <li>
                <t>If there is an entry in the <tt>component_states</tt> vector in the
<tt>application_state</tt> extension with the specified <tt>component_id</tt>, remove
it.</t>
              </li>
              <li>
                <t>Otherwise, the proposal is invalid.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If the list comprises one or more proposals, all with <tt>op</tt> field set to
<tt>update</tt>:  </t>
            <ul spacing="normal">
              <li>
                <t>Provide the application logic registered to the <tt>component_id</tt> value with
the content of the <tt>update</tt> field from each proposal, in the order
specified.</t>
              </li>
              <li>
                <t>The application logic returns either an opaque value <tt>new_data</tt> that will be
stored as the new application data for this component, or else an
indication that it considers this update invalid.</t>
              </li>
              <li>
                <t>If the application logic considers the update invalid, the MLS client <bcp14>MUST</bcp14>
consider the proposal list invalid.</t>
              </li>
              <li>
                <t>If no <tt>app_data_dictionary</tt> extension is present in the GroupContext, add one
to the end of the <tt>extensions</tt> list in the GroupContext.</t>
              </li>
              <li>
                <t>If there is an entry in the <tt>component_data</tt> vector in the
<tt>app_data_dictionary</tt> extension with the specified <tt>component_id</tt>, then set
its <tt>data</tt> field to the specified <tt>new_data</tt>.</t>
              </li>
              <li>
                <t>Otherwise, insert a new entry in the <tt>component_states</tt> vector with the
specified <tt>component_id</tt> and the <tt>data</tt> field set to the <tt>new_data</tt>
value.  The new entry is inserted at the proper point to keep the
<tt>component_states</tt> vector sorted by <tt>component_id</tt>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Otherwise, the proposal list is invalid.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>NOTE: An alternative design here would be to have the <tt>update</tt> operation
simply set the new value for the <tt>app_data_dictionary</tt> GCE, instead of sending a
diff.  This would be simpler in that the MLS stack wouldn't have to ask the
application for the new state value, and would discourage applications from
storing large state in the GroupContext directly (which bloats Welcome
messages).  It would effectively require the state in the GroupContext to be a
hash of the real state, to avoid large AppDataUpdate proposals.  This
pushes some complexity onto the application, since the application has to
define a hashing algorithm, and define its own scheme for initializing new
joiners.</t>
          </li>
        </ul>
        <t>AppDataUpdate proposals do not require an UpdatePath.
An AppDataUpdate proposal can be sent by an external sender. Likewise,
AppDataUpdate proposals can be included in an external commit. Applications
can make more restrictive validity rules for the update of their components,
such that some components would not be valid at the application when sent in
an external commit or via an external proposer.</t>
      </section>
      <section anchor="app-ephemeral">
        <name>Attaching Application Data to a Commit</name>
        <t>The AppEphemeral proposal type allows an application component to associate
application data to a Commit, so that the member processing the Commit knows
that all other group members will be processing the same data.  AppEphemeral
proposals are ephemeral in the sense that they do not change any persistent
state related to MLS, aside from their appearance in the transcript hash.</t>
        <t>The content of an AppEphemeral proposal is the same as an <tt>app_data_dictionary</tt>
extension.  The proposal type is set in <xref target="iana-considerations"/>.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
    ComponentID component_id;
    opaque data<V>;
} AppEphemeral;
]]></sourcecode>
        <t>An AppEphemeral proposal is invalid if it contains a <tt>component_id</tt> that is
unknown to the application, or if the <tt>app_data_dictionary</tt> field contains any
<tt>ComponentData</tt> entry whose <tt>data</tt> field is considered invalid by the
application logic registered to the indicated <tt>component_id</tt>.</t>
        <t>AppEphemeral proposals <bcp14>MUST</bcp14> be processed after any default proposals (i.e.,
those defined in <xref target="RFC9420"/>), but before any AppDataUpdate proposals.</t>
        <t>A client applies an AppEphemeral proposal by providing the contents of the
<tt>app_data_dictionary</tt> field to the component identified by the <tt>component_id</tt>.  If
a Commit references more than one AppEphemeral proposal for the same
<tt>component_id</tt> value, then they <bcp14>MUST</bcp14> be processed in the order in which they are
specified in the Commit.</t>
        <t>AppEphemeral proposals do not require an UpdatePath.
An AppEphemeral proposal can be sent by an external sender. Likewise,
AppEphemeral proposals can be included in an external commit. Applications
can make more restrictive validity rules for ephemeral updates of their
components, such that some components would not be valid at the application when
sent in an external commit or via an external proposer.</t>
      </section>
      <section anchor="safe-aad">
        <name>Safe Additional Authenticated Data (AAD)</name>
        <t>An MLS PrivateMessage can contain arbitrary additional application-specific
AAD. The corresponding <tt>authenticated_data</tt> field appears in several MLS
structs: <tt>FramedContent</tt> (used indirectly to generate the message signature
and tags), <tt>PrivateContentAAD</tt> (used as the AAD input to the
<tt>PrivateMessage.ciphertext</tt>), and <tt>PrivateMessage</tt> (to convey the AAD).</t>
        <t>The Safe AAD API defines a framing used to allow multiple application
components to add AAD safely to the <tt>authenticated_data</tt> without conflicts or
ambiguity.</t>
        <t>When any AAD safe extension is included in the <tt>authenticated_data</tt> field,
the "safe" AAD items <bcp14>MUST</bcp14> come before any non-safe data in the
<tt>authenticated_data</tt> field. Safe AAD items are framed using the <tt>SafeAAD</tt>
struct and are sorted in increasing numerical order of the <tt>component_id</tt>.
The struct is described below:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  ComponentID component_id;
  opaque aad_item_data<V>;
} SafeAADItem;

struct {
  SafeAADItem aad_items<V>;
} SafeAAD;
]]></sourcecode>
        <t>If the <tt>SafeAAD</tt> is present or not in the <tt>authenticated_data</tt> is determined by
the presence of the <tt>safe_aad</tt> component in the <tt>app_data_dictionary</tt> extension
in the GroupContext (see <xref target="negotiation"/>). If <tt>safe_aad</tt> is present, but none
of the "safe" AAD components have data to send in a particular message, the
<tt>aad_items</tt> is a zero-length vector.</t>
      </section>
    </section>
    <section anchor="negotiation">
      <name>Negotiating Extensions and Components</name>
      <t>MLS defines a <tt>Capabilities</tt> struct for LeafNodes (in turn used in
KeyPackages), which describes which extensions are supported by the
associated node.
However, that struct (defined in <xref section="7.2" sectionFormat="of" target="RFC9420"/>) only has
fields for a subset of the extensions possible in MLS, as reproduced below.</t>
      <sourcecode type="tls-presentation"><![CDATA[
struct {
    ProtocolVersion versions<V>;
    CipherSuite cipher_suites<V>;
    ExtensionType extensions<V>;
    ProposalType proposals<V>;
    CredentialType credentials<V>;
} Capabilities;
]]></sourcecode>
      <ul empty="true">
        <li>
          <t>The "MLS Extensions Types" registry represents extensibility of four
  core structs (<tt>GroupContext</tt>, <tt>GroupInfo</tt>, <tt>KeyPackage</tt>, and <tt>LeafNode</tt>)
  that have far reaching effects on the use of the protocol. The majority of
  MLS extensions in <xref target="RFC9420"/> extend one or more of these core structs.</t>
        </li>
      </ul>
      <t>Likewise, the <tt>required_capabilities</tt> GroupContext extension (defined
in <xref section="11.1" sectionFormat="of" target="RFC9420"/> and reproduced below) contains all
mandatory to support non-default extensions in its <tt>extension_types</tt> vector.
Its <tt>proposal_types</tt> vector contains any mandatory to support Proposals.
Its <tt>credential_types</tt> vector contains any mandatory credential types.</t>
      <artwork><![CDATA[
struct {
   ExtensionType extension_types<V>;
   ProposalType proposal_types<V>;
   CredentialType credential_types<V>;
} RequiredCapabilities;
]]></artwork>
      <t>Due to an oversight in <xref target="RFC9420"/>, the Capabilities struct does not include
MLS Wire Formats. Instead, this document defines two extensions: <tt>supported_wire_formats</tt> (which can appear in LeafNodes), and
<tt>required_wire_formats</tt> (which can appear in the GroupContext).</t>
      <sourcecode type="tls-presentation"><![CDATA[
struct {
   WireFormat wire_formats<V>;
} WireFormats

WireFormats supported_wire_formats;
WireFormats requires_wire_formats;
]]></sourcecode>
      <t>This document also defines new components of the <tt>app_data_dictionary</tt>
extension for supported and required Safe AAD, media types, and components.</t>
      <t>The <tt>safe_aad</tt> component contains a list of components IDs. When present (in an
<tt>app_data_dictionary</tt> extension) in a LeafNode, the semantic is the list of
supported components that use Safe AAD. When present (in an
<tt>app_data_dictionary</tt> extension) in the GroupContext, the semantic is the list
of required Safe AAD components (those that must be understood by the entire
group). If the <tt>safe_aad</tt> component is present, even with an empty list, (in the
<tt>app_data_dictionary</tt> extension) in the GroupContext, then the
<tt>authenticated_data</tt> field always starts with the SafeAAD struct defined in
<xref target="safe-aad"/>.</t>
      <sourcecode type="tls-presentation"><![CDATA[
struct {
    ComponentID component_ids<V>;
} ComponentsList;

ComponentsList safe_aad;
]]></sourcecode>
      <t>The list of required and supported components follows the same model with the
new component <tt>app_components</tt>. When present in a LeafNode, the semantic is the
list of supported components. When present in the GroupContext, the semantic is
the list of required components.</t>
      <sourcecode type="tls-presentation"><![CDATA[
ComponentsList app_components;
]]></sourcecode>
      <t>Finally, the supported and required media types (formerly called MIME types)
are communicated in the <tt>content_media_types</tt> component (see
<xref target="content-advertisement"/>).</t>
    </section>
    <section anchor="extensions">
      <name>Extensions</name>
      <section anchor="appack">
        <name>AppAck</name>
        <t>An AppAck object is used to acknowledge receipt of application messages.
Though this information implies no change to the group, it is conveyed inside
an AppEphermeral Proposal with a component ID <tt>app_ack</tt>, so that it is included
in the group's transcript by being included in Commit messages.</t>
        <sourcecode type="tls"><![CDATA[
struct {
    uint32 sender;
    uint32 first_generation;
    uint32 last_generation;
} MessageRange;

struct {
    MessageRange received_ranges<V>;
} AppAck;
]]></sourcecode>
        <t>An AppAck represents a set of messages received by the sender in the
current epoch.  Messages are represented by the <tt>sender</tt> and <tt>generation</tt> values
in the MLSCiphertext for the message.  Each MessageRange represents receipt of a
span of messages whose <tt>generation</tt> values form a continuous range from
<tt>first_generation</tt> to <tt>last_generation</tt>, inclusive.</t>
        <t>AppAck objects are sent as a guard against the Delivery Service dropping
application messages.  The sequential nature of the <tt>generation</tt> field provides
a degree of loss detection, since gaps in the <tt>generation</tt> sequence indicate
dropped messages.  AppAck completes this story by addressing the scenario where
the Delivery Service drops all messages after a certain point, so that a later
generation is never observed.  Obviously, there is a risk that AppAck messages
could be suppressed as well, but their inclusion in the transcript means that if
they are suppressed then the group cannot advance at all.</t>
      </section>
      <section anchor="targeted-messages">
        <name>Targeted messages</name>
        <section anchor="description">
          <name>Description</name>
          <t>MLS application messages make sending encrypted messages to all group members
easy and efficient. Sometimes application protocols mandate that messages are
only sent to specific group members, either for privacy or for efficiency
reasons.</t>
          <t>Targeted messages are a way to achieve this without having to create a new group
with the sender and the specific recipients – which might not be possible or
desired. Instead, targeted messages define the format and encryption of a
message that is sent from a member of an existing group to another member of
that group.</t>
          <t>The goal is to provide a one-shot messaging mechanism that provides
confidentiality and authentication, reusing mechanisms from <xref target="RFC9420"/>, in
particular <xref target="RFC9180"/>.</t>
        </section>
        <section anchor="format">
          <name>Format</name>
          <t>This extension uses the <tt>mls_extension_message</tt> WireFormat, where the content is a <tt>TargetedMessage</tt>.</t>
          <sourcecode type="tls"><![CDATA[
struct {
  opaque group_id<V>;
  uint64 epoch;
  uint32 recipient_leaf_index;
  opaque authenticated_data<V>;
  opaque encrypted_sender_auth_data<V>;
  opaque hpke_ciphertext<V>;
} TargetedMessage;

enum {
  hpke_auth_psk(0),
  signature_hpke_psk(1),
} TargetedMessageAuthScheme;

struct {
  uint32 sender_leaf_index;
  TargetedMessageAuthScheme authentication_scheme;
  select (authentication_scheme) {
    case HPKEAuthPsk:
    case SignatureHPKEPsk:
      opaque signature<V>;
  }
  opaque kem_output<V>;
} TargetedMessageSenderAuthData;

struct {
  opaque group_id<V>;
  uint64 epoch;
  uint32 recipient_leaf_index;
  opaque authenticated_data<V>;
  TargetedMessageSenderAuthData sender_auth_data;
} TargetedMessageTBM;

struct {
  opaque group_id<V>;
  uint64 epoch;
  uint32 recipient_leaf_index;
  opaque authenticated_data<V>;
  uint32 sender_leaf_index;
  TargetedMessageAuthScheme authentication_scheme;
  opaque kem_output<V>;
  opaque hpke_ciphertext<V>;
} TargetedMessageTBS;

struct {
  opaque group_id<V>;
  uint64 epoch;
  opaque label<V> = "MLS 1.0 targeted message psk";
} PSKId;
]]></sourcecode>
          <t>Note that <tt>TargetedMessageTBS</tt> is only used with the
<tt>TargetedMessageAuthScheme.SignatureHPKEPsk</tt> authentication mode.</t>
        </section>
        <section anchor="encryption">
          <name>Encryption</name>
          <t>Targeted messages uses HPKE to encrypt the message content between two leaves.</t>
          <section anchor="sender-data-encryption">
            <name>Sender data encryption</name>
            <t>In addition, <tt>TargetedMessageSenderAuthData</tt> is encrypted in a similar way to
<tt>MLSSenderData</tt> as described in <xref section="6.3.2" sectionFormat="of" target="RFC9420"/>. The
<tt>TargetedMessageSenderAuthData.sender_leaf_index</tt> field is the leaf index of the
sender. The <tt>TargetedMessageSenderAuthData.authentication_scheme</tt> field is the
authentication scheme used to authenticate the sender. The
<tt>TargetedMessageSenderAuthData.signature</tt> field is the signature of the
<tt>TargetedMessageTBS</tt> structure. The <tt>TargetedMessageSenderAuthData.kem_output</tt>
field is the KEM output of the HPKE encryption.</t>
            <t>The key and nonce provided to the AEAD are computed as the KDF of the first
KDF.Nh bytes of the <tt>hpke_ciphertext</tt> generated in the following section. If the
length of the hpke_ciphertext is less than KDF.Nh, the whole hpke_ciphertext is
used. In pseudocode, the key and nonce are derived as:</t>
            <sourcecode type="tls"><![CDATA[
sender_auth_data_secret
  = DeriveExtensionSecret(extension_secret, "targeted message sender auth data")

ciphertext_sample = hpke_ciphertext[0..KDF.Nh-1]

sender_data_key = ExpandWithLabel(sender_auth_data_secret, "key",
                      ciphertext_sample, AEAD.Nk)
sender_data_nonce = ExpandWithLabel(sender_auth_data_secret, "nonce",
                      ciphertext_sample, AEAD.Nn)
]]></sourcecode>
            <t>The Additional Authenticated Data (AAD) for the <tt>SenderAuthData</tt> ciphertext is
the first three fields of <tt>TargetedMessage</tt>:</t>
            <sourcecode type="tls"><![CDATA[
struct {
  opaque group_id<V>;
  uint64 epoch;
  uint32 recipient_leaf_index;
} SenderAuthDataAAD;
]]></sourcecode>
          </section>
          <section anchor="padding">
            <name>Padding</name>
            <t>The <tt>TargetedMessage</tt> structure does not include a padding field. It is the
responsibility of the sender to add padding to the <tt>message</tt> as used in the next
section.</t>
          </section>
        </section>
        <section anchor="authentication">
          <name>Authentication</name>
          <t>For ciphersuites that support it, HPKE <tt>mode_auth_psk</tt> is used for
authentication. For other ciphersuites, HPKE <tt>mode_psk</tt> is used along with a
signature. The authentication scheme is indicated by the <tt>authentication_scheme</tt>
field in <tt>TargetedMessageContent</tt>. See <xref target="guidance-on-authentication-schemes"/>
for more information.</t>
          <t>For the PSK part of the authentication, clients export a dedicated secret:</t>
          <sourcecode type="tls"><![CDATA[
targeted_message_psk
  = DeriveExtensionSecret(extension_secret, "targeted message psk")
]]></sourcecode>
          <t>The functions <tt>SealAuth</tt> and <tt>OpenAuth</tt> defined in <xref target="RFC9180"/> are used as
described in <xref target="safe-hpke"/> with an empty context. Other functions are defined in
<xref target="RFC9420"/>.</t>
          <section anchor="authentication-with-hpke">
            <name>Authentication with HPKE</name>
            <t>The sender <bcp14>MUST</bcp14> set the authentication scheme to
<tt>TargetedMessageAuthScheme.HPKEAuthPsk</tt>.</t>
            <t>As described in <xref target="safe-hpke"/> the <tt>hpke_context</tt> is a LabeledExtensionContent struct
with the following content, where <tt>group_context</tt> is the serialized context of
the group.</t>
            <sourcecode type="tls"><![CDATA[
label = "MLS 1.0 ExtensionData"
extension_type = ExtensionType
extension_data = group_context
]]></sourcecode>
            <t>The sender then computes the following:</t>
            <sourcecode type="tls"><![CDATA[
(kem_output, hpke_ciphertext) = SealAuthPSK(receiver_node_public_key,
                                            hpke_context,
                                            targeted_message_tbm,
                                            message,
                                            targeted_message_psk,
                                            psk_id,
                                            sender_node_private_key)
]]></sourcecode>
            <t>The recipient computes the following:</t>
            <sourcecode type="tls"><![CDATA[
message = OpenAuthPSK(kem_output,
                      receiver_node_private_key,
                      hpke_context,
                      targeted_message_tbm,
                      hpke_ciphertext,
                      targeted_message_psk,
                      psk_id,
                      sender_node_public_key)
]]></sourcecode>
          </section>
          <section anchor="authentication-with-signatures">
            <name>Authentication with signatures</name>
            <t>The sender <bcp14>MUST</bcp14> set the authentication scheme to
<tt>TargetedMessageAuthScheme.SignatureHPKEPsk</tt>. The signature is done using the
<tt>signature_key</tt> of the sender's <tt>LeafNode</tt> and the corresponding signature
scheme used in the group.</t>
            <t>The sender then computes the following with <tt>hpke_context</tt> defined as in
<xref target="authentication-with-hpke"/>:</t>
            <sourcecode type="tls"><![CDATA[
(kem_output, hpke_ciphertext) = SealPSK(receiver_node_public_key,
                                        hpke_context,
                                        targeted_message_tbm,
                                        message,
                                        targeted_message_psk,
                                        epoch)
]]></sourcecode>
            <t>The signature is computed as follows, where the <tt>extension_type</tt> is the type of
this extension (see <xref target="iana-considerations"/>).</t>
            <sourcecode type="tls"><![CDATA[
signature = SafeSignWithLabel(extension_type, ., "TargetedMessageTBS", targeted_message_tbs)
]]></sourcecode>
            <t>The recipient computes the following:</t>
            <sourcecode type="tls"><![CDATA[
message = OpenPSK(kem_output,
                  receiver_node_private_key,
                  hpke_context,
                  targeted_message_tbm,
                  hpke_ciphertext,
                  targeted_message_psk,
                  epoch)
]]></sourcecode>
            <t>The recipient <bcp14>MUST</bcp14> verify the message authentication:</t>
            <sourcecode type="tls"><![CDATA[
SafeVerifyWithLabel.verify(extension_type,
                        sender_leaf_node.signature_key,
                        "TargetedMessageTBS",
                        targeted_message_tbs,
                        signature)
]]></sourcecode>
          </section>
        </section>
        <section anchor="guidance-on-authentication-schemes">
          <name>Guidance on authentication schemes</name>
          <t>If the group’s ciphersuite does not support HPKE <tt>mode_auth_psk</tt>,
implementations <bcp14>MUST</bcp14> choose <tt>TargetedMessageAuthScheme.SignatureHPKEPsk</tt>.</t>
          <t>If the group’s ciphersuite does support HPKE <tt>mode_auth_psk</tt>, implementations
CAN choose <tt>TargetedMessageAuthScheme.HPKEAuthPsk</tt> if better efficiency and/or
repudiability is desired. Implementations <bcp14>SHOULD</bcp14> consult
<xref section="9.1.1" sectionFormat="of" target="RFC9180"/> beforehand.</t>
        </section>
      </section>
      <section anchor="content-advertisement">
        <name>Content Advertisement</name>
        <section anchor="description-1">
          <name>Description</name>
          <t>This section defines a minimal framing format so MLS clients can signal
which media type is being sent inside the MLS <tt>application_data</tt> object when
multiple formats are permitted in the same group.</t>
          <t>It also defines a new <tt>content_media_types</tt> application component which is used to indicate support for specific formats, using the extensive IANA Media Types
registry (formerly called MIME Types). When the <tt>content_media_types</tt> component
is present (in the <tt>app_data_dictionary</tt> extension) in a LeafNode, it indicates
that node's support for a particular (non-empty) list of media types. When the
<tt>content_media_types</tt> component is present (in the <tt>app_data_dictionary</tt>
extension) in the GroupContext, it indicates a (non-empty) list of media types
that need to be supported by all members of that MLS group, <em>and</em> that the
<tt>application_data</tt> will be framed using the application framing format
described later in <xref target="app-framing"/>. This allows clients to confirm that all
members of a group can communicate.</t>
          <ul empty="true">
            <li>
              <t>Note that when the membership of a group changes, or when the policy of the
 group changes, it is responsibility of the committer to insure that the
 membership and policies are compatible.</t>
            </li>
          </ul>
          <t>As clients are upgraded to support new formats they can use these extensions
to detect when all members support a new or more efficient encoding, or select
the relevant format or formats to send.</t>
          <t>Vendor-specific media subtypes starting with <tt>vnd.</tt> can be registered with IANA
without standards action as described in <xref target="RFC6838"/>. Implementations which
wish to send multiple formats in a single application message, may be interested
in the <tt>multipart/alternative</tt> media type defined in <xref target="RFC2046"/> or may use or
define another type with similar semantics (for example using TLS Presentation
Language syntax <xref target="RFC8446"/>).</t>
          <ul empty="true">
            <li>
              <t>Note that the usage of IANA media types in general does not imply the usage of
 MIME Headers <xref target="RFC2045"/> for framing.</t>
            </li>
          </ul>
        </section>
        <section anchor="syntax">
          <name>Syntax</name>
          <t>MediaType is a TLS encoding of a single IANA media type (including top-level
type and subtype) and any of its parameters. Even if the <tt>parameter_value</tt>
would have required formatting as a <tt>quoted-string</tt> in a text encoding, only
the contents inside the <tt>quoted-string</tt> are included in <tt>parameter_value</tt>.
Likewise, only the second character of a <tt>quoted-pair</tt> is included in
<tt>parameter_value</tt>; the first escaping backslash ("") is omitted.
MediaTypeList is an ordered list of MediaType objects.</t>
          <sourcecode type="tls"><![CDATA[
struct {
    opaque parameter_name<V>;
    /* Note: parameter_value never includes the quotation marks of */
    /* an RFC 2045 quoted-string or the first "\" of a quoted-pair */
    opaque parameter_value<V>;
} Parameter;

struct {
    /* media_type is an IANA top-level media type, a "/" character,
     * and the IANA media subtype */
    opaque media_type<V>;

    /* a list of zero or more parameters defined for the subtype */
    Parameter parameters<V>;
} MediaType;

struct {
    /* must contain at least one item */
    MediaType media_types<V>;
} MediaTypeList;

MediaTypeList content_media_types;
]]></sourcecode>
          <t>Example IANA media types with optional parameters:</t>
          <sourcecode type="artwork"><![CDATA[
  image/png
  text/plain ;charset="UTF-8"
  application/json
  application/vnd.example.msgbus+cbor
]]></sourcecode>
          <t>For the example media type for <tt>text/plain</tt>, the <tt>media_type</tt> field
would be <tt>text/plain</tt>, <tt>parameters</tt> would contain a single Parameter
with a <tt>parameter_name</tt> of <tt>charset</tt> and a <tt>parameter_value</tt> of <tt>UTF-8</tt>.</t>
        </section>
        <section anchor="expected-behavior">
          <name>Expected Behavior</name>
          <t>An MLS client which implements this section <bcp14>SHOULD</bcp14> include the
<tt>content_media_types</tt> component (in the <tt>app_data_dictionary</tt> extension)
in its LeafNodes, listing all the media types it can receive. As usual, the
client also includes <tt>content_media_types</tt> in the <tt>app_components</tt> list (in the
<tt>app_data_dictionary</tt> extension) and support for the <tt>app_data_dictionary</tt>
extension in its <tt>capabilities.extensions</tt> field in its LeafNodes (including
in LeafNodes inside its KeyPackages).</t>
          <t>When creating a new MLS group for an application using this specification,
the group <bcp14>MAY</bcp14> include a <tt>content_media_types</tt> component (in the
<tt>app_data_dictionary</tt> extension) in the GroupContext. (The creating
client also includes its <tt>content_media_types</tt> component in its own
LeafNode as described in the previous paragraph.)</t>
          <t>MLS clients <bcp14>SHOULD NOT</bcp14> add an MLS client to an MLS group with
<tt>content_media_types</tt> in its GroupContext unless the MLS client advertises it
can support all of the required MediaTypes.
As an exception, a client could be preconfigured to know that certain clients
support the required types. Likewise, an MLS client is already forbidden from
issuing or committing a GroupContextExtensions Proposal which introduces
required extensions which are not supported by all members in the resulting
epoch.</t>
        </section>
        <section anchor="app-framing">
          <name>Framing of application_data</name>
          <t>When an MLS group contains the <tt>content_media_types</tt> component (in the
<tt>app_data_dictionary</tt> extension) in its GroupContext, the <tt>application_data</tt>
sent in that group is interpreted as <tt>ApplicationFraming</tt> as defined below:</t>
          <sourcecode type="tls"><![CDATA[
  struct {
      MediaType media_type;
      opaque<V> application_content;
  } ApplicationFraming;
]]></sourcecode>
          <t>The <tt>media_type</tt> <bcp14>MAY</bcp14> be zero length, in which case, the media type of the
<tt>application_content</tt> is interpreted as the first MediaType specified in
the <tt>content_media_types</tt> component in the GroupContext.</t>
        </section>
      </section>
      <section anchor="selfremove-proposal">
        <name>SelfRemove Proposal</name>
        <t>The design of the MLS protocol prevents a member of
an MLS group from removing itself immediately from the group. (To cause
an immediate change in the group, a member must send a Commit message.
However the sender of a Commit message knows the keying material of the
new epoch and therefore needs to be part of the group.) Instead a member
wishing to remove itself can send a Remove Proposal and wait for another
member to Commit its Proposal.</t>
        <t>Unfortunately, MLS clients that join via an External Commit ignore
pending, but otherwise valid, Remove Proposals. The member trying to remove
itself has to monitor the group and send a new Remove Proposal in every new
epoch until the member is removed. In a
group with a burst of external joiners, a member connected over a
high-latency link (or one that is merely unlucky) might have to wait
several epochs to remove itself. A real-world situation in which this happens
is a member trying to remove itself from a conference call as several dozen
new participants are trying to join (often on the hour).</t>
        <t>This section describes a new <tt>SelfRemove</tt> Proposal extension type. It is
designed to be included in External Commits.</t>
        <section anchor="extension-description">
          <name>Extension Description</name>
          <t>This document specifies a new MLS Proposal type called <tt>SelfRemove</tt>. Its syntax
is described using the TLS Presentation Language <xref target="RFC8446"/> below (its content
is an empty struct). It is allowed in External Commits and requires an UpdatePath.
SelfRemove proposals are only allowed in a Commit by reference. SelfRemove
cannot be sent as an external proposal.</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {} SelfRemove;

struct {
    ProposalType msg_type;
    select (Proposal.msg_type) {
        case add:                      Add;
        case update:                   Update;
        case remove:                   Remove;
        case psk:                      PreSharedKey;
        case reinit:                   ReInit;
        case external_init:            ExternalInit;
        case group_context_extensions: GroupContextExtensions;
        case self_remove:              SelfRemove;
    };
} Proposal;
]]></sourcecode>
          <t>The description of behavior below only applies if all the
members of a group support this extension in their
capabilities; such a group is a "self-remove-capable group".</t>
          <t>An MLS client which supports this extension can send a
SelfRemove Proposal whenever it would like to remove itself
from a self-remove-capable group. Because the point of a
SelfRemove Proposal is to be available to external joiners
(which are not yet members), these proposals <bcp14>MUST</bcp14> be sent
in an MLS PublicMessage.</t>
          <t>Whenever a member receives a SelfRemove Proposal, it includes
it along with any other pending Propsals when sending a Commit.
It already <bcp14>MUST</bcp14> send a Commit of pending Proposals before sending
new application messages.</t>
          <t>When a member receives a Commit referencing one or more SelfRemove Proposals,
it treats the proposal like a Remove Proposal, except the leaf node to remove
is determined by looking in the Sender <tt>leaf_index</tt> of the original Proposal.
The member is able to verify that the Sender was a member.</t>
          <t>Whenever a new joiner is about to join a self-remove-capable group with an
External Commit, the new joiner <bcp14>MUST</bcp14> fetch any pending SelfRemove Proposals
along with the GroupInfo object, and include the SelfRemove Proposals
in its External Commit by reference. (An ExternalCommit can contain zero or
more SelfRemove proposals). The new joiner <bcp14>MUST</bcp14> validate the SelfRemove
Proposal before including it by reference, except that it skips the validation
of the <tt>membership_tag</tt> because a non-member cannot verify membership.</t>
          <t>During validation, SelfRemove proposals are processed after Update proposals
and before Remove proposals. If there is a pending SelfRemove proposal for a specific
leaf node and a pending Remove proposal for the same leaf node, the Remove proposal is
invalid. A client <bcp14>MUST NOT</bcp14> issue more than one SelfRemove proposal per epoch.</t>
          <t>The MLS Delivery Service (DS) needs to validate SelfRemove Proposals it
receives (except that it cannot validate the <tt>membership_tag</tt>). If the DS
provides a GroupInfo object to an external joiner, the DS <bcp14>SHOULD</bcp14> attach any
SelfRemove proposals known to the DS to the GroupInfo object.</t>
          <t>As with Remove proposals, clients need to be able to receive a Commit
message which removes them from the group via a SelfRemove. If the DS does
not forward a Commit to a removed client, it needs to inform the removed
client out-of-band.</t>
        </section>
      </section>
      <section anchor="last-resort-keypackages">
        <name>Last resort KeyPackages</name>
        <t>Type: KeyPackage extension</t>
        <section anchor="description-2">
          <name>Description</name>
          <t><xref section="10" sectionFormat="of" target="RFC9420"/> details that clients are required to pre-publish
KeyPackages so that other clients can add them to groups asynchronously. It
also states that they should not be re-used:</t>
          <ul empty="true">
            <li>
              <t>KeyPackages are intended to be used only once and <bcp14>SHOULD NOT</bcp14> be reused except
in the case of a "last resort" KeyPackage (see Section 16.8). Clients <bcp14>MAY</bcp14>
generate and publish multiple KeyPackages to support multiple cipher suites.</t>
            </li>
          </ul>
          <t><xref section="16.8" sectionFormat="of" target="RFC9420"/> then introduces the notion of last-resort
KeyPackages as follows:</t>
          <ul empty="true">
            <li>
              <t>An application <bcp14>MAY</bcp14> allow for reuse of a "last resort" KeyPackage in order to
prevent denial-of-service attacks.</t>
            </li>
          </ul>
          <t>However, <xref target="RFC9420"/> does not specify how to distinguish regular KeyPackages
from last-resort ones. The last_resort_key_package KeyPackage application
component defined in this section fills this gap and allows clients to specifically mark KeyPackages as KeyPackages of last resort that <bcp14>MAY</bcp14> be used
more than once in scenarios where all other KeyPackages have already been used.</t>
          <t>The component allows clients that pre-publish KeyPackages to signal to the
Delivery Service which KeyPackage(s) are meant to be used as last resort
KeyPackages.</t>
          <t>An additional benefit of using a component rather than communicating the
information out-of-band is that the component is still present in Add proposals.
Clients processing such Add proposals can authenticate that a KeyPackage is a
last-resort KeyPackage and <bcp14>MAY</bcp14> make policy decisions based on that information.</t>
        </section>
        <section anchor="format-1">
          <name>Format</name>
          <t>The purpose of the application component is simply to mark a given KeyPackage,
which means it carries no additional data.</t>
          <t>As a result, a LastResort Extension contains the <tt>component_id</tt> with an empty
<tt>data</tt> field.</t>
        </section>
      </section>
      <section anchor="multi-credentials">
        <name>Multi-Credentials</name>
        <t>Multi-credentials address use cases where there might not be a single
credential that captures all of a client's authenticated attributes. For
example, an enterprise messaging client may wish to provide attributes both
from its messaging service, to prove that its user has a given handle in
that service, and from its corporate owner, to prove that its user is an
employee of the corporation. Multi-credentials can also be used in migration
scenarios, where some clients in a group might wish to rely on a newer type
of credential, but other clients haven't yet been upgraded.</t>
        <t>New credential types <tt>MultiCredential</tt> and <tt>WeakMultiCredential</tt> are
defined as shown below. These credential types are indicated with
the values <tt>multi</tt> and <tt>weak-multi</tt> (see <xref target="iana-creds"/>).</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  CipherSuite cipher_suite;
  Credential credential;
  SignaturePublicKey credential_key;

  /* SignWithLabel(., "CredentialBindingTBS", CredentialBindingTBS) */
  opaque signature<V>;
} CredentialBinding

struct {
  CredentialBinding bindings<V>;
} MultiCredential;

struct {
  CredentialBinding bindings<V>;
} WeakMultiCredential;
]]></sourcecode>
        <t>The two types of credentials are processed in exactly the same way.  The only
difference is in how they are treated when evaluating support by other clients,
as discussed below.</t>
        <section anchor="credential-bindings">
          <name>Credential Bindings</name>
          <t>A multi-credential consists of a collection of "credential bindings".  Each
credential binding is a signed statement by the holder of the credential that
the signature key in the LeafNode belongs to the holder of that credential.
Specifically, the signature is computed using the MLS <tt>SignWithLabel</tt> function,
with label <tt>"CredentialBindingTBS"</tt> and with a content that covers the contents
of the CredentialBinding, plus the <tt>signature_key</tt> field from the LeafNode in
which this credential will be embedded.</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  CipherSuite cipher_suite;
  Credential credential;
  SignaturePublicKey credential_key;
  SignaturePublicKey signature_key;
} CredentialBindingTBS;
]]></sourcecode>
          <t>The <tt>cipher_suite</tt> for a credential is NOT <bcp14>REQUIRED</bcp14> to match the cipher suite
for the MLS group in which it is used, but <bcp14>MUST</bcp14> meet the support requirements
with regard to support by group members discussed below.</t>
        </section>
        <section anchor="verifying-a-multi-credential">
          <name>Verifying a Multi-Credential</name>
          <t>A credential binding is supported by a client if the client supports the
credential type and cipher suite of the binding.  A credential binding is valid
in the context of a given LeafNode if both of the following are true:</t>
          <ul spacing="normal">
            <li>
              <t>The <tt>credential</tt> is valid according to the MLS Authentication Service.</t>
            </li>
            <li>
              <t>The <tt>credential_key</tt> corresponds to the specified <tt>credential</tt>, in the same
way that the <tt>signature_key</tt> would have to correspond to the credential if
the credential were presented in a LeafNode.</t>
            </li>
            <li>
              <t>The <tt>signature</tt> field is valid with respect to the <tt>signature_key</tt> value in
the leaf node.</t>
            </li>
          </ul>
          <t>A client that receives a credential of type <tt>multi</tt> in a LeafNode <bcp14>MUST</bcp14> verify
that all of the following are true:</t>
          <ul spacing="normal">
            <li>
              <t>All members of the group support credential type <tt>multi</tt>.</t>
            </li>
            <li>
              <t>For each credential binding in the multi-credential:  </t>
              <ul spacing="normal">
                <li>
                  <t>Every member of the group supports the cipher suite and credential type
values for the binding.</t>
                </li>
                <li>
                  <t>The binding is valid in the context of the LeafNode.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>A client that receives a credential of type <tt>weak-multi</tt> in a LeafNode <bcp14>MUST</bcp14> verify
that all of the following are true:</t>
          <ul spacing="normal">
            <li>
              <t>All members of the group support credential type <tt>weak-multi</tt>.</t>
            </li>
            <li>
              <t>Each member of the group supports at least one binding in the
multi-credential.  (Different members may support different subsets.)</t>
            </li>
            <li>
              <t>Every binding that this client supports is valid in the context of the
LeafNode.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requests the addition of various new values under the heading
of "Messaging Layer Security".  Each registration is organized under the
relevant registry Type.</t>
      <t>This document also requests the creation of a new MLS applications components
registry as described in <xref target="iana-components"/>.</t>
      <t>RFC EDITOR: Please replace XXXX throughout with the RFC number assigned to
this document</t>
      <section anchor="mls-wire-formats">
        <name>MLS Wire Formats</name>
        <section anchor="mls-targeted-message">
          <name>MLS Targeted Message</name>
          <t>The <tt>mls_targeted_message</tt> MLS Wire Format is used to send a message
to a subset of members of an MLS group.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0006 (suggested)</t>
            </li>
            <li>
              <t>Name: mls_targeted_message</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="mls-extension-types">
        <name>MLS Extension Types</name>
        <section anchor="appdatadictionary-mls-extension">
          <name>app_data_dictionary MLS Extension</name>
          <t>The <tt>app_data_dictionary</tt> MLS Extension Type is used inside KeyPackage,
LeafNode, GroupContext, or GroupInfo objects. It contains a sorted list of
application component data objects (at most one per component).</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0006 (suggested)</t>
            </li>
            <li>
              <t>Name: app_data_dictionary</t>
            </li>
            <li>
              <t>Message(s): KP: This extension may appear in KeyPackage objects
            LN: This extension may appear in LeafNode objects
            GC: This extension may appear in GroupContext objects
            GI: This extension may appear in GroupInfo objects</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
        <section anchor="supportedwireformats-mls-extension">
          <name>supported_wire_formats MLS Extension</name>
          <t>The <tt>supported_wire_formats</tt> MLS Extension Type is used inside LeafNode
objects. It contains a list of non-default Wire Formats supported by the
client node.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0007 (suggested)</t>
            </li>
            <li>
              <t>Name: supported_wire_formats</t>
            </li>
            <li>
              <t>Message(s): LN: This extension may appear in LeafNode objects</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
        <section anchor="requiredwireformats-mls-extension">
          <name>required_wire_formats MLS Extension</name>
          <t>The <tt>required_wire_formats</tt> MLS Extension Type is used inside GroupContext
objects. It contains a list of non-default Wire Formats that are mandatory for
all MLS members of the group to support.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0008 (suggested)</t>
            </li>
            <li>
              <t>Name: required_wire_formats</t>
            </li>
            <li>
              <t>Message(s): GC: This extension may appear in GroupContext objects</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
        <section anchor="targetedmessagescapability-mls-extension">
          <name>targeted_messages_capability MLS Extension</name>
          <t>The <tt>targeted_messages_capability</tt> MLS Extension Type is used in the
<tt>capabilities.extensions</tt> field of LeafNodes to indicate the support for the
Targeted Messages Extension, and in the <tt>required_capabilities.extension_types</tt>
field of the GroupContext to indicate all members of the group must support it.
The extension does not carry any payload.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0009 (suggested)</t>
            </li>
            <li>
              <t>Name: targeted_messages_capability</t>
            </li>
            <li>
              <t>Message(s): LN: This extension may appear in LeafNode objects
            GC: This extension may appear in GroupContext objects</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="mls-proposal-types">
        <name>MLS Proposal Types</name>
        <section anchor="appdataupdate-proposal">
          <name>AppDataUpdate Proposal</name>
          <t>The <tt>app_data_update</tt> MLS Proposal Type is used to efficiently update
application component data stored in the <tt>app_data_dictionary</tt> GroupContext
extension.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0008 (suggested)</t>
            </li>
            <li>
              <t>Name: app_data_update</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>External: Y</t>
            </li>
            <li>
              <t>Path Required: N</t>
            </li>
          </ul>
        </section>
        <section anchor="appephemeral-proposal">
          <name>AppEphemeral Proposal</name>
          <t>The <tt>app_ephemeral</tt> MLS Proposal Type is used to send opaque ephemeral
 application data that needs to be synchronized with a specific MLS epoch.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0009 (suggested)</t>
            </li>
            <li>
              <t>Name: app_ephemeral</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>External: Y</t>
            </li>
            <li>
              <t>Path Required: N</t>
            </li>
          </ul>
        </section>
        <section anchor="selfremove-proposal-1">
          <name>SelfRemove Proposal</name>
          <t>The <tt>self_remove</tt> MLS Proposal Type is used for a member to remove itself
from a group more efficiently than using a <tt>remove</tt> proposal type, as the
<tt>self_remove</tt> type is permitted in External Commits.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0008 (suggested)</t>
            </li>
            <li>
              <t>Name: self_remove</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>External: N</t>
            </li>
            <li>
              <t>Path Required: Y</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="iana-creds">
        <name>MLS Credential Types</name>
        <section anchor="multi-credential">
          <name>Multi Credential</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0003 (suggested)</t>
            </li>
            <li>
              <t>Name: multi</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
        <section anchor="weak-multi-credential">
          <name>Weak Multi Credential</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0004</t>
            </li>
            <li>
              <t>Name: weak-multi</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
          <!-- ## MLS Signature Labels

### Labeled Extension Content

* Label: "LabeledExtensionContent" (suggested)
* Recommended: Y
* Reference: RFC XXXX -->

</section>
      </section>
      <section anchor="iana-components">
        <name>MLS Component Types</name>
        <t>This document requests the creation of a new IANA "MLS Component Types" registry under the "Messaging Layer Security" group registry heading. Assignments to this registry in the range 0x0000 0000 to 0x7FFF FFFF are via Specification Required
policy <xref target="RFC8126"/> using the MLS Designated Experts. Assignments in the range
0x8000 0000 to 0xFFFF FFFF are for private use.</t>
        <t>Template:</t>
        <ul spacing="normal">
          <li>
            <t>Value: The numeric value of the component ID</t>
          </li>
          <li>
            <t>Name: The name of the component</t>
          </li>
          <li>
            <t>Where: The objects(s) in which the component may appear,
       drawn from the following list:
            </t>
            <ul spacing="normal">
              <li>
                <t>AD: SafeAAD objects</t>
              </li>
              <li>
                <t>AE: AppEpheral proposals</t>
              </li>
              <li>
                <t>ES: Exporter Secret labels</t>
              </li>
              <li>
                <t>GC: GroupContext objects</t>
              </li>
              <li>
                <t>GI: GroupInfo objects</t>
              </li>
              <li>
                <t>HP: HPKE key labels</t>
              </li>
              <li>
                <t>KP: KeyPackage objects</t>
              </li>
              <li>
                <t>LN: LeafNode objects</t>
              </li>
              <li>
                <t>PS: PSK labels</t>
              </li>
              <li>
                <t>SK: Signature Key labels</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Recommended: Same as in <xref section="17.1" sectionFormat="of" target="RFC9420"/></t>
          </li>
          <li>
            <t>Reference: The document where this component is defined</t>
          </li>
        </ul>
        <t>The restrictions noted in the "Where" column are to be enforced by the
application.  MLS implementations <bcp14>MUST NOT</bcp14> impose restrictions on where
component IDs are used in which parts of MLS, unless specifically directed to by
the application.</t>
        <t>Initial Contents:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Where</th>
              <th align="left">R</th>
              <th align="left">Ref</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0000 0000</td>
              <td align="left">RESERVED</td>
              <td align="left">N/A</td>
              <td align="left">-</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x0000 0001</td>
              <td align="left">app_components</td>
              <td align="left">LN,GC</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x0000 0002</td>
              <td align="left">safe_aad</td>
              <td align="left">LN,GC</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x0000 0003</td>
              <td align="left">content_media_types</td>
              <td align="left">LN,GC</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x0000 0004</td>
              <td align="left">last_resort_key_package</td>
              <td align="left">KP</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x0000 0005</td>
              <td align="left">app_ack</td>
              <td align="left">AE</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x8000 0000 -</td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">0xFFFF FFFF</td>
              <td align="left">Reserved for Private Use</td>
              <td align="left">N/A</td>
              <td align="left">N</td>
              <td align="left">RFCXXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <section anchor="safe-application-api">
        <name>Safe Application API</name>
        <t>The Safe Application API provides the following security guarantee: If an
application uses MLS with application components, the security guarantees of
the base MLS protocol and the security guarantees of each application component
analyzed in isolation, still hold for the composed application of the MLS
protocol. In other words, the Safe Application API protects applications from
careless component developers. It is not possible that a combination of
components (the developers of which did not know about each other) impedes the
security of the base MLS protocol or any other component. No further analysis of
the combination is necessary. This also means that any security vulnerabilities
introduced by one component do not spread to other components or the base MLS
implementation.</t>
      </section>
      <section anchor="appack-1">
        <name>AppAck</name>
        <t>When AppAck objects are received, they allow clients to detect if the Delivery
Service (or an intermediary) dropped application messages, since gaps in the
<tt>generation</tt> sequence indicate dropped messages. When AppAck messages
are accepted by the Delivery Service, but not received by some members, the
members who have missed the corresponding AppEphemeral proposals will not be
able to send or receive a commit message, because the proposal is included
in the transcript hash. Likewise if AppAck objects and/or commits are sent
periodically by every member, other members will be able to detect a member
that is no longer sending on that schedule or whose handshake messages are being
suppressed by the DS.</t>
        <ul empty="true">
          <li>
            <t>Note: External Commits do not typically contain pending proposals (including
AppEphemeral proposals). Client that send an AppAck component in an
AppEphemeral proposal will need to send a new AppAck component in an
AppEphemeral proposal (in the new epoch) after receiving an External Commit
until it has been incorporated into an accepted Commit.</t>
          </li>
        </ul>
        <t>The schedule on which AppAck objects are sent in AppEphemeral proposals is up to
the application,and determines which cases of loss/suppression are detected.
For example:</t>
        <ul spacing="normal">
          <li>
            <t>The application might have the committer include an AppAck whenever a
Commit is sent, so that other members could know when one of their messages
did not reach the committer.</t>
          </li>
          <li>
            <t>The application could have a client send an AppAck whenever an application
message is sent, covering all messages received since its last AppAck.  This
would provide a complete view of any losses experienced by active members.</t>
          </li>
          <li>
            <t>The application could simply have clients send AppAck proposals on a timer, so
that all participants' state would be known.</t>
          </li>
        </ul>
        <t>An application using AppAck to guard against loss/suppression of
application messages also needs to ensure that AppAck messages and the Commits
that reference them are not dropped.  One way to do this is to always encrypt
Proposal and Commit messages, to make it more difficult for the Delivery Service
to recognize which messages contain AppAcks.  The application can also have
clients enforce an AppAck schedule, reporting loss if an AppAck is not received
at the expected time.</t>
      </section>
      <section anchor="targeted-messages-1">
        <name>Targeted Messages</name>
        <t>In addition to the sender authentication, Targeted Messages are authenticated by
using a preshared key (PSK) between the sender and the recipient. The PSK is
exported from the group key schedule using the label "targeted message psk".
This ensures that the PSK is only valid for a specific group and epoch, and the
Forward Secrecy and Post-Compromise Security guarantees of the group key
schedule apply to the targeted messages as well. The PSK also ensures that an
attacker needs access to the private group state in addition to the
HPKE/signature's private keys. This improves confidentiality guarantees against
passive attackers and authentication guarantees against active attackers.</t>
      </section>
      <section anchor="content-advertisement-1">
        <name>Content Advertisement</name>
        <t>Use of the <tt>content_media_types</tt> component could leak some private information
visible in KeyPackages and inside an MLS group. This could be used to infer a
specific implementation, platform, or even version. Clients should carefully
consider the privacy implications in their environment of making a list of
acceptable media types available.</t>
        <t>Implementations need to be prepared to parse media types containing long
parameter lists, potentially containing characters which would be escaped or
quoted in <xref target="RFC5322"/>.</t>
      </section>
      <section anchor="selfremove">
        <name>SelfRemove</name>
        <t>An external recipient of a SelfRemove Proposal cannot verify the
<tt>membership_tag</tt>. However, an external joiner also has no way to
completely validate a GroupInfo object that it receives. An insider
can prevent an External Join by providing either an invalid GroupInfo object
or an invalid SelfRemove Proposal. The security properties of external joins
does not change with the addition of this proposal type.</t>
      </section>
      <section anchor="multi-credentials-1">
        <name>Multi Credentials</name>
        <t>Using a Weak Multi Credential reduces the overall credential security to the
security of the least secure of its credential bindings.</t>
      </section>
    </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="RFC9180">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </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>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="RFC5322">
          <front>
            <title>Internet Message Format</title>
            <author fullname="P. Resnick" initials="P." role="editor" surname="Resnick"/>
            <date month="October" year="2008"/>
            <abstract>
              <t>This document specifies the Internet Message Format (IMF), a syntax for text messages that are sent between computer users, within the framework of "electronic mail" messages. This specification is a revision of Request For Comments (RFC) 2822, which itself superseded Request For Comments (RFC) 822, "Standard for the Format of ARPA Internet Text Messages", updating it to reflect current practice and incorporating incremental changes that were specified in other RFCs. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5322"/>
          <seriesInfo name="DOI" value="10.17487/RFC5322"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-mls-architecture">
          <front>
            <title>The Messaging Layer Security (MLS) Architecture</title>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>Windy Hill Systems, LLC</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
         </author>
            <author fullname="Srinivas Inguva" initials="S." surname="Inguva">
         </author>
            <author fullname="Alan Duric" initials="A." surname="Duric">
              <organization>Wire</organization>
            </author>
            <date day="3" month="August" year="2024"/>
            <abstract>
              <t>   The Messaging Layer Security (MLS) protocol (I-D.ietf-mls-protocol)
   provides a Group Key Agreement protocol for messaging applications.
   MLS is meant to protect against eavesdropping, tampering, message
   forgery, and provide Forward Secrecy (FS) and Post-Compromise
   Security (PCS).

   This document describes the architecture for using MLS in a general
   secure group messaging infrastructure and defines the security goals
   for MLS.  It provides guidance on building a group messaging system
   and discusses security and privacy tradeoffs offered by multiple
   security mechanisms that are part of the MLS protocol (e.g.,
   frequency of public encryption key rotation).  The document also
   provides guidance for parts of the infrastructure that are not
   standardized by MLS and are instead left to the application.

   While the recommendations of this document are not mandatory to
   follow in order to interoperate at the protocol level, they affect
   the overall security guarantees that are achieved by a messaging
   application.  This is especially true in the case of active
   adversaries that are able to compromise clients, the delivery
   service, or the authentication service.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-architecture-15"/>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="RFC2046">
          <front>
            <title>Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein"/>
            <date month="November" year="1996"/>
            <abstract>
              <t>This second document defines the general structure of the MIME media typing system and defines an initial set of media types. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2046"/>
          <seriesInfo name="DOI" value="10.17487/RFC2046"/>
        </reference>
        <reference anchor="RFC2045">
          <front>
            <title>Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein"/>
            <date month="November" year="1996"/>
            <abstract>
              <t>This initial document specifies the various headers used to describe the structure of MIME messages. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2045"/>
          <seriesInfo name="DOI" value="10.17487/RFC2045"/>
        </reference>
      </references>
    </references>
    <?line 1674?>

<section anchor="change-log">
      <name>Change Log</name>
      <t>RFC EDITOR PLEASE DELETE THIS SECTION.</t>
      <t>draft-06</t>
      <ul spacing="normal">
        <li>
          <t>Integrate notion of Application API from draft-barnes-mls-appsync</t>
        </li>
      </ul>
      <t>draft-05</t>
      <ul spacing="normal">
        <li>
          <t>Include definition of ExtensionState extension</t>
        </li>
        <li>
          <t>Add safe use of AAD to Safe Extensions framework</t>
        </li>
        <li>
          <t>Clarify how capabilities negotiation works in Safe Extensions framework</t>
        </li>
      </ul>
      <t>draft-04</t>
      <ul spacing="normal">
        <li>
          <t>No changes (prevent expiration)</t>
        </li>
      </ul>
      <t>draft-03</t>
      <ul spacing="normal">
        <li>
          <t>Add Last Resort KeyPackage extension</t>
        </li>
        <li>
          <t>Add Safe Extensions framework</t>
        </li>
        <li>
          <t>Add SelfRemove Proposal</t>
        </li>
      </ul>
      <t>draft-02</t>
      <ul spacing="normal">
        <li>
          <t>No changes (prevent expiration)</t>
        </li>
      </ul>
      <t>draft-01</t>
      <ul spacing="normal">
        <li>
          <t>Add Content Advertisement extensions</t>
        </li>
      </ul>
      <t>draft-00</t>
      <ul spacing="normal">
        <li>
          <t>Initial adoption of draft-robert-mls-protocol-00 as a WG item.</t>
        </li>
        <li>
          <t>Add Targeted Messages extension (*)</t>
        </li>
      </ul>
    </section>
    <section anchor="old-safe-extensions-text">
      <name>Old Safe Extensions Text</name>
      <t>The MLS specification is extensible in a variety of ways (see <xref section="13" sectionFormat="of" target="RFC9420"/>) and describes the negotiation and other handling of extensions and
their data within the protocol. However, it does not provide guidance on how
extensions can or should safely interact with the base MLS protocol. The goal of
this section is to simplify the task of developing MLS extensions.</t>
      <section anchor="extension-state-anchoring-storage-and-agreement">
        <name>Extension state: anchoring, storage and agreement</name>
        <t>The safe extension framework can help an MLS extension ensure that all group
members agree on a piece of extension-specific state by using the
<tt>ExtensionState</tt> GroupContext extension. The ownership of an <tt>ExtensionState</tt>
extension in the context of the safe extension framework is determined by the
<tt>extension_type</tt> field. The extension with a matching <tt>extension_type</tt> is called
the owning extension.</t>
        <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  read(1),
  none(2),
 (255)
} Permissions;

enum {
  reserved(0),
  hash(1),
  data(2),
} HashOrData;

struct {
  HashOrData hash_or_data;
  select(hash_or_data) {
    case hash:
      HashReference state_hash;
    case data:
      opaque state<V>;
  }
} ExtensionPayload;

struct {
  extensionType extension_type;
  Permissions read;
  ExtensionPayload payload;
} ExtensionState;
]]></sourcecode>
        <t>The <tt>ExtensionState</tt> GroupContext extension contains data either directly (if
<tt>hash_or_data = data</tt>) or inditectly via a hash (if <tt>hash_or_data = hash</tt>).</t>
        <t>The owning extension can read and write the state stored in an <tt>ExtensionState</tt>
extension using an extension-defined proposal (see ). The semantics
of the proposal determines how the state is changed.</t>
        <t>The <tt>read</tt> variable determines the permissions that other MLS extensions have
w.r.t. the data stored within. <tt>read</tt> allows other MLS extensions to read that
data via their own proposals, while <tt>none</tt> marks the data as private to the
owning MLS extension.</t>
        <t>Other extensions may never write to the <tt>ExtensionState</tt> of the owning MLS
extension.</t>
        <section anchor="direct-vs-hash-based-storage">
          <name>Direct vs. hash-based storage</name>
          <t>Storing the data directly in the <tt>ExtensionState</tt> means the data becomes part of
the group state. Depending on the application design, this can be advantageous,
because it is distributed via Welcome messages. However, it could also mean that
the data is visible to the delivery service. Additionally, if the application
makes use of GroupContextExtension proposals, it may be necessary to send all of
the data with each such extension.</t>
          <t>Including the data by hash only allows group members to agree on the data
indirectly, relying on the collision resistance of the associated hash function.
The data itself, however, may have to be transmitted out-of-band to new joiners.</t>
        </section>
      </section>
      <section anchor="extension-design-guidance">
        <name>Extension Design Guidance</name>
        <t>While extensions can modify the protocol flow of MLS and the associated
properties in arbitrary ways, the base MLS protocol already enables a number of
functionalities that extensions can use without modifying MLS itself. Extension
authors should consider using these built-in mechanisms before employing more
intrusive changes to the protocol.</t>
      </section>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="J." surname="Alwen" fullname="Joel Alwen">
        <organization>Amazon</organization>
        <address>
          <email>alwenjo@amazon.com</email>
        </address>
      </contact>
      <contact initials="K." surname="Kohbrok" fullname="Konrad Kohbrok">
        <organization>Phoenix R&amp;D</organization>
        <address>
          <email>konrad.kohbrok@datashrine.de</email>
        </address>
      </contact>
      <contact initials="R." surname="Mahy" fullname="Rohan Mahy">
        <organization>Rohan Mahy Consulting Services</organization>
        <address>
          <email>rohan.ietf@gmail.com</email>
        </address>
      </contact>
      <contact initials="M." surname="Mularczyk" fullname="Marta Mularczyk">
        <organization>Amazon</organization>
        <address>
          <email>mulmarta@amazon.com</email>
        </address>
      </contact>
      <contact initials="R." surname="Barnes" fullname="Richard Barnes">
        <organization>Cisco Systems</organization>
        <address>
          <email>rlb@ipv.sx</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8V923Ijx5Xge35FDRWxJmUA3S3JtoayJFNNyuKob9tsWevY
mSAKQJEoE6jCVBZIwZp2zD/s077tt+ynzJfsuWaerCqQbNuzowibDaAq82Tm
yXO/jMdj15btqjjO3i2L7GXhfX5dVtfZi3xXNNlFMd82ZbvLDl++uDjKzn5q
i8qXdeVdPps1xe1xBt+7RT2v8jUMsWjyq3ZcFu3VeL3y4yI8Pn76a+e3s3Xp
8WO728DD52fvvnXzvC2u62Z3nPl24Vy1Xc+K5tgt4OtjN4c3YYCtP87aZls4
mO5TlzdFfpwdKGQH7q5ubq6beruBb/fBf+Buih08uDh22Thbh6dW9JSXp/C3
olqM23oMf+Cf82a3aQFg/CHfbFYlgAsf4d8lPavrMx9m5QpHui2qLawgyx6G
LMt4Pw5+hIXgA7/HV/D7dV6u4HvYyt/hnk7q5hq/zpv5Er5etu3GHz95gk/h
V+VtMdHHnuAXT2ZNfeeLJ/D+E3zvumyX2xkPeHf9JD0hfGAFu+5bOzQ+OOH3
JmXdeeXJ3uOeLNv16sC5fNsu64b2PCsrOMa3k+xtDSfcwmxZxkjzNt8s82Jl
f4AV5FX5Z9rs4+zNsi6q8qfs7X87pV8L3hec93cNv9zQu5N5vXaINW1Tzrat
zMyz/FMNU5ys7orK8QTHWXayzv9c02cZMsvxgT/Vv8vpFxovjPB9XTX5Av4s
YV9v4igd8HSoG3p8csOP/w4wOvfLpqyKyaKIg76tl3mVvcyXuzhg/C57Dpu5
XbWIFRdFc1vOC2/naPBJOvTfXeNXKcAv86bNs5dbxI4/727uW/d6u1rj04ML
f1vOl3mzyL7Jm4rnp2Gel35eZxc73xZrC1Wzmv2u3NxO/E9wn+tmDad4C1fB
ldWV+TQew5Wa+bbJ561zj6A9m6Zu63m9ykqfwfbkflfNl01d1VvPl4ywraha
vKTFIoMLD3cSIK+ui/DyJEOChR9vy0UBA2VMcbL6Kpvnm5xubwmLbGt74f0I
5svuitUK//ritmjyVbz+2aYuq9YDirdFU8Ev8DaAYmd9tyw90sntGiC08yON
q1flgmC2NObkzfkou97CL9W8yGDrsmV9h8M6HfYXvg+CX9bb1SKbFdnWFwsA
G+hYnl0VdzjRvCnaAt7J15sVTA5rntXtEi5ME2GNQ3p6GYahJ3E9HfAmfIrr
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
6v4frRnnp2QQAQA=

-->

</rfc>
