<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mls-virtual-clients-01" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="MVC">MLS Virtual Clients</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mls-virtual-clients-01"/>
    <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="July" day="06"/>
    <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="requirements-language">
      <name>Requirements Language</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in <xref target="BCP14"/> (<xref target="RFC2119"/>) (<xref target="RFC8174"/>) when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</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 higher-level groups in which the
virtual client is a member.</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.</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 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>
      <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 emulation 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="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>
      <t>Each emulation group <bcp14>MUST</bcp14> emulate exactly one virtual client. An emulation
group <bcp14>MAY</bcp14> emulate that virtual client in multiple higher-level groups, but the
virtual client <bcp14>MUST NOT</bcp14> be represented by more than one leaf in any given
higher-level group.</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 higher-level group
to which the message is sent, but also to all other clients in the emulation
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>emulator_epoch_secret</tt> with
every new epoch of that group using the Safe Exporter API defined in
<xref section="4.4" sectionFormat="of" target="I-D.ietf-mls-extensions"/>, where
<tt>virtual_clients_component_id</tt> is the component ID registered for the
<tt>virtual_clients</tt> component in <xref target="iana-considerations"/>.</t>
        <artwork><![CDATA[
emulator_epoch_secret = SafeExportSecret(virtual_clients_component_id)
]]></artwork>
        <t>The <tt>emulator_epoch_secret</tt> is in turn used to derive five 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")
reuse_guard_secret =
  DeriveSecret(emulator_epoch_secret, "Reuse Guard")
]]></artwork>
        <t>The <tt>epoch_base_secret</tt> keys a Virtual Client Operation Secret Tree, a tree of
secrets with the same structure as the Secret Tree defined in Section 9 of
<xref target="RFC9420"/>, with the following differences:</t>
        <ul spacing="normal">
          <li>
            <t>Like the Secret Tree, the Virtual Client Operation Secret Tree has the same
set of nodes and edges as the emulation group's ratchet tree at the
corresponding epoch. The <tt>node_index</tt> fields of the serialized
<tt>SecretTreeState</tt> are interpreted relative to this tree.</t>
          </li>
          <li>
            <t>The root of the tree is the <tt>epoch_base_secret</tt> rather than a secret derived
from the <tt>encryption_secret</tt> of an MLS group epoch.</t>
          </li>
          <li>
            <t>Each leaf has one <tt>operation</tt> ratchet for each
<tt>VirtualClientOperationType</tt>.</t>
          </li>
        </ul>
        <t>Emulator clients use the same ratchet advancement, skipping, and deletion
schedule for each operation ratchet as RFC 9420 uses for sender ratchets. An
emulator client that learns of an operation with generation <tt>n</tt> of a ratchet
whose current state is at generation <tt>m &lt; n</tt> derives and retains the operation
secrets for the skipped generations <tt>m, ..., n-1</tt> in the same way RFC 9420
handles out-of-order PrivateMessages. Implementations <bcp14>SHOULD</bcp14> bound the number
of skipped generations they retain and the time for which they retain them.
The serialized state of the Virtual Client Operation Secret Tree is
represented by <tt>SecretTreeState</tt> with <tt>SecretTreeRatchetState.ratchet_type</tt>
set to <tt>operation</tt> and <tt>SecretTreeRatchetState.operation_type</tt> set to the
corresponding <tt>VirtualClientOperationType</tt>.</t>
        <t>When a leaf secret in the Virtual Client Operation Secret Tree is expanded, the
initial operation ratchet secret for each non-reserved
<tt>VirtualClientOperationType</tt> defined in this document is derived as follows:</t>
        <artwork><![CDATA[
operation_ratchet_secret[operation_type][0] =
  ExpandWithLabel(leaf_secret, "vc operation init",
                  operation_type, Kdf.Nh)
]]></artwork>
        <t>In this derivation, <tt>operation_type</tt> is the TLS-encoded
<tt>VirtualClientOperationType</tt> value.</t>
        <t>The <tt>leaf_secret</tt> <bcp14>MUST</bcp14> be deleted immediately after the initial operation
ratchet secrets for all operation types have been derived. As a consequence,
operation types defined by future documents cannot be added to already
expanded leaves; they are only usable from emulation-group epochs onward in
which all emulator clients derive them at expansion time.</t>
        <t>Emulator clients <bcp14>MUST</bcp14> retain the <tt>operation_secret_tree</tt>, the <tt>epoch_id</tt>, the
<tt>epoch_encryption_key</tt>, the <tt>generation_id_secret</tt>, the <tt>reuse_guard_secret</tt>,
and the number of leaf nodes the emulation group's ratchet tree had at the
corresponding epoch (including blank leaves, see <xref target="reuse-guard"/>) until no key
material associated with that epoch is actively used anymore and no generation
IDs or reuse guards need to be computed for that epoch. For each retained
epoch in which an emulator client was a member, it <bcp14>MUST</bcp14> also retain its own
leaf index at that epoch. The <tt>operation_secret_tree</tt>, <tt>epoch_id</tt>, and
<tt>epoch_encryption_key</tt> are used for deriving and processing virtual-client key
material, including DerivationInfos and state transferred to new clients
(<xref target="adding-an-emulator-client"/>); the <tt>generation_id_secret</tt> is used for
computing generation IDs (<xref target="coordinating-ratchet-generations-with-the-ds"/>);
and the <tt>reuse_guard_secret</tt>, leaf count, and leaf index are used for
computing the <tt>reuse_guard</tt> (<xref target="reuse-guard"/>).</t>
        <t>When deriving a secret for a virtual client, e.g. for use in a KeyPackage
upload or LeafNode update, the deriving client chooses a
<tt>VirtualClientOperationType</tt> and uses the next unused generation of its own
operation ratchet for that operation type. The <tt>operation_type</tt> is
<tt>key_package</tt> when deriving per-KeyPackage seed secrets, either for a
KeyPackageUpload batch or for the creator LeafNode of a newly created
higher-level group (<xref target="creating-groups-with-the-virtual-client"/>). A single
<tt>key_package</tt> operation generation derives the batch operation secret for all
KeyPackages in that upload, and individual KeyPackages are domain-separated
with <tt>key_package_index</tt> as described in
<xref target="creating-and-uploading-keypackages"/>. The batch is closed by the upload:
after a KeyPackageUpload has been sent, the same operation generation <bcp14>MUST NOT</bcp14>
be used to derive additional KeyPackages. The <tt>operation_type</tt> is <tt>leaf_node</tt>
when creating a LeafNode for an Update proposal, a Commit with an update path,
or an external commit. Applications <bcp14>MAY</bcp14> use the operation type <tt>application</tt>
to derive application-specific key material.</t>
        <t>Deriving an <tt>operation_secret</tt> consumes the corresponding operation-ratchet
generation, even if the virtual-client operation does not result in a
higher-level MLS message that is accepted into the higher-level group's
transcript. Once a generation has been consumed, an emulator client <bcp14>MUST NOT</bcp14> use
the same generation of the same operation-type ratchet for another virtual-client
operation. A retry of a failed operation is another virtual-client operation:
if, for example, a group creation or an external commit is rejected and
attempted again, the retry <bcp14>MUST</bcp14> consume a fresh generation. If the operation
fails, the emulator client <bcp14>MUST</bcp14> delete any retained secret material derived
from the failed operation after the client determines that the operation will
not be used.</t>
        <t>The operation context is a value bound into the derivation of the
<tt>operation_secret</tt>. For <tt>key_package</tt> operations, <tt>operation_context</tt> is a
zero-length octet string. For <tt>leaf_node</tt> operations, <tt>operation_context</tt> is the
<tt>group_id</tt> of the higher-level group in which the LeafNode is used. For
<tt>application</tt> operations, <tt>operation_context</tt> is application-defined and <bcp14>MUST</bcp14> be
authenticated by the application together with the other derivation inputs.</t>
        <artwork><![CDATA[
struct {
  opaque epoch_id<V>;
  uint32 leaf_index;
  uint32 generation;
  VirtualClientOperationType operation_type;
  opaque operation_context<V>;
} OperationContext;

operation_generation_secret =
  DeriveSecret(operation_ratchet_secret, "VC Operation Secret")

next_operation_ratchet_secret =
  DeriveSecret(operation_ratchet_secret, "VC Operation Ratchet")

operation_secret =
  ExpandWithLabel(operation_generation_secret, "vc operation",
                  OperationContext, Kdf.Nh)
]]></artwork>
        <t><tt>operation_ratchet_secret</tt> is the ratchet secret for <tt>generation</tt> in the
