<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kohbrok-mls-two-party-profile-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="2PMLS">A two-party profile for MLS</title>
    <seriesInfo name="Internet-Draft" value="draft-kohbrok-mls-two-party-profile-01"/>
    <author fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad@ratchet.ing</email>
      </address>
    </author>
    <author fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2026" month="July" day="30"/>
    <area>Security</area>
    <workgroup>Messaging Layer Security</workgroup>
    <keyword>handshake</keyword>
    <keyword>key exchange</keyword>
    <abstract>
      <?line 51?>

<t>TODO Abstract</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-mls-two-party-profile/draft-kohbrok-mls-two-party-profile.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-kohbrok-mls-two-party-profile/"/>.
      </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-mls-two-party-profile"/>.</t>
    </note>
  </front>
  <middle>
    <?line 56?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Messaging Layer Security (MLS) <xref target="RFC9420"/> is primarily designed to be a
continuous group key agreement (and messaging) protocol. This document explores
the special case of groups of two and thus MLS's use as a (non-group) continuous
key agreement protocol with a focus on the use in synchronous scenarios.</t>
      <t>The two-party profile of MLS described in this document can, for example, be
used as a replacement for other key exchange protocols that don't provide
post-compromise security and/or post-quantum security. Post-quantum security is
available when the profile is used with a suitable post-quantum cipher suite,
such as one defined in <xref target="I-D.ietf-mls-pq-ciphersuites"/>. This is the case with
the key exchange components for many secure channel protocols today.</t>
      <t>TODO: For now, this document specifies a simple two party profile based on
vanilla MLS that assumes synchronous communication and a reliable transport. In
the future, we should explore the asynchronous case and add a more specialized
version that trims unnecessary things like signatures in key update messages,
etc.</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 the TLS presentation language as modified by <xref section="2.1" sectionFormat="of" target="RFC9420"/> to describe the structure of protocol messages.</t>
      <section anchor="component">
        <name>Two-party profile component</name>
        <t>This document defines the <tt>two_party_profile</tt> application component using the
Safe Application Interface of <xref target="I-D.ietf-mls-extensions"/>. Its component ID is
TBD1 (see <xref target="iana"/>). The component is used with Safe Additional Authenticated
Data (AAD) and <bcp14>MAY</bcp14> be used with the safe exporter.</t>
        <t>An implementation using this profile <bcp14>MUST</bcp14> include the <tt>two_party_profile</tt>
component ID in the <tt>ComponentsList</tt> values of both the <tt>app_components</tt> and
<tt>safe_aad</tt> components in the <tt>app_data_dictionary</tt> extension of every LeafNode
it uses with this profile. The group creator <bcp14>MUST</bcp14> include an
<tt>app_data_dictionary</tt> extension in the GroupContext and <bcp14>MUST</bcp14> include the
<tt>two_party_profile</tt> component ID in the <tt>ComponentsList</tt> values of both its
<tt>app_components</tt> and <tt>safe_aad</tt> components.</t>
        <t>A client processing a KeyPackage for this profile <bcp14>MUST</bcp14> verify that its LeafNode
advertises these component requirements. A client joining a group <bcp14>MUST</bcp14> verify
that the GroupContext requires them. A member processing a Commit with an
UpdatePath <bcp14>MUST</bcp14> verify that the UpdatePath LeafNode continues to advertise
them.</t>
        <t>The following values identify the post-establishment messages defined by this
profile:</t>
        <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  connection_update(1),
  resumption_request(2),
  resumption_response(3),
  epoch_key_update(4),
  (255)
} TwoPartyMessageType;
]]></sourcecode>
        <t>Each MLSMessage created for a ConnectionUpdate, ResumptionRequest, or
ResumptionResponse, as well as each EpochKeyUpdate application message, <bcp14>MUST</bcp14>
contain a SafeAADItem for the <tt>two_party_profile</tt> component. The
<tt>aad_item_data</tt> of that item <bcp14>MUST</bcp14> contain the TLS presentation language
encoding of the TwoPartyMessageType value corresponding to the purpose for
which the MLSMessage was created. A receiver <bcp14>MUST</bcp14> verify the value before
processing the message. This allows a receiver to distinguish messages whose
MLS payloads otherwise have the same encoding.</t>
        <t>The message type is authenticated as part of the MLSMessage and identifies the
purpose for which that MLSMessage was created. It <bcp14>MUST NOT</bcp14> be changed when a
pending MLSMessage is retransmitted during resumption. <xref target="resumption"/> defines
how this rule applies to a pending MLSMessage carried in a ResumptionRequest.</t>
      </section>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol overview</name>
      <t>The synchronous case assumes that both parties are online. The protocol
