<?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.8 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mls-extensions-04" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.21.0 -->
  <front>
    <title abbrev="MLS">The Messaging Layer Security (MLS) Extensions</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-04"/>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2024" month="April" day="24"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 47?>

<t>This document describes extensions to the Messaging Layer Security (MLS) protocol.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <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 51?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes extensions to <xref target="mls-protocol"/> that are not part of the
main protocol specification. The protocol specification includes a set of core
extensions that are likely to be useful to many applications. The extensions
described in this document are intended to be used by applications that need to
extend the MLS protocol.</t>
      <section anchor="change-log">
        <name>Change Log</name>
        <t>RFC EDITOR PLEASE DELETE THIS SECTION.</t>
        <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>
    <section anchor="safe-extensions">
      <name>Safe Extensions</name>
      <t>The MLS specification is extensible in a variety of ways (see Section 13 of the
<xref target="RFC9420"/>) and describes the negotiation and other handling of extensions and
their data within the protocol. However, it does not provide guidance on how
extensions can or should safely interact with the base MLS protocol. The goal of
this section is to simplify the task of developing MLS extensions.</t>
      <t>More concretely, this section defines the Safe Extension API, a library of
extension components which simplifies development and security analysis of
extensions, provides general guidance on using the built-in functionality of the
base MLS protocol to build extensions, defines specific examples of extensions
built on top of the Safe Extension API alongside the built-in mechanisms of the
base MLS protocol, defines a number of labels registered in IANA which can be
safely used by extensions, so that the only value an extension developer must
add to the IANA registry themselves is a unique ExtensionType.</t>
      <section anchor="safe-extension-api">
        <name>Safe Extension API</name>
        <t>The Safe Extension API is a library that defines a number of components from
which extensions can be built. In particular, these components provide
extensions the ability to:</t>
        <ul spacing="normal">
          <li>
            <t>Make use of selected private and public key material from the MLS
specification, e.g. to encrypt, decrypt, sign, verify and derive fresh key
material.</t>
          </li>
          <li>
            <t>Inject key material via PSKs in a safe way to facilitate state agreement
without the use of a group context extension.</t>
          </li>
          <li>
            <t>Export secrets from MLS in a way that, in contrast to the built-in export
functionality of MLS, preserves forward secrecy of the exported secrets within
an epoch.</t>
          </li>
        </ul>
        <t>The Safe Extension API is not an extension itself, it only defines components
from which other extensions can be built. Some of these components modify the
MLS protocol and, therefore, so do the extensions built from them.</t>
        <t>Where possible, the API makes use of mechanisms defined in the MLS
specification. For example, part of the safe API is the use of the
<tt>SignWithLabel</tt> function described in Section 5.1.2 of <xref target="RFC9420"/>.</t>
        <section anchor="security">
          <name>Security</name>
          <t>An extension is called safe if it does not modify the base MLS protocol or other
MLS extensions beyond using components of the Safe Extension API. The Safe
Extension API provides the following security guarantee: If an application uses
MLS and only safe MLS extensions, then the security guarantees of the base MLS
protocol and the security guarantees of safe extensions, each analyzed in
isolation, still hold for the composed extended MLS protocol. In other words,
the Safe Extension API protects applications from careless extension
developers. As long as all used extensions are safe, it is not possible that a
combination of extensions  (the developers of which did not know about each
other) impedes the security of the base MLS protocol or any used extension. No
further analysis of the combination is necessary. This also means that any
security vulnerabilities introduced by one extension do not spread to other
extensions or the base MLS.</t>
        </section>
        <section anchor="common-data-structures">
          <name>Common Data Structures</name>
          <t>Most components of the Safe Extension API use the value ExtensionType which is a
unique uint16 identifier assigned to an extension in the MLS Extension Types
IANA registry (see Section 17.3 of <xref target="RFC9420"/>).</t>
          <t>Most Safe Extension API components also use the following data structure, which
provides domain separation by <tt>extension_type</tt> of various <tt>extension_data</tt>.</t>
          <sourcecode type="tls"><![CDATA[
struct {
  ExtensionType extension_type;
  opaque extension_data<V>;
} ExtensionContent;
]]></sourcecode>
          <t>Where <tt>extension_type</tt> is set to the type of the extension to which the
