<?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.33 (Ruby 3.1.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-robert-mimi-delivery-service-02" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.1 -->
  <front>
    <title abbrev="MIMI">MIMI Delivery Service</title>
    <seriesInfo name="Internet-Draft" value="draft-robert-mimi-delivery-service-02"/>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <author initials="K." surname="Kohbrok" fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad.kohbrok@datashrine.de</email>
      </address>
    </author>
    <date year="2023" month="May" day="17"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 24?>

<t>This document describes the MIMI Delivery Service.</t>
    </abstract>
  </front>
  <middle>
    <?line 28?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The MLS protocol document specifies a protocol between two or more clients. The
MLS architecture document introduces an abstract concept of a "Delivery Service"
that is specifically responsible for ordering handshake messages and more
generally for delivering messages to the intended recipients.</t>
      <t>This document describes a Delivery Service that performs the mandated ordering
of handshake messages but also offers the basic functionality that is common to
several messaging services. In particular, it offers the following features:</t>
      <ul spacing="normal">
        <li>A protocol between clients and the Delivery Service that allows clients to
interact with the Delivery Service, including the specific wire format of the
messages. The protocol is specifically designed to be operated in a
decentralized, federated architecture but can be used in single instances as
well.</li>
        <li>Assistance for new joiners of a group: The Delivery Service can keep and
update state such as the public ratchet tree, group extensions, etc.</li>
        <li>Message validation: The Delivery Service can inspect and validate handshake
messages and reject malformed, invalid or malicious messages.</li>
        <li>Built-in authentication of group members: The Delivery Service can
authenticate group members, reject messages from non-members and enforce
group administration policies. Additionally, the Delivery Service can be
linked to the Authentication Service to enforce more policies and validation
rules.</li>
        <li>Privacy-preserving message delivery: The Delivery Service can deliver
messages to the intended recipients without learning the identity of group
members, in particular the sender or the recipients of messages. This feature
is optional and is compatible with most other features, such as assistance
and validation.</li>
        <li>Scalability: The protocol makes no assumption about whether the Delivery Service
runs as a single instance or as a cluster of instances.</li>
        <li>Network fluid: While the Delivery Service would typically run as a
server-side component, the only requirement is that it is accesible by all
clients.</li>
        <li>Transport agnostic: Messages between clients and the Delivery Service can be
sent via an arbitrary transport protocol. Additionally, in the federated
case, client messages to a guest Delivery Service can be forwarded by a
client's local instance of this service.</li>
        <li>Multi-device capable: The Delivery Service can be used by multiple devices
of the same users and supports adding and removing devices of a user.</li>
        <li>A Queueing Service subcomponent that can be used to implement a queueing
service for messages that are delivered asynchronously, particularly in
federated environments, as well as the protocol between the Delivery Service
and the Queueing Service.</li>
      </ul>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol overview</name>
      <t>The Delivery Service is designed around an MLS group as a basic entity. The
Delivery Service can be used with multiple groups but does not require a link
between the groups.
All operations of the Delivery Service are relative to a specific group.</t>
      <section anchor="high-level-functions-of-the-delivery-service">
        <name>High level functions of the Delivery Service</name>
        <ul spacing="normal">
          <li>Authentication of group members</li>
          <li>Validation of handshake messages</li>
          <li>Ordering of handshake messages</li>
          <li>Delivery of messages to the Queueing Service</li>
          <li>Assistance for clients who (re)join a group</li>
        </ul>
        <section anchor="flow">
          <name>Flow</name>
          <t>The protocol is designed in a request/response pattern, whereby the client sends
a DSRequest message to the Delivery Service and the Delivery Service responds
with a DSResponse message. This pattern can easily be used over e.g. RESTful
APIs.</t>
          <figure>
            <name>Delivery Service Request/Response scheme</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width="272" viewBox="0 0 272 160" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                  <path d="M 8,48 L 8,144" fill="none" stroke="black"/>
                  <path d="M 144,48 L 144,144" fill="none" stroke="black"/>
                  <path d="M 8,80 L 136,80" fill="none" stroke="black"/>
                  <path d="M 16,128 L 144,128" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="144,80 132,74.4 132,85.6" fill="black" transform="rotate(0,136,80)"/>
                  <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                  <g class="text">
                    <text x="28" y="36">Client</text>
                    <text x="172" y="36">Delivery</text>
                    <text x="240" y="36">Service</text>
                    <text x="56" y="68">DSRequest</text>
                    <text x="60" y="116">DSResponse</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
Client           Delivery Service
|                |
| DSRequest      |
+--------------->|
|                |
| DSResponse     |
|<---------------+
|                |
]]></artwork>
            </artset>
          </figure>
          <t>Depending on the client's request, the Delivery Service sends a message to the