additionally assumes that the underlying transport delivers messages reliably
and in order while a connection is active, and that messages sent over an
interrupted connection are no longer delivered once resumption of that
connection has begun. How the parties detect an interruption is out of scope
for this document and typically depends on the transport.</t>
      <t>The party sending the first message is the initiator and the other party the
responder. The protocol can be split into three phases.</t>
      <ol spacing="normal" type="1"><li>
          <t>Initial key agreement</t>
        </li>
        <li>
          <t>Continuous key agreement</t>
        </li>
        <li>
          <t>Resumption</t>
        </li>
      </ol>
      <t>In Phase 1, the initiator and responder exchange messages until they agree on a
shared key and thus enter Phase 2.</t>
      <t>In Phase 2, both parties can perform key-updates to achieve forward-secrecy (FS)
and post-compromise security (PCS). To avoid de-synchronization, both parties
have to await confirmation of each update by the other party before they can
perform another one. This phase continues until the connection between the
parties is interrupted.</t>
      <t>Phase 3 allows either party to resume the connection. During resumption,
initiator and responder exchange messages to renew their key material before
they (re-)enter Phase 2.</t>
      <t>The initiator and responder roles are assigned during Phase 1 and re-assigned
whenever the connection is resumed in Phase 3. The roles assigned during Phase
1 are additionally referred to as the initial initiator and the initial
responder. Both parties <bcp14>MUST</bcp14> persist their initial role for the lifetime of
the group, since it is used to resolve message collisions during resumption
(see <xref target="resumption"/>).</t>
      <t>While the synchronous two-party case is significantly simpler when it comes to
the responsibilities of the MLS Delivery Service, it still requires both parties
to interface with an Authentication Service (AS) to validate both initial
credentials and any credential updates.</t>
      <t>A higher-level protocol using this profile <bcp14>MAY</bcp14> export key material with the MLS
exporter defined in <xref section="8.5" sectionFormat="of" target="RFC9420"/> or with the safe exporter defined
in <xref target="I-D.ietf-mls-extensions"/>. The higher-level protocol is responsible for
defining the exporter inputs and how the resulting key material is used. See
<xref section="8.5" sectionFormat="of" target="RFC9420"/> for guidance on the use of exported key material.</t>
      <section anchor="protocol-states">
        <name>Protocol states and error handling</name>
        <t>At any point in the protocol, each party is in one of the following states:</t>
        <dl>
          <dt>Awaiting ClientHello:</dt>
          <dd>
            <t>The responder has accepted a connection and waits for a ClientHello. It has
not yet created group state.</t>
          </dd>
          <dt>Awaiting ServerHello:</dt>
          <dd>
            <t>The initiator has sent a ClientHello and waits for the corresponding
ServerHello.</t>
          </dd>
          <dt>Synced:</dt>
          <dd>
            <t>The party has no pending commit and may send a new ConnectionUpdate. Its peer
may still be in the previous epoch while waiting to receive an EpochKeyUpdate
that this party sent.</t>
          </dd>
          <dt>Awaiting EpochKeyUpdate:</dt>
          <dd>
            <t>The party has sent a commit as part of a ConnectionUpdate or a
ResumptionResponse and waits for the corresponding EpochKeyUpdate.</t>
          </dd>
          <dt>Awaiting ResumptionResponse:</dt>
          <dd>
            <t>The party has sent a ResumptionRequest and waits for the corresponding
ResumptionResponse.</t>
          </dd>
        </dl>
        <t><xref target="initial-key-agreement"/>, <xref target="continuous-key-agreement"/>, and <xref target="resumption"/>
define how a party in a given state processes each message. If a party
receives a message that those sections do not explicitly permit in its current
state, or if it fails to validate a received message, this is a fatal error.
The party <bcp14>MUST</bcp14> terminate the connection and delete any group state associated
with it. Group state discarded due to a fatal error <bcp14>MUST NOT</bcp14> be used for
resumption. Communication can only be re-established through a new run of the
initial key agreement.</t>
        <t><xref target="state-machine"/> shows the resulting state machine in graphical form.</t>
      </section>
    </section>
    <section anchor="initial-key-agreement">
      <name>Initial key agreement</name>
      <sourcecode type="tls"><![CDATA[
struct {
  MLSMessage key_package;
} ClientHello;

struct {
  MLSMessage welcome;
} ServerHello;
]]></sourcecode>
      <t>The initiator starts the key agreement part of the protocol by creating a
KeyPackage and sending a ClientHello to the responder. It then enters the
Awaiting ServerHello state, in which the ServerHello is the only permitted
message.</t>
      <t>The responder starts in the Awaiting ClientHello state, in which the
