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, VecZnxApi, 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,
17 Elem<T>: Infos + ElemVecZnx<T>,
18{
19 pub fn n(&self) -> usize {
20 self.0.n()
21 }
22
23 pub fn log_q(&self) -> usize {
24 self.0.log_q
25 }
26
27 pub fn rows(&self) -> usize {
28 self.0.rows()
29 }
30
31 pub fn cols(&self) -> usize {
32 self.0.cols()
33 }
34
35 pub fn at(&self, i: usize) -> &T {
36 self.0.at(i)
37 }
38
39 pub fn at_mut(&mut self, i: usize) -> &mut T {
40 self.0.at_mut(i)
41 }
42
43 pub fn log_base2k(&self) -> usize {
44 self.0.log_base2k
45 }
46
47 pub fn log_scale(&self) -> usize {
48 self.0.log_scale
49 }
50
51 pub fn zero(&mut self) {
52 self.0.zero()
53 }
54
55 pub fn as_plaintext(&self) -> Plaintext<T> {
56 unsafe { Plaintext::<T>(std::ptr::read(&self.0)) }
57 }
58}
59
60impl Parameters {
61 pub fn new_ciphertext(&self, log_q: usize) -> Ciphertext<VecZnx> {
62 Ciphertext::new(self.module(), self.log_base2k(), log_q, 2)
63 }
64}
65
66pub fn new_gadget_ciphertext(
67 module: &Module,
68 log_base2k: usize,
69 rows: usize,
70 log_q: usize,
71) -> Ciphertext<VmpPMat> {
72 let cols: usize = (log_q + log_base2k - 1) / log_base2k;
73 let mut elem: Elem<VmpPMat> = Elem::<VmpPMat>::new(module, log_base2k, rows, 2 * cols);
74 elem.log_q = log_q;
75 Ciphertext(elem)
76}
77
78pub fn new_rgsw_ciphertext(
79 module: &Module,
80 log_base2k: usize,
81 rows: usize,
82 log_q: usize,
83) -> Ciphertext<VmpPMat> {
84 let cols: usize = (log_q + log_base2k - 1) / log_base2k;
85 let mut elem: Elem<VmpPMat> = Elem::<VmpPMat>::new(module, log_base2k, 2 * rows, 2 * cols);
86 elem.log_q = log_q;
87 Ciphertext(elem)
88}
89
90impl Ciphertext<VmpPMat> {
91 pub fn n(&self) -> usize {
92 self.0.n()
93 }
94
95 pub fn rows(&self) -> usize {
96 self.0.rows()
97 }
98
99 pub fn cols(&self) -> usize {
100 self.0.cols()
101 }
102
103 pub fn log_base2k(&self) -> usize {
104 self.0.log_base2k
105 }
106
107 pub fn log_q(&self) -> usize {
108 self.0.log_q
109 }
110}