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::{Layout, 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(module: &Module, log_base2k: usize, log_q: usize, bytes: &mut [u8]) -> Self {
 47        Self(Elem::<VecZnx>::from_bytes_borrow(
 48            module, log_base2k, log_q, 1, bytes,
 49        ))
 50    }
 51
 52    pub fn as_ciphertext(&self) -> Ciphertext<VecZnx> {
 53        unsafe { Ciphertext::<VecZnx>(std::ptr::read(&self.0)) }
 54    }
 55}
 56
 57impl ElemCommon<VecZnx> for Plaintext {
 58    fn n(&self) -> usize {
 59        self.0.n()
 60    }
 61
 62    fn log_n(&self) -> usize {
 63        self.elem().log_n()
 64    }
 65
 66    fn log_q(&self) -> usize {
 67        self.0.log_q
 68    }
 69
 70    fn elem(&self) -> &Elem<VecZnx> {
 71        &self.0
 72    }
 73
 74    fn elem_mut(&mut self) -> &mut Elem<VecZnx> {
 75        &mut self.0
 76    }
 77
 78    fn size(&self) -> usize {
 79        self.elem().size()
 80    }
 81
 82    fn layout(&self) -> Layout {
 83        self.elem().layout()
 84    }
 85
 86    fn rows(&self) -> usize {
 87        self.0.rows()
 88    }
 89
 90    fn cols(&self) -> usize {
 91        self.0.cols()
 92    }
 93
 94    fn at(&self, i: usize) -> &VecZnx {
 95        self.0.at(i)
 96    }
 97
 98    fn at_mut(&mut self, i: usize) -> &mut VecZnx {
 99        self.0.at_mut(i)
100    }
101
102    fn log_base2k(&self) -> usize {
103        self.0.log_base2k()
104    }
105
106    fn log_scale(&self) -> usize {
107        self.0.log_scale()
108    }
109}