<?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.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kohbrok-mls-dmls-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="DMLS">Decentralized Messaging Layer Security</title>
    <seriesInfo name="Internet-Draft" value="draft-kohbrok-mls-dmls-01"/>
    <author fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad.kohbrok@datashrine.de</email>
      </address>
    </author>
    <date year="2025" month="June" day="30"/>
    <area/>
    <workgroup>Messaging Layer Security</workgroup>
    <keyword>security</keyword>
    <keyword>authenticated key exchange</keyword>
    <keyword>end-to-end encryption</keyword>
    <abstract>
      <?line 47?>

<t>Messaging Layer Security (MLS) provides strong end-to-end security guarantees
for group messaging including Forward Secrecy (FS) and Post-Compromise Security
(PCS). MLS requires a Delivery Service (DS) component to facilitate agreement
between group members on the order of Commit messages. In decentralized settings
without an authoritative entity to enforce ordering, group members will likely
have to retain key material so they can process commits out-of-order.</t>
      <t>Retaining key material, however, significantly reduces the FS of the protocol.
This draft specifies Decentralized MLS (DMLS), based on the the Fork-Resilient
Continuous Group Key Agreement protocol FREEK proposed by Alwen et al.
<xref target="FRCGKA"/>. In essence, DMLS extends MLS such that key material can be retained
to process Commits out-of-order with recuded impact to FS, thus allowing safer
deployment in decentralized environments.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://phnx-im.github.io/dmls-spec/draft-kohbrok-mls-dmls.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-kohbrok-mls-dmls/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Messaging Layer Security  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/phnx-im/dmls-spec"/>.</t>
    </note>
  </front>
  <middle>
    <?line 63?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>...</t>
      <t>DMLS allows group members to keep around old group state a little more safely,
because the init secret of old epoch states is punctured. However, keeping an
old epoch state around is still not as safe as deleting it in the first place.
See <xref target="security-considerations"/> for more details.</t>
      <t>While DMLS is thus safer to use in scenarios where members must be able to
process old commits, it is still not as safe as the use of vanilla MLS with its
strict deletion schedule.</t>
      <t>Even when using DMLS, applications should take care that group state forks are
short-lived and group members (and/or assisting servers) endeavour to resolve
forks as soon as possible.</t>
      <t>In contrast scenarios should be avoided where multiple forks are long-lived. For
example, if two or more parts of a group are not in contact with one-another and
effectively run their own fork of the same group.</t>
    </section>
    <section anchor="epoch-identifiers">
      <name>Epoch identifiers</name>
      <t>In MLS, each epoch is identified by a 64 bit unsigned integer, with the epoch
increasing by one with each commit. The integer identifies epochs uniquely as
long as there is only one chain of Commits. However, in a decentralized context
there can be multiple commits for the same epoch, which means that an integer is
not sufficient to uniquely identify an epoch. For example, if two group member
send a commit at the same time with different subsets of group members receiving
a different commit first. After processing the newly arrived Commit, all group
members would be in the same epoch, but in different group states. For
subsequently arriving messages, it is unclear from the integer designating the
epoch, which state the message belongs to. In such scenarios it is important
that epochs are uniquely identifiable.</t>
      <t>The <tt>dmls_epoch</tt> can be used for this purpose.</t>
      <t><tt>pseudocode
