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