<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kohbrok-mls-fewer-signatures-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="FSMLS">Fewer signatures in MLS</title>
    <seriesInfo name="Internet-Draft" value="draft-kohbrok-mls-fewer-signatures-00"/>
    <author fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <author fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad@ratchet.ing</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <area>Security</area>
    <workgroup>Messaging Layer Security</workgroup>
    <keyword>mls</keyword>
    <abstract>
      <?line 40?>

<t>This draft specifies modified versions of MLS KeyPackage messages, as well as
MLS PublicMessages and PrivateMessages holding Commits or Update Proposals that
require one less signature than their original counterparts.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://kkohbrok.github.io/draft-kohbrok-single-signature-keypackages/draft-kohbrok-mls-fewer-signatures.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-kohbrok-mls-fewer-signatures/"/>.
      </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/kkohbrok/draft-kohbrok-single-signature-keypackages"/>.</t>
    </note>
  </front>
  <middle>
    <?line 46?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Both MLS KeyPackage messages, as well as PublicMessages and PrivateMessages
holding Commits and Update Proposals can be safely sent with one fewer signature
than specified in <xref target="RFC9420"/>, although the latter two only if certain
conditions are met.</t>
      <t>Regular MLS KeyPackages require two signatures: One over the LeafNode and one
over the KeyPackage around it. This draft introduces a LeafNode component that
contains a hash over the KeyPackage fields surrounding the LeafNode. As a
consequence, verifying the LeafNode also verifies the KeyPackage.</t>
      <t>For Commits with an UpdatePath or Update Proposals (sent as PublicMessage or
PrivateMessage) the issue is similar: One signature covers the LeafNode and one
signature covers the majority of the struct that ends up being sent over the
wire. This draft proposes new types of PublicMessage and PrivateMessage with
only one signature, although the signature can only be omitted for Commits that
contain an UpdatePath and for Commits and Update Proposals if the LeafNode
doesn't change the sender's signature public key.</t>
      <t>Saving a signature can result in a significant decrease in computational or
bandwidth cost, especially in the context of PQ-secure signature schemes such as
ML-DSA, where signatures are multiple orders of magnitude larger than those of
most non-PQ signature schemes.</t>
    </section>
    <section anchor="new-mlsmessage-variants">
      <name>New MLSMessage variants</name>
      <t>This document specifies three new entries for the IANA WireFormat registry,
which results in the following changes to the MLSMessage struct as defined in
<xref target="RFC9420"/>.</t>
      <sourcecode type="tls"><![CDATA[
struct {
  ...
  select (MLSMessage.wire_format) {
    ...
    case mls_os_key_package:
      OneSignatureKeyPackage key_package;
    case mls_os_private_message:
      OSPrivateMessage private_message;
    case mls_os_public_message:
      OSPublicMessage public_message;
  };
} MLSMessage;
]]></sourcecode>
      <t>See <xref target="one-signature-keypackages"/> for the definition of OneSignatureKeyPackage
and <xref target="one-signature-commits-and-update-proposals"/> for the definitions of
OSPrivateMessage and OSPublicMessage.</t>
    </section>
    <section anchor="one-signature-keypackages">
      <name>One Signature KeyPackages</name>
      <t>A OneSignatureKeyPackage functions like a regular KeyPackage, except that it's
partitioned into two components: The OuterKeyPackage and the LeafNode. The
OuterKeyPackage contains all fields of a regular KeyPackage except the LeafNode
and the signature.</t>
      <sourcecode type="tls"><![CDATA[
struct {
  ProtocolVersion version;
  CipherSuite cipher_suite;
  HPKEPublicKey init_key;
  Extension extensions<V>;
} OuterKeyPackage

struct {
  OuterKeyPackage outer_key_package;
  LeafNode leaf_node;
} OneSignatureKeyPackage
]]></sourcecode>
      <section anchor="creating-a-onesignaturekeypackage">
        <name>Creating a OneSignatureKeyPackage</name>
        <t>A OneSignatureKeyPackage is created like a regular KeyPackage with the following
exceptions.</t>
        <ul spacing="normal">
          <li>
            <t>The signature around the outer KeyPackage is omitted</t>
          </li>
          <li>
            <t>An <tt>app_data_dictionary</tt> extension is added to the LeafNode (if not already
present)</t>
          </li>
          <li>
            <t>An OuterKeyPackageHash component is included in the <tt>app_data_dictionary</tt> (see
<xref target="outerkeypackage-hash-component"/>)</t>
          </li>
        </ul>
        <t>The original purpose of the signature over the KeyPackage is now served by the
