mirror of
https://github.com/zama-ai/tfhe-rs.git
synced 2026-01-08 22:28:01 -05:00
chore: bump to 1.1 and add V1_1 parameters
- add aliases for tests to avoid having to upgrade too many locations
This commit is contained in:
@@ -4,9 +4,9 @@ use std::io::{stdin, Read};
|
||||
use std::mem::MaybeUninit;
|
||||
use std::{array, iter};
|
||||
use tfhe::prelude::*;
|
||||
use tfhe::shortint::parameters::v1_0::{
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_2_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
use tfhe::shortint::parameters::v1_1::{
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_2_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
};
|
||||
use tfhe::{set_server_key, ClientKey, CompressedServerKey, ConfigBuilder, Device, FheUint32};
|
||||
|
||||
@@ -190,10 +190,10 @@ fn main() -> Result<(), std::io::Error> {
|
||||
let config = match args.multibit {
|
||||
None => ConfigBuilder::default(),
|
||||
Some(2) => ConfigBuilder::with_custom_parameters(
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_2_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_2_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
),
|
||||
Some(3) => ConfigBuilder::with_custom_parameters(
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
),
|
||||
Some(v) => {
|
||||
panic!("Invalid multibit setting {v}");
|
||||
|
||||
@@ -32,9 +32,9 @@ const KSK_PARAMS: [(
|
||||
ClassicPBSParameters,
|
||||
ShortintKeySwitchingParameters,
|
||||
); 1] = [(
|
||||
V1_0_PARAM_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_KEYSWITCH_1_1_KS_PBS_TO_2_2_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_KEYSWITCH_1_1_KS_PBS_TO_2_2_KS_PBS_GAUSSIAN_2M128,
|
||||
)];
|
||||
|
||||
fn client_server_keys() {
|
||||
@@ -64,12 +64,12 @@ fn client_server_keys() {
|
||||
let coverage_only: bool = matches.get_flag("coverage_only");
|
||||
if multi_bit_only {
|
||||
const MULTI_BIT_PARAMS: [MultiBitPBSParameters; 6] = [
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_2_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_2_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_2_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_3_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_3_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_2_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_2_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_2_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_3_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_3_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64,
|
||||
];
|
||||
|
||||
generate_pbs_multi_bit_keys(&MULTI_BIT_PARAMS);
|
||||
@@ -97,7 +97,7 @@ fn client_server_keys() {
|
||||
#[cfg(feature = "experimental")]
|
||||
{
|
||||
const WOPBS_PARAMS: [(ClassicPBSParameters, WopbsParameters); 1] = [(
|
||||
V1_0_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128,
|
||||
LEGACY_WOPBS_PARAM_MESSAGE_2_CARRY_2_KS_PBS,
|
||||
)];
|
||||
generate_wopbs_keys(&WOPBS_PARAMS);
|
||||
@@ -111,21 +111,21 @@ fn client_server_keys() {
|
||||
// TUniform
|
||||
PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
// Gaussian
|
||||
V1_0_PARAM_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_1_CARRY_2_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_1_CARRY_3_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_1_CARRY_4_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_1_CARRY_5_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_1_CARRY_6_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_2_CARRY_1_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_2_CARRY_3_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_3_CARRY_1_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_3_CARRY_2_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_4_CARRY_4_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_1_CARRY_2_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_1_CARRY_3_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_1_CARRY_4_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_1_CARRY_5_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_1_CARRY_6_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_2_CARRY_1_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_2_CARRY_3_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_3_CARRY_1_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_3_CARRY_2_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_1_PARAM_MESSAGE_4_CARRY_4_KS_PBS_GAUSSIAN_2M128,
|
||||
// 2M64 as backup as 2M128 is too slow
|
||||
V1_0_PARAM_MESSAGE_4_CARRY_4_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MESSAGE_4_CARRY_4_KS_PBS_GAUSSIAN_2M64,
|
||||
];
|
||||
generate_pbs_keys(&PBS_KEYS);
|
||||
|
||||
@@ -133,19 +133,19 @@ fn client_server_keys() {
|
||||
{
|
||||
const WOPBS_PARAMS: [(ClassicPBSParameters, WopbsParameters); 4] = [
|
||||
(
|
||||
V1_0_PARAM_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64,
|
||||
LEGACY_WOPBS_PARAM_MESSAGE_1_CARRY_1_KS_PBS,
|
||||
),
|
||||
(
|
||||
V1_0_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64,
|
||||
LEGACY_WOPBS_PARAM_MESSAGE_2_CARRY_2_KS_PBS,
|
||||
),
|
||||
(
|
||||
V1_0_PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64,
|
||||
LEGACY_WOPBS_PARAM_MESSAGE_3_CARRY_3_KS_PBS,
|
||||
),
|
||||
(
|
||||
V1_0_PARAM_MESSAGE_4_CARRY_4_KS_PBS_GAUSSIAN_2M64,
|
||||
V1_1_PARAM_MESSAGE_4_CARRY_4_KS_PBS_GAUSSIAN_2M64,
|
||||
LEGACY_WOPBS_PARAM_MESSAGE_4_CARRY_4_KS_PBS,
|
||||
),
|
||||
];
|
||||
|
||||
@@ -9,9 +9,10 @@ use std::path::Path;
|
||||
use tfhe::integer::U256;
|
||||
use tfhe::keycache::NamedParam;
|
||||
use tfhe::prelude::*;
|
||||
use tfhe::shortint::parameters::current_params::{
|
||||
V1_0_PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_GAUSSIAN_2M128,
|
||||
V1_0_PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_PBS_KS_GAUSSIAN_2M128,
|
||||
use tfhe::shortint::parameters::{
|
||||
PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
PARAM_PKE_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
};
|
||||
use tfhe::shortint::PBSParameters;
|
||||
use tfhe::{
|
||||
@@ -40,67 +41,13 @@ pub fn cpk_and_cctl_sizes(results_file: &Path) {
|
||||
let operator = OperatorType::Atomic;
|
||||
|
||||
{
|
||||
let params = V1_0_PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_GAUSSIAN_2M128;
|
||||
let config = ConfigBuilder::default()
|
||||
.use_custom_parameters(params)
|
||||
.build();
|
||||
let (client_key, _) = generate_keys(config);
|
||||
let test_name = format!("hlapi_sizes_{}_cpk", params.name());
|
||||
|
||||
let params: PBSParameters = params.into();
|
||||
|
||||
println!("Sizes for: {} and 32 bits", params.name());
|
||||
|
||||
let public_key = CompactPublicKey::new(&client_key);
|
||||
|
||||
let cpk_size = bincode::serialize(&public_key).unwrap().len();
|
||||
|
||||
println!("PK size: {cpk_size} bytes");
|
||||
write_result(&mut file, &test_name, cpk_size);
|
||||
write_to_json::<u64, _>(
|
||||
&test_name,
|
||||
params,
|
||||
params.name(),
|
||||
"CPK",
|
||||
&operator,
|
||||
0,
|
||||
vec![],
|
||||
);
|
||||
|
||||
let test_name = format!("hlapi_sizes_{}_cctl_{NB_CTXT}_len_32_bits", params.name());
|
||||
|
||||
let vec_inputs: Vec<_> = (0..NB_CTXT).map(|_| rng.gen::<u32>()).collect();
|
||||
|
||||
let encrypted_inputs = CompactCiphertextList::builder(&public_key)
|
||||
.extend(vec_inputs.iter().copied())
|
||||
.build();
|
||||
let cctl_size = bincode::serialize(&encrypted_inputs).unwrap().len();
|
||||
|
||||
println!("Compact CT list for {NB_CTXT} CTs: {} bytes", cctl_size);
|
||||
|
||||
write_result(&mut file, &test_name, cctl_size);
|
||||
write_to_json::<u64, _>(
|
||||
&test_name,
|
||||
params,
|
||||
params.name(),
|
||||
"CCTL",
|
||||
&operator,
|
||||
0,
|
||||
vec![],
|
||||
);
|
||||
|
||||
let expander = encrypted_inputs.expand().unwrap();
|
||||
for (i, input) in vec_inputs.into_iter().enumerate() {
|
||||
let expanded: FheUint32 = expander.get(i).unwrap().unwrap();
|
||||
let clear: u32 = expanded.decrypt(&client_key);
|
||||
assert_eq!(clear, input);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
let params = V1_0_PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_PBS_KS_GAUSSIAN_2M128;
|
||||
let params = PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128;
|
||||
let config = ConfigBuilder::default()
|
||||
.use_custom_parameters(params)
|
||||
.use_dedicated_compact_public_key_parameters((
|
||||
PARAM_PKE_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
))
|
||||
.build();
|
||||
let (client_key, _) = generate_keys(config);
|
||||
let test_name = format!("hlapi_sizes_{}_cpk", params.name());
|
||||
@@ -157,57 +104,13 @@ pub fn cpk_and_cctl_sizes(results_file: &Path) {
|
||||
|
||||
// 256 bits
|
||||
{
|
||||
let params = V1_0_PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_GAUSSIAN_2M128;
|
||||
let config = ConfigBuilder::default()
|
||||
.use_custom_parameters(params)
|
||||
.build();
|
||||
let (client_key, _) = generate_keys(config);
|
||||
|
||||
let params: PBSParameters = params.into();
|
||||
|
||||
println!("Sizes for: {} and 256 bits", params.name());
|
||||
|
||||
let public_key = CompactPublicKey::new(&client_key);
|
||||
|
||||
println!(
|
||||
"PK size: {} bytes",
|
||||
bincode::serialize(&public_key).unwrap().len()
|
||||
);
|
||||
|
||||
let test_name = format!("hlapi_sizes_{}_cctl_{NB_CTXT}_len_256_bits", params.name());
|
||||
|
||||
let vec_inputs: Vec<_> = (0..NB_CTXT).map(|_| U256::from(rng.gen::<u32>())).collect();
|
||||
|
||||
let encrypted_inputs = CompactCiphertextList::builder(&public_key)
|
||||
.extend(vec_inputs.iter().copied())
|
||||
.build();
|
||||
let cctl_size = bincode::serialize(&encrypted_inputs).unwrap().len();
|
||||
|
||||
println!("Compact CT list for {NB_CTXT} CTs: {} bytes", cctl_size);
|
||||
|
||||
write_result(&mut file, &test_name, cctl_size);
|
||||
write_to_json::<u64, _>(
|
||||
&test_name,
|
||||
params,
|
||||
params.name(),
|
||||
"CCTL",
|
||||
&operator,
|
||||
0,
|
||||
vec![],
|
||||
);
|
||||
|
||||
let expander = encrypted_inputs.expand().unwrap();
|
||||
for (i, input) in vec_inputs.into_iter().enumerate() {
|
||||
let expanded: FheUint256 = expander.get(i).unwrap().unwrap();
|
||||
let clear: U256 = expanded.decrypt(&client_key);
|
||||
assert_eq!(clear, input);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
let params = V1_0_PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_PBS_KS_GAUSSIAN_2M128;
|
||||
let params = PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128;
|
||||
let config = ConfigBuilder::default()
|
||||
.use_custom_parameters(params)
|
||||
.use_dedicated_compact_public_key_parameters((
|
||||
PARAM_PKE_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
))
|
||||
.build();
|
||||
let (client_key, _) = generate_keys(config);
|
||||
|
||||
|
||||
@@ -9,9 +9,11 @@ use tfhe::keycache::NamedParam;
|
||||
use tfhe::shortint::parameters::current_params::{
|
||||
VEC_ALL_CLASSIC_PBS_PARAMETERS, VEC_ALL_COMPACT_PUBLIC_KEY_ENCRYPTION_PARAMETERS,
|
||||
VEC_ALL_COMPRESSION_PARAMETERS, VEC_ALL_MULTI_BIT_PBS_PARAMETERS,
|
||||
VEC_ALL_NOISE_SQUASHING_PARAMETERS,
|
||||
};
|
||||
use tfhe::shortint::parameters::{
|
||||
CompactPublicKeyEncryptionParameters, CompressionParameters, ShortintParameterSet,
|
||||
CompactPublicKeyEncryptionParameters, CompressionParameters, NoiseSquashingParameters,
|
||||
ShortintParameterSet,
|
||||
};
|
||||
|
||||
pub trait ParamDetails<T: UnsignedInteger> {
|
||||
@@ -127,6 +129,33 @@ impl ParamDetails<u64> for CompressionParameters {
|
||||
}
|
||||
}
|
||||
|
||||
impl ParamDetails<u128> for NoiseSquashingParameters {
|
||||
fn lwe_dimension(&self) -> LweDimension {
|
||||
panic!("lwe_dimension not applicable for NoiseSquashingParameters")
|
||||
}
|
||||
|
||||
fn glwe_dimension(&self) -> GlweDimension {
|
||||
self.glwe_dimension
|
||||
}
|
||||
|
||||
fn lwe_noise_distribution(&self) -> DynamicDistribution<u128> {
|
||||
panic!("lwe_noise_distribution not applicable for NoiseSquashingParameters")
|
||||
}
|
||||
|
||||
fn glwe_noise_distribution(&self) -> DynamicDistribution<u128> {
|
||||
self.glwe_noise_distribution
|
||||
}
|
||||
|
||||
fn polynomial_size(&self) -> PolynomialSize {
|
||||
self.polynomial_size
|
||||
}
|
||||
|
||||
fn log_ciphertext_modulus(&self) -> usize {
|
||||
assert!(self.ciphertext_modulus.is_native_modulus());
|
||||
u128::BITS as usize
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Eq, PartialEq, Hash)]
|
||||
enum ParametersFormat {
|
||||
Lwe,
|
||||
@@ -146,6 +175,18 @@ struct ParamGroupKey {
|
||||
parameters_format: ParametersFormat,
|
||||
}
|
||||
|
||||
fn format_modulus_as_string(log_ciphertext_modulus: usize) -> String {
|
||||
if log_ciphertext_modulus > 128 {
|
||||
panic!("Exponent too large");
|
||||
}
|
||||
if log_ciphertext_modulus == 128 {
|
||||
// What are you gonna do, call the police ?
|
||||
return "340282366920938463463374607431768211456".to_string();
|
||||
}
|
||||
|
||||
format!("{}", 1u128 << log_ciphertext_modulus)
|
||||
}
|
||||
|
||||
///Function to print in the lattice_estimator format the parameters
|
||||
/// Format: LWE.Parameters(n=722, q=2^32, Xs=ND.UniformMod(2),
|
||||
/// Xe=ND.DiscreteGaussian(56139.60810663548), tag='test_lattice_estimator')
|
||||
@@ -159,13 +200,25 @@ pub fn format_lwe_parameters_to_lattice_estimator<U: UnsignedInteger, T: ParamDe
|
||||
param.log_ciphertext_modulus() as f64 + distrib.standard_dev().0.log2();
|
||||
|
||||
format!(
|
||||
"{}_LWE = LWE.Parameters(\n n = {},\n q ={},\n Xs=ND.Uniform(0,1), \n Xe=ND.DiscreteGaussian({}),\n tag=('{}_lwe',) \n)\n\n",
|
||||
name, param.lwe_dimension().0, (1u128<<param.log_ciphertext_modulus() as u128), 2.0_f64.powf(modular_std_dev), similar_params.join("_lwe', '"))
|
||||
"{}_LWE = LWE.Parameters(\n n = {},\n q ={},\n Xs=ND.Uniform(0,1), \n \
|
||||
Xe=ND.DiscreteGaussian({}),\n tag=('{}_lwe',) \n)\n\n",
|
||||
name,
|
||||
param.lwe_dimension().0,
|
||||
format_modulus_as_string(param.log_ciphertext_modulus()),
|
||||
2.0_f64.powf(modular_std_dev),
|
||||
similar_params.join("_lwe', '")
|
||||
)
|
||||
}
|
||||
DynamicDistribution::TUniform(distrib) => {
|
||||
format!(
|
||||
"{}_LWE = LWE.Parameters(\n n = {},\n q ={},\n Xs=ND.Uniform(0,1), \n Xe=ND.DiscreteGaussian({}),\n tag=('{}_lwe',) \n)\n\n",
|
||||
name, param.lwe_dimension().0, (1u128<<param.log_ciphertext_modulus() as u128), tuniform_equivalent_gaussian_std_dev(&distrib), similar_params.join("_lwe', '"))
|
||||
"{}_LWE = LWE.Parameters(\n n = {},\n q ={},\n Xs=ND.Uniform(0,1), \n \
|
||||
Xe=ND.DiscreteGaussian({}),\n tag=('{}_lwe',) \n)\n\n",
|
||||
name,
|
||||
param.lwe_dimension().0,
|
||||
format_modulus_as_string(param.log_ciphertext_modulus()),
|
||||
tuniform_equivalent_gaussian_std_dev(&distrib),
|
||||
similar_params.join("_lwe', '")
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -183,13 +236,31 @@ pub fn format_glwe_parameters_to_lattice_estimator<U: UnsignedInteger, T: ParamD
|
||||
param.log_ciphertext_modulus() as f64 + distrib.standard_dev().0.log2();
|
||||
|
||||
format!(
|
||||
"{}_GLWE = LWE.Parameters(\n n = {},\n q = {},\n Xs=ND.Uniform(0,1), \n Xe=ND.DiscreteGaussian({}),\n tag=('{}_glwe',) \n)\n\n",
|
||||
name, param.glwe_dimension().to_equivalent_lwe_dimension(param.polynomial_size()).0, 1u128<<param.log_ciphertext_modulus() as u128, 2.0_f64.powf(modular_std_dev), similar_params.join("_glwe', '"))
|
||||
"{}_GLWE = LWE.Parameters(\n n = {},\n q = {},\n Xs=ND.Uniform(0,1), \n \
|
||||
Xe=ND.DiscreteGaussian({}),\n tag=('{}_glwe',) \n)\n\n",
|
||||
name,
|
||||
param
|
||||
.glwe_dimension()
|
||||
.to_equivalent_lwe_dimension(param.polynomial_size())
|
||||
.0,
|
||||
format_modulus_as_string(param.log_ciphertext_modulus()),
|
||||
2.0_f64.powf(modular_std_dev),
|
||||
similar_params.join("_glwe', '")
|
||||
)
|
||||
}
|
||||
DynamicDistribution::TUniform(distrib) => {
|
||||
format!(
|
||||
"{}_GLWE = LWE.Parameters(\n n = {},\n q ={},\n Xs=ND.Uniform(0,1), \n Xe=ND.DiscreteGaussian({}),\n tag=('{}_glwe',) \n)\n\n",
|
||||
name, param.glwe_dimension().to_equivalent_lwe_dimension(param.polynomial_size()).0, 1u128<<param.log_ciphertext_modulus() as u128, tuniform_equivalent_gaussian_std_dev(&distrib), similar_params.join("_glwe', '"))
|
||||
"{}_GLWE = LWE.Parameters(\n n = {},\n q ={},\n Xs=ND.Uniform(0,1), \n \
|
||||
Xe=ND.DiscreteGaussian({}),\n tag=('{}_glwe',) \n)\n\n",
|
||||
name,
|
||||
param
|
||||
.glwe_dimension()
|
||||
.to_equivalent_lwe_dimension(param.polynomial_size())
|
||||
.0,
|
||||
format_modulus_as_string(param.log_ciphertext_modulus()),
|
||||
tuniform_equivalent_gaussian_std_dev(&distrib),
|
||||
similar_params.join("_glwe', '")
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -355,6 +426,16 @@ fn main() {
|
||||
ParametersFormat::Glwe,
|
||||
);
|
||||
|
||||
let noise_squasing_params: Vec<_> = VEC_ALL_NOISE_SQUASHING_PARAMETERS
|
||||
.into_iter()
|
||||
.map(|p| (*p.0, Some(p.1)))
|
||||
.collect();
|
||||
write_all_params_in_file(
|
||||
"shortint_noise_squashing_parameters_lattice_estimator.sage",
|
||||
&noise_squasing_params,
|
||||
ParametersFormat::Glwe,
|
||||
);
|
||||
|
||||
// TODO perform this gathering later
|
||||
// let wopbs = ALL_PARAMETER_VEC_WOPBS
|
||||
// .iter()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use tfhe::keycache::NamedParam;
|
||||
use tfhe::shortint::parameters::{
|
||||
PARAM_GPU_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64,
|
||||
PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
PARAM_KEYSWITCH_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
PARAM_PKE_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
||||
@@ -16,9 +16,9 @@ pub fn main() {
|
||||
println!("CUDA GPU Integer parameters:\n");
|
||||
println!(
|
||||
"{}",
|
||||
PARAM_GPU_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64.name()
|
||||
PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128.name()
|
||||
);
|
||||
println!("{PARAM_GPU_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64:?}");
|
||||
println!("{PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128:?}");
|
||||
|
||||
println!("\n\n===========================================================================\n\n");
|
||||
|
||||
@@ -32,7 +32,7 @@ pub fn main() {
|
||||
println!("\n===========================================================================\n\n");
|
||||
|
||||
println!("CUDA GPU PBS parameters:\n");
|
||||
let param = PARAM_GPU_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64;
|
||||
let param = PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128;
|
||||
let bits = (param.message_modulus.0 * param.carry_modulus.0).ilog2();
|
||||
println!("Precision {bits} bits");
|
||||
println!("{}", param.name());
|
||||
|
||||
@@ -23,20 +23,20 @@ fn write_result(file: &mut File, name: &str, value: usize) {
|
||||
fn client_server_key_sizes(results_file: &Path) {
|
||||
let shortint_params_vec: Vec<PBSParameters> = vec![
|
||||
PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128.into(),
|
||||
V1_0_PARAM_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M128.into(),
|
||||
V1_0_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128.into(),
|
||||
V1_0_PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M128.into(),
|
||||
V1_0_PARAM_MESSAGE_4_CARRY_4_KS_PBS_GAUSSIAN_2M128.into(),
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_2_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_2_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_2_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_3_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
V1_0_PARAM_MULTI_BIT_GROUP_3_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
PARAM_GPU_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64.into(),
|
||||
PARAM_GPU_MULTI_BIT_GROUP_3_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
PARAM_GPU_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
PARAM_GPU_MULTI_BIT_GROUP_3_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
V1_1_PARAM_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M128.into(),
|
||||
V1_1_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128.into(),
|
||||
V1_1_PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M128.into(),
|
||||
V1_1_PARAM_MESSAGE_4_CARRY_4_KS_PBS_GAUSSIAN_2M128.into(),
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_2_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_2_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_2_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_3_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_3_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
V1_1_PARAM_MULTI_BIT_GROUP_3_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64.into(),
|
||||
PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_1_CARRY_1_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M64.into(),
|
||||
];
|
||||
File::create(results_file).expect("create results file failed");
|
||||
let mut file = OpenOptions::new()
|
||||
|
||||
Reference in New Issue
Block a user