<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mls-virtual-clients-00" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="MVC">MLS Virtual Clients</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mls-virtual-clients-00"/>
    <author initials="J." surname="Alwen" fullname="Joël Alwen">
      <organization>AWS</organization>
      <address>
        <email>alwenjo@amazon.com</email>
      </address>
    </author>
    <author initials="K." surname="Kohbrok" fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad.kohbrok@datashrine.de</email>
      </address>
    </author>
    <author initials="B." surname="McMillion" fullname="Brendan McMillion">
      <organization/>
      <address>
        <email>brendanmcmillion@gmail.com</email>
      </address>
    </author>
    <author initials="M." surname="Mularczyk" fullname="Marta Mularczyk">
      <organization>AWS</organization>
      <address>
        <email>mulmarta@amazon.ch</email>
      </address>
    </author>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 44?>

<t>This document describes a method that allows multiple MLS clients to emulate a
virtual MLS client. A virtual client allows multiple emulator clients to jointly
participate in an MLS group under a single leaf. Depending on the design of the
application, virtual clients can help hide metadata and improve performance.</t>
    </abstract>
  </front>
  <middle>
    <?line 51?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The MLS protocol facilitates communication between clients, where in an MLS
group, each client is represented by the leaf to which it holds the private key
material. In this document, we propose the notion of a virtual client that is
jointly emulated by a group of emulator clients, where each emulator client
holds the key material necessary to act as the virtual client.</t>
      <t>The use of a virtual client allows multiple distinct clients to be represented
by a single leaf in an MLS group. This pattern of shared group membership
provides a new way for applications to structure groups, can improve performance
and help hide group metadata. The effect of the use of virtual clients depends
largely on how it is applied (see <xref target="applications"/>).</t>
      <t>We discuss technical challenges and propose a concrete scheme that allows a
group of clients to emulate a virtual client that can participate in one or more
MLS groups.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <ul spacing="normal">
        <li>
          <t>Virtual Client: A client for which the secret key material is held by one or
more emulator clients, each of which can act on behalf of the virtual client.</t>
        </li>
        <li>
          <t>Emulator Client: A client that collaborates with other emulator clients in
emulating a virtual client.</t>
        </li>
        <li>
          <t>Emulation group: Group used by emulator clients to coordinate emulation of a
virtual client.</t>
        </li>
        <li>
          <t>Higher-level group: A group that is not an emulation group and that may
contain one or more virtual clients.</t>
        </li>
        <li>
          <t>Simple multi-client: A simple alternative to the concept of virtual clients,
where entities that are represented by more than one client (e.g. a user with
multiple devices) are implemented by including all of the entities' clients in
all groups the entity is participating in.</t>
        </li>
      </ul>
      <t>TODO: Terminology is up for debate. We’ve sometimes called this “user trees”,
but since there are other use cases, we should choose a more neutral name. For
now, it’s virtual client emulation.</t>
    </section>
    <section anchor="applications">
      <name>Applications</name>
      <t>Virtual clients generally allow multiple emulator clients to share membership in
an MLS group, where the virtual client is represented as a single leaf. This is
in contrast to the simple multi-client scenario as defined above.</t>
      <t>Depending on the application, the use of virtual clients can have different
effects. However, in all cases, virtual client emulation introduces a small
amount of overhead for the emulator clients and certain limitations when it
comes to emulation group management (see <xref target="emulation-group-management"/>).</t>
      <section anchor="virtual-clients-for-performance">
        <name>Virtual clients for performance</name>
        <t>If a group of emulator clients emulate a virtual client in more than one group,
the overhead caused by the emulation process can be outweighed by two
performance benefits.</t>
        <t>On the one hand, the use of virtual clients makes the higher-level groups (in
which the virtual client is a member) smaller. Instead of one leaf for each
emulator client, it only has a single leaf for the virtual client. As the
complexity of most MLS operations depends on the number of group members, this
increases performance for all members of that group.</t>
        <t>At the same time, the virtual client emulation process (see
<xref target="client-emulation"/>) allows emulator clients to carry the benefit of a single
operation in the emulation group to all virtual clients emulated in that group.</t>
      </section>
      <section anchor="metadata-hiding">
        <name>Metadata hiding</name>
        <t>Virtual clients can be used to hide the emulator clients from other members of
