<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.2.11) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-nordin-ocm-mls-federated-groups-01" category="std" consensus="true" submissionType="IETF">
  <front>
    <title abbrev="OCM MLS Federated Groups">Federated Groups in Open Cloud Mesh using Messaging Layer Security</title>

    <author initials="M." surname="Nordin" fullname="Micke Nordin">
      <organization>SUNET</organization>
      <address>
        <email>kano@sunet.se</email>
        <uri>https://code.smolnet.org/micke</uri>
      </address>
    </author>
    <author initials="G." surname="Lo Presti" fullname="Giuseppe Lo Presti">
      <organization>CERN</organization>
      <address>
        <email>giuseppe.lopresti@cern.ch</email>
        <uri>https://cern.ch/lopresti</uri>
      </address>
    </author>
    <author initials="M." surname="Baghbani" fullname="Mahdi Baghbani">
      <organization>Ponder Source</organization>
      <address>
        <email>mahdi@pondersource.org</email>
        <uri>https://pondersource.com</uri>
      </address>
    </author>

    <date year="2026" month="July" day="19"/>

    <area>Applications and Real-Time</area>
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 34?>

<t>This document defines an extension to the Open Cloud Mesh (OCM) protocol
to support federated groups as Receiving Parties of shares.  This is
achieved using the Messaging Layer Security (MLS) protocol (RFC 9420) as
a group management layer.  MLS is used for establishing and rotating a
shared group key across federated group members, as well as for
maintaining group state.  This gives not only a way of federating group
membership, but also a standardized way of distributing encryption keys
in a cryptographically secure way, so that files shared with a group can
optionally be encrypted and decrypted.  MLS usage in OCM acts as a
vehicle for group management that gives users optional encryption
capabilities for resources shared with federated groups.</t>



    </abstract>



  </front>

  <middle>


<?line 48?>

<section anchor="introduction"><name>Introduction</name>

<t>Open Cloud Mesh [OCM] currently supports sharing resources with
individual users across federated servers and with groups on a single
server.  This document defines a new <spanx style="verb">shareType</spanx>, <spanx style="verb">"federation"</spanx>, and
registers it in the "OCM Share Types" registry defined by [OCM].  A
<spanx style="verb">"federation"</spanx> share is addressed to a federated group identified by an
OCM Address such as <spanx style="verb">research-group@receiver.example.org</spanx> whose
membership spans multiple OCM servers, with group state managed through
the MLS [RFC9420] epoch mechanism.</t>

<t>In many Enterprise File Sync and Share (EFSS) systems, which constitute
the vast majority of all OCM Servers, there is a tight coupling between
a client and a server, because the server offers a built-in web
interface as its primary client.  In addition to this, a sync client is
often offered as a way of syncing files between the EFSS system and the
user's devices.</t>

<t>In MLS, a client is defined as an agent that establishes shared
cryptographic state with other clients, defined by the cryptographic
keys it holds.  An EFSS server meets this definition directly.  For
deployments where the primary user interface is a web client, the OCM
Server fulfils the MLS client role server-side, holding key material on
behalf of its users, and the word "client" as used in this document
should not necessarily be taken to mean the user's file sync client.
Implementations that do provide a native client application SHOULD
perform cryptographic operations in the native client on the user's
devices, rather than on the server, because this provides stronger
isolation of key material from the server.  In either case the same MLS
client model applies.</t>

<t>Each user who is a member of a federated group has their own MLS leaf
node, enabling individual users to be added and removed independently.
The OCM Server can act as the MLS client on behalf of its users.  For
implementations where the primary interface is a web client, the OCM
Server holds and uses key material server-side.  Implementations with a
native client application SHOULD perform cryptographic operations in the
native client, with the server acting as a relay for MLS messages.</t>

<t>Throughout this document, actions described as being performed by an OCM
server are understood to be performed by that server in its capacity as
an MLS client, on behalf of one of its users.  The server holds no group
membership or cryptographic state independent of its users.</t>

<t>The group and its membership exist and evolve independently of any
sharing activity.  A user that wants to share a resource with a group
can do so without the need to know the current membership details of
that group.  The MLS Delivery Service role is distributed: proposals are
delivered to the home servers of all admins, the Group Owner Server
arbitrates Commits, and File Key (FK) distribution messages are sent
directly from sending servers to member servers, just like OCM share
notifications.  Group membership changes are managed entirely through
MLS group lifecycle operations.</t>

<t>Every group has one or more admins: users who administer the group.  The
user who creates a group is its first admin.  Adding a member, or
removing a member other than oneself, requires the approval of an admin,
placing a human in the loop for changes that grant or revoke access.
Any member can remove themselves from a group without admin approval,
though the Commit is still performed by an admin client.  All Commits
that advance the MLS epoch are constructed by the MLS clients of admins
and arbitrated by the Group Owner Server.</t>

<t>The group's OCM Address is a stable label.  It is minted under the
domain of the server where the group was created, which guarantees its
uniqueness, but it carries no routing semantics: all protocol messages
are routed using the OCM Addresses of individual members and admins,
never the group's.</t>

<t>Files shared with a group can optionally be encrypted with a per-file
key (FK), wrapped with the current group key.  The group key is derived
from the MLS epoch secret and rotates with every epoch transition.  On
every epoch transition the sending server re-wraps the FK under the new
group key and redistributes it, so that the current group key is always
sufficient to unwrap the current FK.  When a member is added to a group,
their MLS client receives the new group key and the re-wrapped FKs, and
can immediately decrypt all resources shared with the group.</t>

<t>When a member is removed from the group, sending servers MAY
additionally generate a new FK and re-encrypt affected resources,
depending on their policy and the nature of the shared data.</t>

</section>
<section anchor="terminology"><name>Terminology</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP 14
[RFC2119] [RFC8174] when, and only when, they appear in all capitals, as
shown here.</t>

<t>Unless stated otherwise, every base64 encoded value this document,
including MLS wire-format messages, KeyPackages, <spanx style="verb">group_id</spanx> values, and
wrapped keys, is encoded using base64url (the URL- and filename-safe
alphabet defined in [RFC4648], Section 5) with padding omitted.  A
decoder MUST accept such a value whether or not padding is present.</t>

<t>This document uses terminology from [OCM] and [RFC9420].  Additional
definitions:</t>

<t><list style="symbols">
  <t><strong>Group</strong> - A Receiving Party identified by an OCM Address whose
identifier resolves to a set of members spanning multiple OCM servers,
with group state managed through MLS.  The Group's OCM Address is a
stable label assigned at creation and MUST NOT change for the lifetime
of the Group; it carries no routing semantics.  In [RFC9420] a group is
defined as: "a logical collection of clients that share a common secret
value at any given time.  Its state is represented as a linear sequence
of epochs in which each epoch depends on its predecessor."</t>
  <t><strong>MLS Client</strong> - As defined in [RFC9420]: an agent that establishes
shared cryptographic state with other clients, defined by the
cryptographic keys it holds.  In this protocol an OCM Server can fulfill
this role.</t>
  <t><strong>Member Server</strong> - An OCM server with one or more users who are
members of a given Group, acting as MLS client on their behalf.</t>
  <t><strong>Group Owner Server</strong> - The server currently arbitrating Commits for
the Group: the home server of the first Admin in the admin set.
Initially this is the server at which the Group was created.</t>
  <t><strong>Admin</strong> - A user who administers the Group membership.  The user who
creates a Group is its first Admin.  Only the MLS clients of Admins
(admin clients) construct Commits.  The admin set is part of the group
state (<xref target="admin-set"/>).</t>
  <t><strong>Admin Server</strong> - The home server of an Admin.  Admin Servers
collectively queue proposals for the Group.</t>
  <t><strong>Group Key</strong> - A symmetric key derived from the current MLS epoch
secret via the MLS Exporter, with the key length of the AEAD algorithm
of the group's cipher suite.  Rotates with every epoch transition.</t>
  <t><strong>File Key (FK)</strong> - A random symmetric key used to encrypt a single
shared resource.  Wrapped with the current Group Key and distributed to
Member Servers via MLS Application Messages.  Re-wrapped under the new
Group Key on every epoch transition (<xref target="fk-rewrap"/>).  Member Servers
always store the most current wrapped FK for each resource.</t>
  <t><strong>Re-encryption mode</strong> - On member removal, the sending server
generates a new FK, re-encrypts the resource, and distributes the new
wrapped key.  Provides strong cryptographic guarantees independent of
trust assumptions.</t>
  <t><strong>Key-reuse mode</strong> - On member removal, the existing FK is kept and
only the standard re-wrap on epoch change (<xref target="fk-rewrap"/>) is performed,
without re-encrypting the resource.  Appropriate only within formally
trusted federations and where re-encryption is impractical.  Mode is not
a binary choice; sending servers can choose one mode for one epoch and
another mode for another epoch, depending on policy and other
circumstances.</t>
  <t><strong>KeyPackage</strong> - As defined in [RFC9420].  A signed object that
enables adding an MLS client to a group asynchronously.  KeyPackages
MUST be used only once, except for a designated last resort KeyPackage
([RFC9420] Section 16.8).</t>
</list></t>

</section>
<section anchor="mls-roles-in-ocm"><name>MLS Roles in OCM</name>

<t>MLS is designed to operate with two supporting services: an
Authentication Service (AS) and a Delivery Service (DS) ([RFC9420]
Section 3; see also the MLS architecture [RFC9750]).  This section
describes how those roles are fulfilled by OCM.</t>

<section anchor="authentication-service"><name>Authentication Service</name>

<t>The AS role is fulfilled by each user's home OCM server.  Credentials in
this protocol are MLS basic credentials ([RFC9420] Section 5.3) whose
identity field is the UTF-8 encoded OCM Address of the user.  Each user
has their own distinct signing key pair so that individual users can be
identified and addressed independently within the MLS group, for example
to add or remove a specific user.  In web-client deployments the key
pair is generated and held by the OCM Server on the user's behalf.  In
native client deployments the key pair is held on the user's device and
the server's role is limited to publishing the user's KeyPackages.</t>

<t>A basic credential carries no verifiable binding of its own; the binding
between a user's OCM Address and their signature key is attested by
authenticated delivery from the user's home server.  A KeyPackage
fetched over TLS from the <spanx style="verb">&lt;endPoint&gt;/mls-key-packages</spanx> endpoint of the
server named in the credential's OCM Address, with the response signed
using HTTP Signatures [RFC9421] verifying against that server's JWKS
endpoint at <spanx style="verb">/.well-known/jwks.json</spanx> [RFC7517], is considered validated
with the AS.  The full validation procedure, including how credentials
introduced later in the life of a group are validated, is specified in
<xref target="trust-and-authentication"/>.</t>

</section>
<section anchor="delivery-service"><name>Delivery Service</name>

<t>The DS role is distributed across the servers of the group rather than
centralised on a single server.  MLS places no constraints on how the DS
is arranged, as long as messages are delivered ([RFC9420] Section 3).</t>

<t><list style="symbols">
  <t>Proposal delivery: <spanx style="verb">MLS_PROPOSAL</spanx> notifications are sent to the home
server of every admin (<xref target="admins"/>), derived from the admin set and the
OCM Addresses in the ratchet tree's leaf credentials.  Admin Servers
queue proposals, deduplicated by ProposalRef ([RFC9420] Section 5.2),
and make them available to their admin clients.</t>
  <t>Commit arbitration: the Group Owner Server, the home server of the
first admin in the admin set, accepts exactly one Commit per epoch from
an admin client and broadcasts it to all Member Servers.</t>
  <t>FK distribution: <spanx style="verb">MLS_APPLICATION</spanx> messages carrying wrapped file keys
are sent directly from the sending server to all current Member Servers,
exactly like OCM share notifications; credential updates are sent to a
single Member Server (<xref target="credential-update"/>).</t>
</list></t>

<t>All MLS messages are delivered to the <spanx style="verb">&lt;endPoint&gt;/notifications</spanx>
endpoint of each recipient server, authenticated with HTTP Signatures
[RFC9421].</t>

<t>Commits are constructed and signed by admin clients, but only the Commit
accepted by the Group Owner Server takes effect; competing Commits for
the same epoch are discarded by their senders.  Designating a single
arbiter of Commits eliminates conflicting Commits for the same epoch
during normal operation, satisfying the sequencing requirement of
[RFC9420] Section 14; conflicting Commits can arise only during failover
and are then resolved deterministically (<xref target="failover"/>).  Per [RFC9420]
Section 14, generating a Commit does not modify the sender's state, so
an admin client whose Commit is rejected simply discards it and
constructs a new Commit on the new epoch.</t>

<t>OCM share notifications are sent directly from the sending server to
each Member Server.  Since sending servers must be group members, they
hold the current MLS ratchet tree after processing each <spanx style="verb">MLS_COMMIT</spanx>,
and can derive the current membership - specifically the OCM Address in
each leaf node's credential - to determine which Member Servers to
contact.  No proxying through the Group Owner Server is required for
OCM-level communication.</t>

