use openmls::key_packages::KeyPackage as MlsKeyPackage;
use crate::mls_crypto::MlsError;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct KeyPackageBytes {
bytes: Vec<u8>,
identity: Vec<u8>,
}
impl KeyPackageBytes {
pub fn new(bytes: Vec<u8>, identity: Vec<u8>) -> Self {
Self { bytes, identity }
}
pub fn as_bytes(&self) -> &[u8] {
&self.bytes
}
pub fn identity(&self) -> &[u8] {
&self.identity
}
}
#[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>),
Other(String),
}
#[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>,
proposal_senders: Vec<Vec<u8>>,
self_removed: bool,
actions: Vec<MlsProposalOutput>,
},
Aborted,
}
#[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_json(json_bytes: Vec<u8>) -> Result<(Vec<u8>, Vec<u8>), MlsError> {
let kp: MlsKeyPackage =
serde_json::from_slice(&json_bytes).map_err(MlsError::KeyPackageJson)?;
let identity = kp.leaf_node().credential().serialized_content().to_vec();
Ok((json_bytes, identity))
}