higher-level groups. For example, removing group members of the emulator group
will only be visible in the higher-level group as a regular group update.
Similarly, when an emulator client wants to send a message in a higher-level
group, recipients will see the virtual client as the sender and won't be able to
discern which emulator client sent the message, or indeed the fact that the
sender is a virtual client at all.</t>
        <t>Hiding emulator clients behind their virtual client(s) can, for example, hide
the number of devices a human user has, or which device the user is sending
messages from.</t>
        <t>As hiding of emulator clients by design obfuscates the membership in
higher-level groups, it also means that other higher-level group members can't
identify the actual senders and recipients of messages. From the point of view
of other group members, the "end" of the end-to-end encryption and
authentication provided by MLS ends with the virtual client. The relevance of
this fact largely depends on the security goals of the application and the
design of the authentication service.</t>
        <t>If the virtual client is used to hide the emulator clients, the delivery service and
other higher-level group members also lose the ability to enforce policies to
evict stale clients. For example, an emulator client could become stale (i.e.
inactive), while another keeps sending updates. From the point of view of the
higher-level group, the virtual client would remain active.</t>
      </section>
    </section>
    <section anchor="emulation-group-management">
      <name>Emulation group management</name>
      <t>Emulation group is more elaborate than performing simple MLS operation within
the emulation group.</t>
      <t>When adding a new emulator client, there are several pieces of cryptographic
state that need to be synchronized before the new emulator client can start
using the virtual client. The emulator client can either get this state from
another emulator client, or if all other emulator clients are offline, the
emulator client can use a series of external joins to onboard itself.</t>
      <section anchor="adding-an-emulator-client">
        <name>Adding an emulator client</name>
        <t>When an emulator client adds a new client to the emulation group, the GroupInfo
in that Welcome message needs to contain a NewEmulatorClientState component.</t>
        <t>TODO: Define component properly. Things that need to be included:</t>
        <ul spacing="normal">
          <li>
            <t>signing keys (we need to account for per-group and global signature key
setups, maybe even leave this to the application?)</t>
          </li>
          <li>
            <t>init and encryption keys for active KeyPackages</t>
          </li>
          <li>
            <t>epoch ids, (punctured) epoch base secrets and epoch encryption key (as defined
in <xref target="generating-virtual-client-secrets"/>) for active emulation group epochs</t>
          </li>
          <li>
            <t>All MLS group secrets for active virtual client groups
            </t>
            <ul spacing="normal">
              <li>
                <t>epoch secrets</t>
              </li>
              <li>
                <t>secret tree nodes (including those of potential secret trees of past epochs)</t>
              </li>
              <li>
                <t>encryption keys of ratchet tree nodes (including the leaf)</t>
              </li>
              <li>
                <t>encryption keys for sent, but uncommitted update proposals</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="joining-externally">
        <name>Joining externally</name>
        <t>Without another online emulator client to bootstrap from, a new emulator can
join the emulation group externally. A prerequisite for this external join is
that the new client has the ability to learn which groups the virtual client is
in and to externally join those groups.</t>
        <t>If those prerequisites are met, the new client needs to follow these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Request a fresh credential for the virtual client with a new signing key</t>
          </li>
          <li>
            <t>Perform an External Join to the emulation group. Send an application message
containing a <tt>ResyncMessage</tt> to the emulation group with the new key.</t>
          </li>
          <li>
            <t>Replace all active KeyPackages with new KeyPackages, generated from the new
emulation group epoch.</t>
          </li>
          <li>
            <t>Perform an External Join to all of the groups that the virtual client is a
member of, using LeafNodes generated from the new emulation group epoch (see
<xref target="generating-virtual-client-secrets"/>). Welcome messages which were
unprocessed by the offline devices are discarded, and these groups are
Externally Joined instead (potentially being queued for user approval first).</t>
          </li>
        </ol>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque signature_private_key<V>;
} ResyncMessage;
]]></sourcecode>
      </section>
      <section anchor="removing-emulator-clients">
        <name>Removing emulator clients</name>
        <t>To effectively remove an emulator client, it needs to be removed from the
