<?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.6.36 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mahy-mimi-transport-design-reqs-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="MIMI Design Requirements">Design Requirements for the More Instant Messaging Interoperability (MIMI) Transport Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-mahy-mimi-transport-design-reqs-00"/>
    <author initials="R." surname="Mahy" fullname="Rohan Mahy">
      <organization>Wire</organization>
      <address>
        <email>rohan.mahy@wire.com</email>
      </address>
    </author>
    <date year="2023" month="July" day="10"/>
    <area>art</area>
    <workgroup>MIMI</workgroup>
    <keyword>design requirements</keyword>
    <keyword>design reqs</keyword>
    <keyword>MIMI transport</keyword>
    <abstract>
      <?line 45?>

<t>This document describes design requirements on the More Instant Messaging
Interoperability (MIMI) Working Group provider-to-provider message transport
protocol. These requirements are based on the requirements of the group
encryption using the Messaging Layer Security (MLS) protocol and
requirements for high volume message transfer which would be needed with
large messaging providers.</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-mahy-mimi-transport-design-reqs/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        MIMI 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/rohan-wire/mimi-groupchat/"/>.</t>
    </note>
  </front>
  <middle>
    <?line 54?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>As described in the Group Chat Framework for More Instant Messaging
Interoperability (MIMI) <xref target="I-D.mahy-mimi-group-chat"/>, the basic operations
of users creating, joining, and leaving a chat, map to specific primitives in the
Messaging Layer Security (MLS) protocol <xref target="I-D.ietf-mls-protocol"/>.
Some of these primitives have implications on the design of the MIMI
inter-provider message transport protocol.</t>
      <t>This document describes constraints and requirements to be used during the
design of that protocol.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The terms MLS client, MLS group, Proposal, Commit, External Commit,
external join, group_id, epoch, Welcome, KeyPackage, GroupInfo,
and GroupContext have the same meanings as in the MLS
protocol <xref target="I-D.ietf-mls-protocol"/>.</t>
      <t>An MLS <strong>KeyPackage</strong> (KP) is used to establish initial keying material in a group,
analogous to DoubleRatchet prekeys, except one KP is used for a client per group
but each recipient does not require a separate one.</t>
      <t>An MLS <strong>GroupInfo</strong> (GI) object is the information needed for a client to
externally join an MLS group using an External Commit. The GroupInfo
changes with each MLS epoch.</t>
      <t>The terms in this document and <xref target="I-D.ralston-mimi-terminology"/> have not yet
been aligned.</t>
      <dl>
        <dt><strong>Room</strong>:</dt>
        <dd>
          <t>A room, also known as a chat room or group chat, is a virtual space users
figuratively enter in order to participate in text-based conferencing.
When used with MLS it typically has a 1:1 relationship with an MLS group.</t>
        </dd>
        <dt><strong>User</strong>:</dt>
        <dd>
          <t>A single human user or automated agent (ex: chat bot) with a distinct identifiable
representation in a room.</t>
        </dd>
        <dt><strong>Client</strong>:</dt>
        <dd>
          <t>An instant messaging agent instance associated with a specific user account on a
specific device. For example, the mobile phone instance used by the user
@alice@example.com.</t>
        </dd>
        <dt><strong>Owning Provider:</strong></dt>
        <dd>
          <t>For a given room, the owning provider is the provider which is authoritative
for room policy and which determines which Commit to accept if more than one
valid Commit arrives for the same epoch.</t>
        </dd>
      </dl>
      <t>The rest of this document is separated into sections based on distinct
handling requirements within the protocol.</t>
    </section>
    <section anchor="primitives-which-request-an-exclusive-resource">
      <name>Primitives which request an exclusive resource</name>
      <t>Some primitives request use of an exclusive resource. These could be
handled differently from other requests in a high availability environment.</t>
      <section anchor="claiming-a-single-use-keypackage">
        <name>Claiming a single-use KeyPackage</name>
        <t>Claiming single-use KeyPackages requires that the target's domain is online, that
