poulpy/core/src/lwe/encryption.rs
core/src/lwe/encryption.rsRaw
1use backend::{AddNormal, FillUniform, VecZnx, ZnxView, ZnxViewMut, alloc_aligned};
2use sampling::source::Source;
3
4use crate::{Infos, LWECiphertext, LWESecret, SIX_SIGMA, lwe::LWEPlaintext};
5
6impl<DataSelf> LWECiphertext<DataSelf>
7where
8 DataSelf: AsMut<[u8]> + AsRef<[u8]>,
9{
10 pub fn encrypt_sk<DataPt, DataSk>(
11 &mut self,
12 pt: &LWEPlaintext<DataPt>,
13 sk: &LWESecret<DataSk>,
14 source_xa: &mut Source,
15 source_xe: &mut Source,
16 sigma: f64,
17 ) where
18 DataPt: AsRef<[u8]>,
19 DataSk: AsRef<[u8]>,
20 {
21 #[cfg(debug_assertions)]
22 {
23 assert_eq!(self.n(), sk.n())
24 }
25
26 let basek: usize = self.basek();
27
28 self.data.fill_uniform(basek, 0, self.size(), source_xa);
29 let mut tmp_znx: VecZnx<Vec<u8>> = VecZnx::<Vec<u8>>::new::<i64>(1, 1, self.size());
30
31 (0..self.size()).for_each(|i| {
32 tmp_znx.at_mut(0, i)[0] = pt.data.at(0, i)[0]
33 - self.data.at(0, i)[1..]
34 .iter()
35 .zip(sk.data.at(0, 0))
36 .map(|(x, y)| x * y)
37 .sum::<i64>();
38 });
39
40 tmp_znx.add_normal(basek, 0, self.k(), source_xe, sigma, sigma * SIX_SIGMA);
41
42 let mut tmp_bytes: Vec<u8> = alloc_aligned(size_of::<i64>());
43
44 tmp_znx.normalize(basek, 0, &mut tmp_bytes);
45
46 (0..self.size()).for_each(|i| {
47 self.data.at_mut(0, i)[0] = tmp_znx.at(0, i)[0];
48 });
49 }
50}