<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mls-extensions-09" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="MLS">The Messaging Layer Security (MLS) Extensions</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-09"/>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <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 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 achieve
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. This does not imply that it need be part of the Application Layer of
the networking stack.</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 mechanisms 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 different 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 with 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 extensions is
marked as belonging to a specific application component, so that components can
manage their information independently.</t>
      <t>The separation between components is achieved by the application assigning each
component a unique component ID number. These numbers are then incorporated into
the appropriate calculations in the protocol to achieve the required separation.</t>
      <section anchor="component-ids">
        <name>Component IDs</name>
        <t>A component ID is a two-byte value that uniquely identifies a component within
the scope of an application.</t>
        <artwork><![CDATA[
uint16 ComponentID;
]]></artwork>
        <t>When a label is required for an operation, the byte string resulting from the
TLS Presentation Language encoding of the following data structure is used. The
<tt>base_label</tt> field is always the fixed string "MLS Component". The<tt>component_id</tt>
field identifies the component performing the operation. The <tt>label</tt> field
identifies the operation being performed.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque base_label<V>; /* = "MLS Component" */
  ComponentID component_id;
  opaque label<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
appropriate 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[
SafeEncryptWithLabel(PublicKey, ComponentID, Label, Context, Plaintext) =
  EncryptWithLabel(PublicKey, ComponentOperationLabel, Context, Plaintext)

SafeDecryptWithLabel(PrivateKey, ComponentID, Label, Context, KEMOutput,
  Ciphertext) =
  DecryptWithLabel(PrivateKey, ComponentOperationLabel, Context,
    KEMOutput, Ciphertext)
]]></sourcecode>
        <t>Where the fields of ComponentOperationLabel are set to</t>
        <sourcecode type="tls"><![CDATA[
component_id = ComponentID
label = Label
]]></sourcecode>
        <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(SignatureKey, ComponentID, Label, Content) =
  SignWithLabel(SignatureKey, ComponentOperationLabel, Content)

SafeVerifyWithLabel(VerificationKey, ComponentID, Label, Content,
  SignatureValue) =
  VerifyWithLabel(VerificationKey, ComponentOperationLabel, Content,
  SignatureValue)
]]></sourcecode>
        <t>Where the fields of ComponentOperationLabel are set to</t>
        <sourcecode type="tls"><![CDATA[
component_id = ComponentID
label = Label
]]></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>The MLS Exporter functionality described in <xref section="8.5" sectionFormat="of" target="RFC9420"/> does not
provide forward security for exported secrets, because the <tt>exporter_secret</tt> is
not deleted after a secret has been derived.  In this section, we define a
forward-secure exporter for use by application components.</t>
        <t>The safe exporter is constructed from an Exporter Tree, tree of secrets with the
same structure as the Secret Tree defined in <xref section="9" sectionFormat="of" target="RFC9420"/>, with two
differences: First, an Exporter Tree always has 2<sup>16</sup> leaves,
corresponding to the 16 bits of a ComponentID value. (As with the Secret Tree,
the nodes of the tree can be generated on-demand, for space-efficiency.) Second,
the root of the Exporter Tree is the <tt>application_export_secret</tt>, 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
<tt>"application_export"</tt>.</t>
        <t>This tree defines one exported secret per ComponentID.  The secret for a
ComponentID is the <tt>tree_node_secret</tt> at the leaf node for that ComponentID:</t>
        <artwork><![CDATA[
SafeExportSecret(ComponentID) = tree_node_[LeafIndex(ComponentID)]_secret
]]></artwork>
        <t>Upon generating an exported secret for a component, the MLS implementation <bcp14>MUST</bcp14>
regard that component's exported secret as "consumed", and delete any source key
material according to the deletion schedule in <xref section="9.2" sectionFormat="of" target="RFC9420"/>.</t>
      </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 safely, 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>
      </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: Putting large amounts of data into the <tt>app_data_dictionary</tt> GCE may have
a performance impact.</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>
        <t>To avoid storing large amounts of data in the <tt>app_data_dictionary</tt> GCE,