emulation group <em>and</em> a commit with an update path needs to be sent into every
higher level group by another emulator client using the new emulation group's
epoch to generate the necessary secrets (see
<xref target="generating-virtual-client-secrets"/>). The latter step is required to ensure
that the removed emulator client loses its access to any active virtual client
secrets.</t>
        <t>A corollary of this slightly more elaborate removal procedure is that the
removal of an emulator client requires another emulator client to be online and
perform the necessary updates. This is in contrast to the simple multi-client
setup, where an external sender can effectively remove individual clients.</t>
      </section>
    </section>
    <section anchor="client-emulation">
      <name>Client emulation</name>
      <t>To ensure that all emulator clients can act through the virtual client, they
have to coordinate some of its actions.</t>
      <section anchor="delivery-service">
        <name>Delivery Service</name>
        <t>Client emulation requires that any message sent by an emulator client on behalf
of a virtual client be delivered not just to the rest of the supergroup to which
the the message is sent, but also to all other clients in the emulator group.</t>
      </section>
      <section anchor="generating-virtual-client-secrets">
        <name>Generating Virtual Client Secrets</name>
        <t>Generally, secrets for virtual client operations are derived from the emulation
group. To that end, emulator clients derive an <tt>epoch_base_secret</tt> with every
new epoch of that group.</t>
        <artwork><![CDATA[
emulator_epoch_secret = SafeExportSecret(XXX)
]]></artwork>
        <t>TODO: Replace XXX with the component ID.</t>
        <t>The <tt>emulator_epoch_secret</tt> is in turn used to derive four further secrets, after
which it is deleted.</t>
        <artwork><![CDATA[
epoch_id =
  DeriveSecret(emulator_epoch_secret, "Epoch ID")
epoch_base_secret =
  DeriveSecret(emulator_epoch_secret, "Base Secret")
epoch_encryption_key =
  DeriveSecret(emulator_epoch_secret, "Encryption Key")
generation_id_secret =
  DeriveSecret(emulator_epoch_secret, "Generation ID Secret")
]]></artwork>
        <t>The <tt>epoch_base_secret</tt> is then used to key an instance of the PPRF defined in
<xref target="I-D.ietf-mls-extensions"/> using a tree with <tt>2^32</tt> leaves.</t>
        <t>Secrets are derived from the PPRF as follows:</t>
        <artwork><![CDATA[
VirtualClientSecret(Input) = tree_node_[LeafNode(Input)]_secret
]]></artwork>
        <t>Emulator client MUST store both the (punctured) <tt>epoch_base_secret</tt> and the
<tt>epoch_id</tt> until no key material derived from it is actively used anymore. This
is required for the addition of new clients to the emulator group as described
in Section <xref target="adding-emulator-clients"/>.</t>
        <t>When deriving a secret for a virtual client, e.g. for use in a KeyPackage or
LeafNode update, the deriving client samples a random octet string <tt>random</tt> and
hashes it with its leaf index in the emulation group using the hash function of
the emulation group's ciphersuite.</t>
        <artwork><![CDATA[
struct {
  u32 leaf_index;
  opaque random<V>;
} HashInput

pprf_input = Hash(HashInput)
]]></artwork>
        <t>TODO: We could also hash in the specific operation to further separate domains.</t>
        <t>The <tt>pprf_input</tt> is then used to derive an <tt>operation_secret</tt>.</t>
        <artwork><![CDATA[
operation_secret = VirtualClientSecret(pprf_input)
]]></artwork>
        <t>Given an <tt>epoch_id</tt>, <tt>random</tt> and the <tt>leaf_index</tt> of the emulator client
performing the virtual client operation, other emulator clients can derive the
<tt>operation_secret</tt> and use it to perform the same operation.</t>
        <t>Depending on the operation, the acting emulator client will have to derive one
or more secrets from the <tt>operation_secret</tt>.</t>
        <t>There are four types of MLS-related secrets that can be derived from an