<tt>operation_type</tt> ratchet of <tt>leaf_index</tt>. After deriving <tt>operation_secret</tt> and
<tt>next_operation_ratchet_secret</tt>, the emulator client <bcp14>MUST</bcp14> delete
<tt>operation_ratchet_secret</tt> and <tt>operation_generation_secret</tt> and update the
ratchet state for the selected <tt>operation_type</tt> to
<tt>next_operation_ratchet_secret</tt> for <tt>generation + 1</tt>. The emulator client <bcp14>MUST</bcp14>
retain enough secret material to reproduce all active key material derived from
<tt>operation_secret</tt>. For <tt>key_package</tt> operations, the emulator client derives
the per-KeyPackage seed secrets for every KeyPackage in the batch and <bcp14>MUST</bcp14>
delete the batch <tt>operation_secret</tt> after all per-KeyPackage material needed
for the batch has been derived.</t>
        <t>Retaining <tt>operation_secret</tt>s and per-KeyPackage seed secrets beyond their
immediate use is only necessary if the application intends to onboard new
emulator clients through provisioning state transfer (Variant A,
<xref target="adding-an-emulator-client"/>). If that is the case, the emulator client <bcp14>MUST</bcp14>
retain them as RetainedOperationSecrets and RetainedKeyPackageMaterial until
all key material derived from them is no longer active, and <bcp14>MUST</bcp14> delete them
after that point. Otherwise, the emulator client <bcp14>MUST</bcp14> delete them as soon as
it has derived the key material required for the operation. The derived key
material that remains in use (such as the <tt>init_key</tt> private key of an
outstanding KeyPackage) is retained independently of the secret it was
derived from.</t>
        <t>Given an <tt>epoch_id</tt>, <tt>operation_type</tt>, <tt>generation</tt>, <tt>operation_context</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>, advance the
same operation-type ratchet, and use the <tt>operation_secret</tt> to perform the same
operation. For <tt>key_package</tt> operations, they also use <tt>key_package_index</tt> to
derive the per-KeyPackage seed secret from the batch <tt>operation_secret</tt>. If the
operation-type ratchet generation has already been deleted and the operation
was not a <tt>key_package</tt> operation, for example because the emulator client
joined after the operation took place, the emulator client uses the
corresponding RetainedOperationSecret transferred in NewEmulatorClientState.
For KeyPackage-derived material, the emulator client uses the corresponding
RetainedKeyPackageMaterial, identified either by DerivationInfo or by an
<tt>active_key_packages</tt> entry.</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>This document defines four types of MLS-related secrets derived from virtual
client operations.</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>
        <t>For operations that do not use a per-KeyPackage seed secret, the MLS-related
secrets are derived directly from the <tt>operation_secret</tt>:</t>
        <artwork><![CDATA[
signature_key_secret =
  DeriveSecret(operation_secret, "Signature Key")

encryption_key_secret =
  DeriveSecret(operation_secret, "Encryption Key")

init_key_secret =
  DeriveSecret(operation_secret, "Init Key")

path_generation_secret =
  DeriveSecret(operation_secret, "Path Generation")
]]></artwork>
        <t>For <tt>key_package</tt> operations, the KeyPackageUpload derives one batch
<tt>operation_secret</tt>. For each KeyPackageInfo in the upload, the creating
emulator client derives a per-KeyPackage seed secret from that batch
<tt>operation_secret</tt> using the KeyPackage's <tt>key_package_index</tt> as KDF context:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  uint32 key_package_index;
} KeyPackageSeedContext;
]]></sourcecode>
        <artwork><![CDATA[
key_package_seed_secret =
  ExpandWithLabel(operation_secret, "key package seed",
                  KeyPackageSeedContext, Kdf.Nh)
]]></artwork>
        <t>The KeyPackage's <tt>init_key_secret</tt>, <tt>signature_key_secret</tt>, and
<tt>encryption_key_secret</tt> are derived from <tt>key_package_seed_secret</tt>, not
directly from the batch <tt>operation_secret</tt>:</t>
        <artwork><![CDATA[
signature_key_secret =
  DeriveSecret(key_package_seed_secret, "Signature Key")

encryption_key_secret =
  DeriveSecret(key_package_seed_secret, "Encryption Key")

init_key_secret =
  DeriveSecret(key_package_seed_secret, "Init Key")
]]></artwork>
        <t>The source of the virtual client's signature key is application-defined. An
application <bcp14>MAY</bcp14> use <tt>signature_key_secret</tt> to derive a fresh signing key per
operation, or <bcp14>MAY</bcp14> provide signing-key material through other means, for
example a per-group or global signing key issued by the Authentication
Service, or a signing key derived from an emulation-group epoch secret.
Whatever the choice, the <tt>signing_key_material</tt> field of
NewEmulatorClientState (see <xref target="adding-an-emulator-client"/>) carries the
state a new emulator client needs; its contents are application-defined.</t>
      </section>
      <section anchor="creating-leafnodes-and-updatepaths">
        <name>Creating LeafNodes and UpdatePaths</name>
        <t>When creating a LeafNode, either for group creation, a Commit with an update
path, an Update proposal, an external commit, or a KeyPackage, the creating
emulator client <bcp14>MUST</bcp14> derive the necessary secrets from the current epoch of the
emulation group as described in <xref target="generating-virtual-client-secrets"/>.
For a LeafNode whose <tt>leaf_node_source</tt> is <tt>key_package</tt>, the creating emulator
client <bcp14>MUST</bcp14> use a per-KeyPackage seed secret, derived from a batch
<tt>key_package</tt> operation secret and the LeafNode's <tt>key_package_index</tt>. For the
LeafNode of a KeyPackage, this <bcp14>MUST</bcp14> be the same seed secret used to derive the
KeyPackage's <tt>init_key_secret</tt>. For the creator LeafNode of a newly created
higher-level group, the seed secret is derived from a dedicated <tt>key_package</tt>
operation as described in <xref target="creating-groups-with-the-virtual-client"/>. For a
LeafNode whose <tt>leaf_node_source</tt> is <tt>update</tt> or <tt>commit</tt>, the creating
emulator client <bcp14>MUST</bcp14> use a <tt>leaf_node</tt> operation secret.</t>
        <t>Similarly, if an emulator client generates a Commit with an update path, it
<bcp14>MUST</bcp14> 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
DerivationInfo struct as the <tt>virtual_clients</tt> component data in the LeafNode.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque epoch_id<V>;
  opaque ciphertext<V>;
} DerivationInfo;

struct {
  opaque init_secret<V>;
} ExternalInitSecret;

struct {
  uint32 leaf_index;
  uint32 generation;
  select (LeafNode.leaf_node_source) {
    case key_package:
      uint32 key_package_index;
    case update:
      struct{};
    case commit:
      optional<ExternalInitSecret> external_init_secret;
  };
} DerivationInfoTBE;
]]></sourcecode>
        <t>For a LeafNode in an external Commit, <tt>external_init_secret</tt> <bcp14>MUST</bcp14> contain the
<tt>init_secret</tt> produced by external initialization as described in
<xref section="8.3" sectionFormat="of" target="RFC9420"/>. For a LeafNode in any other Commit, the
<tt>external_init_secret</tt> field <bcp14>MUST</bcp14> be absent.</t>
        <t>The <tt>ciphertext</tt> is the serialized DerivationInfoTBE encrypted with the AEAD
scheme of the emulation group's ciphersuite, with the <tt>epoch_id</tt> as AAD. The
<tt>LeafNode.leaf_node_source</tt> selector is the <tt>leaf_node_source</tt> of the LeafNode
carrying the DerivationInfo. The AEAD key and nonce are derived from the
epoch's <tt>epoch_encryption_key</tt>, using
the serialized <tt>encryption_key</tt> field of the LeafNode carrying the component
as context:</t>
        <artwork><![CDATA[
derivation_info_key = ExpandWithLabel(epoch_encryption_key, "key",
                                      encryption_key, AEAD.Nk)
derivation_info_nonce = ExpandWithLabel(epoch_encryption_key, "nonce",
                                        encryption_key, AEAD.Nn)
]]></artwork>
        <t>Since every virtual-client operation produces a LeafNode with a fresh
