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