Queueing Service. This happens whenever a message needs to be fanned out to all
other members of a group.</t>
          <figure>
            <name>Client/Delivery Service communication with fanout</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="648" viewBox="0 0 648 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                  <path d="M 8,48 L 8,176" fill="none" stroke="black"/>
                  <path d="M 144,48 L 144,176" fill="none" stroke="black"/>
                  <path d="M 416,48 L 416,176" fill="none" stroke="black"/>
                  <path d="M 8,80 L 136,80" fill="none" stroke="black"/>
                  <path d="M 16,128 L 144,128" fill="none" stroke="black"/>
                  <path d="M 144,160 L 408,160" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="416,160 404,154.4 404,165.6" fill="black" transform="rotate(0,408,160)"/>
                  <polygon class="arrowhead" points="144,80 132,74.4 132,85.6" fill="black" transform="rotate(0,136,80)"/>
                  <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                  <g class="text">
                    <text x="28" y="36">Client</text>
                    <text x="172" y="36">Delivery</text>
                    <text x="240" y="36">Service</text>
                    <text x="312" y="36">(Provider</text>
                    <text x="364" y="36">1)</text>
                    <text x="444" y="36">Delivery</text>
                    <text x="512" y="36">Service</text>
                    <text x="584" y="36">(Provider</text>
                    <text x="636" y="36">2)</text>
                    <text x="56" y="68">DSRequest</text>
                    <text x="60" y="116">DSResponse</text>
                    <text x="180" y="148">Fanout</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
Client           Delivery Service (Provider 1)     Delivery Service (Provider 2)
|                |                                 |
| DSRequest      |                                 |
+--------------->|                                 |
|                |                                 |
| DSResponse     |                                 |
|<---------------+                                 |
|                | Fanout                          |
|                +-------------------------------->|
|                |                                 |
]]></artwork>
            </artset>
          </figure>
          <t>In the federated case, messages to a guest Delivery Service can be proxied
via the sender's own Delivery Service.</t>
        </section>
      </section>
      <section anchor="high-level-overview-of-the-operations">
        <name>High level overview of the operations</name>
        <ul spacing="normal">
          <li>Group creation/deletion</li>
          <li>Update client fanout information</li>
          <li>Join a group from a Welcome message as a new member</li>
          <li>Join a group through an External Commit message as a new member
or client of an existing member</li>
          <li>Adding and removing users to/from a group</li>
          <li>Adding and removing clients to/from a member of the group</li>
          <li>Client updates (MLS leaf updates)</li>
          <li>Resync a client with a group in case of state loss</li>
          <li>Sending application messages</li>
        </ul>
      </section>
      <section anchor="client-removals-induced-by-the-delivery-service">
        <name>Client removals induced by the Delivery Service</name>
        <t>The Delivery Service can remove clients from a group by issuing remove
 proposals in the following cases:</t>
        <ul spacing="normal">
          <li>A user has removed a client from its account</li>
          <li>A user has been deleted</li>
          <li>The client is removed from the group because it has been inactive for too
long</li>
        </ul>
      </section>
      <section anchor="authentication">
        <name>Authentication</name>
        <t>Clients authenticate to the Delivery Service using the signature key from their
respective leaf node in the group and a client-specific identifier.</t>
        <t>Depending on the operation, one or more kind of client identifier can be used:</t>
        <ul spacing="normal">
          <li>A leaf index: The client identifier is the leaf index of the client in the
group.</li>
          <li>KeyPackageRef: The client identifier is the KeyPackageRef of the client's