ClientHello is the only permitted message.</t>
      <t>The responder <bcp14>MUST</bcp14> validate the KeyPackage as specified in <xref section="10.1" sectionFormat="of" target="RFC9420"/>. It <bcp14>MUST</bcp14> verify that the KeyPackage advertises the component
requirements in <xref target="component"/>. It then checks whether it supports the offered
cipher suite and whether the initiator has sufficient capabilities to support
the connection.</t>
      <t>The responder <bcp14>MUST</bcp14> interface with the AS to ensure that the credential in the
KeyPackage is valid.</t>
      <t>The responder then locally creates an MLS group and commits to an Add proposal
containing the initiator's KeyPackage. The responder sends the resulting Welcome
message back to the initiator as part of a ServerHello message and enters the
Synced state.</t>
      <t>The initiator uses the Welcome to create its local group state. The initiator
then inspects the group state. It <bcp14>MUST</bcp14> verify that the group contains exactly
two non-blank leaves, that one leaf corresponds to the KeyPackage it sent, and
that the other leaf belongs to the responder. It <bcp14>MUST</bcp14> also verify that the
GroupContext contains the component requirements in <xref target="component"/> and interface
with the AS to ensure that the credential of the responder is valid. The
initiator then enters the Synced state.</t>
      <t>If the connection is interrupted before the initial key agreement completes,
the parties <bcp14>MUST</bcp14> abandon the partial exchange and delete any group state
created solely for it. Communication can only be re-established through a new
run of the initial key agreement starting with a new ClientHello.</t>
    </section>
    <section anchor="continuous-key-agreement">
      <name>Continuous key agreement</name>
      <sourcecode type="tls"><![CDATA[
struct {
  MLSMessage update;
} ConnectionUpdate;

struct {
  uint64 epoch;
} EpochKeyUpdate;
]]></sourcecode>
      <t>An EpochKeyUpdate is encoded as the <tt>application_data</tt> of an MLS application
message. The application message is sent in the new epoch and carries the
<tt>epoch_key_update</tt> message type in Safe AAD as specified in <xref target="component"/>.</t>
      <t>After the initial key agreement phase, both parties can send an MLS commit with
UpdatePath to update their key material. To ensure that both agree on the order
of such commits and thus on the currently used key material, they must follow
the following rules. The initiator and responder roles referenced in these
rules are the current roles, i.e. the roles assigned during the most recent run
of Phase 1 or Phase 3.</t>
      <t>Every Commit sent as part of a ConnectionUpdate, ResumptionRequest, or
ResumptionResponse <bcp14>MUST</bcp14> contain an empty <tt>proposals</tt> vector and a populated
UpdatePath. A receiver <bcp14>MUST</bcp14> reject a Commit that does not satisfy these
requirements.</t>
      <ul spacing="normal">
        <li>
          <t>A party in the Synced state <bcp14>MAY</bcp14> send a ConnectionUpdate containing a commit
with UpdatePath. It then enters the Awaiting EpochKeyUpdate state.</t>
        </li>
        <li>
          <t>A party in the Synced state that receives a ConnectionUpdate <bcp14>MUST</bcp14> validate
and apply the commit and respond with an EpochKeyUpdate, where <tt>epoch</tt> is the
group's new epoch. It remains in the Synced state.</t>
        </li>
        <li>
          <t>If the initiator receives a ConnectionUpdate in the Awaiting EpochKeyUpdate
state, it <bcp14>MUST</bcp14> ignore the ConnectionUpdate and remain in the Awaiting
EpochKeyUpdate state.</t>
        </li>
        <li>
          <t>If the responder receives a ConnectionUpdate in the Awaiting EpochKeyUpdate
state, it <bcp14>MUST</bcp14> drop its locally pending commit and then process the
ConnectionUpdate as if it were in the Synced state. It thereby enters the
Synced state.</t>
        </li>
        <li>
          <t>A party in the Awaiting EpochKeyUpdate state that receives an EpochKeyUpdate
<bcp14>MUST</bcp14> decrypt and authenticate the application message using the group state
resulting from its pending commit. It <bcp14>MUST</bcp14> check that the Safe AAD identifies
an EpochKeyUpdate and that <tt>epoch</tt> matches the epoch created by its pending
commit. If both checks succeed, the party <bcp14>MUST</bcp14> make that group state current
and enter the Synced state. Otherwise, this is a fatal error (see
<xref target="protocol-states"/>).</t>
        </li>
        <li>
          <t>A party that responds to a commit with an EpochKeyUpdate <bcp14>MUST</bcp14> start using the
