Skip to content

Commit 7724b78

Browse files
IceTDrinkernsarlin-zama
authored andcommitted
feat(shortint): allow the KS32 parameters to have non native KSK modulus
1 parent 597c61b commit 7724b78

File tree

6 files changed

+23
-22
lines changed

6 files changed

+23
-22
lines changed

tfhe/src/shortint/atomic_pattern/ks32.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ impl KS32AtomicPatternServerKey {
8383
params.ks_base_log(),
8484
params.ks_level(),
8585
pbs_params.lwe_noise_distribution(),
86-
CoreCiphertextModulus::new_native(), // Does it make sense to parametrize this ?
86+
pbs_params.post_keyswitch_ciphertext_modulus(),
8787
&mut engine.encryption_generator,
8888
);
8989

tfhe/src/shortint/atomic_pattern/standard.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,8 @@ impl AtomicPattern for StandardAtomicPatternServerKey {
153153

154154
fn apply_lookup_table_assign(&self, ct: &mut Ciphertext, acc: &LookupTableOwned) {
155155
ShortintEngine::with_thread_local_mut(|engine| {
156-
let (mut ciphertext_buffer, buffers) = engine.get_buffers(
157-
self.intermediate_lwe_dimension(),
158-
CiphertextModulus::new_native(),
159-
);
156+
let (mut ciphertext_buffer, buffers) =
157+
engine.get_buffers(self.intermediate_lwe_dimension(), self.ciphertext_modulus());
160158

161159
match self.pbs_order {
162160
PBSOrder::KeyswitchBootstrap => {
@@ -349,10 +347,8 @@ impl StandardAtomicPatternServerKey {
349347
let mut acc = lut.acc.clone();
350348

351349
ShortintEngine::with_thread_local_mut(|engine| {
352-
let (mut ciphertext_buffer, buffers) = engine.get_buffers(
353-
self.intermediate_lwe_dimension(),
354-
CiphertextModulus::new_native(),
355-
);
350+
let (mut ciphertext_buffer, buffers) =
351+
engine.get_buffers(self.intermediate_lwe_dimension(), self.ciphertext_modulus());
356352

357353
// Compute a key switch
358354
keyswitch_lwe_ciphertext(&self.key_switching_key, &ct.ct, &mut ciphertext_buffer);

tfhe/src/shortint/engine/server_side.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ use crate::shortint::atomic_pattern::AtomicPatternServerKey;
1111
use crate::shortint::ciphertext::MaxDegree;
1212
use crate::shortint::client_key::secret_encryption_key::SecretEncryptionKeyView;
1313
use crate::shortint::parameters::{
14-
CoreCiphertextModulus, EncryptionKeyChoice, KeySwitch32PBSParameters,
15-
ShortintKeySwitchingParameters,
14+
EncryptionKeyChoice, KeySwitch32PBSParameters, ShortintKeySwitchingParameters,
1615
};
1716
use crate::shortint::server_key::{
1817
CompressedModulusSwitchNoiseReductionKey, ModulusSwitchNoiseReductionKey,
@@ -109,7 +108,7 @@ impl ShortintEngine {
109108
modulus_switch_noise_reduction_params,
110109
in_key,
111110
self,
112-
CoreCiphertextModulus::new_native(),
111+
pbs_params.post_keyswitch_ciphertext_modulus,
113112
pbs_params.lwe_noise_distribution,
114113
)
115114
});

tfhe/src/shortint/parameters/ks32.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@ use serde::{Deserialize, Serialize};
22
use tfhe_versionable::Versionize;
33

44
pub use crate::core_crypto::commons::parameters::{
5-
CiphertextModulus as CoreCiphertextModulus, CiphertextModulusLog, DecompositionBaseLog,
6-
DecompositionLevelCount, DynamicDistribution, EncryptionKeyChoice, GlweDimension,
7-
LweBskGroupingFactor, LweCiphertextCount, LweDimension, NoiseEstimationMeasureBound,
8-
PolynomialSize, RSigmaFactor,
5+
CiphertextModulusLog, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution,
6+
EncryptionKeyChoice, GlweDimension, LweBskGroupingFactor, LweCiphertextCount, LweDimension,
7+
NoiseEstimationMeasureBound, PolynomialSize, RSigmaFactor,
98
};
109
use crate::core_crypto::prelude::{
1110
LweCiphertextConformanceParams, LweKeyswitchKeyConformanceParams, MsDecompressionType,
1211
};
1312
use crate::shortint::backward_compatibility::parameters::KeySwitch32PBSParametersVersions;
1413

1514
use super::{
16-
AtomicPatternKind, CarryModulus, CiphertextConformanceParams, CiphertextModulus, Degree,
17-
MaxNoiseLevel, MessageModulus, ModulusSwitchNoiseReductionParams, NoiseLevel,
15+
AtomicPatternKind, CarryModulus, CiphertextConformanceParams, CiphertextModulus,
16+
CiphertextModulus32, Degree, MaxNoiseLevel, MessageModulus, ModulusSwitchNoiseReductionParams,
17+
NoiseLevel,
1818
};
1919

2020
/// A set of cryptographic parameters used with the atomic pattern
@@ -35,6 +35,7 @@ pub struct KeySwitch32PBSParameters {
3535
pub carry_modulus: CarryModulus,
3636
pub max_noise_level: MaxNoiseLevel,
3737
pub log2_p_fail: f64,
38+
pub post_keyswitch_ciphertext_modulus: CiphertextModulus32,
3839
pub ciphertext_modulus: CiphertextModulus,
3940
pub modulus_switch_noise_reduction_params: Option<ModulusSwitchNoiseReductionParams>,
4041
}
@@ -49,8 +50,7 @@ impl From<&KeySwitch32PBSParameters> for LweKeyswitchKeyConformanceParams<u32> {
4950
input_lwe_dimension: value
5051
.glwe_dimension()
5152
.to_equivalent_lwe_dimension(value.polynomial_size()),
52-
// For the moment we only handle the native u32 modulus for the KSK
53-
ciphertext_modulus: CoreCiphertextModulus::new_native(),
53+
ciphertext_modulus: value.post_keyswitch_ciphertext_modulus(),
5454
}
5555
}
5656
}
@@ -104,6 +104,10 @@ impl KeySwitch32PBSParameters {
104104
self.max_noise_level
105105
}
106106

107+
pub const fn post_keyswitch_ciphertext_modulus(&self) -> CiphertextModulus32 {
108+
self.post_keyswitch_ciphertext_modulus
109+
}
110+
107111
pub const fn ciphertext_modulus(&self) -> CiphertextModulus {
108112
self.ciphertext_modulus
109113
}

tfhe/src/shortint/parameters/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ pub struct CarryModulus(pub u64);
100100

101101
/// Determines in what ring computations are made
102102
pub type CiphertextModulus = CoreCiphertextModulus<u64>;
103+
pub type CiphertextModulus32 = CoreCiphertextModulus<u32>;
103104

104105
impl From<&PBSConformanceParams> for LweBootstrapKeyConformanceParams<u64> {
105106
fn from(value: &PBSConformanceParams) -> Self {

tfhe/src/shortint/parameters/v1_1/ks32/tuniform/p_fail_2_minus_128/ks_pbs/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::core_crypto::prelude::DynamicDistribution;
22
use crate::shortint::parameters::{
3-
KeySwitch32PBSParameters, LweCiphertextCount, ModulusSwitchNoiseReductionParams,
4-
NoiseEstimationMeasureBound, RSigmaFactor, Variance,
3+
CiphertextModulus32, KeySwitch32PBSParameters, LweCiphertextCount,
4+
ModulusSwitchNoiseReductionParams, NoiseEstimationMeasureBound, RSigmaFactor, Variance,
55
};
66
use crate::shortint::prelude::{
77
DecompositionBaseLog, DecompositionLevelCount, GlweDimension, LweDimension, PolynomialSize,
@@ -25,6 +25,7 @@ pub const V1_1_PARAM_MESSAGE_2_CARRY_2_KS32_PBS_TUNIFORM_2M128: KeySwitch32PBSPa
2525
carry_modulus: CarryModulus(4),
2626
max_noise_level: MaxNoiseLevel::new(5),
2727
log2_p_fail: -129.358380844,
28+
post_keyswitch_ciphertext_modulus: CiphertextModulus32::new_native(),
2829
ciphertext_modulus: CiphertextModulus::new_native(),
2930
modulus_switch_noise_reduction_params: Some(ModulusSwitchNoiseReductionParams {
3031
modulus_switch_zeros_count: LweCiphertextCount(1449),

0 commit comments

Comments
 (0)