<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mls-virtual-clients-02" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="MVC">MLS Virtual Clients</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mls-virtual-clients-02"/>
    <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="November" day="02"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 44?>

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

<section anchor="introduction">
      <name>Introduction</name>
      <t>The MLS protocol facilitates communication between clients, where in an MLS
group, each client is represented by the leaf to which it holds the private key
material. This document defines 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>This document discusses the technical challenges and specifies 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>First, 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, there would be only 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>Second, 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,
fluctuations in the number of emulator clients do not necessarily lead to
blanks the higher-level groups, 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 hide which emulator clients exist from the 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.</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>From the point of view
of other higher-level 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>One way this could be an issue is if the use of virtual clients prevents the
delivery service or other higher-level group members from detecting or evicting
stale clients. If one emulator client becomes stale (i.e. inactive) while
another keeps sending updates, the virtual client would appear active overall,
and the stale client may not be evicted in a timely manner.</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>Any PrivateMessage received by a virtual client (because that message was sent
in a group where the virtual client is a member) can be decrypted by all of the
emulator clients equally. Similarly, any PrivateMessage sent by a virtual
client to a group can be decrypted by all emulator clients except the one that
sent it.</t>
        <t>For this to work, if a higher-level group contains a virtual client, the
Delivery Service has to deliver messages sent by other group members to all
emulator clients, and messages sent by one emulator client to all other emulator
clients.</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>Cryptographic operations in this document use either the emulation group's
ciphersuite or a target ciphersuite. The target ciphersuite is determined by
the MLS object for which key material is being derived:</t>
        <ul spacing="normal">
          <li>
            <t>For a published KeyPackage, the target ciphersuite is the ciphersuite in the
KeyPackage.</t>
          </li>
          <li>
            <t>For the creator LeafNode of a new higher-level group, the target ciphersuite
is the ciphersuite selected for the new group.</t>
          </li>
          <li>
            <t>For a LeafNode or UpdatePath in an existing higher-level group, the target
ciphersuite is that group's ciphersuite.</t>
          </li>
        </ul>
        <t>Unless otherwise specified, operations that derive or process shared
emulation-group state use the emulation group's ciphersuite. This includes all
derivations from <tt>emulator_epoch_secret</tt> through <tt>operation_secret</tt>, including
the Virtual Client Operation Secret Tree and its operation ratchets. Material
that is used in a KeyPackage or higher-level group is imported into the target
ciphersuite as specified below before target-specific key material is derived.</t>
        <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 DerivationInfo structures 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>Before a secret derived with the emulation group's ciphersuite is used to
derive material for a target ciphersuite, it <bcp14>MUST</bcp14> be imported into the target
ciphersuite as follows:</t>
        <artwork><![CDATA[
target_prk =
  KDF.Extract("", source_secret)

target_secret =
  ExpandWithLabel(target_prk, label, context, KDF.Nh)
]]></artwork>
        <t>This two-step computation is denoted
<tt>ImportSecret(source_secret, label, context)</tt>. <tt>KDF.Extract</tt>,
<tt>ExpandWithLabel</tt>, and <tt>KDF.Nh</tt> in this computation are from the target
ciphersuite. The import <bcp14>MUST</bcp14> be performed even when the emulation group and
target use the same ciphersuite. The context passed to <tt>ImportSecret</tt> <bcp14>MUST</bcp14>
include the target ciphersuite. Importing a secret produces an input of the
size and form expected by the target ciphersuite's KDF, but does not increase
the entropy of <tt>source_secret</tt>. <tt>target_prk</tt> <bcp14>MUST</bcp14> be deleted immediately after
<tt>target_secret</tt> has been derived.</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 <tt>leaf_node</tt> operations, the target ciphersuite and higher-level group are
bound into the import of the <tt>operation_secret</tt>:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  CipherSuite cipher_suite;
  opaque group_id<V>;
} TargetOperationContext;
]]></sourcecode>
        <artwork><![CDATA[
target_operation_secret =
  ImportSecret(operation_secret, "vc target operation",
               TargetOperationContext)
]]></artwork>
        <t>The <tt>cipher_suite</tt> field <bcp14>MUST</bcp14> be the target ciphersuite, and <tt>group_id</tt> <bcp14>MUST</bcp14> be