<tt>operation_secret</tt>.</t>
        <ul spacing="normal">
          <li>
            <t><tt>signature_key_secret</tt>: Used to derive the signature key in a virtual client's
leaf</t>
          </li>
          <li>
            <t><tt>init_key_secret</tt>: Used to derive the <tt>init_key</tt> HPKE key in a KeyPackage</t>
          </li>
          <li>
            <t><tt>encryption_key_secret</tt>: Used to derive the <tt>encryption_key</tt> HPKE key in the
LeafNode of a virtual client</t>
          </li>
          <li>
            <t><tt>path_generation_secret</tt>: Used to generate <tt>path_secret</tt>s for the UpdatePath
of a virtual client</t>
          </li>
        </ul>
        <artwork><![CDATA[
signature_key_secret =
  DeriveSecret(epoch_base_secret, "Signature Key")

encryption_key_secret =
  DeriveSecret(epoch_base_secret, "Encryption Key")

init_key_secret =
  DeriveSecret(epoch_base_secret, "Init Key")

path_generation_secret =
  DeriveSecret(epoch_base_secret, "Path Generation")
]]></artwork>
        <t>From these secrets, the deriving client can generate the corresponding keypair
by using the secret as the randomness required in the key generation process.</t>
      </section>
      <section anchor="creating-leafnodes-and-updatepaths">
        <name>Creating LeafNodes and UpdatePaths</name>
        <t>When creating a LeafNode, either for a Commit with path, an Update proposal or a
KeyPackage, the creating emulator client MUST derive the necessary secrets from
the current epoch of the emulator group as described in Section
<xref target="generating-virtual-client-secrets"/>.</t>
        <t>Similarly, if an emulator client generates an Commit with an update path, it
MUST use <tt>path_generation_secret</tt> as the <tt>path_secret</tt> for the first
<tt>parent_node</tt> instead of generating it randomly.</t>
        <t>To signal to other emulator clients which epoch to use to derive the necessary
secrets to recreate the key material, the emulator client includes a
DerivationInfoComponent in the LeafNode.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque epoch_id<V>;
  opaque ciphertext<V>;
} DerivationInfoComponent

struct {
  uint32 leaf_index;
  opaque random<V>;
} EpochInfoTBE
]]></sourcecode>
        <t>The <tt>ciphertext</tt> is the serialized EpochInfoTBE encrypted under the epoch's
<tt>epoch_encryption_key</tt> with the <tt>epoch_id</tt> as AAD using the AEAD scheme of the
emulation group's ciphersuite.</t>
        <t>When other emulator clients receive an Update (i.e. either an Update proposal or
a Commit with an UpdatePath) in group that the virtual client is a member in it
uses the <tt>epoch_id</tt> to determine the epoch of the emulator group from which to
derive the secrets necessary to re-create the key material of the LeafNode and a
potential UpdatePath.</t>
      </section>
      <section anchor="adding-emulator-clients">
        <name>Adding emulator clients</name>
        <t>There are two ways of adding new clients to the emulation group. Either new
clients get sent the secret key material of all groups that the virtual client
is currently in, or it joins into all of the virtual client's groups, either via
a regular or an external commit.</t>
        <t>TODO: Specify protocol</t>
      </section>
      <section anchor="virtual-client-actions">
        <name>Virtual client actions</name>
        <t>There are two occasions where emulator clients need to communicate directly to
operate the virtual client. In both cases, the acting emulator client sends a
Commit to the emulation group before taking an action with the virtual client.</t>
        <t>The commit serves two purposes: First, the agreement on message ordering
facilitated by the DS prevents concurrent conflicting actions by two or more
emulator clients. Second, the acting emulator client can attach additional
information to the commit using the SafeAAD mechanism described in <xref section="4.9" sectionFormat="of" target="I-D.ietf-mls-extensions"/>.</t>
        <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  key_package_upload(1),
  external_join(2),
  255,
} ActionType;

struct {
  ActionType action_type;
  select (VirtualClientAction.action_type) {
    case key_package_upload:
      KeyPackageUpload key_package_upload;
    case external_join:
      ExternalJoin external_join;
  };
} VirtualClientAction;
]]></sourcecode>
        <section anchor="creating-and-uploading-keypackages">
          <name>Creating and uploading KeyPackages</name>
          <t>When creating a KeyPackage, the creating emulator client derives the