<t>MLS is designed to protect confidentiality and integrity even against a
misbehaving DS.  No single server in this design carries the full DS
role, and no server holds key material by virtue of its DS duties; the
MLS security properties with respect to message confidentiality hold
regardless.</t>

</section>
</section>
<section anchor="how-mls-is-implemented-over-ocm"><name>How MLS is implemented over OCM</name>

<t><list style="symbols">
  <t><strong>MLS for group key management only.</strong> MLS establishes and rotates a
shared group key.  The only MLS application messages used in this
protocol carry wrapped file keys (<xref target="key-distribution"/>) and per-server
transport credential updates (<xref target="credential-update"/>).</t>
  <t><strong>At least one MLS leaf per user.</strong> Each user who is a member of a
federated group has at least one MLS leaf node, enabling individual
users to be added and removed independently.  In web-client deployments
the OCM Server manages a single leaf node per user on their behalf.  In
native client deployments each user may have a leaf node per device.</t>
  <t><strong>The OCM Server is a MLS client.</strong> An OCM Server meets the MLS
definition of a client.  For web-client deployments this means key
material is held server-side.  For native client deployments
cryptographic operations SHOULD be performed in the native client.</t>
  <t><strong>Admins approve membership changes.</strong> Every group has one or more
admins (<xref target="admins"/>).  Commits are constructed by admin clients and
arbitrated by the Group Owner Server.  Add proposals and Remove
proposals targeting another user require admin approval; any member may
remove themselves, and Update proposals are committed automatically.</t>
  <t><strong>Encryption is optional.</strong> MLS group management is useful
independently of whether encryption is used.  A federation share MAY be
unencrypted, in which case the <spanx style="verb">encryption</spanx> field is omitted from the
Share Creation Notification and the MLS layer provides only group
membership management.</t>
  <t><strong>FK re-wrap on every epoch change.</strong> After processing an <spanx style="verb">MLS_COMMIT</spanx>
for a group, a sending server MUST re-wrap the current FK of every
resource it shares with that group under the new Group Key and
distribute it via <spanx style="verb">MLS_APPLICATION</spanx> (<xref target="fk-rewrap"/>).  This maintains the
invariant that the current Group Key is always sufficient to unwrap the
current wrapped FK.</t>
  <t><strong>FK rotation on member removal.</strong> On member removal, a sending server
SHOULD additionally rotate the FK for affected resources: generate a new
FK, re-encrypt the resource, and distribute the new wrapped FK to all
groups that share those resources.  FK rotation may also be triggered by
other factors such as periodic key rotation policy or suspected key
compromise.  Member addition does not require FK rotation; the standard
re-wrap is sufficient.</t>
  <t><strong>Key-reuse mode as an alternative.</strong> Where re-encryption on removal
is impractical and where participating servers are mutually trusted
within a formal federation, a sending server MAY instead keep the
existing FK, relying on the standard per-epoch re-wrap alone.</t>
  <t><strong>Sending servers must have group members.</strong> To share a resource with
a group, the sending server must have at least one user who is a member
of that group, allowing it to work out the members to share with, and to
be able to wrap the FK for encrypted shares.  This is by design, to
mitigate spam shares and other abusive behaviour.</t>
  <t><strong>OCM messages are still just OCM messages.</strong> Proposals flow to the
servers of all admins, Commits are arbitrated by the Group Owner Server,
and FK distribution and OCM share notifications flow directly from the
sending server to each Member Server, derived from the sending server's
local view of group membership from the MLS ratchet tree.  No message is
proxied through a single central server.</t>
  <t><strong>Sending servers derive membership from the ratchet tree.</strong> Since
sending servers must have group members, they process all <spanx style="verb">MLS_COMMIT</spanx>
messages and hold the current ratchet tree.  The OCM Address in each
leaf node's credential identifies the corresponding Member Server.  The
sending server uses this to determine which Member Servers to contact
directly for share notifications and FK distribution.</t>
  <t><strong>Push-based FK distribution.</strong> Wrapped file keys are distributed via
<spanx style="verb">MLS_APPLICATION</spanx> directly from the sending server to all current Member
Servers, at share creation and after every epoch transition
(<xref target="fk-rewrap"/>).  Member Servers always hold the current wrapped FK for
each resource and use their current Group Key to unwrap it at access
time.</t>
  <t><strong>Minimal protocol surface.</strong> The <spanx style="verb">shareType: "federation"</spanx> value
already defined in the OCM specification is used without modification,
with <spanx style="verb">shareWith</spanx> carrying the group's OCM Address.  A federation share
is otherwise a standard OCM share, carrying every field REQUIRED by
[OCM] including the <spanx style="verb">protocol</spanx> object.  All new server-to-server
messages use the existing <spanx style="verb">/notifications</spanx> endpoint with new
<spanx style="verb">notificationType</spanx> values.  A single new field is added to the Share
Creation Notification: <spanx style="verb">encryption</spanx> (optional, present only for
encrypted resources), carrying all encryption-related parameters,
including the <spanx style="verb">resourceId</spanx>.</t>
</list></t>

</section>
<section anchor="discovery"><name>Discovery</name>

<t>A server signals support for federation shares by including
<spanx style="verb">"federation"</spanx> in the <spanx style="verb">shareTypes</spanx> array for a given resource type in
its OCM discovery document at <spanx style="verb">/.well-known/ocm</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "enabled": true,
  "apiVersion": "1.4.0",
  "endPoint": "https://cloud.example.org/ocm",
  "provider": "Example Cloud",
  "resourceTypes": [
    {
      "name": "file",
      "shareTypes": ["user", "group", "federation"],
      "protocols": { "webdav": "/webdav/", "webdav-receive": {} }
    }
  ]
}
]]></sourcecode></figure>

<t>No additional discovery fields are introduced.  The notifications
endpoint is derived as <spanx style="verb">&lt;endPoint&gt;/notifications</spanx> per the base OCM
specification.  The KeyPackage endpoint is derived as
<spanx style="verb">&lt;endPoint&gt;/mls-key-packages</spanx>.</t>

<t>A server that advertises <spanx style="verb">"federation"</spanx> MUST be able to receive OCM
Notifications, since all MLS lifecycle messages are delivered as
notifications, and SHOULD include <spanx style="verb">"notifications"</spanx> in its
<spanx style="verb">capabilities</spanx> array.</t>

</section>
<section anchor="keypackage-distribution"><name>KeyPackage Distribution</name>

<t>Each OCM Server acting as an MLS client generates and maintains
KeyPackages for its users and exposes them at:</t>

<figure><artwork><![CDATA[
GET <endPoint>/mls-key-packages?userId={userId}
]]></artwork></figure>

<t>Response:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "userId": "alice@cloud.example.org",
  "keyPackages": [
    {
      "mediaType": "message/mls",
      "encoding": "base64url",
      "content": "<base64url-encoded MLS KeyPackage>"
    }
  ]
}
]]></sourcecode></figure>

<t>Requests to this endpoint MUST be signed using HTTP Message Signatures
[RFC9421] (<xref target="security-considerations"/>).</t>

<t>In native client deployments, the user's device generates KeyPackages
and publishes them to the home server, which exposes them at the same
endpoint without interpreting them.</t>

<t>Each KeyPackage contains an MLS Credential identifying the user by their
OCM Address, signed by the user's own signing key pair.  Users who
require stronger isolation of key material from their server should use
a native client implementation.</t>

<t>KeyPackages MUST be one-time use, with the exception of a designated
"last resort" KeyPackage ([RFC9420] Section 16.8).  The server MUST
remove a KeyPackage after it has been delivered.  Servers SHOULD
pre-generate multiple KeyPackages per user to support concurrent group
additions, MAY designate a last resort KeyPackage per user to be
returned when all single-use KeyPackages are exhausted, and SHOULD
rate-limit KeyPackage requests, so that an attacker cannot block a
user's addition to groups by exhausting their KeyPackages.  KeyPackages
carry a leaf node lifetime, and applications MUST define a maximum total
lifetime they accept ([RFC9420] Section 7.2).</t>

<t>The <spanx style="verb">userId</spanx> fields defined in this document carry the user's full OCM
Address, not the bare identifier that [OCM] calls <spanx style="verb">userID</spanx>; the full
address is required because these messages routinely cross server
boundaries.</t>

</section>
<section anchor="group-lifecycle"><name>Group Lifecycle</name>

<t>The group lifecycle is entirely independent of other OCM lifecycles
(token-exchange, shares, invitations etc.).  Members are added and
removed through MLS group operations conveyed via the <spanx style="verb">/notifications</spanx>
endpoint.</t>

<section anchor="group-creation"><name>Group Creation</name>

<t>The creating server creates an MLS group on behalf of one of its users
and initialises leaf nodes for each of its users who are initial
members.  The creating user becomes the group's first admin
(<xref target="admins"/>), making the creating server the initial Group Owner Server.
No notifications are required for this step.  The group becomes
addressable at its OCM Address immediately upon creation.</t>

<t>The group's OCM Address is minted under the creating server's domain,
which guarantees its uniqueness, and MUST NOT change for the lifetime of
the group.  It is a label only: no protocol message is routed based on
it, and it remains valid even after the Group Owner Server role has
moved to another server.  The MLS <spanx style="verb">group_id</spanx> SHOULD be a fresh random
value, as recommended by [RFC9420] Section 11.</t>

<t>The creator selects the group's MLS cipher suite based on the
capabilities advertised in the prospective members' KeyPackages
([RFC9420] Section 11).  Implementations of this document MUST support
the mandatory-to-implement MLS cipher suite
MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519 ([RFC9420] Section 17.1).</t>

</section>
<section anchor="admins"><name>Group Admins</name>

<t>Every group has a set of admins: users who administer the group
membership.  The user who creates the group is its first admin, and an
admin MAY appoint further admins.  Admins are ordinary group members and
MAY be homed on any Member Server.  An admin's MLS clients are referred
to as admin clients.</t>

<t>Commits MUST be constructed and signed by admin clients.  This is an
application-level policy on top of MLS, as anticipated by [RFC9420]
Section 16.11, and it is enforced at two points.  First, the Group Owner
Server MUST reject Commits submitted by any other client.  Second, every
Member Server processing an <spanx style="verb">MLS_COMMIT</spanx> MUST verify that the Commit is
signed by an admin client: a Commit is signed by the leaf indicated in
its sender field ([RFC9420] Section 6.1), and the credential at that
leaf, in the ratchet tree of the epoch in which the Commit was created,
must identify a user listed in <spanx style="verb">admins</spanx> (<xref target="admin-set"/>) as of that same
epoch.  A Commit that fails this check MUST be rejected, regardless of
which server broadcast it.  Because the admin set is part of the
GroupContext, every member performs this check locally; acceptance of a
Commit does not rely on trusting the Group Owner Server.</t>

<t>Proposals are handled according to the following policy:</t>

<t><list style="symbols">
  <t>An Add proposal, or a Remove proposal targeting a leaf that does not
belong to the proposing user, MUST be explicitly approved by an admin
before an admin client commits it, unless both are part of a rejoin pair
as described below.  This places a human in the loop for changes that
grant or revoke another party's access.</t>
  <t>A Remove proposal targeting a leaf that belongs to the proposing user
(self-removal) does not require admin approval.  Any member MAY leave a
group at any time, and admin clients SHOULD commit self-removal
proposals automatically.</t>
  <t>A rejoin pair - a Remove of a leaf together with an Add of a fresh
KeyPackage whose credential carries the same OCM Address as the removed
leaf's credential (<xref target="rejoin"/>) - is identity-preserving and grants no
new party access.  It does not require explicit admin approval, and
admin clients SHOULD commit rejoin pairs automatically.</t>
  <t>Update proposals do not require admin approval, and admin clients
SHOULD commit pending Update proposals automatically whenever they are
online.</t>
</list></t>

<t>The group MUST have at least one admin at all times.  A proposal that
would remove the last admin, including a self-removal, MUST be rejected
by the Group Owner Server until another admin has been appointed.</t>

<t>Removing an admin from the group and removing an admin from the admin
set are distinct operations; when an admin's membership ends, a single
Commit combines them (<xref target="admin-set"/>).  An admin MAY instead resign from
the admin set while remaining a member: this is a GroupContextExtensions
proposal only, and the resigning admin's own client MAY commit it.
Removing an admin's membership is constrained by MLS: a Commit that
removes its own committer is invalid ([RFC9420] Section 12.2).  A Commit
that removes some but not all of an admin's leaves MAY be committed by
one of that admin's remaining clients, but a Commit that removes an
admin's last leaf is necessarily committed by an admin client of a
different admin.</t>

<section anchor="admin-set"><name>Group OCM Address and Admin Set</name>

<t>The group's OCM Address and the admin set are part of the group state,
carried in a GroupContext extension <spanx style="verb">ocm_federated_group</spanx> ([RFC9420]
Section 13.4):</t>

