{"id":368,"date":"2026-05-14T10:00:00","date_gmt":"2026-05-14T10:00:00","guid":{"rendered":"https:\/\/neodata.com.uy\/labs\/removing-a-member-creates-a-new-epoch\/"},"modified":"2026-09-07T15:42:13","modified_gmt":"2026-09-07T15:42:13","slug":"removing-a-member-creates-a-new-epoch","status":"publish","type":"post","link":"https:\/\/neodata.com.uy\/labs\/removing-a-member-creates-a-new-epoch\/","title":{"rendered":"Removing a member creates a new epoch."},"content":{"rendered":"<p><!--\nWORDPRESS CONTENT: editorial notes removed\n--><\/p>\n<p class=\"nlabs-kicker\">GROUP KEY AGREEMENT<\/p>\n<h2 id=\"how-mls-turns-membership-changes-into-cryptographic-state-transitions\">How MLS turns membership changes into cryptographic state transitions.<\/h2>\n<p>Protecting a conversation between two endpoints is already a stateful protocol. A group adds members who join at different times, use several devices, miss messages and leave while the remaining participants continue.<\/p>\n<p>Messaging Layer Security organizes that change into cryptographic epochs. Each committed membership update produces a new group state and new key schedule. Members derive the same secrets without sending a separate encrypted key to every participant.<\/p>\n<p>Removing a member is effective only when the group completes the transition and every remaining client agrees on the new epoch.<\/p>\n<h2 id=\"a-ratchet-tree-scales-the-key-agreement\">A ratchet tree scales the key agreement<\/h2>\n<p>MLS represents group key material in a tree. Each member occupies a leaf and knows private secrets along its direct path. Public values allow updates to be distributed efficiently.<\/p>\n<p>An update path replaces secrets from one leaf toward the root. Other members use the public information and their own private path secret to derive the new root.<\/p>\n<p>The work grows logarithmically with group size for common operations rather than requiring one independent pairwise exchange with every member.<\/p>\n<h2 id=\"the-epoch-is-the-shared-view\">The epoch is the shared view<\/h2>\n<p>Each epoch commits to the group identifier, ciphersuite, tree, transcript and extensions. Application messages are protected under keys derived for that epoch.<\/p>\n<p>A client receiving a message from another epoch must apply or retrieve the missing commits before interpreting it. Accepting content under an ambiguous epoch can attach it to the wrong membership state.<\/p>\n<p>The epoch number is not merely a counter. It names a cryptographic view of who belongs to the group and which parameters they share.<\/p>\n<h2 id=\"proposals-do-not-change-the-group\">Proposals do not change the group<\/h2>\n<p>Add, update and remove proposals describe intended changes. A Commit selects proposals, advances the key schedule and creates the next epoch.<\/p>\n<p>A displayed administrative action may create a proposal before the group has processed its commit. Until then, the target member may still possess current epoch keys.<\/p>\n<p>User interfaces and authorization systems should distinguish requested removal, committed removal and confirmation that relevant clients have advanced.<\/p>\n<h2 id=\"removal-protects-the-future\">Removal protects the future<\/h2>\n<p>A properly removed member should not derive keys for later epochs. It can still retain every message and secret it legitimately obtained earlier.<\/p>\n<p>Cryptographic removal cannot erase history from a compromised device. Nor can it prevent another remaining member from forwarding future plaintext.<\/p>\n<p>The guarantee is forward exclusion from new group secrets, bounded by the honesty and update state of remaining clients.<\/p>\n<h2 id=\"forward-secrecy-and-post-compromise-security-need-updates\">Forward secrecy and post-compromise security need updates<\/h2>\n<p>Deleting old epoch secrets protects past messages after a current compromise. Fresh update paths can restore security for future epochs after an attacker loses access to the compromised client.<\/p>\n<p>Healing is not automatic with the passage of time. It depends on an uncompromised member contributing fresh secret material and affected clients processing the update.<\/p>\n<p>Backups that preserve every historical secret can defeat forward secrecy. Multi-device synchronization can extend compromise if it copies current state to a device that has not been cleaned.<\/p>\n<h2 id=\"keypackages-are-prepublished-entry-points\">KeyPackages are prepublished entry points<\/h2>\n<p>A client publishes a KeyPackage containing an initialization key, signature key, credential and supported capabilities. Another member can use it to add the client while that client is offline.<\/p>\n<p>Initialization keys are intended for controlled use. Reusing a KeyPackage or its private key across additions can weaken security and link group memberships.<\/p>\n<p>The directory distributing KeyPackages needs authentication, inventory and consumption semantics. An obsolete package can add the wrong device even when the MLS cryptography verifies.<\/p>\n<h2 id=\"the-authentication-service-defines-identity\">The authentication service defines identity<\/h2>\n<p>MLS authenticates credentials and signatures according to the selected ciphersuite and application profile. It does not define what a user account is or which device may represent it.<\/p>\n<p>An Authentication Service maps credentials to application identities and policies. Account recovery, device enrollment and enterprise membership remain outside the base protocol.<\/p>\n<p>If the service can silently substitute a credential, <a href=\"https:\/\/neodata.com.uy\/labs\/a-key-directory-should-be-accountable\/\">key transparency<\/a> can make that change visible and auditable.<\/p>\n<h2 id=\"the-delivery-service-controls-availability-and-order\">The Delivery Service controls availability and order<\/h2>\n<p>MLS can operate over an untrusted Delivery Service. Encryption prevents it from reading application content or forging valid member messages.<\/p>\n<p>The service can still delay, reorder or withhold commits and messages. It can give different clients incomplete histories and observe group-level metadata.<\/p>\n<p>Clients need rules for buffering, fetching missing state and detecting that their local view has stopped advancing.<\/p>\n<h2 id=\"concurrent-commits-create-branches\">Concurrent commits create branches<\/h2>\n<p>Two members may create commits from the same epoch before learning of each other. Both cannot simply become the next group state.<\/p>\n<p>The application needs an ordering and retry strategy. A losing commit may need to be reproposed against the accepted epoch with fresh update material.<\/p>\n<p>Consensus over one linear group history is partly provided by the delivery environment, not by the tree alone.<\/p>\n<h2 id=\"metadata-remains-a-group-property\">Metadata remains a group property<\/h2>\n<p>Servers can commonly observe group identifiers, traffic timing, message sizes, membership operations and which devices fetch updates. Encryption protects message content, not all group structure.<\/p>\n<p>Padding, batching and private delivery can reduce exposure, but large dynamic groups create distinctive patterns. The architecture should state which metadata the service is permitted to learn.<\/p>\n<h2 id=\"state-backup-is-a-security-decision\">State backup is a security decision<\/h2>\n<p>A client that loses its current epoch state may be unable to decrypt new messages. Backing up state improves recoverability but creates another copy of current and possibly historical secrets.<\/p>\n<p>A safe design can back up identity credentials separately, re-add a recovered device with a new KeyPackage and avoid restoring old epoch secrets. That choice may sacrifice access to old ciphertext unless messages are backed up under another key.<\/p>\n<p>Recovery behaviour defines the practical boundary of forward secrecy.<\/p>\n<h2 id=\"membership-is-the-cryptographic-state\">Membership is the cryptographic state<\/h2>\n<p>MLS does more than encrypt messages to a list. It makes the list part of a shared authenticated state and evolves that state through proposals, commits and epochs.<\/p>\n<p>Security depends on credential distribution, delivery ordering, key deletion and recovery practices outside the core protocol.<\/p>\n<p>Removing a member creates a new epoch because membership is not metadata around the keys. It determines the keys.<\/p>\n<hr \/>\n<h2 id=\"references\">References<\/h2>\n<ol type=\"1\">\n<li><a href=\"https:\/\/www.rfc-editor.org\/info\/rfc9420\/\">RFC 9420: The Messaging Layer Security Protocol<\/a><\/li>\n<li><a href=\"https:\/\/www.rfc-editor.org\/info\/rfc9750\/\">RFC 9750: The Messaging Layer Security Architecture<\/a><\/li>\n<li><a href=\"https:\/\/datatracker.ietf.org\/wg\/mls\/about\/\">IETF Messaging Layer Security Working Group<\/a><\/li>\n<li><a href=\"https:\/\/datatracker.ietf.org\/doc\/draft-ietf-keytrans-architecture\/\">IETF: Key Transparency Architecture<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Messaging Layer Security makes membership part of shared cryptographic state. A removal takes effect when the remaining group commits and derives a new epoch.<\/p>\n","protected":false},"author":2,"featured_media":366,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","nlabs_series_part":0},"categories":[10],"tags":[68,69,75],"nlabs_series":[],"nlabs_article_type":[36],"class_list":["post-368","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-research","tag-algorithms-primitives","tag-applied-cryptography","tag-protocols","nlabs_article_type-primer"],"_links":{"self":[{"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/posts\/368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/comments?post=368"}],"version-history":[{"count":1,"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/posts\/368\/revisions"}],"predecessor-version":[{"id":224752,"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/posts\/368\/revisions\/224752"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/media\/366"}],"wp:attachment":[{"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/media?parent=368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/categories?post=368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/tags?post=368"},{"taxonomy":"nlabs_series","embeddable":true,"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/nlabs_series?post=368"},{"taxonomy":"nlabs_article_type","embeddable":true,"href":"https:\/\/neodata.com.uy\/labs\/wp-json\/wp\/v2\/nlabs_article_type?post=368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}