<?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.7 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-barnes-mimi-arch-03" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title abbrev="MIMI Architecture">An Architecture for More Instant Messaging Interoperability (MIMI)</title>
    <seriesInfo name="Internet-Draft" value="draft-barnes-mimi-arch-03"/>
    <author fullname="Richard L. Barnes">
      <organization>Cisco</organization>
      <address>
        <email>rlb@ipv.sx</email>
      </address>
    </author>
    <date year="2024" month="March" day="04"/>
    <area>Applications and Real-Time</area>
    <workgroup>More Instant Messaging Interoperability</workgroup>
    <keyword>messaging</keyword>
    <keyword>end-to-end security</keyword>
    <abstract>
      <?line 35?>

<t>The More Instant Messaging Interoperability (MIMI) working group is defining a
suite of protocols that allow messaging providers to interoperate with one
another.  This document lays out an overall architecture enumerating the MIMI
protocols and how they work together to enable an overall messaging experience.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-barnes-mimi-arch/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        More Instant Messaging Interoperability Working Group mailing list (<eref target="mailto:mimi@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/mimi/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/mimi/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/bifurcation/mimi-arch"/>.</t>
    </note>
  </front>
  <middle>
    <?line 42?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Today, there are many providers of messaging functionality.  A provider
typically provides the client software (e.g., a mobile app) and the servers that
facilitate communications among clients.  The core function of MIMI is enabling
users to have messaging interactions across message providers.</t>
      <t>This overall goal breaks down into several sub-goals:</t>
      <ul spacing="normal">
        <li>
          <t>Message formats that enable the user-level features of a messaging system</t>
        </li>
        <li>
          <t>Tracking of state across multiple providers</t>
        </li>
        <li>
          <t>End-to-end security of user messages</t>
        </li>
        <li>
          <t>Transport of protocol messages among providers</t>
        </li>
      </ul>
      <t>In this document, we describe the high-level functions of these protocols, and
how they work toegether to enable an overall messaging application.</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>The following terms are used by this document and the MIMI working group for a
shared understanding of the overall system:</t>
      <t><em>Messaging Provider</em> or <em>Provider</em>: A service offering instant messaging to
users. Each provider has a logical server to route events between users (or
clients, more specifically).</t>
      <t><em>User</em>: A (normally) human operator of a client. Users have a distinct <em>User ID</em>
to canonically identify them.</t>
      <t><em>Client</em>: A user interface for messaging, performing encryption as needed. Presents
chats to the user to interact with. Synonymous with <em>MLS Client</em>. Clients have
a <em>Client ID</em> to canonically represent them among the user's other clients. Clients
<bcp14>MAY</bcp14> also be called <em>Devices</em> to differentiate them from a named application.</t>
      <t><em>Server</em>: A logical location operated by a messaging provider which ensures
message and information delivery. A server may be realized by multiple physical
computers. Servers own users which belong to them. Servers are considered to be
"participating" in a room if they have at least one joined user participant.</t>
      <t><em>Hub</em>: The specific server in a room with operational responsibility for delivery
between all servers in the room. This includes messages and, where applicable,
information about the room or underlying cryptographic state.</t>
      <t><em>Follower</em>: All non-hub servers in a room. Followers are required to interact
with the hub server to send messages, and are responsible for "last mile" delivery
of a message to its local users.</t>
      <t><em>Room</em>: The virtual space where users communicate. This is semantically different
from an <em>MLS Group</em>: an MLS Group is responsible for handling client keys while
a room is simply the user-facing construct for communications. Rooms have a
cryptographic state component as well. MLS uses a Group to represent that state.
Rooms have a <em>Room ID</em> to canonically identify them. Rooms may additionally be
called <em>Chats</em>, <em>Conversations</em>, or <em>Channels</em>.</t>
      <t><em>State</em>: The room's user participation information, cryptographic state, and other
metadata as required, collectively.</t>
      <t><em>User Participation</em>: The set of users which can engage in conversation within a
given room, or could engage if they complete further actions. For example, users
may be "invited" to converse, and can accept (join) or reject (leave). Users are
not considered to have "membership". Instead, users are <em>participants</em> in the
room. A list of these users is called the <em>Participant List</em>.</t>
      <t><em>Client Membership</em>: The set of clients belonging to participating users within
a given room's cryptographic state. Clients are not considered to have
"participation". Instead, clients are <em>members</em> of the room. A list of these
clients is called the <em>Membership</em> for a room.</t>
      <t><em>Active Participant</em>: A participating user with at least one client member in the
room's cryptographic state.</t>
      <t><em>Inactive Participant</em>: A participating user with zero client members in the room's
cryptographic state. Users in this state may be unable to decrypt messages sent
while no clients are members.</t>
      <t><em>Add</em> (Operation): Places a client or user into a joined state, able to converse
with other clients/users also in the joined state. When adding a user, all of
their clients are implicitly added as well.</t>
      <t><em>Remove</em> (Operation): Kicks a client or user from a room, preventing further
conversation being received from that entity, and preventing that entity from
seeing future conversation. When a user is removed, all of their clients are
explicitly removed as well. Removal may be voluntary or non-voluntary.</t>
      <t><em>Policy</em>: The authorization structure within a room. Policy governs whether an
action is possible, such as whether User A can add User B to the room. Policies
are changed over time by users and servers.</t>
      <t><em>Policy Envelope</em>: Set by the hub server during room creation, the set of policies
which can be changed in the room.</t>
      <t><em>Event</em>: A structure used by servers to relay changes to the room and messages
from clients.</t>
      <t><em>State Event</em>: An event which mutates the <em>state</em> of the room. These may partially
be visible to the servers of the room for authentication and authorization.</t>
      <t><em>Message Event</em>: An event containing a message from a client. Contents are not
visible to servers in the room.</t>
    </section>
    <section anchor="overall-scope">
      <name>Overall Scope</name>
      <t><xref target="overview"/> shows the critical entities in the overall MIMI system and their
interactions.  Each human <em>user</em> is represented in the system by one or more
<em>clients</em>, where each client is a specific software or hardware system belonging
to a single user.  Each provider is represented by a <em>server</em> (logically a
single server, but possibly realized by multiple physical devices).</t>
      <t>Messaging interactions are organized around <em>rooms</em>.  All messaging interactions
take place in the context of a room.  (Some non-messaging interactions may take
place outside of a room, such as operations to fetch information required to set
up a room.)  Rooms have a notion of
<em>user participation</em> as well as <em>client membership</em>, both tracked as lists.
Rooms additionally have policies about things like how the room may be joined
and what capabilities each member/participant has.</t>
      <t>The protocol interactions that drive a room unfold among the servers whose users
are participants in the room.  There is exactly one <em>hub</em> server for the room, which
is in primary control of the room.  All other servers are known as <em>followers</em>.
Follower servers interact directly with the hub server.  Interactions between
clients occur indirectly, via the servers for the clients' providers.</t>
      <figure anchor="overview">
        <name>MIMI Entities and Interactions</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="544" width="504" viewBox="0 0 504 544" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 112,256 L 112,320" fill="none" stroke="black"/>
              <path d="M 136,88 L 136,136" fill="none" stroke="black"/>
              <path d="M 136,264 L 136,312" fill="none" stroke="black"/>
              <path d="M 136,440 L 136,488" fill="none" stroke="black"/>
              <path d="M 152,64 L 152,96" fill="none" stroke="black"/>
              <path d="M 152,128 L 152,160" fill="none" stroke="black"/>
              <path d="M 152,240 L 152,272" fill="none" stroke="black"/>
              <path d="M 152,304 L 152,336" fill="none" stroke="black"/>
              <path d="M 152,416 L 152,448" fill="none" stroke="black"/>
              <path d="M 152,480 L 152,512" fill="none" stroke="black"/>
              <path d="M 240,64 L 240,96" fill="none" stroke="black"/>
              <path d="M 240,128 L 240,160" fill="none" stroke="black"/>
              <path d="M 240,240 L 240,272" fill="none" stroke="black"/>
              <path d="M 240,304 L 240,336" fill="none" stroke="black"/>
              <path d="M 240,416 L 240,448" fill="none" stroke="black"/>
              <path d="M 240,480 L 240,512" fill="none" stroke="black"/>
              <path d="M 264,80 L 264,144" fill="none" stroke="black"/>
              <path d="M 264,256 L 264,320" fill="none" stroke="black"/>
              <path d="M 264,432 L 264,496" fill="none" stroke="black"/>
              <path d="M 288,96 L 288,128" fill="none" stroke="black"/>
              <path d="M 288,272 L 288,304" fill="none" stroke="black"/>
              <path d="M 288,448 L 288,480" fill="none" stroke="black"/>
              <path d="M 320,64 L 320,88" fill="none" stroke="black"/>
              <path d="M 320,136 L 320,160" fill="none" stroke="black"/>
              <path d="M 320,240 L 320,264" fill="none" stroke="black"/>
              <path d="M 320,312 L 320,336" fill="none" stroke="black"/>
              <path d="M 320,416 L 320,440" fill="none" stroke="black"/>
              <path d="M 320,488 L 320,512" fill="none" stroke="black"/>
              <path d="M 344,64 L 344,88" fill="none" stroke="black"/>
              <path d="M 344,136 L 344,264" fill="none" stroke="black"/>
              <path d="M 344,312 L 344,440" fill="none" stroke="black"/>
              <path d="M 344,488 L 344,512" fill="none" stroke="black"/>
              <path d="M 376,128 L 376,272" fill="none" stroke="black"/>
              <path d="M 376,304 L 376,448" fill="none" stroke="black"/>
              <path d="M 392,96 L 392,128" fill="none" stroke="black"/>
              <path d="M 392,272 L 392,304" fill="none" stroke="black"/>
              <path d="M 392,448 L 392,480" fill="none" stroke="black"/>
              <path d="M 496,64 L 496,512" fill="none" stroke="black"/>
              <path d="M 152,48 L 304,48" fill="none" stroke="black"/>
              <path d="M 360,48 L 480,48" fill="none" stroke="black"/>
              <path d="M 24,64 L 56,64" fill="none" stroke="black"/>
              <path d="M 152,64 L 240,64" fill="none" stroke="black"/>
              <path d="M 72,80 L 152,80" fill="none" stroke="black"/>
              <path d="M 240,80 L 264,80" fill="none" stroke="black"/>
              <path d="M 24,96 L 56,96" fill="none" stroke="black"/>
              <path d="M 152,96 L 240,96" fill="none" stroke="black"/>
              <path d="M 288,96 L 392,96" fill="none" stroke="black"/>
              <path d="M 264,112 L 288,112" fill="none" stroke="black"/>
              <path d="M 24,128 L 40,128" fill="none" stroke="black"/>
              <path d="M 152,128 L 240,128" fill="none" stroke="black"/>
              <path d="M 288,128 L 392,128" fill="none" stroke="black"/>
              <path d="M 56,144 L 152,144" fill="none" stroke="black"/>
              <path d="M 240,144 L 264,144" fill="none" stroke="black"/>
              <path d="M 24,160 L 40,160" fill="none" stroke="black"/>
              <path d="M 152,160 L 240,160" fill="none" stroke="black"/>
              <path d="M 152,176 L 304,176" fill="none" stroke="black"/>
              <path d="M 152,224 L 304,224" fill="none" stroke="black"/>
              <path d="M 152,240 L 240,240" fill="none" stroke="black"/>
              <path d="M 112,256 L 152,256" fill="none" stroke="black"/>
              <path d="M 240,256 L 264,256" fill="none" stroke="black"/>
              <path d="M 24,272 L 72,272" fill="none" stroke="black"/>
              <path d="M 152,272 L 240,272" fill="none" stroke="black"/>
              <path d="M 288,272 L 392,272" fill="none" stroke="black"/>
              <path d="M 88,288 L 112,288" fill="none" stroke="black"/>
              <path d="M 264,288 L 288,288" fill="none" stroke="black"/>
              <path d="M 24,304 L 72,304" fill="none" stroke="black"/>
              <path d="M 152,304 L 240,304" fill="none" stroke="black"/>
              <path d="M 288,304 L 392,304" fill="none" stroke="black"/>
              <path d="M 112,320 L 152,320" fill="none" stroke="black"/>
              <path d="M 240,320 L 264,320" fill="none" stroke="black"/>
              <path d="M 152,336 L 240,336" fill="none" stroke="black"/>
              <path d="M 152,352 L 304,352" fill="none" stroke="black"/>
              <path d="M 152,400 L 304,400" fill="none" stroke="black"/>
              <path d="M 24,416 L 56,416" fill="none" stroke="black"/>
              <path d="M 152,416 L 240,416" fill="none" stroke="black"/>
              <path d="M 72,432 L 152,432" fill="none" stroke="black"/>
              <path d="M 240,432 L 264,432" fill="none" stroke="black"/>
              <path d="M 24,448 L 56,448" fill="none" stroke="black"/>
              <path d="M 152,448 L 240,448" fill="none" stroke="black"/>
              <path d="M 288,448 L 392,448" fill="none" stroke="black"/>
              <path d="M 264,464 L 288,464" fill="none" stroke="black"/>
              <path d="M 24,480 L 64,480" fill="none" stroke="black"/>
              <path d="M 152,480 L 240,480" fill="none" stroke="black"/>
              <path d="M 288,480 L 392,480" fill="none" stroke="black"/>
              <path d="M 80,496 L 152,496" fill="none" stroke="black"/>
              <path d="M 240,496 L 264,496" fill="none" stroke="black"/>
              <path d="M 24,512 L 64,512" fill="none" stroke="black"/>
              <path d="M 152,512 L 240,512" fill="none" stroke="black"/>
              <path d="M 152,528 L 304,528" fill="none" stroke="black"/>
              <path d="M 360,528 L 480,528" fill="none" stroke="black"/>
              <path d="M 152,48 C 143.16936,48 136,55.16936 136,64" fill="none" stroke="black"/>
              <path d="M 304,48 C 312.83064,48 320,55.16936 320,64" fill="none" stroke="black"/>
              <path d="M 360,48 C 351.16936,48 344,55.16936 344,64" fill="none" stroke="black"/>
              <path d="M 480,48 C 488.83064,48 496,55.16936 496,64" fill="none" stroke="black"/>
              <path d="M 24,64 C 15.16936,64 8,71.16936 8,80" fill="none" stroke="black"/>
              <path d="M 56,64 C 64.83064,64 72,71.16936 72,80" fill="none" stroke="black"/>
              <path d="M 24,96 C 15.16936,96 8,88.83064 8,80" fill="none" stroke="black"/>
              <path d="M 56,96 C 64.83064,96 72,88.83064 72,80" fill="none" stroke="black"/>
              <path d="M 24,128 C 15.16936,128 8,135.16936 8,144" fill="none" stroke="black"/>
              <path d="M 40,128 C 48.83064,128 56,135.16936 56,144" fill="none" stroke="black"/>
              <path d="M 24,160 C 15.16936,160 8,152.83064 8,144" fill="none" stroke="black"/>
              <path d="M 40,160 C 48.83064,160 56,152.83064 56,144" fill="none" stroke="black"/>
              <path d="M 152,176 C 143.16936,176 136,168.83064 136,160" fill="none" stroke="black"/>
              <path d="M 304,176 C 312.83064,176 320,168.83064 320,160" fill="none" stroke="black"/>
              <path d="M 152,224 C 143.16936,224 136,231.16936 136,240" fill="none" stroke="black"/>
              <path d="M 304,224 C 312.83064,224 320,231.16936 320,240" fill="none" stroke="black"/>
              <path d="M 24,272 C 15.16936,272 8,279.16936 8,288" fill="none" stroke="black"/>
              <path d="M 72,272 C 80.83064,272 88,279.16936 88,288" fill="none" stroke="black"/>
              <path d="M 24,304 C 15.16936,304 8,296.83064 8,288" fill="none" stroke="black"/>
              <path d="M 72,304 C 80.83064,304 88,296.83064 88,288" fill="none" stroke="black"/>
              <path d="M 152,352 C 143.16936,352 136,344.83064 136,336" fill="none" stroke="black"/>
              <path d="M 304,352 C 312.83064,352 320,344.83064 320,336" fill="none" stroke="black"/>
              <path d="M 152,400 C 143.16936,400 136,407.16936 136,416" fill="none" stroke="black"/>
              <path d="M 304,400 C 312.83064,400 320,407.16936 320,416" fill="none" stroke="black"/>
              <path d="M 24,416 C 15.16936,416 8,423.16936 8,432" fill="none" stroke="black"/>
              <path d="M 56,416 C 64.83064,416 72,423.16936 72,432" fill="none" stroke="black"/>
              <path d="M 24,448 C 15.16936,448 8,440.83064 8,432" fill="none" stroke="black"/>
              <path d="M 56,448 C 64.83064,448 72,440.83064 72,432" fill="none" stroke="black"/>
              <path d="M 24,480 C 15.16936,480 8,487.16936 8,496" fill="none" stroke="black"/>
              <path d="M 64,480 C 72.83064,480 80,487.16936 80,496" fill="none" stroke="black"/>
              <path d="M 24,512 C 15.16936,512 8,504.83064 8,496" fill="none" stroke="black"/>
              <path d="M 64,512 C 72.83064,512 80,504.83064 80,496" fill="none" stroke="black"/>
              <path d="M 152,528 C 143.16936,528 136,520.83064 136,512" fill="none" stroke="black"/>
              <path d="M 304,528 C 312.83064,528 320,520.83064 320,512" fill="none" stroke="black"/>
              <path d="M 360,528 C 351.16936,528 344,520.83064 344,512" fill="none" stroke="black"/>
              <path d="M 480,528 C 488.83064,528 496,520.83064 496,512" fill="none" stroke="black"/>
              <g class="text">
                <text x="40" y="36">Users</text>
                <text x="188" y="36">Provider</text>
                <text x="232" y="36">X</text>
                <text x="380" y="36">Room</text>
                <text x="416" y="36">123</text>
                <text x="40" y="84">Alice</text>
                <text x="188" y="84">Client</text>
                <text x="224" y="84">A</text>
                <text x="332" y="116">Server</text>
                <text x="368" y="116">1</text>
                <text x="444" y="116">(Follower)</text>
                <text x="32" y="148">Bob</text>
                <text x="188" y="148">Client</text>
                <text x="224" y="148">B</text>
                <text x="188" y="212">Provider</text>
                <text x="232" y="212">Y</text>
                <text x="188" y="260">Client</text>
                <text x="224" y="260">C</text>
                <text x="48" y="292">Charlie</text>
                <text x="332" y="292">Server</text>
                <text x="368" y="292">2</text>
                <text x="424" y="292">(Hub)</text>
                <text x="188" y="324">Client</text>
                <text x="224" y="324">D</text>
                <text x="188" y="388">Provider</text>
                <text x="232" y="388">Z</text>
                <text x="40" y="436">Diana</text>
                <text x="188" y="436">Client</text>
                <text x="224" y="436">E</text>
                <text x="332" y="468">Server</text>
                <text x="368" y="468">3</text>
                <text x="444" y="468">(Follower)</text>
                <text x="44" y="500">Evelyn</text>
                <text x="188" y="500">Client</text>
                <text x="224" y="500">F</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
  Users            Provider X                Room 123
                 .--------------------.    .----------------.
 .-----.        | +----------+         |  |                  |
| Alice +---------+ Client A +--+      |  |                  |
 '-----'        | +----------+  |  +------------+            |
                |               +--+  Server 1  | (Follower) |
 .---.          | +----------+  |  +----------+-+            |
| Bob +-----------+ Client B +--+      |  |   |              |
 '---'          | +----------+         |  |   |              |
                 '--------------------'   |   |              |
                                          |   |              |
                   Provider Y             |   |              |
                 .--------------------.   |   |              |
                | +----------+         |  |   |              |
             +----+ Client C +--+      |  |   |              |
 .-------.   |  | +----------+  |  +----------+-+            |
| Charlie +--+  |               +--+  Server 2  | (Hub)      |
 '-------'   |  | +----------+  |  +----------+-+            |
             +----+ Client D +--+      |  |   |              |
                | +----------+         |  |   |              |
                 '--------------------'   |   |              |
                                          |   |              |
                   Provider Z             |   |              |
                 .--------------------.   |   |              |
 .-----.        | +----------+         |  |   |              |
| Diana +---------+ Client E +--+      |  |   |              |
 '-----'        | +----------+  |  +----------+-+            |
                |               +--+  Server 3  | (Follower) |
 .------.       | +----------+  |  +------------+            |
| Evelyn +--------+ Client F +--+      |  |                  |
 '------'       | +----------+         |  |                  |
                 '--------------------'    '----------------'
]]></artwork>
        </artset>
      </figure>
    </section>
    <section anchor="room-state">
      <name>Room State</name>
      <t>A room represnts a messaging interaction among a specific set of clients, with a