<figure><artwork><![CDATA[
struct {
  opaque ocm_address<V>;
} Admin;

struct {
  opaque group_ocm_address<V>;
  Admin admins<V>;
} OCMFederatedGroup;
]]></artwork></figure>

<t>All addresses are UTF-8 encoded OCM Addresses.  The <spanx style="verb">group_ocm_address</spanx>
field carries the group's OCM Address and MUST NOT change for the
lifetime of the group.</t>

<t>The <spanx style="verb">admins</spanx> list is ordered by appointment: a newly appointed admin is
appended at the end, a departing admin is deleted by the same Commit
that ends their membership or admin role (see below), and the list MUST
NOT otherwise be reordered.  The home server of the first admin in the
list is the current Group Owner Server.  Succession is therefore
automatic: when the first admin leaves the group or resigns as admin,
the home server of the next admin in the list becomes the Group Owner
Server.  For example, if alice on server1 creates the group and appoints
bob on server2 and then charlie on server3, the list is (alice, bob,
charlie) and server1 is the Group Owner Server; after bob leaves it is
(alice, charlie); after alice then leaves it is (charlie,) and server3
is the Group Owner Server.</t>

<t>An admin client is any MLS client whose leaf credential identifies a
user listed in <spanx style="verb">admins</spanx>.  Because this extension is part of the
GroupContext, it is agreed upon by all members through the MLS key
schedule, every member can verify which clients are entitled to
construct Commits and which server arbitrates them, and new members
learn the group's OCM Address and admin set from the GroupInfo in their
Welcome.  Changes to the admin set are made with a
GroupContextExtensions proposal ([RFC9420] Section 12.1.7); such
proposals MUST be explicitly approved by an admin, MUST be committed by
an admin client, and MUST NOT change <spanx style="verb">group_ocm_address</spanx>.</t>

<t>The admin set and the group membership are coupled: an entry in <spanx style="verb">admins</spanx>
is only meaningful while that admin has at least one leaf in the ratchet
tree.  A Commit after whose application an admin would no longer have
any leaf in the ratchet tree MUST therefore also include a
GroupContextExtensions proposal deleting that admin from <spanx style="verb">admins</spanx>, and
the Group Owner Server and all Member Servers MUST reject a Commit that
would leave an entry in <spanx style="verb">admins</spanx> with no corresponding leaf in the tree.
(A rejoin pair (<xref target="rejoin"/>) that replaces an admin's leaf does not
trigger this rule, since the admin retains a leaf after the Commit.)
Because a GroupContextExtensions proposal replaces the extension list
wholesale ([RFC9420] Section 12.1.7), the proposal carries the complete
new <spanx style="verb">OCMFederatedGroup</spanx> value, with the departing admin deleted and
<spanx style="verb">group_ocm_address</spanx> unchanged.  A GroupContextExtensions proposal whose
only change to the admin set is deleting admins whose leaves are removed
in the same Commit requires no separate admin approval; it follows the
approval status of the Remove proposals it accompanies, so that the
self-removal of an admin can still be committed automatically.</t>

<t>Clients implementing this document MUST list the <spanx style="verb">ocm_federated_group</spanx>
extension type in the <spanx style="verb">capabilities.extensions</spanx> field of their
KeyPackages, since GroupContext extensions must be supported by every
member of the group ([RFC9420] Section 13.4).</t>

</section>
</section>
<section anchor="failover"><name>Group Owner Server Failover</name>

<t>The Group Owner Server can become unavailable, leaving the group without
an arbiter and therefore unable to advance its epoch.  Leaf staleness
(<xref target="leaf-key-updates"/>) anchors the failover trigger: the absence of
committed Updates from a leaf is part of the group state that all
members observe identically.  The other trigger condition, the absence
of broadcast Commits, is necessarily observer-dependent - a server that
missed a broadcast cannot distinguish silence from loss - which is why
divergent failover decisions are tolerated and resolved
deterministically in step 3 below.</t>

<t>In addition to the update deadline, groups MUST define a takeover time
T.  T MUST be longer than the update deadline, so that the staleness of
the first admin's leaf is observable before takeover is permitted.
Failover proceeds as follows:</t>

<t><list style="numbers" type="1">
  <t>Trigger: no <spanx style="verb">MLS_COMMIT</spanx> has been broadcast for time T, and the
first admin's leaf is stale.</t>
  <t>Takeover: the home server of the next admin in the admin set MAY
begin arbitrating Commits.  The first Commit it arbitrates SHOULD
cover Remove proposals evicting the stale first admin's leaves, together
with the GroupContextExtensions proposal deleting them from the admin
set required by <xref target="admin-set"/>, constructed by one of its own admin
clients.  This makes the takeover permanent through the normal
succession rule.</t>
  <t>Conflict resolution: if a Member Server receives two different
Commits for the same epoch from two arbiters, it MUST process the
one arbitrated by the server of the admin listed earlier in the admin
set and discard the other.</t>
  <t>Hold-back: a Member Server that has observed the trigger conditions
of step 1 SHOULD retain the previous epoch's group state when
processing a Commit, so that it can revert and reprocess the winning
Commit if conflict resolution later discards the one it processed first.
Retained state MUST be deleted after a bounded time, per [RFC9420]
Section 14; the security trade-off is discussed in Security
Considerations.</t>
  <t>Rejoin: a Member Server that processed a discarded Commit and no
longer holds the state needed to reprocess the winning Commit has
drifted from the group.  It recovers through the rejoin procedure
(<xref target="rejoin"/>).  Wrapped FKs are re-wrapped and redistributed by their
sending servers in the new epoch as usual (<xref target="fk-rewrap"/>).</t>
</list></t>

<t>Since an unavailable arbiter only pauses membership changes, while
sharing, resource access, and FK distribution continue to operate, the
takeover time T MAY be generous, for example several hours.  Loose time
synchronisation between servers is sufficient and is already assumed by
MLS for leaf node lifetimes ([RFC9420] Section 7.2).</t>

</section>
<section anchor="mls-notification-types"><name>MLS Notification Types</name>

<t>All MLS group lifecycle messages are sent as OCM Notifications to
<spanx style="verb">&lt;endPoint&gt;/notifications</spanx> using HTTP POST with <spanx style="verb">Content-Type:
application/json</spanx> and HTTP Signatures [RFC9421].</t>

<t>Proposals and Commits MUST be encoded as PublicMessage objects
([RFC9420] Section 6.2), and Application Messages as PrivateMessage
objects ([RFC9420] Section 6.3).  Handshake messages are sent in the
clear at the MLS layer because the servers that route and arbitrate them
are required to track the public group state - the ratchet tree and
GroupContext - in order to derive membership for share routing, resolve
shares to local users, and verify that Commits are signed by admin
clients; in native client deployments those servers do not hold the
group's secrets.  A recipient that holds the group's secrets MUST verify
the membership_tag on a PublicMessage ([RFC9420] Section 6.2); a server
relaying or arbitrating without group secrets verifies what it can,
namely the signature against the sender's leaf in its copy of the
ratchet tree and the policy checks of <xref target="admins"/>.  The confidentiality
trade-off relative to encrypted handshake messages is discussed in
Security Considerations.</t>

<t>The notification types defined in this document are group-scoped rather
than share-scoped.  [OCM] requires a <spanx style="verb">providerId</spanx> field in notifications
because the notification types it defines all refer to a Share; the MLS
notification types refer to a group instead, so this document updates
that requirement: <spanx style="verb">providerId</spanx> is REQUIRED only for notification types
that refer to a Share, and the MLS notification types omit it.  All
MLS-specific parameters are carried inside the <spanx style="verb">notification</spanx> object
that [OCM] provides for type-specific parameters.  The <spanx style="verb">mlsGroupId</spanx>
field carries the base64url-encoded MLS <spanx style="verb">group_id</spanx> as advisory routing
information, used to dispatch the message to the right group state
without parsing the MLS message; the authoritative <spanx style="verb">group_id</spanx> is the one
inside the MLS message itself, and a mismatch between the two MUST be
treated as an error.  At the OCM layer, groups are otherwise identified
by their OCM Address: in particular, the <spanx style="verb">groupId</spanx> field of the
application data carried inside <spanx style="verb">MLS_APPLICATION</spanx> messages
(<xref target="key-distribution"/>, <xref target="credential-update"/>) is the group's OCM
Address, never the MLS <spanx style="verb">group_id</spanx>.</t>

<t>Since <spanx style="verb">MLS_PROPOSAL</spanx> is delivered only to Admin Servers and never
broadcast to other Member Servers, Member Servers never observe pending
proposals.  Proposals covered by a Commit are instead redistributed
together with that Commit, as described under <spanx style="verb">MLS_COMMIT</spanx> below.  Admin
clients, as the only committers (<xref target="admins"/>), MUST satisfy all
considerations of [RFC9420] Section 12.4.</t>

<section anchor="mlswelcome"><name>MLS_WELCOME</name>

<t>Sent to a Member Server when one of its users is added to the group.
The Welcome is constructed by the admin client that created the
corresponding Commit ([RFC9420] Section 12.4.3.1) and delivered by that
admin's home server directly to the added user's server, after the Group
Owner Server has accepted the Commit.  Delivers the MLS Welcome message
for the added user, enabling the receiving MLS client to initialise its
state and derive the current Group Key.  A single <spanx style="verb">MLS_COMMIT</spanx> covering
multiple Add proposals will result in one <spanx style="verb">MLS_WELCOME</spanx> notification per
added user.</t>

<figure><sourcecode type="json"><![CDATA[
{
  "notificationType": "MLS_WELCOME",
  "notification": {
    "mlsGroupId": "<base64url MLS group ID>",
    "userId": "bob@othercloud.example.org",
    "content": "<base64url MLS Welcome wire format>"
  }
}
]]></sourcecode></figure>

<t>The Welcome message MUST include the group's ratchet tree in a
<spanx style="verb">ratchet_tree</spanx> extension ([RFC9420] Section 12.4.3.3).  By default a
Welcome carries only a hash of the tree, and this document defines no
other channel through which a newly added Member Server could obtain it.
Member Servers depend on holding the current ratchet tree, both to
derive the group membership and to process subsequent Commits.  Carrying
the tree inside the Welcome also gives it the same confidentiality
protection as the rest of the group state, as recommended by [RFC9420]
Section 12.4.3.3.</t>

<t>A Member Server processing a Welcome learns the group's OCM Address from
the <spanx style="verb">ocm_federated_group</spanx> extension in the GroupContext (<xref target="admin-set"/>).
It MUST reject a Welcome whose <spanx style="verb">group_ocm_address</spanx> is already bound to a
different MLS <spanx style="verb">group_id</spanx>, unless the Welcome reinitialises the group as
described in <xref target="reinit"/>.  This keeps the local wrapped FK store, keyed
by <spanx style="verb">(resourceId, groupId)</spanx>, unambiguous.</t>

</section>
<section anchor="mlsproposal"><name>MLS_PROPOSAL</name>

<t>Sent by a Member Server to the home server of every admin to propose a
group change (for example Add, Remove, Update, GroupContextExtensions,
or ReInit) on behalf of one of its users.  This notification is NOT
broadcast to other Member Servers.  Each Admin Server queues received
proposals, deduplicated by ProposalRef ([RFC9420] Section 5.2), for
handling by its admin clients according to the policy in <xref target="admins"/>.
Sending the proposal to all Admin Servers removes the dependency on any
single server being available and lets whichever admin is online next
act on it.</t>

<figure><sourcecode type="json"><![CDATA[
{
  "notificationType": "MLS_PROPOSAL",
  "notification": {
    "mlsGroupId": "<base64url MLS group ID>",
    "content": "<base64url MLS PublicMessage carrying the Proposal>"
  }
}
]]></sourcecode></figure>

</section>
<section anchor="mlscommit"><name>MLS_COMMIT</name>

<t>Constructed and signed by an admin client (<xref target="admins"/>) and submitted to
the Group Owner Server, which accepts at most one Commit per epoch, MUST
reject Commits submitted by non-admin clients, and broadcasts the
accepted Commit to all Member Servers to advance the group epoch.  An
admin client whose Commit is rejected discards it and MAY construct a
new Commit on the resulting epoch ([RFC9420] Section 14).  A Member
Server receiving a broadcast <spanx style="verb">MLS_COMMIT</spanx> MUST verify that the Commit is
signed by an admin client before processing it, as specified in
<xref target="admins"/>, and MUST reject it otherwise, regardless of which server
broadcast it.  Commits are ordered by the MLS epoch itself: each Commit
advances the epoch by exactly one, so Member Servers MUST process
Commits in epoch order, and a Commit arriving for an epoch later than
the next expected one indicates one or more missed Commits.  Member
Servers MUST apply the new epoch secret before sending any application
data, per [RFC9420] Section 15.2.</t>

