poulpy/rlwe/src/plaintext.rs
rlwe/src/plaintext.rsRaw
1use crate::ciphertext::Ciphertext;
2use crate::elem::{Elem, ElemCommon, ElemVecZnx};
3use crate::parameters::Parameters;
4use base2k::{LAYOUT, Module, VecZnx};
5
6pub struct Plaintext(pub Elem<VecZnx>);
7
8impl Parameters {
9 pub fn new_plaintext(&self, log_q: usize) -> Plaintext {
10 Plaintext::new(self.module(), self.log_base2k(), log_q)
11 }
12
13 pub fn bytes_of_plaintext(&self, log_q: usize) -> usize
14where {
15 Elem::<VecZnx>::bytes_of(self.module(), self.log_base2k(), log_q, 1)
16 }
17
18 pub fn plaintext_from_bytes(&self, log_q: usize, bytes: &mut [u8]) -> Plaintext {
19 Plaintext(Elem::<VecZnx>::from_bytes(
20 self.module(),
21 self.log_base2k(),
22 log_q,
23 1,
24 bytes,
25 ))
26 }
27}
28
29impl Plaintext {
30 pub fn new(module: &Module, log_base2k: usize, log_q: usize) -> Self {
31 Self(Elem::<VecZnx>::new(module, log_base2k, log_q, 1))
32 }
33}
34
35impl Plaintext {
36 pub fn bytes_of(module: &Module, log_base2k: usize, log_q: usize) -> usize {
37 Elem::<VecZnx>::bytes_of(module, log_base2k, log_q, 1)
38 }
39
40 pub fn from_bytes(module: &Module, log_base2k: usize, log_q: usize, bytes: &mut [u8]) -> Self {
41 Self(Elem::<VecZnx>::from_bytes(
42 module, log_base2k, log_q, 1, bytes,
43 ))
44 }
45
46 pub fn from_bytes_borrow(module: &Module, log_base2k: usize, log_q: usize, bytes: &mut [u8]) -> Self {
47 Self(Elem::<VecZnx>::from_bytes_borrow(
48 module, log_base2k, log_q, 1, bytes,
49 ))
50 }
51
52 pub fn as_ciphertext(&self) -> Ciphertext<VecZnx> {
53 unsafe { Ciphertext::<VecZnx>(std::ptr::read(&self.0)) }
54 }
55}
56
57impl ElemCommon<VecZnx> for Plaintext {
58 fn n(&self) -> usize {
59 self.0.n()
60 }
61
62 fn log_n(&self) -> usize {
63 self.elem().log_n()
64 }
65
66 fn log_q(&self) -> usize {
67 self.0.log_q
68 }
69
70 fn elem(&self) -> &Elem<VecZnx> {
71 &self.0
72 }
73
74 fn elem_mut(&mut self) -> &mut Elem<VecZnx> {
75 &mut self.0
76 }
77
78 fn size(&self) -> usize {
79 self.elem().size()
80 }
81
82 fn layout(&self) -> LAYOUT {
83 self.elem().layout()
84 }
85
86 fn rows(&self) -> usize {
87 self.0.rows()
88 }
89
90 fn cols(&self) -> usize {
91 self.0.cols()
92 }
93
94 fn at(&self, i: usize) -> &VecZnx {
95 self.0.at(i)
96 }
97
98 fn at_mut(&mut self, i: usize) -> &mut VecZnx {
99 self.0.at_mut(i)
100 }
101
102 fn log_base2k(&self) -> usize {
103 self.0.log_base2k()
104 }
105
106 fn log_scale(&self) -> usize {
107 self.0.log_scale()
108 }
109}