poulpy/rlwe/src/plaintext.rs
rlwe/src/plaintext.rsRaw
1use crate::ciphertext::Ciphertext;
2use crate::elem::{Elem, ElemCommon, ElemVecZnx, VecZnxCommon};
3use crate::parameters::Parameters;
4use base2k::{Module, VecZnx};
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<Owned = T>,
16 Elem<T>: 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<Owned = T>,
24 Elem<T>: 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<Owned = T>,
39 Elem<T>: 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 as_ciphertext(&self) -> Ciphertext<T> {
50 unsafe { Ciphertext::<T>(std::ptr::read(&self.0)) }
51 }
52}
53
54impl<T> ElemCommon<T> for Plaintext<T>
55where
56 T: VecZnxCommon<Owned = T>,
57 Elem<T>: ElemVecZnx<T>,
58{
59 fn n(&self) -> usize {
60 self.0.n()
61 }
62
63 fn log_n(&self) -> usize {
64 self.elem().log_n()
65 }
66
67 fn log_q(&self) -> usize {
68 self.0.log_q
69 }
70
71 fn elem(&self) -> &Elem<T> {
72 &self.0
73 }
74
75 fn elem_mut(&mut self) -> &mut Elem<T> {
76 &mut self.0
77 }
78
79 fn size(&self) -> usize {
80 self.elem().size()
81 }
82
83 fn rows(&self) -> usize {
84 self.0.rows()
85 }
86
87 fn cols(&self) -> usize {
88 self.0.cols()
89 }
90
91 fn at(&self, i: usize) -> &T {
92 self.0.at(i)
93 }
94
95 fn at_mut(&mut self, i: usize) -> &mut T {
96 self.0.at_mut(i)
97 }
98
99 fn log_base2k(&self) -> usize {
100 self.0.log_base2k()
101 }
102
103 fn log_scale(&self) -> usize {
104 self.0.log_scale()
105 }
106}