use openmls::{key_packages::KeyPackageIn, prelude::DeserializeBytes};
use crate::mls_crypto::MlsError;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct KeyPackageBytes {
bytes: Vec<u8>,
member_id: Vec<u8>,
}
impl KeyPackageBytes {
pub fn new(bytes: Vec<u8>, member_id: Vec<u8>) -> Self {
Self { bytes, member_id }
}
pub fn as_bytes(&self) -> &[u8] {
&self.bytes
}
pub fn member_id(&self) -> &[u8] {
&self.member_id
}
}
#[derive(Clone, Debug)]
pub enum MlsCommitInput {
Add(KeyPackageBytes),
Remove(Vec<u8>),
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum MlsProposalOutput {
Add(Vec<u8>),
Remove(Vec<u8>),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MlsMessageKind {
Application,
Proposal,
Commit,
Welcome,
Other,
}
#[derive(Clone, Debug)]
pub enum DecryptResult {
Application(Vec<u8>, Vec<u8>),
Removed(Vec<u8>),
ProposalStored(Vec<u8>, MlsProposalOutput),
Ignored,
}
#[derive(Clone, Debug)]
pub enum StagedCandidateResult {
Staged {
commit_sender: Vec<u8>,
self_removed: bool,
actions: Vec<MlsProposalOutput>,
},
Aborted,
BundleSenderMismatch { commit_sender: Vec<u8> },
}
#[derive(Clone, Debug)]
pub struct CommitCandidate {
pub proposals: Vec<Vec<u8>>,
pub commit: Vec<u8>,
pub welcome: Option<Vec<u8>>,
}
pub fn key_package_bytes_from_tls(bytes: Vec<u8>) -> Result<(Vec<u8>, Vec<u8>), MlsError> {
let (kp_in, _rest) =
KeyPackageIn::tls_deserialize_bytes(&bytes).map_err(MlsError::KeyPackageTls)?;
let member_id = kp_in
.unverified_credential()
.credential
.serialized_content()
.to_vec();
Ok((bytes, member_id))
}