the <tt>group_id</tt> of the higher-level group in which the operation is performed.
The MLS-related secrets are then derived with the target ciphersuite:</t>
        <artwork><![CDATA[
signature_key_secret =
  DeriveSecret(target_operation_secret, "Signature Key")

encryption_key_secret =
  DeriveSecret(target_operation_secret, "Encryption Key")

init_key_secret =
  DeriveSecret(target_operation_secret, "Init Key")

path_generation_secret =
  DeriveSecret(target_operation_secret, "Path Generation")
]]></artwork>
        <t>The <tt>target_operation_secret</tt> <bcp14>MUST</bcp14> be deleted immediately after these secrets
have been derived.</t>
        <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 {
  CipherSuite cipher_suite;
  uint32 key_package_index;
} KeyPackageSeedContext;
]]></sourcecode>
        <artwork><![CDATA[
key_package_seed_secret =
  ImportSecret(operation_secret, "vc key package seed",
               KeyPackageSeedContext)
]]></artwork>
        <t>The target ciphersuite used by <tt>ImportSecret</tt> and the <tt>cipher_suite</tt> field in
<tt>KeyPackageSeedContext</tt> <bcp14>MUST</bcp14> both be the ciphersuite of the KeyPackage. For the
creator LeafNode of a new higher-level group, they <bcp14>MUST</bcp14> both be the
ciphersuite selected for the new group. The <tt>key_package_index</tt> field is the
index assigned to this KeyPackage or creator LeafNode.</t>
        <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>These <tt>DeriveSecret</tt> invocations use the target ciphersuite. The
<tt>init_key_secret</tt> and <tt>encryption_key_secret</tt> are used with the target
ciphersuite's KEM to derive the corresponding HPKE key pairs. The
<tt>path_generation_secret</tt> is used as the first <tt>path_secret</tt> under the target
ciphersuite. All subsequent MLS processing prescribed by <xref target="RFC9420"/> for the
KeyPackage, LeafNode, UpdatePath, or higher-level group, including signatures
and hash references, uses the target ciphersuite.</t>
        <t>The source of the virtual client's signature key is application-defined. An
application <bcp14>MAY</bcp14> use <tt>signature_key_secret</tt> with the target ciphersuite's
signature algorithm 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. The <tt>ExpandWithLabel</tt> invocations and the <tt>AEAD.Nk</tt> and <tt>AEAD.Nn</tt>
values in this derivation are from the emulation group's ciphersuite:</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, using the KeyPackage's
ciphersuite as the target ciphersuite, and use that seed to re-create the
LeafNode key material. For an <tt>update</tt> or <tt>commit</tt> LeafNode, they import the
<tt>operation_secret</tt> into the higher-level group's ciphersuite before re-creating
the LeafNode and UpdatePath key material.</t>
        <t>After re-creating the key material, the emulator client <bcp14>MUST</bcp14> verify that the