<tt>init_secret</tt> as described in <xref target="generating-virtual-client-secrets"/>.</t>
          <t>Before uploading one or more KeyPackages for a virtual client, the uploading
emulator client MUST create a KeyPackageUpload message and send it to the
emulator group as described in <xref target="virtual-client-actions"/>.</t>
          <t>The recipients can use the <tt>leaf_index</tt> of the sender, as well as the <tt>random</tt>
and <tt>epoch_id</tt> to derive the <tt>init_key</tt> for each KeyPackageRef. If the
recipients receive a Welcome, they can then check which <tt>init_key</tt> to use based
on the KeyPackageRef.</t>
          <sourcecode type="tls"><![CDATA[
struct {
  KeyPackageRef key_package_ref<V>;
  opaque random<V>;
} KeyPackageInfo

struct {
  opaque epoch_id<V>;
  KeyPackageInfo key_package_info<V>;
} KeyPackageUpload
]]></sourcecode>
          <t>After successfully sending the message, the sender MUST then upload the
corresponding KeyPackages.</t>
          <t>The <tt>key_package_refs</tt> allow emulator clients to identify which KeyPackage to
use and how to derive it when the virtual client receives a Welcome message.</t>
        </section>
        <section anchor="externally-joining-groups-with-the-virtual-client">
          <name>Externally joining groups with the virtual client</name>
          <t>Before an emulator client uses an external commit to join a group with the
virtual client, it MUST send an ExternalJoin message to the emulation group as
described in <xref target="virtual-client-actions"/>.</t>
          <sourcecode type="tls"><![CDATA[
struct {
  opaque group_id<V>;
} ExternalJoin
]]></sourcecode>
          <t>The sender MUST then use an external join to join the group with GroupID
<tt>group_id</tt>. When creating the commit to join the group externally, it MUST
generate the LeafNode and path as described in
<xref target="creating-leafnodes-and-updatepaths"/>.</t>
        </section>
      </section>
      <section anchor="sending-privatemessages">
        <name>Sending PrivateMessages</name>
        <t>Given that MLS generates the encryption keys and nonces for PrivateMessages
sequentially, but multiple emulator clients may send messages through the
virtual client simultaneously, this can create a situation where encryption keys
and nonces are reused inappropriately. Critically, if two emulator clients
encrypt a message with both the same key and nonce simultaneously, this could
compromise the message's confidentiality and integrity. Emulator clients MUST
prevent this by computing the <tt>reuse_guard</tt>, as described below instead of
sampling it randomly.</t>
      </section>
      <section anchor="small-space-prp">
        <name>Small-Space PRP</name>
        <t>A small-space pseudorandom permutation (PRP) is a cryptographic algorithm that
works similar to a block cipher, while also being able to adhere to format
constraints. In particular, it is able to perform a psuedorandom permutation
over an arbitrary input and output space.</t>
        <t>This document uses the FF1 mode from <xref target="NIST"/> with the input-output space of
32-bit integers, instantiated with AES-128.</t>
        <artwork><![CDATA[
output = SmallSpacePRP.Encrypt(key, input)
input = SmallSpacePRP.Decrypt(key, output)
]]></artwork>
      </section>
      <section anchor="reuse-guard">
        <name>Reuse Guard</name>
        <t>MLS clients typically generate the bytes for the <tt>reuse_guard</tt> randomly. When
sending a message with a virtual client, however, emulator clients choose a
random value <tt>x</tt> such that <tt>x</tt> modulo the number of leaves in the emulation
group is equal to its <tt>leaf_index</tt>. They then calculate:</t>
        <artwork><![CDATA[
prp_key = ExpandWithLabel(leaf_node_secret, "reuse guard", key_schedule_nonce, 16)
reuse_guard = SmallSpacePRP.Encrypt(prp_key, x)
]]></artwork>
        <t>ExpandWithLabel is computed with the emulation group's ciphersuite's algorithms.
