<?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.29 (Ruby 3.4.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mahy-mls-semiprivatemessage-05" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="MLS SemiPrivateMessage">Semi-Private Messages in the Messaging Layer Security (MLS) Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-mahy-mls-semiprivatemessage-05"/>
    <author fullname="Rohan Mahy">
      <organization>Rohan Mahy Consulting Services</organization>
      <address>
        <email>rohan.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="April" day="21"/>
    <area>Security</area>
    <workgroup>Messaging Layer Security</workgroup>
    <keyword>SemiPrivateMessage</keyword>
    <abstract>
      <?line 34?>

<t>This document defines a SemiPrivateMessage for the Messaging Layer
Security (MLS) protocol. It allows members to share otherwise private
commits and proposals with a designated list of external receivers
rather than send these handshakes in a PublicMessage.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://rohanmahy.github.io/mls-semiprivatemessage/draft-mahy-mls-semiprivatemessage.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-mahy-mls-semiprivatemessage/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Messaging Layer Security Working Group mailing list (<eref target="mailto:mls@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/mls/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/mls/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/rohanmahy/mls-semiprivatemessage"/>.</t>
    </note>
  </front>
  <middle>
    <?line 41?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document defines two extensions of MLS <xref target="RFC9420"/>. The first is the
<tt>SemiPrivateMessage</tt> wire format, which allows an otherwise PrivateMessage
to be shared with a predefined list of external receivers. It is restricted
for use only with commits or proposals. The second is the
<tt>external_receivers</tt> GroupContext extension that contains the list of
external receivers and allows members to agree on that list.</t>
      <t>SemiPrivateMessages are expected to be useful in federated environments
where messages routinely cross multiple administrative domains, but the MLS
Distribution Service needs to see the content of commits and proposals where
group members would otherwise send handshakes using PublicMessage.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>This document uses terminology extensively from MLS <xref target="RFC9420"/> and
the Safe Extensions framework, defined in <xref section="2" sectionFormat="of" target="I-D.ietf-mls-extensions"/>.</t>
      <t>Whenever a hash function is mentioned, it refers to the hash function
defined in the cipher suite in use for the relevant MLS group.</t>
    </section>
    <section anchor="syntax-and-usage">
      <name>Syntax and Usage</name>
      <t>The <tt>external_receivers</tt> GroupContext extension is used for all members
to agree on the list of external receivers in the current epoch. Its
construction mirrors the syntax of the <tt>external_senders</tt> extension in
<xref target="RFC9420"/>.</t>
      <sourcecode type="tls"><![CDATA[
struct {
  HPKEPublicKey external_receiver_public_key;
  Credential credential;
} ExternalReceiver;
]]></sourcecode>
      <t>The <tt>mls_semiprivate_message</tt> wire format is advertised in the
<tt>supported_wire_formats</tt> list in <tt>LeafNode.capabilities.extensions</tt>,
(defined in <xref section="5" sectionFormat="of" target="I-D.ietf-mls-extensions"/>).
For SemiPrivateMessage to be used in a group, <tt>mls_semiprivate_message</tt> needs to
be in the <tt>required_wire_formats</tt> list in the <tt>GroupContext.extension_types</tt> of
that group, and there needs to be at least one entry in the <tt>external_receivers</tt>
GroupContext extension.</t>
      <t>SemiPrivateMessage substantially reuses the construction of PrivateMessage,
but like a Welcome message also contains information (<tt>key_and_nonces</tt>)
necessary to identify the sender leaf node and decrypt the
<tt>SemiPrivateMessage</tt> struct's <tt>ciphertext</tt>.  Note that the
<tt>encrypted_sender_data</tt> cannot be decrypted by an external receiver,
but the <tt>sender_leaf_index</tt> is included with <tt>key_and_nonces</tt> and is
verified in another step. <tt>key_and_nonces</tt> is encrypted once for each
external receiver in the <tt>external_receivers</tt> extension.</t>
      <section anchor="encryption-of-a-semiprivatemessage">
        <name>Encryption of a SemiPrivateMessage</name>
        <t>As with a <tt>PrivateMessage</tt>, the sending client chooses an unused generation
in its own handshake ratchet and derives a <tt>key</tt> and <tt>nonce</tt>. It also
generates a fresh random four-byte <tt>reuse_guard</tt>.
The snippet below shows the syntax and encryption and decryption
construction of <tt>keys_and_nonces</tt> into <tt>encrypted_keys_and_nonces</tt>
for each external receiver.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque key<V>;
  opaque nonce<V>;
  opaque reuse_guard[4];
  uint32 sender_leaf_index;
} PerMessageKeyAndNonces;

partial_context_hash = hash(sender_leaf_index || nonce)

struct {
  opaque group_id<V>;
  uint64 epoch;
  opaque partial_context_hash<V>;
} SemiPrivateMessageContext;

PerMessageKeyAndNonces key_and_nonces;
SemiPrivateMessageContext semi_private_message_context;

encrypted_key_and_nonces = EncryptWithLabel(
  external_receiver_public_key,
  "SemiPrivateMessageReceiver",
  semi_private_message_context,   /* context */
  keys_and_nonces)

