tfhe/shortint/parameters/
classic.rs1use crate::core_crypto::prelude::{LweCiphertextConformanceParams, MsDecompressionType};
2use crate::shortint::backward_compatibility::parameters::ClassicPBSParametersVersions;
3use crate::shortint::parameters::{
4 AtomicPatternKind, CarryModulus, CiphertextConformanceParams, CiphertextModulus,
5 DecompositionBaseLog, DecompositionLevelCount, Degree, DynamicDistribution,
6 EncryptionKeyChoice, GlweDimension, LweDimension, MaxNoiseLevel, MessageModulus,
7 ModulusSwitchNoiseReductionParams, NoiseLevel, PBSOrder, PolynomialSize,
8};
9
10use serde::{Deserialize, Serialize};
11use tfhe_versionable::Versionize;
12
13#[derive(Serialize, Copy, Clone, Deserialize, Debug, PartialEq, Versionize)]
32#[versionize(ClassicPBSParametersVersions)]
33pub struct ClassicPBSParameters {
34 pub lwe_dimension: LweDimension,
35 pub glwe_dimension: GlweDimension,
36 pub polynomial_size: PolynomialSize,
37 pub lwe_noise_distribution: DynamicDistribution<u64>,
38 pub glwe_noise_distribution: DynamicDistribution<u64>,
39 pub pbs_base_log: DecompositionBaseLog,
40 pub pbs_level: DecompositionLevelCount,
41 pub ks_base_log: DecompositionBaseLog,
42 pub ks_level: DecompositionLevelCount,
43 pub message_modulus: MessageModulus,
44 pub carry_modulus: CarryModulus,
45 pub max_noise_level: MaxNoiseLevel,
46 pub log2_p_fail: f64,
47 pub ciphertext_modulus: CiphertextModulus,
48 pub encryption_key_choice: EncryptionKeyChoice,
49 pub modulus_switch_noise_reduction_params: Option<ModulusSwitchNoiseReductionParams>,
50}
51
52impl ClassicPBSParameters {
53 #[allow(clippy::too_many_arguments)]
61 pub fn new(
62 lwe_dimension: LweDimension,
63 glwe_dimension: GlweDimension,
64 polynomial_size: PolynomialSize,
65 lwe_noise_distribution: DynamicDistribution<u64>,
66 glwe_noise_distribution: DynamicDistribution<u64>,
67 pbs_base_log: DecompositionBaseLog,
68 pbs_level: DecompositionLevelCount,
69 ks_base_log: DecompositionBaseLog,
70 ks_level: DecompositionLevelCount,
71 message_modulus: MessageModulus,
72 carry_modulus: CarryModulus,
73 max_noise_level: MaxNoiseLevel,
74 log2_p_fail: f64,
75 ciphertext_modulus: CiphertextModulus,
76 encryption_key_choice: EncryptionKeyChoice,
77 modulus_switch_noise_reduction_params: Option<ModulusSwitchNoiseReductionParams>,
78 ) -> Self {
79 Self {
80 lwe_dimension,
81 glwe_dimension,
82 polynomial_size,
83 lwe_noise_distribution,
84 glwe_noise_distribution,
85 pbs_base_log,
86 pbs_level,
87 ks_base_log,
88 ks_level,
89 message_modulus,
90 carry_modulus,
91 max_noise_level,
92 log2_p_fail,
93 ciphertext_modulus,
94 encryption_key_choice,
95 modulus_switch_noise_reduction_params,
96 }
97 }
98
99 pub fn to_shortint_conformance_param(&self) -> CiphertextConformanceParams {
100 let (atomic_pattern, expected_dim) = match self.encryption_key_choice {
101 EncryptionKeyChoice::Big => (
102 AtomicPatternKind::Standard(PBSOrder::KeyswitchBootstrap),
103 self.glwe_dimension
104 .to_equivalent_lwe_dimension(self.polynomial_size),
105 ),
106 EncryptionKeyChoice::Small => (
107 AtomicPatternKind::Standard(PBSOrder::BootstrapKeyswitch),
108 self.lwe_dimension,
109 ),
110 };
111
112 let message_modulus = self.message_modulus;
113 let ciphertext_modulus = self.ciphertext_modulus;
114 let carry_modulus = self.carry_modulus;
115
116 let degree = Degree::new(message_modulus.0 - 1);
117
118 let noise_level = NoiseLevel::NOMINAL;
119
120 CiphertextConformanceParams {
121 ct_params: LweCiphertextConformanceParams {
122 lwe_dim: expected_dim,
123 ct_modulus: ciphertext_modulus,
124 ms_decompression_method: MsDecompressionType::ClassicPbs,
125 },
126 message_modulus,
127 carry_modulus,
128 atomic_pattern,
129 degree,
130 noise_level,
131 }
132 }
133}