poulpy/rlwe/src/ciphertext.rs
rlwe/src/ciphertext.rsRaw
1use crate::elem::{Elem, ElemBasics};
2use crate::parameters::Parameters;
3use crate::plaintext::Plaintext;
4use base2k::{Infos, Module, VecZnx, VecZnxApi, VmpPMat, VmpPMatOps};
5
6pub struct Ciphertext(pub Elem<VecZnx>);
7
8impl Ciphertext {
9 pub fn new(
10 module: &Module,
11 log_base2k: usize,
12 log_q: usize,
13 degree: usize,
14 log_scale: usize,
15 ) -> Self {
16 Self(Elem::new(module, log_base2k, log_q, degree, log_scale))
17 }
18
19 pub fn n(&self) -> usize {
20 self.0.n()
21 }
22
23 pub fn degree(&self) -> usize {
24 self.0.degree()
25 }
26
27 pub fn log_q(&self) -> usize {
28 self.0.log_q()
29 }
30
31 pub fn limbs(&self) -> usize {
32 self.0.limbs()
33 }
34
35 pub fn at(&self, i: usize) -> &(impl VecZnxApi + Infos) {
36 self.0.at(i)
37 }
38
39 pub fn at_mut(&mut self, i: usize) -> &mut (impl VecZnxApi + Infos) {
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<VecZnx> {
56 unsafe { Plaintext(std::ptr::read(&self.0)) }
57 }
58}
59
60impl Parameters {
61 pub fn new_ciphertext(&self, log_q: usize) -> Ciphertext {
62 Ciphertext::new(self.module(), self.log_base2k(), log_q, self.log_scale(), 1)
63 }
64}
65
66pub struct GadgetCiphertext {
67 pub value: VmpPMat,
68 pub log_base2k: usize,
69 pub log_q: usize,
70}
71
72impl GadgetCiphertext {
73 pub fn new(module: &Module, log_base2k: usize, rows: usize, log_q: usize) -> Self {
74 let cols: usize = (log_q + log_base2k - 1) / log_base2k;
75 Self {
76 value: module.new_vmp_pmat(rows, cols * 2),
77 log_base2k,
78 log_q,
79 }
80 }
81
82 pub fn n(&self) -> usize {
83 self.value.n
84 }
85
86 pub fn rows(&self) -> usize {
87 self.value.rows
88 }
89
90 pub fn cols(&self) -> usize {
91 self.value.cols
92 }
93
94 pub fn log_q(&self) -> usize {
95 self.log_q
96 }
97
98 pub fn log_base2k(&self) -> usize {
99 self.log_base2k
100 }
101}
102
103pub struct RGSWCiphertext {
104 pub value: VmpPMat,
105 pub log_base2k: usize,
106 pub log_q: usize,
107}
108
109impl RGSWCiphertext {
110 pub fn new(module: &Module, log_base2k: usize, rows: usize, log_q: usize) -> Self {
111 let cols: usize = (log_q + log_base2k - 1) / log_base2k;
112 Self {
113 value: module.new_vmp_pmat(rows * 2, cols * 2),
114 log_base2k,
115 log_q,
116 }
117 }
118
119 pub fn n(&self) -> usize {
120 self.value.n
121 }
122
123 pub fn rows(&self) -> usize {
124 self.value.rows
125 }
126
127 pub fn cols(&self) -> usize {
128 self.value.cols
129 }
130
131 pub fn log_q(&self) -> usize {
132 self.log_q
133 }
134
135 pub fn log_base2k(&self) -> usize {
136 self.log_base2k
137 }
138}