single <em>state</em>.  A major goal of the MIMI protocols is to syncrhonize the state
of a room across all of the servers and clients participating in the room.
Changes to the room's state can be proposed by either clients or servers, though
as dicussed in <xref target="policy"/>, one important aspect of the room's state is an
authorization policy that determines which actors are allowed to make which
changes.</t>
      <t>The creation of a room is a local operation on the hub server, and thus outside
the scope of MIMI.  The hub server establishes the initial state of the room.</t>
      <t>The state of the room includes a few types of information, most importantly:</t>
      <ul spacing="normal">
        <li>
          <t>The end-to-end security state of the room</t>
        </li>
        <li>
          <t>The user-level participation state of the room</t>
        </li>
        <li>
          <t>The authorization policy for the room</t>
        </li>
      </ul>
      <figure anchor="fig-room-state">
        <name>Elements of the Room State</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="384" width="552" viewBox="0 0 552 384" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,368" fill="none" stroke="black"/>
              <path d="M 160,32 L 160,120" fill="none" stroke="black"/>
              <path d="M 160,136 L 160,184" fill="none" stroke="black"/>
              <path d="M 160,200 L 160,312" fill="none" stroke="black"/>
              <path d="M 160,328 L 160,368" fill="none" stroke="black"/>
              <path d="M 192,32 L 192,120" fill="none" stroke="black"/>
              <path d="M 192,136 L 192,184" fill="none" stroke="black"/>
              <path d="M 192,200 L 192,312" fill="none" stroke="black"/>
              <path d="M 192,328 L 192,368" fill="none" stroke="black"/>
              <path d="M 384,32 L 384,120" fill="none" stroke="black"/>
              <path d="M 384,136 L 384,184" fill="none" stroke="black"/>
              <path d="M 384,200 L 384,368" fill="none" stroke="black"/>
              <path d="M 400,192 L 400,256" fill="none" stroke="black"/>
              <path d="M 416,32 L 416,120" fill="none" stroke="black"/>
              <path d="M 416,136 L 416,184" fill="none" stroke="black"/>
              <path d="M 416,200 L 416,248" fill="none" stroke="black"/>
              <path d="M 416,264 L 416,368" fill="none" stroke="black"/>
              <path d="M 544,32 L 544,368" fill="none" stroke="black"/>
              <path d="M 8,32 L 160,32" fill="none" stroke="black"/>
              <path d="M 192,32 L 384,32" fill="none" stroke="black"/>
              <path d="M 416,32 L 544,32" fill="none" stroke="black"/>
              <path d="M 40,112 L 128,112" fill="none" stroke="black"/>
              <path d="M 224,112 L 352,112" fill="none" stroke="black"/>
              <path d="M 448,112 L 512,112" fill="none" stroke="black"/>
              <path d="M 144,128 L 208,128" fill="none" stroke="black"/>
              <path d="M 368,128 L 432,128" fill="none" stroke="black"/>
              <path d="M 40,144 L 128,144" fill="none" stroke="black"/>
              <path d="M 224,144 L 352,144" fill="none" stroke="black"/>
              <path d="M 448,144 L 512,144" fill="none" stroke="black"/>
              <path d="M 40,176 L 128,176" fill="none" stroke="black"/>
              <path d="M 224,176 L 352,176" fill="none" stroke="black"/>
              <path d="M 448,176 L 512,176" fill="none" stroke="black"/>
              <path d="M 144,192 L 208,192" fill="none" stroke="black"/>
              <path d="M 368,192 L 432,192" fill="none" stroke="black"/>
              <path d="M 40,208 L 128,208" fill="none" stroke="black"/>
              <path d="M 224,208 L 352,208" fill="none" stroke="black"/>
              <path d="M 448,208 L 512,208" fill="none" stroke="black"/>
              <path d="M 448,240 L 512,240" fill="none" stroke="black"/>
              <path d="M 400,256 L 432,256" fill="none" stroke="black"/>
              <path d="M 448,272 L 512,272" fill="none" stroke="black"/>
              <path d="M 40,304 L 128,304" fill="none" stroke="black"/>
              <path d="M 224,304 L 352,304" fill="none" stroke="black"/>
              <path d="M 144,320 L 208,320" fill="none" stroke="black"/>
              <path d="M 40,336 L 128,336" fill="none" stroke="black"/>
              <path d="M 224,336 L 352,336" fill="none" stroke="black"/>
              <path d="M 8,368 L 160,368" fill="none" stroke="black"/>
              <path d="M 192,368 L 384,368" fill="none" stroke="black"/>
              <path d="M 416,368 L 544,368" fill="none" stroke="black"/>
              <path d="M 40,112 C 31.16936,112 24,119.16936 24,128" fill="none" stroke="black"/>
              <path d="M 128,112 C 136.83064,112 144,119.16936 144,128" fill="none" stroke="black"/>
              <path d="M 224,112 C 215.16936,112 208,119.16936 208,128" fill="none" stroke="black"/>
              <path d="M 352,112 C 360.83064,112 368,119.16936 368,128" fill="none" stroke="black"/>
              <path d="M 448,112 C 439.16936,112 432,119.16936 432,128" fill="none" stroke="black"/>
              <path d="M 512,112 C 520.83064,112 528,119.16936 528,128" fill="none" stroke="black"/>
              <path d="M 40,144 C 31.16936,144 24,136.83064 24,128" fill="none" stroke="black"/>
              <path d="M 128,144 C 136.83064,144 144,136.83064 144,128" fill="none" stroke="black"/>
              <path d="M 224,144 C 215.16936,144 208,136.83064 208,128" fill="none" stroke="black"/>
              <path d="M 352,144 C 360.83064,144 368,136.83064 368,128" fill="none" stroke="black"/>
              <path d="M 448,144 C 439.16936,144 432,136.83064 432,128" fill="none" stroke="black"/>
              <path d="M 512,144 C 520.83064,144 528,136.83064 528,128" fill="none" stroke="black"/>
              <path d="M 40,176 C 31.16936,176 24,183.16936 24,192" fill="none" stroke="black"/>
              <path d="M 128,176 C 136.83064,176 144,183.16936 144,192" fill="none" stroke="black"/>
              <path d="M 224,176 C 215.16936,176 208,183.16936 208,192" fill="none" stroke="black"/>
              <path d="M 352,176 C 360.83064,176 368,183.16936 368,192" fill="none" stroke="black"/>
              <path d="M 448,176 C 439.16936,176 432,183.16936 432,192" fill="none" stroke="black"/>
              <path d="M 512,176 C 520.83064,176 528,183.16936 528,192" fill="none" stroke="black"/>
              <path d="M 40,208 C 31.16936,208 24,200.83064 24,192" fill="none" stroke="black"/>
              <path d="M 128,208 C 136.83064,208 144,200.83064 144,192" fill="none" stroke="black"/>
              <path d="M 224,208 C 215.16936,208 208,200.83064 208,192" fill="none" stroke="black"/>
              <path d="M 352,208 C 360.83064,208 368,200.83064 368,192" fill="none" stroke="black"/>
              <path d="M 448,208 C 439.16936,208 432,200.83064 432,192" fill="none" stroke="black"/>
              <path d="M 512,208 C 520.83064,208 528,200.83064 528,192" fill="none" stroke="black"/>
              <path d="M 448,240 C 439.16936,240 432,247.16936 432,256" fill="none" stroke="black"/>
              <path d="M 512,240 C 520.83064,240 528,247.16936 528,256" fill="none" stroke="black"/>
              <path d="M 448,272 C 439.16936,272 432,264.83064 432,256" fill="none" stroke="black"/>
              <path d="M 512,272 C 520.83064,272 528,264.83064 528,256" fill="none" stroke="black"/>
              <path d="M 40,304 C 31.16936,304 24,311.16936 24,320" fill="none" stroke="black"/>
              <path d="M 128,304 C 136.83064,304 144,311.16936 144,320" fill="none" stroke="black"/>
              <path d="M 224,304 C 215.16936,304 208,311.16936 208,320" fill="none" stroke="black"/>
              <path d="M 352,304 C 360.83064,304 368,311.16936 368,320" fill="none" stroke="black"/>
              <path d="M 40,336 C 31.16936,336 24,328.83064 24,320" fill="none" stroke="black"/>
              <path d="M 128,336 C 136.83064,336 144,328.83064 144,320" fill="none" stroke="black"/>
              <path d="M 224,336 C 215.16936,336 208,328.83064 208,320" fill="none" stroke="black"/>
              <path d="M 352,336 C 360.83064,336 368,328.83064 368,320" fill="none" stroke="black"/>
              <g class="text">
                <text x="80" y="68">Authorization</text>
                <text x="272" y="68">Participant</text>
                <text x="340" y="68">List</text>
                <text x="440" y="68">E2E</text>
                <text x="492" y="68">Security</text>
                <text x="84" y="84">Policy</text>
                <text x="480" y="84">State</text>
                <text x="52" y="132">User</text>
                <text x="80" y="132">1</text>
                <text x="112" y="132">Capas</text>
                <text x="244" y="132">User</text>
                <text x="272" y="132">1</text>
                <text x="316" y="132">(active)</text>
                <text x="468" y="132">Client</text>
                <text x="508" y="132">1a</text>
                <text x="52" y="196">User</text>
                <text x="80" y="196">2</text>
                <text x="112" y="196">Capas</text>
                <text x="244" y="196">User</text>
                <text x="272" y="196">2</text>
                <text x="316" y="196">(active)</text>
                <text x="468" y="196">Client</text>
                <text x="508" y="196">2a</text>
                <text x="468" y="260">Client</text>
                <text x="508" y="260">2b</text>
                <text x="52" y="324">User</text>
                <text x="80" y="324">2</text>
                <text x="112" y="324">Capas</text>
                <text x="236" y="324">User</text>
                <text x="264" y="324">2</text>
                <text x="316" y="324">(inactive)</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+------------------+   +-----------------------+   +---------------+
