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}