<tt>extension_data</tt> belongs.</t>
          <t>If in addition a label is required, the following data structure is used.</t>
          <sourcecode type="tls"><![CDATA[
struct {
  opaque label;
  ExtensionContent extension_content;
} LabeledExtensionContent;
]]></sourcecode>
        </section>
        <section anchor="safe-hpke">
          <name>Hybrid Public Key Encryption (HPKE)</name>
          <t>This component of the Safe Extension API allows extensions to make use of all
HPKE key pairs generated by MLS. An extension identified by an ExtensionType 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 LabeledExtensionContent with
<tt>extension_type</tt> set to ExtensionType. The <tt>extension_data</tt> can be set to an
arbitrary Context specified by the extension designer (and can be empty if not
needed). For example, an extension can use a key pair PublicKey, PrivateKey to
encrypt data as follows:</t>
          <sourcecode type="tls"><![CDATA[
SafeEncryptWithContext(ExtensionType, PublicKey, Context, Plaintext) =
    SealBase(PublicKey, LabeledExtensionContent, "", Plaintext)

SafeDecryptWithContext(ExtensionType, PrivateKey, Context, KEMOutput, Ciphertext) =
    OpenBase(KEMOutput, PrivateKey, LabeledExtensionContent, "", Ciphertext)
]]></sourcecode>
          <t>Where the fields of LabeledExtensionContent are set to</t>
          <sourcecode type="tls"><![CDATA[
label = "MLS 1.0 ExtensionData"
extension_type = ExtensionType
extension_data = Context
]]></sourcecode>
          <t>For operations involving the secret key, ExtensionType MUST be set to the
ExtensionType of the implemented extension, and not to the type of any other
extension. In particular, this means that an extension cannot decrypt data meant
for another extension, while extensions can encrypt data to other extensions.</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 extension). 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 SHOULD NOT 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. Extensions 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, an extension identified by ExtensionType should sign and verify using:</t>
          <sourcecode type="tls"><![CDATA[
SafeSignWithLabel(ExtensionType, SignatureKey, Label, Content) =
    SignWithLabel(SignatureKey, "LabeledExtensionContent", LabeledExtensionContent)

SafeVerifyWithLabel(ExtensionType, VerificationKey, Label, Content, SignatureValue) =
    VerifyWithLabel(VerificationKey, "LabeledExtensionContent", LabeledExtensionContent, SignatureValue)
]]></sourcecode>
          <t>Where the fields of LabeledExtensionContent are set to</t>
          <sourcecode type="tls"><![CDATA[
label = Label
extension_type = ExtensionType
extension_data = Content
]]></sourcecode>
          <t>For signing operations, the ExtensionType MUST be set to the ExtensionType of
the implemented extension, and not to the type of any other extension. In
particular, this means that an extension cannot produce signatures in place of
other extensions. However, extensions can verify signatures computed by other
extensions. Note that domain separation is ensured by explicitly including the
ExtensionType with every operation.</t>
        </section>
        <section anchor="exporting-secrets">
          <name>Exporting Secrets</name>
          <t>An extension can use MLS as a group key agreement protocol by exporting symmetric keys.
Such keys can be exported (i.e. derived from MLS key material) in two phases per
epoch: Either at the start of the epoch, or during the epoch. Derivation at the
start of the epoch has the added advantage that the source key material is
deleted after use, allowing the derived key material to be deleted later even
during the same MLS epoch to achieve forward secrecy. The following protocol
secrets can be used to derive key from for use by extensions:</t>
          <ul spacing="normal">
            <li>
              <t>epoch_secret at the beginning of an epoch</t>
            </li>
            <li>
              <t>extension_secret during an epoch</t>
            </li>
          </ul>
          <t>The extension_secret is an additional secret derived from the epoch_secret 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 "extension".</t>
          <t>Any derivation performed by an extension either from the epoch_secret or the
