arnaucube
arnaucube/poulpyPublic Self-hosted repository
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, 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}