signature over the LeafNode, which by inclusion of the OuterKeyPackageHash
provides authenticity for both the LeafNode itself <em>and</em> the OuterKeyPackage
around it.</t>
      </section>
      <section anchor="outerkeypackage-hash-component">
        <name>OuterKeyPackage hash component</name>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque outer_key_package_hash;
} OuterKeyPackageHash
]]></sourcecode>
        <t>The OuterKeyPackageHash can be created by hashing the TLS-serialized
<tt>outer_key_package</tt> of a OneSignatureKeyPackage using the hash function of its
<tt>ciphersuite</tt>.</t>
        <t>A OuterKeyPackageHash is only valid if two conditions are met.</t>
        <ul spacing="normal">
          <li>
            <t>The <tt>leaf_node_source</tt> of the LeafNode is KeyPackage</t>
          </li>
          <li>
            <t>If the LeafNode is verified in the context of a OneSignatureKeyPackage, the
<tt>outer_key_package_hash</tt> is the hash of the <tt>outer_key_package</tt> of that
OneSignatureKeyPackage.</t>
          </li>
        </ul>
      </section>
      <section anchor="processing-a-onesignaturekeypackage">
        <name>Processing a OneSignatureKeyPackage</name>
        <t>Recipients of a OneSignatureKeyPackage process is like a regular KeyPackage with
two exceptions</t>
        <ul spacing="normal">
          <li>
            <t>There is no signature over the outer KeyPackage to verify</t>
          </li>
          <li>
            <t>The <tt>app_data_dictionary</tt> extension in the <tt>leaf_node</tt> must contain a valid
OuterKeyPackageHash as defined in <xref target="outerkeypackage-hash-component"/> under the
<tt>component_id</tt> TBD.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="one-signature-commits-and-update-proposals">
      <name>One Signature Commits and Update Proposals</name>
      <t>MLS PublicMessages and PrivateMessages carrying a Commit with UpdatePath or an
Update Proposal can also be created with only one signature as long as the
signature key of the sender is not changed by the respective operation. The
resulting structs are called OSPublicMessage and OSPrivateMessage respectively.</t>
      <t>The principle behind saving the signature is the same as for
OneSignatureKeyPackage. The signature over the whole struct is omitted and
instead a hash over the otherwise signed part of the struct (minus the LeafNode)
is placed as a component in the LeafNode of the UpdatePath or the Update
Proposal.</t>
      <section anchor="changes-in-framing">
        <name>Changes in framing</name>
        <t>The core change in framing an OSPublicMessage or OSPrivateMessage as compared to
its regular counterparts is that the FramedContentAuthData is replaced by the
OSFramedContentAuthData, where the latter lacks the signature that is part of
the former. Other framing structs are changed as a result in that they contain
an OSFramedContentAuthData struct instead of a FramedContentAuthData struct.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  select (FramedContent.content_type) {
    case commit:
      /*
        MAC(confirmation_key,
          GroupContext.confirmed_transcript_hash)
      */
      MAC confirmation_tag;
    case application:
    case proposal:
      struct{};
  };
} OSFramedContentAuthData;

struct {
  WireFormat wire_format;
  FramedContent content;
  OSFramedContentAuthData auth;
} OSAuthenticatedContent;

struct {
  select (PrivateMessage.content_type) {
    case application:
      opaque application_data<V>;

      case proposal:
        Proposal proposal;

      case commit:
        Commit commit;
  };

  OSFramedContentAuthData auth;
  opaque padding[length_of_padding];
} OSPrivateMessageContent;

struct {
  FramedContent content;
  OSFramedContentAuthData auth;
  select (PublicMessage.content.sender.sender_type) {
      case member:
          MAC membership_tag;
      case external:
      case new_member_commit:
      case new_member_proposal:
          struct{};
  };
} OSPublicMessage;
]]></sourcecode>
      </section>
      <section anchor="changes-in-membership-tag-and-transcript-hash-computation">
        <name>Changes in membership tag and transcript hash computation</name>
        <t>The structs involved in membership tag and transcript hash computation also
change slightly.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  FramedContentTBS content_tbs;
  OSFramedContentAuthData auth;
} OSAuthenticatedContentTBM;
]]></sourcecode>
        <t>For OSPublicMessages, the <tt>membership_tag</tt> is computed over