<tt>leaf_node_secret</tt> is the secret corresponding to the virtual client's LeafNode
in the higher level group and <tt>key_schedule_nonce</tt> is the nonce provided by the
key schedule for encrypting this message.</t>
        <t><tt>prp_key</tt> is computed in a way that it is unique to the key-nonce pair and
computable by all emulator clients (but nobody else). <tt>reuse_guard</tt> is computed
in a way that it appears random to outside observers (in particular, it does not
leak which emulator client sent the message), but two emulator clients will
never generate the same value.</t>
      </section>
      <section anchor="delivery-service-1">
        <name>Delivery Service</name>
        <t>The method discussed above for computing <tt>reuse_guard</tt> prevents emulator clients
from ever reusing the same key-nonce pair, as this would compromise the message.
However, it does not prevent different emulator clients from attempting to
encrypt messages with the same key but different nonces. While this doesn't
create any security issues, it is a functionality issue due to the MLS deletion
schedule. Other higher level group members (or indeed emulator clients) will
delete the encryption key after using it to decrypt the first message they
receive and will be unable to decrypt subsequent messages.</t>
        <t>The best solution depends on whether the Delivery Service is strongly or
eventually consistent <xref target="RFC9750"/>. Emulator clients communicating with a
strongly-consistent DS SHOULD prevent this issue by coordinating the use of
individual ratchet generations for encryption through the DS. Emulator clients
MAY send a generation ID to the DS whenever they fan out a private message. The
generation ID is derived as follow.</t>
        <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  application(1),
  handshake(2),
  (255)
} RatchetType

struct {
  uint32 generation;
  RatchetType ratchet_type;
} PrivateMessageContext

generation_id = ExpandWithLabel(generation_id_secret, "generation id",
                      PrivateMessageContext, Kdf.Nh)
]]></sourcecode>
        <ul spacing="normal">
          <li>
            <t><tt>generation</tt> is the generation of the ratchet used for encryption</t>
          </li>
          <li>
            <t><tt>ratchet_type</tt> is the type of ratchet used to encrypt the PrivateMessage</t>
          </li>
          <li>
            <t>ExpandWithLabel as defined in <xref target="RFC9420"/></t>
          </li>
          <li>
            <t><tt>generation_id_secret</tt> is derived as specified in
<xref target="generating-virtual-client-secrets"/></t>
          </li>
          <li>
            <t><tt>Kdf.Nh</tt> is from the emulation group's ciphersuite</t>
          </li>
        </ul>
        <t>Attaching the generation ID to the PrivateMessage allows the DS to detect
collisions between generations per epoch and per ratchet type.</t>
        <t>Alternatively, devices communicating with an eventually-consistent DS may need
to simply retain messages and encryption keys for a short period of time after
sending, in case it becomes necessary to decrypt another device's message and
re-encrypt and re-send their original message with another encryption key.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <t>TODO: Detail security considerations once the protocol has evolved a little
more. Starting points:</t>
      <t>Some of the performance benefits of this scheme depend on the fact that one can
update once in the emulation group and “re-use” the new randomness for updates
in multiple higher-level groups. At that point, clients only really recover when
they update the emulation group, i.e. re-using somewhat old randomness of the
emulation group won’t provide real PCS in higher-level groups.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy considerations</name>
      <t>TODO: Specify the metadata hiding properties of the protocol. The details depend
on how we solve some of the problems described throughout this document.
However, using a virtual client should mask add/remove activity in the
underlying emulation group. If it actually hides the identity of the members may
depend on the details of the AS, as well as how we solve the application
messages problem.</t>
    </section>
    <section anchor="performance-considerations">
      <name>Performance considerations</name>
      <t>There are several use cases, where a specific group of clients represents a
higher-level entity such as a user, or a part of an organization. If that group
of clients shares membership in a large number of groups, where its sole purpose
is to represent the higher-level entity, then instead emulating a virtual client
can yield a number of performance benefits, especially if this strategy is
employed across an implementation. Generally, the more emulator clients are
hidden behind a single virtual client and the more clients are replaced by
virtual clients, the higher the potential performance benefits.</t>
      <section anchor="smaller-trees">
        <name>Smaller Trees</name>
        <t>As a general rule, groups where one or more sets of clients are replaced by
