poulpy/core/src/lwe/ciphertext.rs
core/src/lwe/ciphertext.rsRaw
1use backend::{VecZnx, VecZnxToMut, VecZnxToRef};
2
3use crate::{Infos, SetMetaData};
4
5pub struct LWECiphertext<D> {
6 pub(crate) data: VecZnx<D>,
7 pub(crate) k: usize,
8 pub(crate) basek: usize,
9}
10
11impl LWECiphertext<Vec<u8>> {
12 pub fn alloc(n: usize, basek: usize, k: usize) -> Self {
13 Self {
14 data: VecZnx::new::<i64>(n, 1, k.div_ceil(basek)),
15 k: k,
16 basek: basek,
17 }
18 }
19}
20
21impl<T> Infos for LWECiphertext<T> {
22 type Inner = VecZnx<T>;
23
24 fn n(&self) -> usize{
25 &self.inner().n-1
26 }
27
28 fn inner(&self) -> &Self::Inner {
29 &self.data
30 }
31
32 fn basek(&self) -> usize {
33 self.basek
34 }
35
36 fn k(&self) -> usize {
37 self.k
38 }
39}
40
41impl<DataSelf: AsMut<[u8]> + AsRef<[u8]>> SetMetaData for LWECiphertext<DataSelf> {
42 fn set_k(&mut self, k: usize) {
43 self.k = k
44 }
45
46 fn set_basek(&mut self, basek: usize) {
47 self.basek = basek
48 }
49}
50
51pub trait LWECiphertextToRef {
52 fn to_ref(&self) -> LWECiphertext<&[u8]>;
53}
54
55impl<D: AsRef<[u8]>> LWECiphertextToRef for LWECiphertext<D> {
56 fn to_ref(&self) -> LWECiphertext<&[u8]> {
57 LWECiphertext {
58 data: self.data.to_ref(),
59 basek: self.basek,
60 k: self.k,
61 }
62 }
63}
64
65pub trait LWECiphertextToMut {
66 fn to_mut(&mut self) -> LWECiphertext<&mut [u8]>;
67}
68
69impl<D: AsMut<[u8]> + AsRef<[u8]>> LWECiphertextToMut for LWECiphertext<D> {
70 fn to_mut(&mut self) -> LWECiphertext<&mut [u8]> {
71 LWECiphertext {
72 data: self.data.to_mut(),
73 basek: self.basek,
74 k: self.k,
75 }
76 }
77}