use mls_rs::{
client_builder::MlsConfig,
error::MlsError,
identity::{
basic::{BasicCredential, BasicIdentityProvider},
SigningIdentity,
},
CipherSuite, CipherSuiteProvider, Client, CryptoProvider, ExtensionList,
};
const CIPHERSUITE: CipherSuite = CipherSuite::CURVE25519_AES128;
fn make_client<P: CryptoProvider + Clone>(
crypto_provider: P,
name: &str,
) -> Result<Client<impl MlsConfig>, MlsError> {
let cipher_suite = crypto_provider.cipher_suite_provider(CIPHERSUITE).unwrap();
let (secret, public) = cipher_suite.signature_key_generate().unwrap();
let basic_identity = BasicCredential::new(name.as_bytes().to_vec());
let signing_identity = SigningIdentity::new(basic_identity.into_credential(), public);
Ok(Client::builder()
.identity_provider(BasicIdentityProvider)
.crypto_provider(crypto_provider)
.signing_identity(signing_identity, secret, CIPHERSUITE)
.build())
}
fn main() -> Result<(), MlsError> {
let crypto_provider = mls_rs_crypto_openssl::OpensslCryptoProvider::default();
let alice = make_client(crypto_provider.clone(), "alice")?;
let bob = make_client(crypto_provider.clone(), "bob")?;
let mut alice_group = alice.create_group(ExtensionList::default(), Default::default(), None)?;
let bob_key_package =
bob.generate_key_package_message(Default::default(), Default::default(), None)?;
let alice_commit = alice_group
.commit_builder()
.add_member(bob_key_package)?
.build()?;
alice_group.apply_pending_commit()?;
let (mut bob_group, _) = bob.join_group(None, &alice_commit.welcome_messages[0], None)?;
let msg = alice_group.encrypt_application_message(b"hello world", Default::default())?;
let msg = bob_group.process_incoming_message(msg)?;
println!("Received message: {msg:?}");
alice_group.write_to_storage()?;
bob_group.write_to_storage()?;
Ok(())
}