<?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.17 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mls-extensions-00" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.2 -->
  <front>
    <title abbrev="MLS">The Messaging Layer Security (MLS) Extensions</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-00"/>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2022" month="November" day="25"/>
    <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 Targeted Messages extension (*)</li>
        </ul>
        <t>draft-00</t>
        <ul spacing="normal">
          <li>Initial adoption of draft-robert-mls-protocol-00 as a WG item.</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>
          <t>```
sender_auth_data_secret = MLS-Exporter("targeted message sender auth data", "", KDF.Nh)</t>
          <t>ciphertext_sample = hpke_ciphertext[0..KDF.Nh-1]</t>
          <t>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)
```</t>
          <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>
          <t><tt>
targeted_message_psk = MLS-Exporter("targeted message psk", "", KDF.Nh)
</tt></t>
          <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>
            <t><tt>
(kem_output, hpke_ciphertext) = SealAuthPSK(receiver_node_public_key, group_context, targeted_message_tbm, message, targeted_message_psk, psk_id, sender_node_private_key)
</tt></t>
            <t>The recipient computes the following:</t>
            <t><tt>
message = OpenAuthPSK(kem_output, receiver_node_private_key, group_context, targeted_message_tbm, hpke_ciphertext, targeted_message_psk, psk_id, sender_node_public_key)
</tt></t>
          </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>
            <t>```
(kem_output, hpke_ciphertext) = SealPSK(receiver_node_public_key, group_context, targeted_message_tbm, message, targeted_message_psk, epoch)</t>
            <t>signature = SignWithLabel(., "TargetedMessageTBS", targeted_message_tbs)
```</t>
            <t>The recipient computes the following:</t>
            <t><tt>
message = OpenPSK(kem_output, receiver_node_private_key, group_context, targeted_message_tbm, hpke_ciphertext, targeted_message_psk, epoch)
</tt></t>
            <t>The recipient MUST verify the message authentication:</t>
            <t><tt>
VerifyWithLabel.verify(sender_leaf_node.signature_key, "TargetedMessageTBS", targeted_message_tbs, signature)
</tt></t>
          </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 anchor="security-considerations">
          <name>Security considerations</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>
    </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-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>
          <t>Template:</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>
          <t>Template:</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>
      <section anchor="mls-proposal-types">
        <name>MLS Proposal Types</name>
        <section anchor="appack-proposal">
          <name>AppAck Proposal</name>
          <t>Template:</t>
          <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>
  </middle>
  <back>
    <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>
    </references>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
