From 69b8cc28e2d407dafd318dca6194f2651b6f7e3c Mon Sep 17 00:00:00 2001 From: Nicolas Sarlin Date: Tue, 7 Oct 2025 12:32:18 +0200 Subject: [PATCH] chore(backward): add data for ks32 client key, server key and ct --- .../backward_compatibility/high_level_api.rs | 12 +- tests/backward_compatibility/shortint.rs | 166 ++++++++++++------ .../1_3/high_level_api/client_key_ks32.bcode | 3 + .../1_3/high_level_api/client_key_ks32.cbor | 3 + .../compressed_server_key_ks32.bcode | 3 + .../compressed_server_key_ks32.cbor | 3 + .../data/1_3/high_level_api/ct_ks32.bcode | 3 + .../data/1_3/high_level_api/ct_ks32.cbor | 3 + .../1_3/high_level_api/server_key_ks32.bcode | 3 + .../1_3/high_level_api/server_key_ks32.cbor | 3 + .../server_key_for_rerand.bcode | 4 +- .../high_level_api/server_key_for_rerand.cbor | 4 +- .../server_key_with_noise_squashing.bcode | 4 +- .../server_key_with_noise_squashing.cbor | 4 +- .../data/high_level_api.ron | 64 +++++++ .../src/data_0_10.rs | 3 + .../src/data_0_11.rs | 3 + .../tfhe-backward-compat-data/src/data_0_8.rs | 3 + .../tfhe-backward-compat-data/src/data_1_0.rs | 3 + .../tfhe-backward-compat-data/src/data_1_1.rs | 3 + .../tfhe-backward-compat-data/src/data_1_3.rs | 154 +++++++++++++--- .../tfhe-backward-compat-data/src/data_1_4.rs | 91 +++++++--- .../tfhe-backward-compat-data/src/generate.rs | 33 +++- utils/tfhe-backward-compat-data/src/lib.rs | 39 ++++ 24 files changed, 484 insertions(+), 130 deletions(-) create mode 100644 utils/tfhe-backward-compat-data/data/1_3/high_level_api/client_key_ks32.bcode create mode 100644 utils/tfhe-backward-compat-data/data/1_3/high_level_api/client_key_ks32.cbor create mode 100644 utils/tfhe-backward-compat-data/data/1_3/high_level_api/compressed_server_key_ks32.bcode create mode 100644 utils/tfhe-backward-compat-data/data/1_3/high_level_api/compressed_server_key_ks32.cbor create mode 100644 utils/tfhe-backward-compat-data/data/1_3/high_level_api/ct_ks32.bcode create mode 100644 utils/tfhe-backward-compat-data/data/1_3/high_level_api/ct_ks32.cbor create mode 100644 utils/tfhe-backward-compat-data/data/1_3/high_level_api/server_key_ks32.bcode create mode 100644 utils/tfhe-backward-compat-data/data/1_3/high_level_api/server_key_ks32.cbor diff --git a/tests/backward_compatibility/high_level_api.rs b/tests/backward_compatibility/high_level_api.rs index 3372b75b5..8bab0afab 100644 --- a/tests/backward_compatibility/high_level_api.rs +++ b/tests/backward_compatibility/high_level_api.rs @@ -12,7 +12,7 @@ use tfhe::shortint::parameters::{ }; #[cfg(feature = "zk-pok")] use tfhe::shortint::prelude::LweDimension; -use tfhe::shortint::{AtomicPatternParameters, CarryModulus, CiphertextModulus, MessageModulus}; +use tfhe::shortint::{CarryModulus, CiphertextModulus, MessageModulus}; #[cfg(feature = "zk-pok")] use tfhe::zk::{CompactPkeCrs, CompactPkeCrsConformanceParams}; use tfhe::{ @@ -33,16 +33,10 @@ use tfhe_backward_compat_data::{ HlCompressedSquashedNoiseCiphertextListTest, HlHeterogeneousCiphertextListTest, HlPublicKeyTest, HlServerKeyTest, HlSignedCiphertextTest, HlSquashedNoiseBoolCiphertextTest, HlSquashedNoiseSignedCiphertextTest, HlSquashedNoiseUnsignedCiphertextTest, TestMetadata, - TestParameterSet, TestType, Testcase, ZkPkePublicParamsTest, + TestType, Testcase, ZkPkePublicParamsTest, }; use tfhe_versionable::Unversionize; -fn load_hl_params(test_params: &TestParameterSet) -> AtomicPatternParameters { - let pbs_params = load_params(test_params); - - pbs_params.into() -} - /// Test HL ciphertext: loads the ciphertext and compare the decrypted value to the one in the /// metadata. pub fn test_hl_ciphertext( @@ -299,7 +293,7 @@ pub fn test_hl_clientkey( test: &HlClientKeyTest, format: DataFormat, ) -> Result { - let test_params = load_hl_params(&test.parameters); + let test_params = load_params(&test.parameters); let key: ClientKey = load_and_unversionize(dir, test, format)?; let key_params = key.computation_parameters(); diff --git a/tests/backward_compatibility/shortint.rs b/tests/backward_compatibility/shortint.rs index d92c9b507..7ff720e14 100644 --- a/tests/backward_compatibility/shortint.rs +++ b/tests/backward_compatibility/shortint.rs @@ -1,17 +1,19 @@ use std::path::Path; use tfhe::core_crypto::prelude::{ - LweCiphertextCount, NoiseEstimationMeasureBound, RSigmaFactor, TUniform, Variance, + LweCiphertextCount, NoiseEstimationMeasureBound, RSigmaFactor, TUniform, UnsignedInteger, + Variance, }; use tfhe::shortint::parameters::{ - LweBskGroupingFactor, ModulusSwitchNoiseReductionParams, ModulusSwitchType, + CiphertextModulus32, KeySwitch32PBSParameters, LweBskGroupingFactor, + ModulusSwitchNoiseReductionParams, ModulusSwitchType, }; use tfhe_backward_compat_data::load::{ load_versioned_auxiliary, DataFormat, TestFailure, TestResult, TestSuccess, }; use tfhe_backward_compat_data::{ ShortintCiphertextTest, ShortintClientKeyTest, TestClassicParameterSet, TestDistribution, - TestMetadata, TestModulusSwitchNoiseReductionParams, TestModulusSwitchType, - TestMultiBitParameterSet, TestParameterSet, TestType, Testcase, + TestKS32ParameterSet, TestMetadata, TestModulusSwitchNoiseReductionParams, + TestModulusSwitchType, TestMultiBitParameterSet, TestParameterSet, TestType, Testcase, }; use tfhe::shortint::parameters::{ @@ -19,8 +21,8 @@ use tfhe::shortint::parameters::{ LweDimension, PolynomialSize, StandardDev, }; use tfhe::shortint::{ - CarryModulus, Ciphertext, CiphertextModulus, ClassicPBSParameters, ClientKey, - EncryptionKeyChoice, MaxNoiseLevel, MessageModulus, MultiBitPBSParameters, PBSParameters, + AtomicPatternParameters, CarryModulus, Ciphertext, CiphertextModulus, ClassicPBSParameters, + ClientKey, EncryptionKeyChoice, MaxNoiseLevel, MessageModulus, MultiBitPBSParameters, ShortintParameterSet, }; use tfhe_versionable::Unversionize; @@ -29,7 +31,7 @@ use crate::{load_and_unversionize, TestedModule}; /// Converts test parameters metadata that are independent of any tfhe-rs version and use only /// built-in types into parameters suitable for the currently tested version. -pub fn load_params(test_params: &TestParameterSet) -> PBSParameters { +pub fn load_params(test_params: &TestParameterSet) -> AtomicPatternParameters { match test_params { TestParameterSet::TestClassicParameterSet(TestClassicParameterSet { lwe_dimension, @@ -48,56 +50,33 @@ pub fn load_params(test_params: &TestParameterSet) -> PBSParameters { log2_p_fail, encryption_key_choice, modulus_switch_noise_reduction_params, - }) => { - let modulus_switch_noise_reduction_params = match modulus_switch_noise_reduction_params - { - TestModulusSwitchType::Standard => ModulusSwitchType::Standard, - TestModulusSwitchType::DriftTechniqueNoiseReduction( - TestModulusSwitchNoiseReductionParams { - modulus_switch_zeros_count, - ms_bound, - ms_r_sigma_factor, - ms_input_variance, - }, - ) => ModulusSwitchType::DriftTechniqueNoiseReduction( - ModulusSwitchNoiseReductionParams { - modulus_switch_zeros_count: LweCiphertextCount(*modulus_switch_zeros_count), - ms_bound: NoiseEstimationMeasureBound(*ms_bound), - ms_r_sigma_factor: RSigmaFactor(*ms_r_sigma_factor), - ms_input_variance: Variance(*ms_input_variance), - }, - ), - TestModulusSwitchType::CenteredMeanNoiseReduction => { - ModulusSwitchType::CenteredMeanNoiseReduction + }) => ClassicPBSParameters { + lwe_dimension: LweDimension(*lwe_dimension), + glwe_dimension: GlweDimension(*glwe_dimension), + polynomial_size: PolynomialSize(*polynomial_size), + lwe_noise_distribution: convert_distribution(lwe_noise_distribution), + glwe_noise_distribution: convert_distribution(glwe_noise_distribution), + pbs_base_log: DecompositionBaseLog(*pbs_base_log), + pbs_level: DecompositionLevelCount(*pbs_level), + ks_base_log: DecompositionBaseLog(*ks_base_log), + ks_level: DecompositionLevelCount(*ks_level), + message_modulus: MessageModulus(*message_modulus as u64), + carry_modulus: CarryModulus(*carry_modulus as u64), + max_noise_level: MaxNoiseLevel::new(*max_noise_level as u64), + log2_p_fail: *log2_p_fail, + ciphertext_modulus: CiphertextModulus::try_new(*ciphertext_modulus).unwrap(), + encryption_key_choice: { + match encryption_key_choice.as_ref() { + "big" => EncryptionKeyChoice::Big, + "small" => EncryptionKeyChoice::Small, + _ => panic!("Invalid encryption key choice"), } - }; - - ClassicPBSParameters { - lwe_dimension: LweDimension(*lwe_dimension), - glwe_dimension: GlweDimension(*glwe_dimension), - polynomial_size: PolynomialSize(*polynomial_size), - lwe_noise_distribution: convert_distribution(lwe_noise_distribution), - glwe_noise_distribution: convert_distribution(glwe_noise_distribution), - pbs_base_log: DecompositionBaseLog(*pbs_base_log), - pbs_level: DecompositionLevelCount(*pbs_level), - ks_base_log: DecompositionBaseLog(*ks_base_log), - ks_level: DecompositionLevelCount(*ks_level), - message_modulus: MessageModulus(*message_modulus as u64), - carry_modulus: CarryModulus(*carry_modulus as u64), - max_noise_level: MaxNoiseLevel::new(*max_noise_level as u64), - log2_p_fail: *log2_p_fail, - ciphertext_modulus: CiphertextModulus::try_new(*ciphertext_modulus).unwrap(), - encryption_key_choice: { - match encryption_key_choice.as_ref() { - "big" => EncryptionKeyChoice::Big, - "small" => EncryptionKeyChoice::Small, - _ => panic!("Invalid encryption key choice"), - } - }, - modulus_switch_noise_reduction_params, - } - .into() + }, + modulus_switch_noise_reduction_params: convert_modulus_switch_type( + modulus_switch_noise_reduction_params.clone(), + ), } + .into(), TestParameterSet::TestMultiBitParameterSet(TestMultiBitParameterSet { lwe_dimension, glwe_dimension, @@ -141,10 +120,83 @@ pub fn load_params(test_params: &TestParameterSet) -> PBSParameters { deterministic_execution: false, } .into(), + TestParameterSet::TestKS32ParameterSet(TestKS32ParameterSet { + lwe_dimension, + glwe_dimension, + polynomial_size, + lwe_noise_distribution, + glwe_noise_distribution, + pbs_base_log, + pbs_level, + ks_base_log, + ks_level, + message_modulus, + ciphertext_modulus, + carry_modulus, + max_noise_level, + log2_p_fail, + modulus_switch_noise_reduction_params, + post_keyswitch_ciphertext_modulus, + }) => KeySwitch32PBSParameters { + lwe_dimension: LweDimension(*lwe_dimension), + glwe_dimension: GlweDimension(*glwe_dimension), + polynomial_size: PolynomialSize(*polynomial_size), + lwe_noise_distribution: convert_distribution(lwe_noise_distribution), + glwe_noise_distribution: convert_distribution(glwe_noise_distribution), + pbs_base_log: DecompositionBaseLog(*pbs_base_log), + pbs_level: DecompositionLevelCount(*pbs_level), + ks_base_log: DecompositionBaseLog(*ks_base_log), + ks_level: DecompositionLevelCount(*ks_level), + message_modulus: MessageModulus(*message_modulus as u64), + carry_modulus: CarryModulus(*carry_modulus as u64), + max_noise_level: MaxNoiseLevel::new(*max_noise_level as u64), + log2_p_fail: *log2_p_fail, + ciphertext_modulus: CiphertextModulus::try_new(*ciphertext_modulus).unwrap(), + modulus_switch_noise_reduction_params: convert_modulus_switch_type( + modulus_switch_noise_reduction_params.clone(), + ), + post_keyswitch_ciphertext_modulus: CiphertextModulus32::try_new( + *post_keyswitch_ciphertext_modulus, + ) + .unwrap(), + } + .into(), } } -fn convert_distribution(value: &TestDistribution) -> DynamicDistribution { +fn convert_ms_noise_reduction_params( + value: TestModulusSwitchNoiseReductionParams, +) -> ModulusSwitchNoiseReductionParams { + let TestModulusSwitchNoiseReductionParams { + modulus_switch_zeros_count, + ms_bound, + ms_r_sigma_factor, + ms_input_variance, + } = value; + + ModulusSwitchNoiseReductionParams { + modulus_switch_zeros_count: LweCiphertextCount(modulus_switch_zeros_count), + ms_bound: NoiseEstimationMeasureBound(ms_bound), + ms_r_sigma_factor: RSigmaFactor(ms_r_sigma_factor), + ms_input_variance: Variance(ms_input_variance), + } +} + +fn convert_modulus_switch_type(value: TestModulusSwitchType) -> ModulusSwitchType { + match value { + TestModulusSwitchType::Standard => ModulusSwitchType::Standard, + TestModulusSwitchType::DriftTechniqueNoiseReduction( + test_modulus_switch_noise_reduction_params, + ) => ModulusSwitchType::DriftTechniqueNoiseReduction(convert_ms_noise_reduction_params( + test_modulus_switch_noise_reduction_params, + )), + TestModulusSwitchType::CenteredMeanNoiseReduction => { + ModulusSwitchType::CenteredMeanNoiseReduction + } + } +} + +fn convert_distribution(value: &TestDistribution) -> DynamicDistribution { match value { TestDistribution::Gaussian { stddev } => { DynamicDistribution::new_gaussian_from_std_dev(StandardDev(*stddev)) @@ -156,7 +208,7 @@ fn convert_distribution(value: &TestDistribution) -> DynamicDistribution { } fn load_shortint_params(test_params: &TestParameterSet) -> ShortintParameterSet { - ShortintParameterSet::new_pbs_param_set(load_params(test_params)) + load_params(test_params).into() } pub fn test_shortint_ciphertext( diff --git a/utils/tfhe-backward-compat-data/data/1_3/high_level_api/client_key_ks32.bcode b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/client_key_ks32.bcode new file mode 100644 index 000000000..6033546d7 --- /dev/null +++ b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/client_key_ks32.bcode @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:352e24179fce9825d2307aa22eba04720fc7b843cc6d1da9323e69cb5fb25fe5 +size 20416 diff --git a/utils/tfhe-backward-compat-data/data/1_3/high_level_api/client_key_ks32.cbor b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/client_key_ks32.cbor new file mode 100644 index 000000000..1a752c1ee --- /dev/null +++ b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/client_key_ks32.cbor @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e30f9546fcc51e73ef6ca22eded0a4aec1dcb652aad4243c7829929e27d316c +size 3911 diff --git a/utils/tfhe-backward-compat-data/data/1_3/high_level_api/compressed_server_key_ks32.bcode b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/compressed_server_key_ks32.bcode new file mode 100644 index 000000000..f2c6da831 --- /dev/null +++ b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/compressed_server_key_ks32.bcode @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1de50df828dd9ee6437166fb6834bcc78c0a612105d0d19f2f368037c2b2f1de +size 30120017 diff --git a/utils/tfhe-backward-compat-data/data/1_3/high_level_api/compressed_server_key_ks32.cbor b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/compressed_server_key_ks32.cbor new file mode 100644 index 000000000..2769f63b6 --- /dev/null +++ b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/compressed_server_key_ks32.cbor @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:575be122c83ea5e28ed94ad68f872ab4f08de5d02c8e2546835e0e1eb4dfb2a6 +size 33890392 diff --git a/utils/tfhe-backward-compat-data/data/1_3/high_level_api/ct_ks32.bcode b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/ct_ks32.bcode new file mode 100644 index 000000000..8b43e5f71 --- /dev/null +++ b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/ct_ks32.bcode @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea7d1047ad327fb5becaf8caf1d8abafef0dc0bc1b3787e1a3d5930b8a48ec03 +size 66000 diff --git a/utils/tfhe-backward-compat-data/data/1_3/high_level_api/ct_ks32.cbor b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/ct_ks32.cbor new file mode 100644 index 000000000..4c9818abb --- /dev/null +++ b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/ct_ks32.cbor @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92be19b5d81e37787d9388640330f7246f6c76807592e6f0c00edd86275deb3b +size 74489 diff --git a/utils/tfhe-backward-compat-data/data/1_3/high_level_api/server_key_ks32.bcode b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/server_key_ks32.bcode new file mode 100644 index 000000000..b99d8c140 --- /dev/null +++ b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/server_key_ks32.bcode @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50649cb65a53f9122380c678a5ec0ff3fae684eb7a986bbc414dd71ceaba69ab +size 95632153 diff --git a/utils/tfhe-backward-compat-data/data/1_3/high_level_api/server_key_ks32.cbor b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/server_key_ks32.cbor new file mode 100644 index 000000000..845c9a32d --- /dev/null +++ b/utils/tfhe-backward-compat-data/data/1_3/high_level_api/server_key_ks32.cbor @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2cdc9c1cac3f76c5bb7fdc73321d7dc1b4aa1a9a60938a9ebd8cf5000ed7e456 +size 115754494 diff --git a/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_for_rerand.bcode b/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_for_rerand.bcode index 120944c41..976063b28 100644 --- a/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_for_rerand.bcode +++ b/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_for_rerand.bcode @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d1f9127b621084669da234edfb15d6ec0a9811b4a11920f214f6a70710bcefd -size 856624 +oid sha256:88a1a47bc58e2aec2b7e5faba7cbdc600e7385593a33d7161f52313083a91e87 +size 856640 diff --git a/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_for_rerand.cbor b/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_for_rerand.cbor index 92324851f..132964d68 100644 --- a/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_for_rerand.cbor +++ b/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_for_rerand.cbor @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:827caa582a73af08043012732444f4ea89eaa445095b4cfc0b8dfb2a193f504d -size 972494 +oid sha256:8cd2da944ad6db78d97aa57654b7af06909a533351bd6ee2a549a403706b0c96 +size 972576 diff --git a/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_with_noise_squashing.bcode b/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_with_noise_squashing.bcode index 74bdda7bd..a3d3b002d 100644 --- a/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_with_noise_squashing.bcode +++ b/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_with_noise_squashing.bcode @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:523fb601cb28251fce9fbf4a784b890336bda2cfd1b3db64c996cb89fc38f212 -size 15614960 +oid sha256:deca2b114a824f87ff300f8944b3728adfebe7c2e1565fb6b734edf6c585d3d6 +size 15614972 diff --git a/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_with_noise_squashing.cbor b/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_with_noise_squashing.cbor index 53b29bbeb..e69363f7c 100644 --- a/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_with_noise_squashing.cbor +++ b/utils/tfhe-backward-compat-data/data/1_4/high_level_api/server_key_with_noise_squashing.cbor @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:147dd3b499ce1385aeba3d54e60b12eff302ddbd98d3b218cb9972a0321251f2 -size 17632589 +oid sha256:a0ece66b9389488cb17d8bd69159883df958d4fa8abc63390d12e95f72e53673 +size 17632623 diff --git a/utils/tfhe-backward-compat-data/data/high_level_api.ron b/utils/tfhe-backward-compat-data/data/high_level_api.ron index cd27df9a3..9c441d463 100644 --- a/utils/tfhe-backward-compat-data/data/high_level_api.ron +++ b/utils/tfhe-backward-compat-data/data/high_level_api.ron @@ -644,6 +644,70 @@ ], )), ), + ( + tfhe_version_min: "1.3", + tfhe_module: "high_level_api", + metadata: HlClientKey(( + test_filename: "client_key_ks32", + parameters: TestKS32ParameterSet(( + lwe_dimension: 918, + glwe_dimension: 1, + polynomial_size: 2048, + lwe_noise_distribution: TUniform( + bound_log2: 13, + ), + glwe_noise_distribution: TUniform( + bound_log2: 17, + ), + pbs_base_log: 23, + pbs_level: 1, + ks_base_log: 4, + ks_level: 4, + message_modulus: 4, + ciphertext_modulus: 18446744073709551616, + carry_modulus: 4, + max_noise_level: 5, + log2_p_fail: -129.358380844, + modulus_switch_noise_reduction_params: DriftTechniqueNoiseReduction(( + modulus_switch_zeros_count: 1449, + ms_bound: 67108864.0, + ms_r_sigma_factor: 13.179851302864899, + ms_input_variance: 0.000000263039392929833, + )), + post_keyswitch_ciphertext_modulus: 4294967296, + )), + )), + ), + ( + tfhe_version_min: "1.3", + tfhe_module: "high_level_api", + metadata: HlServerKey(( + test_filename: "server_key_ks32", + client_key_filename: "client_key_ks32", + rerand_cpk_filename: None, + compressed: false, + )), + ), + ( + tfhe_version_min: "1.3", + tfhe_module: "high_level_api", + metadata: HlServerKey(( + test_filename: "compressed_server_key_ks32", + client_key_filename: "client_key_ks32", + rerand_cpk_filename: None, + compressed: true, + )), + ), + ( + tfhe_version_min: "1.3", + tfhe_module: "high_level_api", + metadata: HlCiphertext(( + test_filename: "ct_ks32", + key_filename: "client_key_ks32", + compressed: false, + clear_value: 25, + )), + ), ( tfhe_version_min: "1.4", tfhe_module: "high_level_api", diff --git a/utils/tfhe-backward-compat-data/src/data_0_10.rs b/utils/tfhe-backward-compat-data/src/data_0_10.rs index 68517ca51..46afe23f6 100644 --- a/utils/tfhe-backward-compat-data/src/data_0_10.rs +++ b/utils/tfhe-backward-compat-data/src/data_0_10.rs @@ -126,6 +126,9 @@ impl From for PBSParameters { TestParameterSet::TestMultiBitParameterSet(test_parameter_set_multi_bit) => { PBSParameters::MultiBitPBS(test_parameter_set_multi_bit.into()) } + TestParameterSet::TestKS32ParameterSet(_) => { + panic!("unsupported ks32 parameters for version") + } } } } diff --git a/utils/tfhe-backward-compat-data/src/data_0_11.rs b/utils/tfhe-backward-compat-data/src/data_0_11.rs index 412516386..633854059 100644 --- a/utils/tfhe-backward-compat-data/src/data_0_11.rs +++ b/utils/tfhe-backward-compat-data/src/data_0_11.rs @@ -136,6 +136,9 @@ impl From for PBSParameters { TestParameterSet::TestMultiBitParameterSet(test_parameter_set_multi_bit) => { PBSParameters::MultiBitPBS(test_parameter_set_multi_bit.into()) } + TestParameterSet::TestKS32ParameterSet(_) => { + panic!("unsupported ks32 parameters for version") + } } } } diff --git a/utils/tfhe-backward-compat-data/src/data_0_8.rs b/utils/tfhe-backward-compat-data/src/data_0_8.rs index caec871b3..9ecd98b0e 100644 --- a/utils/tfhe-backward-compat-data/src/data_0_8.rs +++ b/utils/tfhe-backward-compat-data/src/data_0_8.rs @@ -152,6 +152,9 @@ impl From for PBSParameters { TestParameterSet::TestMultiBitParameterSet(test_parameter_set_multi_bit) => { PBSParameters::MultiBitPBS(test_parameter_set_multi_bit.into()) } + TestParameterSet::TestKS32ParameterSet(_) => { + panic!("unsupported ks32 parameters for this version") + } } } } diff --git a/utils/tfhe-backward-compat-data/src/data_1_0.rs b/utils/tfhe-backward-compat-data/src/data_1_0.rs index b9927546c..d07b516da 100644 --- a/utils/tfhe-backward-compat-data/src/data_1_0.rs +++ b/utils/tfhe-backward-compat-data/src/data_1_0.rs @@ -159,6 +159,9 @@ impl From for PBSParameters { TestParameterSet::TestMultiBitParameterSet(test_parameter_set_multi_bit) => { PBSParameters::MultiBitPBS(test_parameter_set_multi_bit.into()) } + TestParameterSet::TestKS32ParameterSet(_) => { + panic!("unsupported ks32 parameters for version") + } } } } diff --git a/utils/tfhe-backward-compat-data/src/data_1_1.rs b/utils/tfhe-backward-compat-data/src/data_1_1.rs index ffd4d20fd..b1b150395 100644 --- a/utils/tfhe-backward-compat-data/src/data_1_1.rs +++ b/utils/tfhe-backward-compat-data/src/data_1_1.rs @@ -162,6 +162,9 @@ impl From for PBSParameters { TestParameterSet::TestMultiBitParameterSet(test_parameter_set_multi_bit) => { PBSParameters::MultiBitPBS(test_parameter_set_multi_bit.into()) } + TestParameterSet::TestKS32ParameterSet(_) => { + panic!("unsupported ks32 parameters for version") + } } } } diff --git a/utils/tfhe-backward-compat-data/src/data_1_3.rs b/utils/tfhe-backward-compat-data/src/data_1_3.rs index de13b3e04..cb77296e0 100644 --- a/utils/tfhe-backward-compat-data/src/data_1_3.rs +++ b/utils/tfhe-backward-compat-data/src/data_1_3.rs @@ -1,13 +1,15 @@ use crate::generate::{ store_versioned_auxiliary_tfhe_1_3, store_versioned_test_tfhe_1_3, TfhersVersion, - INSECURE_SMALL_TEST_PARAMS_MS_MEAN_COMPENSATION, PRNG_SEED, VALID_TEST_PARAMS_TUNIFORM, + INSECURE_SMALL_TEST_PARAMS_MS_MEAN_COMPENSATION, PRNG_SEED, VALID_TEST_PARAMS_KS32_TUNIFORM, + VALID_TEST_PARAMS_TUNIFORM, }; use crate::{ - DataKind, HlClientKeyTest, HlCompressedSquashedNoiseCiphertextListTest, + DataKind, HlCiphertextTest, HlClientKeyTest, HlCompressedSquashedNoiseCiphertextListTest, HlHeterogeneousCiphertextListTest, HlServerKeyTest, PkeZkProofAuxiliaryInfo, - TestClassicParameterSet, TestDistribution, TestMetadata, TestModulusSwitchNoiseReductionParams, - TestModulusSwitchType, TestMultiBitParameterSet, TestNoiseSquashingCompressionParameters, - TestNoiseSquashingParams, TestParameterSet, ZkPkePublicParamsTest, HL_MODULE_NAME, + TestClassicParameterSet, TestDistribution, TestKS32ParameterSet, TestMetadata, + TestModulusSwitchNoiseReductionParams, TestModulusSwitchType, TestMultiBitParameterSet, + TestNoiseSquashingCompressionParameters, TestNoiseSquashingParams, TestParameterSet, + ZkPkePublicParamsTest, HL_MODULE_NAME, }; use std::borrow::Cow; use std::fs::create_dir_all; @@ -20,23 +22,25 @@ use crate::generate::{ use tfhe_1_3::boolean::engine::BooleanEngine; use tfhe_1_3::core_crypto::commons::generators::DeterministicSeeder; use tfhe_1_3::core_crypto::commons::math::random::RandomGenerator; -use tfhe_1_3::core_crypto::prelude::{DefaultRandomGenerator, TUniform}; +use tfhe_1_3::core_crypto::prelude::{DefaultRandomGenerator, TUniform, UnsignedInteger}; use tfhe_1_3::prelude::*; use tfhe_1_3::shortint::engine::ShortintEngine; use tfhe_1_3::shortint::parameters::{ - CarryModulus, CiphertextModulus, ClassicPBSParameters, CoreCiphertextModulus, - DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, EncryptionKeyChoice, - GlweDimension, LweBskGroupingFactor, LweCiphertextCount, LweDimension, MaxNoiseLevel, - MessageModulus, ModulusSwitchNoiseReductionParams, MultiBitPBSParameters, - NoiseEstimationMeasureBound, NoiseSquashingCompressionParameters, NoiseSquashingParameters, - PolynomialSize, RSigmaFactor, StandardDev, Variance, + CarryModulus, CiphertextModulus, CiphertextModulus32, ClassicPBSParameters, + CoreCiphertextModulus, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, + EncryptionKeyChoice, GlweDimension, KeySwitch32PBSParameters, LweBskGroupingFactor, + LweCiphertextCount, LweDimension, MaxNoiseLevel, MessageModulus, + ModulusSwitchNoiseReductionParams, MultiBitPBSParameters, NoiseEstimationMeasureBound, + NoiseSquashingCompressionParameters, NoiseSquashingParameters, PolynomialSize, RSigmaFactor, + StandardDev, Variance, }; use tfhe_1_3::shortint::prelude::ModulusSwitchType; use tfhe_1_3::shortint::AtomicPatternParameters; use tfhe_1_3::zk::{CompactPkeCrs, ZkComputeLoad, ZkMSBZeroPaddingBitCount}; use tfhe_1_3::{ - set_server_key, ClientKey, CompactPublicKey, CompressedSquashedNoiseCiphertextList, FheBool, - FheInt32, FheUint32, ProvenCompactCiphertextList, Seed, ServerKey, + set_server_key, ClientKey, CompactPublicKey, CompressedServerKey, + CompressedSquashedNoiseCiphertextList, FheBool, FheInt32, FheUint32, FheUint8, + ProvenCompactCiphertextList, Seed, ServerKey, }; macro_rules! store_versioned_test { @@ -51,20 +55,10 @@ macro_rules! store_versioned_auxiliary { }; } -impl From for DynamicDistribution { - fn from(value: TestDistribution) -> Self { - match value { - TestDistribution::Gaussian { stddev } => { - DynamicDistribution::new_gaussian_from_std_dev(StandardDev(stddev)) - } - TestDistribution::TUniform { bound_log2 } => { - DynamicDistribution::new_t_uniform(bound_log2) - } - } - } -} - -impl From for DynamicDistribution { +impl From for DynamicDistribution +where + T: UnsignedInteger, +{ fn from(value: TestDistribution) -> Self { match value { TestDistribution::Gaussian { stddev } => { @@ -191,6 +185,51 @@ impl From for MultiBitPBSParameters { } } +impl From for KeySwitch32PBSParameters { + fn from(value: TestKS32ParameterSet) -> Self { + let TestKS32ParameterSet { + lwe_dimension, + glwe_dimension, + polynomial_size, + lwe_noise_distribution, + glwe_noise_distribution, + pbs_base_log, + pbs_level, + ks_base_log, + ks_level, + message_modulus, + ciphertext_modulus, + carry_modulus, + max_noise_level, + log2_p_fail, + modulus_switch_noise_reduction_params, + post_keyswitch_ciphertext_modulus, + } = value; + + Self { + lwe_dimension: LweDimension(lwe_dimension), + glwe_dimension: GlweDimension(glwe_dimension), + polynomial_size: PolynomialSize(polynomial_size), + lwe_noise_distribution: lwe_noise_distribution.into(), + glwe_noise_distribution: glwe_noise_distribution.into(), + pbs_base_log: DecompositionBaseLog(pbs_base_log), + pbs_level: DecompositionLevelCount(pbs_level), + ks_base_log: DecompositionBaseLog(ks_base_log), + ks_level: DecompositionLevelCount(ks_level), + message_modulus: MessageModulus(message_modulus as u64), + carry_modulus: CarryModulus(carry_modulus as u64), + max_noise_level: MaxNoiseLevel::new(max_noise_level as u64), + log2_p_fail, + post_keyswitch_ciphertext_modulus: CiphertextModulus32::try_new( + post_keyswitch_ciphertext_modulus, + ) + .unwrap(), + ciphertext_modulus: CiphertextModulus::try_new(ciphertext_modulus).unwrap(), + modulus_switch_noise_reduction_params: modulus_switch_noise_reduction_params.into(), + } + } +} + impl From for AtomicPatternParameters { fn from(value: TestParameterSet) -> Self { match value { @@ -204,6 +243,11 @@ impl From for AtomicPatternParameters { multibit.into() } + TestParameterSet::TestKS32ParameterSet(test_ks32_parameter_set) => { + let ks32 = KeySwitch32PBSParameters::from(test_ks32_parameter_set); + + ks32.into() + } } } } @@ -334,6 +378,34 @@ const HL_COMPRESSED_SQUASHED_NOISE_CIPHERTEXT_LIST: HlCompressedSquashedNoiseCip ]), }; +const CLIENT_KEY_KS32_FILENAME: &str = "client_key_ks32"; + +const CLIENT_KEY_KS32_TEST: HlClientKeyTest = HlClientKeyTest { + test_filename: Cow::Borrowed(CLIENT_KEY_KS32_FILENAME), + parameters: VALID_TEST_PARAMS_KS32_TUNIFORM, +}; + +const SERVER_KEY_KS32_TEST: HlServerKeyTest = HlServerKeyTest { + test_filename: Cow::Borrowed("server_key_ks32"), + client_key_filename: Cow::Borrowed(CLIENT_KEY_KS32_FILENAME), + rerand_cpk_filename: None, + compressed: false, +}; + +const COMPRESSED_SERVER_KEY_KS32_TEST: HlServerKeyTest = HlServerKeyTest { + test_filename: Cow::Borrowed("compressed_server_key_ks32"), + client_key_filename: Cow::Borrowed(CLIENT_KEY_KS32_FILENAME), + rerand_cpk_filename: None, + compressed: true, +}; + +const CT_KS32_TEST: HlCiphertextTest = HlCiphertextTest { + test_filename: Cow::Borrowed("ct_ks32"), + key_filename: Cow::Borrowed(CLIENT_KEY_KS32_FILENAME), + compressed: false, + clear_value: 25, +}; + pub struct V1_3; impl TfhersVersion for V1_3 { @@ -505,6 +577,28 @@ impl TfhersVersion for V1_3 { ); }; + // Generate data for the KS32 AP + { + let config = tfhe_1_3::ConfigBuilder::default() + .use_custom_parameters(CLIENT_KEY_KS32_TEST.parameters) + .build(); + + let hl_client_key = ClientKey::generate(config); + let compressed_server_key = CompressedServerKey::new(&hl_client_key); + let hl_server_key = compressed_server_key.decompress(); + + let ct = FheUint8::encrypt(CT_KS32_TEST.clear_value, &hl_client_key); + + store_versioned_test!(&hl_client_key, &dir, &CLIENT_KEY_KS32_TEST.test_filename); + store_versioned_test!(&hl_server_key, &dir, &SERVER_KEY_KS32_TEST.test_filename); + store_versioned_test!( + &compressed_server_key, + &dir, + &COMPRESSED_SERVER_KEY_KS32_TEST.test_filename + ); + store_versioned_test!(&ct, &dir, &CT_KS32_TEST.test_filename); + } + vec![ TestMetadata::HlHeterogeneousCiphertextList(HL_PROVEN_COMPACTLIST_TEST_ZKV2_FASTHASH), TestMetadata::HlClientKey(HL_CLIENTKEY_MS_MEAN_COMPENSATION), @@ -512,6 +606,10 @@ impl TfhersVersion for V1_3 { TestMetadata::HlCompressedSquashedNoiseCiphertextList( HL_COMPRESSED_SQUASHED_NOISE_CIPHERTEXT_LIST, ), + TestMetadata::HlClientKey(CLIENT_KEY_KS32_TEST), + TestMetadata::HlServerKey(SERVER_KEY_KS32_TEST), + TestMetadata::HlServerKey(COMPRESSED_SERVER_KEY_KS32_TEST), + TestMetadata::HlCiphertext(CT_KS32_TEST), ] } } diff --git a/utils/tfhe-backward-compat-data/src/data_1_4.rs b/utils/tfhe-backward-compat-data/src/data_1_4.rs index 394bf39f7..db423a57f 100644 --- a/utils/tfhe-backward-compat-data/src/data_1_4.rs +++ b/utils/tfhe-backward-compat-data/src/data_1_4.rs @@ -9,9 +9,9 @@ use crate::{ HlClientKeyTest, HlCompressedKVStoreTest, HlServerKeyTest, HlSquashedNoiseUnsignedCiphertextTest, TestClassicParameterSet, TestCompactPublicKeyEncryptionParameters, TestCompressionParameterSet, TestDistribution, - TestKeySwitchingParams, TestMetadata, TestModulusSwitchNoiseReductionParams, - TestModulusSwitchType, TestMultiBitParameterSet, TestNoiseSquashingParamsMultiBit, - TestParameterSet, HL_MODULE_NAME, + TestKS32ParameterSet, TestKeySwitchingParams, TestMetadata, + TestModulusSwitchNoiseReductionParams, TestModulusSwitchType, TestMultiBitParameterSet, + TestNoiseSquashingParamsMultiBit, TestParameterSet, HL_MODULE_NAME, }; use std::borrow::Cow; use std::collections::HashMap; @@ -20,18 +20,19 @@ use std::fs::create_dir_all; use tfhe_1_4::boolean::engine::BooleanEngine; use tfhe_1_4::core_crypto::commons::generators::DeterministicSeeder; -use tfhe_1_4::core_crypto::prelude::DefaultRandomGenerator; +use tfhe_1_4::core_crypto::prelude::{DefaultRandomGenerator, UnsignedInteger}; use tfhe_1_4::prelude::*; use tfhe_1_4::shortint::engine::ShortintEngine; use tfhe_1_4::shortint::parameters::noise_squashing::NoiseSquashingMultiBitParameters; use tfhe_1_4::shortint::parameters::{ - CarryModulus, CiphertextModulus, CiphertextModulusLog, CompactCiphertextListExpansionKind, - CompactPublicKeyEncryptionParameters, CompressionParameters, CoreCiphertextModulus, - DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, EncryptionKeyChoice, - GlweDimension, LweBskGroupingFactor, LweCiphertextCount, LweDimension, MaxNoiseLevel, - MessageModulus, ModulusSwitchNoiseReductionParams, ModulusSwitchType, - NoiseEstimationMeasureBound, NoiseSquashingParameters, PolynomialSize, RSigmaFactor, - ShortintKeySwitchingParameters, StandardDev, SupportedCompactPkeZkScheme, Variance, + CarryModulus, CiphertextModulus, CiphertextModulus32, CiphertextModulusLog, + CompactCiphertextListExpansionKind, CompactPublicKeyEncryptionParameters, + CompressionParameters, CoreCiphertextModulus, DecompositionBaseLog, DecompositionLevelCount, + DynamicDistribution, EncryptionKeyChoice, GlweDimension, KeySwitch32PBSParameters, + LweBskGroupingFactor, LweCiphertextCount, LweDimension, MaxNoiseLevel, MessageModulus, + ModulusSwitchNoiseReductionParams, ModulusSwitchType, NoiseEstimationMeasureBound, + NoiseSquashingParameters, PolynomialSize, RSigmaFactor, ShortintKeySwitchingParameters, + StandardDev, SupportedCompactPkeZkScheme, Variance, }; use tfhe_1_4::shortint::{AtomicPatternParameters, ClassicPBSParameters, MultiBitPBSParameters}; use tfhe_1_4::{ @@ -51,20 +52,10 @@ macro_rules! store_versioned_auxiliary { }; } -impl From for DynamicDistribution { - fn from(value: TestDistribution) -> Self { - match value { - TestDistribution::Gaussian { stddev } => { - DynamicDistribution::new_gaussian_from_std_dev(StandardDev(stddev)) - } - TestDistribution::TUniform { bound_log2 } => { - DynamicDistribution::new_t_uniform(bound_log2) - } - } - } -} - -impl From for DynamicDistribution { +impl From for DynamicDistribution +where + T: UnsignedInteger, +{ fn from(value: TestDistribution) -> Self { match value { TestDistribution::Gaussian { stddev } => { @@ -191,6 +182,51 @@ impl From for MultiBitPBSParameters { } } +impl From for KeySwitch32PBSParameters { + fn from(value: TestKS32ParameterSet) -> Self { + let TestKS32ParameterSet { + lwe_dimension, + glwe_dimension, + polynomial_size, + lwe_noise_distribution, + glwe_noise_distribution, + pbs_base_log, + pbs_level, + ks_base_log, + ks_level, + message_modulus, + ciphertext_modulus, + carry_modulus, + max_noise_level, + log2_p_fail, + modulus_switch_noise_reduction_params, + post_keyswitch_ciphertext_modulus, + } = value; + + Self { + lwe_dimension: LweDimension(lwe_dimension), + glwe_dimension: GlweDimension(glwe_dimension), + polynomial_size: PolynomialSize(polynomial_size), + lwe_noise_distribution: lwe_noise_distribution.into(), + glwe_noise_distribution: glwe_noise_distribution.into(), + pbs_base_log: DecompositionBaseLog(pbs_base_log), + pbs_level: DecompositionLevelCount(pbs_level), + ks_base_log: DecompositionBaseLog(ks_base_log), + ks_level: DecompositionLevelCount(ks_level), + message_modulus: MessageModulus(message_modulus as u64), + carry_modulus: CarryModulus(carry_modulus as u64), + max_noise_level: MaxNoiseLevel::new(max_noise_level as u64), + log2_p_fail, + post_keyswitch_ciphertext_modulus: CiphertextModulus32::try_new( + post_keyswitch_ciphertext_modulus, + ) + .unwrap(), + ciphertext_modulus: CiphertextModulus::try_new(ciphertext_modulus).unwrap(), + modulus_switch_noise_reduction_params: modulus_switch_noise_reduction_params.into(), + } + } +} + impl From for AtomicPatternParameters { fn from(value: TestParameterSet) -> Self { match value { @@ -204,6 +240,11 @@ impl From for AtomicPatternParameters { classic.into() } + TestParameterSet::TestKS32ParameterSet(test_ks32_parameter_set) => { + let ks32 = KeySwitch32PBSParameters::from(test_ks32_parameter_set); + + ks32.into() + } } } } diff --git a/utils/tfhe-backward-compat-data/src/generate.rs b/utils/tfhe-backward-compat-data/src/generate.rs index 1763b34b5..51a95ce4a 100644 --- a/utils/tfhe-backward-compat-data/src/generate.rs +++ b/utils/tfhe-backward-compat-data/src/generate.rs @@ -13,9 +13,9 @@ use tfhe_versionable::{Versionize as VersionizeTfhe_0_10, Versionize as Versioni use crate::{ data_dir, dir_for_version, TestClassicParameterSet, TestCompactPublicKeyEncryptionParameters, - TestCompressionParameterSet, TestDistribution, TestKeySwitchingParams, TestMetadata, - TestModulusSwitchNoiseReductionParams, TestModulusSwitchType, TestMultiBitParameterSet, - TestNoiseSquashingCompressionParameters, TestNoiseSquashingParams, + TestCompressionParameterSet, TestDistribution, TestKS32ParameterSet, TestKeySwitchingParams, + TestMetadata, TestModulusSwitchNoiseReductionParams, TestModulusSwitchType, + TestMultiBitParameterSet, TestNoiseSquashingCompressionParameters, TestNoiseSquashingParams, TestNoiseSquashingParamsMultiBit, TestParameterSet, }; @@ -66,6 +66,33 @@ pub const VALID_TEST_PARAMS_TUNIFORM: TestParameterSet = modulus_switch_noise_reduction_params: TestModulusSwitchType::Standard, }); +pub const VALID_TEST_PARAMS_KS32_TUNIFORM: TestParameterSet = + TestParameterSet::TestKS32ParameterSet(TestKS32ParameterSet { + lwe_dimension: 918, + glwe_dimension: 1, + polynomial_size: 2048, + lwe_noise_distribution: TestDistribution::TUniform { bound_log2: 13 }, + glwe_noise_distribution: TestDistribution::TUniform { bound_log2: 17 }, + pbs_base_log: 23, + pbs_level: 1, + ks_base_log: 4, + ks_level: 4, + message_modulus: 4, + carry_modulus: 4, + max_noise_level: 5, + log2_p_fail: -129.358380844, + ciphertext_modulus: 1 << 64, + modulus_switch_noise_reduction_params: TestModulusSwitchType::DriftTechniqueNoiseReduction( + TestModulusSwitchNoiseReductionParams { + modulus_switch_zeros_count: 1449, + ms_bound: 67108864f64, + ms_r_sigma_factor: 13.179851302864899f64, + ms_input_variance: 2.63039392929833E-7f64, + }, + ), + post_keyswitch_ciphertext_modulus: 1 << 32, + }); + /// Those parameters are insecure and are used to generate small legacy public keys pub const INSECURE_SMALL_PK_TEST_PARAMS: TestParameterSet = TestParameterSet::TestClassicParameterSet(TestClassicParameterSet { diff --git a/utils/tfhe-backward-compat-data/src/lib.rs b/utils/tfhe-backward-compat-data/src/lib.rs index dc1c24059..630f01d90 100644 --- a/utils/tfhe-backward-compat-data/src/lib.rs +++ b/utils/tfhe-backward-compat-data/src/lib.rs @@ -80,6 +80,26 @@ pub struct TestMultiBitParameterSet { pub grouping_factor: usize, } +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct TestKS32ParameterSet { + pub lwe_dimension: usize, + pub glwe_dimension: usize, + pub polynomial_size: usize, + pub lwe_noise_distribution: TestDistribution, + pub glwe_noise_distribution: TestDistribution, + pub pbs_base_log: usize, + pub pbs_level: usize, + pub ks_base_log: usize, + pub ks_level: usize, + pub message_modulus: usize, + pub ciphertext_modulus: u128, + pub carry_modulus: usize, + pub max_noise_level: usize, + pub log2_p_fail: f64, + pub modulus_switch_noise_reduction_params: TestModulusSwitchType, + pub post_keyswitch_ciphertext_modulus: u128, +} + #[derive(Serialize, Deserialize, Clone, Debug)] pub struct TestModulusSwitchNoiseReductionParams { pub modulus_switch_zeros_count: usize, @@ -277,6 +297,7 @@ pub struct HlClientKeyTest { pub enum TestParameterSet { TestClassicParameterSet(TestClassicParameterSet), TestMultiBitParameterSet(TestMultiBitParameterSet), + TestKS32ParameterSet(TestKS32ParameterSet), } #[allow(dead_code)] @@ -296,6 +317,9 @@ impl TestParameterSet { TestParameterSet::TestMultiBitParameterSet(test_multi_bit_parameter_set) => { test_multi_bit_parameter_set.polynomial_size } + TestParameterSet::TestKS32ParameterSet(test_ks32_parameter_set) => { + test_ks32_parameter_set.polynomial_size + } } } @@ -307,6 +331,9 @@ impl TestParameterSet { TestParameterSet::TestMultiBitParameterSet(test_multi_bit_parameter_set) => { test_multi_bit_parameter_set.glwe_dimension } + TestParameterSet::TestKS32ParameterSet(test_ks32_parameter_set) => { + test_ks32_parameter_set.glwe_dimension + } } } const fn lwe_noise_distribution(&self) -> TestDistribution { @@ -317,6 +344,9 @@ impl TestParameterSet { TestParameterSet::TestMultiBitParameterSet(test_multi_bit_parameter_set) => { test_multi_bit_parameter_set.lwe_noise_distribution } + TestParameterSet::TestKS32ParameterSet(test_ks32_parameter_set) => { + test_ks32_parameter_set.lwe_noise_distribution + } } } const fn ciphertext_modulus(&self) -> u128 { @@ -327,6 +357,9 @@ impl TestParameterSet { TestParameterSet::TestMultiBitParameterSet(test_multi_bit_parameter_set) => { test_multi_bit_parameter_set.ciphertext_modulus } + TestParameterSet::TestKS32ParameterSet(test_ks32_parameter_set) => { + test_ks32_parameter_set.ciphertext_modulus + } } } const fn message_modulus(&self) -> usize { @@ -337,6 +370,9 @@ impl TestParameterSet { TestParameterSet::TestMultiBitParameterSet(test_multi_bit_parameter_set) => { test_multi_bit_parameter_set.message_modulus } + TestParameterSet::TestKS32ParameterSet(test_ks32_parameter_set) => { + test_ks32_parameter_set.message_modulus + } } } const fn carry_modulus(&self) -> usize { @@ -347,6 +383,9 @@ impl TestParameterSet { TestParameterSet::TestMultiBitParameterSet(test_multi_bit_parameter_set) => { test_multi_bit_parameter_set.carry_modulus } + TestParameterSet::TestKS32ParameterSet(test_ks32_parameter_set) => { + test_ks32_parameter_set.carry_modulus + } } } }