Before a group can be created, a group configuration (
MlsGroupConfiguration) needs to be defined. The default values of configuration parameters are picked for safety, however be sure to check all parameters carefully to ascertain if they match your implementation's requirements. See Group configuration for more details.
In addition to the group configuration, the client should define all supported and requitred extension for the group. The negotatiation mechanism for extension in MLS consists in setting an intial list of extensions at group creation time and choosing key packages of subsequent new members accordingly.
In practice, the supported and required extensions are set by adding them to the initial
KeyPackage of the creator:
// Define extensions let extensions = vec![Extension::LifeTime(LifetimeExtension::new( 60 * 60 * 24 * 90, // Maximum lifetime of 90 days, expressed in seconds ))]; // Fetch the credential bundle from the key store let credential_bundle = backend .key_store() .read( &credential .signature_key() .tls_serialize_detached() .expect("Error serializing signature key."), ) .expect("An unexpected error occurred."); // Create the key package bundle let key_package_bundle = KeyPackageBundle::new(ciphersuites, &credential_bundle, backend, extensions)?;
Every group has a unique group ID that needs to be specified at the time of the group creation. The group ID cannot be changed after the group creation and therefore remains immutable throughout the group's lifetime. It should be chosen so that it doesn't collide with any other group IDs in the same system:
let group_id = GroupId::from_slice(b"Test Group");
After that the group can be created:
let mut alice_group = MlsGroup::new( backend, &mls_group_config, group_id, alice_key_package .hash_ref(backend.crypto()) .expect("Could not hash KeyPackage.") .as_slice(), ) .expect("An unexpected error occurred.");