KeyPackage.</li>
          <li>User key hash: The client identifier is the hash of the user's public key.</li>
        </ul>
        <t>The identifier is encoded as follows:</t>
        <artwork><![CDATA[
enum  {
  leaf_index(0),
  key_package_ref(1),
  user_key_hash(2),
} DSSenderType;

struct {
  DSSenderType sender_type;
  select (DSSenderID.sender_type) {
    case leaf_index
      uint32 leaf_index;
    case key_package_ref
      opaque key_package_ref<V>;
    case user_key_hash
      opaque user_key_hash<V>;
  }
} DSSenderID;
]]></artwork>
        <t>To authenticate, the client signs the corresponding request. The key used to
sign/verify a given request depends on the <tt>sender_id</tt>.</t>
        <artwork><![CDATA[
struct {
   DSSenderID sender_id;
   DSRequest request;
   // Signature over DSMessageTBS
   opaque signature<0..255>;
} DSMessage;

struct {
   DSSenderID sender_id;
   DSRequest request;
} DSMessageTBS;
]]></artwork>
      </section>
      <section anchor="requestresponse-scheme">
        <name>Request/Response scheme</name>
        <t>The various request types, each corresponding to an operation, are combined as follows:</t>
        <artwork><![CDATA[
enum {
  ds_create_group(0),
  ds_delete_group(1),
  ...
} DSRequestType;
]]></artwork>
        <t>The request type is encoded in the DSRequest message as follows:</t>
        <artwork><![CDATA[
struct {
  DSRequestType request_type;
  select (DSRequest.request_type) {
    case ds_create_group:
      CreateGroupRequest create_group_request;
    case ds_delete_group:
      DeleteGroupRequest delete_group_request;
    ...
  }
} DSRequest;
]]></artwork>
      </section>
    </section>
    <section anchor="operations">
      <name>Operations</name>
      <section anchor="create-group">
        <name>Create group</name>
        <t>A request from the client to create a new group on the Delivery Service.</t>
        <t>The client sends the following CreateGroupRequest to the Delivery Service:</t>
        <artwork><![CDATA[
struct {
  opaque group_id<V>;
  KeyPackage key_package;
  ClientQueueConfig client_queue_config;
  GroupInfo group_info;
} CreateGroupRequest;
]]></artwork>
        <t>The Delivery Service responds with a CreateGroupResponse:</t>
        <artwork><![CDATA[
enum {
  invalid_group_id(0),
  invalid_key_package(1),
  invalid_group_info(2),
} CreateGroupResponse;
]]></artwork>
        <section anchor="validation">
          <name>Validation</name>
          <t>The Delivery Service validates the request as follows:</t>
          <ul spacing="normal">
            <li>The group ID is not empty and is not already in use.</li>
            <li>The KeyPackage is valid, according to (I-D.ietf-mls-protocol) 13.4.3.2. Joining via
External Commits.</li>
            <li>The GroupInfo is valid, according to (I-D.ietf-mls-protocol) 11.1. KeyPackage
validation.</li>
          </ul>
        </section>
      </section>
      <section anchor="delete-group">
        <name>Delete group</name>
        <t>A request from the client to delete a group from the Delivery Service.</t>
      </section>
      <section anchor="update-queue-information">
        <name>Update queue information</name>
        <t>A request from the client to update the queue information for a group. Clients
can provision a queue information object to indicate to the Delivery Service how
to transmit messages to the client during fanout.</t>
      </section>
      <section anchor="join-a-group-from-a-welcome-message">
        <name>Join a group from a Welcome message</name>
        <t>A request to retrieve information to join a group after having received a
Welcome message. The client requests the ratchet tree and the signed GroupInfo
from the Delivery Service.</t>
        <t><tt>text
struct {
  opaque group_id&lt;V&gt;;
  SignatureKey sender;
  // TBD
} WelcomeInfo;
</tt></t>
      </section>
      <section anchor="join-a-group-through-an-external-commit-message">
        <name>Join a group through an External Commit message</name>
        <t>A request to retrieve information to join a group, such as the ratchet tree and