key material of the new epoch after sending the EpochKeyUpdate.</t>
        </li>
        <li>
          <t>A party that sends a commit <bcp14>MUST</bcp14> wait until it receives the corresponding
EpochKeyUpdate before it starts using the key material of the new epoch.</t>
        </li>
      </ul>
      <t>In addition, a party in the Synced or Awaiting EpochKeyUpdate state may receive
a ResumptionRequest at any time. Its processing is defined in <xref target="resumption"/>.</t>
      <t>OPEN QUESTION: How should we constrain the inclusion of commits? Some proposal
types like Re-Init would need to be integrated into the state machine.</t>
    </section>
    <section anchor="resumption">
      <name>Resumption</name>
      <t>Either party may resume a previously interrupted protocol session based on that
session's group state. The party initiating the resumption becomes the
initiator for the resumed session and the other party the responder. The
initial roles (see <xref target="protocol-overview"/>) remain unchanged.</t>
      <sourcecode type="tls"><![CDATA[
struct {
  MLSMessage commit;
} ResumptionRequest;

struct {
  MLSMessage commit;
} ResumptionResponse;
]]></sourcecode>
      <t>The initiator creates a ResumptionRequest, sends it to the responder, and
enters the Awaiting ResumptionResponse state. If the initiator has a pending
commit, i.e. if it was in the Awaiting EpochKeyUpdate or Awaiting
ResumptionResponse state when the connection was interrupted, the <tt>commit</tt>
field <bcp14>MUST</bcp14> contain that pending commit. Otherwise, the <tt>commit</tt> field <bcp14>MUST</bcp14>
contain a fresh commit with UpdatePath. A fresh commit carries the
<tt>resumption_request</tt> message type in Safe AAD. A pending commit retains its
original message type: <tt>connection_update</tt>, <tt>resumption_request</tt>, or
<tt>resumption_response</tt>.</t>
      <t>The parties do not need to agree on whether the connection was interrupted: a
party may receive a ResumptionRequest in the Synced, Awaiting EpochKeyUpdate,
or Awaiting ResumptionResponse state. A party that receives a
ResumptionRequest <bcp14>MUST</bcp14> treat the previous connection as interrupted and <bcp14>MUST
NOT</bcp14> send any further messages over it.</t>
      <t>Before processing the commit in a ResumptionRequest in any state, a party <bcp14>MUST</bcp14>
verify that its Safe AAD message type is <tt>resumption_request</tt>,
<tt>connection_update</tt>, or <tt>resumption_response</tt>. The latter two values identify
a pending ConnectionUpdate or ResumptionResponse retransmitted for resumption.</t>
      <t>A party that receives a ResumptionRequest in the Synced or Awaiting
EpochKeyUpdate state <bcp14>MUST</bcp14> process the commit in the ResumptionRequest as
follows:</t>
      <ul spacing="normal">
        <li>
          <t>If the commit is identical to the last commit the receiver applied, the
receiver <bcp14>MUST NOT</bcp14> apply it again and <bcp14>MUST</bcp14> drop its own pending commit, if
it has one. This occurs when the connection was interrupted after the
receiver applied the commit, but before the message confirming it reached
the peer.</t>
        </li>
        <li>
          <t>If the receiver has a pending commit and the received commit builds on the
epoch created by that pending commit, the receiver <bcp14>MUST</bcp14> first apply its
pending commit and <bcp14>MUST</bcp14> then validate and apply the received commit. This
occurs when the peer applied the receiver's pending commit, but the message
confirming it was lost. The received commit only validates against a group
state that includes the pending commit and thereby confirms it.</t>
        </li>
        <li>
          <t>Otherwise, the receiver <bcp14>MUST</bcp14> drop its pending commit, if it has one, and
<bcp14>MUST</bcp14> validate and apply the received commit.</t>
        </li>
      </ul>
      <t>To recognize the first case, both parties <bcp14>MUST</bcp14> retain the last commit message
they applied, or a collision-resistant hash of it.</t>
      <t>If a party receives a ResumptionRequest in the Awaiting ResumptionResponse
state, it has a pending commit from its own ResumptionRequest. It <bcp14>MUST</bcp14> classify
the received commit before resolving a collision:</t>
      <ul spacing="normal">
        <li>
          <t>If the received commit is identical to the last commit the receiver applied,
the receiver <bcp14>MUST</bcp14> process it according to the first rule above.</t>
        </li>
        <li>
          <t>If the received commit builds on the epoch created by the receiver's pending
commit, the receiver <bcp14>MUST</bcp14> process it according to the second rule above.</t>
        </li>
        <li>
          <t>Otherwise, the receiver <bcp14>MUST</bcp14> verify that the received commit builds on its