the requestor has consent to claim them, and there are sufficient
KeyPackages uploaded by the client that are valid and have parameters that are
compatible with the request.</t>
        <t>One provider should be able to claim all the KeyPackages needed by the original
requestor, for all users in a target provider in a single request. For example,
say Alice at provider A wants KeyPackages for:</t>
        <ul spacing="normal">
          <li>Bobby at provider B</li>
          <li>Betty at provider B</li>
          <li>Bruce at provider B</li>
          <li>Bella at provider B</li>
          <li>Cathy at provider C</li>
          <li>Carl at provider C</li>
        </ul>
        <t>Provider A should be able to send a single request to provider B, for
KeyPackages for all of Bobby, Betty, Bruce, and Bella's clients.</t>
        <t>Below is the list of fields which should be provided when claiming KeyPackages:</t>
        <ul spacing="normal">
          <li>the requesting user's user ID (or pseudonym ID)</li>
          <li>the list of requested user IDs (only user IDs associated with the target provider)</li>
          <li>the intended room ID (optional)</li>
          <li>a list of MLS versions (or version mls10 if not provided)</li>
          <li>an ordered ciphersuite list (or the default ciphersuite if not provided)</li>
          <li>any required capabilities (optional)</li>
        </ul>
        <t>If authorized, this should return a list of KeyPackages (which comply with the
restrictions) for all clients of the requested users.</t>
        <t>If the requestor is authorized to request KeyPackages from the target user,
there should be either an error or a KeyPackage for each client of the target user.</t>
        <t>For example, response from provider B:</t>
        <ul spacing="normal">
          <li>
            <t>Bobby
            </t>
            <ul spacing="normal">
              <li>client Bob1: KP</li>
              <li>client Bob2: KP</li>
              <li>client Bob3: KP</li>
            </ul>
          </li>
          <li>
            <t>Betty
            </t>
            <ul spacing="normal">
              <li>client Betty1: KP</li>
              <li>client Betty2: no compatible KPs</li>
            </ul>
          </li>
          <li>Bruce: no consent to provide KPs</li>
          <li>Bella: user deleted</li>
        </ul>
        <t>Note: A similar API could be used between clients and their own provider. If so,
if the client requests KeyPackages for their own user, presumably the client
wants KeyPackages for all of their clients except the requesting client.
This guidance is out-of-scope for MIMI, but is a sufficient gotcha to merit a note.</t>
        <t>In the DoubleRatchet <xref target="DoubleRatchet"/> protocol, a client requests prekeys for every
other client with which it communicates (one prekey for correspondant).
If A, B, C, D, and E have never communicated and want to form a room, each client
needs a prekey for the other 4 (20 prekeys total). However the prekeys are used
for a session regardless of the number of rooms involved. If A, B, C, and X form
a new room, only 6 new prekeys are needed.</t>
        <t>In MLS, only one KeyPackage per member is needed per group, but a different
KeyPackage is needed per group. If A, B, C, D and E join a group, only 5 KeyPackages
are required. However when A, B, C, and X form a different group, 4 more KeyPackages
are needed.</t>
        <t>The implication is that it is harder to rate-limit the consumption of KeyPackages
in MLS, but straightforward to associate KeyPackages with consent relationships
and specific uses. KeyPackages are needed even when a client is temporarily
offline, so KeyPackage exhaustion is an important DoS attack vector we want to
prevent.</t>
      </section>
      <section anchor="sending-a-commit">
        <name>Sending a Commit</name>
        <t>Sending a Commit requires exclusive access to the group's epoch on the
owning provider, which needs to be online and available. By exclusive access, we mean
that if multiple otherwise valid commits are received for the same epoch,
only one of them can be accepted.</t>
        <t>The most efficient way to send a Commit is as a Commit bundle.
A Commit bundle consists of a Commit, GroupInfo, an optional Welcome, and
enough information necessary so the responsible domain can provide the
<tt>ratchet_tree</tt> associated with the group.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Number</th>
              <th align="left">Component</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">1</td>
              <td align="left">Commit</td>
            </tr>
            <tr>
              <td align="left">0 or 1</td>
              <td align="left">Welcome</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">GroupInfo</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">ratchet_tree container</td>
            </tr>
          </tbody>
        </table>
        <t>The Welcome is
