<?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.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mls-extensions-05" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="MLS">The Messaging Layer Security (MLS) Extensions</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-05"/>
    <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="October" day="21"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 48?>

<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 52?>

<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-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>
    <section anchor="safe-extensions">
      <name>Safe Extensions</name>
      <t>The MLS specification is extensible in a variety of ways (see Section 13 of
<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 itself 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>
          <li>
            <t>Define new WireFormat, Proposal, Credential, GroupContext, GroupInfo,
KeyPackage, and LeafNode extensions which can interact safely with arbitrary
sets of other current or future Safe Extensions.</t>
          </li>
          <li>
            <t>Anchor extension-specific state in an MLS group to ensure agreement and manage
state acces authorization across extensions.</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="core-struct-extensions">
          <name>Core Struct Extensions</name>
          <t>Every type of MLS extension can have data associated with it. The "MLS
Extensions Types" registry historically represented 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 registered at the time of this writing extend one or more
of these core structs.</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. While
MLS extensions can define arbitrary GroupContext extensions, it is recommended
to make use of <tt>ExtensionState</tt> extensions to store state in the group's
GroupContext.</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 anchor="common-data-structures">
          <name>Common Data Structures</name>
          <t>The Safe Extension API reuses the <tt>ExtensionType</tt> and the "MLS Extension
Types" IANA registry used for these core structs (see Section 17.3 of
<xref target="RFC9420"/>), even for safe extensions with no core struct changes.
This is because many extensions modify a core struct, either primarily or
to store state (related to the group or a client) associated with another
aspect of that extension.</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>When a label is required for an extension, the following data structure is
used.</t>
          <sourcecode type="tls"><![CDATA[
struct {
  opaque label;
  ExtensionContent extension_content;
} LabeledExtensionContent;
]]></sourcecode>
        </section>
        <section anchor="negotiating-support-for-safe-extensions">
          <name>Negotiating Support for Safe Extensions</name>
          <t>MLS defines a <tt>Capabilities</tt> struct for LeafNodes (in turn used in
KeyPackages), which describes which extensions are supported by the
associated node.
However, that struct (defined in Section 7.2 of <xref target="RFC9420"/>) only has
fields for a subset of the extensions possible in MLS, as reproduced below.</t>
          <sourcecode type="tls"><![CDATA[
...
struct {
    ProtocolVersion versions<V>;
    CipherSuite cipher_suites<V>;
    ExtensionType extensions<V>;
    ProposalType proposals<V>;
    CredentialType credentials<V>;
} Capabilities;
...
]]></sourcecode>
          <t>Therefore, all safe extensions MUST be represented by their <tt>extension_type</tt>
in the <tt>extensions</tt> vector (originally intended for core struct extensions),
regardless of their type.</t>
          <t>If the LeafNode supports any safe extension Credentials, the <tt>credentials</tt>
vector will contain any non-safe credentials supported, plus the <tt>extension_credential</tt> defined in {extension-credential}.</t>
          <t>If the LeafNode supports any safe extension Proposals, then <tt>proposals</tt> will
contain any non-default non-safe extensions, and whichever safe extension
proposal types defined in {mls-proposal-types} are relevant to the supported
safe proposals.</t>
          <t>Likewise, the <tt>required_capabilities</tt> GroupContext extension (defined
in Section 11.1 of <xref target="RFC9420"/> and reproduced below) contains all
mandatory to support non-default non-safe, and safe extensions in its
<tt>extension_types</tt> vector. Its <tt>credential_types</tt> vector contains any
mandatory non-safe credential types, plus <tt>extensions_credential</tt> if any
safe credential is required. Its <tt>proposal_types</tt> vector contains any
mandatory to support non-default non-safe Proposals, and the relevant safe
proposal type or types corresponding to any required safe proposals.</t>
          <artwork><![CDATA[
struct {
    ExtensionType extension_types<V>;
    ProposalType proposal_types<V>;
    CredentialType credential_types<V>;
} RequiredCapabilities;
]]></artwork>
        </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, credentials, and for structured data in the
Additional Authenticated Data.</t>
          <section anchor="core-struct-extensions-1">
            <name>Core Struct Extensions</name>
            <t>Each extension of the GroupContext, GroupInfo, KeyPackage, and/or LeafNode
structs is required to define the format of its data. These types of
extensions SHOULD NOT use the <tt>ExtensionContent</tt> struct since the <tt>extension_type</tt> is already in the parent data structure.</t>
          </section>
          <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 anchor="safe-aad">
            <name>Additional Authenticated Data (AAD)</name>
            <t>The <tt>PrivateContentAAD</tt> struct in MLS can contain arbitrary additional
application-specific AAD in its <tt>authenticated_data</tt> field. This framework
defines a framing used to allow multiple extensions to add AAD safely
without conflicts or ambiguity.</t>
            <t>When any AAD safe extension is included in the <tt>authenticated_data</tt> field,