|                  |   |                       |   |               |
|  Authorization   |   |    Participant List   |   | E2E Security  |
|      Policy      |   |                       |   |     State     |
|                  |   |                       |   |               |
|  .------------.  |   |  .-----------------.  |   |  .---------.  |
| | User 1 Capas +-------+  User 1 (active)  +-------+ Client 1a | |
|  '------------'  |   |  '-----------------'  |   |  '---------'  |
|                  |   |                       |   |               |
|  .------------.  |   |  .-----------------.  |   |  .---------.  |
| | User 2 Capas +-------+  User 2 (active)  +---+---+ Client 2a | |
|  '------------'  |   |  '-----------------'  | | |  '---------'  |
|                  |   |                       | | |               |
|                  |   |                       | | |  .---------.  |
|                  |   |                       | +---+ Client 2b | |
|                  |   |                       |   |  '---------'  |
|                  |   |                       |   |               |
|  .------------.  |   |  .-----------------.  |   |               |
| | User 2 Capas +-------+ User 2 (inactive) | |   |               |
|  '------------'  |   |  '-----------------'  |   |               |
|                  |   |                       |   |               |
+------------------+   +-----------------------+   +---------------+
]]></artwork>
        </artset>
      </figure>
      <section anchor="end-to-end-security-state">
        <name>End-to-End Security State</name>
        <t>Messages sent within a room are protected by an end-to-end security protocol to
