All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- #1972: Add APIs for time-based deletion of past epoch secrets, and for setting the past epoch deletion policy for an
MlsGroup. - #2010: Added
MlsGroup::propose_self_update_with_new_signer, a variant ofpropose_self_updatethat stages anUpdateproposal carrying a new signature key. - #2084: Added the
ProcessedMessageContent::OwnPendingCommitvariant, returned when processing a Commit authored by this client that matches the group's pending commit. Callers should merge the pending commit viaMlsGroup::merge_pending_commit(). - #2109: Added
Capabilities::for_provider, a constructor that advertises exactly the ciphersuites supported by the given crypto provider (as reported byOpenMlsCrypto::supported_ciphersuites), instead of the hardcoded default list. - Added
UnsupportedCiphersuite(Ciphersuite)variants toNewGroupError,KeyPackageNewError,WelcomeError, andCreationFromExternalError, returned when the crypto provider does not support the requested ciphersuite. - #2099: Added
ProcessedMessageContent::OwnPrivateMessagevariant. Processing aPrivateMessageauthored by this client (e.g. echoed back by the delivery service) now succeeds and returns this variant instead of failing. The content cannot be decrypted and the sender claim is unauthenticated; applications should use it only to skip/ignore the echoed message and must not act on it further. With thevirtual-clients-draftfeature, own messages whose secrets are still retained (e.g. unconfirmed sends) keep decrypting normally; the variant is returned in groups that do not use virtual clients when decryption of an own message fails.
- #2109:
OpenMlsRustCrypto'sOpenMlsCrypto::supportsnow acceptsMLS_256_MLKEM1024_AES256GCM_SHA512_MLDSA87, consistent with itssupported_ciphersuiteslist (draft-ietf-mls-pq-ciphersuitesfeature). - #2089: A Commit without an UpdatePath from this client's own leaf that does not match the pending commit is now staged as a regular commit instead of being rejected as a mismatched own commit.
- #2034: Fixes a bug where the integer storage tags for
serdenon-self-describing serializations were changed, leading to incorrect deserializations. By default, storage format compatibility withopenmlsv0.7.1 and earlier is now restored. Enabling the0-8-1-storage-formatfeature maintains storage format compatibility withopenmlsv0.8.1 (the previousopenmlsrelease).
- #2109: Group creation, key package creation, welcome processing, external commits, and
PublicGroupcreation from external input now fail early with a dedicatedUnsupportedCiphersuiteerror when the crypto provider does not support the ciphersuite, instead of failing deep inside a crypto operation. - #2109:
ExternalCommitError::UnsupportedCiphersuiteandExternalCommitBuilderError::UnsupportedCiphersuitenow carry the unsupportedCiphersuite. - #1980: Enrich limetime related errors returned during leaf node validation with more information
- #1972: The method
MlsGroup::max_past_epochs()now returns anOption<usize>, rather than ausize - #1963:
MessageEncryptionErroris now part of the public API, but only surfaces if thevirtual-clients-draftfeature flag is enabled. - #2043: Renamed and deprecated
MlsGroup::propose_external_psktoMlsGroup::propose_pre_shared_key. Same for the_by_valuevariant. - #2084: Renamed
StageCommitError::OwnCommittoStageCommitError::OwnCommitMismatch, now returned only when a Commit authored by this client does not match the pending commit. - #2099: Removed
ValidationError::CannotDecryptOwnMessage; processing an ownPrivateMessageis no longer an error. - #2060 Renamed
extensions-draft-08feature flag toextensions-draft. - Reworked the receive-side API for
AppDataUpdateproposals (extensions-draftfeature).MlsGroup::process_messagenow returns a commit coveringAppDataUpdateproposals asProcessedMessageContent::UnresolvedAppDataCommit. Applications inspect the verified proposals viaUnresolvedAppDataCommit::app_data_update_proposals()and resume staging withMlsGroup::stage_app_data_commit(). This replaces theMlsGroup::unprotect_message/MlsGroup::process_unverified_message_with_app_data_updatesflow, which exposed unverified message content; both functions are no longer public, andProcessMessageError::FoundAppDataUpdateProposalwas removed. - #2098: Extended the reworked receive-side API for
AppDataUpdateproposals toPublicGroup(extensions-draftfeature).PublicGroup::process_messagenow returns a commit coveringAppDataUpdateproposals asProcessedMessageContent::UnresolvedAppDataCommit. Applications compute the updates with the newPublicGroup::app_data_dictionary_updater()and resume staging with the newPublicGroup::stage_app_data_commit(). This replacesPublicGroup::process_message_with_app_data_updates, which was removed. Also addedMlsGroup::resolve_app_data_commit()andPublicGroup::resolve_app_data_commit(), which stage anUnresolvedAppDataCommitand return the sameProcessedMessagewith regularStagedCommitMessagecontent, so callers can keep a single code path for commits with and withoutAppDataUpdateproposals. MadeStagedCommit::safe_export_secret()public so secrets of the new epoch can be exported from resolved commits before merging.
- #1955: Expose functions that allow access to (blank) leaves and parent nodes
- #1964: update libcrux and rust_crypto provider dependencies, due to https://github.com/cryspen/libcrux/security/advisories/GHSA-435g-fcv3-8j26 and https://github.com/cryspen/hpke-rs/security/advisories/GHSA-g433-pq76-6cmf
- #1855: Added the
swap_members()method toMlsGroupto replace members in a group, as well as theWelcomeCommitMessagesandSwapMembersErrorstructs. - #1868: Implemented AppEphemeral functionality as defined in the MLS Extensions draft and replaced the existing AppAck proposal with the AppAck object, which can now be conveyed inside an AppEphemeral proposal. These features are behind the
extensions-draft-08feature flag. - #1874: In the
openmls_libcrux_cryptoprovider, added AES-GCM support. - #1900: Implemented GREASE (Generate Random Extensions And Sustain Extensibility) support as defined in RFC 9420 Section 13.5:
- Added
Grease(u16)variants toProposalType,ExtensionType, andCredentialTypeenums - Added
is_grease()methods to all GREASE-capable types includingVerifiableCiphersuite - Added
Capabilities::with_grease()andCapabilitiesBuilder::with_grease()convenience methods to inject random GREASE values - GREASE values are automatically recognized during deserialization and filtered during validation (treated the same as unknown values)
- Added comprehensive unit and integration tests for GREASE handling
- Added user manual documentation for GREASE support
- Added
- #1903: Added new error variants
MissingOwnLeafandMissingCiphertexttoApplyUpdatePathErrorfor more fine-grained error handling in TreeSync.
- #1868: The implementation of valn0311, was updated to check support for all non-default proposals, instead of only checking support for Custom proposals.
- #1871: Fixed a bug where the application export tree (part of the
extensions-draft-08feature) was not stored properly after group creation. - #1943: Fix a proposal validation check that erroneously requires members that are being removed in a commit to also support all proposal types used in the commit.
- GHSA-8x3w-qj7j-gqhf: Check length when comparing tags
- #1874: Changed
ProposalType,ExtensionType, andCredentialTypeenums to includeGrease(u16)variant. - #1924: Exposed
JoinBuilder::newas public API. - #1929: Change creation of new
MlsGroups s.t. creation fails if there is already a group with the sameGroupIdin storage. This affects both creation of fresh groups and creation of groups through aWelcomemessage. An application that wants to replace a group can either delete the group manually or callreplace_old_groupin theJoinBuilderor theMlsGroupBuilder. - #1928: Processing a commit now fails if it contains a duplicate PSK proposal.
- #1926:
- Updated
getrandomdependency injsfeature to0.3.4 - Removed
libcrux-provider-jsfeature (thelibcrux-provider,jsfeatures are now sufficient to enable the libcrux crypto provider with support for compiling to wasm)
- Updated
- #1944: Fix a bug due to which a wrong credential could be retrieved for validation of messages from past epochs.
- #1801: Added
MlsGroup::external_commit_builder. - #1814: Allow disabling leaf node lifetime validation in the ratchet tree when joining a group.
StagedWelcome::build_from_welcome: Alternative tonew_from_welcomein a builder style that allows disabling lifetime validation of the incoming ratchet tree.Lifetime::init: Set explicit lifetimes for a key package.
- #1801: Added
MlsGroup::external_commit_builder. - #1725: Added "Safe exporter" as defined in the MLS extension draft behind the
extensions-draft-08feature flag. Previously serialized groups will derive the exporter upon creating/processing and merging the next commit. - #1840: Add
has_pending_proposalsgetter method toMlsGroup.
- #1846: Fix persistence during message processing by properly persisting the secret tree after processing private messages and improve forward secrecy within epochs.
- #1846: Processing messages in
MlsGroupandPublicGroupnow returns two different error types:ProcessMessageErrorandPublicProcessMessageError.ProcessMessageErrornow includes a storage error variant andPublicProcessMessageErrorno longer includes theGroupStateErrorvariant. - #1851: The GroupInfos in Welcome messages no longer contain an ExternalPub extension. This extension is generally useless for new group members, as its only purpose is to facilitate external joins.
- #1801: Deprecated
MlsGroup::join_by_external_commitin favor ofMlsGroup::external_commit_builder.
- #1661: Add
member_atgetter method toMlsGroup,not_beforeandnot_aftergetter methods toLifetimeandlife_timegetter method toKeyPackage. - #1688: Add
unknown()getter method toExtensions. - #1666: Add
members()andgroup_context()getter methods toStagedWelcome. - #1672: Add
epoch()getter method toVerifiableGroupInfo. - #1673: Return more specific error when attempting to decrypt own messages:
ProcessMessageError::ValidationError(ValidationError::CannotDecryptOwnMessage). - #1675: Add
CommitBuilderthat can be used to create commit messages. - #1682: Add stage provider backed by Sqlite.
- #1704: Add support for SelfRemove proposals as specified in the MLS extensions draft specification.
- #1735: Add
self_update_with_new_signerfunction toMlsGroup, as well as abuild_with_new_signerbuild option for theCommitBuilder. Both can be used to create commits that rotate the creator's signature key. - #1731: Add helpers to recover from group state forks, hidden behind the new
fork-resolutionfeature flag. - #1750: Support add proposals from external senders, using
ExternalProposal::new_add(). - #1766: New error variant for commit creation: If a new signer is introduced via
self_update_with_new_signerand additionally aCredentialWithKeyis provided viaLeafNodeParameters, anInvalidLeafNodeParameterserror is thrown. - #1774: Add flag to control the return of a
GroupInfowhen building a commit using theCommitBuilder. Setting that flag overrides theuse_ratchet_tree_extensionflag inMlsGroupJoinConfig. - #1784: Support group context extension proposals from external senders, using
ExternalProposal::new_group_context_extensions().
- #1657: Fix leaf node validation checks.
- #1667: Fix remove proposal validation checks.
- #1684: Fix external init proposal validation checks.
- #1691: Fix the way credentials are looked up when processing messages from previous epochs.
- #1702: Fix multiple validation checks.
- #1703: Fix a bug where updates proposals were not properly cleared if a remove proposal is present for the same group member.
- #1793: Fix a bug where SelfRemoves were not taken into account when computing the sender index of external committers
- #1763: Fix which extension types are considered valid in a leaf node.
- #1797: Fix when tree diff trimming is performed.
- #1661: Expose
extensionsgetter method onGroupContextExtensionProposal. - #1669: The data in the enum variant
ProtocolMessage::PublicMessageis wrapped inBox. - #1700: During commit processing, OpenMLS will now return a
StorageErrorif the storage provider fails while fetchingencryption_epoch_key_pairs. Previously, it would ignore any error returned by the storage provider and just assume that no keys could be found (which typically lead to an error later during commit processing). - #1762: Expose
LeafNodeSourceto allow handling output ofLeafNode::leaf_node_source(). - #1767: Return a more specific error when private messages that are too old are processed. The error type has changed from
ProcessMessageError::ValidationError(ValidationError::UnableToDecrypt(MessageDecryptionError::AeadError))toProcessMessageError::ValidationError(ValidationError::UnableToDecrypt(MessageDecryptoinError::SecretTree(SecretTreeError::TooDistantInThePast))). - #1786: Tighten the requirements for the providers for
MlsGroup::export_secret()andMlsGroup::export_group_info(). The function now only require theOpenMlsCryptoprovider. - #1793: Align the proposal types of the SelfRemove an AppAck proposals to version 06 of the MLS extensions draft.
- #1639: Introduce
PublicStorageProvidertrait to independently allow for the storage ofPublicGroupinstances. - #1641: Extend the
PublicGroupAPI withadd_proposal(),remove_proposal(), andqueued_proposals().
- #1637: Remove
serdefromMlsGroup. - #1638: Remove
serdefromPublicGroup.PublicGroup::load()becomes public to load a group from the storage provider. - #1642:
OpenMlsProvideris no longer required for thePublicGroupAPI. ThePublicGroupAPI now uses thePublicStorageProvidertrait directly.ProcessMessageError::InvalidSignaturewas removed and replaced withValidationError::InvalidSignature.
- #1641: Fixed missing storage of queued proposals & clearing of the queued proposals.
- #1629: Add
add_members_without_updatefunction toMlsGroupto allow the creation of add-only commits - #1506: Add
StagedWelcomeandStagedCoreWelcometo make joining a group staged in order to inspect theWelcomemessage. This was followed up with PR #1533 to adjust the API. - #1516: Add
MlsGroup::clear_pending_proposalsto the public API; this allows users to clear a group's internalProposalStore - #1565: Add new
StorageProvidertrait to theopenmls_traitscrate.
- #1464: Add builder pattern for
MlsGroup; splitMlsGroupJoinConfigintoMlsGroupCreateConfigandMlsGroupJoinConfig - #1473: Allow setting group context extensions when building an MlsGroup(Config).
- #1475: Fully process GroupContextExtension proposals
- #1477: Allow setting leaf node extensions and capabilities of the group creator when creating an MlsGroup(Config)
- #1478: Remove explicit functions to set
RequiredCapabilitiesExtensionandExternalSendersExtensionwhen building an MlsGroup(Config) in favor of the more general function to set group context extensions - #1479: Allow the use of extensions with
ExtensionType::Unknownin group context, key packages and leaf nodes - #1488: Allow unknown credentials. Credentials other than the basic credential or X.509 may be used now as long as they are encoded as variable-sized vectors.
- #1527: CredentialType::Unknown is now called CredentialType::Other.
- #1543: PreSharedKeyId.write_to_key_store() no longer requires the cipher suite.
- #1546: Add experimental ciphersuite based on the PQ-secure XWing hybrid KEM (currently supported only by the libcrux crypto provider).
- #1548: CryptoConfig is now replaced by just Ciphersuite.
- #1542: Add support for custom proposals. ProposalType::Unknown is now called ProposalType::Other. Proposal::Unknown is now called Proposal::Other.
- #1559: Remove the
PartialEqtype constraint on the error type of both theOpenMlsRandandOpenMlsKeyStoretraits. Additionally, remove theClonetype constraint on the error type of theOpenMlsRandtrait. - #1565: Removed
OpenMlsKeyStoreand replace it with a newStorageProvidertrait in theopenmls_traitscrate. - #1606: Added additional
LeafNodeParametersargument toMlsGroup.self_update()andMlsGroup.propose_self_update()to allow for updating the leaf node with custom parameters.MlsGroup::join_by_external_commit()now also takes optional parameters to set the capabilities and the extensions of the LeafNode. - #1615: Changes the AAD handling. The AAD is no longer persisted and needs to be set before every API call that generates an
MlsMessageOut. The functionsProccessedMessageto accees the AAD has been renamed toaad().
- #1503: Fix
CoreGroupto check forLastResortExtensionbefore deleting leaf encryption keypair from the key store innew_from_welcome; this allows the sameKeyPackage(with last resort extension) to be used to join multiple groups
This release has many breaking API changes, a few of them are listed below:
- #902: Implement External Add proposal (NewMember sender only) and replace
bySender::NewMemberSender::NewMemberProposalandSender::NewMemberCommitfor external proposals and external commits repectively - #903: Rename MlsGroup's resumptionn_secret to resumption_secret
- #1058: Rename resumption_secret to resumption_psk
- #900: Expose SerializedMlsGroup until issue #245 is done
- #1117: Remove signature key indirection
- #1123: Rename ResumptionPsk to ResumptionPskSecret and resumption_psk to resumption_psk_secret
- #1155: MlsGroup.members() now returns an iterator over group members, MlsGroup.merge_staged_commit() no longer returns a Result
- #1193:
MlsGroup.propose_self_updatetakes the newLeafNodenow instead of aKeyPackage.LeafNode.generatecan be used to generate a newLeafNodefor an update proposal.
- #873: Signature sub-module of the ciphersuite module is now public.
- #873: Signature keys can be imported and exported with the crypto-subtle feature.
- #873: BasicCredentials can now be created from existing signature keys.
- #890: Join group by External Commit API does not expect proposal store.
- initial release
Please disregard any previous versions.