implementations <bcp14>MAY</bcp14> offer storing only a hash of the actual data in the GCE.</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 a single <tt>component_id</tt> and the
<tt>data</tt> for that component. 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>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 <tt>data</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>Both MLS <tt>PublicMessage</tt> and <tt>PrivateMessage</tt> messages can contain arbitrary
additional application-specific data. The corresponding <tt>authenticated_data</tt>
field that conveys this application-specific data appears in the
<tt>FramedContent</tt> struct for <tt>PublicMessage</tt> and directly in the <tt>PrivateMessage</tt>
struct.</t>
        <t>In an MLS <tt>PrivateMessage</tt>, the <tt>application_data</tt> is also present in
intermediary structs: in the <tt>FramedContent</tt>, which is used to generate the
message signature and tags, and in the <tt>PrivateContentAAD</tt>, which is used as
the AAD input to the <tt>PrivateMessage.ciphertext</tt>.</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.</t>
      <t>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 anchor="grease">
        <name>GREASE</name>
        <t>The "Generate Random Extensions And Sustain Extensibility" (GREASE) approach is
described in <xref section="13.5" sectionFormat="of" target="RFC9420"/>. Further, <xref section="7.2" sectionFormat="of" target="RFC9420"/>
says that:</t>
        <ul empty="true">
          <li>
            <t>"As discussed in Section 13, unknown values in <tt>capabilities</tt> <bcp14>MUST</bcp14> be ignored,
and the creator of a <tt>capabilities</tt> field <bcp14>SHOULD</bcp14> include some random GREASE
values to help ensure that other clients correctly ignore unknown values."</t>
          </li>
        </ul>
        <t>This specification adds the following locations where GREASE values for
components can be included:</t>
        <ul spacing="normal">
          <li>
            <t>LeafNode.capabilities.app_data_dictionary.safe_aad</t>
          </li>
          <li>
            <t>LeafNode.capabilities.app_data_dictionary.app_components</t>
          </li>
          <li>
            <t>LeafNode.extensions.app_data_dictionary</t>
          </li>
          <li>
            <t>KeyPackage.extensions.app_data_dictionary</t>
          </li>
          <li>
            <t>GroupInfo.extensions.app_data_dictionary</t>
          </li>
          <li>
            <t>app_ephemeral.app_data_dictionary</t>
          </li>
          <li>
            <t>authenticated_data.aad_items</t>
          </li>
        </ul>
        <t>Unknown values (including GREASE values) in any of these fields <bcp14>MUST</bcp14> be ignored
by receivers. A random selection of GREASE values <bcp14>SHOULD</bcp14> be included in any of
these fields that would otherwise be present.</t>
      </section>
    </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="content-advertisement">
        <name>Content Advertisement</name>
        <section anchor="description">
          <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 ensure 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 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> inner_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>inner_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 type. It is designed to be
included in External Commits.</t>
        <section anchor="proposal-description">
          <name>Proposal 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 proposal in their capabilities; such a group is a
