<?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-mimi-portability-04" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="MIMI">MIMI Portability</title>
    <seriesInfo name="Internet-Draft" value="draft-kohbrok-mimi-portability-04"/>
    <author initials="K." surname="Kohbrok" fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad.kohbrok@datashrine.de</email>
      </address>
    </author>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="07"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 24?>

<t>This document describes MIMI Portability mechanisms.</t>
    </abstract>
  </front>
  <middle>
    <?line 28?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>draft-robert-mimi-delivery-service and others describe a transport and delivery
mechanism for messages in a federated environment that relies on the concept of
a fixed Delivery Service that is in charge of orchestrating the communication
for a given MLS group. All clients of a given MLS group agree on what Delivery
Service to use and rely on it to solve the problem of Commit message ordering.</t>
      <t>While having a fixed Delivery Service solves a class of synchronization
problems, it can sometimes be a limiting factor, especially because it
introduces reliance on a specific operator. There are legitimate scenarios where
the operator of a Delivery Service no longer wants to operate it, or where the
users of a group want to switch to a different Delivery Service.</t>
      <t>This document describes mechanisms that allow users to switch an MLS group to a
different Delivery Service.</t>
      <section anchor="change-log">
        <name>Change Log</name>
        <t>draft-01</t>
        <ul spacing="normal">
          <li>
            <t>Version bump to prevent expiration</t>
          </li>
        </ul>
        <t>draft-02</t>
        <ul spacing="normal">
          <li>
            <t>Version bump to prevent expiration</t>
          </li>
        </ul>
        <t>draft-03</t>
        <ul spacing="normal">
          <li>
            <t>Version bump to prevent expiration</t>
          </li>
        </ul>
        <t>draft-04</t>
        <ul spacing="normal">
          <li>
            <t>Version bump to prevent expiration</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="architecture">
      <name>Architecture</name>
      <t>We consider two distinct Delivery Services, the <em>Source Delivery Service</em> and
the <em>Target Delivery Service</em>. The Source Delivery Service is where the MLS
group currently resides, and the Target Delivery Service is where the MLS group
should be moved to. The Source Delivery Service and the Target Delivery Service
have distinct domain names.</t>
      <t>The Source Delivery Service is responsible for exporting the MLS group state and
sending it to the Target Delivery Service. The Target Delivery Service is
responsible for importing the MLS group state and making it available to the
members of the MLS group.</t>
      <t>Once the MLS group state has been imported into the Target Delivery Service, the
Source Delivery Service no longer has any responsibility for the MLS group. The
Source Delivery Service can delete the MLS group state and all associated
metadata.</t>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="672" viewBox="0 0 672 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,48 L 8,320" fill="none" stroke="black"/>
            <path d="M 216,48 L 216,72" fill="none" stroke="black"/>
            <path d="M 216,88 L 216,120" fill="none" stroke="black"/>
            <path d="M 216,136 L 216,320" fill="none" stroke="black"/>
            <path d="M 488,48 L 488,320" fill="none" stroke="black"/>
            <path d="M 8,80 L 480,80" fill="none" stroke="black"/>
            <path d="M 16,128 L 488,128" fill="none" stroke="black"/>
            <path d="M 8,176 L 208,176" fill="none" stroke="black"/>
            <path d="M 216,224 L 480,224" fill="none" stroke="black"/>
            <path d="M 224,272 L 488,272" fill="none" stroke="black"/>
            <path d="M 16,320 L 216,320" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="488,224 476,218.4 476,229.6" fill="black" transform="rotate(0,480,224)"/>
            <polygon class="arrowhead" points="488,80 476,74.4 476,85.6" fill="black" transform="rotate(0,480,80)"/>
            <polygon class="arrowhead" points="232,272 220,266.4 220,277.6" fill="black" transform="rotate(180,224,272)"/>
            <polygon class="arrowhead" points="216,176 204,170.4 204,181.6" fill="black" transform="rotate(0,208,176)"/>
            <polygon class="arrowhead" points="24,320 12,314.4 12,325.6" fill="black" transform="rotate(180,16,320)"/>
            <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
            <g class="text">
              <text x="28" y="36">Client</text>
              <text x="236" y="36">Source</text>
              <text x="300" y="36">Delivery</text>
              <text x="368" y="36">Service</text>
              <text x="508" y="36">Target</text>
              <text x="572" y="36">Delivery</text>
              <text x="640" y="36">Service</text>
              <text x="84" y="68">MigrationRequest</text>
              <text x="88" y="116">MigrationResponse</text>
              <text x="72" y="164">MigrationInit</text>
              <text x="292" y="212">MigrationContent</text>
              <text x="320" y="260">TargetMigrationComplete</text>
              <text x="104" y="308">MigrationConfirmation</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