the Welcome that the Committer would send if the Commit is accepted, and the
GroupInfo object is the new GroupInfo that would be valid in the new epoch if the
Commit is accepted. The GroupInfo needs to include an <tt>external_pub</tt> extension
so it can be used for external joins in the new epoch if the Commit is accepted.</t>
        <t>If a Commit bundle is rejected because the epoch has already advanced,
the Commit, and the tentative Welcome and
GroupInfo need to be discarded by the requesting client. If the operation
represented by the rejected Commit is still relevant, the requester can
regenerate a new Commit bundle in the new epoch.</t>
        <t>The GroupInfo logically contains the following fields, nested as shown:</t>
        <ul spacing="normal">
          <li>
            <t>GroupInfo
            </t>
            <ul spacing="normal">
              <li>
                <t>GroupContext
                </t>
                <ul spacing="normal">
                  <li>MLS version</li>
                  <li>ciphersuite</li>
                  <li>group ID</li>
                  <li>epoch</li>
                  <li>tree hash</li>
                  <li>transcript hash</li>
                  <li>
                    <t>(GroupContext) extensions
                    </t>
                    <ul spacing="normal">
                      <li>
                        <tt>required_capabilities</tt></li>
                      <li>
                        <tt>external_sender</tt>s</li>
                      <li>
                        <tt>room_policy</tt> (proposed extension)</li>
                    </ul>
                  </li>
                </ul>
              </li>
              <li>
                <t>(GroupInfo) extensions
                </t>
                <ul spacing="normal">
                  <li>
                    <tt>external_pub</tt></li>
                  <li>
                    <tt>ratchet_tree</tt> (optional)</li>
                </ul>
              </li>
              <li>confirmation_tag</li>
              <li>signer</li>
              <li>signature</li>
            </ul>
          </li>
        </ul>
        <t>The size of a GroupInfo without a <tt>ratchet_tree</tt> extension is relatively modest
and need not vary with the number of clients in the group. Even if it includes
a somewhat complicated <tt>room_policy</tt> extension
(proposed in <xref target="I-D.mahy-mls-room-policy-ext"/>), the size of that extension typically
would not increase for each member of the group. By contrast, the <tt>ratchet_tree</tt>
extension grows linearly with the number of clients in the group. Depending on
the size of credentials used, it can easily grow to several megabytes for a large group.
Therefore, the MIMI transport protocol should require that the <tt>ratchet_tree</tt> is
conveyed outside of the GroupInfo.</t>
        <t>Instead of sending the <tt>ratchet_tree</tt> directly, we can include a <tt>ratchet_tree</tt> container
object in the Commit bundle. This could have options for various ways to convey
a <tt>ratchet_tree</tt>: a complete ratchet tree, a compressed version, a delta from or patch to the
previous epoch's tree, or a reference to a separate service. This provides future
proofing. We will need to also come to consensus on a mandatory-to-implement option.
Including the entire tree is wasteful and likely to have real performance impacts for
large groups; requiring that the provider compute the ratchet tree itself is likely a
non-starter for providers with a high-volume of traffic.</t>
        <t>Note: Sending a Proposal does NOT require exclusive access to the epoch.
Assume a group contains clients A, B, and C. A proposal from A to remove B
and a proposal from B to remove A are independently valid proposals, but
together they would be incompatible and the combination would be invalid.</t>
      </section>
      <section anchor="requesting-the-groupinfo">
        <name>Requesting the GroupInfo</name>
        <t>Requesting the GroupInfo from the owning provider requires the owning provider
to be online, and requires that the requesting user has authorization to
receive this (privacy sensitive) information. This request is expected to be
followed immediately by a Commit bundle, except in cases like a sudden
network loss or client crash.</t>
        <t>The owning provider should make the GroupInfo available to a single requestor