<tt>encryption_key</tt>, each distinct DerivationInfoTBE is encrypted under a
distinct key-nonce pair. Re-encrypting the same DerivationInfoTBE for the same
LeafNode yields an identical ciphertext, which is benign. This only holds
because a consumed operation-ratchet generation is never reused: for external
Commit LeafNodes, the DerivationInfoTBE contains the <tt>external_init_secret</tt>,
which changes with every encapsulation. Deriving a LeafNode for a retried
external Commit from the same generation would therefore encrypt a different
DerivationInfoTBE under the same key and nonce and compromise the AEAD.
Instead, the retry <bcp14>MUST</bcp14> consume a fresh generation as described in
<xref target="generating-virtual-client-secrets"/>.</t>
        <t>The operation type used to derive the LeafNode's <tt>operation_secret</tt> is
determined by the LeafNode's <tt>leaf_node_source</tt>
(<xref section="7.2" sectionFormat="of" target="RFC9420"/>): <tt>key_package</tt> maps to <tt>key_package</tt>, while
<tt>update</tt> and <tt>commit</tt> map to <tt>leaf_node</tt>. The <tt>operation_context</tt> is
determined by the operation type as described in
<xref target="generating-virtual-client-secrets"/>: zero-length for <tt>key_package</tt>
operations, and the <tt>group_id</tt> of the higher-level group in which the LeafNode
is used for <tt>leaf_node</tt> operations. The <tt>leaf_index</tt> and <tt>generation</tt> fields
<bcp14>MUST</bcp14> be the values used with that operation type and operation context to
derive the LeafNode's <tt>operation_secret</tt>. For KeyPackage LeafNodes,
<tt>generation</tt> identifies the batch <tt>key_package</tt> operation generation and
<tt>key_package_index</tt> identifies the individual KeyPackage within that batch. For
<tt>leaf_node</tt> operations, the DerivationInfoTBE contains no <tt>key_package_index</tt>.
For external Commit LeafNodes, the DerivationInfoTBE additionally carries the
external init secret needed to process the Commit.</t>
        <t>When other emulator clients receive a LeafNode for the virtual client, they use
the <tt>epoch_id</tt> to determine the epoch of the emulation group from which to
derive the secrets necessary to re-create the key material of the LeafNode and
potential UpdatePath. They decrypt the DerivationInfo and use the operation
type determined from the LeafNode's <tt>leaf_node_source</tt>, together with the
<tt>leaf_index</tt> and <tt>generation</tt> fields, as inputs to the operation secret
derivation described in <xref target="generating-virtual-client-secrets"/>. For a KeyPackage
LeafNode, they then use <tt>key_package_index</tt> to derive the per-KeyPackage seed
secret from the batch <tt>key_package</tt> operation secret and use that seed to
re-create the LeafNode key material.</t>
        <t>When processing an external Commit sent by the virtual client, an emulator
client uses the <tt>external_init_secret</tt> from the DerivationInfoTBE as the
external init secret for the new epoch. If <tt>external_init_secret</tt> is absent,
the emulator client <bcp14>MUST</bcp14> reject the Commit.</t>
        <t>The <tt>external_init_secret</tt> is carried in the DerivationInfo because the other
emulator clients cannot always derive it themselves. If the external Commit
resynchronizes the virtual client's membership in a group it is already a
member of, the other emulator clients hold the previous epoch's
<tt>external_secret</tt> and could recover the init secret from the <tt>kem_output</tt> in
the ExternalInit proposal (<xref section="8.3" sectionFormat="of" target="RFC9420"/>). If the virtual client
externally joins a group it was not previously a member of, however, they hold
no prior epoch state for that group and cannot. Carrying the init secret in
the DerivationInfo covers both cases uniformly.</t>
        <t>The <tt>DerivationInfo</tt> on the active virtual-client LeafNode binds that
virtual client's membership in the higher-level group to the emulation-group
epoch identified by <tt>epoch_id</tt>. Protocol steps that require per-epoch
emulation-group state for a higher-level group, such as computing the
<tt>reuse_guard</tt> (<xref target="reuse-guard"/>) or a generation ID
(<xref target="coordinating-ratchet-generations-with-the-ds"/>), <bcp14>MUST</bcp14> use the
emulation-group epoch identified by the active virtual-client LeafNode.</t>
      </section>
      <section anchor="creating-groups-with-the-virtual-client">
        <name>Creating groups with the virtual client</name>
        <t>When an emulator client creates a higher-level group with the virtual client as
the creator, it <bcp14>MUST</bcp14> create the initial LeafNode as described in
<xref target="creating-leafnodes-and-updatepaths"/>. <xref target="RFC9420"/> does not prescribe a
<tt>leaf_node_source</tt> for the creator's LeafNode. The creator LeafNode of a
virtual client <bcp14>MUST</bcp14> have <tt>leaf_node_source</tt> <tt>key_package</tt>. Since no KeyPackage
is published for this LeafNode, the creating emulator client derives its key
material from a dedicated <tt>key_package</tt> operation: it consumes a fresh
<tt>key_package</tt> operation-ratchet generation and derives a single per-KeyPackage
seed secret with <tt>key_package_index</tt> 0. No KeyPackageUpload is sent for this
operation. The batch consists of only this derivation and is closed
immediately, and the batch <tt>operation_secret</tt> is deleted after the seed secret
has been derived.</t>
        <t>Like any other LeafNode with <tt>leaf_node_source</tt> <tt>key_package</tt>, the creator
LeafNode carries a <tt>lifetime</tt> (<xref section="7.2" sectionFormat="of" target="RFC9420"/>), and members
validating the ratchet tree, including members joining later, may reject a
leaf whose lifetime has expired. The creating emulator client <bcp14>SHOULD</bcp14> choose
the lifetime according to the application's LeafNode validity policy, and the
virtual client's leaf <bcp14>SHOULD</bcp14> be updated before the lifetime expires.</t>
        <t>Instead of choosing the initial epoch secret of the new group randomly as
described in <xref section="11" sectionFormat="of" target="RFC9420"/>, the creating emulator client <bcp14>MUST</bcp14>
derive it from the creator LeafNode's per-KeyPackage seed secret:</t>
        <artwork><![CDATA[
epoch_secret = DeriveSecret(key_package_seed_secret, "Group Creation")
]]></artwork>
        <t>DeriveSecret is computed with the higher-level group's ciphersuite, so that
<tt>epoch_secret</tt> has the size KDF.Nh required by that group's key schedule. This
makes the initial epoch state of the higher-level group derivable by every
emulator client from the DerivationInfo on the creator LeafNode alone, and it
makes retried group creation attempts, each of which consumes a fresh
generation (see <xref target="generating-virtual-client-secrets"/>), independent of one
another.</t>
        <t>The application <bcp14>MUST</bcp14> fan out the initial group creation material to all current
emulator clients before delivering any other content from that higher-level
group to those emulator clients. The initial group creation material consists
of the GroupInfo for the newly created group, the creator LeafNode or a
ratchet_tree extension that contains it, and any application-defined context
needed to associate the material with the higher-level group. An emulator
client <bcp14>MUST</bcp14> process the initial group creation material before processing any
other content from that higher-level group. This requirement parallels the one
for external join material in
<xref target="externally-joining-groups-with-the-virtual-client"/>.</t>
        <t>When processing initial group creation material, an emulator client verifies
the GroupInfo as described in <xref section="12.4.3.1" sectionFormat="of" target="RFC9420"/> and the ratchet
tree as described in <xref section="12.4.3.3" sectionFormat="of" target="RFC9420"/>, decrypts the
DerivationInfo in the creator LeafNode, reconstructs the LeafNode's key
material as described in <xref target="creating-leafnodes-and-updatepaths"/>, re-derives
<tt>epoch_secret</tt> from the same per-KeyPackage seed secret, and uses it to
initialize the higher-level group's epoch 0 state. If the GroupInfo cannot be
verified using the resulting epoch state, the emulator client <bcp14>MUST</bcp14> reject the
initial group creation material.</t>
      </section>
      <section anchor="virtual-client-actions">
        <name>Virtual client actions</name>
        <t>Emulator clients sometimes need to communicate directly to operate the virtual
client. The acting emulator client can attach such information to a Commit to
the emulation group using the SafeAAD mechanism described in
<xref section="4.9" sectionFormat="of" target="I-D.ietf-mls-extensions"/>. The SafeAAD component data of the
<tt>virtual_clients</tt> component is a VirtualClientAction struct.</t>
        <t>Sending an action as part of a 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 action is
authenticated as part of the Commit.</t>
        <t>The <tt>key_package_upload</tt> action is one way applications <bcp14>MAY</bcp14> use to communicate