extension_secret has to use the following function:</t>
          <sourcecode type="tls"><![CDATA[
DeriveExtensionSecret(Secret, Label) =
  ExpandWithLabel(Secret, "ExtensionExport " + ExtensionType + " " + Label)
]]></sourcecode>
          <t>Where ExpandWithLabel is defined in Section 8 of <xref target="RFC9420"/> and where ExtensionType
MUST be set to the ExtensionType of the implemented extension.</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 Section 8.4 of <xref 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, an extension can use the PSK mechanism to enforce that all group
members have access to and agree on a password or a shared file.</t>
          <t>This is achieved by creating a new epoch via a PSK proposal. Transitioning to
the new epoch requires using the information agreed upon.</t>
          <t>To facilitate using PSKs in a safe way, this document defines a new PSKType for
extensions. This provides domain separation between pre-shared keys used by the
core MLS protocol and applications, and between those used by different extensions.</t>
          <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  external(1),
  resumption(2),
  extensions(3),
  (255)
} PSKType;

struct {
  PSKType psktype;
  select (PreSharedKeyID.psktype) {
    case external:
      opaque psk_id<V>;

    case resumption:
      ResumptionPSKUsage usage;
      opaque psk_group_id<V>;
      uint64 psk_epoch;

    case extensions:
      ExtensionType extension_type;
      opaque psk_id<V>;
  };
  opaque psk_nonce<V>;
} PreSharedKeyID;
]]></sourcecode>
        </section>
        <section anchor="extension-designer-tools">
          <name>Extension Designer Tools</name>
          <t>The safe extension API allows extension designers to sign and encrypt payloads
without the need to register their own IANA labels. Following the same pattern,
this document also provides ways for extension designers to define their own
wire formats, proposals and credentials.</t>
          <section anchor="wire-formats">
            <name>Wire Formats</name>
            <t>Extensions can define their own MLS messages by using the mls_extension_message
MLS Wire Format. The mls_extension_message Wire Format is IANA registered
specifically for this purpose and extends the select statement in the MLSMessage
struct as follows:</t>
            <sourcecode type="tls"><![CDATA[
case mls_extension_message:
    ExtensionContent extension_content;
]]></sourcecode>
            <t>The extension_type in <tt>extension_content</tt> MUST be set to the type of the
extension in question.
Processing of self-defined wire formats has to be defined by the extension.</t>
          </section>
          <section anchor="proposals">
            <name>Proposals</name>
            <t>Similar to wire formats, extensions can define their own proposals by using one
of three dedicated extension proposal types: extension_proposal,
extension_path_proposal and extension_external_propsal. Each type contains the
same ExtensionContent struct, but is validated differently: extension_proposal
requires no UpdatePath and can not be sent by an external sender
extension_path_proposal requires an UpdatePath and can not be sent by an external
sender extensions_external_proposal requires no UpdatePath and can be sent by an
external sender.</t>
            <t>Each of the three proposal types is IANA registered and extends the select
statement in the Proposal struct as follows:</t>
            <sourcecode type="tls"><![CDATA[
case extension_proposal:
    ExtensionContent extension_content;
case extension_path_proposal:
    ExtensionContent extension_content;
case extension_external_proposal:
    ExtensionContent extension_content;
]]></sourcecode>
            <t>The extension_type MUST be set to the type of the extension in question.</t>
            <t>Processing and validation of self-defined proposals has to be defined by the
extension. However, validation rules can lead to a previously valid commit to
become invalid, not the other way around. This is with the exception of proposal
validation for external commits, where self-defined proposals can be declared
valid for use in external commits. More concretely, if an external commit is
invalid, only because the self-defined proposal is part of it (the last rule in
external commit proposal validation in Section 12.2 of <xref target="RFC9420"/>), then the
self-defined validation rules may rule that the commit is instead valid.</t>
          </section>
          <section anchor="credentials">
            <name>Credentials</name>
            <t>Extension designers can also define their own credential types via the IANA
registered extension_credential credential type. The extension_credential
extends the select statement in the Credential struct as follows:</t>
            <sourcecode type="tls"><![CDATA[
case extension_credential:
    ExtensionContent extension_content;
]]></sourcecode>
            <t>The extension_type in the extension_content must be set to that of the extension