for a short amount of time (ex: from a handful of seconds to 30 seconds). The
provider might put other restrictions in place to preventing abuse of this
primitive, for example denying repeated GroupInfo requests in the absense of
corresponding Commits.</t>
        <t>The provider requesting the GroupInfo needs to be able to present a joining
authorization passcode if one was included by the joining user. For more discussion
of joining links and codes, see <xref target="join-codes"/>.</t>
      </section>
    </section>
    <section anchor="provisional-events-messages">
      <name>Provisional events / messages</name>
      <t>Ordinary messages and a handful of other events need to be sent <em>provisionally</em>
from non-owning providers to the owning provider for any room, as the owning
provider still has the ability to refuse these messages or events.</t>
      <t>MLS application messages which are sent in the current epoch, could be sent
by a client Alice to provider A, while simultaneously a Commit is arriving
at owning provider B.
Provider A should still deliver the messages to provider B, which should accept
messages from authorized members, even if the message is from a slightly older
epoch. However, if the Commit removed Alice from the group, Alice's message
should be rejected. In practice, most provisional messages sent in good faith
will be accepted. Therefore the protocol should send these messages
efficiently (in bulk) between providers and communicate rejections
asynchronously.</t>
      <t>MLS Proposals should also be sent provisionally. If Alice sends a Proposal, Alice
knows this Proposal was accepted or rejected only after receiving the Commit for
the next epoch. The next Commit will either include the Proposal (indicating acceptance)
or not (indicating rejection or incompatibility).</t>
    </section>
    <section anchor="fanout-of-events-messages">
      <name>Fanout of events / messages</name>
      <t>Messages and events which have been accepted by the owning
provider then need to be fanned-out to the relevant providers,
which in turn fan-out the messages and events to their relevant clients.
Below are a list of events that would be fanned out:</t>
      <ul spacing="normal">
        <li>application messages</li>
        <li>commits</li>
        <li>proposals</li>
        <li>welcomes</li>
        <li>
          <t>room policy changes
          </t>
          <ul spacing="normal">
            <li>characteristics</li>
            <li>who is pre-authorized for each role</li>
            <li>who has which role</li>
          </ul>
        </li>
        <li>room destroyed</li>
        <li>who has voice</li>
      </ul>
      <t>In commercial messaging deployments, fanout messages among two providers
could result in millions of messages per minute. Therefore it is crucial
that fanout messages can be communicated and acknowledged in bulk.</t>
      <t>At their discretion (according to their policies), providers might also
choose to inform other providers when users are deleted. For example, two
closely federated enterprise IM systems might do this for all user deletions
where the deleted user is present on a room owned by the other provider.
In another model, large consumer providers might inform each other when a
user was deleted due to spam or abuse.</t>
      <t>Regarding the ordering requirements of fanned-out messages:</t>
      <ul spacing="normal">
        <li>Every message/event needs to be delivered.</li>
        <li>It is desirable that events/messages within a single group are no more
than a few hundred messages out-of-order, so the client does not advance
its decryption generation counter too far.</li>
        <li>Application messages do not need to be delivered strictly in order.</li>
        <li>Commits within the same group must be in-order relative to each other</li>
        <li>Proposal referenced in a Commit must be delivered before or with the Commit</li>
      </ul>
      <t>Note: Clients might ask their own provider for MLS Commits, Proposals,
Welcomes, and consent request/grant/reject information before other information,
in order to display most recent messages without a long delay.</t>
      <t>Delivering the most recent messages first seems desirable from a user interface
perspective, however there are constraints; in order to decrypt messages,
the entire sequence of Commits
leading up to the current epoch must be processed in order. Clients typically only
save the keying material for a small number of epochs (two to five). Keeping more
epochs increases memory/storage consumption and reduces security, but allows
clients to decrypt messages, while lots of joining and leaving is being
processed.</t>
      <t>Within each epoch, clients use a "generation" counter to calculate the