derived public keys are equal to the received ones: the LeafNode's
<tt>encryption_key</tt> and, if the LeafNode is sent with an UpdatePath, the
<tt>encryption_key</tt> of each UpdatePathNode. The emulator client <bcp14>MUST</bcp14> reject the
message carrying the LeafNode (for example, a Commit, an Update proposal, or a
Welcome) if any of these keys differ, if the <tt>epoch_id</tt> does not identify an
emulation-group epoch for which it holds the required state, if the
DerivationInfo cannot be decrypted, or if the required operation-ratchet
generation has been deleted and no corresponding RetainedOperationSecret or
RetainedKeyPackageMaterial is available.</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 and the KeyPackage's ciphersuite. 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;
  CipherSuite cipher_suite;
  uint32 key_package_index;
  Extension extensions<V>;
} 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>cipher_suite</tt>: The ciphersuite of the generated KeyPackage. It determines
the target ciphersuite used to derive the per-KeyPackage seed secret and key
material.</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>extensions</tt>: The complete <tt>extensions</tt> vector from the generated
KeyPackage. The sender <bcp14>MUST</bcp14> copy this vector without changing extension
order or data, including unknown extensions and components.</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, together with its
extensions</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>cipher_suite</tt> as the target ciphersuite and uses <tt>cipher_suite</tt> and
<tt>key_package_index</tt> in <tt>KeyPackageSeedContext</tt> to derive the per-KeyPackage
seed secret, then derives the KeyPackage's <tt>init_key</tt> and LeafNode key material
from that seed. The sender <bcp14>MUST</bcp14> set <tt>cipher_suite</tt> to the ciphersuite in the
corresponding KeyPackage. If a recipient obtains the KeyPackage, it <bcp14>MUST</bcp14> verify
that the two values match. 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. Recipients <bcp14>MUST</bcp14> retain the
<tt>extensions</tt> vector with the corresponding KeyPackageRef and apply the semantics
of recognized extensions and components when processing Welcome messages and
managing the associated key material. 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 can prevent this issue by having the DS proactively
reject any messages that would use the same generation counter as a message that
was already accepted. Alternatively, clients communicating with an
eventually-consistent DS may need to retain messages for a short period of time
after they're sent, to support re-transmitting messages that conflicted with
another emulator client's messages.</t>
          <t>Emulator clients <bcp14>MAY</bcp14> send a generation ID to the DS when they fan out a
PrivateMessage. 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>The generation ID of two messages matches only when the messages are sent by the
same virtual client, to the same group, using the same encryption key. As such,
a Delivery Service that rejects messages with duplicate generation IDs also
rejects virtual client messages with duplicate generation counters. To provide
this same functionality without the generation ID, a Delivery Service would need
to (at minimum) store the number of messages each user has sent to a group, or
require users to process all messages sent to a group before allowing them to
send new ones. The former approach, storing the number of messages sent by each
user, may not be possible in anonymous or low-metadata applications. The latter
approach, requiring users to process all messages before sending any new ones,
may not be possible with an eventually-consistent DS or for other architectural
or performance reasons.</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 {
  uint32 node_index;
  HPKEPrivateKey private_key;
} DirectPathPrivateKey;

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 generation;
  select (SecretTreeRatchetState.ratchet_type) {
    case application:
    case handshake:
      opaque key<V>;
      opaque nonce<V>;
    case operation:
      opaque operation_generation_secret<V>;
  };
} SecretTreeGenerationState;

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>;
  SecretTreeGenerationState retained_generations<V>;
} SecretTreeRatchetState;

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

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