dmls_epoch = DeriveSecret(epoch_secret, "epoch")
</tt></t>
      <t>A dmls_epoch is represented by byte strings of length <tt>KDF.Nh</tt> (thus depending
on the group's ciphersuite). The byte string identifying an epoch is derived
from the epoch's <tt>epoch_secret</tt>.</t>
    </section>
    <section anchor="dmls-messages">
      <name>DMLS Messages</name>
      <t>As regular MLSMessages only contain integer-based epoch identifiers, this
section introduces DMLSMessages, a simple wrapper that adds a dmls_epoch header
to an MLSMessage.</t>
      <sourcecode type="tls"><![CDATA[
struct {
  MLSMessage message;
  opaque dmls_epoch<V>;
} DMLSMessage
]]></sourcecode>
    </section>
    <section anchor="dmls-key-schedule">
      <name>DMLS key schedule</name>
      <t>DMLS uses a modified version of the MLS key schedule that allows the derivation
of multiple <tt>init_secret</tt>s, where each init secret can be used to initialize a
subsequent epoch.</t>
      <t>The individual <tt>init_secret</tt>s are derived through a puncturable pseudorandom
function (PPRF, see <xref target="puncturable-pseudorandom-function"/>) keyed by the
<tt>base_init_secret</tt>.</t>
      <figure>
        <name>The DMLS Key Schedule</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="384" width="400" viewBox="0 0 400 384" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 152,88 L 152,176" fill="none" stroke="black"/>
              <path d="M 152,248 L 152,272" fill="none" stroke="black"/>
              <path d="M 152,304 L 152,336" fill="none" stroke="black"/>
              <path d="M 152,128 L 176,128" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="184,128 172,122.4 172,133.6" fill="black" transform="rotate(0,176,128)"/>
              <polygon class="arrowhead" points="160,336 148,330.4 148,341.6" fill="black" transform="rotate(90,152,336)"/>
              <polygon class="arrowhead" points="160,272 148,266.4 148,277.6" fill="black" transform="rotate(90,152,272)"/>
              <polygon class="arrowhead" points="160,176 148,170.4 148,181.6" fill="black" transform="rotate(90,152,176)"/>
              <g class="text">
                <text x="28" y="36">(above</text>
                <text x="72" y="36">the</text>
                <text x="108" y="36">same</text>
                <text x="140" y="36">as</text>
                <text x="168" y="36">the</text>
                <text x="200" y="36">MLS</text>
                <text x="232" y="36">key</text>
                <text x="288" y="36">schedule)</text>
                <text x="152" y="52">|</text>
                <text x="156" y="84">epoch_secret</text>
                <text x="248" y="132">DeriveSecret(.,</text>
                <text x="348" y="132">&lt;label&gt;)</text>
                <text x="192" y="148">=</text>
                <text x="236" y="148">&lt;secret&gt;</text>
                <text x="160" y="196">DeriveSecret(.,</text>
                <text x="284" y="196">"parent_init")</text>
                <text x="152" y="212">|</text>
                <text x="164" y="244">parent_init_secret</text>
                <text x="156" y="292">DeriveChildSecret(.,</text>
                <text x="296" y="292">"child_init",</text>
                <text x="316" y="308">commit_confirmation,</text>
                <text x="304" y="324">GroupContext_[n])</text>
                <text x="160" y="356">init_secret_[n]</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
        (above the same as the MLS key schedule)
                          |
                          V
                     epoch_secret
                          |
                          |
                          +--> DeriveSecret(., <label>)
                          |    = <secret>
                          |
                          V
                    DeriveSecret(., "parent_init")
                          |
                          V
                   parent_init_secret
                          |
                          V
                 DeriveChildSecret(., "child_init",
                          |          commit_confirmation,
                          |          GroupContext_[n])
                          V
                    init_secret_[n]
]]></artwork>
        </artset>
      </figure>
      <sourcecode type="pseudocode"><![CDATA[
commit_confirmation = DeriveSecret(path_secret[n], "conf")

DeriveChildSecret(prf_key, label, input_secret, context) =
  DeriveFSSecret(prf_key, ExpandWithLabel(input_secret, label, context, KDF.Nh))
]]></sourcecode>
    </section>
    <section anchor="puncturable-pseudorandom-function">
      <name>Puncturable pseudorandom function</name>
      <t>A PPRF allows the derivation of keys in a forward secure way. In particular, a
PRF that was evaluated with a given key and input can't be evaluated with those
same parameters again. Storing the original input key thus doesn't harm the
forward secrecy of (deleted) output keys.</t>
      <t>The MLS Secret Tree as defined in <xref target="RFC9420"/> already represents a PPRF an
needs to be modified only slightly for the purpose of this document.</t>
      <t>In the context of MLS, the Secret Tree has as many leaves as the group has
members. To derive child init secrets, the same tree is used but with <tt>KDF.Nh</tt>
leaves.</t>
      <t>The function <tt>DeriveFSSecret(secret, input)</tt> thus follows these steps:</t>
      <ul spacing="normal">
        <li>
          <t>Check if <tt>secret</tt> and <tt>input</tt> are of length <tt>KDF.Nh</tt></t>
        </li>
        <li>
          <t>With <tt>secret</tt> as the root node secret and <tt>input</tt> as the leaf index, derive
the direct path nodes and the copath nodes as defined in Section 9 of
<xref target="RFC9420"/></t>
        </li>
        <li>
          <t>With <tt>leaf_node_secret</tt> as the resulting secret compute the final output using
<tt>DeriveSecret(leaf_node_secret, "pprf")</tt></t>
        </li>
      </ul>
    </section>
    <section anchor="state-management">
      <name>State management</name>
      <t>As outlined in <xref target="security-considerations"/> DMLS makes it safer to retain old MLS