key to decrypt a specific message <em>within</em> an epoch. Clients can run the
generation counter forward and save keys for pending messages to decrypt a
message whichs arrive ahead of turn, but clients can typically store from
several hundred to a small number of thousands of these keys per group. Setting
this to a very large number exposes clients to a very simple DoS attack where
the client processes millions of forward ratchet operations to try to decrypt
a malicious message.</t>
    </section>
    <section anchor="directed-async-requests">
      <name>Directed Async requests</name>
      <t>Some primitives are requests that are neither sent to every member of a room,
not do they necessarily result in a timely response. They are not a natural
fit for HTTP REST calls for example.</t>
      <section anchor="consent-messages">
        <name>Consent messages</name>
        <t>For the consent primitive, the sender of a consent request should receive an
acknowledgement that the request was received by the provider of the target
user. For privacy reasons, the requestor should not know if the target user
received or viewed the request. The original requestor will obviously find out
about a consent accept, but a consent reject or block is typically not
communicated to the rejected/blocked user (again for privacy reasons).</t>
        <t>The consent primitive needs to include the following:</t>
        <ul spacing="normal">
          <li>the specific operation (a request for consent, a grant of consent, or a
rejection/revocation of consent);</li>
          <li>the user ID of the user requesting consent;</li>
          <li>the user ID of the target user; and</li>
          <li>optionally, the room ID for which the consent was requested.</li>
        </ul>
        <t>If the consent primitive does not specify a room, it implies consent for
any room. This is a common model for systems that use connection requests.
Once a user accepts a connection request, either party is consenting to add
the other to any number of rooms. In other systems, consent for Alice to
add Bob to a soccer fans room does not imply that Alice has permission to
add Bob to a timeshare presentations room. Both models are common, so MIMI
should be able to support both models.</t>
        <t>Note that a user could reject consent for all rooms from a user even if there
was a consent request for a <em>specific</em> room, or even <em>no consent request</em>.</t>
      </section>
      <section anchor="knock-messages">
        <name>Knock messages</name>
        <t>A client sending a knock request expects to receive some indication
that its knock was received.  However the ultimate goal of the knock
(to be added to a room) may take 2 seconds or 2 yearsm or may never
result in a response.</t>
      </section>
      <section anchor="reporting-abusespam">
        <name>Reporting abuse/spam</name>
        <t>Likewise, reporting spam or abuse needs to result in some acknowledgement of
the report itself. However a delete or ban action for a spamming user may never
happen, may happen immediately, or may happens after weeks or months.</t>
      </section>
      <section anchor="moderation-messages">
        <name>Moderation messages</name>
        <t>For completeness, requests for permission to send messages (voice) and the
corresponding grant voice and revoke voice primitives have a similar asynchronous
form of operation. However, in a moderated room it is expected for each member to
know if they have voice or not. Note that moderation is currently out-of-scope for
MIMI.</t>
      </section>
    </section>
    <section anchor="other-requests">
      <name>Other requests</name>
      <section anchor="search-and-discovery">
        <name>Search and discovery</name>
        <t>This section assumes provider A is searching on provider B. It takes no position on how
a user or providers figures out which provider or providers are queried.</t>
        <t>Adding a user to a group, or obtaining consent to contact a user in MIMI requires
discovery of the user ID of the target user. Whether a user can be discovered/
searched depends on the user's provider's policies and the user's configured
preferences. Some users (for example a realtor or salesperson) may choose to be
broadly searchable, while another user may allow only a search on a single
specific field. The MIMI discovery protocol needs to provide a way to search for
a user at a specific provider and should be able to indicate the specific field
or fields that are being provided or searched:</t>
        <ul spacing="normal">
          <li>user handle or nickname</li>
          <li>email address</li>
          <li>phone number</li>
          <li>partial name search</li>
          <li>search in the entire user profile</li>
          <li>any specific field in the OpenID Connect "Standard Claims"</li>
          <li>any specific field in a vCard</li>
        </ul>
        <t>In the case of an exact handle search it is likely that only a single
user ID is returned (if at all). However when less specific information is
requested, the search could yield multiple results, even a large number,
which may need to be paginated and/or rate limited. The specific information
provided in the response is also subject to the combination of user and
provider policies.</t>
        <t>Note that a provider could use a blanket consent rejection to prevent a user