<figure><sourcecode type="json"><![CDATA[
{
  "notificationType": "MLS_COMMIT",
  "notification": {
    "mlsGroupId": "<base64url MLS group ID>",
    "proposals": ["<base64url MLS PublicMessage carrying a Proposal>"],
    "content": "<base64url MLS PublicMessage carrying the Commit>"
  }
}
]]></sourcecode></figure>

<t>A Commit covers each proposal either by value or by reference ([RFC9420]
Section 12.4).  Proposals included by value are carried inside the
Commit itself and are necessarily proposals originated by the committing
admin client, since a by-value proposal carries no sender of its own.
Proposals received from Member Servers via <spanx style="verb">MLS_PROPOSAL</spanx> - in
particular Update proposals, which can only be applied relative to their
original sender's leaf - are covered by reference, and receiving Member
Servers need the original proposal messages in order to validate and
apply the Commit ([RFC9420] Sections 12.1 and 12.4.2).  The <spanx style="verb">proposals</spanx>
array therefore carries every proposal covered by reference, verbatim as
originally sent by their proposers, in the order in which the
corresponding references appear in the Commit.  It MUST be present
whenever the Commit covers at least one proposal by reference and MAY be
omitted otherwise.  A Member Server processing an <spanx style="verb">MLS_COMMIT</spanx> MUST
process the carried proposals before processing the Commit itself.</t>

<t>The <spanx style="verb">MLS_COMMIT</spanx> serves as the signal to all sending servers that the
epoch has advanced: each sending server then re-wraps and redistributes
the FKs of the resources it shares with the group (<xref target="fk-rewrap"/>), and
on member removal MAY additionally rotate them according to its policy
(<xref target="fk-rotation"/>).  Any Commit covering a Remove, Update, or
GroupContextExtensions proposal MUST include an UpdatePath ([RFC9420]
Section 12.4).</t>

</section>
<section anchor="mlsapplication"><name>MLS_APPLICATION</name>

<t>Sent by a sending server directly to Member Servers, derived from the
ratchet tree, to deliver updated wrapped file keys and, optionally,
updated per-server transport credentials (<xref target="credential-update"/>).  No
central relay is involved.  Messages carrying wrapped FKs are sent to
all current Member Servers; messages carrying a transport credential are
sent only to the affected Member Server.  The <spanx style="verb">content</spanx> is a
<spanx style="verb">PrivateMessage</spanx> carrying application data encrypted in the current
epoch ([RFC9420] Section 15).</t>

<figure><sourcecode type="json"><![CDATA[
{
  "notificationType": "MLS_APPLICATION",
  "notification": {
    "mlsGroupId": "<base64url MLS group ID>",
    "content": "<base64url MLS PrivateMessage wire format>"
  }
}
]]></sourcecode></figure>

<t>Ordering is provided by authenticated MLS metadata rather than a
transport counter: the <spanx style="verb">PrivateMessage</spanx> carries the epoch in the clear,
and the sender's leaf and generation counter are learned upon decryption
([RFC9420] Section 6.3).  Since all FK updates for a given <spanx style="verb">(resourceId,
groupId)</spanx> originate from the resource's sending server, the <spanx style="verb">(epoch,
generation)</spanx> pair totally orders them; see <xref target="key-distribution"/>.  A
Member Server that receives an <spanx style="verb">MLS_APPLICATION</spanx> encrypted in an epoch
it has not yet entered SHOULD queue it until the corresponding
<spanx style="verb">MLS_COMMIT</spanx> has been processed.</t>

<t>Because credential-bearing messages are delivered to a single Member
Server, other Member Servers will observe a gap in the sending leaf's
generation counter on the next message they do receive.  Such gaps are
expected and MUST NOT be treated as an error; receivers ratchet forward
past skipped generations as described in [RFC9420] Section 15.3.
Deployments MUST limit the number of generations a receiver will advance
a sender ratchet in response to a single message and reject messages
beyond that limit, bounding the key derivation work a malicious sender
can trigger ([RFC9420] Section 15.3).</t>

</section>
<section anchor="mlsrejoin"><name>MLS_REJOIN</name>

<t>Sent by a drifted Member Server to the home server of every admin to
request re-admission of its users after local MLS state loss
(<xref target="rejoin"/>).  Unlike the other notification types, the content is not
an MLS message: a drifted server holds no usable MLS state, so the
request is authenticated only at the OCM layer, by the HTTP Signature of
the sending server.  Each entry in <spanx style="verb">keyPackages</spanx> carries a fresh MLS
KeyPackage for one affected user, in the same format as entries served
by the KeyPackage endpoint.</t>

<figure><sourcecode type="json"><![CDATA[
{
  "notificationType": "MLS_REJOIN",
  "notification": {
    "mlsGroupId": "<base64url MLS group ID>",
    "keyPackages": [
      {
        "userId": "bob@othercloud.example.org",
        "mediaType": "message/mls",
        "encoding": "base64url",
        "content": "<base64url-encoded MLS KeyPackage>"
      }
    ]
  }
}
]]></sourcecode></figure>

<t>Admin Servers queue rejoin requests alongside proposals and make them
available to their admin clients, which handle them as described in
<xref target="rejoin"/>.  A later rejoin request for the same group and user
supersedes an earlier one; admin clients act on the most recent request.</t>

</section>
</section>
<section anchor="leaf-key-updates"><name>Leaf Key Updates</name>

<t>To maintain post-compromise security ([RFC9420] Section 16.6), Member
Servers SHOULD periodically send <spanx style="verb">MLS_PROPOSAL</spanx> (Update) to the Admin
Servers to rotate their users' leaf keys.  Admin clients SHOULD commit
pending Update proposals automatically whenever they are online, without
user interaction; an Update only achieves post-compromise security once
it has been committed ([RFC9420] Section 16.6).</t>

<t>Groups MUST define an update deadline: the maximum time allowed between
committed Updates of a leaf.  A leaf that has not been updated within
the deadline is stale.  Members with stale leaves SHOULD be removed from
the group per [RFC9420] Section 3.2, and stale admins in particular
SHOULD be removed promptly: an admin whose clients no longer update
cannot commit, and a stale first admin additionally blocks Commit
arbitration until failover (<xref target="failover"/>).</t>

</section>
<section anchor="rejoin"><name>Rejoin After State Loss</name>

<t>A Member Server can lose its MLS state for a group: it may have
processed a Commit that was later discarded during failover conflict
resolution (<xref target="failover"/>) and already deleted the superseded epoch's
secrets per the deletion schedule ([RFC9420] Section 9.2), or its stored
state may be lost or corrupted for any other reason.  Such a server has
drifted from the group: it can no longer process Commits or decrypt
Application Messages, and because MLS messages are bound to the current
GroupContext, it cannot sign a valid Proposal with which to recover.  A
drifted server detects its condition when an <spanx style="verb">MLS_COMMIT</spanx> fails to
process against its local state, for example through a confirmation tag
mismatch, or arrives for an epoch it cannot reach after Commit
retransmission has been exhausted.</t>

<t>Recovery is mediated by an admin client through the normal Commit path:</t>

<t><list style="numbers" type="1">
  <t>The drifted server discards its MLS state for the group and
generates a fresh KeyPackage for each of its users who are members
of the group.</t>
  <t>It sends an <spanx style="verb">MLS_REJOIN</spanx> notification carrying those KeyPackages to
the home server of every admin.  The notification is authenticated
at the OCM layer with HTTP Signatures [RFC9421], the same trust anchor
that authenticates KeyPackage distribution itself, so a rejoin request
is exactly as trustworthy as a freshly fetched KeyPackage.</t>
  <t>An admin client verifies that each KeyPackage's credential carries
the OCM Address of a leaf currently in the ratchet tree, and that
the notification was signed by the server named in those OCM Addresses.
A rejoin MUST NOT admit a user without a leaf in the tree; it can only
replace existing members.</t>
  <t>The admin client constructs a single Commit containing, by value, a
Remove proposal for each stale leaf and an Add proposal for the
corresponding fresh KeyPackage.  This rejoin pair preserves the OCM
Address of every affected leaf and grants no new party access, so admin
clients SHOULD commit it automatically, per the policy in <xref target="admins"/>.</t>
  <t>The Commit is arbitrated and broadcast as usual, and the drifted
server receives one <spanx style="verb">MLS_WELCOME</spanx> per re-added user, restoring clean
state from the Welcome's <spanx style="verb">ratchet_tree</spanx> extension.</t>
</list></t>

<t>A single Commit recovers all of the drifted server's users at once.
Until the rejoin completes, the drifted server can continue to serve
resources whose wrapped FKs it received before the fork, using the Group
Key of the last epoch it processed; wrapped FKs distributed after the
fork become accessible when the re-wrap following the rejoin Commit
(<xref target="fk-rewrap"/>) arrives.</t>

</section>
<section anchor="reinit"><name>Group Reinitialisation</name>

<t>Reinitialisation ([RFC9420] Section 11.2) replaces a group with a new
MLS group with the same membership and the same OCM Address but
different parameters: a new MLS version, cipher suite, or extension set,
and necessarily a fresh MLS <spanx style="verb">group_id</spanx>.  It is the migration path for
cryptographic agility, for example moving a long-lived group to a
stronger cipher suite.</t>

<t>A ReInit proposal is a group parameter change and is handled like other
group-changing proposals: it MUST be explicitly approved by an admin and
MUST be committed by an admin client.  Per [RFC9420] Section 12.2, a
ReInit proposal is committed alone.  The <spanx style="verb">extensions</spanx> field of the
ReInit proposal MUST include an <spanx style="verb">ocm_federated_group</spanx> extension with
<spanx style="verb">group_ocm_address</spanx> unchanged; the admin set is normally carried over
unchanged.</t>

<t>After the ReInit Commit is processed, the old group MUST NOT be used to
send messages ([RFC9420] Section 12.4.2).  In particular, sending
servers MUST NOT send <spanx style="verb">MLS_APPLICATION</spanx> messages in the old group; the
per-epoch re-wrap obligation (<xref target="fk-rewrap"/>) arising from the ReInit
Commit is deferred to the new group.</t>

<t>The admin client that committed the ReInit SHOULD create the new group:
it fetches fresh KeyPackages, valid for the new version and cipher
suite, for every member of the old group, creates the new group with an
initial Commit re-admitting them, and sends each member a Welcome
carrying a PreSharedKeyID of type resumption with usage reinit, as
specified by [RFC9420] Section 11.2.  The Add proposals of this initial
Commit re-admit the old group's members and require no separate admin
approval.  If the committing admin client fails to complete this step in
reasonable time, any other admin client MAY do so instead.  If a Member
Server receives competing reinitialisation Welcomes for the same
<spanx style="verb">group_ocm_address</spanx>, it MUST accept the one whose new group was created
by the admin listed earliest in the old group's admin set and reject the
others.</t>

<t>A Member Server processing a reinitialisation Welcome MUST perform the
verifications of [RFC9420] Section 12.4.3.1 for usage reinit: the last
Commit of the old group contains the ReInit proposal, the new group's
parameters match it, and every member of the old group is a member of
the new group, where members are equivalent if their leaf credentials
carry the same OCM Address.  It MUST additionally verify that the
<spanx style="verb">group_ocm_address</spanx> of the new group equals that of the old group.  On
success it rebinds the OCM Address from the old <spanx style="verb">group_id</spanx> to the new
one; this is the only case in which that binding may change.  Because
the local wrapped FK store is keyed by the group's OCM Address, stored
entries carry over unchanged.</t>

<t>After joining the new group, a sending server MUST re-wrap the FK of
every resource it shares with the group under the new group's Group Key
and redistribute the wrapped FKs to all Member Servers, exactly as for
an epoch change (<xref target="fk-rewrap"/>).  The new group's Group Key differs from
any key of the old group both through the fresh epoch secret and through
the new <spanx style="verb">group_id</spanx> in the Exporter context, so no wrapped FK from the
old group can be unwrapped in the new one.  Until the re-wrapped FKs
arrive, Member Servers retain the old group's last Group Key under the
same retention rule as for an epoch change.  Members SHOULD retain the
resumption PSK of the old group's final epoch until the reinitialisation
has completed ([RFC9420] Section 8.6).</t>

</section>
</section>
<section anchor="encryption-model"><name>Encryption Model</name>

<section anchor="group-key-derivation"><name>Group Key Derivation</name>

<t>After processing any MLS Welcome or Commit, the MLS client MUST apply
the new epoch secret before encrypting any application data, then
derives the current Group Key:</t>

<figure><artwork><![CDATA[
group_key = MLS-Exporter("ocm-group-key", group_id_bytes, AEAD.Nk)
]]></artwork></figure>

<t><spanx style="verb">AEAD.Nk</spanx> is the length in bytes of a key for the AEAD algorithm of the
group's negotiated MLS cipher suite ([RFC9420] Section 9.1).  Deriving
the Group Key at exactly this length makes it a valid key for the wrap
AEAD (<xref target="file-key-wrapping"/>), which is the AEAD algorithm of the group's
cipher suite, for every cipher suite, including those whose AEAD takes a
16-byte key such as AES-128-GCM.</t>