key_and_nonces = DecryptWithLabel(
  external_receiver_private_key,
  "SemiPrivateMessageReceiver",
  semi_private_message_context,  /* context */
  encrypted_keys_and_nonces.kem_output,
  encrypted_keys_and_nonces.ciphertext)
]]></sourcecode>
        <t>The <tt>KeyForExternalReceiver</tt> structure contains a hash of the
<tt>ExternalReceiver</tt> as a reference and the <tt>encrypted_key_and_nonces</tt>.</t>
        <sourcecode type="tls"><![CDATA[
ExternalReceiverRef = hash(ExternalReceiver)

struct {
  ExternalReceiverRef external_receiver_ref;
  HPKECiphertext encrypted_keys_and_nonces;
} KeyForExternalReceiver;
]]></sourcecode>
        <t>The <tt>SemiPrivateMessage</tt> struct extends the <tt>PrivateMessage</tt> struct, adding
the <tt>keys_for_external_receivers</tt> list, the <tt>partial_context_hash</tt> needed
for its decryption context, and the hash of the <tt>FramedContentTBS</tt> to insure
that the sender cannot encrypt content to the external receivers that is
different from the other members, without detection.</t>
        <t>The <tt>SemiPrivateContentAAD</tt> struct likewise extends the <tt>PrivateContentAAD</tt>
struct, adding the <tt>keys_for_external_receivers</tt> list, the
<tt>partial_context_hash</tt> and the <tt>framed_content_tbs_hash</tt>.</t>
        <t>The <tt>SemiPrivateMessageContent</tt> struct is the same as
<tt>PrivateMessageContent</tt> except application messages are not included.</t>
        <sourcecode type="tls"><![CDATA[
framed_content_tbs_hash = hash(FramedContentTBS)

struct {
    opaque group_id<V>;
    uint64 epoch;
    ContentType content_type;
    opaque authenticated_data<V>;
    opaque partial_context_hash<V>;
    KeyForExternalReceiver keys_for_external_receivers<V>;
    opaque framed_content_tbs_hash<V>;
    opaque encrypted_sender_data<V>;
    opaque ciphertext<V>;
} SemiPrivateMessage;

struct {
    select (SemiPrivateMessage.content_type) {
        case proposal:
          Proposal proposal;
        case commit:
          Commit commit;
    };
    FramedContentAuthData auth;
    opaque padding[length_of_padding];
} SemiPrivateMessageContent;

struct {
    opaque group_id<V>;
    uint64 epoch;
    ContentType content_type;
    opaque authenticated_data<V>;
    opaque partial_context_hash<V>;
    KeyForExternalReceiver keys_for_external_receivers<V>;
    opaque framed_content_tbs_hash<V>;
} SemiPrivateContentAAD;

struct {
    ProtocolVersion version = mls10;
    WireFormat wire_format;
    select (MLSMessage.wire_format) {
        case mls_public_message:
            PublicMessage public_message;
        case mls_private_message:
            PrivateMessage private_message;
        ...
        case mls_semiprivate_message_:
            SemiPrivateMessage semiprivate_message;
    };
} MLSMessage;
]]></sourcecode>
        <t>Encryption of the <tt>ciphertext</tt> uses the cipher suite's AEAD algorithm using
the <tt>key</tt>, <tt>nonce</tt> xored with the <tt>reuse_guard</tt>, the
<tt>SemiPrivateMessageContent</tt> as the plaintext, and the
<tt>SemiPrivateContentAAD</tt> as the authenticated data.</t>
        <t>Encryption of the <tt>encrypted_sender_data</tt> proceeds in the
same way for <tt>SemiPrivateMessage</tt> as for <tt>PrivateMessage</tt>.</t>
      </section>
      <section anchor="decryption-of-semiprivatemessage-as-a-member">
        <name>Decryption of SemiPrivateMessage as a member</name>
        <t>When receiving a <tt>SemiPrivateMessage</tt>, a member receiver derives the
<tt>sender_data_key</tt> and <tt>sender_data_nonce</tt> and decrypts the <tt>encrypted_sender_data</tt>, just as for a <tt>PrivateMessage</tt>.</t>
        <t>The receiver uses the <tt>SenderData</tt> to lookup the <tt>key</tt> and <tt>nonce</tt> for
the correct <tt>generation</tt> in the (non-blank) sender's handshake ratchet.
The receiver verifies the <tt>partial_context_hash</tt>.</t>
        <t>After xoring the <tt>nonce</tt> with the <tt>reuse_guard</tt>, the member decrypts the
<tt>ciphertext</tt>. It verifies the padding consists of the appropriate number of
zero bytes, and verifies that the <tt>framed_content_tbs_hash</tt> is correct.
Finally, it verifies that the signature in the FramedContentAuthData is
valid.</t>
      </section>
      <section anchor="decryption-of-semiprivatemessage-as-an-external-receiver">
        <name>Decryption of SemiPrivateMessage as an external receiver</name>
        <t>When receiving a <tt>SemiPrivateMessage</tt>, an external receiver
