<?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.6.25 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mls-extensions-01" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="MLS">The Messaging Layer Security (MLS) Extensions</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-01"/>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2023" month="March" day="13"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <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>
    <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-01</t>
        <ul spacing="normal">
          <li>Add Content Advertisement extensions</li>
        </ul>
        <t>draft-00</t>
        <ul spacing="normal">
          <li>Initial adoption of draft-robert-mls-protocol-00 as a WG item.</li>
          <li>Add Targeted Messages extension (*)</li>
        </ul>
      </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>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.</li>
            <li>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.</li>
            <li>The application could simply have clients send AppAck proposals on a timer, so
that all participants' state would be known.</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 reuse mechanisms from <xref target="mls-protocol"/>, in particular <xref target="hpke"/>.</t>
        </section>
        <section anchor="format">
          <name>Format</name>
          <t>This extensions introduces a new message type to the MLS protocol,
<tt>TargetedMessage</tt> in <tt>WireFormat</tt> and <tt>MLSMessage</tt>:</t>
          <sourcecode type="tls"><![CDATA[
enum {
  ...
  mls_targeted_message(6),
  ...
  (255)
} WireFormat;

struct {
    ProtocolVersion version = mls10;
    WireFormat wire_format;
    select (MLSMessage.wire_format) {
        ...
        case mls_targeted_message:
            TargetedMessage targeted_message;
    }
} MLSMessage;
]]></sourcecode>
          <t>The <tt>TargetedMessage</tt> message type is defined as follows:</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 use HPKE to encrypt the message content between two leaves.
The HPKE keys of the <tt>LeafNode</tt> are used to that effect, namely the
<tt>encryption_key</tt> field.</t>
          <t>In addition, <tt>TargetedMessageSenderAuthData</tt> is encrypted in a similar way to
<tt>MLSSenderData</tt> as described in section 7.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>
          <artwork><![CDATA[
sender_auth_data_secret
  = MLS-Exporter("targeted message sender auth data", "", KDF.Nh)

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)
]]></artwork>
          <t>The Additional Authenticated Data (AAD) for the <tt>SenderAuthData</tt> ciphertext is
