chore(backward): add data for ks32 client key, server key and ct

This commit is contained in:
Nicolas Sarlin
2025-10-07 12:32:18 +02:00
committed by tmontaigu
parent bc1b87a60c
commit 69b8cc28e2
24 changed files with 484 additions and 130 deletions

View File

@@ -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<TestSuccess, TestFailure> {
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();

View File

@@ -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<u64> {
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<T: UnsignedInteger>(value: &TestDistribution) -> DynamicDistribution<T> {
match value {
TestDistribution::Gaussian { stddev } => {
DynamicDistribution::new_gaussian_from_std_dev(StandardDev(*stddev))
@@ -156,7 +208,7 @@ fn convert_distribution(value: &TestDistribution) -> DynamicDistribution<u64> {
}
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(

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:352e24179fce9825d2307aa22eba04720fc7b843cc6d1da9323e69cb5fb25fe5
size 20416

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7e30f9546fcc51e73ef6ca22eded0a4aec1dcb652aad4243c7829929e27d316c
size 3911

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1de50df828dd9ee6437166fb6834bcc78c0a612105d0d19f2f368037c2b2f1de
size 30120017

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:575be122c83ea5e28ed94ad68f872ab4f08de5d02c8e2546835e0e1eb4dfb2a6
size 33890392

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ea7d1047ad327fb5becaf8caf1d8abafef0dc0bc1b3787e1a3d5930b8a48ec03
size 66000

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:92be19b5d81e37787d9388640330f7246f6c76807592e6f0c00edd86275deb3b
size 74489

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:50649cb65a53f9122380c678a5ec0ff3fae684eb7a986bbc414dd71ceaba69ab
size 95632153

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2cdc9c1cac3f76c5bb7fdc73321d7dc1b4aa1a9a60938a9ebd8cf5000ed7e456
size 115754494

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1d1f9127b621084669da234edfb15d6ec0a9811b4a11920f214f6a70710bcefd
size 856624
oid sha256:88a1a47bc58e2aec2b7e5faba7cbdc600e7385593a33d7161f52313083a91e87
size 856640

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:827caa582a73af08043012732444f4ea89eaa445095b4cfc0b8dfb2a193f504d
size 972494
oid sha256:8cd2da944ad6db78d97aa57654b7af06909a533351bd6ee2a549a403706b0c96
size 972576

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:523fb601cb28251fce9fbf4a784b890336bda2cfd1b3db64c996cb89fc38f212
size 15614960
oid sha256:deca2b114a824f87ff300f8944b3728adfebe7c2e1565fb6b734edf6c585d3d6
size 15614972

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:147dd3b499ce1385aeba3d54e60b12eff302ddbd98d3b218cb9972a0321251f2
size 17632589
oid sha256:a0ece66b9389488cb17d8bd69159883df958d4fa8abc63390d12e95f72e53673
size 17632623

View File

@@ -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",

View File

@@ -126,6 +126,9 @@ impl From<TestParameterSet> 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")
}
}
}
}

View File

@@ -136,6 +136,9 @@ impl From<TestParameterSet> 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")
}
}
}
}

View File

@@ -152,6 +152,9 @@ impl From<TestParameterSet> 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")
}
}
}
}

View File

@@ -159,6 +159,9 @@ impl From<TestParameterSet> 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")
}
}
}
}

View File

@@ -162,6 +162,9 @@ impl From<TestParameterSet> 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")
}
}
}
}

View File

@@ -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<TestDistribution> for DynamicDistribution<u64> {
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<TestDistribution> for DynamicDistribution<u128> {
impl<T> From<TestDistribution> for DynamicDistribution<T>
where
T: UnsignedInteger,
{
fn from(value: TestDistribution) -> Self {
match value {
TestDistribution::Gaussian { stddev } => {
@@ -191,6 +185,51 @@ impl From<TestMultiBitParameterSet> for MultiBitPBSParameters {
}
}
impl From<TestKS32ParameterSet> 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<TestParameterSet> for AtomicPatternParameters {
fn from(value: TestParameterSet) -> Self {
match value {
@@ -204,6 +243,11 @@ impl From<TestParameterSet> 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),
]
}
}

View File

@@ -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<TestDistribution> for DynamicDistribution<u64> {
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<TestDistribution> for DynamicDistribution<u128> {
impl<T> From<TestDistribution> for DynamicDistribution<T>
where
T: UnsignedInteger,
{
fn from(value: TestDistribution) -> Self {
match value {
TestDistribution::Gaussian { stddev } => {
@@ -191,6 +182,51 @@ impl From<TestMultiBitParameterSet> for MultiBitPBSParameters {
}
}
impl From<TestKS32ParameterSet> 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<TestParameterSet> for AtomicPatternParameters {
fn from(value: TestParameterSet) -> Self {
match value {
@@ -204,6 +240,11 @@ impl From<TestParameterSet> for AtomicPatternParameters {
classic.into()
}
TestParameterSet::TestKS32ParameterSet(test_ks32_parameter_set) => {
let ks32 = KeySwitch32PBSParameters::from(test_ks32_parameter_set);
ks32.into()
}
}
}
}

View File

@@ -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 {

View File

@@ -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
}
}
}
}