arnaucube
arnaucube/poulpyPublic Self-hosted repository
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}