current epoch. If it does not, this is a fatal error. If it does, the
received commit and the receiver's pending commit conflict. The receiver
resolves the conflict based on its initial role:  </t>
          <ul spacing="normal">
            <li>
              <t>The initial initiator <bcp14>MUST</bcp14> ignore the received commit and remain in the
Awaiting ResumptionResponse state.</t>
            </li>
            <li>
              <t>The initial responder <bcp14>MUST</bcp14> drop its pending commit and validate and apply
the received commit.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>Whenever a receiver processes a ResumptionRequest rather than ignoring it, the
receiver <bcp14>MUST</bcp14> create a fresh commit with UpdatePath, carrying the
<tt>resumption_response</tt> message type in Safe AAD, and send it as part of a
ResumptionResponse. Since this commit requires confirmation like any other, the
receiver enters the Awaiting EpochKeyUpdate state and the rules of
<xref target="continuous-key-agreement"/> apply from there.</t>
      <t>A party that receives a ResumptionResponse in the Awaiting ResumptionResponse
state <bcp14>MUST</bcp14> first apply its pending commit, i.e. the commit it sent as part of
its ResumptionRequest. It <bcp14>MUST</bcp14> then validate and apply the commit in the
ResumptionResponse and respond with an EpochKeyUpdate, where <tt>epoch</tt> is the
group's new epoch. It then enters the Synced state.</t>
      <t>As a result, if both parties initiate a resumption at the same time and their
commits conflict, the resumed session continues with the initial initiator as
the current initiator and the initial responder as the current responder.</t>
      <t>After ignoring a ResumptionRequest, the initial initiator may be waiting for a
ResumptionResponse that never arrives, for example if its own ResumptionRequest
or the corresponding ResumptionResponse was lost in a further interruption.
Recovery from this situation relies on the initial initiator detecting the
interruption and initiating resumption again.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO: A future version of this document will provide a more complete security
analysis.</t>
      <section anchor="epochkeyupdate-authentication">
        <name>EpochKeyUpdate authentication</name>
        <t>An EpochKeyUpdate is an MLS application message sent under the new epoch's
keys. Its Safe AAD identifies it as an EpochKeyUpdate for this profile. The
sender of the Commit authenticates and decrypts the message using the group
state resulting from its pending Commit before making that state current. This
binds the acknowledgement to the new epoch and prevents a party that does not
know the new epoch's keys from forging it.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>IANA is requested to register the following entry in the "MLS Component
Types" registry defined by <xref target="I-D.ietf-mls-extensions"/>:</t>
      <dl>
        <dt>Value:</dt>
        <dd>
          <t>TBD1</t>
        </dd>
        <dt>Name:</dt>
        <dd>
          <t>two_party_profile</t>
        </dd>
        <dt>Where:</dt>
        <dd>
          <t>AD, ES</t>
        </dd>
        <dt>Recommended:</dt>
        <dd>
          <t>N</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>This document</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <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>
        <reference anchor="I-D.ietf-mls-extensions">
          <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="6" month="July" year="2026"/>
            <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-10"/>
        </reference>
        <reference anchor="RFC2119">
          <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">
          <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-mls-pq-ciphersuites">
          <front>
            <title>ML-KEM and Hybrid Cipher Suites for Messaging Layer Security</title>
            <author fullname="Rohan Mahy" initials="R." surname="Mahy">
         </author>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
         </author>
            <date day="21" month="July" year="2026"/>
            <abstract>
              <t>   This document registers new cipher suites for Messaging Layer
   Security (MLS) based on "post-quantum" algorithms, which are intended
   to be resilient to attack by quantum computers.  These cipher suites
   are constructed using the new Module-Lattice Key Encapsulation
   Mechanism (ML-KEM), optionally in combination with traditional
   elliptic curve KEMs, together with appropriate authenticated
   encryption, hash, and signature algorithms.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-pq-ciphersuites-06"/>
        </reference>
      </references>
    </references>
    <?line 476?>

<section anchor="state-machine">
      <name>Protocol state machine</name>
      <t>This appendix shows the protocol as a state machine. It is informative. The
normative rules are those in <xref target="initial-key-agreement"/>,
<xref target="continuous-key-agreement"/>, and <xref target="resumption"/>. Transitions are labeled with
the triggering event and, after a slash, the resulting actions. Transitions
that only apply to the party holding a particular role are marked with that
role in parentheses. Fatal errors (<xref target="protocol-states"/>) are omitted from the
diagrams: in every state, receiving a message that no transition of that state
covers terminates the connection.</t>
      <t><xref target="fig-establishment"/> shows the initial key agreement