OSAuthenticatedContentTBM instead of the regular AuthenticatedContentTBM.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  WireFormat wire_format;
  FramedContent content; /* with content_type == commit */
} OSConfirmedTranscriptHashInput;
]]></sourcecode>
        <t>Due to the changes in framing, the transcript hash for OSPublicMessages and
OSPrivateMessages is computed over OSConfirmedTranscriptHashInput instead of the
regular ConfirmedTranscriptHash. Since the LeafNode is within FramedContent and
its signature covers what the original <tt>signature</tt> would have covered, this does
not affect transcript coverage.</t>
      </section>
      <section anchor="outer-update-hash-component">
        <name>Outer update hash component</name>
        <t>The OuterUpdateHash component ensures that the signature over the LeafNode
covers whatever the omitted signature would have covered.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque outer_update_hash;
} OuterUpdateHash

struct {
  opaque group_id<V>;
    uint64 epoch;
    Sender sender;
    opaque authenticated_data<V>;

    ContentType content_type;
    select (FramedContent.content_type) {
      case proposal:
        ProposalType proposal_type;
      case commit:
        ProposalOrRef proposals<V>;
        UpdatePathNode nodes<V>;
      case application:
        struct {};
    };
} OuterFramedContent

struct {
  ProtocolVersion version = mls10;
  WireFormat wire_format;
  OuterFramedContent content;
  GroupContext context;
} OSFramedContentTBH
]]></sourcecode>
        <t>The <tt>outer_update_hash</tt> MUST be a hash over the message's TLS-serialized
OSFramedContentTBH using the hash function of the group's ciphersuite.</t>
        <t>OSFramedContentTBH is the same as the FramedContentTBS struct defined in
<xref target="RFC9420"/>, except that it always contains a GroupContext (because Commits and
Update Proposals only have <tt>member</tt> or <tt>new_member_commit</tt> as <tt>sender_type</tt>) and
that it contains an OuterFramedContent instead of a regular FramedContent.</t>
        <t>OuterFramedContent in turn is the same as FramedContent except that, depending
on <tt>content_type</tt>, it either contains only content relevant to a Commit with an
UpdatePath or an Update Proposal. For Commits, the <tt>proposals</tt> MUST be the same
as in the message's Commit and the <tt>nodes</tt> MUST be equal to the <tt>nodes</tt> in the
Commit's UpdatePath. For Update Proposals, the <tt>proposal_type</tt> MUST be <tt>update</tt>.
The proposal type is the only relevant content, as the Update Proposal otherwise
only consists of the (omitted) LeafNode.</t>
        <t>In both cases, the actual LeafNode is omitted to prevent a circular dependency
when computing the <tt>outer_update_hash</tt> for inclusion in said LeafNode.</t>
      </section>
      <section anchor="creating-an-ospublicmessage-or-osprivatemessage">
        <name>Creating an OSPublicMessage or OSPrivateMessage</name>
        <t>Clients create an OSPublicMessage or OSPrivateMessage just like their non-OS
counterpart with three exceptions:</t>
        <ul spacing="normal">
          <li>
            <t>The signature in FramedContentData is omitted by using OSFramedContentData and
the other modified structs introduced in <xref target="changes-in-framing"/> instead of
their non-OS counterparts.</t>
          </li>
          <li>
            <t>An <tt>app_data_dictionary</tt> is included in the LeafNode (either in the UpdatePath
or the Update Proposal) and within it an OuterUpdateHash component (see
<xref target="outer-update-hash-component"/>).</t>
          </li>
          <li>
            <t>The membership tag and transcript hash are computed as specified in
<xref target="changes-in-membership-tag-and-transcript-hash-computation"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="processing-an-ospublicmessage-or-osprivatemessage">
        <name>Processing an OSPublicMessage or OSPrivateMessage</name>
        <t>OSPublicMessages and OSPrivateMessages are processed like their regular
counterparts with the following exceptions.</t>
        <ul spacing="normal">
          <li>
            <t>One of the following MUST be true
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>content_type = commit</tt> and the Commit contained within MUST have an UpdatePath</t>
              </li>
              <li>
                <t><tt>content_type = proposal</tt> and <tt>proposal_type = update</tt></t>
              </li>
            </ul>
          </li>
          <li>
            <t>The signature public key in the LeafNode MUST be the same as the sender's
current LeafNode. This MUST also be true for Commits with <tt>sender_type =
new_member_commit</tt> that contain a Remove Proposal targeting the sender's
original leaf.</t>
          </li>
          <li>
            <t>The LeafNode (either in the UpdatePath or in the Update Proposal) MUST contain
