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