<?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.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kohbrok-mimi-metadata-minimalization-01" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="MIMIMI">MIMI Metadata Minimalization (MIMIMI)</title>
    <seriesInfo name="Internet-Draft" value="draft-kohbrok-mimi-metadata-minimalization-01"/>
    <author initials="K." surname="Kohbrok" fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad.kohbrok@datashrine.de</email>
      </address>
    </author>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="07"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 24?>

<t>This document describes a proposal to run the MIMI protocol in a way that
reduces the ability of the Hub and service providers to associate messaging
activity of clients with their respective identities.</t>
      <t>For now, this document only contains a high-level description of the mechanisms
involved.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    More Instant Messaging Interoperability Working Group mailing list (mimi@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/mimi/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/kkohbrok/mimi-metadata-minimalization"/>.</t>
    </note>
  </front>
  <middle>
    <?line 33?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Since the MIMI protocol uses MLS PublicMessages for Proposals and Commits, both
Hub and Provider can observe and track activities of clients both within an
individual group and across groups.</t>
      <t>The goal of the scheme described in this document are as follows:</t>
      <ul spacing="normal">
        <li>
          <t>For a given client, prevent the Hub and all service providers from associating
the activity of the client with that client's identifier.</t>
        </li>
        <li>
          <t>For a given client, prevent the Hub and all service providers except for the
client's service provider from associating the activity of that client in one
group from that in any other.</t>
        </li>
      </ul>
      <t>These propoerties are achieved withouth limiting the ability of the Hub to track
a group's group state and provider public group information to newly joining
clients.</t>
      <t>However, the scheme comes with a few operative requirements and the following
general limitations:</t>
      <ul spacing="normal">
        <li>
          <t>There needs to be the notion of a "connection" between two users. Users that
are connected can link a pseudonym with a user's real identity and can
(selectively) allow others to do the same.</t>
        </li>
        <li>
          <t>Only connected users can add one-another to groups.</t>
        </li>
        <li>
          <t>Users that join a group need help of an existing group member in linking the
pseudonyms visible in the group to real user identities.</t>
        </li>
      </ul>
      <t>This document only contains a high-level description of the individual changes
required to achieve the goals detailed above.</t>
    </section>
    <section anchor="pseudonymization">
      <name>Pseudonymization</name>
      <t>The main mechanism to hide the user and client identifiers from the hub and
providers in the context of individual groups and use user-level and client-level
pseudonyms instead.</t>
      <t>The purpose of the pseudonymization scheme described in this document is to
hide metadata from service providers with as little impact as possible on the
features provided by the base MIMI protocol. This means that by
default, User and client identifiers are still visible to (other) users and
their clients.</t>
      <t>In addition, the pseudonymization scheme can also be used to hide a user's
identity from other users. See Section <xref target="user-to-user-pseudonymity"/> for more
details.</t>
    </section>
    <section anchor="pseudonymity-through-credential-encryption">
      <name>Pseudonymity through credential encryption</name>
      <t>Clients use PseudonymousCredentials to represent them in MIMI rooms to hide their
identities from providers</t>
      <sourcecode type="tls"><![CDATA[
struct {
  IdentifierUri client_pseudonym;
  IdentifierUri user_pseudonym;
  opaque signature_public_key;
  opaque identity_link_ciphertext<V>;
} PseudonymousCredential
]]></sourcecode>
      <t>PseudonymousCredentials don't contain a client's client
and user ID. Instead, they use two pseudonyms: a user pseudonym shared by all
other PseudonymousCredentials of the user's clients in a given room and a
client pseudonym unique for each PseudonymousCredential. Each pseudonym is an
IdentifierUri made up of a randomly generated UUID and the user's provider's
domain.</t>
      <sourcecode type="tls"><![CDATA[
struct {
  IdentifierUri client_pseudonym;
  IdentifierUri user_pseudonym;
  opaque signature_public_key;
} PseudonymousCredentialTBS

struct {
  /* SignWithLabel(., "PseudonymousCredentialTBS",
    PseudonymousCredentialTBS) */
  opaque pseudonymous_credential_signature<V>;
  Credential client_credential;
} IdentityLinkTBE
]]></sourcecode>
      <t>The <tt>identity_link_ciphertext</tt> is created by encrypting the IdentityLinkTBE,
which contains the client's real credential, as well as a signature over the
PseudonymousCredentialTBS using the client credential's signature key.</t>
      <t>The <tt>identity_link_key</tt> used for encryption is unique per pseudonymous credential.
It is derived from the client's <tt>connection_key</tt>.</t>
      <sourcecode type="tls"><![CDATA[
identity_link_key = ExpandWithLabel(connection_key,
  "IdentityLinkKey", PseudonymousCredentialTBS, KDF.Nh)
]]></sourcecode>
      <t>See <xref target="connections"/> for more details on the <tt>connection_key</tt>.</t>
      <t>Pseudonyms are specific to each room and client since the <tt>identity_link_key</tt> is
unique per pseudonymous credential and pseudonymous credentials are used in only
once (i.e. in one room).</t>
    </section>
    <section anchor="identity-link-key-management-in-rooms">
      <name>Identity link key management in rooms</name>
      <t>All clients in a room MUST be able to decrypt the <tt>identity_link_ciphertext</tt> of
all other clients in the room, except in the cases detailed in
<xref target="user-to-user-pseudonymity"/>.</t>
      <t>TODO: The following scheme should be replaced by TreeWrap for FS and PCS. It's a
simple placeholder for now.</t>
      <t>The hub holds encrypted copies of the <tt>identity_link_key</tt>s of all
clients in the room and updates them as clients get added, removed and updated.
The <tt>identity_link_key</tt>s are encrypted with the room's <tt>identity_link_wrapper_key</tt>.</t>
      <t>The <tt>identity_link_wrapper_key</tt> is freshly generated by the room's creator and
does not change throughout the lifetime of the group.</t>
      <t>The <tt>identity_link_wrapper_key</tt> is distributed to new participants as they join
the room.</t>
      <section anchor="add-flow">
        <name>Add flow</name>
        <t>If a group member adds a new user, the adder MUST include a
IdentityLinkExtension in the Welcome's GroupInfoExtensions.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque identity_link_wrapper_key<V>;
} IdentityLinkExtension
]]></sourcecode>
        <t>The adder MUST also include the encrypted <tt>identity_link_key</tt> of all added users