looks in the <tt>keys_for_external_receivers</tt> field for its
<tt>external_receiver_ref</tt>. It calculates the <tt>semi_private_message_context</tt>
and uses HPKE to decrypt the <tt>encrypted_keys_and_nonces</tt>. Using the <tt>nonce</tt>
and <tt>sender_leaf_node</tt> it verifies the <tt>partial_context_hash</tt>.</t>
        <t>After xoring the <tt>nonce</tt> with the <tt>reuse_guard</tt>, the member decrypts the
<tt>ciphertext</tt>. It verifies the padding consists of the appropriate number of
zero bytes, and verifies that the <tt>framed_content_tbs_hash</tt> is correct.
If the external receiver has a copy of the <tt>GroupContext</tt>, it verifies that
the signature in the FramedContentAuthData is valid.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>These two extensions provide a privacy improvement over sending
handshake messages using PublicMessage. The handshake is shared
with a specific list of receivers, and that list is visible as
part of the GroupContext.</t>
      <t>TODO More Security.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="semiprivatemessage-wire-format">
        <name>SemiPrivateMessage Wire Format</name>
        <ul spacing="normal">
          <li>
            <t>Value: TBD1 (to be assigned by IANA)</t>
          </li>
          <li>
            <t>Name: mls_semiprivate_message</t>
          </li>
          <li>
            <t>Recommended: Y</t>
          </li>
          <li>
            <t>Reference: RFC XXXX</t>
          </li>
        </ul>
      </section>
      <section anchor="external-receivers-extension-type">
        <name>External Receivers Extension Type</name>
        <t>The <tt>external_receivers</tt> extension contains a list of external receivers
targeted in a SemiPrivateMessage.</t>
        <ul spacing="normal">
          <li>
            <t>Value: TBD2 (to be assigned by IANA)</t>
          </li>
          <li>
            <t>Name: external_receivers</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="semiprivatemessagereceiver-public-key-encryption-label">
        <name>SemiPrivateMessageReceiver Public Key Encryption Label</name>
        <ul spacing="normal">
          <li>
            <t>Label: "SemiPrivateMessageReceiver"</t>
          </li>
          <li>
            <t>Recommended: Y</t>
          </li>
          <li>
            <t>Reference: RFC XXXX</t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC9420" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9420.xml">
        <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="RFC2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="I-D.ietf-mls-extensions" xml:base="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-mls-extensions.xml">
        <front>
          <title>The Messaging Layer Security (MLS) Extensions</title>
          <author fullname="Raphael Robert" initials="R." surname="Robert">
            <organization>Phoenix R&amp;D</organization>
          </author>
          <date day="19" month="February" year="2025"/>
          <abstract>
            <t>The Messaging Layer Security (MLS) protocol is an asynchronous group authenticated key exchange protocol. MLS provides a number of capabilities to applications, as well as several extension points internal to the protocol. This document provides a consolidated application API, guidance for how the protocol's extension points should be used, and a few concrete examples of both core protocol extensions and uses of the application API.</t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-06"/>
      </reference>
    </references>
    <?line 307?>

<section anchor="change-log">
      <name>Change log</name>
      <section anchor="changes-from-draft-mahy-mls-semiprivatemesage-04-to-05">
        <name>Changes from draft-mahy-mls-semiprivatemesage-04 to -05</name>
        <ul spacing="normal">
          <li>
            <t>remove the "safe extension" wire format</t>
          </li>
          <li>
            <t>use the supported/required_wire_formats extensions in mls-extensions</t>
          </li>
          <li>
            <t>register SemiPrivateMessageReceiver Public Key Encryption Label</t>
          </li>
        </ul>
      </section>
      <section anchor="changes-from-draft-mahy-mls-semiprivatemessage-03-to-04">
        <name>Changes from draft-mahy-mls-semiprivatemessage-03 to -04</name>
        <ul spacing="normal">
          <li>
            <t>corrected a typo in SemiPrivateMessageContent</t>
          </li>
        </ul>
      </section>
      <section anchor="changes-from-draft-mahy-mls-semiprivatemessage-02-to-03">
        <name>Changes from draft-mahy-mls-semiprivatemessage-02 to -03</name>
        <ul spacing="normal">
          <li>
            <t>do not attempt to decrypt <tt>SenderData</tt> for external receivers; instead also encrypt the <tt>sender_leaf_index</tt> and <tt>reuse_guard</tt>.</t>
          </li>
          <li>
            <t>make the <tt>encrypted_key_and_nonces</tt> context include the <tt>group_id</tt>, <tt>epoch</tt>, and a the hash of the <tt>sender_leaf_index</tt> and <tt>nonce</tt>. include that <tt>partial_context_hash</tt> in the AAD.</t>
          </li>
          <li>
            <t>add a hash of the FramedContentTBS to the AAD to make sure the content encrypted to the external receiver is the same as that sent to members.</t>
          </li>
          <li>
            <t>add explicit instructions about encryption and decryption.</t>
          </li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
LdeQ/Re7+HBk0SsAAA==

-->

</rfc>