virtual clients have fewer members, which leads to cheaper MLS operations where
the cost depends on the group size, e.g., commits with a path, the download size
of the group state for new members, etc. This increase in performance can offset
performance penalties, for example, when using a PQ-secure cipher suite, or if
the application requires high update frequencies (deniability).</t>
      </section>
      <section anchor="fewer-blanks">
        <name>Fewer blanks</name>
        <t>Blanks are typically created in the process of client removals. With virtual
clients, the removal of an emulator client will not cause the leaf of the
virtual client (or indeed any node in the virtual client’s direct path) to be
blanked, except if it is the last remaining emulator client. As a result,
fluctuation in emulator clients does not necessarily lead to blanks in the group
of the corresponding virtual clients, resulting in fewer overall blanks and
better performance for all group members.</t>
      </section>
    </section>
    <section anchor="emulation-costs">
      <name>Emulation costs</name>
      <t>From a performance standpoint, using virtual clients only makes sense if the
performance benefits from smaller trees and fewer blanks outweigh the
performance overhead incurred by emulating the virtual client in the first
place.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA considerations</name>
      <t>This document requests the addition of a new value under the heading "Messaging
Layer Security" in the "MLS Component Types" regsitry.</t>
      <section anchor="derivationinfocomponent">
        <name>DerivationInfoComponent</name>
        <t>A component meant to communicate information on how to derive secrets for a
given commit.</t>
        <ul spacing="normal">
          <li>
            <t>Value: TBD</t>
          </li>
          <li>
            <t>Name: DerivationInfoComponent</t>
          </li>
          <li>
            <t>Where: LN</t>
          </li>
          <li>
            <t>Recommended: True</t>
          </li>
        </ul>
      </section>
      <section anchor="virtualclientaction">
        <name>VirtualClientAction</name>
        <t>A component meant to communicate which virtual client action is taken in
conjunction with the given commit in the emulation group.</t>
        <ul spacing="normal">
          <li>
            <t>Value: TBD</t>
          </li>
          <li>
            <t>Name: VirtualClientAction</t>
          </li>
          <li>
            <t>Where: Ad</t>
          </li>
          <li>
            <t>Recommended: True</t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="NIST" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38G.pdf">
        <front>
          <title>Recommendation for Block Cipher Modes of Operation: Methods for Format-Preserving Encryption</title>
          <author initials="M." surname="Dworkin" fullname="Morris Dworkin">
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="I-D.ietf-mls-extensions">
        <front>
          <title>The Messaging Layer Security (MLS) Extensions</title>
          <author fullname="Raphael Robert" initials="R." surname="Robert">
            <organization>Phoenix R&amp;D</organization>
          </author>
          <date day="21" month="July" year="2025"/>
          <abstract>
            <t>   The Messaging Layer Security (MLS) protocol is an asynchronous group
   authenticated key exchange protocol.  MLS provides a number of
   capabilities to applications, as well as several extension points
   internal to the protocol.  This document provides a consolidated
   application API, guidance for how the protocol's extension points
   should be used, and a few concrete examples of both core protocol
   extensions and uses of the application API.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-08"/>
      </reference>
      <reference anchor="RFC9750">
        <front>
          <title>The Messaging Layer Security (MLS) Architecture</title>
          <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
          <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
          <author fullname="E. Omara" initials="E." surname="Omara"/>
          <author fullname="S. Inguva" initials="S." surname="Inguva"/>
          <author fullname="A. Duric" initials="A." surname="Duric"/>
          <date month="April" year="2025"/>
          <abstract>
            <t>The Messaging Layer Security (MLS) protocol (RFC 9420) provides a group key agreement protocol for messaging applications. MLS is designed to protect against eavesdropping, tampering, and message forgery, and to provide forward secrecy (FS) and post-compromise security (PCS).</t>
            <t>This document describes the architecture for using MLS in a general secure group messaging infrastructure and defines the security goals for MLS. It provides guidance on building a group messaging system and discusses security and privacy trade-offs offered by multiple security mechanisms that are part of the MLS protocol (e.g., frequency of public encryption key rotation). The document also provides guidance for parts of the infrastructure that are not standardized by MLS and are instead left to the application.</t>
            <t>While the recommendations of this document are not mandatory to follow in order to interoperate at the protocol level, they affect the overall security guarantees that are achieved by a messaging application. This is especially true in the case of active adversaries that are able to compromise clients, the Delivery Service (DS), or the Authentication Service (AS).</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9750"/>
        <seriesInfo name="DOI" value="10.17487/RFC9750"/>
      </reference>
      <reference anchor="RFC9420">
        <front>
          <title>The Messaging Layer Security (MLS) Protocol</title>
          <author fullname="R. Barnes" initials="R." surname="Barnes"/>
          <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
          <author fullname="R. Robert" initials="R." surname="Robert"/>
          <author fullname="J. Millican" initials="J." surname="Millican"/>
          <author fullname="E. Omara" initials="E." surname="Omara"/>
          <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
          <date month="July" year="2023"/>
          <abstract>
            <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9420"/>
        <seriesInfo name="DOI" value="10.17487/RFC9420"/>
      </reference>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA5Vca5Icx3H+X6cogxHGbsTMEARFW1pathZYkARJkDAWJOVQ