struct {
  CipherSuite cipher_suite;
  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>;
      opaque interim_transcript_hash<V>;
      SecretTreeState secret_tree;
      PPRFState safe_exporter_tree;
      DirectPathPrivateKey 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. <tt>cipher_suite</tt> identifies the target ciphersuite with which the
seed secret was imported and from which its key material is derived. Entries
are identified by <tt>(cipher_suite, 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>.
<tt>retained_generations</tt> holds one entry for each earlier generation whose
values are retained to handle out-of-order messages or operations (see
<xref section="9.2" sectionFormat="of" target="RFC9420"/> and <xref target="generating-virtual-client-secrets"/>): the
AEAD <tt>key</tt> and <tt>nonce</tt> of that generation for an <tt>application</tt> or
<tt>handshake</tt> ratchet, or its <tt>operation_generation_secret</tt> for an
<tt>operation</tt> ratchet. 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, its <tt>cipher_suite</tt>, and its
complete <tt>extensions</tt> vector, 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>(cipher_suite, 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>interim_transcript_hash</tt> is the group's current interim transcript hash
(<xref section="8.2" sectionFormat="of" target="RFC9420"/>). The joining emulator client cannot compute it
from the GroupContext alone and needs it to compute the
<tt>confirmed_transcript_hash</tt> of the next epoch.</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> contains one entry for each non-blank node in the
virtual client's filtered direct path whose private key the virtual client
holds. Each entry carries the node's RFC 9420 tree node index in <tt>node_index</tt>
and its HPKE private key in <tt>private_key</tt>. Nodes at which the virtual
client's leaf is unmerged (<xref section="4.2" sectionFormat="of" target="RFC9420"/>) have no entry. 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="ciphersuite-strength">
        <name>Ciphersuite strength</name>
        <t>All target-specific key material derived by this document ultimately depends
on a secret produced by the emulation group's ciphersuite. Importing that
secret into a target ciphersuite adapts it to the target KDF and provides
domain separation, but does not increase its entropy. The effective security
strength of the resulting key material is therefore bounded by the weaker of
the emulation-group and target ciphersuites. Applications <bcp14>SHOULD</bcp14> choose an
emulation-group ciphersuite whose security strength is at least that of every
target ciphersuite used by the virtual client.</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: 0x667A (temporary)</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-combined-references">
      <name>References</name>
      <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="6" month="July" 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-10"/>
        </reference>
        <reference anchor="RFC9420">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="R. Robert" initials="R." surname="Robert"/>
            <author fullname="J. Millican" initials="J." surname="Millican"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9420"/>
          <seriesInfo name="DOI" value="10.17487/RFC9420"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <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>
    </references>
  </back>
  <!-- ##markdown-source:
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
WQAm8c//heDKzgwegS/zzAhEH0VIP91HOA3QSgzZSaBKlL/amEvpR2hv4RNf
Q4Y0LAH1o+/bpfzNkGgcfzbzvf9S36L/apOh/3Lfo1Mztf+/2nig7lzb84Sp
hqPogKOHiInkRkecmyoJR+eM2/zFvD8Xs46fGKc06ohytRqf4lfuY+aEmW9U
YRF+7ifysPKZpHN8S9rd96jckWeKPvHQ5I7Jl3UnCQ/LPr8Iz0YMLD5Mwp7T
Ye7RHzmf8A1qapPPVO+py1134oFokNH4ASpMkxY6b7LiJnjU8n9HK2TPOHPo
32a2QJhlWsq23fghrHvp6j0Dat3Vh+ENNgIzD6YInaAx5buo4lb05bZ644Fj
n8lpm+JCfoPukTdGO+1jIZugYE7WkDTN4kcWEamIqrmmngxapyrfnGJgRaaN
g7xyYiKalziW5SRfnJq15t9NWYh+N0PdxaHshzfeWfSGcKA/RW9ioL0hA+0N
e2CEe+RDY6GPXGxeLONgmZnHTlbkd0+fW0tSg1ZoSKa92yRBJpfzD1/1yLYM
36DiFkzNONK0CPKGzKkaBh5Wg7jn2R0KVmQsxxU91LWtThTAf6UoW1Mcm7Ck
VtZ0lfTEFCcUeg/UllnKtJfIXloWn3LFYNyliZ+Rnkvcq6FgW2jm/xjDk/NQ
08WpYlC7O8pAEJy1iJYwYJtOMcVywrktJ1zVoaRw9Ie6kWkU66EasAwdwyTH
hu4GUzS4EG7FoUHZHLon6HnvHaVmrpKzPlAgmdKplnTKpX+MDzTfalSop+6h
sLP39VrTDSjLFZ0e9CxhwQTRLMPUnCY324cD0mHma5FJBx+NSOSaB35V88Rs
ax1OzcUkY7BGa0x/fyonRrdpMtLMtFmOtd2o7TLGXkLj5bF1eL6MoDDmPEs7
PmhC31n601DqRIEFwg9oh5cCMdd/7oY6Q1ogLtJuWcnE5kzrMCInm5MYDZbC
8bl77jVLiGPmDMt4rOiCdFaT3g0eN3M7do+zItzVVEvsYqxoyt0kcjPiVux1
5bsLaQSAsq++flxgyEukboGvY3D1KdLjMmOAGC5BLKuidEjlWEhrttElt9Pz
HwnP0MYXo89YAybhRyGSHPbv8elAfLvcSlNRXuVLoP1grPmsT8Ue6bUo5Zs+
r37czNO0LbS5qAimZc7CW8qgVeyJj6zoLoTQq7IDwdZZzCXkhqVMB0B/U7AP
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
769wJNoe9YLNRfEn9/8CVQlp4Uc5AQA=

-->

</rfc>
