Skip to main content

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.

The RequiredCapabilitiesExtension defines the configuration requirements for all members of an MLS group. This extension appears in the GroupContext to ensure all members support the required capabilities.

Overview

This extension lists the extensions, proposal types, and credential types that must be supported by all members of the group. It is enforced during the application of Add commits for new members.

Structure

struct {
    ExtensionType extension_types<V>;
    ProposalType proposal_types<V>;
    CredentialType credential_types<V>;
} RequiredCapabilities;

Fields

extension_types
Vec<ExtensionType>
List of extension types that all group members must support
proposal_types
Vec<ProposalType>
List of proposal types that all group members must support
credential_types
Vec<CredentialType>
List of credential types that all group members must support

Creating Required Capabilities

use openmls::prelude::*;

let required_caps = RequiredCapabilitiesExtension::new(
    &[ExtensionType::ApplicationId],
    &[ProposalType::Add, ProposalType::Remove],
    &[CredentialType::Basic]
);

Usage in GroupContext

use openmls::extensions::*;

// Create extension
let req_caps = Extension::RequiredCapabilities(
    RequiredCapabilitiesExtension::new(
        &[ExtensionType::ApplicationId],
        &[],
        &[CredentialType::Basic]
    )
);

// Add to group context extensions
let mut extensions = Extensions::<GroupContext>::empty();
extensions.add(req_caps)?;

Methods

new()

Creates a new RequiredCapabilitiesExtension.
pub fn new(
    extension_types: &[ExtensionType],
    proposal_types: &[ProposalType],
    credential_types: &[CredentialType],
) -> Self
extension_types
&[ExtensionType]
required
Required extension types
proposal_types
&[ProposalType]
required
Required proposal types
credential_types
&[CredentialType]
required
Required credential types
return
RequiredCapabilitiesExtension
New RequiredCapabilitiesExtension instance

extension_types()

Returns the list of required extension types.
pub fn extension_types(&self) -> &[ExtensionType]
return
&[ExtensionType]
Slice of required extension types

proposal_types()

Returns the list of required proposal types.
pub fn proposal_types(&self) -> &[ProposalType]
return
&[ProposalType]
Slice of required proposal types

credential_types()

Returns the list of required credential types.
pub fn credential_types(&self) -> &[CredentialType]
return
&[CredentialType]
Slice of required credential types

Validation

When a GroupContextExtensions proposal contains a RequiredCapabilitiesExtension, it is validated to ensure:
  1. All current group members support the required capabilities
  2. The proposal is rejected if any member lacks required support
When adding new members:
  1. The new member’s capabilities are checked against required capabilities
  2. The Add commit is rejected if the member doesn’t support all requirements

Example: Setting Group Requirements

use openmls::prelude::*;

// Define what all members must support
let required_extensions = vec![
    ExtensionType::ApplicationId,
];

let required_proposals = vec![
    ProposalType::Add,
    ProposalType::Remove,
    ProposalType::Update,
];

let required_credentials = vec![
    CredentialType::Basic,
];

// Create the extension
let req_caps = RequiredCapabilitiesExtension::new(
    &required_extensions,
    &required_proposals,
    &required_credentials,
);

// Use in group creation or update
let extension = Extension::RequiredCapabilities(req_caps);

Default Support

Members automatically support these “default” capabilities without explicit declaration:
  • Default extensions: ApplicationId, RatchetTree, RequiredCapabilities, ExternalPub, ExternalSenders
  • Default proposals depend on the MLS protocol version

See Also