1#![allow(clippy::excessive_precision)]
2use crate::conformance::ListSizeConstraint;
3use crate::integer::key_switching_key::KeySwitchingKeyView;
4use crate::integer::server_key::ServerKey;
5use crate::shortint::parameters::{
6 CarryModulus, CiphertextConformanceParams, EncryptionKeyChoice, MessageModulus,
7};
8pub use crate::shortint::parameters::{
9 DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension,
10 LweDimension, PolynomialSize, StandardDev,
11};
12use crate::shortint::PBSParameters;
13pub use crate::shortint::{CiphertextModulus, ClassicPBSParameters, WopbsParameters};
14
15#[derive(Clone, Copy)]
16pub enum IntegerCompactCiphertextListExpansionMode<'key> {
17 CastAndUnpackIfNecessary(KeySwitchingKeyView<'key>),
19 UnpackAndSanitizeIfNecessary(&'key ServerKey),
21 NoCastingAndNoUnpacking,
22}
23
24pub const ALL_PARAMETER_VEC_INTEGER_16_BITS: [WopbsParameters; 2] = [
25 PARAM_MESSAGE_4_CARRY_4_KS_PBS_16_BITS,
26 PARAM_MESSAGE_2_CARRY_2_KS_PBS_16_BITS,
27];
28
29pub const PARAM_MESSAGE_4_CARRY_4_KS_PBS_16_BITS: WopbsParameters = WopbsParameters {
30 lwe_dimension: LweDimension(481),
31 glwe_dimension: GlweDimension(1),
32 polynomial_size: PolynomialSize(2048),
33 lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
34 0.00061200133780220371345,
35 )),
36 glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
37 0.00000000000000022148688116005568513645324585951,
38 )),
39 pbs_base_log: DecompositionBaseLog(9),
40 pbs_level: DecompositionLevelCount(4),
41 ks_level: DecompositionLevelCount(9),
42 ks_base_log: DecompositionBaseLog(1),
43 pfks_level: DecompositionLevelCount(4),
44 pfks_base_log: DecompositionBaseLog(9),
45 pfks_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
46 0.00000000000000022148688116005568513645324585951,
47 )),
48 cbs_level: DecompositionLevelCount(4),
49 cbs_base_log: DecompositionBaseLog(6),
50 message_modulus: MessageModulus(16),
51 carry_modulus: CarryModulus(16),
52 ciphertext_modulus: CiphertextModulus::new_native(),
53 encryption_key_choice: EncryptionKeyChoice::Big,
54};
55
56pub const PARAM_MESSAGE_2_CARRY_2_KS_PBS_16_BITS: WopbsParameters = WopbsParameters {
57 lwe_dimension: LweDimension(493),
58 glwe_dimension: GlweDimension(1),
59 polynomial_size: PolynomialSize(2048),
60 lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
61 0.00049144710341316649172,
62 )),
63 glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
64 0.00000000000000022148688116005568513645324585951,
65 )),
66 pbs_base_log: DecompositionBaseLog(16),
67 pbs_level: DecompositionLevelCount(2),
68 ks_level: DecompositionLevelCount(5),
69 ks_base_log: DecompositionBaseLog(2),
70 pfks_level: DecompositionLevelCount(2),
71 pfks_base_log: DecompositionBaseLog(16),
72 pfks_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
73 0.00000000000000022148688116005568513645324585951,
74 )),
75 cbs_level: DecompositionLevelCount(6),
76 cbs_base_log: DecompositionBaseLog(3),
77 message_modulus: MessageModulus(4),
78 carry_modulus: CarryModulus(4),
79 ciphertext_modulus: CiphertextModulus::new_native(),
80 encryption_key_choice: EncryptionKeyChoice::Big,
81};
82
83pub const PARAM_MESSAGE_4_CARRY_4_KS_PBS_32_BITS: WopbsParameters = WopbsParameters {
84 lwe_dimension: LweDimension(481),
85 glwe_dimension: GlweDimension(1),
86 polynomial_size: PolynomialSize(2048),
87 lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
88 0.00061200133780220371345,
89 )),
90 glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
91 0.00000000000000022148688116005568513645324585951,
92 )),
93 pbs_base_log: DecompositionBaseLog(9),
94 pbs_level: DecompositionLevelCount(4),
95 ks_level: DecompositionLevelCount(9),
96 ks_base_log: DecompositionBaseLog(1),
97 pfks_level: DecompositionLevelCount(4),
98 pfks_base_log: DecompositionBaseLog(9),
99 pfks_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
100 0.00000000000000022148688116005568513645324585951,
101 )),
102 cbs_level: DecompositionLevelCount(4),
103 cbs_base_log: DecompositionBaseLog(6),
104 message_modulus: MessageModulus(16),
105 carry_modulus: CarryModulus(16),
106 ciphertext_modulus: CiphertextModulus::new_native(),
107 encryption_key_choice: EncryptionKeyChoice::Big,
108};
109
110pub const PARAM_MESSAGE_2_CARRY_2_KS_PBS_32_BITS: WopbsParameters = WopbsParameters {
111 lwe_dimension: LweDimension(481),
112 glwe_dimension: GlweDimension(1),
113 polynomial_size: PolynomialSize(2048),
114 lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
115 0.00061200133780220371345,
116 )),
117 glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
118 0.00000000000000022148688116005568513645324585951,
119 )),
120 pbs_base_log: DecompositionBaseLog(11),
121 pbs_level: DecompositionLevelCount(3),
122 ks_level: DecompositionLevelCount(9),
123 ks_base_log: DecompositionBaseLog(1),
124 pfks_level: DecompositionLevelCount(3),
125 pfks_base_log: DecompositionBaseLog(11),
126 pfks_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
127 0.00000000000000022148688116005568513645324585951,
128 )),
129 cbs_level: DecompositionLevelCount(6),
130 cbs_base_log: DecompositionBaseLog(3),
131 message_modulus: MessageModulus(4),
132 carry_modulus: CarryModulus(4),
133 ciphertext_modulus: CiphertextModulus::new_native(),
134 encryption_key_choice: EncryptionKeyChoice::Big,
135};
136
137pub const PARAM_MESSAGE_1_CARRY_1_KS_PBS_32_BITS: WopbsParameters = WopbsParameters {
138 lwe_dimension: LweDimension(493),
139 glwe_dimension: GlweDimension(1),
140 polynomial_size: PolynomialSize(2048),
141 lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
142 0.00049144710341316649172,
143 )),
144 glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
145 0.00000000000000022148688116005568513645324585951,
146 )),
147 pbs_base_log: DecompositionBaseLog(15),
148 pbs_level: DecompositionLevelCount(2),
149 ks_level: DecompositionLevelCount(5),
150 ks_base_log: DecompositionBaseLog(2),
151 pfks_level: DecompositionLevelCount(2),
152 pfks_base_log: DecompositionBaseLog(15),
153 pfks_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
154 0.00000000000000022148688116005568513645324585951,
155 )),
156 cbs_level: DecompositionLevelCount(5),
157 cbs_base_log: DecompositionBaseLog(3),
158 message_modulus: MessageModulus(2),
159 carry_modulus: CarryModulus(2),
160 ciphertext_modulus: CiphertextModulus::new_native(),
161 encryption_key_choice: EncryptionKeyChoice::Big,
162};
163
164#[derive(Copy, Clone)]
165pub struct RadixCiphertextConformanceParams {
166 pub shortint_params: CiphertextConformanceParams,
167 pub num_blocks_per_integer: usize,
168}
169
170impl RadixCiphertextConformanceParams {
174 pub fn to_ct_list_conformance_parameters(
175 &self,
176 list_constraint: ListSizeConstraint,
177 ) -> CompactCiphertextListConformanceParams {
178 CompactCiphertextListConformanceParams {
179 shortint_params: self.shortint_params,
180 num_elements_constraint: list_constraint,
181 }
182 }
183
184 pub fn from_pbs_parameters<P: Into<PBSParameters>>(
185 params: P,
186 num_blocks_per_integer: usize,
187 ) -> Self {
188 let params: PBSParameters = params.into();
189 Self {
190 shortint_params: params.to_shortint_conformance_param(),
191 num_blocks_per_integer,
192 }
193 }
194}
195
196#[derive(Copy, Clone)]
200pub struct CompactCiphertextListConformanceParams {
201 pub shortint_params: CiphertextConformanceParams,
202 pub num_elements_constraint: ListSizeConstraint,
203}