group states. As such, it enables an <em>eventually consistent</em> delivery service as
described in Section 5.2.2. of <xref target="RFC9750"/>, i.e. one that tolerates out-of-order
delivery of messages. This in turn allows the use of DMLS in applications with
highly decentralized architectures.</t>
      <t>The lack of a strong agreement on message order, however, leads to the various
state-agreement problems inherent to distributed systems and independent of
(D)MLS.</t>
      <t>More concretely, applications need to specify the following.</t>
      <ul spacing="normal">
        <li>
          <t>What fork should a client choose when sending a message?</t>
        </li>
        <li>
          <t>When can an old epoch state be safely deleted?</t>
        </li>
        <li>
          <t>When can a fork be safely consolidated and deleted?</t>
        </li>
        <li>
          <t>How should two forks be consolidated?</t>
        </li>
      </ul>
      <t>The answers to these questions depend on the application's specific architecture
and other requirements and are thus outside of the scope of this document.</t>
      <t>The remainder of this section shows an example of how these questions can be
answered in a decentralized scenario.</t>
      <section anchor="example-federated-scenario-with-server-support">
        <name>Example: Federated scenario with server support</name>
        <t>The architecture of the first application consists of a federation of servers,
where each server serves one or more clients.</t>
        <t>The servers can queue messages for their clients and determine the order of
handshake messages for the groups their clients are in.</t>
        <t>In this system, forks can only occur if a subset of servers lose connectivity
from the rest.</t>
        <section anchor="server-behaviour">
          <name>Server behaviour</name>
          <t>The exact nature of the algorithm used by the servers to agree on a commit for
the next epoch is out of scope for this example. However, the requirement of
such an algorithm are:</t>
          <ul spacing="normal">
            <li>
              <t>Agreement: If one or more commits reach one or more servers at the same time
the algorithm should facilitate agreement between the servers that can
currently reach one-another.</t>
            </li>
            <li>
              <t>Netsplit detection: Servers should be able to detect if the federation of
servers has split. If connections between individual servers fail, other
servers can act as forwarding proxies between the disconnected servers.</t>
            </li>
          </ul>
          <t>If a netsplit is detected, servers will fack back on agreement within their
subgroup of servers. Agreed-upon commits and other group messages are buffered
for later fan-out to the rest of the federation.</t>
          <t>If a netsplit ends, all messages buffered during the netsplit are delivered to
their respective destinations.</t>
          <t>If a fork has occurred during the netsplit, the fork with the lexicographically
higher confirmation tag in the first differing commit wins and the servers
restart their agreement algorithm with respect to that fork.</t>
          <t>If there was another netsplit during a netsplit, the same rules apply.</t>
          <t>When fanning out group messages to their clients, servers include a flag to
indicate whether the old commit state should be retained due to an ongoing
netsplit.</t>
        </section>
        <section anchor="client-behaviour">
          <name>Client behaviour</name>
          <t>Clients generally only have one fork of a given group. If they send a message,
that's the fork they choose.</t>
          <t>Epoch states are generally deleted immediately after processing the next commit,
except when the server indicates that the epoch state should be retained.</t>
          <t>When a client receives a commit for an old epoch (i.e. if a fork occurs), it
retains the fork where the first differing commit has the lexicographically
higher confirmation tag.</t>
          <t>To keep the scenario simple, losing forks are simply deleted.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The use of a PPRF to derive init secrets for new epochs significantly improves
forward secrecy in scenarios where clients need to be able to process multiple
commits for a given epoch.</t>
      <t>However, PPRF only improves forward secrecy for the init secret. Group members
must still delay the deletion of other secrets such as the (private) decryption
keys for the nodes in the ratchet tree. This delay in deletion compromises the
forward secrecy of the protocol. Conversely, the fact that other group members
might encrypt to those keys in turn weakens the protocol's post-compromise
security.</t>
      <t>It is thus still advisable to delete old epoch states as soon as the functional
requirements of the application allows it.</t>
      <t>A rule that will be safe for most applications, for example, is that an old
epoch state can be deleted once each group member has sent a commit on at least
one fork "upstream" of that epoch state. This signals that all group members
have agreed to continue using this particular fork of the group state.</t>
      <t>For effective forward secrecy and post-compromise security it is thus advisable
