use openmls::credentials::Credential;
use openmls::key_packages::KeyPackage;
use openmls_traits::OpenMlsCryptoProvider;
use crate::identity::KeyPair;
use crate::secret_group::mls::MlsMember;
use crate::secret_group::SecretGroupError;
#[derive(Debug, Clone)]
pub struct SecretGroupMember {
mls_member: MlsMember,
}
impl SecretGroupMember {
pub fn new(
provider: &impl OpenMlsCryptoProvider,
key_pair: &KeyPair,
) -> Result<Self, SecretGroupError> {
let mls_member = MlsMember::new(provider, key_pair)?;
Ok(SecretGroupMember { mls_member })
}
pub fn key_package(
&self,
provider: &impl OpenMlsCryptoProvider,
) -> Result<KeyPackage, SecretGroupError> {
Ok(self.mls_member.key_package(provider)?)
}
pub fn credential(&self) -> &Credential {
self.mls_member.credential()
}
}
#[cfg(test)]
mod tests {
use openmls::credentials::CredentialBundle;
use openmls::key_packages::KeyPackageBundle;
use openmls_traits::key_store::OpenMlsKeyStore;
use openmls_traits::OpenMlsCryptoProvider;
use tls_codec::Serialize;
use crate::identity::KeyPair;
use crate::secret_group::mls::MlsProvider;
use super::SecretGroupMember;
#[test]
fn public_key_identity() {
let provider = MlsProvider::new();
let key_pair = KeyPair::new();
let public_key_bytes = key_pair.public_key().to_bytes().to_vec();
let member = SecretGroupMember::new(&provider, &key_pair).unwrap();
assert_eq!(public_key_bytes, member.credential().identity());
let key_package = member.key_package(&provider).unwrap();
assert_eq!(public_key_bytes, key_package.credential().identity());
}
#[test]
fn storage() {
let provider = MlsProvider::new();
let key_pair = KeyPair::new();
let member = SecretGroupMember::new(&provider, &key_pair).unwrap();
let key_package = member.key_package(&provider).unwrap();
let key_package_bundle: Option<KeyPackageBundle> = provider
.key_store()
.read(key_package.hash_ref(provider.crypto()).unwrap().as_slice());
let credential_bundle: Option<CredentialBundle> = provider.key_store().read(
&member
.credential()
.signature_key()
.tls_serialize_detached()
.unwrap(),
);
assert!(key_package_bundle.is_some());
assert!(credential_bundle.is_some());
}
}