the signed GroupInfo from the Delivery Service.</t>
        <t><tt>text
struct {
  opaque group_id&lt;V&gt;;
  SignatureKey sender;
  // TBD
} ExternalCommitInfo;
</tt></t>
      </section>
    </section>
    <section anchor="add-users">
      <name>Add users</name>
      <t>A request to add one or more users to a group. The users are added by their
respective KeyPackage in an MLS Add Proposal. The client create a Commit message
that covers the proposals and the corresponding Welcome message.</t>
      <t><tt>text
struct {
  MLSMessage commit;
  MLSMessage welcome;
// TBD
} AddUsers;
</tt></t>
      <section anchor="remove-user">
        <name>Remove user</name>
        <t>A request to remove one or more users from a group. The users are removed by
their respective leaf node index from the group in an MLS Remove Proposal. The
client create a Commit message that covers the proposals .</t>
        <t><tt>text
struct {
  MLSMessage commit;
// TBD
} RemoveUsers;
</tt></t>
      </section>
      <section anchor="add-a-client-to-a-group">
        <name>Add a client to a group</name>
        <t>A request to add one or more clients of an existing user to a group.</t>
        <t>```text</t>
        <t>struct {
  MLSMessage commit;
  MLSMessage welcome;
// TBD
} AddClients;
```</t>
      </section>
      <section anchor="remove-a-client-from-a-group">
        <name>Remove a client from a group</name>
        <t>A request to remove one or more clients of an existing user from a group.</t>
        <t><tt>text
struct {
  MLSMessage commit;
// TBD
} RemoveClients;
</tt></t>
      </section>
      <section anchor="update-client">
        <name>Update client</name>
        <t>A request to update the client's leaf node in the group. Regular updates are
important to get good Post-compromise Security (PCS) properties. The client
creates a Commit message that contains its new leaf node.</t>
        <t><tt>text
struct {
  MLSMessage commit;
// TBD
} UpdateClient;
</tt></t>
      </section>
      <section anchor="resync-client">
        <name>Resync client</name>
        <t>A request to resync the client with the group. This can be used to recover from
state loss. The client requests the ratchet tree and the signed GroupInfo from
the Delivery Service.</t>
        <t><tt>text
struct {
  opaque group_id&lt;V&gt;;
  SignatureKey sender;
  // TBD
} ResyncClient;
</tt></t>
      </section>
      <section anchor="update-client-fanout-information">
        <name>Update client fanout information</name>
        <t>A request to update the client's fanout information. The client can use this to
update its fanout information, e.g. to change the queue information.</t>
        <t><tt>text
struct {
  opaque group_id&lt;V&gt;;
  SignatureKey sender;
  // TBD
} UpdateClientFanoutInfo;
</tt></t>
      </section>
      <section anchor="send-message">
        <name>Send message</name>
        <t>A request to send a message to the group. The client sends an MLS application
message to the Delivery Service, which forwards it to the Queueing Service.</t>
        <t><tt>text
struct {
  MLSMessage application_message;
  // TBD
} SendMessage;
</tt></t>
      </section>
    </section>
    <section anchor="delivery-service-state">
      <name>Delivery Service state</name>
      <t>For each group hostend on a particular Delivery Service instance, the Delivery
Service keeps the following state:</t>
      <ul spacing="normal">
        <li>The public MLS ratchet tree of the group</li>
        <li>The GroupInfo of the current epoch</li>
        <li>Past group states (for members who join through a Welcome message)</li>
        <li>Client queue information (for message fanout via the Queueing Service)</li>
        <li>Proposal store that stores standalone proposals of the current epoch</li>
        <li>Extensions (TBD)</li>
      </ul>
    </section>
    <section anchor="queueing-service">
      <name>Queueing Service</name>
      <t>The Queueing Service is a service that is used by the Delivery Service to fan
out messages to clients. Each client has a queue that is used to store messages
for later retrieval by the client. The group state on the Delivery Service
contains client queue information for each client of a group. This information
is forwarded to the Queueing Service along with the message during message
fanout. The information is opaque to the Delivery Service and is only used by
the Queueing Service to deliver the message to the client.</t>
      <t>Note that this document uses the term "client queue" to refer to an abstract
