<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mls-extensions-07" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="MLS">The Messaging Layer Security (MLS) Extensions</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-07"/>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="03"/>
    <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.</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 four-byte value that uniquely identifies a component within
the scope of an application.</t>
        <artwork><![CDATA[
uint32 ComponentID;
]]></artwork>
        <t>When a label is required for an operation, the following data structure is used.
The <tt>base_label</tt> field is always the fixed string "Application".  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>; /* = "Application" */
  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: An alternative design here would be to have the <tt>update</tt> operation
simply set the new value for the <tt>app_data_dictionary</tt> GCE, instead of sending a
diff. This would be simpler in that the MLS stack wouldn't have to ask the
application for the new state value, and would discourage applications from
storing large state in the GroupContext directly (which bloats Welcome
messages). It would effectively require the state in the GroupContext to be a
hash of the real state, to avoid large AppDataUpdate proposals. This
pushes some complexity onto the application, since the application has to
define a hashing algorithm, and define its own scheme for initializing new
joiners.</t>
          </li>
        </ul>
        <t>AppDataUpdate proposals do not require an UpdatePath. An AppDataUpdate proposal
can be sent by an external sender. Likewise, AppDataUpdate proposals can be
included in an external commit. Applications can make more restrictive validity
rules for the update of their components, such that some components would not be
valid at the application when sent in an external commit or via an external
proposer.</t>
      </section>
      <section anchor="app-ephemeral">
        <name>Attaching Application Data to a Commit</name>
        <t>The AppEphemeral proposal type allows an application component to associate
application data to a Commit, so that the member processing the Commit knows
that all other group members will be processing the same data. AppEphemeral
proposals are ephemeral in the sense that they do not change any persistent
state related to MLS, aside from their appearance in the transcript hash.</t>
        <t>The content of an AppEphemeral proposal is the same as an <tt>app_data_dictionary</tt>
extension. The proposal type is set in <xref target="iana-considerations"/>.</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
    ComponentID component_id;
    opaque data<V>;
} AppEphemeral;
]]></sourcecode>
        <t>An AppEphemeral proposal is invalid if it contains a <tt>component_id</tt> that is
unknown to the application, or if the <tt>app_data_dictionary</tt> field contains any
<tt>ComponentData</tt> entry whose <tt>data</tt> field is considered invalid by the
application logic registered to the indicated <tt>component_id</tt>.</t>
        <t>AppEphemeral proposals <bcp14>MUST</bcp14> be processed after any default proposals (i.e.,
those defined in <xref target="RFC9420"/>), but before any AppDataUpdate proposals.</t>
        <t>A client applies an AppEphemeral proposal by providing the contents of the
<tt>app_data_dictionary</tt> field to the component identified by the <tt>component_id</tt>.
If a Commit references more than one AppEphemeral proposal for the same
<tt>component_id</tt> value, then they <bcp14>MUST</bcp14> be processed in the order in which they are
specified in the Commit.</t>
        <t>AppEphemeral proposals do not require an UpdatePath. An AppEphemeral proposal
can be sent by an external sender. Likewise, AppEphemeral proposals can be
included in an external commit. Applications can make more restrictive validity
rules for ephemeral updates of their components, such that some components would
not be valid at the application when sent in an external commit or via an
external proposer.</t>
      </section>
      <section anchor="safe-aad">
        <name>Safe Additional Authenticated Data (AAD)</name>
        <t>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> application_content;
  } ApplicationFraming;
]]></sourcecode>
          <t>The <tt>media_type</tt> <bcp14>MAY</bcp14> be zero length, in which case, the media type of the
<tt>application_content</tt> is interpreted as the first MediaType specified in the
<tt>content_media_types</tt> component in the GroupContext.</t>
        </section>
      </section>
      <section anchor="selfremove-proposal">
        <name>SelfRemove Proposal</name>
        <t>The design of the MLS protocol prevents a member of an MLS group from removing
itself immediately from the group. (To cause an immediate change in the group, a
member must send a Commit message. However, the sender of a Commit message knows
the keying material of the new epoch and therefore needs to be part of the
group.) Instead, a member wishing to remove itself can send a Remove Proposal
and wait for another member to Commit its Proposal.</t>
        <t>Unfortunately, MLS clients that join via an External Commit ignore pending, but
otherwise valid, Remove Proposals. The member trying to remove itself has to
monitor the group and send a new Remove Proposal in every new epoch until the
member is removed. In a group with a burst of external joiners, a member
connected over a high-latency link (or one that is merely unlucky) might have to
wait several epochs to remove itself. A real-world situation in which this
happens is a member trying to remove itself from a conference call as several
dozen new participants are trying to join (often on the hour).</t>
        <t>This section describes a new <tt>SelfRemove</tt> Proposal extension type. It is
