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