use crate::config::Config;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "booleans")]
use crate::booleans::{BoolClientKey, BoolServerKey};
use crate::errors::{UninitializedClientKey, UnwrapResultExt};
#[cfg(feature = "integers")]
use crate::integers::{IntegerClientKey, IntegerServerKey};
#[cfg(feature = "shortints")]
use crate::shortints::{ShortIntClientKey, ShortIntServerKey};
pub fn generate_keys<C: Into<Config>>(config: C) -> (ClientKey, ServerKey) {
let client_kc = ClientKey::generate(config);
let server_kc = client_kc.generate_server_key();
(client_kc, server_kc)
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug)]
pub struct ClientKey {
#[cfg(feature = "booleans")]
pub(crate) bool_key: BoolClientKey,
#[cfg(feature = "shortints")]
pub(crate) shortint_key: ShortIntClientKey,
#[cfg(feature = "integers")]
pub(crate) integer_key: IntegerClientKey,
}
impl ClientKey {
pub fn generate<C: Into<Config>>(config: C) -> ClientKey {
#[allow(unused_variables)]
let config: Config = config.into();
ClientKey {
#[cfg(feature = "booleans")]
bool_key: BoolClientKey::from(config.bool_config),
#[cfg(feature = "shortints")]
shortint_key: ShortIntClientKey::from(config.shortint_config),
#[cfg(feature = "integers")]
integer_key: IntegerClientKey::from(config.integer_config),
}
}
pub fn generate_server_key(&self) -> ServerKey {
ServerKey::new(self)
}
}
pub trait RefKeyFromKeyChain: Sized {
type Key;
fn ref_key(self, keys: &ClientKey) -> Result<&Self::Key, UninitializedClientKey>;
#[track_caller]
fn unwrapped_ref_key(self, keys: &ClientKey) -> &Self::Key {
self.ref_key(keys).unwrap_display()
}
}
#[cfg(any(feature = "booleans", feature = "shortints", feature = "integers"))]
macro_rules! impl_ref_key_from_keychain {
(
for $implementor:ty {
key_type: $key_type:ty,
keychain_member: $($member:ident).*,
type_variant: $enum_variant:expr,
}
) => {
impl crate::keys::RefKeyFromKeyChain for $implementor {
type Key = $key_type;
fn ref_key(self, keys: &ClientKey) -> Result<&Self::Key, UninitializedClientKey> {
keys$(.$member)*
.as_ref()
.ok_or(UninitializedClientKey($enum_variant))
}
}
}
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Default)]
pub struct ServerKey {
#[cfg(feature = "booleans")]
pub(crate) bool_key: BoolServerKey,
#[cfg(feature = "shortints")]
pub(crate) shortint_key: ShortIntServerKey,
#[cfg(feature = "integers")]
pub(crate) integer_key: IntegerServerKey,
}
impl ServerKey {
#[allow(unused_variables)]
pub(crate) fn new(keys: &ClientKey) -> Self {
Self {
#[cfg(feature = "booleans")]
bool_key: BoolServerKey::new(&keys.bool_key),
#[cfg(feature = "shortints")]
shortint_key: ShortIntServerKey::new(&keys.shortint_key),
#[cfg(feature = "integers")]
integer_key: IntegerServerKey::new(&keys.integer_key),
}
}
}