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