arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/rlwe/src/plaintext.rs
rlwe/src/plaintext.rsRaw
  1use crate::ciphertext::Ciphertext;
  2use crate::elem::{Elem, ElemBasics};
  3use crate::parameters::Parameters;
  4use base2k::{Infos, Module, VecZnx, VecZnxApi, VecZnxBorrow};
  5
  6pub struct Plaintext<T: VecZnxApi + Infos>(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, self.log_scale())
 11    }
 12
 13    pub fn bytes_of_plaintext(&self, log_q: usize) -> usize {
 14        Elem::<VecZnx>::bytes_of(self.module(), self.log_base2k(), log_q, 0)
 15    }
 16
 17    pub fn plaintext_from_bytes(&self, log_q: usize, bytes: &mut [u8]) -> Plaintext<VecZnx> {
 18        Plaintext(self.elem_from_bytes(log_q, 0, bytes))
 19    }
 20
 21    pub fn plaintext_borrow_from_bytes(&self, log_q: usize, bytes: &mut [u8]) -> Plaintext<VecZnxBorrow> {
 22        Plaintext(self.elem_borrow_from_bytes(log_q, 0, bytes))
 23    }
 24}
 25
 26impl Plaintext<VecZnx> {
 27    pub fn new(module: &Module, log_base2k: usize, log_q: usize, log_scale: usize) -> Self {
 28        Self(Elem::<VecZnx>::new(module, log_base2k, log_q, 0, log_scale))
 29    }
 30
 31    pub fn bytes_of(module: &Module, log_base2k: usize, log_q: usize) -> usize {
 32        Elem::<VecZnx>::bytes_of(module, log_base2k, log_q, 0)
 33    }
 34
 35    pub fn from_bytes(module: &Module, log_base2k: usize, log_q: usize, bytes: &mut [u8]) -> Self {
 36        Self(Elem::<VecZnx>::from_bytes(module, log_base2k, log_q, 0, bytes))
 37    }
 38
 39    pub fn n(&self) -> usize {
 40        self.0.n()
 41    }
 42
 43    pub fn degree(&self) -> usize {
 44        self.0.degree()
 45    }
 46
 47    pub fn log_q(&self) -> usize {
 48        self.0.log_q()
 49    }
 50
 51    pub fn limbs(&self) -> usize {
 52        self.0.limbs()
 53    }
 54
 55    pub fn at(&self, i: usize) -> &VecZnx {
 56        self.0.at(i)
 57    }
 58
 59    pub fn at_mut(&mut self, i: usize) -> &mut VecZnx {
 60        self.0.at_mut(i)
 61    }
 62
 63    pub fn log_base2k(&self) -> usize {
 64        self.0.log_base2k()
 65    }
 66
 67    pub fn log_scale(&self) -> usize {
 68        self.0.log_scale()
 69    }
 70
 71    pub fn zero(&mut self) {
 72        self.0.zero()
 73    }
 74
 75    pub fn as_ciphertext(&self) -> Ciphertext {
 76        unsafe { Ciphertext(std::ptr::read(&self.0)) }
 77    }
 78
 79}
 80
 81impl Plaintext<VecZnxBorrow> {
 82
 83    pub fn bytes_of(module: &Module, log_base2k: usize, log_q: usize) -> usize {
 84        Elem::<VecZnxBorrow>::bytes_of(module, log_base2k, log_q, 0)
 85    }
 86
 87    pub fn from_bytes(module: &Module, log_base2k: usize, log_q: usize, bytes: &mut [u8]) -> Self {
 88        Self(Elem::<VecZnxBorrow>::from_bytes(module, log_base2k, log_q, 0, bytes))
 89    }
 90
 91    pub fn n(&self) -> usize {
 92        self.0.n()
 93    }
 94
 95    pub fn degree(&self) -> usize {
 96        self.0.degree()
 97    }
 98
 99    pub fn log_q(&self) -> usize {
100        self.0.log_q()
101    }
102
103    pub fn limbs(&self) -> usize {
104        self.0.limbs()
105    }
106
107    pub fn at(&self, i: usize) -> &VecZnxBorrow {
108        self.0.at(i)
109    }
110
111    pub fn at_mut(&mut self, i: usize) -> &mut VecZnxBorrow {
112        self.0.at_mut(i)
113    }
114
115    pub fn log_base2k(&self) -> usize {
116        self.0.log_base2k()
117    }
118
119    pub fn log_scale(&self) -> usize {
120        self.0.log_scale()
121    }
122
123    pub fn zero(&mut self) {
124        self.0.zero()
125    }
126
127    /* 
128    pub fn as_ciphertext(&self) -> Ciphertext {
129        unsafe { Ciphertext(std::ptr::read(&self.0)) }
130    }
131    */
132}