in the AAD of the commit message. The order of the encrypted <tt>identity_link_key</tt>s
in the AAD MUST match the order of the Add proposals in the Commit message.</t>
        <t>Note that this requires the adder to have a connection with each added user as
specified in <xref target="connections"/>.</t>
        <t>TODO: Note here that the sender MUST use the SafeAAD as defined in the extension
doc.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque encrypted_identity_link_keys<V>;
} AddAAD
]]></sourcecode>
        <t>Existing group members can then decrypt the <tt>identity_link_key</tt>s to learn the
real identities of the added users.</t>
        <t>When it receoves a Commit message, the hub adds the encrypted <tt>identity_link_key</tt>s to
the room's state.</t>
        <t>Finally, the added user receiving the welcome can then obtain the encrypted
<tt>identity_link_key</tt>s from the hub and decrypt them using the
<tt>identity_link_wrapper_key</tt> from the extension and use the decrypted
<tt>identity_link_key</tt>s to decrypt the <tt>identity_link_ciphertexts</tt> of all other
clients in the room.</t>
      </section>
      <section anchor="join-flow">
        <name>Join flow</name>
        <t>Members joining a room through the join flow need to obtain the
<tt>identity_link_wrapper_key</tt> out of band. The key can be shared any other group
member.</t>
        <t>TODO: When defining features such as join/invitation links the
<tt>identity_link_wrapper_key</tt> should be included in the link.</t>
        <t>When joining the group, the joining client MUST include its own encrypted
<tt>identity_link_key</tt> in the AAD of the external commit message via the AddAAD
struct.</t>
      </section>
    </section>
    <section anchor="connections">
      <name>Connections</name>
      <t>A connection is a mutually agreed-upon relation betwen two users. Users can
establish connections between one-another through the following process.</t>
      <t>Let's call the initiator of the connection establishment Alice and the
responding user Bob.</t>
      <t>At the time of registration with their local provider, Alice and Bob generate an
HPKE keypair and upload the public key (called the connection establishment
public key) to their respective providers. The providers make the keys available
to all other users without requiring authentication.</t>
      <t>To hide Alice's identity from Bob's provider throughout the connection
establishment process, Alice obtains Bob's connection establishment public key
from Bob's provider.</t>
      <t>Alice now creates a new conversation with her local provider as hub and adds
all of her clients to that conversation. She then compiles the following
information into a connection request:</t>
      <sourcecode type="tls"><![CDATA[
struct {
  Credential requester_client_credential;
  opaque connection_room_id<V>;
  opaque connection_room_identity_link_wrapper_key<V>;
  opaque requester_connection_key<V>;
  opaque connection_response_key<V>;
} ConnectionRequest
]]></sourcecode>
      <t>The <tt>connection_response_key</tt> is a fresh HPKE keypair that Alice generates when
she creates the connection request. It is later used by Bob to encrypt his own
<tt>connection_key</tt> if Bob chooses to accept the request.</t>
      <t>TODO: The request will likely contain more information such as e.g. an authorization
