poulpy_core/default/encryption/
mod.rs1#![allow(clippy::too_many_arguments)]
31
32pub mod compressed;
33pub mod gglwe;
34pub mod gglwe_to_ggsw_key;
35pub mod ggsw;
36pub mod glwe;
37pub mod glwe_automorphism_key;
38pub mod glwe_public_key;
39pub mod glwe_switching_key;
40pub mod glwe_tensor_key;
41pub mod glwe_to_lwe_key;
42pub mod lwe;
43pub mod lwe_switching_key;
44pub mod lwe_to_glwe_key;
45
46pub use crate::api::{EncryptionInfos, GGSWEncryptSk, GLWEEncryptSk, GLWEMaskFill, LWEFillMask};
47pub use compressed::*;
48pub use gglwe::*;
49pub use gglwe_to_ggsw_key::*;
50pub use ggsw::*;
51pub use glwe::*;
52pub use glwe_automorphism_key::*;
53pub use glwe_public_key::*;
54pub use glwe_switching_key::*;
55pub use glwe_tensor_key::*;
56pub use glwe_to_lwe_key::*;
57pub use lwe::*;
58pub use lwe_switching_key::*;
59pub use lwe_to_glwe_key::*;
60use poulpy_hal::layouts::NoiseInfos;
61
62use crate::layouts::{GGLWEInfos, GGSWInfos, GLWEInfos, LWEInfos, TorusPrecision};
63use anyhow::Result;
64
65pub const DEFAULT_SIGMA_XE: f64 = 3.2;
68
69pub const DEFAULT_BOUND_XE: f64 = 6.0 * DEFAULT_SIGMA_XE;
72
73#[derive(Debug)]
74pub struct EncryptionLayout<L> {
75 pub layout: L,
76 pub noise: NoiseInfos,
77}
78
79impl<L: LWEInfos> EncryptionLayout<L> {
80 pub fn new(layout: L, noise: NoiseInfos) -> Result<Self> {
81 anyhow::ensure!(
82 noise.k <= layout.k().as_usize(),
83 "k_xe: {} > layout.k(): {}",
84 noise.k,
85 layout.k()
86 );
87 Ok(Self { layout, noise })
88 }
89
90 pub fn new_from_default_sigma(layout: L) -> Result<Self> {
91 let noise = NoiseInfos::new(layout.k().as_usize(), DEFAULT_SIGMA_XE, DEFAULT_BOUND_XE)?;
95 Self::new(layout, noise)
96 }
97}
98
99impl<L> EncryptionInfos for EncryptionLayout<L> {
100 fn noise_infos(&self) -> NoiseInfos {
101 self.noise
102 }
103}
104
105impl EncryptionInfos for NoiseInfos {
106 fn noise_infos(&self) -> NoiseInfos {
107 *self
108 }
109}
110
111impl<L: LWEInfos> LWEInfos for EncryptionLayout<L> {
112 fn base2k(&self) -> crate::layouts::Base2K {
113 self.layout.base2k()
114 }
115
116 fn n(&self) -> crate::layouts::Degree {
117 self.layout.n()
118 }
119
120 fn max_size(&self) -> usize {
121 self.layout.max_size()
122 }
123
124 fn size(&self) -> usize {
125 self.layout.size()
126 }
127
128 fn k(&self) -> TorusPrecision {
129 self.layout.k()
130 }
131}
132
133impl<L: GLWEInfos> GLWEInfos for EncryptionLayout<L> {
134 fn rank(&self) -> crate::layouts::Rank {
135 self.layout.rank()
136 }
137}
138
139impl<L: GGLWEInfos> GGLWEInfos for EncryptionLayout<L> {
140 fn k_aux(&self) -> crate::layouts::TorusPrecision {
141 self.layout.k_aux()
142 }
143
144 fn dnum(&self) -> crate::layouts::Dnum {
145 self.layout.dnum()
146 }
147
148 fn dsize(&self) -> crate::layouts::Dsize {
149 self.layout.dsize()
150 }
151
152 fn rank_in(&self) -> crate::layouts::Rank {
153 self.layout.rank_in()
154 }
155
156 fn rank_out(&self) -> crate::layouts::Rank {
157 self.layout.rank_out()
158 }
159}
160
161impl<L: GGSWInfos> GGSWInfos for EncryptionLayout<L> {
162 fn k_aux(&self) -> crate::layouts::TorusPrecision {
163 self.layout.k_aux()
164 }
165
166 fn dnum(&self) -> crate::layouts::Dnum {
167 self.layout.dnum()
168 }
169
170 fn dsize(&self) -> crate::layouts::Dsize {
171 self.layout.dsize()
172 }
173}