(<xref target="initial-key-agreement"/>) and continuous key agreement
(<xref target="continuous-key-agreement"/>) phases.</t>
      <figure anchor="fig-establishment">
        <name>Initial and continuous key agreement</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="608" width="568" viewBox="0 0 568 608" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,128 L 8,176" fill="none" stroke="black"/>
              <path d="M 24,288 L 24,336" fill="none" stroke="black"/>
              <path d="M 24,496 L 24,544" fill="none" stroke="black"/>
              <path d="M 48,344 L 48,488" fill="none" stroke="black"/>
              <path d="M 88,64 L 88,120" fill="none" stroke="black"/>
              <path d="M 88,184 L 88,240" fill="none" stroke="black"/>
              <path d="M 176,128 L 176,176" fill="none" stroke="black"/>
              <path d="M 200,344 L 200,488" fill="none" stroke="black"/>
              <path d="M 216,48 L 216,64" fill="none" stroke="black"/>
              <path d="M 224,240 L 224,280" fill="none" stroke="black"/>
              <path d="M 296,128 L 296,176" fill="none" stroke="black"/>
              <path d="M 336,344 L 336,488" fill="none" stroke="black"/>
              <path d="M 376,64 L 376,120" fill="none" stroke="black"/>
              <path d="M 376,184 L 376,240" fill="none" stroke="black"/>
              <path d="M 440,288 L 440,336" fill="none" stroke="black"/>
              <path d="M 440,496 L 440,544" fill="none" stroke="black"/>
              <path d="M 464,128 L 464,176" fill="none" stroke="black"/>
              <path d="M 464,304 L 464,320" fill="none" stroke="black"/>
              <path d="M 464,512 L 464,528" fill="none" stroke="black"/>
              <path d="M 88,64 L 376,64" fill="none" stroke="black"/>
              <path d="M 8,128 L 176,128" fill="none" stroke="black"/>
              <path d="M 296,128 L 464,128" fill="none" stroke="black"/>
              <path d="M 8,176 L 176,176" fill="none" stroke="black"/>
              <path d="M 296,176 L 464,176" fill="none" stroke="black"/>
              <path d="M 88,240 L 376,240" fill="none" stroke="black"/>
              <path d="M 24,288 L 440,288" fill="none" stroke="black"/>
              <path d="M 448,304 L 464,304" fill="none" stroke="black"/>
              <path d="M 448,320 L 464,320" fill="none" stroke="black"/>
              <path d="M 24,336 L 440,336" fill="none" stroke="black"/>
              <path d="M 24,496 L 440,496" fill="none" stroke="black"/>
              <path d="M 448,512 L 464,512" fill="none" stroke="black"/>
              <path d="M 448,528 L 464,528" fill="none" stroke="black"/>
              <path d="M 24,544 L 440,544" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="456,528 444,522.4 444,533.6" fill="black" transform="rotate(180,448,528)"/>
              <polygon class="arrowhead" points="456,320 444,314.4 444,325.6" fill="black" transform="rotate(180,448,320)"/>
              <polygon class="arrowhead" points="384,120 372,114.4 372,125.6" fill="black" transform="rotate(90,376,120)"/>
              <polygon class="arrowhead" points="344,344 332,338.4 332,349.6" fill="black" transform="rotate(270,336,344)"/>
              <polygon class="arrowhead" points="232,280 220,274.4 220,285.6" fill="black" transform="rotate(90,224,280)"/>
              <polygon class="arrowhead" points="208,344 196,338.4 196,349.6" fill="black" transform="rotate(270,200,344)"/>
              <polygon class="arrowhead" points="96,120 84,114.4 84,125.6" fill="black" transform="rotate(90,88,120)"/>
              <polygon class="arrowhead" points="56,488 44,482.4 44,493.6" fill="black" transform="rotate(90,48,488)"/>
              <g class="text">
                <text x="216" y="36">START</text>
                <text x="116" y="100">send</text>
                <text x="184" y="100">ClientHello</text>
                <text x="412" y="100">accept</text>
                <text x="484" y="100">connection</text>
                <text x="92" y="148">AWAITING</text>
                <text x="380" y="148">AWAITING</text>
                <text x="96" y="164">SERVERHELLO</text>
                <text x="384" y="164">CLIENTHELLO</text>
                <text x="116" y="212">recv</text>
                <text x="184" y="212">ServerHello</text>
                <text x="404" y="212">recv</text>
                <text x="472" y="212">ClientHello</text>
                <text x="528" y="212">/</text>
                <text x="404" y="228">send</text>
                <text x="472" y="228">ServerHello</text>
                <text x="236" y="308">SYNCED</text>
                <text x="396" y="356">recv</text>
                <text x="484" y="356">ConnectionUpdate</text>
                <text x="560" y="356">/</text>
                <text x="396" y="372">send</text>
                <text x="476" y="372">EpochKeyUpdate</text>
                <text x="76" y="388">send</text>
                <text x="228" y="388">recv</text>
                <text x="364" y="388">recv</text>
                <text x="104" y="404">Connection-</text>
                <text x="268" y="404">EpochKeyUpdate</text>
                <text x="412" y="404">ConnectionUpdate</text>
                <text x="84" y="420">Update</text>
                <text x="216" y="420">/</text>
                <text x="248" y="420">apply</text>
                <text x="360" y="420">(as</text>
                <text x="420" y="420">responder)</text>
                <text x="472" y="420">/</text>
                <text x="240" y="436">pending</text>
                <text x="300" y="436">commit</text>
                <text x="364" y="436">drop</text>
                <text x="416" y="436">pending</text>
                <text x="480" y="436">commit,</text>
                <text x="368" y="452">apply</text>
                <text x="424" y="452">commit,</text>
                <text x="364" y="468">send</text>
                <text x="444" y="468">EpochKeyUpdate</text>
                <text x="180" y="516">AWAITING</text>
                <text x="276" y="516">EPOCHKEYUPDATE</text>
                <text x="388" y="564">recv</text>
                <text x="476" y="564">ConnectionUpdate</text>
                <text x="384" y="580">(as</text>
                <text x="444" y="580">initiator)</text>
                <text x="496" y="580">/</text>
                <text x="532" y="580">ignore</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
                          START
                            |
            +---------------+-------------------+
            |                                   |
            | send ClientHello                  | accept connection
            v                                   v
  +--------------------+              +--------------------+
  |      AWAITING      |              |      AWAITING      |
  |     SERVERHELLO    |              |     CLIENTHELLO    |
  +--------------------+              +--------------------+
            |                                   |
            | recv ServerHello                  | recv ClientHello /
            |                                   | send ServerHello
            +----------------+------------------+
                             |
                             v
    +---------------------------------------------------+
    |                       SYNCED                      |--+
    |                                                   |<-+
    +---------------------------------------------------+
       |                  ^                ^     recv ConnectionUpdate /
       |                  |                |     send EpochKeyUpdate
       | send             | recv           | recv
       | Connection-      | EpochKeyUpdate | ConnectionUpdate
       | Update           | / apply        | (as responder) /
       |                  | pending commit | drop pending commit,
       |                  |                | apply commit,
       |                  |                | send EpochKeyUpdate
       v                  |                |
    +---------------------------------------------------+
    |               AWAITING EPOCHKEYUPDATE             |--+
    |                                                   |<-+
    +---------------------------------------------------+
                                                recv ConnectionUpdate
                                                (as initiator) / ignore
]]></artwork>
        </artset>
      </figure>
      <t>The transitions that abandon an interrupted initial key agreement and return