<t>The MLS Exporter ([RFC9420] Section 8.5) produces application-specific
key material from the epoch secret without exposing the epoch secret
itself.  The label <spanx style="verb">"ocm-group-key"</spanx> scopes the output to this
application.  The <spanx style="verb">group_id_bytes</spanx> context, the raw MLS <spanx style="verb">group_id</spanx> of
the group, further binds the output to this specific group.  The Group
Key therefore changes with every epoch transition and cannot be derived
by any party that did not participate in that epoch.</t>

<t>Per [RFC9420] Section 8.5, the Group Key SHOULD be refreshed after each
processed Commit.  Security-sensitive values derived from the epoch
secret MUST be deleted as soon as they are consumed, per [RFC9420]
Section 9.2.</t>

<t>All MLS clients in the group independently derive the same Group Key for
a given epoch.</t>

</section>
<section anchor="resource-id"><name>Resource Id</name>

<t>The <spanx style="verb">resourceId</spanx> used in the AEAD associated data MUST be a stable
identifier for the underlying file, consistent across all groups it is
shared with.  It identifies the resource, not a particular version of
it. This ensures that the FK unwrapped by members of any group correctly
decrypts the same ciphertext.  The <spanx style="verb">providerId</spanx> values in separate share
notifications, for the same resource, MUST differ, per the <spanx style="verb">providerId</spanx>
definition in [OCM], but the <spanx style="verb">resourceId</spanx> in the AEAD associated data
MUST be the same.  This means that the <spanx style="verb">providerId</spanx> MUST NOT be reused
as <spanx style="verb">resourceId</spanx>.  The sending server is responsible for maintaining this
stable <spanx style="verb">resourceId</spanx> and MUST send it in the <spanx style="verb">encryption</spanx> object of the
share payload (<xref target="share-creation"/>).</t>

</section>
<section anchor="file-key-wrapping"><name>File Key Wrapping</name>

<t>Two AEAD algorithms are involved in protecting a resource, and they are
deliberately decoupled.  The content AEAD encrypts the resource itself:
it is chosen by the sending server from the AEAD algorithms defined for
HPKE ([RFC9180] Section 7.3), it is fixed for the lifetime of a
ciphertext and identical across all groups the resource is shared with,
and it is identified explicitly by the <spanx style="verb">cipher</spanx> field of the
<spanx style="verb">encryption</spanx> object (<xref target="share-creation"/>).  The wrap AEAD protects the FK
in transit: it is always the AEAD algorithm of the respective group's
MLS cipher suite, keyed with that group's Group Key, and may therefore
differ between groups that share the same resource.</t>

<t>When sharing an encrypted resource with a group, the sending MLS client
acts on behalf of a user who is a member of that group:</t>

<t><list style="numbers" type="1">
  <t>Chooses the content AEAD and generates a random per-file key (FK)
whose length is the key length of that algorithm.</t>
  <t>Encrypts the resource with FK using the content AEAD.
Implementations supporting native client decryption of large files
SHOULD use a chunked AEAD construction to enable streaming decryption.</t>
  <t>Derives the current Group Key from the user's local MLS state.</t>
  <t>Wraps FK using the wrap AEAD:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
wrapped_file_key = AEAD-Encrypt(
  key       = group_key,
  nonce     = random_nonce,
  plaintext = FK,
  aad       = FKWrapAAD
)
]]></artwork></figure>
  <vspace blankLines='1'/>
where the associated data is the serialisation of the following
structure, in the presentation language of [RFC9420]:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
struct {
  opaque group_ocm_address<V>;
  opaque resource_id<V>;
} FKWrapAAD;
]]></artwork></figure>
  <vspace blankLines='1'/>
The <spanx style="verb">group_ocm_address</spanx> field is the UTF-8 encoding of the group's
OCM Address (the same value carried in the <spanx style="verb">shareWith</spanx> field of the
share notification) and <spanx style="verb">resource_id</spanx> is the UTF-8 encoding of the
<spanx style="verb">resourceId</spanx> field of the <spanx style="verb">encryption</spanx> object.  The length-prefixed
encoding makes the pair unambiguous; raw concatenation of the two
strings would allow distinct (address, identifier) pairs to produce
identical associated data.  The MLS <spanx style="verb">group_id</spanx> is NOT used in the
associated data.</t>
  <t>Sends an <spanx style="verb">MLS_APPLICATION</spanx> notification directly to all current
Member Servers, carrying the wrapped FK keyed by <spanx style="verb">(resourceId,
groupId)</spanx>.</t>
</list></t>

</section>
<section anchor="fk-rewrap"><name>FK Re-wrap on Epoch Change</name>

<t>The Group Key changes with every epoch transition, whatever the reason
for the transition: a Commit covering Add, Remove, Update, or
GroupContextExtensions proposals, or an empty Commit, all advance the
epoch.  To maintain the invariant that the current Group Key is always
sufficient to unwrap the current wrapped FK, a sending server MUST,
after processing an <spanx style="verb">MLS_COMMIT</spanx> for a group, or after joining the
successor group of a reinitialisation via its Welcome (<xref target="reinit"/>), for
every resource it shares with that group:</t>

<t><list style="numbers" type="1">
  <t>Re-wrap the resource's current FK under the new Group Key, following
the procedure in <xref target="file-key-wrapping"/>.</t>
  <t>Distribute the new wrapped FK to all current Member Servers, derived
from the new ratchet tree, via <spanx style="verb">MLS_APPLICATION</spanx>.</t>
</list></t>

<t>Note that the FK itself is unchanged by this procedure; only its
wrapping is refreshed.  Whether the FK is also rotated is a separate,
removal-triggered policy decision (<xref target="fk-rotation"/>).</t>

<t>If the Commit added one or more members, the set of Member Servers may
have grown.  The sending server MUST identify Member Servers that are
new to the group and send them the Share Creation Notifications for its
federation shares with the group, as described in <xref target="share-creation"/>, in
addition to the wrapped FKs.  A server that joins the group after a
share was created thereby receives both the share itself and a wrapped
FK it can decrypt, since the <spanx style="verb">MLS_APPLICATION</spanx> is encrypted in an epoch
in which it is a member.</t>

<t>Between processing a Commit and receiving the re-wrapped FK for a
resource, a Member Server holds a wrapped FK produced under the previous
epoch's Group Key.  To remain able to serve access requests in this
window, a Member Server SHOULD retain the previous epoch's Group Key
until it has received a strictly newer wrapped FK (<xref target="key-distribution"/>)
for every locally stored <spanx style="verb">(resourceId, groupId)</spanx> pair of that group, or
until a bounded time has elapsed, whichever comes first, and MUST delete
it at that point.  The security trade-off of this retention window is
discussed in Security Considerations.</t>

<t>The volume of <spanx style="verb">MLS_APPLICATION</spanx> traffic produced by this rule grows with
the number of shared resources and the frequency of epoch transitions;
see the batching item in Open Issues.</t>

</section>
<section anchor="key-distribution"><name>Key Distribution via MLS Application Messages</name>

<t>Wrapped file keys are distributed to Member Servers via MLS Application
Messages, <spanx style="verb">PrivateMessage</spanx> objects carrying application data ([RFC9420]
Section 15).  Wrapped FKs are distributed at share creation and
re-distributed after every epoch transition (<xref target="fk-rewrap"/>).  A sending
server MUST process the <spanx style="verb">MLS_COMMIT</spanx> and derive the new Group Key before
sending an <spanx style="verb">MLS_APPLICATION</spanx> with updated wrapped keys, per [RFC9420]
Section 15.2.</t>

<t>The <spanx style="verb">PrivateMessage</spanx> application data is a JSON object carrying the
current wrapped FK for each <spanx style="verb">(resourceId, groupId)</spanx> pair in a <spanx style="verb">keys</spanx>
array, and MAY also carry a <spanx style="verb">credentials</spanx> array (<xref target="credential-update"/>):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "keys": [
    {
      "resourceId": "3a02538b-aa54-42f2-8853-a38996e211b1",
      "groupId": "research-group@receiver.example.org",
      "wrappedKey": "<base64url nonce || wrapped_file_key || tag>"
    }
  ]
}
]]></sourcecode></figure>

<t>The <spanx style="verb">groupId</spanx> field carries the group's OCM Address, matching the
<spanx style="verb">shareWith</spanx> of the corresponding share notification, and the
<spanx style="verb">resourceId</spanx> field matches the <spanx style="verb">resourceId</spanx> in the <spanx style="verb">encryption</spanx> object
of that notification.</t>

<t>The <spanx style="verb">PrivateMessage</spanx> is encrypted using the current epoch's keys, so
only current group members can decrypt it.  A just-removed member cannot
decrypt the Application Message even if they receive the notification,
as they do not hold the new epoch's key material.</t>

<t>Member Servers store the received wrapped FKs locally, keyed by
<spanx style="verb">(resourceId, groupId)</spanx>, always replacing any previous wrapped FK for
the same pair with the latest one.  "Latest" is defined by the
authenticated <spanx style="verb">(epoch, generation)</spanx> of the enclosing <spanx style="verb">PrivateMessage</spanx>,
compared lexicographically, not by arrival order: a stored wrapped FK
MUST only be replaced by one with a strictly higher <spanx style="verb">(epoch,
generation)</spanx>.  A sending server MUST send all FK updates for a given
group through a single MLS leaf within any given epoch, since generation
counters are maintained per leaf; updates from a later epoch always
supersede updates from an earlier epoch regardless of leaf.  MLS
Application Messages may be delayed or reordered in transit ([RFC9420]
Section 15.3); a Member Server that receives an out-of-order
<spanx style="verb">MLS_APPLICATION</spanx> simply ignores wrapped FKs that are not newer than
those it already holds.  At access time, the Member Server uses its
current Group Key, derived from its current MLS state for the identified
group, to unwrap the FK.</t>

</section>
<section anchor="credential-update"><name>Transport Credential Updates</name>

<t>The per-server transport credential of a share (<xref target="share-creation"/>) may
need to be rotated during the lifetime of the share.  In particular, in
native client deployments the user's device interacts directly with the
sending server and therefore holds its server's credential, so when such
a user is removed from the group, the credential of their server can no
longer be considered private to that server's remaining users.  On
removal of a member whose clients may have held a server's transport
credential, the sending server SHOULD rotate that server's credential
for every share affected.  Rotation MAY also be triggered by policy or
suspected leakage.</t>

<t>A rotated credential is delivered in an <spanx style="verb">MLS_APPLICATION</spanx> message sent
only to the affected Member Server, carrying a <spanx style="verb">credentials</spanx> array in
the application data:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "credentials": [
    {
      "providerId": "7c084226-d9a1-11e6-bf26-cec0c932ce01",
      "groupId": "research-group@receiver.example.org",
      "recipient": "othercloud.example.org",
      "sharedSecret": "<new transport credential>"
    }
  ]
}
]]></sourcecode></figure>

<t>Each entry identifies the share by its <spanx style="verb">providerId</spanx>, the group by its
OCM Address in <spanx style="verb">groupId</spanx>, and the intended Member Server by its FQDN in
<spanx style="verb">recipient</spanx>.  A Member Server MUST ignore entries whose <spanx style="verb">recipient</spanx> does
not name itself.  Upon accepting an entry, the Member Server replaces
the stored transport credential for that share; replacement follows the
same <spanx style="verb">(epoch, generation)</spanx> supersede rule as wrapped FKs
(<xref target="key-distribution"/>).  The sending server invalidates the old
credential once the rotation has been delivered.</t>

<t>Encrypting the credential update in the current epoch guarantees that
the removed member cannot read it, independent of transport protection:
they do not hold the new epoch's key material.  Confidentiality with
respect to other Member Servers, by contrast, rests on targeted
delivery: the <spanx style="verb">PrivateMessage</spanx> is decryptable by any group member that
obtains it, so delivering it to the affected server only is a routing
measure, not a cryptographic one (see Security Considerations).</t>

<t>A <spanx style="verb">keys</spanx> array and a <spanx style="verb">credentials</spanx> array MAY appear in the same
application data object when both are destined for the same single
Member Server.</t>

</section>
<section anchor="resource-access"><name>Resource Access</name>

<t>To access a resource:</t>

<t><list style="numbers" type="1">
  <t>The resource is fetched from the sending server using the standard
OCM resource access procedure ([OCM]), with the protocol details and
per-server credential from the <spanx style="verb">protocol</spanx> object of the share
notification.  For an encrypted resource, what is fetched is ciphertext.</t>
  <t>The MLS client identifies the relevant group from the <spanx style="verb">shareWith</spanx>