ensure that the servers handling messages cannot inspect or tamper with
messages.  This means that the required cryptographic keys need to be
provisioned to any client from which a user can interact with the room.  The
state of this end-to-end security protocol thus represents the precise set of
clients that can send and receive messages in the room, the most precise notion
of membership for a room.  A client that has the required keys for end-to-end
security is said to be a member of the end-to-end security state of the room.</t>
        <t>The end-to-end security state of a room has public and private aspects.  Servers
may store the public aspects of the end-to-end security state, such as
identities and credentials presented by the clients in the room.  The private
aspects of the group, such as the symmetric encryption keys, are known only to
the clients.</t>
      </section>
      <section anchor="participants-and-members">
        <name>Participants and Members</name>
        <t>The <em>participant list</em> for a room is the set of users who are allowed to interact
with the room in some way.  The specific list of ways in which a user may
participate is defined by authorization policy, as discussed in <xref target="policy"/>.</t>
        <t>Note the parallel terminology with regard to inclusion of clients or users in
the room:</t>
        <ul spacing="normal">
          <li>
            <t>A <em>client</em> is a <em>member</em> of the <em>end-to-end security state</em> of the room</t>
          </li>
          <li>
            <t>A <em>user</em> is a <em>participant</em> in the room</t>
          </li>
        </ul>
        <t>The user-level <em>participant list</em> and the client-level <em>membership</em> of the room