in question  with the extension_data containing all other relevant data. Note
that any credential defined in this way has to meet the requirements detailed in
Section 5.3 of the MLS specification.</t>
          </section>
        </section>
      </section>
      <section anchor="extension-design-guidance">
        <name>Extension Design Guidance</name>
        <t>While extensions can modify the protocol flow of MLS and the associated
properties in arbitrary ways, the base MLS protocol already enables a number of
functionalities that extensions can use without modifying MLS itself. Extension
authors should consider using these built-in mechanisms before employing more
intrusive changes to the protocol.</t>
        <section anchor="storing-state-in-extensions">
          <name>Storing State in Extensions</name>
          <t>Every type of MLS extension can have data associated with it and, depending on
the type of extension (KeyPackage Extension, GroupContext Extension, etc.) that
data is included in the corresponding MLS struct. This allows the authors of an
extension to make use of any authentication or confidentiality properties that
the struct is subject to as part of the protocol flow.</t>
          <ul spacing="normal">
            <li>
              <t>GroupContext Extensions: Any data in a group context extension is agreed-upon
by all members of the group in the same way as the rest of the group state. As
part of the GroupContext, it is also sent encrypted to new joiners via Welcome
messages and (depending on the architecture of the application) may be
available to external joiners. Note that in some scenarios, the GroupContext
may also be visible to components  that implement the delivery service.</t>
            </li>
            <li>
              <t>GroupInfo Extensions: GroupInfo extensions are included in the GroupInfo
struct and thus sent encrypted and authenticated by the signer of the
GroupInfo to new joiners as part of Welcome messages. It can thus be used as a
confidential and authenticated channel from the inviting group member to new
joiners. Just like GroupContext extensions, they may also be visible to
external joiners or even parts of the delivery service. Unlike GroupContext
extensions, the GroupInfo struct is not part of the group state that all group
members agree on.</t>
            </li>
            <li>
              <t>KeyPackage Extensions: KeyPackages (and the extensions they include) are
pre-published by individual clients for asynchronous group joining. They are
included in Add proposals and become part of the group state once the Add
proposal is committed. They are, however, removed from the group state when
the owner of the KeyPackage does the first commit with a path. As such,
KeyPackage extensions can be used to communicate data to anyone who wants to
invite the owner to a group, as well as the other members of the group the
owner is added to. Note that KeyPackage extensions are visible to the server
that provides the KeyPackages for download, as well as any part of the
delivery service that can see the public group state.</t>
            </li>
            <li>
              <t>LeafNode Extensions: LeafNodes are a part of every KeyPackage and thus follow
the same lifecycle. However, they are also part of any commit that includes an
UpdatePath and clients generally have a leaf node in each group they are a member
of. Leaf node extensions can thus be used to include member-specific data in a
group state that can be updated by the owner at any time.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="extensions">
      <name>Extensions</name>
      <section anchor="appack">
        <name>AppAck</name>
        <t>Type: Proposal</t>
        <section anchor="description">
          <name>Description</name>
          <t>An AppAck proposal is used to acknowledge receipt of application messages.
Though this information implies no change to the group, it is structured as a
Proposal message 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 proposal 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 proposals 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>
          <t>The schedule on which sending AppAck proposals are sent 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 proposal 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 proposals 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>
      <section anchor="targeted-messages">
        <name>Targeted messages</name>
        <section anchor="description-1">
          <name>Description</name>
          <t>MLS application messages make sending encrypted messages to all group members
easy and efficient. Sometimes application protocols mandate that messages are
only sent to specific group members, either for privacy or for efficiency
reasons.</t>
          <t>Targeted messages are a way to achieve this without having to create a new group
with the sender and the specific recipients – which might not be possible or
desired. Instead, targeted messages define the format and encryption of a
message that is sent from a member of an existing group to another member of
that group.</t>
          <t>The goal is to provide a one-shot messaging mechanism that provides
confidentiality and authentication.</t>
          <t>Targeted Messages makes use the Safe Extension API as defined in <xref target="safe-extension-api"/>.
reuse mechanisms from <xref target="mls-protocol"/>, in particular <xref target="hpke"/>.</t>
        </section>
        <section anchor="format">
          <name>Format</name>
          <t>This extension uses the <tt>mls_extension_message</tt> WireFormat as defined in Section
