Proposals are requests to modify the group state. They are collected and applied atomically when a Commit is processed.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/openmls/openmls/llms.txt
Use this file to discover all available pages before exploring further.
Proposal Types
OpenMLS supports multiple proposal types defined by RFC 9420 and extensions.ProposalType
Request to add a new member to the group
Request to update the sender’s leaf node (requires path)
Request to remove a member from the group (requires path)
Request to inject a pre-shared key into the key schedule
Request to reinitialize the group with new parameters
Used in external commits to join a group (requires path)
Request to update group context extensions (requires path)
Extension: Request to remove oneself from the group (requires path)
Proposal Enum
TheProposal enum contains all proposal variants.
Methods
Returns the type of this proposal
Returns
true if a Commit containing this proposal requires an update pathReturns
true if this is a Remove proposalAddProposal
Request to add a new member with the specified KeyPackage.The KeyPackage of the new member to add
Example
UpdateProposal
Request to replace the sender’s leaf node with a new one.The new leaf node to replace the sender’s current leaf
Example
Update proposals require the commit to include an update path to refresh encryption keys.
RemoveProposal
Request to remove a member at the specified leaf index.The leaf index of the member to remove
Example
PreSharedKeyProposal
Request to inject a pre-shared key into the key schedule.Identifier for the pre-shared key to inject
Example
ReInitProposal
Request to reinitialize the group with different parameters.The group ID for the new reinitialized group
The protocol version for the new group
The ciphersuite for the new group
Extensions for the new group context
ExternalInitProposal
Used in external commits to provide KEM output for key agreement.The KEM output from encapsulating to the group’s external public key
GroupContextExtensionProposal
Request to update the group context extensions.The new set of group context extensions
Example
AppDataUpdateProposal
Available with
extensions-draft-08 feature flagIdentifier of the component being updated
Either
Update(data) or RemoveExample
AppEphemeralProposal
Available with
extensions-draft-08 feature flagComponent identifier
Ephemeral application data
CustomProposal
Application-defined proposal with custom semantics.Application-defined proposal type (must not conflict with standard types)
Application-defined payload data
Example
ProposalOrRef
Proposals can be included in commits by value or by reference.Proposal included by value (full proposal in commit)
Proposal included by reference (hash of authenticated content)
Computing References
Proposal Validation
Proposals undergo validation when processed.Validation Rules
- Add: KeyPackage must be valid and not already in group
- Update: LeafNode must be valid and signed by sender
- Remove: Target index must exist and be occupied
- Path Required: Certain proposals require the commit to include an update path
Path Requirements
These proposal types require the commit to include an update path:- Update
- Remove
- ExternalInit
- GroupContextExtensions
- SelfRemove
Proposal Priority
When multiple proposals target the same leaf, priority determines which applies:- SelfRemove (highest priority)
- Remove (later removes override earlier)
- Update (lowest priority)
Serialization
Proposals are serialized using TLS encoding.Examples
Creating Proposals
Processing Proposals
Related Types
- Commits - Apply proposals atomically
- Message Framing - Message wrapper types