designed to be included in External Commits.</t>
        <section anchor="extension-description">
          <name>Extension Description</name>
          <t>This document specifies a new MLS Proposal type called <tt>SelfRemove</tt>. Its syntax
is described using the TLS Presentation Language <xref target="RFC8446"/> below (its content
is an empty struct). It is allowed in External Commits and requires an
UpdatePath. SelfRemove proposals are only allowed in a Commit by reference.
SelfRemove cannot be sent as an external proposal.</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {} SelfRemove;

struct {
    ProposalType msg_type;
    select (Proposal.msg_type) {
        case add:                      Add;
        case update:                   Update;
        case remove:                   Remove;
        case psk:                      PreSharedKey;
        case reinit:                   ReInit;
        case external_init:            ExternalInit;
        case group_context_extensions: GroupContextExtensions;
        case self_remove:              SelfRemove;
    };
} Proposal;
]]></sourcecode>
          <t>The description of behavior below only applies if all the members of a group
support this extension in their capabilities; such a group is a
"self-remove-capable group".</t>
          <t>An MLS client which supports this extension can send a SelfRemove Proposal
whenever it would like to remove itself from a self-remove-capable group.
Because the point of a SelfRemove Proposal is to be available to external
joiners (which are not yet members), these proposals <bcp14>MUST</bcp14> be sent in an MLS
PublicMessage.</t>
          <t>Whenever a member receives a SelfRemove Proposal, it includes it along with any
other pending Propsals when sending a Commit. It already <bcp14>MUST</bcp14> send a Commit of
pending Proposals before sending new application messages.</t>
          <t>When a member receives a Commit referencing one or more SelfRemove Proposals, it
treats the proposal like a Remove Proposal, except the leaf node to remove is
determined by looking in the Sender <tt>leaf_index</tt> of the original Proposal. The
member is able to verify that the Sender was a member.</t>
          <t>Whenever a new joiner is about to join a self-remove-capable group with an
External Commit, the new joiner <bcp14>MUST</bcp14> fetch any pending SelfRemove Proposals
along with the GroupInfo object, and include the SelfRemove Proposals in its
External Commit by reference. (An ExternalCommit can contain zero or more
SelfRemove proposals). The new joiner <bcp14>MUST</bcp14> validate the SelfRemove Proposal
before including it by reference, except that it skips the validation of the
<tt>membership_tag</tt> because a non-member cannot verify membership.</t>
          <t>During validation, SelfRemove proposals are processed after Update proposals and
before Remove proposals. If there is a pending SelfRemove proposal for a
specific leaf node and a pending Remove proposal for the same leaf node, the
Remove proposal is invalid. A client <bcp14>MUST NOT</bcp14> issue more than one SelfRemove
proposal per epoch.</t>
          <t>The MLS Delivery Service (DS) needs to validate SelfRemove Proposals it receives
(except that it cannot validate the <tt>membership_tag</tt>). If the DS provides a
GroupInfo object to an external joiner, the DS <bcp14>SHOULD</bcp14> attach any SelfRemove
proposals known to the DS to the GroupInfo object.</t>
          <t>As with Remove proposals, clients need to be able to receive a Commit message
which removes them from the group via a SelfRemove. If the DS does not forward a
Commit to a removed client, it needs to inform the removed client out-of-band.</t>
        </section>
      </section>
      <section anchor="last-resort-keypackages">
        <name>Last resort KeyPackages</name>
        <t>Type: KeyPackage extension</t>
        <section anchor="description-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 0000 to 0x7FFF FFFF are via Specification Required
policy <xref target="RFC8126"/> using the MLS Designated Experts. Assignments in the range
0x8000 0000 to 0xFFFF FFFF are for private use.</t>
        <t>Template:</t>
        <ul spacing="normal">
          <li>
            <t>Value: The numeric value of the component ID</t>
          </li>
          <li>
            <t>Name: The name of the component</t>
          </li>
          <li>
            <t>Where: The objects(s) in which the component may appear,
       drawn from the following list:
            </t>
            <ul spacing="normal">
              <li>
                <t>AD: SafeAAD objects</t>
              </li>
              <li>
                <t>AE: AppEpheral proposals</t>
              </li>
              <li>
                <t>ES: Exporter Secret labels</t>
              </li>
              <li>
                <t>GC: GroupContext objects</t>
              </li>
              <li>
                <t>GI: GroupInfo objects</t>
              </li>
              <li>
                <t>HP: HPKE key labels</t>
              </li>
              <li>
                <t>KP: KeyPackage objects</t>
              </li>
              <li>
                <t>LN: LeafNode objects</t>
              </li>
              <li>
                <t>PS: PSK labels</t>
              </li>
              <li>
                <t>SK: Signature Key labels</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Recommended: Same as in <xref section="17.1" sectionFormat="of" target="RFC9420"/></t>
          </li>
          <li>
            <t>Reference: The document where this component is defined</t>
          </li>
        </ul>
        <t>The restrictions noted in the "Where" column are to be enforced by the