are distinct entities managed by separate protocols, but they must be consistent
with each other.  A client may be a member of the E2EE state of a room only if
its user is a participant in the room.  However, a user may be a participant in
a room without any client belonging to the user being part of the end-to-end
security state of the room.  (Such a user will not be able to read or send
messages, but may be able to take other actions.  It is up to client
implementations how this state is represented.)</t>
        <t>A user with at least one client joined to the end-to-end security state of the
room is known as an <em>active user</em>, since such a user can fully participate in
the room.</t>
      </section>
      <section anchor="membership-changes">
        <name>Membership Changes</name>
        <t>The participant list and client membership of a group can change over time, via <em>add</em> and <em>remove</em>
operations at both the user level and the client level.  These operations are
independent at the protocol level: For example, a user may be added to a room
before any of its clients are available to join, or a user may begin using a new
device (adding the device without changing the user-level participation).</t>
        <t>As discussed above, user-level participation and client-level membership must be kept in sync.
When a user is added, some set of their clients should be added as well; when a
user leaves or is evicted, any clients joined to the room should be removed.
The cryptographic constraints of end-to-end security protocols mean that servers
cannot perform this synchronization; it is up to clients to keep these two types
of state in sync.</t>
      </section>
      <section anchor="policy">
        <name>Policy</name>
        <t>Each room has an associated <em>policy</em> that governs which protocol actions are
authorized for the room while the policy is in effect.  The policy defines
several aspects of the room's behavior, for example:</t>
        <ul spacing="normal">
          <li>
            <t>Admission policy: Do new members need to be explicitly added by a current
member of the room, or can some set of users join unilaterally?</t>
          </li>
          <li>
            <t>Capabilities per user: Is a given user allowed to ...
            </t>
            <ul spacing="normal">
              <li>
                <t>Send messages in the room?</t>
              </li>
              <li>
                <t>Add or remove other users?</t>
              </li>
              <li>
                <t>Grant or deny capabilities to other users?</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Capabilities per server: Is a given server participating in the room allowed
to...
            </t>
            <ul spacing="normal">
              <li>
                <t>Add or remove users?</t>
              </li>
              <li>
                <t>Grant or deny capabilities to users?</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The hub server for a room defines the <em>policy envelope</em> for the room, the set of
of acceptable policies for the room.  The hub also sets the initial policy for
the room when it is created.  Pursuant to that initial policy, the clients and
servers participating in the room may then make further changes to the policy.</t>
        <t>At any given time, all of the clients and servers have the same view of the
room's policy.  A client or server that receives an event that is not compliant
with the room's policy may thus safely discard it, since all of the other
participating clients/servers should also reject the event.</t>
      </section>
    </section>
    <section anchor="protocol-interactions">
      <name>Protocol Interactions</name>
      <t>As shown in <xref target="fig-protocols"/>, MIMI protocols define server-to-server interactions and
client-to-client interactions.  Each client interacts with the overall system by
means of its provider's server (whether hub or follower).  Client-to-client
interactions are done by means of these servers.</t>
      <t>The messages sent within a room are forwarded among participating clients by
servers.  However, messages are protected by an end-to-end security protocol so
that their content is only accessible to the clients participating in the room.</t>
      <t>In addition to forwarding messages, servers participate in control protocols
that coordinate the state of the room across the participating providers.  Both
message forwarding and control protocols leverage a common framework for sharing
<em>events</em> among servers.  Events are protected with the same end-to-end security
protocol as clients' messages, so that the actors updating a room are
authenticated and the clients participating in a room can confirm that they
agree on the state of the room.</t>
      <t>Note that some parts of the overall system are explicitly out of scope for MIMI.
Namely, client-server interactions internal to a provider (indicated by
"(Provider)" in <xref target="fig-protocols"/>) can be arranged however the provider likes.</t>
      <t>The MIMI protocol implemented by servers thus incorporates a few sub-protocols:</t>
      <ul spacing="normal">
        <li>
          <t>A transport protocol for sending room events among servers</t>
        </li>
        <li>
          <t>A state synchronization protocol for coordinating updates to the room state</t>
        </li>
        <li>
          <t>A message forwarding protocol</t>
        </li>
      </ul>
      <t>A common end-to-end security layer provide common security services to all of
