use crate::factors::contexts::EncryptionContext;
use crate::factors::{EncryptionSecret, PseudonymizationSecret};
#[derive(Clone)]
pub struct DistributedTranscryptor {
pub(crate) system: super::types::Transcryptor,
pub(crate) blinding_factor: crate::keys::distribution::BlindingFactor,
}
impl std::ops::Deref for DistributedTranscryptor {
type Target = super::types::Transcryptor;
fn deref(&self) -> &Self::Target {
&self.system
}
}
impl DistributedTranscryptor {
pub fn new(
pseudonymisation_secret: PseudonymizationSecret,
rekeying_secret: EncryptionSecret,
blinding_factor: crate::keys::distribution::BlindingFactor,
) -> Self {
Self {
system: super::types::Transcryptor::new(pseudonymisation_secret, rekeying_secret),
blinding_factor,
}
}
pub fn system(&self) -> &super::types::Transcryptor {
&self.system
}
#[allow(dead_code)]
pub(crate) fn blinding_factor(&self) -> &crate::keys::distribution::BlindingFactor {
&self.blinding_factor
}
pub fn pseudonym_session_key_share(
&self,
session: &EncryptionContext,
) -> crate::keys::distribution::PseudonymSessionKeyShare {
let k = crate::factors::make_pseudonym_rekey_factor(self.system.rekeying_secret(), session);
crate::keys::distribution::make_pseudonym_session_key_share(&k, &self.blinding_factor)
}
pub fn attribute_session_key_share(
&self,
session: &EncryptionContext,
) -> crate::keys::distribution::AttributeSessionKeyShare {
let k = crate::factors::make_attribute_rekey_factor(self.system.rekeying_secret(), session);
crate::keys::distribution::make_attribute_session_key_share(&k, &self.blinding_factor)
}
pub fn session_key_shares(
&self,
session: &EncryptionContext,
) -> crate::keys::distribution::SessionKeyShares {
let pseudonym_rekey_factor =
crate::factors::make_pseudonym_rekey_factor(self.system.rekeying_secret(), session);
let attribute_rekey_factor =
crate::factors::make_attribute_rekey_factor(self.system.rekeying_secret(), session);
crate::keys::distribution::make_session_key_shares(
&pseudonym_rekey_factor,
&attribute_rekey_factor,
&self.blinding_factor,
)
}
}