the first three fields of <tt>TargetedMessage</tt>:</t>
          <artwork><![CDATA[
struct {
  opaque group_id<V>;
  uint64 epoch;
  uint32 recipient_leaf_index;
} SenderAuthDataAAD;
]]></artwork>
          <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>
          <artwork><![CDATA[
targeted_message_psk = MLS-Exporter("targeted message psk", "", KDF.Nh)
]]></artwork>
          <t>Th functions <tt>SealAuth</tt> and <tt>OpenAuth</tt> are defined in <xref target="hpke"/>. 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>The sender then computes the following:</t>
            <artwork><![CDATA[
(kem_output, hpke_ciphertext) = SealAuthPSK(receiver_node_public_key,
                                            group_context,
                                            targeted_message_tbm,
                                            message,
                                            targeted_message_psk,
                                            psk_id,
                                            sender_node_private_key)
]]></artwork>
            <t>The recipient computes the following:</t>
            <artwork><![CDATA[
message = OpenAuthPSK(kem_output,
                      receiver_node_private_key,
                      group_context,
                      targeted_message_tbm,
                      hpke_ciphertext,
                      targeted_message_psk,
                      psk_id,
                      sender_node_public_key)
]]></artwork>
          </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:</t>
            <artwork><![CDATA[
(kem_output, hpke_ciphertext) = SealPSK(receiver_node_public_key,
                                        group_context,
                                        targeted_message_tbm,
                                        message,
                                        targeted_message_psk,
                                        epoch)

signature = SignWithLabel(., "TargetedMessageTBS", targeted_message_tbs)
]]></artwork>
            <t>The recipient computes the following:</t>
            <artwork><![CDATA[
message = OpenPSK(kem_output,
                  receiver_node_private_key,
                  group_context,
                  targeted_message_tbm,
                  hpke_ciphertext,
                  targeted_message_psk,
                  epoch)
]]></artwork>
            <t>The recipient MUST verify the message authentication:</t>
            <artwork><![CDATA[
VerifyWithLabel.verify(sender_leaf_node.signature_key,
                        "TargetedMessageTBS",
                        targeted_message_tbs,
                        signature)
]]></artwork>
          </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>
    <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="targeted-messages-wire-format">
          <name>Targeted Messages wire format</name>
          <ul spacing="normal">
            <li>Value: 0x0006</li>
            <li>Name: * Name: mls_targeted_message</li>
            <li>Recommended: Y</li>
            <li>Reference: RFC XXXX</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>Value: 0x0006</li>
            <li>Name: targeted_messages_capability</li>
            <li>Message(s): LN: This extension may appear in LeafNode objects</li>
            <li>Recommended: Y</li>
            <li>Reference: RFC XXXX</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>Value: 0x0007</li>
            <li>Name: targeted_messages</li>
            <li>Message(s): GC: This extension may appear in GroupContext objects</li>
            <li>Recommended: Y</li>
            <li>Reference: RFC XXXX</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>Value: 0x0008</li>
            <li>Name: accepted_media_types</li>
            <li>Message(s): LN: This extension may appear in LeafNode objects</li>
            <li>Recommended: Y</li>
            <li>Reference: RFC XXXX</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>Value: 0x0009</li>
            <li>Name: required_media_types</li>
            <li>Message(s): GC: This extension may appear in GroupContext objects</li>
            <li>Recommended: Y</li>
            <li>Reference: RFC XXXX</li>
          </ul>
        </section>
      </section>
      <section anchor="mls-proposal-types">
        <name>MLS Proposal Types</name>
        <section anchor="appack-proposal">
          <name>AppAck Proposal</name>
          <ul spacing="normal">
            <li>Value: 0x0008</li>
            <li>Name: app_ack</li>
            <li>Recommended: Y</li>
            <li>Path Required: Y</li>
            <li>Reference: RFC XXXX</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>
    <section anchor="contributors">
      <name>Contributors</name>
      <t>The <tt>accepted_media_types</tt> and <tt>rejected_media_types</tt> extensions were written
by Rohan Mahy.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <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>
        <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">
              <organization/>
            </author>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="J. Klensin" initials="J." surname="Klensin">
              <organization/>
            </author>
            <author fullname="T. Hansen" initials="T." surname="Hansen">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein">
              <organization/>
            </author>
            <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>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8U8a3Pbxnbf91ds5ZlGcklIdh7XoZu2iiwnHsu2xlKS3rnN