field of the share notification and looks up the locally stored
<spanx style="verb">wrapped_file_key</spanx> for the <spanx style="verb">(resourceId, groupId)</spanx> pair.</t>
  <t>The MLS client derives the current Group Key from its local MLS
state for that group and unwraps FK using the wrap AEAD of the
group's cipher suite.</t>
  <t>The MLS client decrypts the resource using FK and the content AEAD
named in the <spanx style="verb">cipher</spanx> field of the <spanx style="verb">encryption</spanx> object.</t>
</list></t>

<t>In web-client deployments, decryption happens server-side and the
plaintext is served to the user through whatever access protocol is in
use (WebDAV [RFC4918], SFTP, webapp, etc.).  In native client
deployments, decryption happens on the user's device and the client
interacts directly with the sending server, which serves only
ciphertext.</t>

</section>
<section anchor="resource-modification-by-member-servers"><name>Resource Modification by Member Servers</name>

<t>A common operation is for a user on a Member Server to open a shared
encrypted resource, modify it, and save it back.  The cryptographic flow
is as follows:</t>

<t><list style="numbers" type="1">
  <t>The Member Server fetches the encrypted resource from the sending
server using the standard OCM resource access procedure, with the
credential from the share's <spanx style="verb">protocol</spanx> object.</t>
  <t>The Member Server identifies the relevant group from the <spanx style="verb">shareWith</spanx>
field of the share notification, looks up the locally stored
<spanx style="verb">wrapped_file_key</spanx> for the <spanx style="verb">(resourceId, groupId)</spanx> pair, derives the
current Group Key from its local MLS state for that group, and unwraps
FK.</t>
  <t>The Member Server decrypts the resource using FK and presents the
plaintext to the user.</t>
  <t>The user modifies the resource.</t>
  <t>The Member Server re-encrypts the modified resource using the same
FK and the same content AEAD, but a fresh random nonce.  The nonce
MUST NOT be reused with the same key, as required by AEAD security.</t>
  <t>The Member Server uploads the re-encrypted resource to the sending
server.  This requires the share to grant <spanx style="verb">write</spanx> permission in its
<spanx style="verb">protocol</spanx> object.</t>
</list></t>

<t>The FK is reused across modifications of the same resource because it is
bound to the group's OCM Address and <spanx style="verb">resourceId</spanx> in the AEAD associated
data, making it specific to that resource.  No new <spanx style="verb">MLS_APPLICATION</spanx>
message is needed, as the wrapped FK in all Member Servers' local stores
remains valid for the updated ciphertext.</t>

<t>FK rotation for a resource is only necessary on member removal in
re-encryption mode (<xref target="fk-rotation"/>).</t>

</section>
<section anchor="sharing-a-resource-with-multiple-groups"><name>Sharing a Resource with Multiple Groups</name>

<t>A sending server MAY share the same encrypted resource with more than
one group.  The file is encrypted once, with a single FK and a single
content AEAD; the <spanx style="verb">cipher</spanx> field in every group's share notification
names that same algorithm.  Each group receives its own wrapped FK,
produced with that group's wrap AEAD, Group Key, and OCM Address:</t>

<figure><artwork><![CDATA[
wrapped_file_key_group1 = AEAD-Encrypt(group_key_1, nonce_1, FK,
                  FKWrapAAD(group_ocm_address_1, resource_id))
wrapped_file_key_group2 = AEAD-Encrypt(group_key_2, nonce_2, FK,
                  FKWrapAAD(group_ocm_address_2, resource_id))
]]></artwork></figure>

<t>A separate Share Creation Notification is sent to each Member Server of
each group.  A separate <spanx style="verb">MLS_APPLICATION</spanx> carrying the respective
wrapped FK is broadcast to each group's Member Servers.  Members of each
group can only unwrap the FK using their own group's Group Key and
cannot access the other group's wrapped FK or Group Key.</t>

<t>The sending server MUST maintain a mapping from each resource to all
groups it has been shared with.  This mapping is required to correctly
handle member removal in re-encryption mode, as described in the
following section.</t>

</section>
<section anchor="fk-rotation"><name>FK Rotation (RECOMMENDED)</name>

<t>FK rotation is distinct from the re-wrap performed on every epoch change
(<xref target="fk-rewrap"/>): rotation generates a new FK and re-encrypts the
resource, whereas a re-wrap only refreshes the wrapping of the existing
FK.  A sending server SHOULD rotate the FK for a resource when a member
is removed from any group that has access to it.  FK rotation may also
be triggered by other factors, such as periodic key rotation policy,
regulatory requirements, or a suspected compromise of key material.
Applications SHOULD define a policy for the frequency of FK rotation
independent of membership changes.</t>

<t>When rotating the FK for a resource, the sending server:</t>

<t><list style="numbers" type="1">
  <t>Generates a new FK for the resource.</t>
  <t>Re-encrypts the resource with the new FK.</t>
  <t>For every group that has access to the resource, wraps the new FK
using that group's current Group Key:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
new_wrapped_file_key_groupN = AEAD-Encrypt(group_key_N, nonce_N,
      new_FK, FKWrapAAD(group_ocm_address_N, resource_id))
]]></artwork></figure>
  </t>
  <t>Broadcasts an <spanx style="verb">MLS_APPLICATION</spanx> notification carrying the respective
new wrapped FK directly to each group's Member Servers.</t>
</list></t>

<t>Distributing the new wrapped FK to all groups that share the resource is
necessary because all groups share the same ciphertext.  If only one
group received the new wrapped FK, members of other groups would hold a
wrapped FK that no longer decrypts the current ciphertext.</t>

<t>A member removed from one group but still a member of another group that
shares the same resource retains the ability to decrypt that resource
through the second group.  This is correct and intended behaviour:
access is determined by current group membership, and the user remains a
member of the second group.  The default safe rule is to rotate the FK
and redistribute to all groups on any removal event.  A sending server
MAY instead compare the unique set of users with access before and after
an epoch change, and skip FK rotation if that set is unchanged, for
example because the removed user remains a member of every other group
that has access to the same resource.  Whether this optimisation is
worth the added complexity depends on the nature of the resource and the
frequency of membership changes.</t>

<t>Member addition does not require FK rotation.  The new member receives
the current Group Key via their Welcome, and the re-wrap triggered by
the Add Commit (<xref target="fk-rewrap"/>) delivers a wrapped FK, encrypted in an
epoch in which the new member is a member, that the new member can
unwrap with that Group Key.</t>

</section>
<section anchor="member-removal-key-reuse-mode-optional"><name>Member Removal: Key-reuse Mode (OPTIONAL)</name>

<t>Where re-encryption is impractical, for example due to frequent changes
of very large files, and where all participating servers belong to a
formal federation with explicit governance and mutual trust, a sending
server MAY instead keep the existing FK.  In that case no action beyond
the standard re-wrap on epoch change (<xref target="fk-rewrap"/>) is required: the
Remove Commit advances the epoch, and the sending server re-wraps the
existing FK under the new Group Key and distributes it to the remaining
Member Servers of the affected group.</t>

<t>When a resource is shared with multiple groups, only the epoch of the
group from which the member was removed has advanced, so only that
group's FK wrapping is refreshed.  The wrapped FKs for other groups are
unchanged and remain valid for their respective members.</t>

<t>In this mode, access-follows-membership relies on trust rather than
cryptography: the FK itself is unchanged, so a removed member's server
and, in native client deployments, the removed user's devices, may still
hold the superseded Group Key together with the old wrapped FK, or the
unwrapped FK itself, any of which decrypts the unchanged ciphertext.
Key-reuse mode therefore relies on trusting servers to discard key
material they are no longer entitled to after a Remove Commit.  A
removed member who is also a member of another group that has access to
the same resource will still be able to decrypt via that group's wrapped
FK, which is the expected behaviour - they remain a member of that
group.  This assumption is appropriate within a formal federation but
SHOULD NOT be made in open or ad-hoc sharing contexts.</t>

<t>The sending server's choice of mode is its own policy decision and is
not signalled in the protocol.</t>

</section>
<section anchor="member-removal-ocm-notifications"><name>Member Removal: OCM Notifications</name>

<t>Member removal requires no OCM-level notification by itself.  Because
federation shares are addressed to the group (<xref target="share-creation"/>), each
Member Server observes the Remove Commit and re-evaluates which of its
local users the share resolves to; a removed user loses access without
any action by the sending server.  If the removed member's clients may
have held their server's transport credential, the sending server SHOULD
additionally rotate that credential (<xref target="credential-update"/>).</t>

<t>When the last member homed on a given server is removed from the group,
that server no longer has any user with access.  A well-behaved sending
server SHOULD then reconcile the OCM state of the share, revoke that
server's per-server transport credential (<xref target="share-creation"/>), and send
a <spanx style="verb">SHARE_UNSHARED</spanx> notification to the <spanx style="verb">/notifications</spanx> endpoint of that
server.</t>

</section>
</section>
<section anchor="share-creation"><name>Share Creation</name>

<t>The sending server sends one OCM Share Creation Notification directly to
each current Member Server, identified through the OCM Addresses in the
ratchet tree's leaf credentials.  This is standard OCM server-to-server
communication, with <spanx style="verb">shareWith</spanx> set to the group's OCM Address and
<spanx style="verb">shareType</spanx> set to <spanx style="verb">"federation"</spanx>.  The share is addressed to the group
as the Receiving Party; no per-user notifications are sent.</t>

<t>A federation share is a standard OCM share: every field that is REQUIRED
by [OCM], including the <spanx style="verb">protocol</spanx> object, is REQUIRED here too, and
resource access follows the standard OCM resource access procedure
driven by the <spanx style="verb">protocol</spanx> object.  For encrypted resources the protocol
endpoint serves ciphertext; the plaintext is obtained by unwrapping the
FK as described in the Encryption Model.</t>

<t>Each Member Server SHOULD be given its own <spanx style="verb">sharedSecret</spanx> (or equivalent
protocol credential) in its copy of the notification.  The credential is
per server, not per user: all users on a Member Server share it,
mirroring how the server holds MLS state on behalf of its users.
Distinct per-server credentials allow the sending server to revoke a
single server's transport access, for example when the last group member
on that server is removed, without affecting other Member Servers.
Share Creation Notifications sent to servers that join the group later
(<xref target="fk-rewrap"/>) carry credentials minted at that time, and a server's
credential can be rotated during the share's lifetime
(<xref target="credential-update"/>).</t>

<t>Share Permissions apply uniformly to the whole group: every member of
the group receives the same permissions on the resource.  A sending
server that needs different permissions for different parties should use
separate groups or individual shares.  Receiving Server criteria that
affect the share payload, such as <spanx style="verb">must-exchange-token</spanx>, are evaluated
per Member Server against that server's discovery document, exactly as
in base OCM.</t>

<t>The receiving server resolves <spanx style="verb">shareWith</spanx> against its local MLS state:
it identifies the group whose <spanx style="verb">group_ocm_address</spanx> (<xref target="admin-set"/>)
matches the <spanx style="verb">shareWith</spanx> value and delivers the share to every local user
whose leaf credential appears in that group's ratchet tree.  On every
subsequent <spanx style="verb">MLS_COMMIT</spanx> the receiving server MUST re-evaluate this
resolution, so that local users added to the group gain access to
existing federation shares, and removed users lose it, without any
further OCM notifications.</t>

<t>Addressing the share to the group also allows the receiving server to
distinguish between shares of the same resource arriving via different
groups - a user may be a member of two groups that both have access to
the same resource from the same sending server - and to correctly key
its local wrapped FK store by <spanx style="verb">(resourceId, groupId)</spanx> rather than
<spanx style="verb">resourceId</spanx> alone, where <spanx style="verb">groupId</spanx> is the group OCM Address carried in
<spanx style="verb">shareWith</spanx>, ensuring that FK updates delivered via <spanx style="verb">MLS_APPLICATION</spanx>
are applied to the correct entry.</t>

<t>Because notifications can be delayed or reordered in transit, a
federation share MAY arrive before the receiving server has processed
the Welcome or Commit that made it a Member Server of the group.  A
receiving server that does not recognise the <spanx style="verb">shareWith</spanx> value as a
known group SHOULD queue the share, or reject it in a way that causes
the sender to retry, rather than fail it permanently.  Since sending
servers only contact servers present in the ratchet tree, this condition
is transient.</t>

<t>When an <spanx style="verb">MLS_COMMIT</spanx> adds one or more members to the group, the sending
server MUST send each Member Server that is new to the group a Share
Creation Notification for every federation share it has with that group,
encrypted or not.  For encrypted resources this accompanies the
re-wrapped FK (<xref target="fk-rewrap"/>).  A server that joins the group after a
share was created thereby learns of the shares its users now have access
to without any further action by its users.</t>

