We’re releasing OpenMLS 0.9.0, our latest step toward a stable, standards-compliant implementation of Messaging Layer Security (MLS, RFC 9420).
📦 https://crates.io/crates/openmls
Migrating storage between formats
If you’ve been running OpenMLS in production, you’ve probably had to think about how group state is serialized on disk. 0.9.0 adds an opt-in migration-import feature that gives you a path to move existing group state to a storage provider using a different serde codec.
For example, from bincode to CBOR.
MlsGroup and PublicGroup both gain import entry points that re-read state with the old codec and fully rewrite it with the new one.
We’ve also added a new book chapter walking through the eager and lazy per-group migration strategies.
Starting with this release of OpenMLS we no longer support non-self describing storage formats.
Targeted messages
We’ve landed initial support for targeted messages, behind a new targeted-messages-draft feature flag.
This is an early implementation of a work in progress RFC.
Expect it to evolve as the draft does.
A cleaner AppDataUpdate story
We reworked how applications receive AppDataUpdate proposals on both MlsGroup and PublicGroup.
Instead of exposing unverified message content through a separate unprotect_message
flow, process_message now returns an UnresolvedAppDataCommit when a commit
carries AppDataUpdate proposals.
Applications then need to inspect the verified proposals, and resume staging with
stage_app_data_commit().
This provides one code path, whether or not app-data updates are involved.
And the rest
A handful of smaller but meaningful changes: early, dedicated errors when a crypto provider doesn’t support a requested ciphersuite (instead of failing deep inside a crypto call); a fix for a storage-format regression that broke deserialization compatibility with earlier releases; a few security bug fixes; and our MSRV moved up to Rust 1.91.
As usual, none of this would happen without the OpenMLS community filing issues, filing PRs, and building real applications on top of the library. Thank you.
See the full changelog and release notes for the complete list of changes, including in the supporting crates (openmls_rust_crypto, openmls_libcrux_crypto, openmls_basic_credential, openmls_memory_storage, openmls_sqlite_storage, openmls_sqlx_storage, and the new openmls_serialization_helpers).