<xref target="wire-formats"/>, where the content is a <tt>TargetedMessage</tt>.</t>
          <sourcecode type="tls"><![CDATA[
struct {
  opaque group_id<V>;
  uint64 epoch;
  uint32 recipient_leaf_index;
  opaque authenticated_data<V>;
  opaque encrypted_sender_auth_data<V>;
  opaque hpke_ciphertext<V>;
} TargetedMessage;

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

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

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

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

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

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

sender_data_key = ExpandWithLabel(sender_auth_data_secret, "key",
                      ciphertext_sample, AEAD.Nk)
sender_data_nonce = ExpandWithLabel(sender_auth_data_secret, "nonce",
                      ciphertext_sample, AEAD.Nn)
]]></sourcecode>
            <t>The Additional Authenticated Data (AAD) for the <tt>SenderAuthData</tt> ciphertext is
the first three fields of <tt>TargetedMessage</tt>:</t>
            <sourcecode type="tls"><![CDATA[
struct {
  opaque group_id<V>;
  uint64 epoch;
  uint32 recipient_leaf_index;
} SenderAuthDataAAD;
]]></sourcecode>
          </section>
          <section anchor="padding">
            <name>Padding</name>
            <t>The <tt>TargetedMessage</tt> structure does not include a padding field. It is the
responsibility of the sender to add padding to the <tt>message</tt> as used in the next
section.</t>
          </section>
        </section>
        <section anchor="authentication">
          <name>Authentication</name>
          <t>For ciphersuites that support it, HPKE <tt>mode_auth_psk</tt> is used for
authentication. For other ciphersuites, HPKE <tt>mode_psk</tt> is used along with a
signature. The authentication scheme is indicated by the <tt>authentication_scheme</tt>
field in <tt>TargetedMessageContent</tt>. See <xref target="guidance-on-authentication-schemes"/>
for more information.</t>
          <t>For the PSK part of the authentication, clients export a dedicated secret:</t>
          <sourcecode type="tls"><![CDATA[
targeted_message_psk
  = DeriveExtensionSecret(extension_secret, "targeted message psk")
]]></sourcecode>
          <t>The functions <tt>SealAuth</tt> and <tt>OpenAuth</tt> defined in <xref target="hpke"/> are used as
described in <xref target="safe-hpke"/> with an empty context. Other functions are defined in
<xref target="mls-protocol"/>.</t>
          <section anchor="authentication-with-hpke">
            <name>Authentication with HPKE</name>
            <t>The sender MUST set the authentication scheme to
<tt>TargetedMessageAuthScheme.HPKEAuthPsk</tt>.</t>
            <t>As described in <xref target="safe-hpke"/> the <tt>hpke_context</tt> is a LabeledExtensionContent struct
with the following content, where <tt>group_context</tt> is the serialized context of
the group.</t>
            <sourcecode type="tls"><![CDATA[
label = "MLS 1.0 ExtensionData"
extension_type = ExtensionType
extension_data = group_context
]]></sourcecode>
            <t>The sender then computes the following:</t>
            <sourcecode type="tls"><![CDATA[
(kem_output, hpke_ciphertext) = SealAuthPSK(receiver_node_public_key,
                                            hpke_context,
                                            targeted_message_tbm,
                                            message,
                                            targeted_message_psk,
                                            psk_id,
                                            sender_node_private_key)
]]></sourcecode>
            <t>The recipient computes the following:</t>
            <sourcecode type="tls"><![CDATA[
message = OpenAuthPSK(kem_output,
                      receiver_node_private_key,
                      hpke_context,
                      targeted_message_tbm,
                      hpke_ciphertext,
                      targeted_message_psk,
                      psk_id,
                      sender_node_public_key)
]]></sourcecode>
          </section>
          <section anchor="authentication-with-signatures">
            <name>Authentication with signatures</name>
            <t>The sender MUST set the authentication scheme to