yNiemZqd5vZ0j/uBxRABBa+hCOkEPoZvwpM4v8ysRz8GXPEPF9PdVVlZ+fjy
UTWfz02bt4U7s8++vrTf53XbZYV9XOSubBuTLZe1e03Pvn9s1tWqzHb04rrO
Nu08d+1mviua+Wv5Zr6Sb+YPHphV1rrrqj6c2bzcVMbk+/rMtnXXtA8fPPjd
g4cmq112Zi/dqqvz9mBu3OG2qtdn9mnZurp07fwCcxjTtFm5fpUVVUnzHlxj
9vmZ/VNbrWa2qeq2dpuG/jrs8Mefjcm6dlvVZ8bOLc3cnNkvF/a8uHWlsfSf
UP9l9X//WyS/VvV1VuY/ZW1elWf23vkPl/f4d7fL8uLMZnjxx+oP2S77qSoX
q2oXR/9qYb+qtsu6uknG/6oq62zde9Cf4vm2cmX+xr7454t0ohv+bnEj3/1h
nbVZs63z0i3WLk75aGGfrZ7lRUFD8debrihk4ke1K9dZOXiuoy/l4W61k2d/
uMbv/eXce0aDd0VWr3463NxLlnTvWVa32fDZrzBu1xU7fBY4t40zvVjYF9XS
1W0yyYtsv81ckT64E98gh3+o5eOav+VVmbKqd/Tla0fiYL95evnyjL9qs/ra
tWd227b75uzDD8vXxb5bNosyb9rFdfX6Q/yBXz683LtVnhXPu2WRr5iG5kOM
s7h8vvjtgwfzj3/7+WK/3siookL3XjiaewdW4327qWr7qKhWN/Zxvt+62j6r
1q6x1cZ+u3e1ruuZI6FdN/zyZ0z0/HntGle/zstr+6Rc1Yc93hTuBhHn/+bK
vGdVXeeNvSAtuslLYxaLhTHz+dxmy6atsxWp0sstvUA63BF5rSUyVnW+JGIy
u2MCbLvNWhL3orptsHltvi8cGwVVbNtWxHOSgdbZzKjWJy+Qqln/q/wyGk0+
p3UmQ/5Y5WVbHMyehCVf5XsMn5cWgkxDX9dVt7dduSbmZbYhjtAwhcs2C3vh
9sRo8Ig43W4d1pRfl+Au/ctk+73ft9mArsauaPitK/Z2m68dGJBB32jStc13
+7p67Sxt0Aa7Ua6c8nKXr9eFM+YDmKm6WncrDA7OCp/oO7JMVWE32Sov8pZW
QjORPHSlEmKXrr11rvR0zOwtSUWyXsPrnVmXrbaeibRttdtDIsg4ru3ywIsF
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

-->

</rfc>
