use openmls::{
prelude::*, test_utils::single_group_test_framework::*,
test_utils::storage_state::GroupStorageState, *,
};
use openmls_basic_credential::SignatureKeyPair;
use openmls_test::openmls_test;
use openmls_traits::{signatures::Signer, types::SignatureScheme};
#[allow(dead_code)]
fn generate_credential(
identity: Vec<u8>,
signature_algorithm: SignatureScheme,
provider: &impl crate::storage::OpenMlsProvider,
) -> (CredentialWithKey, SignatureKeyPair) {
let credential = BasicCredential::new(identity);
let signature_keys = SignatureKeyPair::new(signature_algorithm).unwrap();
signature_keys.store(provider.storage()).unwrap();
(
CredentialWithKey {
credential: credential.into(),
signature_key: signature_keys.to_public_vec().into(),
},
signature_keys,
)
}
#[allow(dead_code)]
fn generate_key_package(
ciphersuite: Ciphersuite,
credential_with_key: CredentialWithKey,
extensions: Extensions<KeyPackage>,
provider: &impl crate::storage::OpenMlsProvider,
signer: &impl Signer,
) -> KeyPackageBundle {
KeyPackage::builder()
.key_package_extensions(extensions)
.build(ciphersuite, provider, signer, credential_with_key)
.unwrap()
}
#[openmls_test]
fn not_join_group() {
let alice_party = CorePartyState::<Provider>::new("alice");
let bob_party = CorePartyState::<Provider>::new("bob");
let alice_pre_group = alice_party.generate_pre_group(ciphersuite);
let bob_pre_group = bob_party.generate_pre_group(ciphersuite);
let group_id = GroupId::from_slice(b"Test Group");
let mls_group_create_config = MlsGroupCreateConfig::builder()
.ciphersuite(ciphersuite)
.use_ratchet_tree_extension(true) .build();
let mut group_state =
GroupState::new_from_party(group_id.clone(), alice_pre_group, mls_group_create_config)
.unwrap();
let bob_key_package = bob_pre_group.key_package_bundle.key_package().clone();
let [alice] = group_state.members_mut(&["alice"]);
let (_commit, welcome, _group_info) = alice
.group
.add_members(
&alice_party.provider,
&alice.party.signer,
&[bob_key_package],
)
.expect("Could not add Bob");
let welcome: MlsMessageIn = welcome.into();
let bob_provider = &bob_party.provider;
let group_context: Option<GroupContext> =
bob_provider.storage().group_context(&group_id).unwrap();
assert!(group_context.is_none());
let confirmation_tag: Option<ConfirmationTag> =
bob_provider.storage().confirmation_tag(&group_id).unwrap();
assert!(confirmation_tag.is_none());
let state_before = GroupStorageState::from_storage(bob_provider.storage(), &group_id);
let welcome = match welcome.extract() {
MlsMessageBodyIn::Welcome(welcome) => welcome,
_ => unimplemented!("Handle other message types"),
};
let join_config = MlsGroupJoinConfig::default();
let processed_welcome = ProcessedWelcome::new_from_welcome(bob_provider, &join_config, welcome)
.expect("Error constructing processed welcome");
let _unverified_psks = processed_welcome.psks();
let unverified_group_info = processed_welcome.unverified_group_info();
let _ciphersuite = unverified_group_info.ciphersuite();
let _group_id = unverified_group_info.group_id();
let _epoch = unverified_group_info.epoch();
let extensions = unverified_group_info.extensions();
let ratchet_tree_extension = extensions
.ratchet_tree()
.expect("No ratchet tree extension");
let _ratchet_tree = ratchet_tree_extension.ratchet_tree();
let staged_welcome: StagedWelcome = processed_welcome
.into_staged_welcome(bob_provider, None)
.expect("Error constructing staged welcome");
let own_leaf_nodes: Vec<LeafNode> = bob_provider.storage().own_leaf_nodes(&group_id).unwrap();
assert!(own_leaf_nodes.is_empty());
let own_leaf_index: Option<LeafNodeIndex> =
bob_provider.storage().own_leaf_index(&group_id).unwrap();
assert!(own_leaf_index.is_none());
let welcome_sender: &LeafNode = staged_welcome
.welcome_sender()
.expect("Welcome sender could not be retrieved");
let _credential = welcome_sender.credential();
let _signature_key = welcome_sender.signature_key();
let group_context = staged_welcome.group_context();
let _protocol_version = group_context.protocol_version();
let _ciphersuite = group_context.ciphersuite();
let extensions: &Extensions<GroupContext> = group_context.extensions();
let _has_ratchet_extension = extensions.ratchet_tree().is_some();
if let Some(capabilities) = group_context.required_capabilities() {
let _extension_types: &[ExtensionType] = capabilities.extension_types();
let _proposal_types: &[ProposalType] = capabilities.proposal_types();
let _credential_types: &[CredentialType] = capabilities.credential_types();
}
let _group_id = group_context.group_id();
let _epoch = group_context.epoch();
let _tree_hash = group_context.tree_hash();
let _confirmed_transcript_hash = group_context.confirmed_transcript_hash();
for member in staged_welcome.members() {
let _leaf_node_index = member.index;
let _credential = member.credential;
let _encryption_key = member.encryption_key;
let _signature_key = member.signature_key;
}
let state_after = GroupStorageState::from_storage(bob_provider.storage(), &group_id);
assert!(state_before == state_after);
}