<t>Each notification MAY include the optional <spanx style="verb">encryption</spanx> field:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "shareWith": "research-group@receiver.example.org",
  "shareType": "federation",
  "resourceType": "file",
  "sender": "alice@cloud.example.org",
  "owner": "alice@cloud.example.org",
  "providerId": "7c084226-d9a1-11e6-bf26-cec0c932ce01",
  "name": "experiment-data.tar",
  "protocol": {
    "name": "multi",
    "webdav": {
      "uri": "experiment-data.tar",
      "sharedSecret": "<per-Member-Server secret>",
      "permissions": ["read", "write"]
    }
  },
  "encryption": {
    "scheme": "ocm-mls-1",
    "cipher": "AES-256-GCM",
    "resourceId": "3a02538b-aa54-42f2-8853-a38996e211b1"
  }
}
]]></sourcecode></figure>

<t>The <spanx style="verb">encryption</spanx> field is OPTIONAL.  If absent, the resource is
unencrypted and the share follows the standard OCM flow without
modification.  If present, it carries all encryption-related parameters:
<spanx style="verb">scheme</spanx> identifies the encryption scheme, for which this document
defines <spanx style="verb">"ocm-mls-1"</spanx>; <spanx style="verb">resourceId</spanx> is the stable resource identifier
described in <xref target="resource-id"/>; and <spanx style="verb">cipher</spanx> (REQUIRED when <spanx style="verb">encryption</spanx>
is present) names the content AEAD that the resource is encrypted with
(<xref target="file-key-wrapping"/>), one of the AEAD algorithms defined for HPKE
([RFC9180] Section 7.3): <spanx style="verb">"AES-128-GCM"</spanx>, <spanx style="verb">"AES-256-GCM"</spanx>, or
<spanx style="verb">"CHACHA20-POLY1305"</spanx>.  The field signals that the FK is distributed via
the <spanx style="verb">MLS_APPLICATION</spanx> mechanism keyed by <spanx style="verb">(resourceId, groupId)</spanx>.  No
epoch information is carried in the share notification.  Member Servers
always hold the current wrapped FK for each <spanx style="verb">(resourceId, groupId)</spanx> pair
and use their current Group Key to unwrap it at access time.</t>

<t>The Group Owner Server is not involved in the delivery of OCM share
notifications.  All other OCM notifications relating to a share, such as
share updates and share deletions, are likewise sent directly from the
sending server to each Member Server, referencing the share by its
<spanx style="verb">providerId</spanx> as in base OCM.</t>

</section>
<section anchor="trust-and-authentication"><name>Trust and Authentication</name>

<t>The Authentication Service role ([RFC9420] Section 3) is fulfilled by
each user's home OCM server: the server that publishes a user's
KeyPackages attests the binding between the user's OCM Address and their
signature key.  Because the basic credential itself carries no
verifiable binding, the attestation lies in the delivery channel.</t>

<section anchor="validation-procedure"><name>Validation procedure</name>

<t>A KeyPackage is considered validated with the AS when all of the
following hold:</t>

<t><list style="symbols">
  <t>it was fetched from the <spanx style="verb">&lt;endPoint&gt;/mls-key-packages</spanx> endpoint of the
server named in the credential's OCM Address, over TLS, with the
response signed using HTTP Signatures [RFC9421] verifying against that
server's JWKS [RFC7517];</t>
  <t>the OCM Address in the credential is identical to the <spanx style="verb">userId</spanx> the
KeyPackage was requested for, which is the OCM Address of the user the
requester intends to add; in particular, its host part names the server
the KeyPackage was fetched from; and</t>
  <t>the KeyPackage signature verifies with the <spanx style="verb">signature_key</spanx> of its
LeafNode, proving possession of the private key ([RFC9420] Section
10.1).</t>
</list></t>

<t>Requests to the KeyPackage endpoint are signed at the server level
(<xref target="security-considerations"/>), so in native client deployments the
fetch is performed by the admin's home server on the admin client's
behalf.  The home server SHOULD relay the response with its HTTP
Message Signature intact, allowing the native client to verify the
channel binding end-to-end against the target server's published JWKS;
a native client that cannot do so delegates the channel verification to
its home server and verifies the KeyPackage signature itself.</t>

<t>[RFC9420] Section 5.3.1 requires a credential to be validated whenever
it is introduced into the group.  This protocol distributes that duty to
the party that introduces the credential:</t>

<t><list style="symbols">
  <t>Add: the admin client committing an Add MUST have validated the
KeyPackage as described above.  Other members accept the new leaf on the
strength of the admin-signed Commit; they do not contact the new
member's home server.</t>
  <t>Update proposals, and Commits whose UpdatePath carries a new
credential: the successor credential MUST present the same OCM Address
as the credential it replaces, and members MUST reject the proposal or
Commit otherwise.  This is the successor-credential policy anticipated
by [RFC9420] Section 5.3.1.  Continuity of the signature key is anchored
in MLS itself: the message introducing the new leaf is signed with the
member's current key, so only the holder of the previous key can rotate
to a new one.</t>
  <t>Joining via Welcome: the joiner MUST verify the GroupInfo signature
and the integrity of the ratchet tree as required by [RFC9420] Section
12.4.3.1, and MUST verify that every leaf credential is a basic
credential carrying a well-formed OCM Address.  The joiner accepts the
bindings of those credentials transitively, on the basis that each was
validated by an admin client when it was introduced.  It MAY
additionally re-validate any leaf against the <spanx style="verb">/mls-key-packages</spanx>
endpoint of its home server, but such re-validation can fail benignly,
since published KeyPackages rotate independently of leaves already in
groups.</t>
</list></t>

<t>In this transitive model, each home server is trusted to attest only its
own users, and each admin client is trusted to have performed the
attestation check at introduction time.  A malicious home server can
impersonate its own users - it is their Authentication Service - but it
cannot impersonate users of other servers, since it cannot produce an
authenticated KeyPackage delivery for an OCM Address whose host part it
does not serve.</t>

<t>Users who require protection of their key material from their own server
should choose a native client implementation where cryptographic
operations occur on the user's device.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t><strong>Trust model.</strong> In web-client deployments, the OCM Server holds the
Group Key and can decrypt any resource shared with the group on behalf
of its users.  This is consistent with the standard OCM Server trust
model, where users trust their server with their data, and with OCM's
existing approach of abstracting security to the server level.  Native
client deployments provide stronger isolation, as the server does not
hold key material.  Implementations SHOULD move toward native client
deployments over time.</t>

<t><strong>FK rotation vs key-reuse.</strong> FK rotation provides cryptographic access
revocation on member removal, independent of trust assumptions, and
SHOULD also be performed periodically or when key compromise is
suspected.  In key-reuse mode the FK is unchanged and the ciphertext is
not re-encrypted, so revocation is not cryptographic: it relies on
trusting servers to discard all key material they are no longer entitled
to - superseded Group Keys, old wrapped FKs, and any cached unwrapped
FKs - after a Remove Commit.  Key-reuse mode SHOULD only be used within
formal federations with governance agreements that enforce this
behaviour.</t>

<t><strong>Two access-control layers.</strong> For an encrypted federation share, access
is controlled at two independent layers: the per-server transport
credential in the <spanx style="verb">protocol</spanx> object gates who can fetch the ciphertext,
and the Group Key gates who can unwrap the FK and decrypt it.
Confidentiality rests on the cryptographic layer alone; the transport
credential provides defence in depth and is shared by all users on a
Member Server.  The two layers can diverge: a server whose last group
member was just removed may still hold a valid transport credential
until the sending server revokes it, which is why revocation SHOULD
accompany the <spanx style="verb">SHARE_UNSHARED</spanx> notification.  For unencrypted federation
shares the transport credential is the only access control, exactly as
in base OCM, and access-follows-membership then depends on the receiving
server re-evaluating share resolution on every Commit
(<xref target="share-creation"/>) and on the sending server revoking the credentials
of departed servers promptly.</t>

<t><strong>Credential rotation.</strong> Rotated transport credentials are delivered in
group-encrypted <spanx style="verb">MLS_APPLICATION</spanx> messages sent only to the affected
server (<xref target="credential-update"/>).  A removed member is excluded
cryptographically: it does not hold the new epoch's key material.  Other
Member Servers are excluded only by targeted delivery; a credential
message that leaks to another member server is readable by it.  Since
every Member Server already holds transport access to the same
ciphertext under its own credential, the impact of such a leak is
limited to transport-layer attribution.</t>

<t><strong>Key distribution via Application Messages.</strong> Wrapped FKs are
distributed in MLS <spanx style="verb">PrivateMessage</spanx> objects encrypted in the current
epoch.  A removed member cannot decrypt these messages as they do not
hold the new epoch's key material.  Because sending servers re-wrap and
redistribute FKs after every epoch transition (<xref target="fk-rewrap"/>), and
Member Servers always replace their locally stored wrapped FK with the
latest received, the current Group Key is always sufficient for
unwrapping once the re-wrapped FKs have arrived.</t>

<t><strong>Group Key retention window.</strong> Between processing a Commit and
receiving the re-wrapped FKs for the new epoch (<xref target="fk-rewrap"/>), a Member
Server may retain the previous epoch's Group Key in order to keep
serving access requests.  This retention slightly weakens forward
secrecy for the duration of the window: a server compromised during the
window exposes the previous epoch's Group Key in addition to the current
one.  The window is bounded by the arrival of the re-wrapped FKs, and
Member Servers MUST delete the previous Group Key as soon as it is no
longer needed, or after a bounded time, whichever comes first.</t>

<t><strong>Commit ordering.</strong> The Group Owner Server is the sole arbiter of
Commits, eliminating conflicting Commits for the same epoch during
normal operation.  A compromised or unavailable Group Owner Server can
stall epoch transitions, but it cannot decrypt resource content, and it
cannot cause the group to accept a Commit constructed by a non-admin
client, because every Member Server independently verifies the committer
against the admin set before processing a Commit (<xref target="admins"/>).  The role
passes automatically to the next admin's server when the first admin
leaves the group (<xref target="admin-set"/>), and an unavailable arbiter is
eventually replaced through failover (<xref target="failover"/>), during which
conflicting Commits can briefly exist and are resolved
deterministically.</t>

<t><strong>Forked-state retention.</strong> During a detected failover window, Member
Servers retain the previous epoch's group state so that they can revert
to the winning Commit (<xref target="failover"/>).  Retaining forked state weakens
forward secrecy for its duration; [RFC9420] Section 14 requires such
state to be deleted promptly, so the retention is bounded in time and
limited to servers that have observed the failover trigger.</t>

<t><strong>Rejoin.</strong> The rejoin procedure (<xref target="rejoin"/>) lets a home server replace
its own users' leaves with fresh KeyPackages on the strength of its HTTP
Signature alone, without per-request admin approval.  This grants no new
capability: the home server is already the trust anchor for its own
users' KeyPackages and could substitute their keys at any time through
the ordinary KeyPackage endpoint.  Because admin clients verify that a
rejoin only replaces leaves whose OCM Addresses name the requesting
server and that are already present in the ratchet tree, a rejoin can
never admit a new party.</t>

<t><strong>Admin liveness and removal latency.</strong> A Remove proposal takes
cryptographic effect only when an admin client commits it.  Removing
another member additionally requires explicit admin approval, so the
revocation latency for a membership change is bounded by admin
availability.  Groups SHOULD appoint multiple admins, on multiple Member
Servers, to keep this window small and to avoid stalling group
operations when a single admin is offline.  The same bound applies to
the post-compromise security provided by Update proposals, which only
take effect once committed.</t>

<t><strong>Application message ordering.</strong> Per [RFC9420] Section 15.2, sending
servers MUST apply a new epoch secret before encrypting any application
data.  <spanx style="verb">MLS_APPLICATION</spanx> messages carrying re-wrapped keys MUST be sent
only after the sending server has processed the corresponding
<spanx style="verb">MLS_COMMIT</spanx>.</t>

<t><strong>Ordering and the DS.</strong> All ordering in this protocol derives from
MLS-authenticated metadata: Commits are ordered by the epoch they
advance, and FK updates by the <spanx style="verb">(epoch, generation)</spanx> of the enclosing
<spanx style="verb">PrivateMessage</spanx>.  No unauthenticated transport counter is relied upon.
Servers in the DS role can still delay, drop, or selectively withhold
messages, but cannot reorder them undetectably or forge them, consistent
with the MLS threat model ([RFC9420] Section 16.9).</t>

<t><strong>Reinitialisation continuity.</strong> A reinitialisation Welcome is accepted
only with a resumption PSK from the old group's final epoch and after
verification of the old group's ReInit Commit and of membership
preservation (<xref target="reinit"/>).  A party that was not a member of the old
group's final epoch cannot produce that PSK, so the binding between a
group's OCM Address and its MLS group state cannot be hijacked through a
forged reinitialisation.</t>