mechanism to forward messages to clients and does not necessarily imply that an
actual queueing mechanism is used.</t>
      <t>This document only specifies the interface between the Delivery Service and the
Queueing Service. Other aspects of the Queueing Service are not specified in
this document.</t>
      <section anchor="queueing-service-protocol">
        <name>Queueing Service protocol</name>
        <t>The Queueing Service protocol is a simple request/response protocol used between
the Delivery Service and the Queueing Service.</t>
        <figure>
          <name>Queueing Service Request/Response scheme</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width="432" viewBox="0 0 432 160" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                <path d="M 8,48 L 8,144" fill="none" stroke="black"/>
                <path d="M 224,48 L 224,144" fill="none" stroke="black"/>
                <path d="M 8,80 L 216,80" fill="none" stroke="black"/>
                <path d="M 16,128 L 224,128" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="224,80 212,74.4 212,85.6" fill="black" transform="rotate(0,216,80)"/>
                <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                <g class="text">
                  <text x="36" y="36">Delivery</text>
                  <text x="104" y="36">Service</text>
                  <text x="332" y="36">Queueing</text>
                  <text x="400" y="36">Service</text>
                  <text x="108" y="68">QueueingServiceRequest</text>
                  <text x="112" y="116">QueueingServiceResponse</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Delivery Service                     Queueing Service
|                          |
| QueueingServiceRequest   |
+------------------------->|
|                          |
| QueueingServiceResponse  |
|<-------------------------+
|                          |
]]></artwork>
          </artset>
        </figure>
        <t>Whenever the Delivery Service has validated an incoming message from a client
and starts to fan out the message, it sends the following request to the
Queueing Service for every client in the group:</t>
        <artwork><![CDATA[
struct {
  opaque client_queue_information<V>;
  MLSMessage message;
} QueueingServiceRequest;
]]></artwork>
        <t>The Queueing Service responds with a QueueingServiceResponse:</t>
        <artwork><![CDATA[
enum {
  ok(0),
  invalid_client_queue_information(1),
} QueueingServiceResponse;
]]></artwork>
        <t>In case the Queueing Service considers the client queue information to be in
invalid (e.g. because the corresponding user/client has been deleted), it
responds with invalid_client_queue_information. Otherwise, it responds with ok.</t>
        <t>The Delivery Service can use rejected messages to subsequentially issue remove
proposals to remove the client from the group. The Delivery Service rejects
Commit messages and application messages until a client has sent a Commit that
covers the proposals.</t>
      </section>
      <section anchor="queueing-service-in-federated-environments">
        <name>Queueing service in federated environments</name>
        <t>In federated environments, the Queueing Service does not necessarily have to be
part of the same domain as the Delivery Service. In this case, the Delivery
Service sends requests over an inter-domain transport protocol to the Queueing
Service.</t>
      </section>
    </section>
    <section anchor="privacy-preserving-message-delivery">
      <name>Privacy preserving message delivery</name>
      <t>If the desired mode of operation is for the Delivery Service to learn as little
as possible about the groups it serves and their members, the protocol can be
extended to protect the group state on the Delivery Service. This can happen
through two complementary mechanisms:</t>
      <ul spacing="normal">
        <li>Unlinking member credentials from credentials issued by the Authentication
Service, providing pseudonymity at the Delivery Service level</li>
        <li>Encrypting the group state with a key that is only known to the group
members, providing encryption at rest</li>
      </ul>
      <t>In practice, the requests from clients to the Delivery Server are extended with
additional parameters, such as decryption keys for the group state and
additional pseudonymous user-level authentication.</t>
    </section>
    <section anchor="extensions">
      <name>Extensions</name>
      <t>The Delivery Service can make use of the following MLS extensions:</t>
      <ul spacing="normal">
        <li>Example: Group administration extension</li>
        <li>TBD</li>
      </ul>
    </section>
  </middle>
  <back>






  </back>
  <!-- ##markdown-source:
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
eDj6FCyspioXSvf/A/BYnkVbPQAA

-->

</rfc>