iEtgSSICAQQLUObNKHP/Qz/1791f0vPYXSxAUJaS9FYzHksE9ux5v/Ysx+Ox
qNM60xN5udTyjTZGLdJ8Ic/URlfyQsdNldYbuf/m7OJAnn6odW7SIjdCzWaV
Xk8kfC6SIs7VCkAklZrX41TX8/EqM2PtXx8fPRGxqvWiqDYTmebzQoi0rCay
rhpTPz06+vLoqVCVVhO/pbjWm5uiSibyVV7rKtf1+AWCF8LUKk+uVFbksOVG
G1GmE/mXuohH0hRVXem5gd82K/zlRyFUUy+LaiLkWMLOZiLfR/J9MdNVLST8
MObvVblUOgsfFNVC5elfVQ0ETOT5stB5+kG+/+cX9FSvVJoBKUDrf1S8uKK1
UVysgDggsVrB2rWGnSVyo6wKwLHIJrS+VtVC1xO5rOvSTA4PE1WrulLxta4i
BBrB9ofA2MMeTx2Uwx/3f/NSRuDeUj+36wSsW5bXepiAm5ubqJrHY52kdVER
DvAn/vvyybOjaFmvshble7wcIvntZlaliTxvZlkay9d6I0/zuNqUKBqH1dhY
rMcxKFya6IokZ34zto9QM8aghQBwBbxbpUaP01WpK1PkCPtB5HwUWofe89en
rRROOvQIMR6PpZoZFDlYw+UyNRKk3ax0XstEm7hKZ9rI1vhkXcj642J26hHx
Dqs0STItxCO0v6pImpi5fb/9fvkl1LjbW0BA1RIsXOZFLUtV1bKYI1YC7Cj3
e0tT6jidpzHRGpF2Dj8DU46zBraXShpN0OKi0iJEw22Zpdc62yBaMy0bo+dN
hn+sVL6RqiwzC9Lwfi0E4ahLYDcAFxKOcFNwTHkCTz3kRM66IBmJXNNLjFzC
wji7CDn+6JE8Wap8oeVZsRDi/csTefri1eW79/L87PT44lS+OD07vTyVl9++
upAXpyeXr969hWVs4eBc0bsdJwnqSo3oHSdr8EWgY4RsQJJbcgRSBsmmdaoy
qZKCbAm5yM/Zl3XcBqyRCtn9wzcyrfUqErzlJZkWEMj6FaqC3P+vxweoQkHg
QFKPy/I4vgZd2pSg7eBfysKoDB89ki+I59a0j3P7LvKKXpIgBGI08BxcXl7c
ZDoBtlU61rAKKQj4L1cWpwj0tmgWS5ai986oRyt4G5DOCxmzBKy5LKqiKUdA
Km4J1gYG0FSwMfJAOJzdBhB5WNT8ulVOqzcW1iegDZXKmTxUlJkGYxThuyfF
agUQWqzFr7/+KuvMCEZA/kJuogHN+/Qp6D1oX/U8/GieVqa+WujcuovOw0z1
nt06mb1Hwp+L7i7hM+bvWidXFf5p/vX7f8PlLJzniOWgsCpdVhrQrAMzdcR5
kMgKZBKTY1kmwDdVpLtlES8j2WoXWp6H266e8vKphORATlsqp3KtsgayBCsK
MLyTtFyCdoOaStAD+tQiBfucqnjZJ90TEWqZMKXKOwTdLAujh/bGbVbAAYhM
dZo3RQOQCPQcAoGY9oU2RRWc9qQ1HbFWGWAZ6EWP08wWQ54Jeb1oVAWqugDn
amqi8IXOYGW1AbdfrdNYg6EXZYkKOGgvknyh0T83ABN9BAQpUH/rtbtEzlOd
JYjKGsIUpIYQFRaVpnezwoDTBPdA0QPSMqABzEGVxplGBxLvF6NrTRAlLQhL
kHKAmCUd42gGkA3btIHIuyH3myQgLoNxjrQq1rmq0gKkoyE+7GQFcC3LWlmC
EwRdBJGBolCEKsCGRt7MFRgTvCBa5NHscw1gZTEzAFcngOq72ToFaWebEeKC
IQOFU6XmmsFYUtyuIi4a4CTEEtOUqHSG/c2NzrKRnDUkybRyikBRkIgM/MpK
Kxd20jmSu2HVaAHCZ4FXkrHKMSarZK2Q80hchiGJ5B8vddJkIMoc+JeCZaCV
IWt36x866NI50UC3RgItE3WhWqU5mQsCjJWB362qHDo0kTaEyKpDvHwJpqo/
KBT6RIjHpJ8d1U0Xy1ou1VrTzjG50lpXzhmDY9jyT6ATLDMFHs86X9QlHcq6
QNEBX1cQEo1kEWHgodXAGWcUadUKUsoEElbkKxQ18bKLUTSEPsMl9EHrICQB
K5HZAdottnm4FOsLG4U87nEB76GcOkrtPS6bYQoeDb2MhU82nyLuN4SLNWjy
W2xqcp3qG3J+kDmhvCjYQw6botFy8hNjzeO4dQelBgPvhglmcg3Tu6VZqAqQ
Ga90hTIB9NgCgTDMI9M4BT9cm0/AA4BJWtzBhFBEeURhKdy9MYPqC/ra9Zlb
6ljMBz0lIAKKghkeAYE0B93kkHVTZEJFYEUzgl6CKhUcA4oDHq18imz9HvoQ
ULAbRelrUtj8hbZSGXwMAuBSqE1JcJteIjHifPcaZS5XBRpWOodUusnaENj3
igKWgMIUCyiCtTVWTwpGMnSLTKILFx0po5Iia1DCwklYY+YVh7boXMwI4yyU
7ygdihrpPHgLnSsZEyuwUBzUUPnQPZB6cBrt01Fvi9tpJSbfg7IkFjkXZxkb
gGKuZ9ZxWh0XWpkNMV0jS5HOSF4UK404mc4+LpXGjfIEtZVUYBWkNqLIwSrI
kcJmruTp7jiSOiWfhKIrq3St4o0s+E+HQ7wR4HkMVjXgyvs8ITVTTq3AQaWa
3Caw+QZAFw05UgqhkBYDoBpfz8H4CRGBL4U5m9Nsjy8IKi1Z5H//23877SEP
jXIE8wRdNekMQ0uFdVZaobK/AsvTKhnZej3EONFziBq0CyfvzHLfB+CczDlC
jn/sDSnLAvSZe+y+QHNSQ7rGnEUu5KGjR3MnIPTchsNFwQUIvN06RwgAY7Ms
nBgR5kpjKZGaFePhMyOwmjn8QgkVFt5IAban8BNb8gbCetO6bah4WqCGCeqX
2JgfWo/YZKqC59gWub2N2ABeEtNs/R5Uyamt7qmSRgl7FkJx5lsHQbU6ElOH
osVwijtPfwAR8iY2B4dF7oVJW8jovFlRgRFFEXfGrpywr+zW+18cjPwL+08/
//wASo0WfL9Ocf2p78E0UBHW9v+vEPiTIy6B2uWg4ZW+mltQ+MzoDLwItUEs
wlHwzoHdBn8YJf7BxGUQ/Yl/BX96vJL9txmFW6zF/Pa2oEKV2+Z1Rz6pMwzK
E+dFlhU3ZjJYNhalguSa9fkqTaiC49Lwi8+4ynJ/Q6no7fcq02p+Bem4/vC8
BRIoLVCCDUgLzj73rvOKHcQVLhh4DzX0KvblmK0qeySDvL3S0AICVprr/SPS
E5MuuDi5oqf44Ak82IJzDMsuINqsepVup5ru0bsTRM9ur4wF3GrT4AtOmUh5
sM2HEM/N9aT99MKRg4/9I88yT63l5G3LzWu9ugLXXTY7GHlBFOKOL0ASXSb8
Q7TjTnxkX1UGKLj8+s3/A9p/sIIMS+thNnH59cVvYYR9K1MzncEr4CL30LU/
iY62Iq4EO9rDnc8vXr9KrEd6W7icpe+XAKEpeiNKX6hB53KErXDR8ijq6/q0
xzXIVRNtA1jY8t9OaBprT5yD05thY4cSVswFZrq+0Vj/3hQSJLnm1qBde603
xnc4zkDOb2H7KSVLrudIxEOSBSY+orOjbMNEtpnIFYCxTRFA/VWOHYmU2x99
VnQtgBjYZp0p1j1QJqUYzTlVExhUeREvUEZ2mtSGGy3yT9Gn0VP8oJ8lUI97
SyRdPKItTXc9Hsx9gDf4QNID18XnFdxA/wjwQbvobiB6WsDvtH3fwFCDLPR+
pDmN65HkP3cUDSq4bwPfi9LWwqeis9nr0zeSHzhtI/VrVcjmm9eac8S8wPrQ
ppGJS8qOT49fkG5ied7UnAIQ+BcvHVxqLQr4IHq7hPK81q1+9/zMVNpeVtu1
5nQCE1qrVpCgM3MynS/Aui2oHiSkMgOGoK3kkvem/hc2SLOh1wVKFrN/cDq6
SUBTE80ruhzgjlBFLQxl0xzRDxuQckDFgme4X2FKNT79gGWlrvb3tlycq15g
qcSleyO5B/8Y5QMhWiSvDDWeAGQP+78cRRG/P37yo3DIEB6I+1cStgcCfgBn
eIZed38HurAzvL836uSO7c8WJiMSf/T2+qCzJ/PpIbvSiofvmx+0Oeqx9W9Q
HB2HMVRSWN8/Pn5x4LsM077L6yqC11l4GVvIZDaks1uJsBP/H5oM3MoufoC7
DX2PMAadoyvPF7tSc+8eZFJo7lj45iOUZrTWBgb5qnbOrtKmxCPeWUpFoTUq
q5vo7pLEL7amP125LZU9DrMmmwMfhbNWjpvHHV8qBPZRmemmSbl9DiENO11g
JjIFnSBnNMXQ61PtqT93A0H23HNErVkunkPAHUAdGDi7seAEQQnvedmnDrt+
OlNLrFq5E5/hSOJcbb4lIHs4Oo1AyBoi46JJE+x5j4t83IU1Zljm9lag4lLH
LDg0jJiLiARkR+Fxdg/9kW9tavJCEs9GHBlsglaN+2UhMuzjDgxztK7PskYp
500e8wk0WJzKUAlsWf6u1Ln9k9wpV4+UKtiGgXzH3SUHQmy92MsprHV0NY3l
iypgzxJYod98d3FJR4Hb3HLCxjxnd84YVE3TqAOaDjZsMDTdCGa5vN+G5FHf
kx8Aux2rQKr7ttdYgU9F/aXZE/Tpu1zl8A87I8o+P9QPW7qlEvVs9TAIduHv
3BaU7GEQYAG434etsQGKeY0tzVojs4Mo4x323SJ2pvGVdIqOwgzkvgOtnrhb
FHYtuJdkHyLDnj7eG+Qd8rlbEh2ee/0+COLdkEV7f23+WLveqgU5HrSJOY3f
5Nqe4FCO3rZ+qObqhM5PTKeGsx3quKg43lI49etFWGKEQxv/Fx7mj/Euv9Gz
/D6v8mCP8vu8CSVtkIi3SvAV9cfaxDaC8Lddqe2Nhug0v9ebfNyTPMiLfFSC
95XVPTzHfeVgOT7AJzJwPFWebzqdla6tW759T+95MUW8bj9sLCCHoo4B79aL
QRHvfHtI9Lvf9ii0jk9+YzNDOnse8mXg+7gUZiH+/W//Y8Lct83/XV49lFOP
BJ6B04ienRYkHsfLguaIHuIq74POnajIHiri5PjtPTAJkzE8sZ1pGrloTyHR
8R5CyVDpsklSZWscOrZwZ349Hlx8++67sxfYsDNNVgvOSndN997ewpaQl+sl
7GPnKIdGIAcOgekgzPXL2jlWbAx2Z1khB+dQxIWpojMWOhKzyb2gIs3uZidB
HLOxfPCnolxAYCmDJBCIaXA+TJX5lPqRhpsdUDXYoR0f9Bxyay1fHb89lm+g
nlASJynxoHCRQg26kfu4k66yjYgBXTxLfPXmlF86sGf1UxXHumQrAQhXeJxk
ptJFzGCIMwOYXKk6/NsBFabSUzRAjZ0jA7ElIw7alf65QdF3N/4GFfeEfWGw
ueWdHxeiNXT2ZYQdq3XzUlgk8QwKzbzwuA6e9oanoshzG9gtm1GcvkzD4248
pK1W7ZRJB5SfmaJxnianWi4KGuM3brrKLlumZWclzZhCbQx64V8tC2Caq/xF
70UeSRpuErRDToB4GoyedBGgySvaJLVn/xj0QEqzDLvrL9Mc6KQZte5s95zm
tJRcpXm6UpmcV2pFLQw+SDVFaAXEFHKmmejLCimgaVc+kCfCV2DdKfbUvFYB
XiUOh9VBD9Kolc/Ejo3fi1ry5aJSth/qzA0PsB08mn1DpBq2StOZ7cZxGhou
Y2xCQTtgfB7u6n8/3YF92gLTRxKiPe7jRk6m1yqvHX94JINxKSiFjMIjFCSv
oRAK0iRbDpQb6eeGbBY0k2hkqrMODVt8q4EPgPgvv/z7+5cnT48++xz8Inoe
K7BIfg+bF9XYeyLeyTQz3szUiidvMMMX0zVgOiXWzbR1KrpyRzqEqZsSobs4
qkoMDX5htOweSAhG6Ytnnz7DxsKWs2dFuUnN0rFoWy/sOUi+yPTQBNZIrhTO
UtM4PphJoDxThgW0HaoMLxHRhZxpwGfRaWtY7n0B3EOpKzrJwl/t8IkbESGV
tsUQH89AlFGYIxixP2/nFK3XvgQjOecRYsb8DEy7oQb0Bj76ADv/E+z87DPc
+cC27S7okRDk3y+tDSmC5fSP/Qpzpq9Acp87j9w0LMegmToT9ASdgZX8AY+g
5ORQcBwQeAUGV+Ponjxdg12k9rTAP7iikeapuGnnFZ1DtxIjRaIp5OnPDWh7
MoaYBJ9NWZLs4FsTyiFKsS+juO1jCW3bA8C3Ltp5+S20opZfZ6C1xLMcJJiQ
/mIkI6PxPC1mP4H17hy0tx3ldhc88bN9ZSkPH0u05onsYWHngP0NFaQECbFq
q6prDiY556SPJV73QKuVHXLl48NhJGgTey587j7tT8UAcm18tXwgHfHaEGjL
COSyd7iHQQdvFelq5FBzdXOgXlZ3eui1mxFmDgflmf5XXRXembZ65huL7oSg
B94TGKyxtHsxbt9ccPINUoz+ItSP56KnL0NJ0fPeO0P5iz0kOLV2v+XNyVnw
JRuVBZTYUR3wUDdFdQ3IQ5xd6MMyX+CcK1jKYZnhnOVzlIzR9Vd7312+HD/b
g6eBKzz8ydAYcPgR+nDrhqKVWcwa8y/xDBJxwtN1r52fCvwGimHa7jwduQMH
R6s9OBV+0Lb7dmuSkNTxO25Y1PsqL1MeJFShHaOFUSdnaknm3o3atnV6idgx
dSMCbhz0a43ji0AtTv+2OYoNN77UcVcHbBFgKw93ZEPJ6nCW3OanQBb6TZc2
Q76W8WChwIyC07AgqNcUVW2XIJLHeCDSqIwzY4skTc1657EDA7vvNFYlF1Up
fuqOPkQHpzAWtB9aN4tvvtabcxVf4yAFhp8fqMuFU5/kySkL8nkzKYgamqlm
XoaX9EbCl6TyzfGfg8OwoSKgx1ZcGhYFor1E1mOcHGLcrjrjbsZ1hSkexDhJ
fHMdROUukLUICirvA/UaZIOx5zQf0Tx/ocn5185Mp3xvAZ8EZEY8+exyaKvu
b99d0hGj6lgKDcQGUidDHUZXNLk97tchBF8Re7X3eTVYhi1gfOrgXayhPJ8m
dJF+OkTz9aa/H1PiZDrUaQu6kgfI0oUMSqvdjR1XnLtd3XZViitoJ3mWXmtI
PjH+dajHcJmBASQbVPdZmiQgWbqslRrTUOpVueKLbSTU1FZR/d1G53naYVtH
eXhjlV9yVwB21rRW8JBRYnqLk+p0R87O+doarXsRkopxa9kduVrfbO5Sx+HS
nI17u+K3t4By2Y5P8/EteG4Qm51TmR636yzKU6HabGCmoSwPBlml7ET44Rj/
vDMqiQNuIXY2waShSbm9fTh0GzoldFygcZS+8NwLTVq3t5dGPTfvJ4gGNp8O
sKKdeWhpcm0PcubDYonobjYmGv0L4t0r2rhY2w6OH0VDHNd4La4x5N7tPcXG
nXLIJSg/RjF4b2/XxfE9d13S9p38PTj71QnYtnIA2+LYN6mQ0Ci86zyR55nG
EdhKQzYRa/mf8IODIHhzF6tNf+0A1+QNzekrgz0Hvl/d6V9QMxAVHUe/7fi7
vQyyPWKP8962fIHU9bH8HvkxkUcfjo6OvsAP3tLXRLj/h8a+8a33Gp0CXQqf
yD/zJ/Z6z4SQRoo8Yt5PcGeOceuDNVc+Um26q6yu3rVgOrCPn8JwF22DCGHj
IAi9DXfUWUqCYbugs4l/O2YKz0y/X+9CfdvIiFVVbajuLNUmK1RCF8W6THe8
vos+eMnuum8OJvLs7UR27zdQEQ92qBVdLPbdTVv3iS2R7ZTYgGTuJ46PyIBy
iY6HdTWpfFULx3nTtozYo/rOaygCOSCCPmP/tJuxPW5+c/IRbg5h/SCODqU4
g0wdzoU+zte+vImnPuQp2S/s7EVvd3Gyn753IjLaTpAy0D0+m4zYASW3+5YM
nnkZDBH2D1XqodAyJIKPv/cwxb6fEPoCaBMkvkCHV76pHskykkXQqm9NpW0P
bwniSy+IIfr+wfZA7PQJYxAS7B3I9nsydmpTWV5BOTK057mC0OmKgrvQaL8W
Ju6lFeEXd3x90r1s6RxPZ97dTSsGY7bhaNy216JbiZ0J0tlGcHGpMOU3S4UW
hoO1++cXrw/aaf7tq4j+4JqDEM7ppUbwGB52m/AKXasjCNJfdm/P2uiihBye
u4vsVTo6dQn8M+/EFyEgrUq5s6X6dznp9iLm7SOHMnZlbvAK8gUOBvLRqTwv
TD0+8V8Z1EoHbytDOqV1T9uBEuEpwQx048SwfafSfrVAyyGqoDsUqVyouqYv
l7KXnNFlGf+lQnbEwUUluoKdbqmAwHPiQ3/S/onx6/DKRcRmlSKRa75c3Lkm
GZBqb2eLEtM+vCpvcTMDdykH1rnr6X7ZnUfG35n2+y6GIxAV6pX+ibpOOwt1
rlohtb2Wpli1PAu/hmad8m1Y4F3QVKANrCsNyzY6vNy05bC7GQEQdUfXuqf6
Iwl5dY2b0tGVxga/vS0ZiRN3CX/pmnZk/Zir4Tcm2YMnd92YvjbHfckRZ5Ip
QMzXaVXkVHcUc7FS12y7rkfBXFSzrOvW1VqlmeLDSJZGlc4a8O7mzvh/L+6D
hoNXuanwVDEXEJnfF3gt4Y1abiLxv1rWY2D/TgAA

-->

</rfc>