<t><strong>Handshake message confidentiality.</strong> Proposals and Commits are sent as
PublicMessage, so group operations are visible to the servers that
handle them.  The MLS architecture [RFC9750] recommends encrypting
handshake messages to hide membership changes and signatures from the
Delivery Service; this protocol deliberately departs from that
recommendation because the servers performing the DS role must know the
group's membership anyway: sending servers derive notification
recipients from the ratchet tree, and receiving servers resolve
federation shares to their local users.  No information is exposed to
those servers beyond what their OCM duties already require, and
transport protection (TLS and HTTP Signatures [RFC9421]) prevents
exposure to outside observers.  Application Messages, which carry key
material, are always encrypted as PrivateMessage.</t>

<t><strong>Group membership privacy.</strong> The ratchet tree contains every member's
OCM Address and is held by every Member Server, so the full membership
of a group is visible to all servers that have a member in it.  This is
inherent to the design - servers route shares and notifications using
exactly this information - but it sets the privacy baseline: federated
groups are not anonymous, and membership of a group is as visible to the
participating servers as membership of a shared folder.  The tree is not
exposed to servers outside the group, and transport protection prevents
exposure to third parties.</t>

<t><strong>Admin set integrity.</strong> The admin set and the group's OCM Address are
carried in the GroupContext (<xref target="admin-set"/>), so they are covered by the
MLS confirmation tag and agreed upon by all members of every epoch.  A
malicious server cannot unilaterally appoint admins or seize the Group
Owner Server role; changing the admin set requires a Commit constructed
by an existing admin client.</t>

<t><strong>Post-compromise security.</strong> Member Servers SHOULD periodically rotate
their users' leaf keys via Update proposals to maintain post-compromise
security ([RFC9420] Section 16.6).  Members that do not update SHOULD
eventually be removed from the group.</t>

<t><strong>Key material deletion.</strong> Security-sensitive values MUST be deleted as
soon as they are consumed, per [RFC9420] Section 9.2.  In particular,
the exporter_secret used to derive the Group Key must not be retained
after the Group Key has been derived.</t>

<t><strong>KeyPackage reuse.</strong> KeyPackages MUST be one-time use, except for a
designated last resort KeyPackage used when a user's single-use
KeyPackages are exhausted ([RFC9420] Section 16.8).  Servers MUST remove
a KeyPackage that has been consumed, and SHOULD rate-limit KeyPackage
requests to make exhaustion attacks impractical.</t>

<t><strong>User enumeration.</strong> A server MUST only reply to HTTPS GET requests
signed using HTTP Message Signatures [RFC9421] and SHOULD implement rate
limiting and other access control methods on the <spanx style="verb">/mls-key-packages</spanx>
endpoint to avoid user enumeration.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>The MLS Exporter label <spanx style="verb">"ocm-group-key"</spanx> used in the Group Key
Derivation section is to be registered in the "MLS Exporter Labels"
registry defined in [RFC9420] Section 17.8, to avoid collisions with
other applications using the MLS Exporter:</t>

<t><list style="symbols">
  <t>Label: "ocm-group-key"</t>
  <t>Recommended: N</t>
  <t>Reference: This document</t>
</list></t>

<t>The GroupContext extension <spanx style="verb">ocm_federated_group</spanx> defined in
<xref target="admin-set"/> is to be registered in the "MLS Extension Types" registry
defined in [RFC9420] Section 17.3:</t>

<t><list style="symbols">
  <t>Value: TBD</t>
  <t>Name: ocm_federated_group</t>
  <t>Message(s): GC</t>
  <t>Recommended: N</t>
  <t>Reference: This document</t>
</list></t>

<t>The following notification types are to be registered in the "OCM
Notification Types" registry defined in [OCM], within the "Open Cloud
Mesh (OCM) Parameters" group.  All are group-scoped and therefore omit
the "providerId" field (see <xref target="mls-notification-types"/>):</t>

<figure><artwork><![CDATA[
   +===================+=======+========+===============+
   | Notification Type | Scope | Status | Reference     |
   +===================+=======+========+===============+
   | MLS_WELCOME       | Group | active | This document |
   | MLS_PROPOSAL      | Group | active | This document |
   | MLS_COMMIT        | Group | active | This document |
   | MLS_APPLICATION   | Group | active | This document |
   | MLS_REJOIN        | Group | active | This document |
   +===================+=======+========+===============+
]]></artwork></figure>

<t>The following entry is to be registered in the "OCM Share Types"
registry defined in [OCM], within the "Open Cloud Mesh (OCM)
Parameters" group.  This document is the registering specification for
the "federation" share type:</t>

<figure><artwork><![CDATA[
   +============+===============+
   | Share Type | Reference     |
   +============+===============+
   | federation | This document |
   +============+===============+
]]></artwork></figure>

<t>The following entries are to be registered in the "OCM Share Payloads"
registry defined in [OCM], within the "Open Cloud Mesh (OCM)
Parameters" group.  They extend the existing "webdav", "webapp", and
"ssh" protocols to the "federation" share type; the wire format of the
share payload for these combinations is completely specified by this
document together with [OCM] (see <xref target="share-creation"/>).  These
registrations do not modify the protocols' own registrations:</t>

<figure><artwork><![CDATA[
   +===============+============+=====================+===============+
   | Resource Type | Share Type | Protocols           | Reference     |
   +===============+============+=====================+===============+
   | file          | federation | webdav, webapp, ssh | This document |
   | folder        | federation | webdav, webapp, ssh | This document |
   +===============+============+=====================+===============+
]]></artwork></figure>

</section>
<section anchor="open-issues"><name>Open Issues</name>

<t>This section collects open design issues and shall be removed before
publication.</t>

<t><list style="symbols">
  <t><strong>Streaming decryption.</strong> A chunked AEAD construction enabling
streaming decryption of large files should be specified for native
client implementations.  The specific construction and its interaction
with the FK wrapping model needs to be defined.</t>
  <t><strong>Application Message batching.</strong> The frequency and batching of
<spanx style="verb">MLS_APPLICATION</spanx> messages carrying wrapped FKs needs to be defined.
Since every epoch transition triggers a re-wrap of every shared
resource's FK (<xref target="fk-rewrap"/>), batching is load-bearing when many shares
exist and epoch transitions are frequent.</t>
  <t><strong>Commit retransmission.</strong> A missed Commit is detected directly from
the MLS epoch: a Commit arriving for a later epoch than the next
expected one indicates a gap.  A mechanism for requesting retransmission
of missed Commits, from the Group Owner Server or any Admin Server,
needs to be specified.  Retransmission is the first remedy for a gap;
the rejoin procedure (<xref target="rejoin"/>) is the fallback when retransmitted
Commits can no longer be applied. The proposed OCM Journaling mechanism
can be useful in this context.</t>
</list></t>

</section>
<section anchor="changes"><name>Changes</name>

<t>This section collects the changes with respect to the previous
version in the IETF datatracker.  It is meant to ease the review
process and it shall be removed when going to RFC last call.
The complete changelog is updated in the OCM-API GitHub repository.</t>

<section anchor="version-01"><name>Version 01</name>
<t><list style="symbols">
  <t>Following the introduction of IANA Registries in Version 06 of [OCM],
all registry entries related to the <spanx style="verb">federation</spanx> share type have been
introduced in this document.</t>
</list></t>

</section>
</section>
<section anchor="references"><name>References</name>

<section anchor="normative-references"><name>Normative References</name>

<t>[OCM] Lo Presti, G., de Jong, M.B., Baghbani, M. and Nordin, M.  "<eref target="https://datatracker.ietf.org/doc/draft-ietf-ocm-open-cloud-mesh/">Open
Cloud
Mesh</eref>",
Work in Progress, Internet-Draft.</t>

<t>[RFC2119] Bradner, S.  "<eref target="https://datatracker.ietf.org/doc/html/rfc2119">Key words for use in RFCs to Indicate
Requirement Levels</eref>",
March 1997.</t>

<t>[RFC4648] Josefsson, S.  "<eref target="https://datatracker.ietf.org/doc/html/rfc4648">The Base16, Base32, and Base64 Data
Encodings</eref>", October
2006.</t>

<t>[RFC7517] Jones, M., "<eref target="https://datatracker.ietf.org/doc/html/rfc7517">JSON Web Key
(JWK)</eref>", May 2015.</t>

<t>[RFC8174] Leiba, B.  "<eref target="https://datatracker.ietf.org/html/rfc8174">Ambiguity of Uppercase vs Lowercase in RFC 2119
Key Words</eref>", May 2017.</t>

<t>[RFC9180] Barnes, R., Bhargavan, K., Lipp, B. and Wood, C. A.  "<eref target="https://datatracker.ietf.org/doc/html/rfc9180">Hybrid
Public Key Encryption</eref>",
February 2022.</t>

<t>[RFC9420] Barnes, R., Beurdouche, B., Robert, R., Millican, J., Omara,
E. and Cohn-Gordon, K.  "<eref target="https://datatracker.ietf.org/doc/html/rfc9420">The Messaging Layer Security (MLS)
Protocol</eref>", July 2023.</t>

<t>[RFC9421] Backman, A., Richer, J. and Sporny, M.  "<eref target="https://datatracker.ietf.org/doc/html/rfc9421">HTTP Message
Signatures</eref>", February
2024.</t>

</section>
<section anchor="informative-references"><name>Informative References</name>

<t>[RFC4918] Dusseault, L. M.  "<eref target="https://datatracker.ietf.org/doc/html/rfc4918">HTTP Extensions for Web Distributed
Authoring and
Versioning</eref>", June 2007.</t>

<t>[RFC9750] Beurdouche, B., Rescorla, E., Omara, E., Inguva, S. and Duric,
A.  "<eref target="https://datatracker.ietf.org/doc/html/rfc9750">The Messaging Layer Security (MLS)
Architecture</eref>", April
2025.</t>

</section>
</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>This work builds on the Open Cloud Mesh specification and the
discussions in the OCM community.</t>

<t>Work on this document has been funded by [Sovereign Tech Agency][sta]
through the <eref target="https://www.sovereign.tech/programs/fund">Tech Fund</eref>, with a specific <eref target="https://www.sovereign.tech/tech/open-cloud-mesh">project</eref>.</t>

</section>


  </middle>

  <back>








  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA729a3fbRpIG/L1/BY7yIVaWVCLZzkXemXcUW0488W0tZ/Lu
meMTgSQkYUwCXAKUos1kf/tb965ugLKTnX3n7M5YEgn0pbq6Lk89NZ1OQ1/3
y+q4+PM0FMXTalFtyr5aFN9t2u26K+qmeLWumuLxst0uihdVd1Vsu7q5xH92
5SX+63l5W22Ks2q+3dT9bShns011fVzsvXr8onjx/GzwzL2waOdNuYJ3Ljbl
RT9t2s2ibqbtfDVdLbvphX5+ekmfn35xGObw82W7uT0uun4RQr3eHBf9Ztv1
R1988c0XR6HcVOVxcbJeL2v4aN02XVE2i+JNVS6nb+tVFd5XtzfwmuPiWdNX
m6bqp0/w3SF0PXzw53LZNjCe26qDX8CzVvDB07dPQyi3/VW7OYalmcJadMfF
i4PiJY0XflUUPI0X9fx95X/dbi7Lpv5vGslxcfbjy9O39PtqVdbL4+J92bR/
6bYwioOuoj/A0h0XV32/7o4//3zeLqqDbtUu8QPwqM9X+PwQx/DdQfG8LV5v
qq6v3TC+q7ddtV5X2R/TwTw+ffPSj+VSvnSwbNf0nb/MYX0O5lcj4+I/fK6f
DMmqfFteXs3gRX5dyqtFnf4hHczrtlmg7LTbzbzyo1rhN/+ypj939FdciOGQ
kk/M21UI0+m0KGewieUcdvftVd0VIG7bVdX0xaK6qJsKRaOofumrpoNBFH1b
9FfVQMrvgfjuF+tN27fzdhngU912vW43fWHyWbB8FmUHgjav6ms8Da/LTV/D
O9qLorsCsewOioJGUXehnF/V1TV8kY8QvnbXMSruwdGJ7y/uvXn6uPjmwdEX
+/C6UPKrYZma8rKiuS3x6/AuPHHwNtjURXHRbgrYqHK2rLsrfAeeCXgirD7+
EGiAMo0CTkhRzjdt1+UzLFbVagarPMGZ3lTLJf4vPDvAXjU9/D8+jT8JL+sr
nfFlfQ0L0bR90TZLeHhxU97iusjj7VtBnn9VryfFbNsX5bJr4eN0NEs4VP8N
I5HvLmrY2ho+hN+umvnmdo2ihKPvAiirsqBftZebcn0FumAJL+5wTSt8wqTo
cLdL2MR6CWOTBbip+6tC13ReNqGlh9KXZ5W+Bj6I67eo5CdZ7C3sX0V6EvQd
CB3JQxmuK3j9sqI9GGwWDYGXBzZqA9IiL3RTAp23Lmf1siZxwseAMJGgp+PO
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
u/PLa7z3ylX3OX4UvLrptEDjMPx/HGLEuft9AQA=

-->

</rfc>

