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