from being found via search.</t>
      </section>
      <section anchor="attached-files-or-assets">
        <name>Attached files or assets</name>
        <t>Uploading a file to a room in a federated environment can
use one of two models. Either each user uploads the file to their own provider, or
every user uploads any files to the provider owning the room. Any member can
download the files from the provider storing the file.</t>
        <t>The MIMI message transport protocol could easily support both options.</t>
        <t>Note that in many enterprise
environments it may not be possible for clients to use a link directly to or from
the provider storing the file. It may need to be proxied through the client's
provider.</t>
      </section>
      <section anchor="join-codes">
        <name>Joining/Invite links and codes</name>
        <t>Many messaging systems have a way to generate a link (sometimes represented as a
QR Code) that is used to identify a room, find a room, or authorize a user to
join a room. There are many variations in the behavior of links when they are
generated. For example, some links merely point to the target room but do not
grant any additional authorization for a joiner. Typically they include both the
address of the room and some authorization. Authorization could apply only to the
first client to join using that code, or to any number of users. It could also be
limited in time, or require an additional out-of-band password/passphrase or
role-based authorization.</t>
        <t>How a user generates or discovers such a link is out-of-scope of
MIMI, however the way such a link is used to join a room across providers should
be in scope, as it is a common mode of joining. 
To be useful in an interoperable way, a link needs to embed the room ID (probably
as a URI) and a code.
The MIMI message transfer protocol would then include the code in a request for
GroupInfo for the room. Then the GroupInfo could be used in an external join.</t>
        <t>A personal "introduction code" might also provide the user ID of a user, which
could be used to request consent to communicate.</t>
      </section>
      <section anchor="current-status-information">
        <name>Current status information</name>
        <t>IM systems carry some types of information where only the most recent event
may be needed. This could include (for example):</t>
        <ul spacing="normal">
          <li>typing or composing status for a user</li>
          <li>name of room / subject of room</li>
          <li>user status / display name / nickname</li>
          <li>user presence</li>
        </ul>
        <t>Note that presence is explicitly out-of-scope of MIMI. However the MIMI