the "safe" AAD items MUST 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>ExtensionType</tt>
as described below:</t>
            <sourcecode type="tls"><![CDATA[
struct {
  ExtensionType extension_type;
  opaque aad_item_data<V>;
} SafeAADItem;

struct {
  SafeAADItem aad_items<V>;
} SafeAAD;
]]></sourcecode>
            <t>If the <tt>SafeAAD</tt> is present or not is determined by the presence of the
<tt>extension_aad</tt> GroupContext extension in the <tt>required_capabilities</tt> of the
group. If <tt>extension_aad</tt> is present in <tt>required_capabilities</tt> but no
"safe" AAD items are present, the <tt>aad_items</tt> is a zero-length vector.</t>
            <t>Each extension which include a <tt>SafeAADItem</tt> needs to advertise its
<tt>ExtensionType</tt> in its LeafNode <tt>capabilities.extensions</tt>. Extensions MAY
require an <tt>ExtensionType</tt> to be included in <tt>required_capabilities</tt>, but
members which encounter a <tt>SafeAADItem</tt> they do not recognize can safely
ignore it.</t>
          </section>
        </section>
        <section anchor="extension-state-anchoring-storage-and-agreement">
          <name>Extension state: anchoring, storage and agreement</name>
          <t>The safe extension framework can help an MLS extension ensure that all group
members agree on a piece of extension-specific state by using the
<tt>ExtensionState</tt> GroupContext extension. The ownership of an <tt>ExtensionState</tt>
extension in the context of the safe extension framework is determined by the
<tt>extension_type</tt> field. The extension with a matching <tt>extension_type</tt> is called
the owning extension.</t>
          <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  read(1),
  none(2),
 (255)
} Permissions;

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

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

struct {
  extensionType extension_type;
  Permissions read;
  ExtensionPayload payload;
} ExtensionState;
]]></sourcecode>
          <t>The <tt>ExtensionState</tt> GroupContext extension contains data either directly (if
<tt>hash_or_data = data</tt>) or inditectly via a hash (if <tt>hash_or_data = hash</tt>).</t>
          <t>The owning extension can read and write the state stored in an <tt>ExtensionState</tt>
extension using an extension-defined proposal (see <xref target="proposals"/>). The semantics
of the proposal determines how the state is changed.</t>
          <t>The <tt>read</tt> variable determines the permissions that other MLS extensions have
w.r.t. the data stored within. <tt>read</tt> allows other MLS extensions to read that
data via their own proposals, while <tt>none</tt> marks the data as private to the
owning MLS extension.</t>
          <t>Other extensions may never write to the <tt>ExtensionState</tt> of the owning MLS
extension.</t>
          <section anchor="direct-vs-hash-based-storage">
            <name>Direct vs. hash-based storage</name>
            <t>Storing the data directly in the <tt>ExtensionState</tt> means the data becomes part of
the group state. Depending on the application design, this can be advantageous,
because it is distributed via Welcome messages. However, it could also mean that
the data is visible to the delivery service. Additionally, if the application
makes use of GroupContextExtension proposals, it may be necessary to send all of
the data with each such extension.</t>
            <t>Including the data by hash only allows group members to agree on the data
indirectly, relying on the collision resistance of the associated hash function.
The data itself, however, may have to be transmitted out-of-band to new joiners.</t>
          </section>
          <section anchor="groupcontextextensions">
            <name>GroupContextExtensions</name>
            <t>MLS allows applications to modify GroupContext extensions via the
GroupContextExtension proposal. However, control via that proposal involves
including all GroupContext extensions in each such proposal. This makes data
management more costly than via extension-specific proposals, which can, for
example, include only the data to be changed for a given GroupContext extension,
or define semantics that allow modification based on local data only.</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>
    </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>
        <t>This document updates the MLS Extension Types registry to insert a new
column ("Safe") between the "Recommended" column and the "Reference"
column. The value of the "Safe" column for the first (0x0000) and last
(0xF000-0xFFFF) rows is "-" while the value of all other existing rows is
"N".</t>
        <ul spacing="normal">
          <li>
            <t>Safe: Whether the extension is a Safe Extension as defined in Section 2 of
 RFC XXXX.  Valid values are:
            </t>
            <ul spacing="normal">
              <li>
                <t>"Y", indicating the extension is a Safe Extension;</t>
              </li>
              <li>
                <t>"N", indicating the extension is not a Safe Extension; or</t>
              </li>
              <li>
                <t>"-", indicating a reserved value which is not a single extension.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>This document also extends the list of allowable values for the "Message(s)"
column, such that the list may be empty (represented by "-") if the
extension is a Safe Extension.</t>
        <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 anchor="extensionaad-mls-extension">
          <name>extension_aad MLS Extension</name>
          <t>The extension_aad MLS Extension Type is used to signal support for <tt>SafeAAD</tt>
in LeafNode capabilities, and in GroupContext <tt>required_capabilities</tt>. It contains no additional data.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x000B</t>
            </li>
            <li>
              <t>Name: extension_aad</t>
            </li>
            <li>
              <t>Message(s): LN,GC: This extension may appear in LeafNode and GroupContext
