use backend::hal::{ api::{VecZnxAlloc, VecZnxAllocBytes}, layouts::{Backend, Data, DataMut, DataRef, Module, ReaderFrom, VecZnx, VecZnxToMut, VecZnxToRef, WriterTo}, }; use crate::{GLWEOps, Infos, SetMetaData}; #[derive(PartialEq, Eq)] pub struct GLWECiphertext { pub data: VecZnx, pub basek: usize, pub k: usize, } impl GLWECiphertext> { pub fn alloc(module: &Module, basek: usize, k: usize, rank: usize) -> Self where Module: VecZnxAlloc, { Self { data: module.vec_znx_alloc(rank + 1, k.div_ceil(basek)), basek, k, } } pub fn bytes_of(module: &Module, basek: usize, k: usize, rank: usize) -> usize where Module: VecZnxAllocBytes, { module.vec_znx_alloc_bytes(rank + 1, k.div_ceil(basek)) } } impl Infos for GLWECiphertext { type Inner = VecZnx; fn inner(&self) -> &Self::Inner { &self.data } fn basek(&self) -> usize { self.basek } fn k(&self) -> usize { self.k } } impl GLWECiphertext { pub fn rank(&self) -> usize { self.cols() - 1 } } impl GLWECiphertext { pub fn clone(&self) -> GLWECiphertext> { GLWECiphertext { data: self.data.clone(), basek: self.basek(), k: self.k(), } } } impl SetMetaData for GLWECiphertext { fn set_k(&mut self, k: usize) { self.k = k } fn set_basek(&mut self, basek: usize) { self.basek = basek } } pub trait GLWECiphertextToRef: Infos { fn to_ref(&self) -> GLWECiphertext<&[u8]>; } impl GLWECiphertextToRef for GLWECiphertext { fn to_ref(&self) -> GLWECiphertext<&[u8]> { GLWECiphertext { data: self.data.to_ref(), basek: self.basek, k: self.k, } } } pub trait GLWECiphertextToMut: Infos { fn to_mut(&mut self) -> GLWECiphertext<&mut [u8]>; } impl GLWECiphertextToMut for GLWECiphertext { fn to_mut(&mut self) -> GLWECiphertext<&mut [u8]> { GLWECiphertext { data: self.data.to_mut(), basek: self.basek, k: self.k, } } } impl GLWEOps for GLWECiphertext where GLWECiphertext: GLWECiphertextToMut + Infos + SetMetaData {} use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; impl ReaderFrom for GLWECiphertext { 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; self.data.read_from(reader) } } impl WriterTo for GLWECiphertext { fn write_to(&self, writer: &mut W) -> std::io::Result<()> { writer.write_u64::(self.k as u64)?; writer.write_u64::(self.basek as u64)?; self.data.write_to(writer) } }