arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/rlwe/src/plaintext.rs
rlwe/src/plaintext.rsRaw
 1use crate::ciphertext::Ciphertext;
 2use crate::elem::{Elem, ElemVecZnx, VecZnxCommon};
 3use crate::parameters::Parameters;
 4use base2k::{Infos, Module, VecZnx, VecZnxApi};
 5
 6pub struct Plaintext<T>(pub Elem<T>);
 7
 8impl Parameters {
 9    pub fn new_plaintext(&self, log_q: usize) -> Plaintext<VecZnx> {
10        Plaintext::new(self.module(), self.log_base2k(), log_q)
11    }
12
13    pub fn bytes_of_plaintext<T>(&self, log_q: usize) -> usize
14    where
15        T: VecZnxCommon,
16        Elem<T>: Infos + ElemVecZnx<T>,
17    {
18        Elem::<T>::bytes_of(self.module(), self.log_base2k(), log_q, 1)
19    }
20
21    pub fn plaintext_from_bytes<T>(&self, log_q: usize, bytes: &mut [u8]) -> Plaintext<T>
22    where
23        T: VecZnxCommon,
24        Elem<T>: Infos + ElemVecZnx<T>,
25    {
26        Plaintext::<T>(self.elem_from_bytes::<T>(log_q, 1, bytes))
27    }
28}
29
30impl Plaintext<VecZnx> {
31    pub fn new(module: &Module, log_base2k: usize, log_q: usize) -> Self {
32        Self(Elem::<VecZnx>::new(module, log_base2k, log_q, 1))
33    }
34}
35
36impl<T> Plaintext<T>
37where
38    T: VecZnxCommon,
39    Elem<T>: Infos + ElemVecZnx<T>,
40{
41    pub fn bytes_of(module: &Module, log_base2k: usize, log_q: usize) -> usize {
42        Elem::<T>::bytes_of(module, log_base2k, log_q, 1)
43    }
44
45    pub fn from_bytes(module: &Module, log_base2k: usize, log_q: usize, bytes: &mut [u8]) -> Self {
46        Self(Elem::<T>::from_bytes(module, log_base2k, log_q, 1, bytes))
47    }
48
49    pub fn n(&self) -> usize {
50        self.0.n()
51    }
52
53    pub fn log_q(&self) -> usize {
54        self.0.log_q
55    }
56
57    pub fn rows(&self) -> usize {
58        self.0.rows()
59    }
60
61    pub fn cols(&self) -> usize {
62        self.0.cols()
63    }
64
65    pub fn at(&self, i: usize) -> &T {
66        self.0.at(i)
67    }
68
69    pub fn at_mut(&mut self, i: usize) -> &mut T {
70        self.0.at_mut(i)
71    }
72
73    pub fn log_base2k(&self) -> usize {
74        self.0.log_base2k()
75    }
76
77    pub fn log_scale(&self) -> usize {
78        self.0.log_scale()
79    }
80
81    pub fn zero(&mut self) {
82        self.0.zero()
83    }
84
85    pub fn as_ciphertext(&self) -> Ciphertext<T> {
86        unsafe { Ciphertext::<T>(std::ptr::read(&self.0)) }
87    }
88}