a KeyPackageUpload message (<xref target="creating-and-uploading-keypackages"/>) to the
other emulator clients.</t>
        <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  key_package_upload(1),
  (255)
} ActionType;

struct {
  ActionType action_type;
  select (VirtualClientAction.action_type) {
    case key_package_upload:
      KeyPackageUpload key_package_upload;
  };
} VirtualClientAction;
]]></sourcecode>
        <section anchor="creating-and-uploading-keypackages">
          <name>Creating and uploading KeyPackages</name>
          <t>When creating KeyPackages to upload, the creating emulator client derives one
<tt>key_package</tt> operation secret using <tt>(epoch_id, leaf_index, generation,
operation_type = key_package, operation_context = zero-length)</tt>, as described
in <xref target="generating-virtual-client-secrets"/>. The <tt>generation</tt> is the single
<tt>key_package</tt> operation-ratchet generation used for the whole upload batch. For
each KeyPackage, the creating emulator client chooses a <tt>key_package_index</tt> and
derives the <tt>init_key_secret</tt>, <tt>signature_key_secret</tt>, and
<tt>encryption_key_secret</tt> from the per-KeyPackage seed secret derived using that
index. The <tt>key_package_index</tt> values in a KeyPackageUpload <bcp14>MUST</bcp14> be unique.
Senders <bcp14>SHOULD</bcp14> use consecutive values starting at zero.</t>
          <t>The KeyPackage's LeafNode <bcp14>MUST</bcp14> contain a DerivationInfo as described in
<xref target="creating-leafnodes-and-updatepaths"/> whose encrypted DerivationInfoTBE
contains the same <tt>leaf_index</tt>, <tt>generation</tt>, and <tt>key_package_index</tt> values
used for the KeyPackage. The <tt>generation</tt> value <bcp14>MUST</bcp14> be the generation reported
in the corresponding KeyPackageUpload message, and the <tt>key_package_index</tt>
field, which is present for KeyPackage LeafNodes, <bcp14>MUST</bcp14> be the value reported
for this KeyPackageRef in that upload.</t>
          <t>The KeyPackageUpload closes the batch. After sending the KeyPackageUpload, the
creating emulator client <bcp14>MUST NOT</bcp14> use the same operation generation to derive
additional KeyPackages. After deriving all per-KeyPackage material needed for
the upload, the creating emulator client <bcp14>MUST</bcp14> delete the batch
<tt>operation_secret</tt>.</t>
          <t>To make other emulator clients aware of the new KeyPackages and allow them to
