<?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-two-party-profile-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="2PMLS">A two-party profile for MLS</title>
    <seriesInfo name="Internet-Draft" value="draft-kohbrok-mls-two-party-profile-00"/>
    <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="February" day="03"/>
    <area>Security</area>
    <workgroup>Messaging Layer Security</workgroup>
    <keyword>handshake</keyword>
    <keyword>key exchange</keyword>
    <abstract>
      <?line 48?>

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

<section anchor="introduction">
      <name>Introduction</name>
      <t>MLS 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. 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. 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="protocol-overview">
      <name>Protocol overview</name>
      <t>The synchronous case assumes that both parties are online. 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>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 to validate both initial credentials
and any credential updates.</t>
    </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.</t>
      <t>The responder inspects the KeyPackage and checks whether it supports the offered
ciphersuite and whether the initiator has sufficient capabilities to support the
connection.</t>
      <t>The responder MUST 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.</t>
      <t>The initiator uses the Welcome to create its local group state. The initiator
then inspects the group state and MUST interface with the AS to ensure that the
credential of the responder is valid.</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>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.</t>
      <ul spacing="normal">
        <li>
          <t>Each party may send a ConnectionUpdate if they are not currently waiting for
an EpochKeyUpdate to confirm a previous ConnectionUpdate</t>
        </li>
        <li>
          <t>If either party receives a ConnectionUpdate and they're not currently waiting
for an EpochKeyUpdate, they MUST validate and apply the commit and respond
with an EpochKeyUpdate, where <tt>epoch</tt> is the group's new epoch</t>
        </li>
        <li>
          <t>If the initiator receives a ConnectionUpdate while waiting for an
EpochKeyUpdate, it MUST ignore the ConnectionUpdate and resume waiting</t>
        </li>
        <li>
          <t>If the responder receives a ConnectionUpdate while waiting for an
EpochKeyUpdate, it MUST drop its locally pending commit and validate and apply
the commit as if it hadn't been waiting for an EpochKeyUpdate</t>
        </li>
        <li>
          <t>A party receiving a ConnectionUpdate MUST start using the key material of the
new epoch after sending the EpochKeyUpdate</t>
        </li>
        <li>
          <t>A party sending a ConnectionUpdate MUST wait until they receive the
corresponding EpochKeyUpdate before they start using the key material of the
new epoch</t>
        </li>
      </ul>
    </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.</t>
      <sourcecode type="tls"><![CDATA[
struct {
  MLSMessage commit;
} ResumptionRequest

struct {
  MLSMessage commit;
} ResumptionResponse
]]></sourcecode>
      <t>The initiator sends a Resumption message to the responder. If the initiator was
waiting for an EpochKeyUpdate while the connection was interrupted, it MUST
include the commit from the last ConnectionUpdate in the Resumption message. The
initiator MUST then wait for a ResumptionResponse.</t>
      <t>The responder receiving a ResumptionRequest MUST validate and apply the commit
in the ResumptionRequest and create a commit with UpdatPath to send back as part
of a ResumptionResponse.</t>
      <t>If one of the parties receives a ResumptionRequest while waiting for a
ResumptionResponse, their reaction depends whether they were the initial
initiator or responder when the connection was first established. The initial
initiator MUST drop the ResumptionRequest and continue waiting. The initial
responder MUST drop its pending commit and instead validate and apply the
incoming commit before responding with a fresh commit as part of a
ResumptionResponse.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <?line 205?>

<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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
GgAA

-->

</rfc>