Client                    Source Delivery Service           Target Delivery Service
|                         |                                 |
| MigrationRequest        |                                 |
+---------------------------------------------------------->|
|                         |                                 |
| MigrationResponse       |                                 |
|<----------------------------------------------------------+
|                         |                                 |
| MigrationInit           |                                 |
+------------------------>|                                 |
|                         |                                 |
|                         | MigrationContent                |
|                         +-------------------------------->|
|                         |                                 |
|                         | TargetMigrationComplete         |
|                         |<--------------------------------+
|                         |                                 |
| MigrationConfirmation   |                                 |
|<------------------------+                                 |
]]></artwork>
      </artset>
      <t>TODO: The MLS group ID is fixed for the lifetime of a group and cannot be
changed. This requires group IDs to be globally unique across all relevant
Delivery Services. Even though this could be solved using a UUID, groups should
also be tied to a specific owning delivery service.</t>
    </section>
    <section anchor="migration">
      <name>Migration</name>
      <t>TODO: Describe what keys are used for the signatures.</t>
      <t>TODO: Describe that the crypto primitives should be aligned with the ciphersuite
of the MLS group.</t>
      <section anchor="requesting-a-migration">
        <name>Requesting a migration</name>
        <t>The migration process is initiated by a client of the MLS group. The client
requests a MigrationResponse from the Target Delivery Service. The Target
Delivery Service returns a MigrationResponse that can be used by the Source
Delivery Service to transfer the MLS group state to the Target Delivery Service.</t>
        <t>The client sends the following MigrationRequest message to the Target Delivery
Service:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque source_domain_name<V>;
  opaque target_domain_name<V>;
  opaque group_id<V>;
  uint64 epoch;
} MigrationRequest;
]]></sourcecode>
        <t>The Target Delivery Service responds with a MigrationResponse message:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  MigrationRequest migration_request;
  uint8[32] nonce;
  opaque signature<V>;
} MigrationResponse;
]]></sourcecode>
      </section>
      <section anchor="initiating-a-migration">
        <name>Initiating a migration</name>
        <t>The client sends the following MigrationInit message to the Source
Delivery Service:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  MigrationResponse migration_response;
  opaque signature<V>;
} MigrationInit;

struct {
  opaque target_ds_domain<V>;
} MigrationCommitAAD
]]></sourcecode>
        <t>The client also sends a Commit message to the group, where the AAD consists of a
serialized MigrationCommitAAD struct.</t>
        <t>The Source Delivery Service sends a MigrationContent message to the Target
Delivery Service:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  MigrationResponse migration_response;
  opaque group_state<V>;
  opaque signature<V>;
} MigrationContent;
]]></sourcecode>
        <t>The Target Delivery Service responds with a TargetMigrationComplete message:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque migration_content_hash<V>;
  opaque signature<V>;
} TargetMigrationComplete;
]]></sourcecode>
        <t>The Source Delivery Service proceeds to fan out the client's Commit message that
includes the MigrationCommmitAAD to the group.</t>
        <t>Finally, the Source Delivery Service responds to the client with a
MigrationConfirmation message:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque domain_name<V>;
  uint8[32] nonce;
  opaque group_id<V>;
  opaque signature<V>;
} MigrationConfirmation;
]]></sourcecode>
        <t>The Source Delivery Service can now delete the MLS group state and all
