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, 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}