to START are omitted from <xref target="fig-establishment"/>.</t>
      <t><xref target="fig-resumption"/> shows the resumption phase (<xref target="resumption"/>). The Synced and
Awaiting EpochKeyUpdate states are the same states as in
<xref target="fig-establishment"/>, and the transitions shown there remain available. The
transition labels are listed below the diagram.</t>
      <figure anchor="fig-resumption">
        <name>Resumption</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="416" width="488" viewBox="0 0 488 416" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,48 L 8,384" fill="none" stroke="black"/>
              <path d="M 56,32 L 56,64" fill="none" stroke="black"/>
              <path d="M 56,128 L 56,192" fill="none" stroke="black"/>
              <path d="M 56,256 L 56,320" fill="none" stroke="black"/>
              <path d="M 80,72 L 80,120" fill="none" stroke="black"/>
              <path d="M 80,200 L 80,248" fill="none" stroke="black"/>
              <path d="M 80,328 L 80,384" fill="none" stroke="black"/>
              <path d="M 248,200 L 248,248" fill="none" stroke="black"/>
              <path d="M 368,32 L 368,64" fill="none" stroke="black"/>
              <path d="M 368,128 L 368,192" fill="none" stroke="black"/>
              <path d="M 368,256 L 368,320" fill="none" stroke="black"/>
              <path d="M 392,144 L 392,176" fill="none" stroke="black"/>
              <path d="M 392,288 L 392,304" fill="none" stroke="black"/>
              <path d="M 448,48 L 448,272" fill="none" stroke="black"/>
              <path d="M 56,32 L 368,32" fill="none" stroke="black"/>
              <path d="M 8,48 L 48,48" fill="none" stroke="black"/>
              <path d="M 376,48 L 448,48" fill="none" stroke="black"/>
              <path d="M 56,64 L 368,64" fill="none" stroke="black"/>
              <path d="M 56,128 L 368,128" fill="none" stroke="black"/>
              <path d="M 376,144 L 392,144" fill="none" stroke="black"/>
              <path d="M 376,176 L 392,176" fill="none" stroke="black"/>
              <path d="M 56,192 L 368,192" fill="none" stroke="black"/>
              <path d="M 56,256 L 368,256" fill="none" stroke="black"/>
              <path d="M 376,272 L 448,272" fill="none" stroke="black"/>
              <path d="M 376,288 L 392,288" fill="none" stroke="black"/>
              <path d="M 376,304 L 392,304" fill="none" stroke="black"/>
              <path d="M 56,320 L 368,320" fill="none" stroke="black"/>
              <path d="M 8,384 L 80,384" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="384,304 372,298.4 372,309.6" fill="black" transform="rotate(180,376,304)"/>
              <polygon class="arrowhead" points="384,272 372,266.4 372,277.6" fill="black" transform="rotate(180,376,272)"/>
              <polygon class="arrowhead" points="384,176 372,170.4 372,181.6" fill="black" transform="rotate(180,376,176)"/>
              <polygon class="arrowhead" points="256,200 244,194.4 244,205.6" fill="black" transform="rotate(270,248,200)"/>
              <polygon class="arrowhead" points="88,248 76,242.4 76,253.6" fill="black" transform="rotate(90,80,248)"/>
              <polygon class="arrowhead" points="88,120 76,114.4 76,125.6" fill="black" transform="rotate(90,80,120)"/>
              <polygon class="arrowhead" points="56,48 44,42.4 44,53.6" fill="black" transform="rotate(0,48,48)"/>
              <g class="text">
                <text x="212" y="52">SYNCED</text>
                <text x="104" y="100">(1)</text>
                <text x="156" y="164">AWAITING</text>
                <text x="252" y="164">EPOCHKEYUPDATE</text>
                <text x="416" y="164">(1)</text>
                <text x="472" y="164">(2)</text>
                <text x="104" y="228">(2)</text>
                <text x="272" y="228">(3)</text>
                <text x="140" y="292">AWAITING</text>
                <text x="252" y="292">RESUMPTIONRESPONSE</text>
                <text x="420" y="308">(4),</text>
                <text x="456" y="308">(6)</text>
                <text x="104" y="356">(5)</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
        +--------------------------------------+
  +---->|                SYNCED                |---------+
  |     +--------------------------------------+         |
  |        |                                             |
  |        | (1)                                         |
  |        v                                             |
  |     +--------------------------------------+         |
  |     |                                      |--+      |
  |     |        AWAITING EPOCHKEYUPDATE       |  | (1)  | (2)
  |     |                                      |<-+      |
  |     +--------------------------------------+         |
  |        |                    ^                        |
  |        | (2)                | (3)                    |
  |        v                    |                        |
  |     +--------------------------------------+         |
  |     |                                      |<--------+
  |     |      AWAITING RESUMPTIONRESPONSE     |--+
  |     |                                      |<-+ (4), (6)
  |     +--------------------------------------+
  |        |
  |        | (5)
  |        |
  +--------+
]]></artwork>
        </artset>
      </figure>
      <dl>
        <dt>(1)</dt>
        <dd>
          <t>recv ResumptionRequest / process the commit as described in <xref target="resumption"/>,
send ResumptionResponse</t>
        </dd>
        <dt>(2)</dt>
        <dd>
          <t>connection interrupted / send ResumptionRequest containing the pending
commit, or a fresh commit if there is none</t>
        </dd>
        <dt>(3)</dt>
        <dd>
          <t>recv ResumptionRequest / process the commit as described in <xref target="resumption"/>,
send ResumptionResponse</t>
        </dd>
        <dt>(4)</dt>
        <dd>
          <t>recv conflicting ResumptionRequest (as initial initiator) / ignore</t>
        </dd>
        <dt>(5)</dt>
        <dd>
          <t>recv ResumptionResponse / apply pending commit, apply commit in the
ResumptionResponse, send EpochKeyUpdate</t>
        </dd>
        <dt>(6)</dt>
        <dd>
          <t>connection interrupted / retransmit ResumptionRequest containing the pending
commit</t>
        </dd>
      </dl>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="R." surname="Housley" fullname="Russ Housley">
        <organization>Vigil Security</organization>
        <address>
          <email>housley@vigilsec.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