associated metadata.</t>
        <t>Clients can now send messages to the group using the Target Delivery Service.</t>
      </section>
    </section>
    <section anchor="authorization">
      <name>Authorization</name>
      <t>In general, whether a client is allowed to migrate an MLS group from one
Delivery Service to another is a policy decision that is made by the operator of
the Source Delivery Service. The Source Delivery Service MUST NOT allow a client
to migrate an MLS group if the client is not authorized to do so.</t>
      <t>As a default policy, a Source Delivery Service SHOULD allow any client to
migrate an MLS group to another Delivery Service.</t>
      <t>Conversely, the Target Delivery Service MUST NOT allow a client to import an MLS
group if the client is not authorized to do so. The Target Delivery Service MUST
ensure that the client is authorized to import the MLS group before issuing a
MigrationResponse and importing the MLS group state through an MigrationContent
message.</t>
      <t>As a default policy, a Target Delivery Service SHOULD allow any client to
migrate an MLS group to it when the client is also allowed to create new groups
on the Target Delivery Service.</t>
      <t>TODO: The default policies suggested above may be a bit liberal. We might want
to restrict them s.t. only clients from the target DS can request migration to
that DS.</t>
    </section>
  </middle>
  <back>








  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7VZ3W4bNxa+51MQMNAFEkvwpkGxVYqghr2LNRKvC9tpLorC
