mod crt;
mod crt_parallel;
mod multi_crt;
mod radix;
mod radix_parallel;
use crate::client_key::ClientKey;
use concrete_shortint::server_key::MaxDegree;
use serde::{Deserialize, Serialize};
pub use concrete_shortint::CheckError;
pub use multi_crt::CrtMultiServerKey;
#[derive(Serialize, Deserialize, Clone)]
pub struct ServerKey {
pub(crate) key: concrete_shortint::ServerKey,
}
impl From<ServerKey> for concrete_shortint::ServerKey {
fn from(key: ServerKey) -> concrete_shortint::ServerKey {
key.key
}
}
impl ServerKey {
pub fn new<C>(cks: C) -> ServerKey
where
C: AsRef<ClientKey>,
{
let client_key = cks.as_ref();
let max = (client_key.key.parameters.message_modulus.0 - 1)
* client_key.key.parameters.carry_modulus.0
- 1;
let sks = concrete_shortint::server_key::ServerKey::new_with_max_degree(
&client_key.key,
MaxDegree(max),
);
ServerKey { key: sks }
}
pub fn from_shortint(
cks: &ClientKey,
mut key: concrete_shortint::server_key::ServerKey,
) -> ServerKey {
let max =
(cks.key.parameters.message_modulus.0 - 1) * cks.key.parameters.carry_modulus.0 - 1;
key.max_degree = MaxDegree(max);
ServerKey { key }
}
}