#![allow(clippy::excessive_precision)]
extern crate core;
#[cfg(test)]
#[macro_use]
mod tests;
pub mod ciphertext;
pub mod client_key;
#[cfg(any(test, feature = "internal-keycache"))]
pub mod keycache;
pub mod parameters;
pub mod server_key;
#[cfg(doctest)]
mod test_user_docs;
pub mod wopbs;
pub use ciphertext::{CrtCiphertext, CrtMultiCiphertext, IntegerCiphertext, RadixCiphertext};
pub use client_key::multi_crt::gen_key_id;
pub use client_key::{ClientKey, CrtClientKey, CrtMultiClientKey, RadixClientKey};
pub use server_key::{CheckError, CrtMultiServerKey, ServerKey};
pub fn gen_keys(
parameters_set: &concrete_shortint::parameters::Parameters,
) -> (ClientKey, ServerKey) {
#[cfg(any(test, feature = "internal-keycache"))]
{
keycache::KEY_CACHE.get_from_params(*parameters_set)
}
#[cfg(all(not(test), not(feature = "internal-keycache")))]
{
let cks = ClientKey::new(*parameters_set);
let sks = ServerKey::new(&cks);
(cks, sks)
}
}
pub fn gen_keys_radix(
parameters_set: &concrete_shortint::parameters::Parameters,
num_blocks: usize,
) -> (RadixClientKey, ServerKey) {
let (cks, sks) = gen_keys(parameters_set);
(RadixClientKey::from((cks, num_blocks)), sks)
}
pub fn gen_keys_crt(
parameters_set: &concrete_shortint::parameters::Parameters,
basis: Vec<u64>,
) -> (CrtClientKey, ServerKey) {
let (cks, sks) = gen_keys(parameters_set);
(CrtClientKey::from((cks, basis)), sks)
}
pub fn gen_keys_multi_crt(
parameters_set: &[concrete_shortint::parameters::Parameters],
) -> (CrtMultiClientKey, CrtMultiServerKey) {
let mut client_keys = Vec::with_capacity(parameters_set.len());
let mut server_keys = Vec::with_capacity(parameters_set.len());
for parameters in parameters_set {
let (cks, sks) = gen_keys(parameters);
client_keys.push(cks.into());
server_keys.push(sks.into());
}
let cks = CrtMultiClientKey::from(client_keys);
let sks = CrtMultiServerKey::from(server_keys);
(cks, sks)
}