"self-remove-capable group".</t>
          <t>An MLS client which supports this proposal 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-1">
          <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">
          <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 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 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>
      <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>
      <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: 0x000a (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 anchor="appack-proposal">
          <name>AppAck Proposal</name>
          <t>The <tt>app_ack</tt> MLS Proposal Type can be used by group members to acknowledge the
receipt of application messages.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x000b (suggested)</t>
            </li>
            <li>
              <t>Name: app_ack</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>External: N</t>
            </li>
            <li>
              <t>Path Required: N</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>
        </section>
        <section anchor="credentialbindingtbs">
          <name>CredentialBindingTBS</name>
          <ul spacing="normal">
            <li>
              <t>Label: "CredentialBindingTBS"</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </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 to 0x7FFF are via Specification Required
policy <xref target="RFC8126"/> using the MLS Designated Experts. Assignments in the range
0x8000 to 0xFFFF 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</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">0x0001</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">0x0002</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">0x0003</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">0x0004</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">0x0005</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">0x0A0A</td>
              <td align="left">GREASE</td>
              <td align="left">Note1</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x1A1A</td>
              <td align="left">GREASE</td>
              <td align="left">Note1</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x2A2A</td>
              <td align="left">GREASE</td>
              <td align="left">Note1</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x3A3A</td>
              <td align="left">GREASE</td>
              <td align="left">Note1</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x4A4A</td>
              <td align="left">GREASE</td>
              <td align="left">Note1</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x5A5A</td>
              <td align="left">GREASE</td>
              <td align="left">Note1</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x6A6A</td>
              <td align="left">GREASE</td>
              <td align="left">Note1</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x7A7A</td>
              <td align="left">GREASE</td>
              <td align="left">Note1</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x8000 -</td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">0xFFFF</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>
        <ul empty="true">
          <li>
            <t>Note1: GREASE values for components <bcp14>MAY</bcp14> be present in AD, AE, GI, KP, and LN
objects.</t>
          </li>
        </ul>
      </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="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 1407?>

<section anchor="change-log">
      <name>Change Log</name>
      <t>RFC EDITOR PLEASE DELETE THIS SECTION.</t>
      <t>draft-09
- rename the component base label from "Application" to "MLS Component"</t>
      <t>draft-08
- clarify that SelfRemove is a proposal type, not an extension</t>
      <t>draft-07
- add AppAck to IANA considerations
- adapt Safe AAD scope
- remove targeted messages altogether with intention to publish it as a
  separate document
- assign self_remove proposal to a non duplicate number (0x000a)
- refactor TargetedMessage to no longer use structs removed from when it
was a "safe extension"
- remove the no-longer needed targeted_messages_capability (now signaled using
  support_wire_formats and required_wire_formats)
- add TargetedMessageTBS and CredentialBundleTBS to MLS Signature Labels IANA
  registry
- add GREASE values for components
- fix safe exporter definition
- resolve TODOs from -06
- fix numerous typos</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="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:
H4sIAAAAAAAAA8V92XLjVpbg+/0KjBwxlrJJ5uK1lFWuklNKW+1c1CnZHkd3
hwiSoIgSCbAAUEralR3zG/M23zKfMl8yZ733XACUlOWeaEc4UiSBu5x77tmX
4XDomrxZZofJxSJLXmd1nV7lxVXyKt1mVXKeTTdV3myT/devzg+Sk/dNVtR5
WdQunUyq7OYwge/drJwW6QqGmFXpvBnmWTMfrpb1MPOPD5/8wdWbySqv8WOz
XcPDpycXL900bbKrstoeJnUzc67YrCZZdehm8PWhm8KbMMCmPkyaapM5mO4z
l1ZZepjs6cr23G1ZXV9V5WYN3+5a/567zrbw4OzQJcNk5Z9a0lO1PIW/ZcVs
2JRD+Af+nFbbdQMLxh/S9XqZw3LhI/yd07O6P/Nhki9xpJus2MAOkuT+lSUJ
w2PvZ9gIPvAdvoLfr9J8Cd8DKP+CMB2V1RV+nVbTBXy9aJp1ffj4MT6FX+U3
2Ugfe4xfPJ5U5W2dPYb3H+N7V3mz2Ex4wNurx/EJ4QNLgHrd2KHxwRG/N8rL
1iuPdx73aNGslnvOpZtmUVYE8yQv4BjfjZJ3JZxwA7MlCSPNu3S9SLOl/QF2
kBb5rwTsw+RsUWZF/j5599+P6deM4YLz/qXilyt6dzQtVw6xpqnyyaaRmXmW
fy5hiqPlbVY4nuAwSY5W6a8lfZYhkxQf+Gv5l5R+ofH8CD+URZXO4J8FwPU6
jNJang51TY+PrvnxvwBGp/WiyotsNMvCoO/KRVokr9PFNgwYvkteADA3ywax
4jyrbvJpVts5KnySDv0vV/hVvODXadWkyesNYsev2+u79r3aLFf4dO/G3+XT
RVrNkm/TquD5aZgXeT0tk/Nt3WQru6pqOflLvr4Z1e/hPpfVCk7xBq6Cy4u5
+TQcwpWa1E2VThvnHkB71lXZlNNymeR1AuBJ620xXVRlUW5qvmSEbVnR4CXN
ZglceLiTsPLiKvMvj5Be4aebfJbBOAkTnKScJ9N0ndLlzeGHpnTmvtcDmC65
zZZL/LfObrIqXYbbn6zLvGhqwPAmqwr4pSkTWImZ9GKR10glNytYn50eKVy5
zGe0Ykthjs5OB8nVBn4pplkCgEsW5S2O6nTUT+vuCupFuVnOkkmWbOpsBqsG
KpYm8+wWJ5pWWZPBO+lqvYTJYcuTslnAdanCUsOQNb0Mw9CTuJ3W8kZ8hqt8
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

-->

</rfc>