objects.</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
        <section anchor="safeextensions-mls-extension">
          <name>safe_extensions MLS Extension</name>
          <t>The <tt>safe_extensions</tt> MLS Extension Type is used to signal support for the
Safe Extensions Framework in LeafNode capabilities, and in GroupContext
<tt>required_capabilities</tt>. It contains no additional data.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x000C</t>
            </li>
            <li>
              <t>Name: safe_extensions</t>
            </li>
            <li>
              <t>Message(s): LN,GC: This extension may appear in LeafNode and GroupContext
objects.</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: RFC XXXX</t>
            </li>
          </ul>
        </section>
        <section anchor="corestructextensions-mls-extension">
          <name>core_struct_extensions MLS Extension</name>
          <t>The <tt>core_struct_extensions</tt> MLS Extension Type is used to signal support
for one or more Core Struct Extensions using the Safe Extensions Framework.
It appears in LeafNode capabilities, and in GroupContext
<tt>required_capabilities</tt>. It contains no additional data.</t>
          <ul spacing="normal">
            <li>
              <t>Value: 0x000D</t>
            </li>
            <li>
              <t>Name: core_struct_extensions</t>
            </li>
            <li>
              <t>Message(s): LN,GC: This extension may appear in LeafNode and 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="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: 0x0003</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 anchor="mls-extension-types-1">
        <name>MLS Extension Types</name>
        <t>This document modifies the rules of the "MLS Extension Types" registry
to add a new Message type as follows:</t>
        <ul spacing="normal">
          <li>
            <t>AD: Authenticated Additional Data</t>
          </li>
        </ul>
        <t>The <tt>AD</tt> Message type refers to an <tt>ExtensionType</tt> used inside the
<tt>SafeAADItem</tt> structure defined in <xref target="safe-aad"/>.</t>
      </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 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="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:
H4sIAAAAAAAAA8197XIcx5Hg/3qKPijiDNiDISX5QwZXPkMEZdMiKQYByefw
OTA9Mz1ACz3d4+4eQCMGHfsO9+teb5/k8rMqq7oHBCXd7jliV8R0d1VWVmZW
ftfx8bHry74qTrKL6yJ7WXRdflXWV9mLfFe02Xmx2LZlv8sOX744P8qefd8X
dVc2defy+bwtbk8y+N0tm0Wdr2GIZZuv+uOy6FfH66o7Lvzrx49/47rtfF12
+Ge/28DLz59dfOkWeV9cNe3uJCvrVeNcuWlPsr7ddv0njx///vEnLm+L/MTD
4W6K3V3TLuHrui/auuiPz3BO57o+r5eXedXUMPSu6NymPMn+3jeLSdY1bd8W
qw7+tVvjP/7hXL7tr5v2xGXHGczcnWRvptmbZl60vcvgf7ycN/nmOi8q+6Bp
r/K6/CHvYRkn2evrpqjL77M3//2MnhbrvKxgKYCAP7b8cUvfThfN2rkFLL0t
59teZuZZ/tLAFKfVXVE7nuAky07X+Q8N/S1DZjm+8F3zx5ye0Hh+hK+aus2X
8J/redvchFES8HSoG3p9esOv/3GZ93l33ZZ1MV0WYdA3zXVeZy/z610Y8K9l
W9iRWnznj3fwawzQy7zt8+zltsrbxQ+7m/vWtd5Wa3zbLswhLbRrQPJtAYjK
kJY2bQOb2VQnhOg+b6+K/iS77vtNd/LoEa6hb/PFTdFOEftTmO4RkOWjhCJ1
lEf/OPzRnzIAD+aZ1/Kdg++uNzfF+ALu7u6m7WpxXCxLoA6CAf7E//v9x589
nl736yqA/ICXLZB/3s3bcpm93s6rcpF9VeyyZ/Wi3W2QhhWq406gPgYi7cpl
0RKJdz8a2o+QEo6BXWHANeAOWL84Ltebou2aGsf+oOW8d7Rova+/ehZ24Wm0
HueOj4+zfN7hloPYuLguuwx2e7su6j5bFt0CGLTosiC6sr7J+vdvs5LHlGdY
l8tlVTj3EQqqtlluF4zth8339q2luHfvAIC8z0AUZnXTZxvgl6xZIVQOuKj2
c2fdpliUq3JBa50SdY4/A5m3qLYwfZZnXUGjLRrgbQuGTlmVN0W1Q7DmRbbt
itW2wj/Web3L8s2mkiE7ni+M4HR1S5gNhrMLx3FLkOD1Ep76kZfZPB6SgagL
eomBW/JmvDi3GP/oo+wpSKKrInvRXDn35sun2bOz5xdfv8lev3h2ev4sO3v2
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
Mfmwn41eUqwv0nOm7v8Cm/eh5WfYAAA=

-->

</rfc>
