use openmls_traits::crypto::OpenMlsCrypto;
use serde::{Deserialize, Serialize};
use crate::{
ciphersuite::{hash_ref::KeyPackageRef, HpkePrivateKey, HpkePublicKey},
error::LibraryError,
key_packages::{KeyPackage, KeyPackageBundle},
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LeafNode {
key_package_ref: Option<KeyPackageRef>,
key_package: KeyPackage,
private_key_option: Option<HpkePrivateKey>,
}
impl PartialEq for LeafNode {
fn eq(&self, other: &Self) -> bool {
self.key_package == other.key_package && self.private_key_option == other.private_key_option
}
}
impl LeafNode {
pub(crate) fn new(
key_package: KeyPackage,
backend: &impl OpenMlsCrypto,
) -> Result<Self, LibraryError> {
let key_package_ref = Some(key_package.hash_ref(backend)?);
Ok(Self {
key_package_ref,
key_package,
private_key_option: None,
})
}
pub(crate) fn new_with_ref(
key_package: KeyPackage,
key_package_ref: Option<KeyPackageRef>,
) -> Self {
Self {
key_package_ref,
key_package,
private_key_option: None,
}
}
pub(crate) fn new_from_bundle(
key_package_bundle: KeyPackageBundle,
backend: &impl OpenMlsCrypto,
) -> Result<Self, LibraryError> {
let key_package = key_package_bundle.key_package;
let private_key_option = Some(key_package_bundle.private_key);
let key_package_ref = Some(key_package.hash_ref(backend)?);
Ok(Self {
key_package_ref,
key_package,
private_key_option,
})
}
pub(crate) fn public_key(&self) -> &HpkePublicKey {
self.key_package.hpke_init_key()
}
#[cfg(not(any(feature = "test-utils", test)))]
pub(in crate::treesync) fn private_key(&self) -> Option<&HpkePrivateKey> {
self.private_key_option.as_ref()
}
#[cfg(any(feature = "test-utils", test))]
pub(crate) fn private_key(&self) -> Option<&HpkePrivateKey> {
self.private_key_option.as_ref()
}
pub(in crate::treesync) fn set_private_key(&mut self, private_key: HpkePrivateKey) {
self.private_key_option = Some(private_key)
}
pub fn key_package(&self) -> &KeyPackage {
&self.key_package
}
pub(crate) fn key_package_ref(&self) -> Option<&KeyPackageRef> {
self.key_package_ref.as_ref()
}
pub(crate) fn set_key_package_ref(
&mut self,
backend: &impl OpenMlsCrypto,
) -> Result<(), LibraryError> {
self.key_package_ref = Some(self.key_package.hash_ref(backend)?);
Ok(())
}
}
impl From<KeyPackage> for LeafNode {
fn from(key_package: KeyPackage) -> Self {
LeafNode {
key_package_ref: None,
key_package,
private_key_option: None,
}
}
}