use crate::ciphertext::Ciphertext; use crate::elem::{Elem, ElemCommon, ElemVecZnx, VecZnxCommon}; use crate::parameters::Parameters; use base2k::{Module, VecZnx}; pub struct Plaintext(pub Elem); impl Parameters { pub fn new_plaintext(&self, log_q: usize) -> Plaintext { Plaintext::new(self.module(), self.log_base2k(), log_q) } pub fn bytes_of_plaintext(&self, log_q: usize) -> usize where T: VecZnxCommon, Elem: ElemVecZnx, { Elem::::bytes_of(self.module(), self.log_base2k(), log_q, 1) } pub fn plaintext_from_bytes(&self, log_q: usize, bytes: &mut [u8]) -> Plaintext where T: VecZnxCommon, Elem: ElemVecZnx, { Plaintext::(self.elem_from_bytes::(log_q, 1, bytes)) } } impl Plaintext { pub fn new(module: &Module, log_base2k: usize, log_q: usize) -> Self { Self(Elem::::new(module, log_base2k, log_q, 1)) } } impl Plaintext where T: VecZnxCommon, Elem: ElemVecZnx, { pub fn bytes_of(module: &Module, log_base2k: usize, log_q: usize) -> usize { Elem::::bytes_of(module, log_base2k, log_q, 1) } pub fn from_bytes(module: &Module, log_base2k: usize, log_q: usize, bytes: &mut [u8]) -> Self { Self(Elem::::from_bytes(module, log_base2k, log_q, 1, bytes)) } pub fn as_ciphertext(&self) -> Ciphertext { unsafe { Ciphertext::(std::ptr::read(&self.0)) } } } impl ElemCommon for Plaintext where T: VecZnxCommon, Elem: ElemVecZnx, { fn n(&self) -> usize { self.0.n() } fn log_n(&self) -> usize { self.elem().log_n() } fn log_q(&self) -> usize { self.0.log_q } fn elem(&self) -> &Elem { &self.0 } fn elem_mut(&mut self) -> &mut Elem { &mut self.0 } fn size(&self) -> usize { self.elem().size() } fn rows(&self) -> usize { self.0.rows() } fn cols(&self) -> usize { self.0.cols() } fn at(&self, i: usize) -> &T { self.0.at(i) } fn at_mut(&mut self, i: usize) -> &mut T { self.0.at_mut(i) } fn log_base2k(&self) -> usize { self.0.log_base2k() } fn log_scale(&self) -> usize { self.0.log_scale() } }