an <tt>app_data_dictionary</tt> extension with a valid OuterUpdateHash component as
specified in <xref target="outer-update-hash-component"/>.</t>
          </li>
          <li>
            <t>Membership tag and transcript hash are computed as specified in
<xref target="changes-in-membership-tag-and-transcript-hash-computation"/>.</t>
          </li>
        </ul>
        <t>The second check for signature public key equality is necessary to ensure that
the authentication properties of one-signature message variants are equivalent
to their counterparts defined in RFC9420. Clients that want to change their
signature public key MUST use the normal (external) Commits and Update Proposals
to ensure that the new signature public key is signed by the old one.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Security considerations around the one signature variants are the same as
those of their regular MLS counterparts, except their content should not be
trusted until the signature of the LeafNode was verified and the
OuterKeyPackageHash or OuterUpdateHash component was validated.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="component-types">
        <name>Component Types</name>
        <t>This document requests the addition of two new Component Types under the heading
of "Messaging Layer Security".</t>
        <section anchor="outerkeypackagehash">
          <name>OuterKeyPackageHash</name>
          <t>The OuterKeyPackageHash component contains a hash over the outer parts of a
OneSignatureKeyPackage.</t>
          <ul spacing="normal">
            <li>
              <t>Value: TBD (suggested value 0x0009)</t>
            </li>
            <li>
              <t>outer_key_package_hash</t>
            </li>
            <li>
              <t>Where: LN</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: TBD</t>
            </li>
          </ul>
        </section>
        <section anchor="outerupdatehash">
          <name>OuterUpdateHash</name>
          <t>The OuterUpdateHash component contains a hash over the parts of an
OSPublicMessage or OSPrivateMessage that would otherwise be covered by a
signature.</t>
          <ul spacing="normal">
            <li>
              <t>Value: TBD (suggested value 0x000C)</t>
            </li>
            <li>
              <t>outer_update_hash</t>
            </li>
            <li>
              <t>Where: LN</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: TBD</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="wireformat">
        <name>WireFormat</name>
        <t>This document requests the addition of three new WireFormats under the heading of
"Messaging Layer Security".</t>
        <section anchor="mlsonesignaturekeypackage">
          <name>MLSOneSignatureKeyPackage</name>
          <t>The <tt>mls_os_key_package</tt> allows saving the creation and
verification of a signature that is necessary when creating a regular
KeyPackage.</t>
          <ul spacing="normal">
            <li>
              <t>Value: TBD</t>
            </li>
            <li>
              <t>Name: mls_os_key_package</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: TBD</t>
            </li>
          </ul>
        </section>
        <section anchor="mlsonesignatureprivatemessage">
          <name>MLSOneSignaturePrivateMessage</name>
          <t>The <tt>mls_os_private_message</tt> allows saving the creation and
verification of a signature that is necessary when creating a regular
PrivateMessage that either contains a Commit with an UpdatePath or an Update
Proposal.</t>
          <ul spacing="normal">
            <li>
              <t>Value: TBD</t>
            </li>
            <li>
              <t>Name: mls_os_private_message</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: TBD</t>
            </li>
          </ul>
        </section>
        <section anchor="mlsonesignaturepublicmessage">
          <name>MLSOneSignaturePublicMessage</name>
          <t>The <tt>mls_os_public_message</tt> allows saving the creation and
verification of a signature that is necessary when creating a regular
PublicMessage that either contains a Commit with an UpdatePath or an Update
Proposal.</t>
          <ul spacing="normal">
            <li>
              <t>Value: TBD</t>
            </li>
            <li>
              <t>Name: mls_os_public_message</t>
            </li>
            <li>
              <t>Recommended: Y</t>
            </li>
            <li>
              <t>Reference: TBD</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC9420">
        <front>
          <title>The Messaging Layer Security (MLS) Protocol</title>
          <author fullname="R. Barnes" initials="R." surname="Barnes"/>
          <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
          <author fullname="R. Robert" initials="R." surname="Robert"/>
          <author fullname="J. Millican" initials="J." surname="Millican"/>
          <author fullname="E. Omara" initials="E." surname="Omara"/>
          <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
          <date month="July" year="2023"/>
          <abstract>
            <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9420"/>
        <seriesInfo name="DOI" value="10.17487/RFC9420"/>
      </reference>
    </references>
    <?line 435?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
BbW+f/meZ/1KCJH/AZTrfhSONwAA

-->

</rfc>