these functions.</t>
      <figure anchor="fig-protocols">
        <name>MIMI Protocols</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="520" viewBox="0 0 520 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 24,112 L 24,304" fill="none" stroke="black"/>
              <path d="M 144,112 L 144,144" fill="none" stroke="black"/>
              <path d="M 144,176 L 144,304" fill="none" stroke="black"/>
              <path d="M 256,112 L 256,128" fill="none" stroke="black"/>
              <path d="M 256,176 L 256,192" fill="none" stroke="black"/>
              <path d="M 256,232 L 256,304" fill="none" stroke="black"/>
              <path d="M 368,112 L 368,144" fill="none" stroke="black"/>
              <path d="M 368,176 L 368,304" fill="none" stroke="black"/>
              <path d="M 488,112 L 488,304" fill="none" stroke="black"/>
              <path d="M 24,64 L 72,64" fill="none" stroke="black"/>
              <path d="M 104,64 L 160,64" fill="none" stroke="black"/>
              <path d="M 208,64 L 240,64" fill="none" stroke="black"/>
              <path d="M 272,64 L 312,64" fill="none" stroke="black"/>
              <path d="M 360,64 L 408,64" fill="none" stroke="black"/>
              <path d="M 440,64 L 496,64" fill="none" stroke="black"/>
              <path d="M 32,158 L 480,158" fill="none" stroke="black"/>
              <path d="M 32,162 L 480,162" fill="none" stroke="black"/>
              <path d="M 32,224 Q 34,220.8 36,224 Q 38,227.2 40,224 Q 42,220.8 44,224 Q 46,227.2 48,224 Q 50,220.8 52,224 Q 54,227.2 56,224 Q 58,220.8 60,224 Q 62,227.2 64,224 Q 66,220.8 68,224 Q 70,227.2 72,224 Q 74,220.8 76,224 Q 78,227.2 80,224 Q 82,220.8 84,224 Q 86,227.2 88,224 Q 90,220.8 92,224 Q 94,227.2 96,224 Q 98,220.8 100,224 Q 102,227.2 104,224 Q 106,220.8 108,224 Q 110,227.2 112,224 Q 114,220.8 116,224 Q 118,227.2 120,224 Q 122,220.8 124,224 Q 126,227.2 128,224 Q 130,220.8 132,224 Q 134,227.2 136,224 " fill="none" stroke="black"/>
              <path d="M 152,224 L 360,224" fill="none" stroke="black"/>
              <path d="M 376,224 Q 378,220.8 380,224 Q 382,227.2 384,224 Q 386,220.8 388,224 Q 390,227.2 392,224 Q 394,220.8 396,224 Q 398,227.2 400,224 Q 402,220.8 404,224 Q 406,227.2 408,224 Q 410,220.8 412,224 Q 414,227.2 416,224 Q 418,220.8 420,224 Q 422,227.2 424,224 Q 426,220.8 428,224 Q 430,227.2 432,224 Q 434,220.8 436,224 Q 438,227.2 440,224 Q 442,220.8 444,224 Q 446,227.2 448,224 Q 450,220.8 452,224 Q 454,227.2 456,224 Q 458,220.8 460,224 Q 462,227.2 464,224 Q 466,220.8 468,224 Q 470,227.2 472,224 Q 474,220.8 476,224 Q 478,227.2 480,224 " fill="none" stroke="black"/>
              <path d="M 152,288 L 248,288" fill="none" stroke="black"/>
              <path d="M 264,288 L 360,288" fill="none" stroke="black"/>
              <path d="M 24,64 C 15.16936,64 8,71.16936 8,80" fill="none" stroke="black"/>
              <path d="M 72,64 C 80.83064,64 88,56.83064 88,48" fill="none" stroke="black"/>
              <path d="M 104,64 C 95.16936,64 88,56.83064 88,48" fill="none" stroke="black"/>
              <path d="M 160,64 C 168.83064,64 176,71.16936 176,80" fill="none" stroke="black"/>
              <path d="M 208,64 C 199.16936,64 192,71.16936 192,80" fill="none" stroke="black"/>
              <path d="M 240,64 C 248.83064,64 256,56.83064 256,48" fill="none" stroke="black"/>
              <path d="M 272,64 C 263.16936,64 256,56.83064 256,48" fill="none" stroke="black"/>
              <path d="M 312,64 C 320.83064,64 328,71.16936 328,80" fill="none" stroke="black"/>
              <path d="M 360,64 C 351.16936,64 344,71.16936 344,80" fill="none" stroke="black"/>
              <path d="M 408,64 C 416.83064,64 424,56.83064 424,48" fill="none" stroke="black"/>
              <path d="M 440,64 C 431.16936,64 424,56.83064 424,48" fill="none" stroke="black"/>
              <path d="M 496,64 C 504.83064,64 512,71.16936 512,80" 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,160 476,154.4 476,165.6" fill="black" transform="rotate(0,480,160)"/>
              <polygon class="arrowhead" points="384,224 372,218.4 372,229.6" fill="black" transform="rotate(180,376,224)"/>
              <polygon class="arrowhead" points="368,288 356,282.4 356,293.6" fill="black" transform="rotate(0,360,288)"/>
              <polygon class="arrowhead" points="368,224 356,218.4 356,229.6" fill="black" transform="rotate(0,360,224)"/>
              <polygon class="arrowhead" points="272,288 260,282.4 260,293.6" fill="black" transform="rotate(180,264,288)"/>
              <polygon class="arrowhead" points="256,288 244,282.4 244,293.6" fill="black" transform="rotate(0,248,288)"/>
              <polygon class="arrowhead" points="160,288 148,282.4 148,293.6" fill="black" transform="rotate(180,152,288)"/>
              <polygon class="arrowhead" points="160,224 148,218.4 148,229.6" fill="black" transform="rotate(180,152,224)"/>
              <polygon class="arrowhead" points="144,224 132,218.4 132,229.6" fill="black" transform="rotate(0,136,224)"/>
              <polygon class="arrowhead" points="40,224 28,218.4 28,229.6" fill="black" transform="rotate(180,32,224)"/>
              <polygon class="arrowhead" points="40,160 28,154.4 28,165.6" fill="black" transform="rotate(180,32,160)"/>
              <g class="text">
                <text x="92" y="36">Provider</text>
                <text x="260" y="36">Provider</text>
                <text x="428" y="36">Provider</text>
                <text x="28" y="100">Client</text>
                <text x="148" y="100">Follower</text>
                <text x="256" y="100">Hub</text>
                <text x="372" y="100">Follower</text>
                <text x="492" y="100">Client</text>
                <text x="256" y="148">Messaging</text>
                <text x="84" y="212">(Provider)</text>
                <text x="256" y="212">Control</text>
                <text x="428" y="212">(Provider)</text>
                <text x="200" y="276">Transport</text>
                <text x="312" y="276">Transport</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
       Provider             Provider             Provider
          |                    |                    |
 .-------' '--------.   .-----' '------.   .-------' '--------.
|                    | |                | |                    |
Client        Follower        Hub         Follower        Client
  |              |             |             |              |
  |              |             |             |              |
  |              |         Messaging         |              |
  |<=======================================================>|
  |              |             |             |              |
  |              |             |             |              |
  |  (Provider)  |          Control          |  (Provider)  |
  |<~~~~~~~~~~~~>|<------------------------->|<~~~~~~~~~~~~>|
  |              |             |             |              |
  |              |             |             |              |
  |              |  Transport  |  Transport  |              |
  |              |<----------->|<----------->|              |
  |              |             |             |              |
]]></artwork>
        </artset>
      </figure>
      <section anchor="end-to-end-security">
        <name>End-to-End Security</name>
        <t>As noted above, all of the clients participating in a room are part of the same
end-to-end security context.  This allows them to protect their messages so that
they are secure from inspection or tampering as they transit MIMI servers.</t>
        <t>In addition to the message protection noted above, the end-to-end security layer
of the protocol provides a few additional functions to the remainder of the
protocol:</t>
        <ul spacing="normal">
          <li>
            <t>Authentication of the actors making changes to a room</t>
          </li>
          <li>
            <t>Confirmation that the clients in a room agree on the state of the room</t>
          </li>
        </ul>
        <t>The authentication function allows MIMI servers to verify the identity of a
client making a change to the room, as an input to a policy evaluation to check
whether the change is authorized.  MIMI servers can make changes to a room,
within the bounds of the room's authorization policy.  Thus, MIMI servers also
need to be represented in the end-to-end security state of the room, but as
actors who can only authenticate, and are not given access to confidential
end-to-end security state.  In MLS terms, they are added as external senders,
not as members of the group.</t>
        <t>The MIMI protocol includes end-to-end security components to keep the end-to-end
security state of the room aligned with the room's participant list, and to
ensure that all clients participating in the room have the proper configuration
(e.g., trusting the appropriate set of servers).</t>
      </section>
      <section anchor="events-and-transport">
        <name>Events and Transport</name>
        <t>A room's activities are realized by servers exchanging <em>events</em>.  Events come in
two types:</t>
        <ul spacing="normal">
          <li>
            <t><strong>State events</strong>, which make changes to the room state</t>
          </li>
          <li>
            <t><strong>Message events</strong>, which describe actual messaging activity in the room</t>
          </li>
        </ul>
        <t>Each event originates at one of the servers participating in the room (possibly
as a result of some interaction with a client).  The originating server sends
the event to the hub server for the room, who distributes it to the other follower
servers.</t>
        <t>Each event is authenticated by its originating server so that all other
participating servers can verify its origin, even those to whom the event has
been distributed by the hub.  If an event was ultimately created by a client, it
is also authenticated by the client that created it.</t>
        <t>The overall MIMI protocol defines this event framework, including its
authentication scheme, as well as the mechanics of how events are delivered from
one server to another.</t>
      </section>
      <section anchor="room-state-synchronization">
        <name>Room State Synchronization</name>
        <t>The servers involved in a room use an application state synchronization protocol
to coordinate changes to a room's state, particularly those listed in
<xref target="room-state"/>.  A few types of room state are synchronized, in what can be
viewed as independent control sub-protocols:</t>
        <t>A <strong>policy control protocol</strong> distributes information about the policy
envelope of a room, and allows participants in a room to propose changes to the
policy within that envelope.</t>
        <t>A <strong>participation control protocol</strong> manages the user-level membership of the
room, including the various ways that members might join or leave a room (or be
added/removed by other users).</t>
        <t>As discussed above, the <strong>end-to-end security control protocol</strong> manages the
end-to-end security state of the room.  This protocol also allows servers to
distribute cryptographic information that clients have pre-registered, which
allows clients to be asynchronously added to rooms.</t>
      </section>
      <section anchor="messages">
        <name>Messages</name>
        <t>Mesage events are end-to-end secure objects that carry application messages in
the standard MIMI content format.  The end-to-end encapsuation ensures that the
message content is only accessible to the clients participating in the room, not
the servers that help to distribute it.</t>
        <t>The MIMI message format <xref target="I-D.ietf-mimi-content"/> defines how clients achieve
the various features of a messaging application, for example:</t>
        <ul spacing="normal">
          <li>
            <t>Text messaging</t>
          </li>
          <li>
            <t>File attachements</t>
          </li>
          <li>
            <t>Replies</t>
          </li>
          <li>
            <t>Reactions</t>
          </li>
          <li>
            <t>Initiation of real-time sessions</t>
          </li>
        </ul>
        <t>Messages transit MIMI servers by means of a <strong>message forwarding protocol</strong>,