oGYoDZEZUiU5ctRt8+z7ncMZzdijkZU0KyCAI/L8/32HmkwmIppY6pm8vLi8
kD85H9XclCZuhJrPvV6nA5G7zKoK13KvFnHywRVz7z5MKlOZyaojmpy8FJmK
eun8ZiaNXTghzMrPZPR1iC9OTr4/eSGU12omb3RWe5LzQW/unc9n8sJG7a2O
k3OSIUSIyuZ3qnQWcjc6iJWZyV+iy45lgEivFwF/bSr641chVB0L52dCTiQk
h5l8M5Vvkp5C4pP0f+OsV/mDA+eXyprfVTTOzuRPhdPWfJTX35zzqa6UKWfy
A9NNG8N/zFVUofDG6mmuO5HXU3nt5trHnsRrtSqULvsHB0k0Oi5+9InYM+00
c5UQk8lEqnmIXmVw0m1hgkR06krbKHMdMm/mOgzCKSudFRAaqjBNPCqT56UW
4ogc711eZ6SOECnCSWIKcK5Ls9Z+Mwnar02mJeIiXSy0D1uJUiHGygZKBj5v
icRWsFw4DzVCUEsoaCxIFjrXHvmSS23XxjvLVsRCRelBj2vO4r9aZs5mehWl
WwhQmY+gOG8EIJOSVkxmmDMk+qXGbbg6KzQ5Kxq7bFhVVW1Nxt4XpJOSS3Cy
8vLtjVx6V6+m8rQsZQYFbAzEZXBDqqXXmrS7J6mtLmKri5N1SI6CIRu6aCJ9
G1y51qzHCi4udUXsz6ASjhvfQGd4BeoiUO8LU2pZqDVpP2o5Mw04z0oVWOGw
sVkBfzZJJhphKBjIyZQFSaWjgUTJsSsRZ/bQAlnl/LHUYaUzo0roPteZImNM
FKbJFJBRfBSCQqYpybcXJpNuRQF1fipvkR9gjX+lXoJ5hTjLkGmrvHEBfsOx
IEe0JMnRA+Osk2gBS+3lvaJwwImJgjQ6hrMSK/KpgJq+DRiHiUjY7fcmZgX9
pWRuFgsQ2DiQNR2vp658Up7BM+5eJnkdf9VPERIm9go7OpJn4IqQv3XLtvJO
/o76lD+DMQIn53XFnFboxcRFf1wZr/qVio76efe//cz7Lw+9fyRPUW0m6izW
iK14z3UbDLJZxnsHxwfkWDZ0BdKSEuHZjas9Iv74+BnVEafKs1uq6yGDZ5xu
coSemsI2RyhAIgUIA4gigxT3mrSEGlSwdGlEzoBTCrUIhavLnEqpcmtUaHT7
FXpCjEDB685ducNEsDxOAqfoXkthy4q8jnrnjosIoSe33a9LT4zXyJqIoG1O
56lD7dErGTXuG/FYtqmekC0r9aERrdYYe4ookxIYHNW8KecH1HDBlc30TpaF
ooaGTp0kIxRoWXtt4tQTY/7smg9xVnbTuTeNVbLyoXbko1F+1HoxGXXcrT55
BJ1Foos7dF/oDy9ERWgDVn/69EmpsF6KM55McsdnTG73GUu5P3ax48/4yfYG
qC/NMvWBa/1bjYn7OdTPJ1/8ef3H19ScQ9t66yDqH75c9edfT/MLa/rp8Jd8
/vow2X9N83HqrU1nDvvAMMv3UT+ZR18hW8apU2X19K9WXOgHUT+ZR18xW+DZ
hfEV/30o9ah+zw+gRuPC2Lo6v5rxAOm63sU5TayEattOWpoFI9M+jKO+iNZp
XUR3Fxljppw6Lc+732qDrrxlyYAMo3hZujkDWKB9tCSpMu+Ajqm/ArzqNaCh
GCCRqfwnAX2skvUSeJEEZO1sZ5idA/QlMP7u3cX5cZIaZEIAQpWBZUfDKOAB
Mr63RNfuRTJ0MLALTeum83at4vUCK3JgJA282TkqmKVVhLQYFDwkY4zK247f
rBiuMcCnLaHDKqoEBzAEdi3SZbOipa4GhBM7pi7gatPckwOqnta4uv0vrTZw
ZUjLGMTyhjff8ILCk2vAnPMiHQqfZNA+M2zNC++qQyHKILqIO/xld3Nml9F8
njd+hsJxC7WGvAhW0Ma70H7nLH8CSiWfNf4gBBb4+sLRYkH+HQzUdj3czbhd
PWeME2IZBLZe7PTyv0JiYVJUAYFNuUt48o7w5A8/v37VnUdmOX7O5t2ZvPm2
Brb67qXUK5cVr8SfA41fNYW/BzMmNAXbOQd3haWxeqdZQxe1X9z5VoWk5j9+
+fbFr0BzwI09e7YVxAb9OZTeWHBEbyScxzsT/5Ag8oR+FMGRzHrK1NYxPVtb
bZ+2jPR4JXbkRhv70IT/MWF6ozg9Pe+C2tjNPS8Zrx4/ZTSWcuIc91Yn8Em7
YWgeWLCEeIOG9DsKbyhTJn2fWH5aHQYQYmfl/F/8niqEG8DD0hkNSKPjF9TK
GN7YVzGNNp0NWRJ/h/Wm2K/xiLie4mNx4XGgc57LCzRYVzezifPnb2GQNOjE
AptvWWMnT721nxFNSvRTC4nxL2Np2B/3KmuPCxviJoOTQ8VugHSAO4cNc7zn
POqhB6THVpUDXE3zy7r7A3ZM0e2YsrdjnjWPni0jqqnu0bbv8wYH7Z9xR/KU
n+Xbd0hxYeVSW+1Vye2AHpE7WGBCeldL2CklqX74qMbz39nd81hZfpVmPnLl
SpNt4InM8MtV+zxcqVy3s7339Cj25M3+x5zLdze38j9Xt82bYGuNGDPBLPq5
B40I1qrGTcn0nB6K4b5TMiTXC1WXsTHoGN+MaXLz76t3b89bPeymlRGd2KlJ
z2U7YofUwzdBt0U11pdG7Cfu6RWmESo+0/y9j00kVGgbat8Hu10aPeDXqPGw
GuYaQJperYB3aaqLYaunUtn/hBULz4sCWfioo4umasbDOGbbF4QR3RPVZB97
gSZzr6Iyr4nY6vtmbRHNzyt7QOp2a3ugP/00E+olegL1DzV3awwVtUk/Jsyh
TYktBEU+le952hSRn+KpJjz9HGMyDkclwzROUc/lZvtzyxbhx0apG25G/jHE
I3dw5M9vpuJ/wZFs/8kcAAA=

-->

</rfc>