token that allows Bob to fetch Alice's KeyPackages. Any such information must also
be included in the ConnectionResponse below.</t>
      <t>Alice then encrypts the connection request using Bob's connection establishment
public key and sends it to Bob's provider.</t>
      <t>Bob fetches the connection request from his provider and decrypts it using his
connection establishment key.</t>
      <t>He can inspect Alice's <tt>requester_client_credential</tt> and decide whether to
accept the request.</t>
      <t>If Bob accepts, he creates a connection response:</t>
      <sourcecode type="tls"><![CDATA[
struct {
  opaque responder_connection_key<V>;
} ConnectionResponse
]]></sourcecode>
      <t>Bob then follows the join flow for the room with the <tt>connection_room_id</tt>,
including the ConnectionResponse encrypted under the <tt>connection_response_key</tt>
in the join message's (i.e. the external commit's) AAD. As part of that
process, he obtains the encrypted <tt>identity_link_key</tt>s for Alice's clients and
verifies that they belong to the same user as the <tt>requester_client_credential</tt>
in the connection request.</t>
      <t>Bob joining the room signals to Alice that Bob has accepted her connection
request. Alice can decrypt Bob's ConnectionResponse in the join message's AAD
using the connection response key she initially included in the connection
request.</t>
      <t>Both Alice and Bob now share a room and can derive <tt>identity_link_key</tt>s for each
other's clients, which in turn allows them to add each other to rooms.</t>
    </section>
    <section anchor="user-to-user-pseudonymity">
      <name>User-to-user pseudonymity</name>
      <t>In some cases, users may want to communicate with each other without revealing
their real identities to one-another. Room policy can thus specify the extent
to which clients are required to provide <tt>identity_link_key</tt>s. For example,
<tt>identity_link_key</tt>s might not be allowed at all, or only admins are required to
provide <tt>identity_link_key</tt>s.</t>
    </section>
    <section anchor="keypackages">
      <name>KeyPackages</name>
      <t>The use of user and client pseudonyms requires some additional care when
generating and uploading KeyPackages.</t>
      <t>The user and client pseudonyms in the PseudonymousCredential must be unique
across groups. For the client pseudonym to be unique across groups, clients can
generate it randomly for each KeyPackage.</t>
      <t>However, to allow the hub to associate a set of leaves with a user, the user
pseudonym must be consistent across the leaves in that group. This means that
clients need to coordinate to provide KeyPackage sets, where each KeyPackage in
a set contains a consistent user pseudonym and no two sets contain the same
pseudonym. Each such set can be used in the context of one group.</t>
      <t>A procedure for a client to upload KeyPackages could thus look as follows:</t>
      <ol spacing="normal" type="1"><li>
          <t>Check for which user pseudonyms other clients of the same user have uploaded
KeyPackages.</t>
        </li>
        <li>
          <t>Identify user pseudonyms for which the KeyPackage set is missing a KeyPackage
of this client.</t>
        </li>
        <li>
          <t>Generate and upload KeyPackages for those user pseudonyms.</t>
        </li>
        <li>
          <t>Upload as many KeyPackages as desired, thus starting new KeyPackage sets for
other clients to complete.</t>
        </li>
      </ol>
      <t>At least one KeyPackage set of each user must consist of last-resort
KeyPackages. If such a last-resort set is used more than once, the use of the
same user pseudonym allows the hub to learn that one user is active in two
particular groups. The re-use of such a set cannot be avoided entirely, but
users upload more than one set (and re-upload last-resort sets frequently) to
mitigate this at least to a certain degree.</t>
      <t>When uploading KeyPackages, user generally upload KeyPackages to their provider
indexed by their connection token. To avoid leaking metadata to the user's own
provider, the upload must not be connected to the user's identity.</t>
      <t>Users can then fetch KeyPackages of connected users from their respective
providers using the connected user's connection token.</t>
    </section>
    <section anchor="message-fanout">
      <name>Message Fanout</name>
      <t>This protocol assumes that clients have one or more queue IDs that their local
provider can use to route incoming messages to a place that the client can
access.</t>
      <t>For each member of a given group, the member's queue ID is stored in a leaf node
extension s.t. the hub can forward that information to the client's local
provider upon fanout.</t>
      <t>Since in most cases, there will only be a single queue for each client (as
opposed to one queue per group), the queue ID is encrypted using an HPKE key of
the client's provider.</t>
      <t>When receiving the encrypted queue ID with the message fanout, the provider can
decrypt the queue ID and route the message to the correct queue.</t>
    </section>
  </middle>
  <back>








  </back>
  <!-- ##markdown-source:
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
tW79uqEyAAA=

-->

</rfc>