<tt>TargetedMessageAuthScheme.SignatureHPKEPsk</tt>. The signature is done using the
<tt>signature_key</tt> of the sender's <tt>LeafNode</tt> and the corresponding signature
scheme used in the group.</t>
            <t>The sender then computes the following with <tt>hpke_context</tt> defined as in
<xref target="authentication-with-hpke"/>:</t>
            <sourcecode type="tls"><![CDATA[
(kem_output, hpke_ciphertext) = SealPSK(receiver_node_public_key,
                                        hpke_context,
                                        targeted_message_tbm,
                                        message,
                                        targeted_message_psk,
                                        epoch)
]]></sourcecode>
            <t>The signature is computed as follows, where the <tt>extension_type</tt> is the type of
this extension (see <xref target="iana-considerations"/>).</t>
            <sourcecode type="tls"><![CDATA[
signature = SafeSignWithLabel(extension_type, ., "TargetedMessageTBS", targeted_message_tbs)
]]></sourcecode>
            <t>The recipient computes the following:</t>
            <sourcecode type="tls"><![CDATA[
message = OpenPSK(kem_output,
                  receiver_node_private_key,
                  hpke_context,
                  targeted_message_tbm,
                  hpke_ciphertext,
                  targeted_message_psk,
                  epoch)
]]></sourcecode>
            <t>The recipient MUST verify the message authentication:</t>
            <sourcecode type="tls"><![CDATA[
SafeVerifyWithLabel.verify(extension_type,
                        sender_leaf_node.signature_key,
                        "TargetedMessageTBS",
                        targeted_message_tbs,
                        signature)
]]></sourcecode>
          </section>
        </section>
        <section anchor="guidance-on-authentication-schemes">
          <name>Guidance on authentication schemes</name>
          <t>If the group’s ciphersuite does not support HPKE <tt>mode_auth_psk</tt>,
implementations MUST choose <tt>TargetedMessageAuthScheme.SignatureHPKEPsk</tt>.</t>
          <t>If the group’s ciphersuite does support HPKE <tt>mode_auth_psk</tt>, implementations
CAN choose <tt>TargetedMessageAuthScheme.HPKEAuthPsk</tt> if better efficiency and/or
repudiability is desired. Implementations SHOULD consult
<xref target="hpke-security-considerations"/> beforehand.</t>
        </section>
      </section>
      <section anchor="content-advertisement">
        <name>Content Advertisement</name>
        <section anchor="description-2">
          <name>Description</name>
          <t>This section describes two extensions to MLS. The first allows MLS clients
to advertise their support for specific formats inside MLS <tt>application_data</tt>.
These are expressed using the extensive IANA Media Types registry (formerly
called MIME Types).  The <tt>accepted_media_types</tt> LeafNode extension lists the
formats a client supports inside <tt>application_data</tt>. The second, the
<tt>required_media_types</tt> GroupContext extension specifies which media types
need to be supported by all members of a particular MLS group.
These allow clients to confirm that all members of a group can communicate.
Note that when the membership of a group changes, or when the policy of the
group changes, it is responsibility of the committer to insure that the membership
and policies are compatible.</t>
          <t>Finally, this document defines a minimal framing format so MLS clients can signal
which media type is being sent when multiple formats are permitted in the same group.
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>Note that the usage of IANA media types in general does not imply the usage of MIME
Headers <xref target="RFC2045"/> for framing. 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>
        </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>.
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 */
    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 {
    MediaType media_types<V>;
} MediaTypeList;

MediaTypeList accepted_media_types;
MediaTypeList required_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 SHOULD include the
<tt>accepted_media_types</tt> extension in its LeafNodes, listing
all the media types it can receive. As usual, the
client also includes <tt>accepted_media_types</tt> in its <tt>capabilities</tt> field in
its LeafNodes (including LeafNodes inside its KeyPackages).</t>
          <t>When creating a new MLS group for an application using this specification,
the group MAY include a <tt>required_media_type</tt> extension in the GroupContext
Extensions. As usual, the client also includes
<tt>required_media_types</tt> in its <tt>capabilities</tt> field in its LeafNodes
(including LeafNodes inside its KeyPackages). When used in a group, the client
MUST include the <tt>required_media_types</tt> and <tt>accepted_media_types</tt> extensions
in the list of extensions in RequiredCapabilities.</t>
          <t>MLS clients SHOULD NOT add an MLS client to an MLS group with <tt>required_media_types</tt>