which carries an opaque, encrypted message payload together with enough metadata
to facilitate delivery to the clients participating in a room.</t>
        <figure anchor="fig-fanout">
          <name>The hub fans out messages to participating servers; servers deliver messages to users' clients.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="448" width="504" viewBox="0 0 504 448" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 136,64 L 136,88" fill="none" stroke="black"/>
                <path d="M 136,104 L 136,128" fill="none" stroke="black"/>
                <path d="M 136,208 L 136,232" fill="none" stroke="black"/>
                <path d="M 136,248 L 136,272" fill="none" stroke="black"/>
                <path d="M 136,352 L 136,376" fill="none" stroke="black"/>
                <path d="M 136,392 L 136,416" fill="none" stroke="black"/>
                <path d="M 152,80 L 152,112" fill="none" stroke="black"/>
                <path d="M 152,224 L 152,256" fill="none" stroke="black"/>
                <path d="M 152,368 L 152,400" fill="none" stroke="black"/>
                <path d="M 240,80 L 240,112" fill="none" stroke="black"/>
                <path d="M 240,224 L 240,256" fill="none" stroke="black"/>
                <path d="M 240,368 L 240,400" fill="none" stroke="black"/>
                <path d="M 288,80 L 288,112" fill="none" stroke="black"/>
                <path d="M 288,224 L 288,256" fill="none" stroke="black"/>
                <path d="M 288,368 L 288,400" fill="none" stroke="black"/>
                <path d="M 344,120 L 344,216" fill="none" stroke="black"/>
                <path d="M 344,264 L 344,360" fill="none" stroke="black"/>
                <path d="M 376,112 L 376,216" fill="none" stroke="black"/>
                <path d="M 376,256 L 376,360" fill="none" stroke="black"/>
                <path d="M 392,80 L 392,112" fill="none" stroke="black"/>
                <path d="M 392,224 L 392,256" fill="none" stroke="black"/>
                <path d="M 392,368 L 392,400" fill="none" stroke="black"/>
                <path d="M 496,64 L 496,416" fill="none" stroke="black"/>
                <path d="M 152,48 L 304,48" fill="none" stroke="black"/>
                <path d="M 360,48 L 480,48" fill="none" stroke="black"/>
                <path d="M 24,80 L 56,80" fill="none" stroke="black"/>
                <path d="M 152,80 L 240,80" fill="none" stroke="black"/>
                <path d="M 288,80 L 392,80" fill="none" stroke="black"/>
                <path d="M 72,96 L 144,96" fill="none" stroke="black"/>
                <path d="M 240,96 L 280,96" fill="none" stroke="black"/>
                <path d="M 24,112 L 56,112" fill="none" stroke="black"/>
                <path d="M 152,112 L 240,112" fill="none" stroke="black"/>
                <path d="M 288,112 L 392,112" fill="none" stroke="black"/>
                <path d="M 152,144 L 304,144" fill="none" stroke="black"/>
                <path d="M 152,192 L 304,192" fill="none" stroke="black"/>
                <path d="M 24,224 L 40,224" fill="none" stroke="black"/>
                <path d="M 152,224 L 240,224" fill="none" stroke="black"/>
                <path d="M 288,224 L 392,224" fill="none" stroke="black"/>
                <path d="M 64,240 L 152,240" fill="none" stroke="black"/>
                <path d="M 248,240 L 288,240" fill="none" stroke="black"/>
                <path d="M 24,256 L 40,256" fill="none" stroke="black"/>
                <path d="M 152,256 L 240,256" fill="none" stroke="black"/>
                <path d="M 288,256 L 392,256" fill="none" stroke="black"/>
                <path d="M 152,288 L 304,288" fill="none" stroke="black"/>
                <path d="M 152,336 L 304,336" fill="none" stroke="black"/>
                <path d="M 24,368 L 72,368" fill="none" stroke="black"/>
                <path d="M 152,368 L 240,368" fill="none" stroke="black"/>
                <path d="M 288,368 L 392,368" fill="none" stroke="black"/>
                <path d="M 96,384 L 152,384" fill="none" stroke="black"/>
                <path d="M 248,384 L 288,384" fill="none" stroke="black"/>
                <path d="M 24,400 L 72,400" fill="none" stroke="black"/>
                <path d="M 152,400 L 240,400" fill="none" stroke="black"/>
                <path d="M 288,400 L 392,400" fill="none" stroke="black"/>
                <path d="M 152,432 L 304,432" fill="none" stroke="black"/>
                <path d="M 360,432 L 480,432" fill="none" stroke="black"/>
                <path d="M 152,48 C 143.16936,48 136,55.16936 136,64" fill="none" stroke="black"/>
                <path d="M 304,48 C 312.83064,48 320,55.16936 320,64" fill="none" stroke="black"/>
                <path d="M 360,48 C 351.16936,48 344,55.16936 344,64" fill="none" stroke="black"/>
                <path d="M 480,48 C 488.83064,48 496,55.16936 496,64" fill="none" stroke="black"/>
                <path d="M 24,80 C 15.16936,80 8,87.16936 8,96" fill="none" stroke="black"/>
                <path d="M 56,80 C 64.83064,80 72,87.16936 72,96" fill="none" stroke="black"/>
                <path d="M 24,112 C 15.16936,112 8,104.83064 8,96" fill="none" stroke="black"/>
                <path d="M 56,112 C 64.83064,112 72,104.83064 72,96" fill="none" stroke="black"/>
                <path d="M 152,144 C 143.16936,144 136,136.83064 136,128" fill="none" stroke="black"/>
                <path d="M 304,144 C 312.83064,144 320,136.83064 320,128" fill="none" stroke="black"/>
                <path d="M 152,192 C 143.16936,192 136,199.16936 136,208" fill="none" stroke="black"/>
                <path d="M 304,192 C 312.83064,192 320,199.16936 320,208" fill="none" stroke="black"/>
                <path d="M 24,224 C 15.16936,224 8,231.16936 8,240" fill="none" stroke="black"/>
                <path d="M 40,224 C 48.83064,224 56,231.16936 56,240" fill="none" stroke="black"/>
                <path d="M 24,256 C 15.16936,256 8,248.83064 8,240" fill="none" stroke="black"/>
                <path d="M 40,256 C 48.83064,256 56,248.83064 56,240" fill="none" stroke="black"/>
                <path d="M 152,288 C 143.16936,288 136,280.83064 136,272" fill="none" stroke="black"/>
                <path d="M 304,288 C 312.83064,288 320,280.83064 320,272" fill="none" stroke="black"/>
                <path d="M 152,336 C 143.16936,336 136,343.16936 136,352" fill="none" stroke="black"/>
                <path d="M 304,336 C 312.83064,336 320,343.16936 320,352" fill="none" stroke="black"/>
                <path d="M 24,368 C 15.16936,368 8,375.16936 8,384" fill="none" stroke="black"/>
                <path d="M 72,368 C 80.83064,368 88,375.16936 88,384" fill="none" stroke="black"/>
                <path d="M 24,400 C 15.16936,400 8,392.83064 8,384" fill="none" stroke="black"/>
                <path d="M 72,400 C 80.83064,400 88,392.83064 88,384" fill="none" stroke="black"/>
                <path d="M 152,432 C 143.16936,432 136,424.83064 136,416" fill="none" stroke="black"/>
                <path d="M 304,432 C 312.83064,432 320,424.83064 320,416" fill="none" stroke="black"/>
                <path d="M 360,432 C 351.16936,432 344,424.83064 344,416" fill="none" stroke="black"/>
                <path d="M 480,432 C 488.83064,432 496,424.83064 496,416" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,360 372,354.4 372,365.6" fill="black" transform="rotate(90,376,360)"/>
                <polygon class="arrowhead" points="384,216 372,210.4 372,221.6" fill="black" transform="rotate(90,376,216)"/>
                <polygon class="arrowhead" points="288,96 276,90.4 276,101.6" fill="black" transform="rotate(0,280,96)"/>
                <polygon class="arrowhead" points="256,384 244,378.4 244,389.6" fill="black" transform="rotate(180,248,384)"/>
                <polygon class="arrowhead" points="256,240 244,234.4 244,245.6" fill="black" transform="rotate(180,248,240)"/>
                <polygon class="arrowhead" points="152,96 140,90.4 140,101.6" fill="black" transform="rotate(0,144,96)"/>
                <polygon class="arrowhead" points="104,384 92,378.4 92,389.6" fill="black" transform="rotate(180,96,384)"/>
                <polygon class="arrowhead" points="72,240 60,234.4 60,245.6" fill="black" transform="rotate(180,64,240)"/>
                <g class="text">
                  <text x="40" y="36">Users</text>
                  <text x="188" y="36">Provider</text>
                  <text x="232" y="36">X</text>
                  <text x="380" y="36">Room</text>
                  <text x="416" y="36">123</text>
                  <text x="40" y="100">Alice</text>
                  <text x="188" y="100">Client</text>
                  <text x="224" y="100">A</text>
                  <text x="332" y="100">Server</text>
                  <text x="368" y="100">1</text>
                  <text x="444" y="100">(Follower)</text>
                  <text x="188" y="180">Provider</text>
                  <text x="232" y="180">Y</text>
                  <text x="32" y="244">Bob</text>
                  <text x="188" y="244">Client</text>
                  <text x="224" y="244">B</text>
                  <text x="332" y="244">Server</text>
                  <text x="368" y="244">2</text>
                  <text x="424" y="244">(Hub)</text>
                  <text x="188" y="324">Provider</text>
                  <text x="232" y="324">Z</text>
                  <text x="48" y="388">Charlie</text>
                  <text x="188" y="388">Client</text>
                  <text x="224" y="388">C</text>
                  <text x="332" y="388">Server</text>
                  <text x="368" y="388">3</text>
                  <text x="444" y="388">(Follower)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
  Users            Provider X                Room 123
                 .--------------------.    .----------------.
                |                      |  |                  |
 .-----.        | +----------+     +------------+            |
