Compare commits

...

7 Commits

Author SHA1 Message Date
Arthur Meyre
066b4ed993 chore: wasm bench 2024-05-17 12:26:28 +02:00
Arthur Meyre
3d74cb9980 chore(bench): zk bench 2024-05-14 13:16:46 +02:00
Arthur Meyre
59394a46b5 chore(bench): add cast + single clean PBS benchmark for PKE 2024-05-07 13:49:41 +02:00
Arthur Meyre
77801db6fe fix: test casting with proper degree to guarantee correctness 2024-05-06 16:33:13 +02:00
Arthur Meyre
580f4f6c6d wip bug casting AP 2024-05-06 16:29:20 +02:00
Arthur Meyre
05ec1eaed6 chore: add params, misc fixes for test 2024-05-06 10:40:19 +02:00
J-B Orfila
649c2c1ccd feat(integer): basic AP added 2024-05-03 17:07:10 +02:00
19 changed files with 10168 additions and 155 deletions

View File

@@ -9,6 +9,7 @@ def main(args):
data = []
for json_file in sorted(criterion_dir.glob("**/*.json")):
# print(json_file)
if json_file.parent.name == "base" or json_file.name != "benchmark.json":
continue
@@ -16,23 +17,24 @@ def main(args):
bench_data = json.loads(json_file.read_text())
estimate_file = json_file.with_name("estimates.json")
estimate_data = json.loads(estimate_file.read_text())
parameter_set = json_file.parent.parent.name
bench_function_id = bench_data["function_id"]
# bench_function_id = bench_data["function_id"]
split = bench_function_id.split("::")
if split.len() == 5: # Signed integers
(_, _, function_name, parameter_set, bits) = split
else: # Unsigned integers
(_, function_name, parameter_set, bits) = split
# split = bench_function_id.split("::")
# if split.len() == 5: # Signed integers
# (_, _, function_name, parameter_set, bits) = split
# else: # Unsigned integers
# (_, function_name, parameter_set, bits) = split
if "_scalar_" in bits:
(bits, scalar) = bits.split("_bits_scalar_")
bits = int(bits)
scalar = int(scalar)
else:
(bits, _) = bits.split("_")
bits = int(bits)
scalar = None
# if "_scalar_" in bits:
# (bits, scalar) = bits.split("_bits_scalar_")
# bits = int(bits)
# scalar = int(scalar)
# else:
# (bits, _) = bits.split("_")
# bits = int(bits)
# scalar = None
estimate_mean_ms = estimate_data["mean"]["point_estimate"] / 1000000
estimate_lower_bound_ms = (
@@ -44,10 +46,10 @@ def main(args):
data.append(
(
function_name,
# bench_function_id,
parameter_set,
bits,
scalar,
# bits,
# scalar,
estimate_mean_ms,
estimate_lower_bound_ms,
estimate_upper_bound_ms,
@@ -62,7 +64,7 @@ def main(args):
with open(output_file, "w", encoding="utf-8") as output:
output.write(
"function_name,parameter_set,bits,scalar,mean_ms,"
"parameter_set,mean_ms,"
"confidence_interval_lower_bound_ms,confidence_interval_upper_bound_ms\n"
)
# Sort by func_name, bit width and then parameters
@@ -70,16 +72,15 @@ def main(args):
for dat in data:
(
function_name,
parameter_set,
bits,
scalar,
# bits,
# scalar,
estimate_mean_ms,
estimate_lower_bound_ms,
estimate_upper_bound_ms,
) = dat
output.write(
f"{function_name},{parameter_set},{bits},{scalar},{estimate_mean_ms},"
f"{parameter_set},{estimate_mean_ms},"
f"{estimate_lower_bound_ms},{estimate_upper_bound_ms}\n"
)

18
params_bc.py Normal file
View File

@@ -0,0 +1,18 @@
import itertools
def main():
msg_carry_bits = [1, 2, 3, 4]
security = list(range(128, 139))
p_fails = [40, 64, 80, 128]
for (msg_carry_bit, sec, p_fail) in itertools.product(msg_carry_bits, security, p_fails):
print(f"PARAM_PKE_MESSAGE_{msg_carry_bit}_CARRY_{msg_carry_bit}_{sec}_{p_fail}")
print(f"PARAM_FHE_MESSAGE_{msg_carry_bit}_CARRY_{msg_carry_bit}_{sec}_{p_fail}")
for (msg_carry_bit, sec, p_fail) in itertools.product(msg_carry_bits, security, p_fails):
print(f"(PARAM_PKE_MESSAGE_{msg_carry_bit}_CARRY_{msg_carry_bit}_{sec}_{p_fail},"
f"PARAM_FHE_MESSAGE_{msg_carry_bit}_CARRY_{msg_carry_bit}_{sec}_{p_fail},"
f"PARAM_KEYSWITCH_MESSAGE_{msg_carry_bit}_CARRY_{msg_carry_bit}_{sec}_{p_fail})")
if __name__ == "__main__":
main()

View File

@@ -50,26 +50,38 @@ struct GroupElements<G: Curve> {
}
impl<G: Curve> GroupElements<G> {
pub fn new(message_len: usize, alpha: G::Zp) -> Self {
let mut g_list = Vec::new();
let mut g_hat_list = Vec::new();
pub fn new(message_len: usize, _alpha: G::Zp) -> Self {
let (g_list, g_hat_list) = rayon::join(
|| {
let mut g_list = Vec::new();
let mut g_cur = G::G1::GENERATOR.mul_scalar(alpha);
// let mut g_cur = G::G1::GENERATOR.mul_scalar(alpha);
let mut g_cur = G::G1::GENERATOR + G::G1::GENERATOR;
for i in 0..2 * message_len {
if i == message_len {
g_list.push(G::G1::ZERO);
} else {
g_list.push(g_cur);
}
g_cur = g_cur.mul_scalar(alpha);
}
for i in 0..2 * message_len {
if i == message_len {
g_list.push(G::G1::ZERO);
} else {
g_list.push(g_cur);
}
// g_cur = g_cur.mul_scalar(alpha);
g_cur = g_cur + g_cur;
}
let mut g_hat_cur = G::G2::GENERATOR.mul_scalar(alpha);
for _ in 0..message_len {
g_hat_list.push(g_hat_cur);
g_hat_cur = (g_hat_cur).mul_scalar(alpha);
}
g_list
},
|| {
let mut g_hat_list = Vec::new();
// let mut g_hat_cur = G::G2::GENERATOR.mul_scalar(alpha);
let mut g_hat_cur = G::G2::GENERATOR + G::G2::GENERATOR;
for _ in 0..message_len {
g_hat_list.push(g_hat_cur);
// g_hat_cur = (g_hat_cur).mul_scalar(alpha);
g_hat_cur = g_hat_cur + g_hat_cur;
}
g_hat_list
},
);
Self {
g_list: OneBased::new(g_list),

File diff suppressed because it is too large Load Diff

View File

@@ -65,8 +65,8 @@ where
lwe_dimension: Some(params.lwe_dimension()),
glwe_dimension: Some(params.glwe_dimension()),
polynomial_size: Some(params.polynomial_size()),
lwe_std_dev: Some(params.lwe_noise_distribution().gaussian_std_dev()),
glwe_std_dev: Some(params.glwe_noise_distribution().gaussian_std_dev()),
lwe_std_dev: None,
glwe_std_dev: None,
pbs_base_log: Some(params.pbs_base_log()),
pbs_level: Some(params.pbs_level()),
ks_base_log: Some(params.ks_base_log()),

View File

@@ -1,3 +1,16 @@
use crate::integer::key_switching_key::KeySwitchingKey;
use crate::integer::keycache::KEY_CACHE;
use crate::integer::{
gen_keys, ClientKey, CompactPublicKey, CompressedPublicKey, IntegerCiphertext, IntegerKeyKind,
PublicKey, RadixCiphertext, RadixClientKey, ServerKey,
};
use crate::shortint::engine::ShortintEngine;
use crate::shortint::parameters::bc::*;
use crate::shortint::parameters::ShortintKeySwitchingParameters;
use crate::shortint::prelude::PARAM_MESSAGE_2_CARRY_2_KS_PBS;
use crate::shortint::server_key::apply_programmable_bootstrap;
use crate::shortint::ClassicPBSParameters;
macro_rules! create_parametrized_test {
(
$name:ident {
@@ -74,3 +87,291 @@ macro_rules! create_parametrized_test_classical_params {
};
}
pub(crate) use {create_parametrized_test, create_parametrized_test_classical_params};
fn pke_ap(
param_pke: ClassicPBSParameters,
param_fhe: ClassicPBSParameters,
param_ksk: ShortintKeySwitchingParameters,
) {
let num_block = 4usize;
// let param_pke = PARAM_MESSAGE_2_CARRY_2_KS_PBS;
// let param_fhe = PARAM_MESSAGE_2_CARRY_2_KS_PBS;
// let param_ksk = ShortintKeySwitchingParameters::new(param_fhe.ks_base_log,
// param_fhe.ks_level);
// let (cks_pke, sks_pke) = gen_keys(param_pke, IntegerKeyKind::Radix);
// let pk = crate::integer::public_key::CompactPublicKey::new(&cks_pke);
// let (cks_fhe, sks_fhe) = gen_keys(param_fhe, IntegerKeyKind::Radix);
assert_eq!(param_pke.message_modulus, param_fhe.message_modulus);
assert_eq!(param_pke.carry_modulus, param_fhe.carry_modulus);
let modulus = dbg!(param_fhe.message_modulus.0.pow(num_block as u32) as u64);
let cks_pke = ClientKey::new(param_pke);
let sks_pke = ServerKey::new_radix_server_key(&cks_pke);
let pk = CompactPublicKey::new(&cks_pke);
let cks_fhe = ClientKey::new(param_fhe);
let sks_fhe = ServerKey::new_radix_server_key(&cks_fhe);
let ksk = KeySwitchingKey::new((&cks_pke, &sks_pke), (&cks_fhe, &sks_fhe), param_ksk);
use rand::Rng;
let mut rng = rand::thread_rng();
let input_msg: u64 = dbg!(rng.gen_range(0..modulus));
// Encrypt a value and cast
let ct1 = pk.encrypt_radix_compact(input_msg, num_block);
let ct1_extracted: &RadixCiphertext = &ct1.expand()[0];
let sanity_extracted: u64 = cks_pke.decrypt_radix(&ct1_extracted);
assert_eq!(sanity_extracted, input_msg);
// KSK Cast
let ct_cast = ksk.cast(ct1_extracted);
let mut ct2: RadixCiphertext = sks_fhe.create_trivial_radix(0u64, ct_cast.blocks().len());
// PBS to clean
let acc = sks_fhe.key.generate_lookup_table(|x| x);
for (input, output) in ct_cast.blocks().iter().zip(ct2.blocks_mut()) {
ShortintEngine::with_thread_local_mut(|engine| {
let (_, buffers) = engine.get_buffers(&sks_fhe.key);
apply_programmable_bootstrap(
&sks_fhe.key.bootstrapping_key,
&input.ct,
&mut output.ct,
&acc,
buffers,
);
});
output.degree = input.degree;
// sks_fhe.key.apply_lookup_table_assign(blocks, &acc)
}
let sanity_pbs: u64 = cks_fhe.decrypt_radix(&ct2);
assert_eq!(sanity_pbs, input_msg);
let multiplier = dbg!(rng.gen_range(0..modulus));
// Classical AP: DP, KS, PBS
sks_fhe.scalar_mul_assign_parallelized(&mut ct2, multiplier);
{
let mut input_fresh = cks_fhe.encrypt_radix(input_msg, num_block);
for ct in input_fresh.blocks_mut() {
sks_fhe.key.apply_lookup_table_assign(ct, &acc);
}
sks_fhe.scalar_mul_assign_parallelized(&mut input_fresh, multiplier);
// High level decryption and test
let clear_fresh = cks_fhe.decrypt_radix::<u64>(&input_fresh) % modulus;
//let clear: u64 = cks_fhe.decrypt_radix(&ct1_extracted[0]);
assert_eq!(clear_fresh, (input_msg * multiplier) % modulus);
}
// High level decryption and test
let clear = cks_fhe.decrypt_radix::<u64>(&ct2) % modulus;
//let clear: u64 = cks_fhe.decrypt_radix(&ct1_extracted[0]);
assert_eq!(clear, (input_msg * multiplier) % modulus);
}
macro_rules! create_parametrized_test_pke {
(
$name:ident {
$(($param_pke:ident, $param_fhe:ident, $param_ksk:ident)),*
$(,)?
}
) => {
::paste::paste! {
$(
#[test]
fn [<test_ $name _ $param_pke:lower _ $param_fhe:lower _ $param_ksk:lower>]() {
$name($param_pke, $param_fhe, $param_ksk)
}
)*
}
};
}
create_parametrized_test_pke!(pke_ap {
(PARAM_PKE_MESSAGE_1_CARRY_1_128_40,PARAM_FHE_MESSAGE_1_CARRY_1_128_40,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_128_40),
(PARAM_PKE_MESSAGE_1_CARRY_1_128_64,PARAM_FHE_MESSAGE_1_CARRY_1_128_64,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_128_64),
(PARAM_PKE_MESSAGE_1_CARRY_1_128_80,PARAM_FHE_MESSAGE_1_CARRY_1_128_80,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_128_80),
(PARAM_PKE_MESSAGE_1_CARRY_1_128_128,PARAM_FHE_MESSAGE_1_CARRY_1_128_128,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_128_128),
(PARAM_PKE_MESSAGE_1_CARRY_1_129_40,PARAM_FHE_MESSAGE_1_CARRY_1_129_40,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_129_40),
(PARAM_PKE_MESSAGE_1_CARRY_1_129_64,PARAM_FHE_MESSAGE_1_CARRY_1_129_64,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_129_64),
(PARAM_PKE_MESSAGE_1_CARRY_1_129_80,PARAM_FHE_MESSAGE_1_CARRY_1_129_80,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_129_80),
(PARAM_PKE_MESSAGE_1_CARRY_1_129_128,PARAM_FHE_MESSAGE_1_CARRY_1_129_128,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_129_128),
(PARAM_PKE_MESSAGE_1_CARRY_1_130_40,PARAM_FHE_MESSAGE_1_CARRY_1_130_40,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_130_40),
(PARAM_PKE_MESSAGE_1_CARRY_1_130_64,PARAM_FHE_MESSAGE_1_CARRY_1_130_64,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_130_64),
(PARAM_PKE_MESSAGE_1_CARRY_1_130_80,PARAM_FHE_MESSAGE_1_CARRY_1_130_80,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_130_80),
(PARAM_PKE_MESSAGE_1_CARRY_1_130_128,PARAM_FHE_MESSAGE_1_CARRY_1_130_128,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_130_128),
(PARAM_PKE_MESSAGE_1_CARRY_1_131_40,PARAM_FHE_MESSAGE_1_CARRY_1_131_40,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_131_40),
(PARAM_PKE_MESSAGE_1_CARRY_1_131_64,PARAM_FHE_MESSAGE_1_CARRY_1_131_64,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_131_64),
(PARAM_PKE_MESSAGE_1_CARRY_1_131_80,PARAM_FHE_MESSAGE_1_CARRY_1_131_80,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_131_80),
(PARAM_PKE_MESSAGE_1_CARRY_1_131_128,PARAM_FHE_MESSAGE_1_CARRY_1_131_128,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_131_128),
(PARAM_PKE_MESSAGE_1_CARRY_1_132_40,PARAM_FHE_MESSAGE_1_CARRY_1_132_40,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_132_40),
(PARAM_PKE_MESSAGE_1_CARRY_1_132_64,PARAM_FHE_MESSAGE_1_CARRY_1_132_64,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_132_64),
(PARAM_PKE_MESSAGE_1_CARRY_1_132_80,PARAM_FHE_MESSAGE_1_CARRY_1_132_80,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_132_80),
(PARAM_PKE_MESSAGE_1_CARRY_1_132_128,PARAM_FHE_MESSAGE_1_CARRY_1_132_128,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_132_128),
(PARAM_PKE_MESSAGE_1_CARRY_1_133_40,PARAM_FHE_MESSAGE_1_CARRY_1_133_40,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_133_40),
(PARAM_PKE_MESSAGE_1_CARRY_1_133_64,PARAM_FHE_MESSAGE_1_CARRY_1_133_64,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_133_64),
(PARAM_PKE_MESSAGE_1_CARRY_1_133_80,PARAM_FHE_MESSAGE_1_CARRY_1_133_80,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_133_80),
(PARAM_PKE_MESSAGE_1_CARRY_1_133_128,PARAM_FHE_MESSAGE_1_CARRY_1_133_128,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_133_128),
(PARAM_PKE_MESSAGE_1_CARRY_1_134_40,PARAM_FHE_MESSAGE_1_CARRY_1_134_40,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_134_40),
(PARAM_PKE_MESSAGE_1_CARRY_1_134_64,PARAM_FHE_MESSAGE_1_CARRY_1_134_64,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_134_64),
(PARAM_PKE_MESSAGE_1_CARRY_1_134_80,PARAM_FHE_MESSAGE_1_CARRY_1_134_80,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_134_80),
(PARAM_PKE_MESSAGE_1_CARRY_1_134_128,PARAM_FHE_MESSAGE_1_CARRY_1_134_128,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_134_128),
(PARAM_PKE_MESSAGE_1_CARRY_1_135_40,PARAM_FHE_MESSAGE_1_CARRY_1_135_40,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_135_40),
(PARAM_PKE_MESSAGE_1_CARRY_1_135_64,PARAM_FHE_MESSAGE_1_CARRY_1_135_64,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_135_64),
(PARAM_PKE_MESSAGE_1_CARRY_1_135_80,PARAM_FHE_MESSAGE_1_CARRY_1_135_80,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_135_80),
(PARAM_PKE_MESSAGE_1_CARRY_1_135_128,PARAM_FHE_MESSAGE_1_CARRY_1_135_128,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_135_128),
(PARAM_PKE_MESSAGE_1_CARRY_1_136_40,PARAM_FHE_MESSAGE_1_CARRY_1_136_40,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_136_40),
(PARAM_PKE_MESSAGE_1_CARRY_1_136_64,PARAM_FHE_MESSAGE_1_CARRY_1_136_64,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_136_64),
(PARAM_PKE_MESSAGE_1_CARRY_1_136_80,PARAM_FHE_MESSAGE_1_CARRY_1_136_80,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_136_80),
(PARAM_PKE_MESSAGE_1_CARRY_1_136_128,PARAM_FHE_MESSAGE_1_CARRY_1_136_128,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_136_128),
(PARAM_PKE_MESSAGE_1_CARRY_1_137_40,PARAM_FHE_MESSAGE_1_CARRY_1_137_40,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_137_40),
(PARAM_PKE_MESSAGE_1_CARRY_1_137_64,PARAM_FHE_MESSAGE_1_CARRY_1_137_64,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_137_64),
(PARAM_PKE_MESSAGE_1_CARRY_1_137_80,PARAM_FHE_MESSAGE_1_CARRY_1_137_80,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_137_80),
(PARAM_PKE_MESSAGE_1_CARRY_1_137_128,PARAM_FHE_MESSAGE_1_CARRY_1_137_128,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_137_128),
(PARAM_PKE_MESSAGE_1_CARRY_1_138_40,PARAM_FHE_MESSAGE_1_CARRY_1_138_40,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_138_40),
(PARAM_PKE_MESSAGE_1_CARRY_1_138_64,PARAM_FHE_MESSAGE_1_CARRY_1_138_64,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_138_64),
(PARAM_PKE_MESSAGE_1_CARRY_1_138_80,PARAM_FHE_MESSAGE_1_CARRY_1_138_80,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_138_80),
(PARAM_PKE_MESSAGE_1_CARRY_1_138_128,PARAM_FHE_MESSAGE_1_CARRY_1_138_128,PARAM_KEYSWITCH_MESSAGE_1_CARRY_1_138_128),
(PARAM_PKE_MESSAGE_2_CARRY_2_128_40,PARAM_FHE_MESSAGE_2_CARRY_2_128_40,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_128_40),
(PARAM_PKE_MESSAGE_2_CARRY_2_128_64,PARAM_FHE_MESSAGE_2_CARRY_2_128_64,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_128_64),
(PARAM_PKE_MESSAGE_2_CARRY_2_128_80,PARAM_FHE_MESSAGE_2_CARRY_2_128_80,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_128_80),
(PARAM_PKE_MESSAGE_2_CARRY_2_128_128,PARAM_FHE_MESSAGE_2_CARRY_2_128_128,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_128_128),
(PARAM_PKE_MESSAGE_2_CARRY_2_129_40,PARAM_FHE_MESSAGE_2_CARRY_2_129_40,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_129_40),
(PARAM_PKE_MESSAGE_2_CARRY_2_129_64,PARAM_FHE_MESSAGE_2_CARRY_2_129_64,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_129_64),
(PARAM_PKE_MESSAGE_2_CARRY_2_129_80,PARAM_FHE_MESSAGE_2_CARRY_2_129_80,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_129_80),
(PARAM_PKE_MESSAGE_2_CARRY_2_129_128,PARAM_FHE_MESSAGE_2_CARRY_2_129_128,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_129_128),
(PARAM_PKE_MESSAGE_2_CARRY_2_130_40,PARAM_FHE_MESSAGE_2_CARRY_2_130_40,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_130_40),
(PARAM_PKE_MESSAGE_2_CARRY_2_130_64,PARAM_FHE_MESSAGE_2_CARRY_2_130_64,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_130_64),
(PARAM_PKE_MESSAGE_2_CARRY_2_130_80,PARAM_FHE_MESSAGE_2_CARRY_2_130_80,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_130_80),
(PARAM_PKE_MESSAGE_2_CARRY_2_130_128,PARAM_FHE_MESSAGE_2_CARRY_2_130_128,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_130_128),
(PARAM_PKE_MESSAGE_2_CARRY_2_131_40,PARAM_FHE_MESSAGE_2_CARRY_2_131_40,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_131_40),
(PARAM_PKE_MESSAGE_2_CARRY_2_131_64,PARAM_FHE_MESSAGE_2_CARRY_2_131_64,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_131_64),
(PARAM_PKE_MESSAGE_2_CARRY_2_131_80,PARAM_FHE_MESSAGE_2_CARRY_2_131_80,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_131_80),
(PARAM_PKE_MESSAGE_2_CARRY_2_131_128,PARAM_FHE_MESSAGE_2_CARRY_2_131_128,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_131_128),
(PARAM_PKE_MESSAGE_2_CARRY_2_132_40,PARAM_FHE_MESSAGE_2_CARRY_2_132_40,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_132_40),
(PARAM_PKE_MESSAGE_2_CARRY_2_132_64,PARAM_FHE_MESSAGE_2_CARRY_2_132_64,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_132_64),
(PARAM_PKE_MESSAGE_2_CARRY_2_132_80,PARAM_FHE_MESSAGE_2_CARRY_2_132_80,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_132_80),
(PARAM_PKE_MESSAGE_2_CARRY_2_132_128,PARAM_FHE_MESSAGE_2_CARRY_2_132_128,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_132_128),
(PARAM_PKE_MESSAGE_2_CARRY_2_133_40,PARAM_FHE_MESSAGE_2_CARRY_2_133_40,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_133_40),
(PARAM_PKE_MESSAGE_2_CARRY_2_133_64,PARAM_FHE_MESSAGE_2_CARRY_2_133_64,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_133_64),
(PARAM_PKE_MESSAGE_2_CARRY_2_133_80,PARAM_FHE_MESSAGE_2_CARRY_2_133_80,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_133_80),
(PARAM_PKE_MESSAGE_2_CARRY_2_133_128,PARAM_FHE_MESSAGE_2_CARRY_2_133_128,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_133_128),
(PARAM_PKE_MESSAGE_2_CARRY_2_134_40,PARAM_FHE_MESSAGE_2_CARRY_2_134_40,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_134_40),
(PARAM_PKE_MESSAGE_2_CARRY_2_134_64,PARAM_FHE_MESSAGE_2_CARRY_2_134_64,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_134_64),
(PARAM_PKE_MESSAGE_2_CARRY_2_134_80,PARAM_FHE_MESSAGE_2_CARRY_2_134_80,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_134_80),
(PARAM_PKE_MESSAGE_2_CARRY_2_134_128,PARAM_FHE_MESSAGE_2_CARRY_2_134_128,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_134_128),
(PARAM_PKE_MESSAGE_2_CARRY_2_135_40,PARAM_FHE_MESSAGE_2_CARRY_2_135_40,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_135_40),
(PARAM_PKE_MESSAGE_2_CARRY_2_135_64,PARAM_FHE_MESSAGE_2_CARRY_2_135_64,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_135_64),
(PARAM_PKE_MESSAGE_2_CARRY_2_135_80,PARAM_FHE_MESSAGE_2_CARRY_2_135_80,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_135_80),
(PARAM_PKE_MESSAGE_2_CARRY_2_135_128,PARAM_FHE_MESSAGE_2_CARRY_2_135_128,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_135_128),
(PARAM_PKE_MESSAGE_2_CARRY_2_136_40,PARAM_FHE_MESSAGE_2_CARRY_2_136_40,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_136_40),
(PARAM_PKE_MESSAGE_2_CARRY_2_136_64,PARAM_FHE_MESSAGE_2_CARRY_2_136_64,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_136_64),
(PARAM_PKE_MESSAGE_2_CARRY_2_136_80,PARAM_FHE_MESSAGE_2_CARRY_2_136_80,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_136_80),
(PARAM_PKE_MESSAGE_2_CARRY_2_136_128,PARAM_FHE_MESSAGE_2_CARRY_2_136_128,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_136_128),
(PARAM_PKE_MESSAGE_2_CARRY_2_137_40,PARAM_FHE_MESSAGE_2_CARRY_2_137_40,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_137_40),
(PARAM_PKE_MESSAGE_2_CARRY_2_137_64,PARAM_FHE_MESSAGE_2_CARRY_2_137_64,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_137_64),
(PARAM_PKE_MESSAGE_2_CARRY_2_137_80,PARAM_FHE_MESSAGE_2_CARRY_2_137_80,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_137_80),
(PARAM_PKE_MESSAGE_2_CARRY_2_137_128,PARAM_FHE_MESSAGE_2_CARRY_2_137_128,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_137_128),
(PARAM_PKE_MESSAGE_2_CARRY_2_138_40,PARAM_FHE_MESSAGE_2_CARRY_2_138_40,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_138_40),
(PARAM_PKE_MESSAGE_2_CARRY_2_138_64,PARAM_FHE_MESSAGE_2_CARRY_2_138_64,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_138_64),
(PARAM_PKE_MESSAGE_2_CARRY_2_138_80,PARAM_FHE_MESSAGE_2_CARRY_2_138_80,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_138_80),
(PARAM_PKE_MESSAGE_2_CARRY_2_138_128,PARAM_FHE_MESSAGE_2_CARRY_2_138_128,PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_138_128),
(PARAM_PKE_MESSAGE_3_CARRY_3_128_40,PARAM_FHE_MESSAGE_3_CARRY_3_128_40,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_128_40),
(PARAM_PKE_MESSAGE_3_CARRY_3_128_64,PARAM_FHE_MESSAGE_3_CARRY_3_128_64,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_128_64),
(PARAM_PKE_MESSAGE_3_CARRY_3_128_80,PARAM_FHE_MESSAGE_3_CARRY_3_128_80,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_128_80),
(PARAM_PKE_MESSAGE_3_CARRY_3_128_128,PARAM_FHE_MESSAGE_3_CARRY_3_128_128,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_128_128),
(PARAM_PKE_MESSAGE_3_CARRY_3_129_40,PARAM_FHE_MESSAGE_3_CARRY_3_129_40,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_129_40),
(PARAM_PKE_MESSAGE_3_CARRY_3_129_64,PARAM_FHE_MESSAGE_3_CARRY_3_129_64,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_129_64),
(PARAM_PKE_MESSAGE_3_CARRY_3_129_80,PARAM_FHE_MESSAGE_3_CARRY_3_129_80,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_129_80),
(PARAM_PKE_MESSAGE_3_CARRY_3_129_128,PARAM_FHE_MESSAGE_3_CARRY_3_129_128,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_129_128),
(PARAM_PKE_MESSAGE_3_CARRY_3_130_40,PARAM_FHE_MESSAGE_3_CARRY_3_130_40,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_130_40),
(PARAM_PKE_MESSAGE_3_CARRY_3_130_64,PARAM_FHE_MESSAGE_3_CARRY_3_130_64,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_130_64),
(PARAM_PKE_MESSAGE_3_CARRY_3_130_80,PARAM_FHE_MESSAGE_3_CARRY_3_130_80,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_130_80),
(PARAM_PKE_MESSAGE_3_CARRY_3_130_128,PARAM_FHE_MESSAGE_3_CARRY_3_130_128,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_130_128),
(PARAM_PKE_MESSAGE_3_CARRY_3_131_40,PARAM_FHE_MESSAGE_3_CARRY_3_131_40,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_131_40),
(PARAM_PKE_MESSAGE_3_CARRY_3_131_64,PARAM_FHE_MESSAGE_3_CARRY_3_131_64,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_131_64),
(PARAM_PKE_MESSAGE_3_CARRY_3_131_80,PARAM_FHE_MESSAGE_3_CARRY_3_131_80,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_131_80),
(PARAM_PKE_MESSAGE_3_CARRY_3_131_128,PARAM_FHE_MESSAGE_3_CARRY_3_131_128,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_131_128),
(PARAM_PKE_MESSAGE_3_CARRY_3_132_40,PARAM_FHE_MESSAGE_3_CARRY_3_132_40,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_132_40),
(PARAM_PKE_MESSAGE_3_CARRY_3_132_64,PARAM_FHE_MESSAGE_3_CARRY_3_132_64,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_132_64),
(PARAM_PKE_MESSAGE_3_CARRY_3_132_80,PARAM_FHE_MESSAGE_3_CARRY_3_132_80,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_132_80),
(PARAM_PKE_MESSAGE_3_CARRY_3_132_128,PARAM_FHE_MESSAGE_3_CARRY_3_132_128,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_132_128),
(PARAM_PKE_MESSAGE_3_CARRY_3_133_40,PARAM_FHE_MESSAGE_3_CARRY_3_133_40,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_133_40),
(PARAM_PKE_MESSAGE_3_CARRY_3_133_64,PARAM_FHE_MESSAGE_3_CARRY_3_133_64,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_133_64),
(PARAM_PKE_MESSAGE_3_CARRY_3_133_80,PARAM_FHE_MESSAGE_3_CARRY_3_133_80,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_133_80),
(PARAM_PKE_MESSAGE_3_CARRY_3_133_128,PARAM_FHE_MESSAGE_3_CARRY_3_133_128,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_133_128),
(PARAM_PKE_MESSAGE_3_CARRY_3_134_40,PARAM_FHE_MESSAGE_3_CARRY_3_134_40,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_134_40),
(PARAM_PKE_MESSAGE_3_CARRY_3_134_64,PARAM_FHE_MESSAGE_3_CARRY_3_134_64,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_134_64),
(PARAM_PKE_MESSAGE_3_CARRY_3_134_80,PARAM_FHE_MESSAGE_3_CARRY_3_134_80,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_134_80),
(PARAM_PKE_MESSAGE_3_CARRY_3_134_128,PARAM_FHE_MESSAGE_3_CARRY_3_134_128,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_134_128),
(PARAM_PKE_MESSAGE_3_CARRY_3_135_40,PARAM_FHE_MESSAGE_3_CARRY_3_135_40,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_135_40),
(PARAM_PKE_MESSAGE_3_CARRY_3_135_64,PARAM_FHE_MESSAGE_3_CARRY_3_135_64,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_135_64),
(PARAM_PKE_MESSAGE_3_CARRY_3_135_80,PARAM_FHE_MESSAGE_3_CARRY_3_135_80,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_135_80),
(PARAM_PKE_MESSAGE_3_CARRY_3_135_128,PARAM_FHE_MESSAGE_3_CARRY_3_135_128,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_135_128),
(PARAM_PKE_MESSAGE_3_CARRY_3_136_40,PARAM_FHE_MESSAGE_3_CARRY_3_136_40,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_136_40),
(PARAM_PKE_MESSAGE_3_CARRY_3_136_64,PARAM_FHE_MESSAGE_3_CARRY_3_136_64,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_136_64),
(PARAM_PKE_MESSAGE_3_CARRY_3_136_80,PARAM_FHE_MESSAGE_3_CARRY_3_136_80,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_136_80),
(PARAM_PKE_MESSAGE_3_CARRY_3_136_128,PARAM_FHE_MESSAGE_3_CARRY_3_136_128,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_136_128),
(PARAM_PKE_MESSAGE_3_CARRY_3_137_40,PARAM_FHE_MESSAGE_3_CARRY_3_137_40,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_137_40),
(PARAM_PKE_MESSAGE_3_CARRY_3_137_64,PARAM_FHE_MESSAGE_3_CARRY_3_137_64,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_137_64),
(PARAM_PKE_MESSAGE_3_CARRY_3_137_80,PARAM_FHE_MESSAGE_3_CARRY_3_137_80,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_137_80),
(PARAM_PKE_MESSAGE_3_CARRY_3_137_128,PARAM_FHE_MESSAGE_3_CARRY_3_137_128,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_137_128),
(PARAM_PKE_MESSAGE_3_CARRY_3_138_40,PARAM_FHE_MESSAGE_3_CARRY_3_138_40,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_138_40),
(PARAM_PKE_MESSAGE_3_CARRY_3_138_64,PARAM_FHE_MESSAGE_3_CARRY_3_138_64,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_138_64),
(PARAM_PKE_MESSAGE_3_CARRY_3_138_80,PARAM_FHE_MESSAGE_3_CARRY_3_138_80,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_138_80),
(PARAM_PKE_MESSAGE_3_CARRY_3_138_128,PARAM_FHE_MESSAGE_3_CARRY_3_138_128,PARAM_KEYSWITCH_MESSAGE_3_CARRY_3_138_128),
(PARAM_PKE_MESSAGE_4_CARRY_4_128_40,PARAM_FHE_MESSAGE_4_CARRY_4_128_40,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_128_40),
(PARAM_PKE_MESSAGE_4_CARRY_4_128_64,PARAM_FHE_MESSAGE_4_CARRY_4_128_64,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_128_64),
(PARAM_PKE_MESSAGE_4_CARRY_4_128_80,PARAM_FHE_MESSAGE_4_CARRY_4_128_80,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_128_80),
(PARAM_PKE_MESSAGE_4_CARRY_4_128_128,PARAM_FHE_MESSAGE_4_CARRY_4_128_128,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_128_128),
(PARAM_PKE_MESSAGE_4_CARRY_4_129_40,PARAM_FHE_MESSAGE_4_CARRY_4_129_40,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_129_40),
(PARAM_PKE_MESSAGE_4_CARRY_4_129_64,PARAM_FHE_MESSAGE_4_CARRY_4_129_64,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_129_64),
(PARAM_PKE_MESSAGE_4_CARRY_4_129_80,PARAM_FHE_MESSAGE_4_CARRY_4_129_80,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_129_80),
(PARAM_PKE_MESSAGE_4_CARRY_4_129_128,PARAM_FHE_MESSAGE_4_CARRY_4_129_128,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_129_128),
(PARAM_PKE_MESSAGE_4_CARRY_4_130_40,PARAM_FHE_MESSAGE_4_CARRY_4_130_40,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_130_40),
(PARAM_PKE_MESSAGE_4_CARRY_4_130_64,PARAM_FHE_MESSAGE_4_CARRY_4_130_64,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_130_64),
(PARAM_PKE_MESSAGE_4_CARRY_4_130_80,PARAM_FHE_MESSAGE_4_CARRY_4_130_80,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_130_80),
(PARAM_PKE_MESSAGE_4_CARRY_4_130_128,PARAM_FHE_MESSAGE_4_CARRY_4_130_128,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_130_128),
(PARAM_PKE_MESSAGE_4_CARRY_4_131_40,PARAM_FHE_MESSAGE_4_CARRY_4_131_40,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_131_40),
(PARAM_PKE_MESSAGE_4_CARRY_4_131_64,PARAM_FHE_MESSAGE_4_CARRY_4_131_64,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_131_64),
(PARAM_PKE_MESSAGE_4_CARRY_4_131_80,PARAM_FHE_MESSAGE_4_CARRY_4_131_80,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_131_80),
(PARAM_PKE_MESSAGE_4_CARRY_4_131_128,PARAM_FHE_MESSAGE_4_CARRY_4_131_128,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_131_128),
(PARAM_PKE_MESSAGE_4_CARRY_4_132_40,PARAM_FHE_MESSAGE_4_CARRY_4_132_40,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_132_40),
(PARAM_PKE_MESSAGE_4_CARRY_4_132_64,PARAM_FHE_MESSAGE_4_CARRY_4_132_64,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_132_64),
(PARAM_PKE_MESSAGE_4_CARRY_4_132_80,PARAM_FHE_MESSAGE_4_CARRY_4_132_80,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_132_80),
(PARAM_PKE_MESSAGE_4_CARRY_4_132_128,PARAM_FHE_MESSAGE_4_CARRY_4_132_128,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_132_128),
(PARAM_PKE_MESSAGE_4_CARRY_4_133_40,PARAM_FHE_MESSAGE_4_CARRY_4_133_40,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_133_40),
(PARAM_PKE_MESSAGE_4_CARRY_4_133_64,PARAM_FHE_MESSAGE_4_CARRY_4_133_64,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_133_64),
(PARAM_PKE_MESSAGE_4_CARRY_4_133_80,PARAM_FHE_MESSAGE_4_CARRY_4_133_80,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_133_80),
(PARAM_PKE_MESSAGE_4_CARRY_4_133_128,PARAM_FHE_MESSAGE_4_CARRY_4_133_128,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_133_128),
(PARAM_PKE_MESSAGE_4_CARRY_4_134_40,PARAM_FHE_MESSAGE_4_CARRY_4_134_40,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_134_40),
(PARAM_PKE_MESSAGE_4_CARRY_4_134_64,PARAM_FHE_MESSAGE_4_CARRY_4_134_64,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_134_64),
(PARAM_PKE_MESSAGE_4_CARRY_4_134_80,PARAM_FHE_MESSAGE_4_CARRY_4_134_80,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_134_80),
(PARAM_PKE_MESSAGE_4_CARRY_4_134_128,PARAM_FHE_MESSAGE_4_CARRY_4_134_128,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_134_128),
(PARAM_PKE_MESSAGE_4_CARRY_4_135_40,PARAM_FHE_MESSAGE_4_CARRY_4_135_40,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_135_40),
(PARAM_PKE_MESSAGE_4_CARRY_4_135_64,PARAM_FHE_MESSAGE_4_CARRY_4_135_64,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_135_64),
(PARAM_PKE_MESSAGE_4_CARRY_4_135_80,PARAM_FHE_MESSAGE_4_CARRY_4_135_80,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_135_80),
(PARAM_PKE_MESSAGE_4_CARRY_4_135_128,PARAM_FHE_MESSAGE_4_CARRY_4_135_128,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_135_128),
(PARAM_PKE_MESSAGE_4_CARRY_4_136_40,PARAM_FHE_MESSAGE_4_CARRY_4_136_40,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_136_40),
(PARAM_PKE_MESSAGE_4_CARRY_4_136_64,PARAM_FHE_MESSAGE_4_CARRY_4_136_64,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_136_64),
(PARAM_PKE_MESSAGE_4_CARRY_4_136_80,PARAM_FHE_MESSAGE_4_CARRY_4_136_80,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_136_80),
(PARAM_PKE_MESSAGE_4_CARRY_4_136_128,PARAM_FHE_MESSAGE_4_CARRY_4_136_128,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_136_128),
(PARAM_PKE_MESSAGE_4_CARRY_4_137_40,PARAM_FHE_MESSAGE_4_CARRY_4_137_40,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_137_40),
(PARAM_PKE_MESSAGE_4_CARRY_4_137_64,PARAM_FHE_MESSAGE_4_CARRY_4_137_64,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_137_64),
(PARAM_PKE_MESSAGE_4_CARRY_4_137_80,PARAM_FHE_MESSAGE_4_CARRY_4_137_80,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_137_80),
(PARAM_PKE_MESSAGE_4_CARRY_4_137_128,PARAM_FHE_MESSAGE_4_CARRY_4_137_128,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_137_128),
(PARAM_PKE_MESSAGE_4_CARRY_4_138_40,PARAM_FHE_MESSAGE_4_CARRY_4_138_40,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_138_40),
(PARAM_PKE_MESSAGE_4_CARRY_4_138_64,PARAM_FHE_MESSAGE_4_CARRY_4_138_64,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_138_64),
(PARAM_PKE_MESSAGE_4_CARRY_4_138_80,PARAM_FHE_MESSAGE_4_CARRY_4_138_80,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_138_80),
(PARAM_PKE_MESSAGE_4_CARRY_4_138_128,PARAM_FHE_MESSAGE_4_CARRY_4_138_128,PARAM_KEYSWITCH_MESSAGE_4_CARRY_4_138_128),
});

View File

@@ -1,6 +1,7 @@
use crate::core_crypto::commons::generators::DeterministicSeeder;
use crate::core_crypto::commons::math::random::Seed;
use crate::core_crypto::prelude::ActivatedRandomGenerator;
use crate::shortint::parameters::bc::*;
use crate::shortint::parameters::classic::compact_pk::*;
use crate::shortint::parameters::*;
use std::panic::set_hook;
@@ -358,6 +359,19 @@ expose_predefined_parameters! {
PARAM_SMALL_MESSAGE_2_CARRY_2,
PARAM_SMALL_MESSAGE_3_CARRY_3,
PARAM_SMALL_MESSAGE_4_CARRY_4,
// ZK_TESTS
PARAM_PKE_1_1_2048,
PARAM_PKE_2_2_2048,
PARAM_PKE_3_3_2048,
PARAM_PKE_4_4_2048,
PARAM_PKE_1_1_4096,
PARAM_PKE_2_2_4096,
PARAM_PKE_3_3_4096,
PARAM_PKE_4_4_4096,
PARAM_PKE_1_1_1024,
PARAM_PKE_2_2_1024,
PARAM_PKE_3_3_1024,
PARAM_PKE_4_4_1024,
}
#[wasm_bindgen]

View File

@@ -6,7 +6,7 @@ use crate::core_crypto::commons::parameters::{
};
use crate::core_crypto::entities::*;
use crate::shortint::ciphertext::MaxDegree;
use crate::shortint::parameters::ShortintKeySwitchingParameters;
use crate::shortint::parameters::{EncryptionKeyChoice, ShortintKeySwitchingParameters};
use crate::shortint::server_key::{ShortintBootstrappingKey, ShortintCompressedBootstrappingKey};
use crate::shortint::{ClientKey, CompressedServerKey, ServerKey};
@@ -159,13 +159,35 @@ impl ShortintEngine {
cks2: &ClientKey,
params: ShortintKeySwitchingParameters,
) -> LweKeyswitchKeyOwned<u64> {
let input_key = match cks1.parameters.encryption_key_choice() {
EncryptionKeyChoice::Big => cks1.large_lwe_secret_key(),
EncryptionKeyChoice::Small => cks1.small_lwe_secret_key(),
};
// // TODO: manage more cases ?
// let (output_key, encryption_noise) = match cks2.parameters.encryption_key_choice() {
// EncryptionKeyChoice::Big => (
// cks2.large_lwe_secret_key(),
// cks2.parameters.glwe_noise_distribution(),
// ),
// EncryptionKeyChoice::Small => (
// cks2.small_lwe_secret_key(),
// cks2.parameters.lwe_noise_distribution(),
// ),
// };
let (output_key, encryption_noise) = (
cks2.small_lwe_secret_key(),
cks2.parameters.lwe_noise_distribution(),
);
// Creation of the key switching key
allocate_and_generate_new_lwe_keyswitch_key(
&cks1.large_lwe_secret_key(),
&cks2.large_lwe_secret_key(),
&input_key,
&output_key,
params.ks_base_log,
params.ks_level,
cks2.parameters.lwe_noise_distribution(),
encryption_noise,
cks2.parameters.ciphertext_modulus(),
&mut self.encryption_generator,
)

View File

@@ -251,8 +251,13 @@ impl KeySwitchingKey {
/// assert_eq!(ck2.decrypt(&cipher_2), cleartext);
/// ```
pub fn cast(&self, ct: &Ciphertext) -> Ciphertext {
let mut ret = self.dest_server_key.create_trivial(0);
// let mut ret = self.dest_server_key.create_trivial(0);
let out_small_lwe_size = self.dest_server_key.key_switching_key.output_lwe_size();
let mut ret = self
.dest_server_key
.unchecked_create_trivial_with_lwe_size(0, out_small_lwe_size);
self.cast_into(ct, &mut ret);
ret.degree = ct.degree;
ret
}
}

View File

@@ -1,5 +1,6 @@
use crate::keycache::utils::named_params_impl;
use crate::keycache::*;
use crate::shortint::parameters::bc::*;
use crate::shortint::parameters::classic::compact_pk::*;
#[cfg(tarpaulin)]
use crate::shortint::parameters::coverage_parameters::*;
@@ -178,6 +179,359 @@ named_params_impl!( ShortintParameterSet =>
WOPBS_ONLY_2_BLOCKS_PARAM_MESSAGE_7_CARRY_0_KS_PBS,
WOPBS_ONLY_2_BLOCKS_PARAM_MESSAGE_7_CARRY_1_KS_PBS,
WOPBS_ONLY_2_BLOCKS_PARAM_MESSAGE_8_CARRY_0_KS_PBS,
// PKE BC
PARAM_PKE_MESSAGE_1_CARRY_1_128_40,
PARAM_FHE_MESSAGE_1_CARRY_1_128_40,
PARAM_PKE_MESSAGE_1_CARRY_1_128_64,
PARAM_FHE_MESSAGE_1_CARRY_1_128_64,
PARAM_PKE_MESSAGE_1_CARRY_1_128_80,
PARAM_FHE_MESSAGE_1_CARRY_1_128_80,
PARAM_PKE_MESSAGE_1_CARRY_1_128_128,
PARAM_FHE_MESSAGE_1_CARRY_1_128_128,
PARAM_PKE_MESSAGE_1_CARRY_1_129_40,
PARAM_FHE_MESSAGE_1_CARRY_1_129_40,
PARAM_PKE_MESSAGE_1_CARRY_1_129_64,
PARAM_FHE_MESSAGE_1_CARRY_1_129_64,
PARAM_PKE_MESSAGE_1_CARRY_1_129_80,
PARAM_FHE_MESSAGE_1_CARRY_1_129_80,
PARAM_PKE_MESSAGE_1_CARRY_1_129_128,
PARAM_FHE_MESSAGE_1_CARRY_1_129_128,
PARAM_PKE_MESSAGE_1_CARRY_1_130_40,
PARAM_FHE_MESSAGE_1_CARRY_1_130_40,
PARAM_PKE_MESSAGE_1_CARRY_1_130_64,
PARAM_FHE_MESSAGE_1_CARRY_1_130_64,
PARAM_PKE_MESSAGE_1_CARRY_1_130_80,
PARAM_FHE_MESSAGE_1_CARRY_1_130_80,
PARAM_PKE_MESSAGE_1_CARRY_1_130_128,
PARAM_FHE_MESSAGE_1_CARRY_1_130_128,
PARAM_PKE_MESSAGE_1_CARRY_1_131_40,
PARAM_FHE_MESSAGE_1_CARRY_1_131_40,
PARAM_PKE_MESSAGE_1_CARRY_1_131_64,
PARAM_FHE_MESSAGE_1_CARRY_1_131_64,
PARAM_PKE_MESSAGE_1_CARRY_1_131_80,
PARAM_FHE_MESSAGE_1_CARRY_1_131_80,
PARAM_PKE_MESSAGE_1_CARRY_1_131_128,
PARAM_FHE_MESSAGE_1_CARRY_1_131_128,
PARAM_PKE_MESSAGE_1_CARRY_1_132_40,
PARAM_FHE_MESSAGE_1_CARRY_1_132_40,
PARAM_PKE_MESSAGE_1_CARRY_1_132_64,
PARAM_FHE_MESSAGE_1_CARRY_1_132_64,
PARAM_PKE_MESSAGE_1_CARRY_1_132_80,
PARAM_FHE_MESSAGE_1_CARRY_1_132_80,
PARAM_PKE_MESSAGE_1_CARRY_1_132_128,
PARAM_FHE_MESSAGE_1_CARRY_1_132_128,
PARAM_PKE_MESSAGE_1_CARRY_1_133_40,
PARAM_FHE_MESSAGE_1_CARRY_1_133_40,
PARAM_PKE_MESSAGE_1_CARRY_1_133_64,
PARAM_FHE_MESSAGE_1_CARRY_1_133_64,
PARAM_PKE_MESSAGE_1_CARRY_1_133_80,
PARAM_FHE_MESSAGE_1_CARRY_1_133_80,
PARAM_PKE_MESSAGE_1_CARRY_1_133_128,
PARAM_FHE_MESSAGE_1_CARRY_1_133_128,
PARAM_PKE_MESSAGE_1_CARRY_1_134_40,
PARAM_FHE_MESSAGE_1_CARRY_1_134_40,
PARAM_PKE_MESSAGE_1_CARRY_1_134_64,
PARAM_FHE_MESSAGE_1_CARRY_1_134_64,
PARAM_PKE_MESSAGE_1_CARRY_1_134_80,
PARAM_FHE_MESSAGE_1_CARRY_1_134_80,
PARAM_PKE_MESSAGE_1_CARRY_1_134_128,
PARAM_FHE_MESSAGE_1_CARRY_1_134_128,
PARAM_PKE_MESSAGE_1_CARRY_1_135_40,
PARAM_FHE_MESSAGE_1_CARRY_1_135_40,
PARAM_PKE_MESSAGE_1_CARRY_1_135_64,
PARAM_FHE_MESSAGE_1_CARRY_1_135_64,
PARAM_PKE_MESSAGE_1_CARRY_1_135_80,
PARAM_FHE_MESSAGE_1_CARRY_1_135_80,
PARAM_PKE_MESSAGE_1_CARRY_1_135_128,
PARAM_FHE_MESSAGE_1_CARRY_1_135_128,
PARAM_PKE_MESSAGE_1_CARRY_1_136_40,
PARAM_FHE_MESSAGE_1_CARRY_1_136_40,
PARAM_PKE_MESSAGE_1_CARRY_1_136_64,
PARAM_FHE_MESSAGE_1_CARRY_1_136_64,
PARAM_PKE_MESSAGE_1_CARRY_1_136_80,
PARAM_FHE_MESSAGE_1_CARRY_1_136_80,
PARAM_PKE_MESSAGE_1_CARRY_1_136_128,
PARAM_FHE_MESSAGE_1_CARRY_1_136_128,
PARAM_PKE_MESSAGE_1_CARRY_1_137_40,
PARAM_FHE_MESSAGE_1_CARRY_1_137_40,
PARAM_PKE_MESSAGE_1_CARRY_1_137_64,
PARAM_FHE_MESSAGE_1_CARRY_1_137_64,
PARAM_PKE_MESSAGE_1_CARRY_1_137_80,
PARAM_FHE_MESSAGE_1_CARRY_1_137_80,
PARAM_PKE_MESSAGE_1_CARRY_1_137_128,
PARAM_FHE_MESSAGE_1_CARRY_1_137_128,
PARAM_PKE_MESSAGE_1_CARRY_1_138_40,
PARAM_FHE_MESSAGE_1_CARRY_1_138_40,
PARAM_PKE_MESSAGE_1_CARRY_1_138_64,
PARAM_FHE_MESSAGE_1_CARRY_1_138_64,
PARAM_PKE_MESSAGE_1_CARRY_1_138_80,
PARAM_FHE_MESSAGE_1_CARRY_1_138_80,
PARAM_PKE_MESSAGE_1_CARRY_1_138_128,
PARAM_FHE_MESSAGE_1_CARRY_1_138_128,
PARAM_PKE_MESSAGE_2_CARRY_2_128_40,
PARAM_FHE_MESSAGE_2_CARRY_2_128_40,
PARAM_PKE_MESSAGE_2_CARRY_2_128_64,
PARAM_FHE_MESSAGE_2_CARRY_2_128_64,
PARAM_PKE_MESSAGE_2_CARRY_2_128_80,
PARAM_FHE_MESSAGE_2_CARRY_2_128_80,
PARAM_PKE_MESSAGE_2_CARRY_2_128_128,
PARAM_FHE_MESSAGE_2_CARRY_2_128_128,
PARAM_PKE_MESSAGE_2_CARRY_2_129_40,
PARAM_FHE_MESSAGE_2_CARRY_2_129_40,
PARAM_PKE_MESSAGE_2_CARRY_2_129_64,
PARAM_FHE_MESSAGE_2_CARRY_2_129_64,
PARAM_PKE_MESSAGE_2_CARRY_2_129_80,
PARAM_FHE_MESSAGE_2_CARRY_2_129_80,
PARAM_PKE_MESSAGE_2_CARRY_2_129_128,
PARAM_FHE_MESSAGE_2_CARRY_2_129_128,
PARAM_PKE_MESSAGE_2_CARRY_2_130_40,
PARAM_FHE_MESSAGE_2_CARRY_2_130_40,
PARAM_PKE_MESSAGE_2_CARRY_2_130_64,
PARAM_FHE_MESSAGE_2_CARRY_2_130_64,
PARAM_PKE_MESSAGE_2_CARRY_2_130_80,
PARAM_FHE_MESSAGE_2_CARRY_2_130_80,
PARAM_PKE_MESSAGE_2_CARRY_2_130_128,
PARAM_FHE_MESSAGE_2_CARRY_2_130_128,
PARAM_PKE_MESSAGE_2_CARRY_2_131_40,
PARAM_FHE_MESSAGE_2_CARRY_2_131_40,
PARAM_PKE_MESSAGE_2_CARRY_2_131_64,
PARAM_FHE_MESSAGE_2_CARRY_2_131_64,
PARAM_PKE_MESSAGE_2_CARRY_2_131_80,
PARAM_FHE_MESSAGE_2_CARRY_2_131_80,
PARAM_PKE_MESSAGE_2_CARRY_2_131_128,
PARAM_FHE_MESSAGE_2_CARRY_2_131_128,
PARAM_PKE_MESSAGE_2_CARRY_2_132_40,
PARAM_FHE_MESSAGE_2_CARRY_2_132_40,
PARAM_PKE_MESSAGE_2_CARRY_2_132_64,
PARAM_FHE_MESSAGE_2_CARRY_2_132_64,
PARAM_PKE_MESSAGE_2_CARRY_2_132_80,
PARAM_FHE_MESSAGE_2_CARRY_2_132_80,
PARAM_PKE_MESSAGE_2_CARRY_2_132_128,
PARAM_FHE_MESSAGE_2_CARRY_2_132_128,
PARAM_PKE_MESSAGE_2_CARRY_2_133_40,
PARAM_FHE_MESSAGE_2_CARRY_2_133_40,
PARAM_PKE_MESSAGE_2_CARRY_2_133_64,
PARAM_FHE_MESSAGE_2_CARRY_2_133_64,
PARAM_PKE_MESSAGE_2_CARRY_2_133_80,
PARAM_FHE_MESSAGE_2_CARRY_2_133_80,
PARAM_PKE_MESSAGE_2_CARRY_2_133_128,
PARAM_FHE_MESSAGE_2_CARRY_2_133_128,
PARAM_PKE_MESSAGE_2_CARRY_2_134_40,
PARAM_FHE_MESSAGE_2_CARRY_2_134_40,
PARAM_PKE_MESSAGE_2_CARRY_2_134_64,
PARAM_FHE_MESSAGE_2_CARRY_2_134_64,
PARAM_PKE_MESSAGE_2_CARRY_2_134_80,
PARAM_FHE_MESSAGE_2_CARRY_2_134_80,
PARAM_PKE_MESSAGE_2_CARRY_2_134_128,
PARAM_FHE_MESSAGE_2_CARRY_2_134_128,
PARAM_PKE_MESSAGE_2_CARRY_2_135_40,
PARAM_FHE_MESSAGE_2_CARRY_2_135_40,
PARAM_PKE_MESSAGE_2_CARRY_2_135_64,
PARAM_FHE_MESSAGE_2_CARRY_2_135_64,
PARAM_PKE_MESSAGE_2_CARRY_2_135_80,
PARAM_FHE_MESSAGE_2_CARRY_2_135_80,
PARAM_PKE_MESSAGE_2_CARRY_2_135_128,
PARAM_FHE_MESSAGE_2_CARRY_2_135_128,
PARAM_PKE_MESSAGE_2_CARRY_2_136_40,
PARAM_FHE_MESSAGE_2_CARRY_2_136_40,
PARAM_PKE_MESSAGE_2_CARRY_2_136_64,
PARAM_FHE_MESSAGE_2_CARRY_2_136_64,
PARAM_PKE_MESSAGE_2_CARRY_2_136_80,
PARAM_FHE_MESSAGE_2_CARRY_2_136_80,
PARAM_PKE_MESSAGE_2_CARRY_2_136_128,
PARAM_FHE_MESSAGE_2_CARRY_2_136_128,
PARAM_PKE_MESSAGE_2_CARRY_2_137_40,
PARAM_FHE_MESSAGE_2_CARRY_2_137_40,
PARAM_PKE_MESSAGE_2_CARRY_2_137_64,
PARAM_FHE_MESSAGE_2_CARRY_2_137_64,
PARAM_PKE_MESSAGE_2_CARRY_2_137_80,
PARAM_FHE_MESSAGE_2_CARRY_2_137_80,
PARAM_PKE_MESSAGE_2_CARRY_2_137_128,
PARAM_FHE_MESSAGE_2_CARRY_2_137_128,
PARAM_PKE_MESSAGE_2_CARRY_2_138_40,
PARAM_FHE_MESSAGE_2_CARRY_2_138_40,
PARAM_PKE_MESSAGE_2_CARRY_2_138_64,
PARAM_FHE_MESSAGE_2_CARRY_2_138_64,
PARAM_PKE_MESSAGE_2_CARRY_2_138_80,
PARAM_FHE_MESSAGE_2_CARRY_2_138_80,
PARAM_PKE_MESSAGE_2_CARRY_2_138_128,
PARAM_FHE_MESSAGE_2_CARRY_2_138_128,
PARAM_PKE_MESSAGE_3_CARRY_3_128_40,
PARAM_FHE_MESSAGE_3_CARRY_3_128_40,
PARAM_PKE_MESSAGE_3_CARRY_3_128_64,
PARAM_FHE_MESSAGE_3_CARRY_3_128_64,
PARAM_PKE_MESSAGE_3_CARRY_3_128_80,
PARAM_FHE_MESSAGE_3_CARRY_3_128_80,
PARAM_PKE_MESSAGE_3_CARRY_3_128_128,
PARAM_FHE_MESSAGE_3_CARRY_3_128_128,
PARAM_PKE_MESSAGE_3_CARRY_3_129_40,
PARAM_FHE_MESSAGE_3_CARRY_3_129_40,
PARAM_PKE_MESSAGE_3_CARRY_3_129_64,
PARAM_FHE_MESSAGE_3_CARRY_3_129_64,
PARAM_PKE_MESSAGE_3_CARRY_3_129_80,
PARAM_FHE_MESSAGE_3_CARRY_3_129_80,
PARAM_PKE_MESSAGE_3_CARRY_3_129_128,
PARAM_FHE_MESSAGE_3_CARRY_3_129_128,
PARAM_PKE_MESSAGE_3_CARRY_3_130_40,
PARAM_FHE_MESSAGE_3_CARRY_3_130_40,
PARAM_PKE_MESSAGE_3_CARRY_3_130_64,
PARAM_FHE_MESSAGE_3_CARRY_3_130_64,
PARAM_PKE_MESSAGE_3_CARRY_3_130_80,
PARAM_FHE_MESSAGE_3_CARRY_3_130_80,
PARAM_PKE_MESSAGE_3_CARRY_3_130_128,
PARAM_FHE_MESSAGE_3_CARRY_3_130_128,
PARAM_PKE_MESSAGE_3_CARRY_3_131_40,
PARAM_FHE_MESSAGE_3_CARRY_3_131_40,
PARAM_PKE_MESSAGE_3_CARRY_3_131_64,
PARAM_FHE_MESSAGE_3_CARRY_3_131_64,
PARAM_PKE_MESSAGE_3_CARRY_3_131_80,
PARAM_FHE_MESSAGE_3_CARRY_3_131_80,
PARAM_PKE_MESSAGE_3_CARRY_3_131_128,
PARAM_FHE_MESSAGE_3_CARRY_3_131_128,
PARAM_PKE_MESSAGE_3_CARRY_3_132_40,
PARAM_FHE_MESSAGE_3_CARRY_3_132_40,
PARAM_PKE_MESSAGE_3_CARRY_3_132_64,
PARAM_FHE_MESSAGE_3_CARRY_3_132_64,
PARAM_PKE_MESSAGE_3_CARRY_3_132_80,
PARAM_FHE_MESSAGE_3_CARRY_3_132_80,
PARAM_PKE_MESSAGE_3_CARRY_3_132_128,
PARAM_FHE_MESSAGE_3_CARRY_3_132_128,
PARAM_PKE_MESSAGE_3_CARRY_3_133_40,
PARAM_FHE_MESSAGE_3_CARRY_3_133_40,
PARAM_PKE_MESSAGE_3_CARRY_3_133_64,
PARAM_FHE_MESSAGE_3_CARRY_3_133_64,
PARAM_PKE_MESSAGE_3_CARRY_3_133_80,
PARAM_FHE_MESSAGE_3_CARRY_3_133_80,
PARAM_PKE_MESSAGE_3_CARRY_3_133_128,
PARAM_FHE_MESSAGE_3_CARRY_3_133_128,
PARAM_PKE_MESSAGE_3_CARRY_3_134_40,
PARAM_FHE_MESSAGE_3_CARRY_3_134_40,
PARAM_PKE_MESSAGE_3_CARRY_3_134_64,
PARAM_FHE_MESSAGE_3_CARRY_3_134_64,
PARAM_PKE_MESSAGE_3_CARRY_3_134_80,
PARAM_FHE_MESSAGE_3_CARRY_3_134_80,
PARAM_PKE_MESSAGE_3_CARRY_3_134_128,
PARAM_FHE_MESSAGE_3_CARRY_3_134_128,
PARAM_PKE_MESSAGE_3_CARRY_3_135_40,
PARAM_FHE_MESSAGE_3_CARRY_3_135_40,
PARAM_PKE_MESSAGE_3_CARRY_3_135_64,
PARAM_FHE_MESSAGE_3_CARRY_3_135_64,
PARAM_PKE_MESSAGE_3_CARRY_3_135_80,
PARAM_FHE_MESSAGE_3_CARRY_3_135_80,
PARAM_PKE_MESSAGE_3_CARRY_3_135_128,
PARAM_FHE_MESSAGE_3_CARRY_3_135_128,
PARAM_PKE_MESSAGE_3_CARRY_3_136_40,
PARAM_FHE_MESSAGE_3_CARRY_3_136_40,
PARAM_PKE_MESSAGE_3_CARRY_3_136_64,
PARAM_FHE_MESSAGE_3_CARRY_3_136_64,
PARAM_PKE_MESSAGE_3_CARRY_3_136_80,
PARAM_FHE_MESSAGE_3_CARRY_3_136_80,
PARAM_PKE_MESSAGE_3_CARRY_3_136_128,
PARAM_FHE_MESSAGE_3_CARRY_3_136_128,
PARAM_PKE_MESSAGE_3_CARRY_3_137_40,
PARAM_FHE_MESSAGE_3_CARRY_3_137_40,
PARAM_PKE_MESSAGE_3_CARRY_3_137_64,
PARAM_FHE_MESSAGE_3_CARRY_3_137_64,
PARAM_PKE_MESSAGE_3_CARRY_3_137_80,
PARAM_FHE_MESSAGE_3_CARRY_3_137_80,
PARAM_PKE_MESSAGE_3_CARRY_3_137_128,
PARAM_FHE_MESSAGE_3_CARRY_3_137_128,
PARAM_PKE_MESSAGE_3_CARRY_3_138_40,
PARAM_FHE_MESSAGE_3_CARRY_3_138_40,
PARAM_PKE_MESSAGE_3_CARRY_3_138_64,
PARAM_FHE_MESSAGE_3_CARRY_3_138_64,
PARAM_PKE_MESSAGE_3_CARRY_3_138_80,
PARAM_FHE_MESSAGE_3_CARRY_3_138_80,
PARAM_PKE_MESSAGE_3_CARRY_3_138_128,
PARAM_FHE_MESSAGE_3_CARRY_3_138_128,
PARAM_PKE_MESSAGE_4_CARRY_4_128_40,
PARAM_FHE_MESSAGE_4_CARRY_4_128_40,
PARAM_PKE_MESSAGE_4_CARRY_4_128_64,
PARAM_FHE_MESSAGE_4_CARRY_4_128_64,
PARAM_PKE_MESSAGE_4_CARRY_4_128_80,
PARAM_FHE_MESSAGE_4_CARRY_4_128_80,
PARAM_PKE_MESSAGE_4_CARRY_4_128_128,
PARAM_FHE_MESSAGE_4_CARRY_4_128_128,
PARAM_PKE_MESSAGE_4_CARRY_4_129_40,
PARAM_FHE_MESSAGE_4_CARRY_4_129_40,
PARAM_PKE_MESSAGE_4_CARRY_4_129_64,
PARAM_FHE_MESSAGE_4_CARRY_4_129_64,
PARAM_PKE_MESSAGE_4_CARRY_4_129_80,
PARAM_FHE_MESSAGE_4_CARRY_4_129_80,
PARAM_PKE_MESSAGE_4_CARRY_4_129_128,
PARAM_FHE_MESSAGE_4_CARRY_4_129_128,
PARAM_PKE_MESSAGE_4_CARRY_4_130_40,
PARAM_FHE_MESSAGE_4_CARRY_4_130_40,
PARAM_PKE_MESSAGE_4_CARRY_4_130_64,
PARAM_FHE_MESSAGE_4_CARRY_4_130_64,
PARAM_PKE_MESSAGE_4_CARRY_4_130_80,
PARAM_FHE_MESSAGE_4_CARRY_4_130_80,
PARAM_PKE_MESSAGE_4_CARRY_4_130_128,
PARAM_FHE_MESSAGE_4_CARRY_4_130_128,
PARAM_PKE_MESSAGE_4_CARRY_4_131_40,
PARAM_FHE_MESSAGE_4_CARRY_4_131_40,
PARAM_PKE_MESSAGE_4_CARRY_4_131_64,
PARAM_FHE_MESSAGE_4_CARRY_4_131_64,
PARAM_PKE_MESSAGE_4_CARRY_4_131_80,
PARAM_FHE_MESSAGE_4_CARRY_4_131_80,
PARAM_PKE_MESSAGE_4_CARRY_4_131_128,
PARAM_FHE_MESSAGE_4_CARRY_4_131_128,
PARAM_PKE_MESSAGE_4_CARRY_4_132_40,
PARAM_FHE_MESSAGE_4_CARRY_4_132_40,
PARAM_PKE_MESSAGE_4_CARRY_4_132_64,
PARAM_FHE_MESSAGE_4_CARRY_4_132_64,
PARAM_PKE_MESSAGE_4_CARRY_4_132_80,
PARAM_FHE_MESSAGE_4_CARRY_4_132_80,
PARAM_PKE_MESSAGE_4_CARRY_4_132_128,
PARAM_FHE_MESSAGE_4_CARRY_4_132_128,
PARAM_PKE_MESSAGE_4_CARRY_4_133_40,
PARAM_FHE_MESSAGE_4_CARRY_4_133_40,
PARAM_PKE_MESSAGE_4_CARRY_4_133_64,
PARAM_FHE_MESSAGE_4_CARRY_4_133_64,
PARAM_PKE_MESSAGE_4_CARRY_4_133_80,
PARAM_FHE_MESSAGE_4_CARRY_4_133_80,
PARAM_PKE_MESSAGE_4_CARRY_4_133_128,
PARAM_FHE_MESSAGE_4_CARRY_4_133_128,
PARAM_PKE_MESSAGE_4_CARRY_4_134_40,
PARAM_FHE_MESSAGE_4_CARRY_4_134_40,
PARAM_PKE_MESSAGE_4_CARRY_4_134_64,
PARAM_FHE_MESSAGE_4_CARRY_4_134_64,
PARAM_PKE_MESSAGE_4_CARRY_4_134_80,
PARAM_FHE_MESSAGE_4_CARRY_4_134_80,
PARAM_PKE_MESSAGE_4_CARRY_4_134_128,
PARAM_FHE_MESSAGE_4_CARRY_4_134_128,
PARAM_PKE_MESSAGE_4_CARRY_4_135_40,
PARAM_FHE_MESSAGE_4_CARRY_4_135_40,
PARAM_PKE_MESSAGE_4_CARRY_4_135_64,
PARAM_FHE_MESSAGE_4_CARRY_4_135_64,
PARAM_PKE_MESSAGE_4_CARRY_4_135_80,
PARAM_FHE_MESSAGE_4_CARRY_4_135_80,
PARAM_PKE_MESSAGE_4_CARRY_4_135_128,
PARAM_FHE_MESSAGE_4_CARRY_4_135_128,
PARAM_PKE_MESSAGE_4_CARRY_4_136_40,
PARAM_FHE_MESSAGE_4_CARRY_4_136_40,
PARAM_PKE_MESSAGE_4_CARRY_4_136_64,
PARAM_FHE_MESSAGE_4_CARRY_4_136_64,
PARAM_PKE_MESSAGE_4_CARRY_4_136_80,
PARAM_FHE_MESSAGE_4_CARRY_4_136_80,
PARAM_PKE_MESSAGE_4_CARRY_4_136_128,
PARAM_FHE_MESSAGE_4_CARRY_4_136_128,
PARAM_PKE_MESSAGE_4_CARRY_4_137_40,
PARAM_FHE_MESSAGE_4_CARRY_4_137_40,
PARAM_PKE_MESSAGE_4_CARRY_4_137_64,
PARAM_FHE_MESSAGE_4_CARRY_4_137_64,
PARAM_PKE_MESSAGE_4_CARRY_4_137_80,
PARAM_FHE_MESSAGE_4_CARRY_4_137_80,
PARAM_PKE_MESSAGE_4_CARRY_4_137_128,
PARAM_FHE_MESSAGE_4_CARRY_4_137_128,
PARAM_PKE_MESSAGE_4_CARRY_4_138_40,
PARAM_FHE_MESSAGE_4_CARRY_4_138_40,
PARAM_PKE_MESSAGE_4_CARRY_4_138_64,
PARAM_FHE_MESSAGE_4_CARRY_4_138_64,
PARAM_PKE_MESSAGE_4_CARRY_4_138_80,
PARAM_FHE_MESSAGE_4_CARRY_4_138_80,
PARAM_PKE_MESSAGE_4_CARRY_4_138_128,
PARAM_FHE_MESSAGE_4_CARRY_4_138_128,
// Coverage
#[cfg(tarpaulin)]
COVERAGE_PARAM_MESSAGE_2_CARRY_2_KS_PBS,

File diff suppressed because it is too large Load Diff

View File

@@ -14,6 +14,7 @@ pub use crate::core_crypto::commons::parameters::{
use crate::core_crypto::prelude::{LweCiphertextListParameters, LweCiphertextParameters};
use serde::{Deserialize, Serialize};
pub mod bc;
pub mod classic;
#[cfg(tarpaulin)]
pub mod coverage_parameters;

View File

@@ -28,7 +28,7 @@ pub(crate) mod tests;
use crate::core_crypto::algorithms::*;
use crate::core_crypto::commons::parameters::{
DecompositionBaseLog, DecompositionLevelCount, GlweSize, LweDimension, MonomialDegree,
DecompositionBaseLog, DecompositionLevelCount, GlweSize, LweDimension, LweSize, MonomialDegree,
PolynomialSize, ThreadCount,
};
use crate::core_crypto::commons::traits::*;
@@ -1078,16 +1078,11 @@ impl ServerKey {
self.unchecked_create_trivial(modular_value as u64)
}
pub fn unchecked_create_trivial(&self, value: u64) -> Ciphertext {
let lwe_size = match self.pbs_order {
PBSOrder::KeyswitchBootstrap => {
self.bootstrapping_key.output_lwe_dimension().to_lwe_size()
}
PBSOrder::BootstrapKeyswitch => {
self.bootstrapping_key.input_lwe_dimension().to_lwe_size()
}
};
pub fn unchecked_create_trivial_with_lwe_size(
&self,
value: u64,
lwe_size: LweSize,
) -> Ciphertext {
let delta = (1_u64 << 63) / (self.message_modulus.0 * self.carry_modulus.0) as u64;
let shifted_value = value * delta;
@@ -1112,6 +1107,19 @@ impl ServerKey {
)
}
pub fn unchecked_create_trivial(&self, value: u64) -> Ciphertext {
let lwe_size = match self.pbs_order {
PBSOrder::KeyswitchBootstrap => {
self.bootstrapping_key.output_lwe_dimension().to_lwe_size()
}
PBSOrder::BootstrapKeyswitch => {
self.bootstrapping_key.input_lwe_dimension().to_lwe_size()
}
};
self.unchecked_create_trivial_with_lwe_size(value, lwe_size)
}
pub fn create_trivial_assign(&self, ct: &mut Ciphertext, value: u64) {
let modular_value = value as usize % self.message_modulus.0;
@@ -1462,7 +1470,7 @@ pub(crate) fn apply_blind_rotate<Scalar, InputCont, OutputCont>(
};
}
pub(crate) fn apply_programmable_bootstrap<InputCont, OutputCont>(
pub fn apply_programmable_bootstrap<InputCont, OutputCont>(
bootstrapping_key: &ShortintBootstrappingKey,
in_buffer: &LweCiphertext<InputCont>,
out_buffer: &mut LweCiphertext<OutputCont>,

View File

@@ -23,21 +23,21 @@ async function setup() {
const demos = await Comlink.wrap(worker).demos;
const demoNames = [
"publicKeyTest",
"compressedPublicKeyTest",
"compactPublicKeyTest32BitBig",
"compactPublicKeyTest32BitSmall",
"compactPublicKeyTest256BitBig",
"compactPublicKeyTest256BitSmall",
"compressedCompactPublicKeyTest256BitBig",
"compressedCompactPublicKeyTest256BitSmall",
"compactPublicKeyZeroKnowledge",
"compactPublicKeyBench32BitBig",
"compactPublicKeyBench32BitSmall",
"compactPublicKeyBench256BitBig",
"compactPublicKeyBench256BitSmall",
"compressedServerKeyBenchMessage1Carry1",
"compressedServerKeyBenchMessage2Carry2",
// "publicKeyTest",
// "compressedPublicKeyTest",
// "compactPublicKeyTest32BitBig",
// "compactPublicKeyTest32BitSmall",
// "compactPublicKeyTest256BitBig",
// "compactPublicKeyTest256BitSmall",
// "compressedCompactPublicKeyTest256BitBig",
// "compressedCompactPublicKeyTest256BitSmall",
// "compactPublicKeyZeroKnowledge",
// "compactPublicKeyBench32BitBig",
// "compactPublicKeyBench32BitSmall",
// "compactPublicKeyBench256BitBig",
// "compactPublicKeyBench256BitSmall",
// "compressedServerKeyBenchMessage1Carry1",
// "compressedServerKeyBenchMessage2Carry2",
"compactPublicKeyZeroKnowledgeBench",
];

View File

@@ -1,4 +1,4 @@
const secs = 1200; // 20 Minutes
const secs = 1_000_000; // 20 Minutes
const config = {
verbose: true,

View File

@@ -9,7 +9,7 @@
"build": "cp -r ../../tfhe/pkg ./ && webpack build ./index.js --mode production -o dist --output-filename index.js && cp index.html dist/ && cp favicon.ico dist/",
"server": "serve --config ../serve.json dist/",
"test-separate-processes": "jest --listTests | xargs -L 1 jest --runInBand --testNamePattern=Test",
"bench-separate-processes": "jest --listTests | xargs -L 1 jest --runInBand --testNamePattern=Bench",
"bench-separate-processes": "jest --listTests | xargs -L 1 jest --runInBand --testNamePattern=ZeroKnowledgeBench",
"test2": "mocha",
"format": "prettier . --write",
"check-format": "prettier . --check"

View File

@@ -50,7 +50,7 @@ async function runActualTest(page, buttonId) {
}
}
const TWENTY_MINUTES = 1200 * 1000;
const TWENTY_MINUTES = 1_000_000 * 1000;
async function runTestAttachedToButton(buttonId) {
let browser;
@@ -63,6 +63,7 @@ async function runTestAttachedToButton(buttonId) {
} else {
browser = await puppeteer.launch({
headless: "new",
args: ["--no-sandbox"],
protocolTimeout: TWENTY_MINUTES,
});
}

View File

@@ -1,33 +1,33 @@
import { runTestAttachedToButton } from "./common.mjs";
it("Compact Public Key Test Big 32 Bit", async () => {
await runTestAttachedToButton("compactPublicKeyTest32BitBig");
});
// it("Compact Public Key Test Big 32 Bit", async () => {
// await runTestAttachedToButton("compactPublicKeyTest32BitBig");
// });
it("Compact Public Key Test Small 32 Bit", async () => {
await runTestAttachedToButton("compactPublicKeyTest32BitSmall");
});
// it("Compact Public Key Test Small 32 Bit", async () => {
// await runTestAttachedToButton("compactPublicKeyTest32BitSmall");
// });
it("Compact Public Key Test Small 256 Bit", async () => {
await runTestAttachedToButton("compactPublicKeyTest256BitSmall");
});
// it("Compact Public Key Test Small 256 Bit", async () => {
// await runTestAttachedToButton("compactPublicKeyTest256BitSmall");
// });
it("Compact Public Key Test Big 256 Bit", async () => {
await runTestAttachedToButton("compactPublicKeyTest256BitBig");
});
// it("Compact Public Key Test Big 256 Bit", async () => {
// await runTestAttachedToButton("compactPublicKeyTest256BitBig");
// });
it("Compressed Compact Public Key Test Small 256 Bit", async () => {
await runTestAttachedToButton("compressedCompactPublicKeyTest256BitSmall");
});
// it("Compressed Compact Public Key Test Small 256 Bit", async () => {
// await runTestAttachedToButton("compressedCompactPublicKeyTest256BitSmall");
// });
it("Compressed Compact Public Key Test Big 256 Bit", async () => {
await runTestAttachedToButton("compressedCompactPublicKeyTest256BitBig");
});
// it("Compressed Compact Public Key Test Big 256 Bit", async () => {
// await runTestAttachedToButton("compressedCompactPublicKeyTest256BitBig");
// });
it(
"Compact Public Key Test Big 64 Bit With Zero Knowledge",
"Compact Public Key Bench Big 64 Bit With ZeroKnowledgeBench",
async () => {
await runTestAttachedToButton("compactPublicKeyZeroKnowledge");
await runTestAttachedToButton("compactPublicKeyZeroKnowledgeBench");
},
1200 * 1000,
1_000_000 * 1000,
); // 20 minutes timeout

View File

@@ -648,53 +648,95 @@ async function compressedServerKeyBenchMessage2Carry2() {
}
async function compactPublicKeyZeroKnowledgeBench() {
let block_params = new ShortintParameters(
ShortintParametersName.PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_TUNIFORM_2M40,
);
let params_to_bench = [
ShortintParametersName.PARAM_PKE_1_1_2048,
ShortintParametersName.PARAM_PKE_2_2_2048,
// ShortintParametersName.PARAM_PKE_3_3_2048,
// ShortintParametersName.PARAM_PKE_4_4_2048,
ShortintParametersName.PARAM_PKE_1_1_4096,
ShortintParametersName.PARAM_PKE_2_2_4096,
// ShortintParametersName.PARAM_PKE_3_3_4096,
// ShortintParametersName.PARAM_PKE_4_4_4096,
ShortintParametersName.PARAM_PKE_1_1_1024,
ShortintParametersName.PARAM_PKE_2_2_1024,
// ShortintParametersName.PARAM_PKE_3_3_1024,
// ShortintParametersName.PARAM_PKE_4_4_1024,
];
let config = TfheConfigBuilder.default()
.use_custom_parameters(block_params)
.build();
// let block_params = new ShortintParameters(
// ShortintParametersName.PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_TUNIFORM_2M40,
// );
let clientKey = TfheClientKey.generate(config);
let publicKey = TfheCompactPublicKey.new(clientKey);
console.log("Start CRS generation");
console.time("CRS generation");
let crs = CompactPkeCrs.from_config(config, 4 * 64);
console.timeEnd("CRS generation");
let public_params = crs.public_params();
const bench_loops = 4; // The computation is expensive
let bench_results = {};
let load_choices = [ZkComputeLoad.Proof, ZkComputeLoad.Verify];
const load_to_str = {
[ZkComputeLoad.Proof]: "compute_load_proof",
[ZkComputeLoad.Verify]: "compute_load_verify",
};
for (const loadChoice of load_choices) {
let timing = 0;
for (let i = 0; i < bench_loops; i++) {
let input = generateRandomBigInt(64);
const start = performance.now();
let _ = ProvenCompactFheUint64.encrypt_with_compact_public_key(
input,
public_params,
publicKey,
loadChoice,
);
const end = performance.now();
timing += end - start;
for (const block_params_name of params_to_bench) {
let block_params = new ShortintParameters(block_params_name);
let config = TfheConfigBuilder.default()
.use_custom_parameters(block_params)
.build();
let clientKey = TfheClientKey.generate(config);
let publicKey = TfheCompactPublicKey.new(clientKey);
const bench_loops = 5; // The computation is expensive
let load_choices = [ZkComputeLoad.Proof, ZkComputeLoad.Verify];
const load_to_str = {
[ZkComputeLoad.Proof]: "costly_proof",
[ZkComputeLoad.Verify]: "cheap_proof",
};
const param_to_name = {
[ShortintParametersName.PARAM_PKE_1_1_2048]: "PARAM_PKE_1_1_2048",
[ShortintParametersName.PARAM_PKE_2_2_2048]: "PARAM_PKE_2_2_2048",
[ShortintParametersName.PARAM_PKE_3_3_2048]: "PARAM_PKE_3_3_2048",
[ShortintParametersName.PARAM_PKE_4_4_2048]: "PARAM_PKE_4_4_2048",
[ShortintParametersName.PARAM_PKE_1_1_4096]: "PARAM_PKE_1_1_4096",
[ShortintParametersName.PARAM_PKE_2_2_4096]: "PARAM_PKE_2_2_4096",
[ShortintParametersName.PARAM_PKE_3_3_4096]: "PARAM_PKE_3_3_4096",
[ShortintParametersName.PARAM_PKE_4_4_4096]: "PARAM_PKE_4_4_4096",
[ShortintParametersName.PARAM_PKE_1_1_1024]: "PARAM_PKE_1_1_1024",
[ShortintParametersName.PARAM_PKE_2_2_1024]: "PARAM_PKE_2_2_1024",
[ShortintParametersName.PARAM_PKE_3_3_1024]: "PARAM_PKE_3_3_1024",
[ShortintParametersName.PARAM_PKE_4_4_1024]: "PARAM_PKE_4_4_1024",
};
let encrypt_counts = [5, 10];
for (const encrypt_count of encrypt_counts) {
console.log("Start CRS generation");
console.time("CRS generation");
let crs = CompactPkeCrs.from_config(config, encrypt_count * 64);
console.timeEnd("CRS generation");
let public_params = crs.public_params();
let inputs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((e) => BigInt(e));
let input = inputs.slice(0, encrypt_count);
for (const loadChoice of load_choices) {
let timing = 0;
for (let i = 0; i < bench_loops; i++) {
console.time("Loop " + i);
const start = performance.now();
let _ = ProvenCompactFheUint64List.encrypt_with_compact_public_key(
input,
public_params,
publicKey,
loadChoice,
);
const end = performance.now();
console.timeEnd("Loop " + i);
timing += end - start;
}
const mean = timing / bench_loops;
// pke_zk__PARAM_PKE_1_1_1024_10_cheap_proof
const bench_str =
"pke_zk__" +
param_to_name[block_params_name] +
"_" + encrypt_count + "_" + load_to_str[loadChoice];
console.log(bench_str, ": ", mean, " ms");
bench_results[bench_str] = mean;
}
}
const mean = timing / bench_loops;
const bench_str =
"compact_fhe_uint64_proven_encryption_" +
load_to_str[loadChoice] +
"_mean";
console.log(bench_str, ": ", mean, " ms");
bench_results["compact_fhe_uint64_proven_encryption_"] = mean;
}
return bench_results;