to choose a state management algorithm where members converge on a shared fork
rather than continuously using different forks of the same group.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </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="RFC9750">
          <front>
            <title>The Messaging Layer Security (MLS) Architecture</title>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="S. Inguva" initials="S." surname="Inguva"/>
            <author fullname="A. Duric" initials="A." surname="Duric"/>
            <date month="April" year="2025"/>
            <abstract>
              <t>The Messaging Layer Security (MLS) protocol (RFC 9420) provides a group key agreement protocol for messaging applications. MLS is designed to protect against eavesdropping, tampering, and message forgery, and to provide forward secrecy (FS) and post-compromise security (PCS).</t>
              <t>This document describes the architecture for using MLS in a general secure group messaging infrastructure and defines the security goals for MLS. It provides guidance on building a group messaging system and discusses security and privacy trade-offs offered by multiple security mechanisms that are part of the MLS protocol (e.g., frequency of public encryption key rotation). The document also provides guidance for parts of the infrastructure that are not standardized by MLS and are instead left to the application.</t>
              <t>While the recommendations of this document are not mandatory to follow in order to interoperate at the protocol level, they affect the overall security guarantees that are achieved by a messaging application. This is especially true in the case of active adversaries that are able to compromise clients, the Delivery Service (DS), or the Authentication Service (AS).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9750"/>
          <seriesInfo name="DOI" value="10.17487/RFC9750"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="FRCGKA" target="https://eprint.iacr.org/2023/394.pdf">
          <front>
            <title>Fork-Resilient Continuous Group Key Agreement</title>
            <author initials="J." surname="Alwen" fullname="Joël Alwen">
              <organization/>
            </author>
            <author initials="M." surname="Mularczyk" fullname="Marta Mularczyk">
              <organization/>
            </author>
            <author initials="Y." surname="Tselekounis" fullname="Yiannis Tselekounis">
              <organization/>
            </author>
            <date year="2024" month="February" day="22"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 298?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA61a7XIbyXX930/R4VZlyQoAbrTrpJZerU1Toq1otVaJKm+l
UimxMdMAujiYgadnCGJl7Qv5MfJiOefe7sEAomRXYqmKBDHdt+/nuR890+nU
dKGr/IU9eeYLX3etq8LPvrSvfIxuGeql/cHtfGtvfNG3odudGDeft/6eG179
cHNiCtf5ZdPuLmyoF40xZVPUbg2CZesW3fSuWc3b5m66ruK05I+v/tXEfr4O
MYam7nYbrHzx/O21tV9YV8UGdENd+o3Hj7o7mdgTX4auaYOr+MeLy9/hV9Pi
05u31yem7tdz316YElxcmKKpo69jHy9s1/begMuvjWu9A9UTs23au2Xb9Bv8
9Wnx7vwOC8sLY6c2pm/52fXdChwFyltarLL+oVi5eun5FOxOu2aKX/hYtLtN
B+nMva97sGXt3z7WWtXFCT+uXajwEer6bfDdYta0S37t2mKFr1ddt4kX5+dc
xa/CvZ/lZef84hwa30Z/jv3n3LcM3aqfY+dmVT9Mw/pcDBE3vuDTCgLFbkQ3
rZrptllo9uvPHzfqbNWtqxNjqKOmpepA19pFX1XqCy+bunUlfsk+eQhmXR1+
dlTUhX29anwdHuybf34mT72q4E72zdJ5v4WVXVy1ofaz0htTN+0a+++hYkPn
G/6y9vrN1e9fXl4Irc61Sw8Bs3x+AwrdLLiiFZU9+erJ1+dff/vNbFMudEOK
iGs4zPSNj6EKsLy9gr+Gum/6aH9Pe9qXcILLZev9mq4qW8UPLSh+M/3qyfTJ
E/lyUIv8m1rVyX80//PXyl5WW18fPXnl2s7ZVz2t+/Pu7ujpfwZX1yHat9FX
/q7p8dmY2WxmjJlO4afziCAuOmM+5Wz2FIF7Zjdtcx9KHy3WN1g0cuHs93bZ
u9bVnffRQL3qxnY90A11UfUlP0FVW9eWPKP1BY64xgkOpF43sZteNWuchpj3
AxPm9PXVzdnMghXb+j/3oQUnzj7zFSzY7rCuvQ+Ft6fPQKjA/qamDbrGLlwB
g3RQtHVZ+Wbuu6339cAhUSHaprYIWrhaCfGbBSy4XocuCeDjzL6obXkAe9F3
sPEymi2cv+k7yJDMxxPBmiUGQDNgxNPlikQemyZHp29DVdkq3PlqZ1YOW7Gn
9Z0LtcAHnNUT1mxsyOXOFjgLairAHSUGp5Cg76bNYipHwMJvZDsVPqYwsatm
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
AAA=

-->

</rfc>
