use crate::hash::Hash;
use crate::identity::KeyPair;
use crate::secret_group::lts::LongTermSecretEpoch;
use crate::secret_group::mls::MlsProvider;
use crate::secret_group::{SecretGroup, SecretGroupMember};
#[test]
fn long_term_secret_evolution() {
let billie_key_pair = KeyPair::new();
let billie_provider = MlsProvider::new();
let billie_member = SecretGroupMember::new(&billie_provider, &billie_key_pair).unwrap();
let secret_group_id = Hash::new_from_bytes(vec![1, 2, 3]).unwrap();
let mut billie_group =
SecretGroup::new(&billie_provider, &secret_group_id, &billie_member).unwrap();
assert!(billie_group.is_active());
let ada_key_pair = KeyPair::new();
let ada_provider = MlsProvider::new();
let ada_member = SecretGroupMember::new(&ada_provider, &ada_key_pair).unwrap();
let ada_key_package = ada_member.key_package(&ada_provider).unwrap();
let group_commit = billie_group
.add_members(&billie_provider, &[ada_key_package])
.unwrap();
assert!(group_commit.welcome().is_some());
let mut ada_group = SecretGroup::new_from_welcome(&ada_provider, &group_commit).unwrap();
assert!(ada_group.is_active());
let message_ciphertext = billie_group
.encrypt_with_long_term_secret(&billie_provider, b"This is a secret message")
.unwrap();
let message_plaintext = ada_group
.decrypt(&ada_provider, &message_ciphertext)
.unwrap();
assert_eq!(b"This is a secret message".to_vec(), message_plaintext);
let calvin_key_pair = KeyPair::new();
let calvin_provider = MlsProvider::new();
let calvin_member = SecretGroupMember::new(&calvin_provider, &calvin_key_pair).unwrap();
let calvin_key_package = calvin_member.key_package(&calvin_provider).unwrap();
let group_commit = billie_group
.add_members(&billie_provider, &[calvin_key_package.clone()])
.unwrap();
let mut calvin_group = SecretGroup::new_from_welcome(&calvin_provider, &group_commit).unwrap();
assert!(calvin_group.is_active());
ada_group
.process_commit(&ada_provider, &group_commit)
.unwrap();
let message_plaintext = calvin_group
.decrypt(&calvin_provider, &message_ciphertext)
.unwrap();
assert_eq!(b"This is a secret message".to_vec(), message_plaintext);
assert_eq!(ada_group.long_term_epoch(), Some(LongTermSecretEpoch(0)));
assert_eq!(billie_group.long_term_epoch(), Some(LongTermSecretEpoch(0)));
assert_eq!(calvin_group.long_term_epoch(), Some(LongTermSecretEpoch(0)));
billie_group
.rotate_long_term_secret(&billie_provider)
.unwrap();
let group_commit = billie_group
.remove_members(&billie_provider, &[calvin_key_package.clone()])
.unwrap();
assert!(group_commit.welcome().is_none());
ada_group
.process_commit(&ada_provider, &group_commit)
.unwrap();
calvin_group
.process_commit(&calvin_provider, &group_commit)
.unwrap();
assert!(!calvin_group.is_active());
assert_eq!(ada_group.long_term_epoch(), Some(LongTermSecretEpoch(1)));
assert_eq!(billie_group.long_term_epoch(), Some(LongTermSecretEpoch(1)));
assert_eq!(calvin_group.long_term_epoch(), Some(LongTermSecretEpoch(0)));
let message_ciphertext = ada_group
.encrypt_with_long_term_secret(&ada_provider, b"This is another secret message")
.unwrap();
assert!(calvin_group
.decrypt(&calvin_provider, &message_ciphertext)
.is_err());
let message_plaintext = billie_group
.decrypt(&billie_provider, &message_ciphertext)
.unwrap();
assert_eq!(
b"This is another secret message".to_vec(),
message_plaintext
);
let calvin_member_2 = SecretGroupMember::new(&calvin_provider, &calvin_key_pair).unwrap();
let calvin_key_package_2 = calvin_member_2.key_package(&calvin_provider).unwrap();
let group_commit = billie_group
.add_members(&billie_provider, &[calvin_key_package_2])
.unwrap();
let mut calvin_group = SecretGroup::new_from_welcome(&calvin_provider, &group_commit).unwrap();
assert!(calvin_group.is_active());
let message_plaintext = calvin_group
.decrypt(&calvin_provider, &message_ciphertext)
.unwrap();
assert_eq!(
b"This is another secret message".to_vec(),
message_plaintext
);
assert_eq!(calvin_group.long_term_epoch(), Some(LongTermSecretEpoch(1)));
}
#[test]
fn sender_ratchet_evolution() {
let billie_key_pair = KeyPair::new();
let billie_provider = MlsProvider::new();
let billie_member = SecretGroupMember::new(&billie_provider, &billie_key_pair).unwrap();
let secret_group_id = Hash::new_from_bytes(vec![1, 2, 3]).unwrap();
let mut billie_group =
SecretGroup::new(&billie_provider, &secret_group_id, &billie_member).unwrap();
assert!(billie_group.is_active());
let ada_key_pair = KeyPair::new();
let ada_provider = MlsProvider::new();
let ada_member = SecretGroupMember::new(&ada_provider, &ada_key_pair).unwrap();
let ada_key_package = ada_member.key_package(&ada_provider).unwrap();
let group_commit = billie_group
.add_members(&billie_provider, &[ada_key_package])
.unwrap();
let mut ada_group = SecretGroup::new_from_welcome(&ada_provider, &group_commit).unwrap();
assert!(ada_group.is_active());
let message_ciphertext = billie_group
.encrypt(&billie_provider, b"This is a secret message")
.unwrap();
let message_plaintext = ada_group
.decrypt(&ada_provider, &message_ciphertext)
.unwrap();
assert_eq!(b"This is a secret message".to_vec(), message_plaintext);
let calvin_key_pair = KeyPair::new();
let calvin_provider = MlsProvider::new();
let calvin_member = SecretGroupMember::new(&calvin_provider, &calvin_key_pair).unwrap();
let calvin_key_package = calvin_member.key_package(&calvin_provider).unwrap();
let group_commit = billie_group
.add_members(&billie_provider, &[calvin_key_package.clone()])
.unwrap();
let mut calvin_group = SecretGroup::new_from_welcome(&calvin_provider, &group_commit).unwrap();
assert!(calvin_group.is_active());
ada_group
.process_commit(&ada_provider, &group_commit)
.unwrap();
assert!(calvin_group
.decrypt(&calvin_provider, &message_ciphertext)
.is_err());
}