working group may discover that a message transfer primitive which only
delivers the current status is useful and necessary.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Assumptions about authentication, privacy, and consent of individual users
are discussed in the body of this document. The security considerations of
MLS <xref target="I-D.ietf-mls-protocol"/> and the MLS group chat framework
<xref target="I-D.mahy-mimi-group-chat"/> also apply.</t>
      <t>TODO: Discussion of the end-to-middle problem.</t>
    </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>
        <name>Normative References</name>
        <reference anchor="I-D.mahy-mimi-group-chat">
          <front>
            <title>Group Chat Framework for More Instant Messaging Interoperability (MIMI)</title>
            <author fullname="Rohan Mahy" initials="R." surname="Mahy">
              <organization>Wire</organization>
            </author>
            <date day="10" month="July" year="2023"/>
            <abstract>
              <t>   This document describes a group instant messaging ("group chat")
   semantic framework for the More Instant Messaging Interoperability
   (MIMI) Working Group.  It describes several properties and policy
   options which can be combined to model a wide range of chat and
   multimedia conference types.  It also describes how to build these
   options as an overlay to Messaging Layer Security (MLS) groups and to
   authorize MLS primitives.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mahy-mimi-group-chat-00"/>
        </reference>
        <reference anchor="I-D.ietf-mls-protocol">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <author fullname="Jon Millican" initials="J." surname="Millican">
              <organization>Meta Platforms</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
              <organization>Google</organization>
            </author>
            <author fullname="Katriel Cohn-Gordon" initials="K." surname="Cohn-Gordon">
              <organization>University of Oxford</organization>
            </author>
            <date day="27" month="March" 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 and post-compromise security for groups in size ranging from
   two to thousands.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-protocol-20"/>
        </reference>
        <reference anchor="I-D.mahy-mls-room-policy-ext">
          <front>
            <title>A Messaging Layer Security (MLS) extension for More Instant Messaging Interoperability (MIMI) room policies</title>
            <author fullname="Rohan Mahy" initials="R." surname="Mahy">
              <organization>Wire</organization>
            </author>
            <date day="10" month="July" year="2023"/>
            <abstract>
              <t>   This document describes a Message Layer Security (MLS) GroupContext
   extension to include More Instant Messaging Interoperability (MIMI)
   group chat (room) policy inside an MLS group.  This allows all users
   in a group to agree on the current policy and make authorization
   decisions accordingly.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mahy-mls-room-policy-ext-00"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="DoubleRatchet" target="https://signal.org/docs/specifications/doubleratchet">
          <front>
            <title>The Double Ratchet Algorithm</title>
            <author initials="T." surname="Perrin" fullname="Trevor Perrin">
              <organization>Signal</organization>
            </author>
            <author initials="M." surname="Marlinspike" fullname="Moxie Marlinspike">
              <organization>Signal</organization>
            </author>
            <date year="2016" month="November" day="20"/>
          </front>
        </reference>
        <reference anchor="I-D.ralston-mimi-terminology">
          <front>
            <title>MIMI Terminology</title>
            <author fullname="Travis Ralston" initials="T." surname="Ralston">
              <organization>The Matrix.org Foundation C.I.C.</organization>
            </author>
            <date day="10" month="July" year="2023"/>
            <abstract>
              <t>   This document introduces a set of terminology to use when discussing
   or describing concepts within MIMI.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ralston-mimi-terminology-02"/>
        </reference>
      </references>
    </references>
    <?line 516?>



  </back>
  <!-- ##markdown-source:
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
LC3hfTIj5+YNv/aT3+4huZLJjocuUo4Bb1AdOE4TgjSOck1jSmSBC0TjUWsh
Z5BkgBK3qLeVc3aGJkPfrrqDQGQNiASiRrGJWy03SfP+5FHEs3u8tyO9jscz
wbzFLcxZ/cpUVFa+IMqEfVERFRjKSJ5fEn2k8X/ac3l1VZ7UApSaZ2FriohZ
Pev9ws1Jz2UN+aqUH/mgexcfMYWCm86SMp2lbkx9+qzqT9ZHzsQg/9DDNBRz
fJUcXMwFs1seklaSmkmUZK4Y3shdTZo1CqnPjcbIk7XNPbez3lQ0wgH72Zvg
Um+xPGVONF/fNAkGYEun5DPphFEneZ4rGbTL5/bg3RA5osQI7rU1tSvLPkwr
XTioXLW4QDRqzI/trUc7HlrP0/1ZnFqMWpmad3/seMJG3xJieZB6ZukmdRoM
s21GACmapeCXFtzlqlfZzNbtCYUt+Ir8rutUi7RzuRU1i3jv/S0ziCR33EbZ
/OvQJFM798OpAt5z22KGFgIAKy2SdGzGgiecMjrNDWnzao3YbB6iyPsu0PHJ
heP3s11uiK9Ts0ZSLJviI+qkNle6Q8qesEVo5+W945YPsgOVpz7I0kKQJEHP
bVHaXeEWjJyEPghkjjrZDYwCA7g3Y/0qm3aq4nsbvH9kngK3nEt3vL7Qh47G
aedjVZ+Qt//4yx3cLVKXHpDCgBrA8FnCsa14vB6RoHH5RdKSpuH3YCUroZ6p
4J56HCwdET607KGuGjUCPCGrYWqdpudWKIBXflNbEAgxZ1uH1mT0nqT6rsnb
n/ngR53suf15K9XtZDgl2ZemIJRihD9IK3GpPL/Ur68tpX3hp6b0cj1ch3DH
FXjToG9D8xfkmhhtSwbvpK5gOm5/GOUNl+g6knQaE3oxTSUxuPJmNQTXIMBh
IuElUviYkmtZxzny1Py/jpdcnSSfyru13JYniJEZW/iZaybZSKX+WVdaf3li
hgzq4mchZBYJjgAf+De18X4O3JgiVA/0vbMciXAQXF47A7v0tBj9aVWf2xWh
di3ZULdDbpq/7QLTj64b5Mr5fWEBD/gT72yTv8BonZKu6t40j6X5DF6DKNi0
nPQGBpnTnca/IekhIXwpOMc+eY9v9iCU49dH45OvPkwh40sal99KQUdAfh0W
iqA7TOSNVVsLcyqduZxz0gZuVEDgTIw7ITvlODlxevRGAr+2kWmq81htNBlp
pkiKCRDwcWDycyO6eLNUXnSzODkVU8QT5dTiHuWAlG6/QBHL8Qt0ZM5Tu/Bj
hJksDm36You+5AXQikJbnKTXK+Waqq4V/eIIY+8sqkmvj5BW1WWEDUuKZdW5
/taPRyGSOjVtZVBjI5VxEeFNmEgf7tqkmeJGr5AagOmBcLGTJRPuYfD/zK/0
iuHEzYJfRGLqXH9+n5m7ermDQvv670PCkPY7gdrsw5gD8tKwtuzqCg8TpLDS
RuL/2VOQZCFamVxcgdS4Uyhzbq/6nDsAfQ0NwBx54ertwKr6H3KaE2OQ/cr2
6uvfUtGT0m7HGZbWjr7ZEaOUhI2UcompuBmhaSyyQZKTIcrrBZsw1BkfkQs0
Z+S+RFyGNUM+6h/s63p8oBYDPswE/gz82kNJGf0mmlJfgfz8l6QOL66Jalad
WYOI/fxN1RtizGvXH6oyXArmFDWpfa9awnlLJwCnHOXYuu8cIYT573dk7RqC
bcLN8hkV/ZpECTo57+BKSJGLjQUXGH2vKgWhKQvNJ4QeTJdbh8CRlSe628CR
oOybzdmo2aWUm3xQMGOsLQ/saAk6qz2tm22FYgdWNORCpCBiBIGCEnIprb6j
Mm/3EeiNTQB2fMhpEqYoJTBYFAFw1TPl92yxHntMDgXqiUmBZuuIiKM4LJnw
1DEqif/8LRd5TS19p4o7qBtpIH0QSMurvZDEdd2sYNQSM8fbnTycv0LT15xQ
ILvCDtD2hK/dXeDHfjuwM6NAKnReP4sy354xf0J5XMQgnRrbwoRLyD9NQL4i
kMdvgFKcJC+AVgUMFuajh5JsVmJGUdOADrsCXQWwGC5ZWZ6fG5S0k6dOiFSZ
ezJOH9LHmNBAJR/Oact3sjomaJGIyeAKRrGZJX3Qwr7Cq7SGY/Q/v7s+1e4s
HN/5V2zgRhCKmEBpJ+CehzptJp1oEsbmgL96KSW9I5bVr/o6GA+Yv1ose5y9
gAOsbwXI0pUnbfXlMV79SVX9rt/LquG703eKGS+Y+ZLVq+WzYCFnIDU/rJWl
OLpxijPgYKpi+NoN/PIYup4Pe8+aWKMfqYOLgh3V2tjHG1jt/Fm2WQd5YnuN
+U8lW3ngcpPGyYGVU+kU88GwQT7Ql1Jc9iLjGb2SgK8+eZFrifzYRQ2DFbzC
aqMjo7i+dE2DXOCfBxEpPouAgHSWb+G81b1+hk+rvLR00tWEnR6Rz5SZFCzI
RTyt5sZZSTAdXEz6JG+V6Pt+dMjmm/JZN1QD2iZ/UE46rLV5X3PcE3Rh1MzS
ImWf50VdPvymJZHEx5/ks0+uNGIWrLkKzeHBN3YUqyaa1jOa2ED9+P7vfJ0s
h5PlW1v8oaZN+hyfmb3McvxtPVEodgjIpL959ebSvsoNpMnDUGSLFn75MiDU
j6zSjnMN11c/XT3g4/yTdEiC9kFGSqYJQIo/Nbhy61tj/h+j0GNsH1YAAA==

-->

</rfc>
