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