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

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

<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"/>
            <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"/>
            <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>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
