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