use backend::hal::layouts::{Data, DataMut, DataRef, ReaderFrom, VecZnx, WriterTo}; use crate::{dist::Distribution, layouts::Infos}; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; #[derive(PartialEq, Eq)] pub struct GLWEPublicKey { pub(crate) data: VecZnx, pub(crate) basek: usize, pub(crate) k: usize, pub(crate) dist: Distribution, } impl GLWEPublicKey> { pub fn alloc(n: usize, basek: usize, k: usize, rank: usize) -> Self { Self { data: VecZnx::alloc(n, rank + 1, k.div_ceil(basek)), basek: basek, k: k, dist: Distribution::NONE, } } pub fn bytes_of(n: usize, basek: usize, k: usize, rank: usize) -> usize { VecZnx::alloc_bytes(n, rank + 1, k.div_ceil(basek)) } } impl Infos for GLWEPublicKey { type Inner = VecZnx; fn inner(&self) -> &Self::Inner { &self.data } fn basek(&self) -> usize { self.basek } fn k(&self) -> usize { self.k } } impl GLWEPublicKey { pub fn rank(&self) -> usize { self.cols() - 1 } } impl ReaderFrom for GLWEPublicKey { fn read_from(&mut self, reader: &mut R) -> std::io::Result<()> { self.k = reader.read_u64::()? as usize; self.basek = reader.read_u64::()? as usize; match Distribution::read_from(reader) { Ok(dist) => self.dist = dist, Err(e) => return Err(e), } self.data.read_from(reader) } } impl WriterTo for GLWEPublicKey { fn write_to(&self, writer: &mut W) -> std::io::Result<()> { writer.write_u64::(self.k as u64)?; writer.write_u64::(self.basek as u64)?; match self.dist.write_to(writer) { Ok(()) => {} Err(e) => return Err(e), } self.data.write_to(writer) } }