| Alice +-------->+ Client A +---->+  Server 1  | (Follower) |
 '-----'        | +----------+     +----------+-+            |
                |                      |  |   |              |
                 '--------------------'   |   |              |
                                          |   |              |
                   Provider Y             |   |              |
                 .--------------------.   |   |              |
                |                      |  |   V              |
 .---.          | +----------+     +----------+-+            |
| Bob +<----------+ Client B +<----+  Server 2  | (Hub)      |
 '---'          | +----------+     +----------+-+            |
                |                      |  |   |              |
                 '--------------------'   |   |              |
                                          |   |              |
                   Provider Z             |   |              |
                 .--------------------.   |   |              |
                |                      |  |   V              |
 .-------.      | +----------+     +----------+-+            |
| Charlie +<------+ Client C +<----+  Server 3  | (Follower) |
 '-------'      | +----------+     +------------+            |
                |                      |  |                  |
                 '--------------------'    '----------------'
]]></artwork>
          </artset>
        </figure>
        <t>When a client sends a message, the message is delivered to its provider's server
using some provider-internal mechanism.  If the provider is not the hub, then
the server forwards the message to the hub for delivery.  In either case, the
hub distributes the message to all of the servers participating in the room.
Each provider's server then forwards the message to clients of users who are
participating in the room.</t>
      </section>
    </section>
    <section anchor="actors-identifiers-and-authentication">
      <name>Actors, Identifiers, and Authentication</name>
      <t>There are several types of entity to be identified in the MIMI system, including:</t>
      <ul spacing="normal">
        <li>
          <t>Rooms,</t>
        </li>
        <li>
          <t>Servers,</t>
        </li>
        <li>
          <t>Users, and</t>
        </li>
        <li>
          <t>Clients.</t>
        </li>
      </ul>
      <t>A server's identity is effectively the identity of the provider it represents.
A room is hosted by a single hub server at a given time, so its identity is
within the scope of the hub server's identity.</t>
      <t>To facilitate the application of policies based on these identifiers to protocol
actions, each actor presents one or more credentials that associate a signature
key pair to their identifiers.  Protocol messages are then signed by their
senders to authenticate the origin of the message.</t>
      <t>For a deeper discussion of identity, see <xref target="I-D.mahy-mimi-identity"/>.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO</t>
      <ul spacing="normal">
        <li>
          <t>Authorization policy attached to a room</t>
        </li>
        <li>
          <t>E2E security for messages provided by message delivery protocol</t>
        </li>
        <li>
          <t>E2E/E2M/M2E/M2M security for events provided by transport protocol</t>
        </li>
        <li>
          <t>HbH security provided by TLS</t>
        </li>
      </ul>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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-mimi-content">
          <front>
            <title>More Instant Messaging Interoperability (MIMI) message content</title>
            <author fullname="Rohan Mahy" initials="R." surname="Mahy">
              <organization>Wire</organization>
            </author>
            <date day="23" month="October" year="2023"/>
            <abstract>
              <t>   This document describes content semantics common in Instant Messaging
   (IM) systems and describes a profile suitable for instant messaging
   interoperability of messages end-to-end encrypted inside the MLS
   (Message Layer Security) Protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mimi-content-01"/>
        </reference>
        <reference anchor="I-D.mahy-mimi-identity">
          <front>
            <title>More Instant Messaging Interoperability (MIMI) Identity Concepts</title>
            <author fullname="Rohan Mahy" initials="R." surname="Mahy">
              <organization>Wire</organization>
            </author>
            <date day="10" month="July" year="2023"/>
            <abstract>
              <t>   This document discusses concepts in instant messaging identity
   interoperability when using end-to-end encryption, for example with
   the MLS (Message Layer Security) Protocol.  The goal is to explore
   the problem space in preparation for framework and requirements
   documents.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mahy-mimi-identity-02"/>
        </reference>
      </references>
    </references>
    <?line 567?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+Vd65Ibx3X+30/RWf3YC7FgSLkqzpqWvFquzC2TIiNScZxU
CtWYaQAjDmbg6cGuYJJ+ljxLnizn1rfB7HJJy7ErQalKi8F09+nTp8/5zqWb
p6enqq/62p7pg/NGn3fFqupt0W87qxdtp1+08MdV43rT9PqFdc4sq2YJT3rb
tRvbmXlVV/1OH724enF1fKDMfN7Za+gMv2fdHajC9HbZdrszXTWLVqmyLRqz
hpHLziz607npGutO19W6OjXQ8PQfv1RuO19XzlVt0+828ObV5ZtvVbNdz213
pkro70wVbeNs47buTPfd1ioY/EtlOmtwRptNXcGw0N5p05T6e2vq0zfVGqi5
abu3y67dbpDY+83yQL21O2hXnil9qtf+Pfxim/K0b0/hf9rZYtvB2+raNlsg
UOtPHkZrnu7B74FIfOW32AM+X5uqhufIpN9Utl9M226Jz5Fh8HzV9xt39vAh
voaPqms79a89xAcP51174+xD7OAhNlxW/Wo7h6bzarHtmFcPwxocKGW2/art
cMbwttaLbV3zqn1fFSvTlfr5VH9DS0e/w0Cmqf5E/Zzpi8oVLT23THlXz39T
ba6n7ielmrZbw3vXwCOFEhG/qdPTU23mru9M0Sv1ZmU/URD1jTCOWK8rp0u7
qBp8YkCoQCZ1u9Cbru3boq2d7lem16au25u4rPjzdVXaDn5uQWT9QND2Bpim
28Yq07T9ynZTrd+scJC22K4tEFibndPtFvpsdHsNjeqalijsLRCNNfaF4/Q4
PaBaRXpQVldADPy0o7kACUuLQyEttjHz2qZ9R6LtT0BjZZvCTpmN66osa6vU
F8irri23BS4NMLUtzW6CIwA5sF9AtJpdMmfgT+x1sW2omUEew2zPw4sKJBW2
WF2Hto4mVNQVMsK1i/4Gez+y0+V0oo1et7BSMOJmc0zTxJed7a6Jz7AMamEK
XErkc9Gu19sm7uB1C7Rwz454jq+gphLykGhSPLAWxCTcnVsnS7gy1zaZE62o
KaTromudk19tZMMUpQ9684xetqbWoOLMW1ztmwZ7aYF++lmDujrFNxzI8IlI
KelRkGwRMlk7nDUSdlpD01ovrEGxIK6bhEa3c71dQ19vgFISaHjBEW88xdu6
rzZ1QjK8fbmvjbAhDuin6LjTxm3ark83Q3hB2B37VVcN0J2I+UTfWNhYruiq
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
oQP/Jqzc/wCxyErR9WgAAA==

-->

</rfc>