process any corresponding Welcome messages, the creating client <bcp14>MUST</bcp14> send them
a KeyPackageUpload message covering all new KeyPackages before making the
KeyPackages available to other parties.</t>
          <sourcecode type="tls"><![CDATA[
struct {
  KeyPackageRef key_package_ref;
  uint32 key_package_index;
} KeyPackageInfo;

struct {
  opaque epoch_id<V>;
  uint32 leaf_index;
  uint32 generation;
  KeyPackageInfo key_package_info<V>;
} KeyPackageUpload;
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>key_package_ref</tt>: The hash reference of the generated KeyPackage computed as
described in <xref section="5.2" sectionFormat="of" target="RFC9420"/>.</t>
            </li>
            <li>
              <t><tt>key_package_index</tt>: A sender-chosen counter used as KDF context to
domain-separate this KeyPackage from the other KeyPackages in the same
KeyPackageUpload. It <bcp14>MUST</bcp14> be unique within the KeyPackageUpload.</t>
            </li>
            <li>
              <t><tt>epoch_id</tt>: The epoch ID of the emulation group epoch used to derive the
batch <tt>key_package</tt> operation secret</t>
            </li>
            <li>
              <t><tt>leaf_index</tt>: The leaf index of the emulator client in the emulation group
that created the KeyPackages</t>
            </li>
            <li>
              <t><tt>generation</tt>: The single <tt>key_package</tt> operation-ratchet generation used to
derive the batch operation secret for this KeyPackageUpload</t>
            </li>
            <li>
              <t><tt>key_package_info</tt>: The information required to re-derive the
<tt>init_key_secret</tt> for each individual KeyPackage</t>
            </li>
          </ul>
          <t>Any emulator client that receives a KeyPackageUpload message <bcp14>MUST</bcp14> verify that
the <tt>key_package_index</tt> values are unique within the upload and <bcp14>MUST</bcp14> reject the
upload otherwise. The recipient uses <tt>epoch_id</tt>, <tt>leaf_index</tt>, <tt>generation</tt>,
<tt>operation_type</tt> <tt>key_package</tt>, and the zero-length <tt>operation_context</tt> to
derive the batch <tt>operation_secret</tt>. For each KeyPackageInfo, the recipient
uses <tt>key_package_index</tt> to derive the per-KeyPackage seed secret, then derives
the KeyPackage's <tt>init_key</tt> and LeafNode key material from that seed. If the
recipient receives a Welcome, it can then check which <tt>init_key</tt> to use based
on the KeyPackageRef.</t>
          <t>To preserve outstanding KeyPackage semantics, recipients <bcp14>MUST</bcp14> process the
KeyPackageUpload at receipt time and retain per-KeyPackage material sufficient
to process any Welcome for each listed KeyPackageRef. After deriving the
per-KeyPackage material needed for the upload, recipients <bcp14>MUST</bcp14> delete the batch
<tt>operation_secret</tt>.</t>
          <t>How the creating client sends the message to the other emulator clients is up
to the application, as long as every current emulator client receives it before
the KeyPackages are made available and emulator clients added later receive
equivalent state via <tt>active_key_packages</tt> in NewEmulatorClientState. One way
to send the message is the
<tt>key_package_upload</tt> action described in <xref target="virtual-client-actions"/>.</t>
        </section>
        <section anchor="externally-joining-groups-with-the-virtual-client">
          <name>Externally joining groups with the virtual client</name>
          <t>An emulator client that uses an external commit to join a group with the virtual
client relies on the higher-level group's Commit sequencing rules to determine
whether that external commit is accepted. When creating the Commit to join the
group externally, it <bcp14>MUST</bcp14> generate the LeafNode and path as described in
<xref target="creating-leafnodes-and-updatepaths"/>.</t>
          <t>An external Commit sent on behalf of the virtual client reaches the other
emulator clients like any other virtual-client message (see
<xref target="delivery-service"/>). If the virtual client was already a member of the
group, the other emulator clients hold the group's state and process the
external Commit like any other handshake message. If the virtual client
externally joins a group it was not previously a member of, however, the
other emulator clients hold no state for that group and cannot process the
Commit by itself.</t>
          <t>For such groups, the application <bcp14>MUST</bcp14> make the external join material
available to all current emulator clients before delivering any other content
from that higher-level group to them. The external join material consists of
the GroupInfo the joining emulator client used to create the external Commit,
the ratchet tree of the corresponding epoch (unless it is carried in the
GroupInfo's <tt>ratchet_tree</tt> extension), and any application-defined context
needed to associate the material with the higher-level group. An emulator
client <bcp14>MUST</bcp14> process the external join material together with the external
Commit before processing any other content from that higher-level group.</t>
          <t>When processing external join material, an emulator client verifies the
GroupInfo as described in <xref section="12.4.3.2" sectionFormat="of" target="RFC9420"/> and the ratchet
tree as described in <xref section="12.4.3.3" sectionFormat="of" target="RFC9420"/> before applying the
external Commit.</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 <bcp14>MUST</bcp14>
prevent this by computing the <tt>reuse_guard</tt>, as described below instead of
sampling it randomly.</t>
        <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 pseudorandom permutation
over an arbitrary input and output space.</t>
          <t>This document uses the FF1 mode from <xref target="NIST"/> instantiated with AES-128 as the
underlying block cipher, with radix 2, numeral strings of length 32, and an
empty tweak. A 32-bit unsigned integer is mapped to a numeral string by listing
its bits from most significant to least significant; the output numeral string
is mapped back to a 32-bit unsigned integer in the same way.</t>
          <artwork><![CDATA[
output = SmallSpacePRP.Encrypt(key, input)
input = SmallSpacePRP.Decrypt(key, output)
]]></artwork>
          <t><tt>key</tt> is a 16-byte AES-128 key; <tt>input</tt> and <tt>output</tt> are 32-bit unsigned
integers. Where a 4-byte value such as the <tt>reuse_guard</tt> is required, the
integer is encoded in network byte order (big-endian).</t>
        </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 <tt>N_e</tt> is equal to <tt>leaf_index_e</tt>, where:</t>
          <ul spacing="normal">
            <li>
              <t><tt>e</tt> is the emulation-group epoch that produced the active virtual-client
LeafNode in the higher-level group, identified by the <tt>epoch_id</tt> field of
that LeafNode's <tt>DerivationInfo</tt> (see
<xref target="creating-leafnodes-and-updatepaths"/>).</t>
            </li>
            <li>
              <t><tt>N_e</tt> is the number of leaf nodes in the emulation group's ratchet tree at
epoch <tt>e</tt>, including blank leaves (see <xref section="7.7" sectionFormat="of" target="RFC9420"/>). Since
the ratchet tree is always full, <tt>N_e</tt> is a power of two, every member's
leaf index is strictly less than <tt>N_e</tt>, and no two emulator clients share
the same residue modulo <tt>N_e</tt>.</t>
            </li>
            <li>
              <t><tt>leaf_index_e</tt> is the encrypting emulator client's leaf index in the
emulation group at epoch <tt>e</tt>.</t>
            </li>
          </ul>
          <t>They then calculate:</t>
          <artwork><![CDATA[
prp_key = ExpandWithLabel(reuse_guard_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>reuse_guard_secret</tt> is derived as described in
<xref target="generating-virtual-client-secrets"/> for emulation-group epoch <tt>e</tt>, identified
by the virtual client's currently active LeafNode in the higher-level group.
<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>
          <t>Recipient emulator clients can use the <tt>reuse_guard</tt> to recover the sender's
leaf index in the emulation group. Since they share <tt>reuse_guard_secret</tt> and
have access to <tt>key_schedule_nonce</tt> for the message, they can re-derive
<tt>prp_key</tt> and invert the PRP to obtain <tt>x = SmallSpacePRP.Decrypt(prp_key,
reuse_guard)</tt>. The encrypting emulator client's leaf index in the emulation
group at epoch <tt>e</tt> is then <tt>leaf_index_e = x mod N_e</tt>, where <tt>e</tt> and <tt>N_e</tt> are
determined as described above. This allows recipients to attribute application
messages to specific emulator clients without revealing the sender to outside
observers.</t>
        </section>
        <section anchor="coordinating-ratchet-generations-with-the-ds">
          <name>Coordinating ratchet generations with the DS</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 <bcp14>SHOULD</bcp14> prevent this issue by coordinating the use of
individual ratchet generations for encryption through the DS. Emulator clients
<bcp14>MAY</bcp14> send a generation ID to the DS whenever they fan out a private message. The
generation ID is derived as follows.</t>
          <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  application(1),
  handshake(2),
  (255)
} RatchetType;

struct {
  opaque group_id<V>;
  uint64 epoch;
  uint32 generation;
  RatchetType ratchet_type;
} PrivateMessageContext;

generation_id = ExpandWithLabel(generation_id_secret, "generation id",
                      PrivateMessageContext, Kdf.Nh)
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>group_id</tt> is the <tt>group_id</tt> of the higher-level group in which the
PrivateMessage is sent</t>
            </li>
            <li>
              <t><tt>epoch</tt> is the epoch of that higher-level group at which the
PrivateMessage is sent</t>
            </li>
            <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"/> for the emulation-group epoch identified
by the active virtual-client LeafNode in the higher-level group</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 higher-level group, per higher-level group
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>
    <section anchor="emulation-group-management">
      <name>Emulation group management</name>
      <t>Managing the emulation group is more elaborate than performing simple MLS
operations within it.</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>A joining emulator client is added to the emulation group by a provisioning
emulator client via the usual MLS Add + Welcome. The GroupInfo in that
Welcome carries the <tt>virtual_clients</tt> component (<xref target="iana-considerations"/>),
whose component data is a NewEmulatorClientState struct that provides the
state the joining emulator client needs to act as the virtual client going
forward.</t>
        <t>The NewEmulatorClientState struct contains the complete secret state of the
virtual client. Emulator clients <bcp14>MUST</bcp14> include it only in GroupInfo objects that
are encrypted as part of a Welcome message for the emulation group. In
particular, a GroupInfo object published to enable external commits into the
emulation group <bcp14>MUST NOT</bcp14> contain a <tt>virtual_clients</tt> component.</t>
        <t>How the joining emulator client subsequently becomes an active participant in
each higher-level group is application-defined. This document specifies two
variants that the provisioning emulator client <bcp14>MAY</bcp14> use on a per-group basis:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Variant A (provisioning state transfer).</strong> The provisioning emulator client
includes, for each higher-level group, the key-schedule outputs of the current
epoch together with the HPKE private keys on the virtual client's direct path.
The joining emulator obtains the RatchetTree and the GroupContext from an
application-defined source.</t>
          </li>
          <li>
            <t><strong>Variant B (external commit).</strong> The provisioning emulator client need only
convey (or otherwise let the joining emulator client learn) which higher-level
groups the virtual client is in. The joining
emulator client acquires each group's current GroupInfo (from the DS or some
other application-defined source) and performs an external commit into the
group, evicting the virtual client's prior membership with a "resync" Remove
proposal as described in <xref section="12.4.3.2" sectionFormat="of" target="RFC9420"/>.</t>
          </li>
        </ul>
        <t>Applications <bcp14>MAY</bcp14> mix the two variants across groups, for example using
Variant A for groups where metadata hiding matters and Variant B elsewhere.</t>
        <t>Regardless of the variant chosen, a new emulator client <bcp14>MUST NOT</bcp14> send
PrivateMessages in a higher-level group while the DerivationInfo of
the active virtual-client LeafNode identifies an emulation-group epoch in which
the new emulator client was not a member. The new emulator client has no leaf
index at that epoch and therefore cannot compute the <tt>reuse_guard</tt> as described
in <xref target="reuse-guard"/>. Before the new emulator client can send messages in such a
higher-level group, the virtual-client LeafNode <bcp14>MUST</bcp14> be rotated (e.g., by a
Commit with an update path or an Update proposal followed by a Commit) to a
more recent emulation-group epoch in which the new emulator client is a member.</t>
        <t>Note that in higher-level groups where handshake messages are sent as
PrivateMessages, the new emulator client cannot send this rotating Commit
itself. In such groups, the rotation has to be performed by an existing
emulator client, unless the application permits handshake messages framed as
PublicMessages or external commits (Variant B), in which case the new emulator
client can rotate the LeafNode itself.</t>
        <section anchor="trade-offs">
          <name>Trade-offs</name>
          <ul spacing="normal">
            <li>
              <t><strong>Observability.</strong> Variant A produces an ordinary Commit that looks like
any other key rotation to the rest of the higher-level group. Variant B
appears as the virtual client leaving and re-joining, which is visible to
every member and may undermine metadata-hiding goals.</t>
            </li>
            <li>
              <t><strong>Forward secrecy.</strong> Variant A chains the new epoch from the previous epoch's
<tt>init_secret</tt>. Variant B breaks the commit chain resulting in weaker forward
secrecy at the point of onboarding.</t>
            </li>
            <li>
              <t><strong>Policy.</strong> Some applications may restrict external commits by policy leaving
Variant A as the only option.</t>
            </li>
            <li>
              <t><strong>State transfer cost.</strong> Variant A requires O(log N) HPKE private keys and the
current epoch's key-schedule state per higher-level group. Depending on group
size and the group's ciphersuite, this may exceed the application's
performance constraints. Variant B's overhead is constant per group.</t>
            </li>
          </ul>
        </section>
        <section anchor="state-transfer-protocol">
          <name>State transfer protocol</name>
          <t>Applications <bcp14>MAY</bcp14> use the following structs to transfer group data to the newly
added emulator client.</t>
          <sourcecode type="tls"><![CDATA[
opaque HPKEPrivateKey<V>;

struct {
  uint8 prefix_length;
  opaque prefix<V>;
  opaque node_secret<V>;
} PPRFNode;

struct {
  PPRFNode nodes<V>;
} PPRFState;

enum {
  reserved(0),
  key_package(1),
  leaf_node(2),
  application(3),
  (255)
} VirtualClientOperationType;

struct {
  opaque epoch_id<V>;
  VirtualClientOperationType operation_type;
  uint32 leaf_index;
  uint32 generation;
  opaque operation_context<V>;
  opaque operation_secret<V>;
} RetainedOperationSecret;

struct {
  uint32 node_index;
  opaque node_secret<V>;
} SecretTreeNodeState;

enum {
  reserved(0),
  application(1),
  handshake(2),
  operation(3),
  (255)
} SecretTreeRatchetType;

struct {
  uint32 leaf_index;
  SecretTreeRatchetType ratchet_type;
  select (SecretTreeRatchetState.ratchet_type) {
    case application:
      struct{};
    case handshake:
      struct{};
    case operation:
      VirtualClientOperationType operation_type;
  };
  uint32 generation;
  opaque next_secret<V>;
} SecretTreeRatchetState;

struct {
  SecretTreeNodeState node_secrets<V>;
  SecretTreeRatchetState ratchet_states<V>;
} SecretTreeState;

struct {
  KeyPackageRef key_package_ref;
  opaque epoch_id<V>;
  uint32 leaf_index;
  uint32 generation;
  uint32 key_package_index;
} KeyPackageDerivationInfo;

struct {
  opaque epoch_id<V>;
  uint32 leaf_index;
  uint32 generation;
  uint32 key_package_index;
  opaque key_package_seed_secret<V>;
} RetainedKeyPackageMaterial;

struct {
  opaque epoch_id<V>;
  SecretTreeState operation_secret_tree;
  opaque epoch_encryption_key<V>;
  opaque generation_id_secret<V>;
  opaque reuse_guard_secret<V>;
} EmulationEpochState;

enum {
  reserved(0),
  state_transfer(1),
  external_commit(2),
  (255)
} HigherLevelGroupStateType;

struct {
  opaque group_id<V>;
  HigherLevelGroupStateType state_type;
  select (HigherLevelGroupState.state_type) {
    case state_transfer:
      opaque init_secret<V>;
      opaque sender_data_secret<V>;
      opaque exporter_secret<V>;
      opaque external_secret<V>;
      opaque confirmation_key<V>;
      opaque membership_key<V>;
      opaque resumption_psk<V>;
      opaque epoch_authenticator<V>;
      SecretTreeState secret_tree;
      PPRFState safe_exporter_tree;
      HPKEPrivateKey direct_path_private_keys<V>;
    case external_commit:
      struct{};
  };
} HigherLevelGroupState;

struct {
  opaque signing_key_material<V>;
  KeyPackageDerivationInfo active_key_packages<V>;
  RetainedKeyPackageMaterial retained_key_package_material<V>;
  RetainedOperationSecret retained_operation_secrets<V>;
  EmulationEpochState past_emulation_epochs<V>;
  HigherLevelGroupState higher_level_groups<V>;
} NewEmulatorClientState;
]]></sourcecode>
          <ul spacing="normal">
            <li>
              <t><tt>HPKEPrivateKey</tt> contains the serialized HPKE KEM private key for the
ciphersuite used by the higher-level group.</t>
            </li>
            <li>
              <t><tt>PPRFState</tt> serializes a punctured binary-tree PRF as the set of retained
subtree roots. The root of an unpunctured tree is represented by a
<tt>PPRFNode</tt> with <tt>prefix_length</tt> 0 and a zero-length <tt>prefix</tt>. For other
nodes, <tt>prefix</tt> contains the first <tt>prefix_length</tt> bits of the node's path,
packed from most-significant bit to least-significant bit in each octet. Any
unused low-order bits in the final octet <bcp14>MUST</bcp14> be zero. The entries in
<tt>nodes</tt> <bcp14>MUST</bcp14> be prefix-free and sorted lexicographically by prefix.</t>
            </li>
            <li>
              <t><tt>RetainedOperationSecret</tt> carries an <tt>operation_secret</tt> whose operation
ratchet generation has been deleted, but whose derived key material is still
live. Entries are identified by <tt>(epoch_id, operation_type, leaf_index,
generation, operation_context)</tt>.</t>
            </li>
            <li>
              <t><tt>RetainedKeyPackageMaterial</tt> carries a <tt>key_package_seed_secret</tt> derived from
a batch <tt>key_package</tt> operation secret whose operation-ratchet generation has
been deleted. Entries are identified by <tt>(epoch_id, leaf_index, generation,
key_package_index)</tt>.</t>
            </li>
            <li>
              <t><tt>SecretTreeState</tt> serializes the retained state of an RFC 9420 Secret Tree.
Each <tt>SecretTreeNodeState</tt> contains an unexpanded tree node secret and its
RFC 9420 tree node index. Each <tt>SecretTreeRatchetState</tt> contains the current
state of a derived per-leaf hash ratchet; <tt>next_secret</tt> is the ratchet secret
that will be used to derive the secret for <tt>generation</tt>. The serialized state
<bcp14>MUST</bcp14> contain exactly the retained secrets needed to continue the Secret Tree
deletion schedule from the sender's current state and <bcp14>MUST NOT</bcp14> contain
secrets that have already been deleted. The <tt>application</tt> and <tt>handshake</tt>
ratchet types are used for higher-level MLS Secret Trees. The <tt>operation</tt>
ratchet type is used for virtual-client operation secrets and includes an
<tt>operation_type</tt> field that identifies the per-leaf operation-type ratchet.</t>
            </li>
            <li>
              <t><tt>signing_key_material</tt> is an application-defined blob that conveys whatever
signing-key state the joining emulator client needs. For configurations
where signing keys are derived from emulation-group secrets, it <bcp14>MAY</bcp14> be
zero-length. See <xref target="generating-virtual-client-secrets"/>.</t>
            </li>
            <li>
              <t><tt>active_key_packages</tt> lists every KeyPackage the virtual client has
outstanding. Each entry carries the KeyPackageRef together with the
identifiers needed to find the corresponding per-KeyPackage material. When a
Welcome arrives encrypted to one of these KeyPackages, the joining emulator
client identifies the entry by KeyPackageRef, then finds the
<tt>RetainedKeyPackageMaterial</tt> matching <tt>(epoch_id, leaf_index, generation,
key_package_index)</tt>.</t>
            </li>
            <li>
              <t><tt>retained_key_package_material</tt> contains per-KeyPackage seed secrets whose
derived key material is still live, for example because the corresponding
KeyPackage is outstanding or because the current LeafNode of a higher-level
group was created from that seed secret. This includes the seed secret of
the creator LeafNode of a higher-level group created by the virtual client
(<xref target="creating-groups-with-the-virtual-client"/>), for which no KeyPackage
exists.</t>
            </li>
            <li>
              <t><tt>retained_operation_secrets</tt> contains retained <tt>operation_secret</tt> values
whose derived key material is still live. This includes operation secrets for
the current LeafNode of each higher-level group and operation secrets for
sent but uncommitted LeafNodes or UpdatePaths. It <bcp14>MUST NOT</bcp14> include a
<tt>key_package</tt> operation secret after that secret has been used to derive a
KeyPackageUpload batch; KeyPackage-derived material is represented by
<tt>retained_key_package_material</tt>.
<tt>retained_operation_secrets</tt> is needed for the <tt>state_transfer</tt> onboarding
variant because the joining emulator client needs to reconstruct still-live
virtual-client artifacts whose operation-type ratchet generations have already
been deleted. The <tt>external_commit</tt> onboarding variant does not require these
retained operation secrets or retained KeyPackage material if it replaces
every still-live virtual-client artifact derived from an earlier
emulation-group epoch, including outstanding KeyPackages and active LeafNodes
in higher-level groups.</t>
            </li>
            <li>
              <t><tt>past_emulation_epochs</tt> carries, for every emulation-group epoch still
referenced by an active LeafNode, outstanding KeyPackage, or retained
operation secret or retained KeyPackage material and not equal to the current
epoch, the retained <tt>operation_secret_tree</tt> state, the
<tt>epoch_encryption_key</tt>, the <tt>generation_id_secret</tt>, and the
<tt>reuse_guard_secret</tt>. State for the current emulation-group epoch is not
included here because the joining emulator client derives it from the
emulation group's Welcome.</t>
            </li>
            <li>
              <t><tt>higher_level_groups</tt> contains one entry per active higher-level group.
Each entry carries the <tt>group_id</tt> and a <tt>state_type</tt> identifying which
variant applies.</t>
            </li>
          </ul>
          <t>For <tt>state_transfer</tt> entries, the provisioning emulator client transfers the
current epoch's key-schedule outputs and the retained per-epoch state:</t>
          <ul spacing="normal">
            <li>
              <t><tt>init_secret</tt> chains the joining emulator client's subsequent Commit
into the next epoch (<tt>init_secret[n-1]</tt> combines with the new
<tt>commit_secret</tt> to produce <tt>joiner_secret[n]</tt>).</t>
            </li>
            <li>
              <t><tt>sender_data_secret</tt> lets the joining emulator client decrypt sender
data on incoming PrivateMessages.</t>
            </li>
            <li>
              <t><tt>exporter_secret</tt> lets the joining emulator client produce
application-level exports from this epoch.</t>
            </li>
            <li>
              <t><tt>external_secret</tt> lets other parties perform further external
commits from this epoch.</t>
            </li>
            <li>
              <t><tt>confirmation_key</tt> lets the joining emulator client verify the
<tt>confirmation_tag</tt> on any incoming Commit.</t>
            </li>
            <li>
              <t><tt>membership_key</tt> lets the joining emulator client produce a valid
<tt>membership_tag</tt> on its own Commit sent as PublicMessage.</t>
            </li>
            <li>
              <t><tt>resumption_psk</tt> lets the joining emulator client participate as an
origin for resumption PSKs in this epoch, if the application uses them.</t>
            </li>
            <li>
              <t><tt>epoch_authenticator</tt> authenticates the current group state.</t>
            </li>
            <li>
              <t><tt>secret_tree</tt> is the current state of the group's Secret Tree, from
which the joining emulator client derives per-member handshake- and
application-ratchet keys needed to decrypt in-flight PrivateMessages.</t>
            </li>
            <li>
              <t><tt>safe_exporter_tree</tt> is the current punctured state of the Safe Exporter API's
Exporter Tree if the higher-level group uses that API. If the group does not
use the Safe Exporter API, <tt>nodes</tt> is zero-length. When used for a Safe
Exporter Tree, <tt>PPRFState</tt> paths are 16-bit paths indexed by <tt>ComponentID</tt>.</t>
            </li>
            <li>
              <t><tt>direct_path_private_keys</tt> is the list of HPKE private keys for each non-blank
node in the virtual client's filtered direct path. The first entry is the
private key for the parent of the virtual client's leaf, if that node is
non-blank. Subsequent entries correspond to the next non-blank nodes on the
direct path toward the root, in order. The virtual client's leaf private key
itself is derivable from the retained operation secret or retained
per-KeyPackage material identified by the DerivationInfo on the current
LeafNode and is therefore not transferred explicitly.</t>
            </li>
          </ul>
          <t>For <tt>external_commit</tt> entries, no additional per-group fields are included. The
joining emulator client external-commits into the group — fetching the current
GroupInfo from the DS or another application-defined source — and includes a
Remove proposal for the virtual client's prior leaf to evict the old membership.</t>
        </section>
      </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>Obtain a fresh credential that other emulation clients will accept.</t>
          </li>
          <li>
            <t>Perform an external join to the emulation group.</t>
          </li>
          <li>
            <t>Replace the virtual client's active key material by performing the following
steps. Before each step, generate, derive or otherwise obtain the necessary
credential and private signature key material. Ensure that other emulation
clients can obtain the private key material. Details on credential and
signature key generation and distribution are left to the application. The
application <bcp14>MAY</bcp14> derive signature key material based on the new emulation
group epoch as described in <xref target="generating-virtual-client-secrets"/>.  </t>
            <ol spacing="normal" type="1"><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
joined externally instead (potentially being queued for user approval
first).</t>
              </li>
            </ol>
          </li>
        </ol>
      </section>
      <section anchor="removing-emulator-clients">
        <name>Removing emulator clients</name>
        <t>Since all emulator clients hold all key material of the virtual client, removing
the emulator client entails its removal from the emulation group, as well as
rotating or revoking any other virtual-client specific key material.</t>
        <t>To effectively remove an emulator client, the emulator client committing the
proposal that removes the target client <bcp14>MUST</bcp14> take the following steps in order:</t>
        <ol spacing="normal" type="1"><li>
            <t>Effect the deletion of outstanding KeyPackages of the virtual client from the
DS. The set of outstanding KeyPackages can be determined from the
<tt>KeyPackageUpload</tt> messages previously sent to the emulation group (see
<xref target="creating-and-uploading-keypackages"/>).</t>
          </li>
          <li>
            <t>Commit a Remove proposal for the emulation client to be removed in the
emulation group, advancing it to a new epoch from which new virtual client
secrets will be derived (see <xref target="generating-virtual-client-secrets"/>).</t>
          </li>
        </ol>
        <t>Next, the application <bcp14>MUST</bcp14> provide new credentials and authentication key
material for the virtual client that can be used to replace existing credentials
and authentication key material in the next steps. The application <bcp14>MAY</bcp14> use the
<tt>signature_key_secret</tt> derived from any of the <tt>operation_secret</tt>s during the
next steps to derive group-specific key material. The application <bcp14>SHOULD</bcp14> take
steps to revoke any valid long lived credentials associated with the virtual
client that the removed emulator client had access to.</t>
        <t>Using the new emulation-group epoch, any combination of remaining emulator
clients <bcp14>MUST</bcp14> do the following steps (in any order):</t>
        <ul spacing="normal">
          <li>
            <t>Effect an update of the key material in every higher-level group in which the
virtual client is a member, using the new credential and authentication key
material provided by the application. This <bcp14>MAY</bcp14> be done by creating a commit
with an update path or sending an update proposal.</t>
          </li>
          <li>
            <t>Upload a fresh set of KeyPackages derived from the new emulation-group epoch
to replace those deleted in step 1.</t>
          </li>
        </ul>
        <t>A corollary of this removal procedure is that in most scenarios another emulator
client is required to be online and perform the necessary updates. The DS must
also support deletion of previously uploaded KeyPackages. This is in contrast to
the simple multi-client setup, where an external sender can effectively remove
individual clients and there are no additional functional requirements for the
DS.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="trust-between-emulator-clients">
        <name>Trust between emulator clients</name>
        <t>All emulator clients hold the complete secret state of the virtual client.
Compromise of a single emulator client is therefore equivalent to compromise of
the virtual client itself: the attacker learns the current epoch secrets of the
emulation group and of every higher-level group the virtual client is a member
of, and can impersonate the virtual client in all of them. Emulator clients
have to trust each other fully; the emulation group does not provide any
isolation between them.</t>
      </section>
      <section anchor="forward-secrecy">
        <name>Forward secrecy</name>
        <t>Forward secrecy for messages in higher-level groups depends on every emulator
client deleting consumed key material according to the deletion schedule of
<xref section="9.2" sectionFormat="of" target="RFC9420"/>. Since every emulator client processes every
message sent to a higher-level group, the effective forward secrecy of such a
group is bounded by the emulator client that is slowest to advance its ratchets
and delete its keys. The same applies to the retained state defined in this
document: RetainedOperationSecrets, RetainedKeyPackageMaterial, and past
emulation-epoch state (<xref target="adding-an-emulator-client"/>) extend the window during
which a compromise reveals previously transmitted data, and emulator clients
<bcp14>SHOULD</bcp14> delete them as soon as they are no longer needed. Applications that do
not onboard emulator clients through state transfer need not retain
RetainedOperationSecrets or RetainedKeyPackageMaterial at all (see
<xref target="generating-virtual-client-secrets"/>) and can instead retain only the derived
key material still in use, reducing this window.</t>
        <t>Some of this state is reachable through the virtual client's LeafNodes. The
DerivationInfo of an external Commit LeafNode embeds the <tt>init_secret</tt> of the
epoch created by that Commit, encrypted under the emulation-group epoch's
<tt>epoch_encryption_key</tt>. The LeafNode persists in the higher-level group's
ratchet tree until the virtual client's leaf is next updated, and emulator
clients retain the <tt>epoch_encryption_key</tt> for as long as the LeafNode is
active. Similarly, the initial epoch secret of a higher-level group created by
the virtual client remains derivable from the retained per-KeyPackage seed
secret of the creator LeafNode
(<xref target="creating-groups-with-the-virtual-client"/>). Updating the virtual client's
LeafNode soon after an external commit or a group creation allows emulator
clients to delete this state and limits the exposure.</t>
      </section>
      <section anchor="post-compromise-security">
        <name>Post-compromise security</name>
        <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="removing-emulator-clients-1">
        <name>Removing emulator clients</name>
        <t>The removal procedure in <xref target="removing-emulator-clients"/> is not atomic. Between
the Commit that removes an emulator client from the emulation group and the
completion of the key rotations in all higher-level groups, the removed client
still holds valid key material for those groups and can read traffic in them
and impersonate the virtual client. Applications <bcp14>SHOULD</bcp14> minimize this window
and <bcp14>SHOULD</bcp14> revoke any long-lived credentials the removed client had access to,
since a removed client that retains a valid virtual-client signing key and
credential can otherwise re-join a higher-level group via an external commit.
The procedure also depends on the DS actually deleting outstanding KeyPackages;
a KeyPackage that escapes deletion allows the removed client to process
Welcome messages addressed to the virtual client.</t>
      </section>
      <section anchor="handling-of-newemulatorclientstate">
        <name>Handling of NewEmulatorClientState</name>
        <t>The NewEmulatorClientState struct contains the complete secret state of the
virtual client and <bcp14>MUST</bcp14> only appear in GroupInfo objects encrypted within
Welcome messages, as specified in <xref target="adding-an-emulator-client"/>. Publishing a
GroupInfo containing the <tt>virtual_clients</tt> component, for example to enable
external commits, discloses the secrets of all higher-level groups the virtual
client is a member of.</t>
      </section>
      <section anchor="reuse-guard-1">
        <name>Reuse guard</name>
        <t>The guarantee that no two emulator clients select colliding nonces
(<xref target="reuse-guard"/>) relies on all emulator clients agreeing on <tt>N_e</tt>, on their
leaf indices at epoch <tt>e</tt>, and on the exact PRP instantiation described in
<xref target="small-space-prp"/>. The PRP key is 128 bits regardless of the ciphersuites in
use; this bounds the sender-attribution and unlinkability properties of the
reuse guard but does not affect the confidentiality of MLS messages.</t>
        <t>Since <tt>reuse_guard_secret</tt> is shared across all higher-level groups for a
given emulation-group epoch, two messages in different higher-level groups
that happen to use the same <tt>key_schedule_nonce</tt> will use the same <tt>prp_key</tt>.
This does not endanger nonce uniqueness, because the two messages are
encrypted under independent keys.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>Using a virtual client masks the emulation group's membership and activity from
other members of higher-level groups: additions, removals, and updates of
emulator clients appear in higher-level groups as ordinary LeafNode updates of
the virtual client, and PrivateMessages sent by different emulator clients are
indistinguishable to other higher-level group members. Whether the identity of
the emulator clients is hidden additionally depends on the design of the
Authentication Service and on the credentials the application provisions for
the virtual client.</t>
      <t>The following residual metadata remains observable:</t>
      <ul spacing="normal">
        <li>
          <t>The presence of a DerivationInfo in a LeafNode reveals to anyone
with access to the ratchet tree (including a DS that distributes GroupInfo
or ratchet trees) that the leaf belongs to a virtual client. Applications
that want to hide which leaves are virtual would need non-virtual clients to
include indistinguishable components.</t>
        </li>
        <li>
          <t>The <tt>epoch_id</tt> in a DerivationInfo is identical across all
LeafNodes and KeyPackages that the virtual client produces from the same
emulation-group epoch. Parties with access to the ratchet trees of multiple
higher-level groups can use it to link the virtual client's leaves across
those groups, and can observe how often the emulation group commits.</t>
        </li>
        <li>
          <t>Generation IDs (<xref target="coordinating-ratchet-generations-with-the-ds"/>) are only
attached by virtual-client senders and therefore identify virtual-client
traffic to the DS, in addition to revealing how many distinct ratchet
generations are in use.</t>
        </li>
        <li>
          <t>An external commit by a virtual client (Variant B of
<xref target="adding-an-emulator-client"/>, or <xref target="joining-externally"/>) is visible to all
members of the higher-level group as the virtual client leaving and
re-joining.</t>
        </li>
        <li>
          <t>The DerivationInfo ciphertext of a LeafNode with <tt>leaf_node_source</tt> <tt>commit</tt>
is longer when it carries an <tt>external_init_secret</tt>. Parties with access to
the ratchet tree, including members who join after the external commit, can
therefore tell that the virtual client's current leaf was created by an
external commit rather than a regular Commit, for as long as that leaf
remains in the tree.</t>
        </li>
      </ul>
    </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" registry.</t>
      <section anchor="virtualclients">
        <name>virtual_clients</name>
        <t>The component implementing the virtual client emulation defined in this
document. The component data carried in each location is determined by the
object in which the component appears:</t>
        <ul spacing="normal">
          <li>
            <t>In GroupInfo objects of the emulation group, the component data is a
NewEmulatorClientState struct carrying the state a newly added emulator
client needs to act as the virtual client
(<xref target="adding-an-emulator-client"/>).</t>
          </li>
          <li>
            <t>In LeafNode objects of a virtual client, the component data is a
DerivationInfo struct communicating how to derive the LeafNode's key
material (<xref target="creating-leafnodes-and-updatepaths"/>).</t>
          </li>
          <li>
            <t>In SafeAAD objects of Commits in the emulation group, the component data is
a VirtualClientAction struct communicating which virtual client action is
taken in conjunction with the Commit (<xref target="virtual-client-actions"/>).</t>
          </li>
          <li>
            <t>The component ID is additionally used with the Safe Exporter API to export
the per-epoch <tt>emulator_epoch_secret</tt> from the emulation group
(<xref target="generating-virtual-client-secrets"/>).</t>
          </li>
        </ul>
        <t>The requested registration is:</t>
        <ul spacing="normal">
          <li>
            <t>Value: 0x0006 (suggested)</t>
          </li>
          <li>
            <t>Name: virtual_clients</t>
          </li>
          <li>
            <t>Where: GI, LN, AD, ES</t>
          </li>
          <li>
            <t>Recommended: Y</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>
      <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </referencegroup>
      <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="2" month="March" year="2026"/>
          <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-09"/>
      </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>
      <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>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA81965Ibx5Xm/3yKHDpi1e0BYJKSx3bTM+MWSUkciRSHTdvh
cDgaBaDQKBOowlQV2GwzNOGH2D8bsfsE+xj7Jn6SPde8VRYa1KwjVj9sCV2V
lXny5Mlz/c50OjV91W/LC/vyuyv7u6rtD8XWPt1WZd13plgs2vI9/O13T82q
WdbFDh5ctcW6n1Zlv57utt30Pb8zXfI704ePzLLoy5umvbuwVb1ujKn27YXt
20PXP3748FcPH5uiLYsLe1UuD23V35l35d1t064u7Iu6L9u67KfP8BvGdH1R
r66LbVPDd+/KzuyrC/vHvllObNe0fVuuO/i3ux3+y5+MKQ79pmkvjJ1a+HJ3
Yf9tZi+3t2VtLPzDs/+35v/8723wa9PeFHX1l6KvmvrCPrj8/dUD+r3cFdX2
whb44J+b3xS74i9NPVs2Oz/6tzP7bbNZtM27YPxvm7otVtEf4k+83jRlXX2w
b/7bs/BD7+i92Tt+7zeroi+6TVvV5WxV+k9+ObMvly+r7RaGorfXh+2WP/xl
W9arok7+LqMv+I+75Y7/9psb/D1ezoOXMPhhW7TLv9y9exAs6cHLou2L9G/3
EG532O7wNUe5jf/Sm5l90yzKtg8+8qbYb4pyG/7hJLohH/6m5ZdbepdWZeqm
3cGb70tgB/vqxdXbC3qrL9qbsr+wm77fdxc/+1n9frs/LLpZXXX97KZ5/zP8
F/zlZ1f7clkV29eHxbZa0hy6n+E4s6vXs18+fDj9/Jdfz/arNY/KR+jBmxK+
vUNS4/N23bT2y22zfGefVvtN2dqXzarsbLO23+/LVtb1sgSmXXX08Fc06enr
tuzK9n1V39jn9bK92+OTTF3H4vTPVIj3smnbqrPP4BS9q2pjZrOZMdPp1BaL
rm+LJRyltxt4AM7wAabXW5jGsq0WMJnC7mgCtt8UPbD7trntcPP6ar8tSSjI
wbZ9AzQHHuhLWxg59cEDcNSs/sq/DEbj12GdwZB/bqq6396ZPTBLtaz2OHxV
W2RkGPqmbQ57e6hXQLzCdkARGGZbFuuZfVbugdBII6B0vylxTdVNjdSF/zLF
fq/7Nknm1dklDL8pt3u7qVYlEqDA8wYfXdlqt2+b96WFDVrjbtTLUmi5q1ar
bWnMT1BMtc3qsMTBkbJMJ3gPJFOztetiWW2rHlYCXwJ+ONQyEbso+9uyrHUe
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

-->

</rfc>