application. MLS implementations <bcp14>MUST NOT</bcp14> impose restrictions on where component
IDs are used in which parts of MLS, unless specifically directed to by the
application.</t>
        <t>Initial Contents:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Where</th>
              <th align="left">R</th>
              <th align="left">Ref</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0000 0000</td>
              <td align="left">RESERVED</td>
              <td align="left">N/A</td>
              <td align="left">-</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x0000 0001</td>
              <td align="left">app_components</td>
              <td align="left">LN,GC</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x0000 0002</td>
              <td align="left">safe_aad</td>
              <td align="left">LN,GC</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x0000 0003</td>
              <td align="left">content_media_types</td>
              <td align="left">LN,GC</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x0000 0004</td>
              <td align="left">last_resort_key_package</td>
              <td align="left">KP</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x0000 0005</td>
              <td align="left">app_ack</td>
              <td align="left">AE</td>
              <td align="left">Y</td>
              <td align="left">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left">0x0000 0a0a</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">0x0000 1a1a</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">0x0000 2a2a</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">0x0000 3a3a</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">0x0000 4a4a</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">0x0000 5a5a</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">0x0000 6a6a</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">0x0000 7a7a</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">0x0000 8a8a</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">0x0000 9a9a</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">0x0000 aaaa</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">0x0000 baba</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">0x0000 caca</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">0x0000 dada</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">0x0000 eaea</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 0000 -</td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">0xFFFF FFFF</td>
              <td align="left">Reserved for Private Use</td>
              <td align="left">N/A</td>
              <td align="left">N</td>
              <td align="left">RFCXXXX</td>
            </tr>
          </tbody>
        </table>
        <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 1419?>

<section anchor="change-log">
      <name>Change Log</name>
      <t>RFC EDITOR PLEASE DELETE THIS SECTION.</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:
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
F7jI2EbVi0GLPZ6wiQ9GEvgO+O1HOSi92xxgx8Zjirm0XIPrm2kAsKatxLpt
dlzuXCVSMbVixeFCITTdaHf1OL255T185cBWpsyux5uYksZ39jkNi4J4W3s5
sVV93LVFT9bDTF2eGdyncxLjxehikxTgooVK4TGkT0wzzuZLGIrKiXEizibx
l4Boq5XNhjtaLGxtLr3pphQeKZnJY0z3TBaMBCMmdwa5qMXZTscqxAAq+CSh
hQvAKPYVzTImbsLH4w7VD0Sf+ZilOZeK/MMhvrhtCciqGFu1G4LpNyQ8koOx
SXioa8k+6TQ+Y+6ciZcKTanIul7zLqOlrutwsvXAkqxTZ2vBMS98jsRyHPPX
sUE8fWUqPGjUPIXHIV3X28IyIxtlhbOESIb4vpPubhtuDE1X7Dz4Iz9t0iwn
JG3S2EsqsIeOjti6j/w2RWi3ZtzCGL+nkYXa5SWOxaXo2f0I6kd8WyjqSF9T
43NL263Jpq6HCDdjscqDZ01fJReCDo0pdcCGqOTmNQtuwwMHi+WqusmDy0rf
RiT0/ZPoteaEtQD8JcsgULORJDRwNTK5aEW02vORKbTIxk7tLEFh0nhHTBcP
ExsnRRgOiSIWz0WbB9NEiZQFxHqBabed8gt+StuJqCaJOL/m2WX/lzrGamaN
A+nlupSCKciMmrw/PMsuWp0wqKmSYMOxoVOuT3ANU47lC6nHw5UlYcyGYzLv
LHq0o+IKGu/iRswqv7X96tnk81Nui1QgU6UIsQef0YO/wg6o0fz+ZOT34pjf
F6Rivfn+bG/kh74+4DguiUALRcE0Hbv7RmJI7v3qZ/xviP9KT+rbD3t74KyN
aROrUPBZJsjXVXDRW/Uuo6TVoFJeZ9zRjCRV0ySclUmWfjTdpeUebtplBPCD
uZzKj9qwXjEd7rdN9dWyPcggzEnLjhusObnu3Fuuudloa/E5SIwxo3LPPKfg
2pMmkv2fpIcge3VIyiePjKS4LauVKfRlrwiQHm7jE2rEYfdikdVDUAzuDXvx
irZoh0MSHsabuDMjl4kHOIwslfm3beLbobScBLGBEW1LTv3ihmnUD9xPh5Gd
yUVIreTsIykQeKVV+TW2VxvG9EYa+c1qK5wyrBivXtILIQFKUbroKbRA1XQM
1PMXC23q9V9CNgYfSvY3ePcBrjbowq5oqh3H46pg96jzvT75l59PX58cs4zT
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

-->

</rfc>