unless the MLS client advertises it can support all of the required MediaTypes.
As an exception, a client could be preconfigured to know that certain clients
support the requried 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="framing-of-applicationdata">
          <name>Framing of application_data</name>
          <t>When an MLS group contains the <tt>required_media_types</tt> GroupContext extension,
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> MAY be zero length, in which case, the media type of the
<tt>application_content</tt> is interpreted as the first MediaType specified in
<tt>required_media_types</tt>.</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 [@!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 MUST 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 MUST 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 MUST 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 MUST 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 MUST NOT 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 SHOULD 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-3">
          <name>Description</name>
          <t>Section 10 of <xref target="RFC9420"/> details that clients are required to pre-publish
KeyPackages s.t. 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 SHOULD NOT be reused except
in the case of a "last resort" KeyPackage (see Section 16.8). Clients MAY
generate and publish multiple KeyPackages to support multiple cipher suites.</t>
            </li>
          </ul>
          <t>Section 16.8 of <xref target="RFC9420"/> then introduces the notion of last-resort
KeyPackages as follows:</t>
          <ul empty="true">
            <li>
              <t>An application MAY 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 extension defined
in this section fills this gap and allows clients to specifically mark
KeyPackages as KeyPackages of last resort that MAY be used more than once in
scenarios where all other KeyPackages have already been used.</t>
          <t>The extension 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 an extension rather than communicating the
information out-of-band is that the extension is still present in Add proposals.
Clients processing such Add proposals can authenticate that a KeyPackage is a
last-resort KeyPackage and MAY make policy decisions based on that information.</t>
        </section>
        <section anchor="format-1">
          <name>Format</name>
          <t>The purpose of the extension is simply to mark a given KeyPackage, which means
it carries no additional data.</t>
          <t>As a result, a LastResort Extension contains the ExtensionType with an empty
<tt>extension_data</tt> field.</t>
        </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>RFC EDITOR: Please replace XXXX throughout with the RFC number assigned to
this document</t>
      <section anchor="mls-wire-formats">
        <name>MLS Wire Formats</name>
        <section anchor="mls-extension-message">
          <name>MLS Extension Message</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0006</t>
            </li>
            <li>
              <t>Name: mls_extension_message</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="mls-extension-types">
        <name>MLS Extension Types</name>
        <section anchor="targetedmessagescapability-mls-extension">
          <name>targeted_messages_capability MLS Extension</name>
          <t>The <tt>targeted_messages_capability</tt> MLS Extension Type is used in the
capabilities field of LeafNodes to indicate the support for the Targeted
Messages Extension. The extension does not carry any payload.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0006</t>
            </li>
            <li>
              <t>Name: targeted_messages_capability</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="targetedmessages-mls-extension">
          <name>targeted_messages MLS Extension</name>
          <t>The <tt>targeted_messages</tt> MLS Extension Type is used inside GroupContext objects. It
indicates that the group supports the Targeted Messages Extension.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0007</t>
            </li>
            <li>
              <t>Name: targeted_messages</t>
            </li>
            <li>
              <t>Message(s): GC: This extension may appear in GroupContext objects</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
        <section anchor="acceptedmediatypes-mls-extension">
          <name>accepted_media_types MLS Extension</name>
          <t>The <tt>accepted_media_types</tt> MLS Extension Type is used inside LeafNode objects. It
contains a MediaTypeList representing all the media types supported by the
MLS client referred to by the LeafNode.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0008</t>
            </li>
            <li>
              <t>Name: accepted_media_types</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="requiredmediatypes-mls-extension">
          <name>required_media_types MLS Extension</name>
          <t>The required_media_types MLS Extension Type is used inside GroupContext objects. It
contains a MediaTypeList representing the media types which are mandatory for all
MLS members of the group to support.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0009</t>
            </li>
            <li>
              <t>Name: required_media_types</t>
            </li>
            <li>
              <t>Message(s): GC: This extension may appear in GroupContext objects</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
        <section anchor="lastresortkeypackage-mls-extension">
          <name>last_resort_key_package MLS Extension</name>
          <t>The last_resort_key_package MLS Extension Type is used inside KeyPackage
objects. It marks the KeyPackage for usage in last resort scenarios and contains
no additional data.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x000A</t>
            </li>
            <li>
              <t>Name: last_resort_key_package</t>
            </li>
            <li>
              <t>Message(s): KP: This extension may appear in KeyPackage 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="extension-proposal">
          <name>Extension Proposal</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0008</t>
            </li>
            <li>
              <t>Name: extension_proposal</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Path Required: N</t>
            </li>
            <li>
              <t>External Sender: N</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
        <section anchor="extension-path-proposal">
          <name>Extension Path Proposal</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0009</t>
            </li>
            <li>
              <t>Name: extension_path_proposal</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Path Required: Y</t>
            </li>
            <li>
              <t>External Sender: N</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
        <section anchor="extension-external-proposal">
          <name>Extension External Proposal</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x000a</t>
            </li>
            <li>
              <t>Name: extension_external_proposal</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Path Required: N</t>
            </li>
            <li>
              <t>External Sender: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
        <section anchor="appack-proposal">
          <name>AppAck Proposal</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x000b</t>
            </li>
            <li>
              <t>Name: app_ack</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Path Required: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</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: 0x000c</t>
            </li>
            <li>
              <t>Name: self_remove</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>External: N</t>
            </li>
            <li>
              <t>Path Required: Y</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="mls-credential-types">
        <name>MLS Credential Types</name>
        <section anchor="extension-credential">
          <name>Extension Credential</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0000</t>
            </li>
            <li>
              <t>Name: extension_credential</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="mls-signature-labels">
        <name>MLS Signature Labels</name>
        <section anchor="labeled-extension-content">
          <name>Labeled Extension Content</name>
          <ul spacing="normal">
            <li>
              <t>Label: "LabeledExtensionContent"</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <section anchor="appack-1">
        <name>AppAck</name>
        <t>TBC</t>
      </section>
      <section anchor="targeted-messages-1">
        <name>Targeted Messages</name>
        <t>In addition to the sender authentication, Targeted Messages are authenticated by
using a preshared key (PSK) between the sender and the recipient. The PSK is
exported from the group key schedule using the label "targeted message psk".
This ensures that the PSK is only valid for a specific group and epoch, and the
Forward Secrecy and Post-Compromise Security guarantees of the group key
schedule apply to the targeted messages as well. The PSK also ensures that an
attacker needs access to the private group state in addition to the
HPKE/signature's private keys. This improves confidentiality guarantees against
passive attackers and authentication guarantees against active attackers.</t>
      </section>
      <section anchor="content-advertisement-1">
        <name>Content Advertisement</name>
        <t>Use of the <tt>accepted_media_types</tt> and <tt>rejected_media_types</tt> extensions
could leak some private information visible in KeyPackages and inside an MLS group.
They could be used to infer a specific implementation, platform, or even version.
Clients should consider carefully the privacy implications in their environment of
making a list of acceptable media types available.</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>
  </middle>
  <back>
    <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="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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="mls-protocol" target="https://datatracker.ietf.org/doc/draft-ietf-mls-protocol/](https://datatracker.ietf.org/doc/draft-ietf-mls-protocol/">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="hpke" target="https://www.rfc-editor.org/rfc/rfc9180.html](https://www.rfc-editor.org/rfc/rfc9180.html">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="hpke-security-considerations" target="https://www.rfc-editor.org/rfc/rfc9180.html#name-key-compromise-impersonatio](https://www.rfc-editor.org/rfc/rfc9180.html#name-key-compromise-impersonatio">
          <front>
            <title>HPKE Security Considerations</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </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>
        <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>
      </references>
    </references>
    <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>Wire</organization>
        <address>
          <email>rohan@wire.com</email>
        </address>
      </contact>
      <contact initials="M." surname="Mularczyk" fullname="Marta Mularczyk">
        <organization>Amazon</organization>
        <address>
          <email>mulmarta@amazon.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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
x6fm/wGDHMsQsLIAAA==

-->

</rfc>
