use backend::{Backend, FFT64, Module, VecZnx, VecZnxAlloc, VecZnxDftOps, VecZnxToMut, VecZnxToRef}; use crate::{FourierGLWECiphertext, GLWEOps, Infos, SetMetaData}; 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 { Self { data: module.new_vec_znx(rank + 1, k.div_ceil(basek)), basek, k, } } pub fn bytes_of(module: &Module, basek: usize, k: usize, rank: usize) -> usize { module.bytes_of_vec_znx(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 { #[allow(dead_code)] pub(crate) fn dft + AsRef<[u8]>>(&self, module: &Module, res: &mut FourierGLWECiphertext) { #[cfg(debug_assertions)] { assert_eq!(self.rank(), res.rank()); assert_eq!(self.basek(), res.basek()) } (0..self.rank() + 1).for_each(|i| { module.vec_znx_dft(1, 0, &mut res.data, i, &self.data, i); }) } } impl> GLWECiphertext { pub fn clone(&self) -> GLWECiphertext> { GLWECiphertext { data: self.data.clone(), basek: self.basek(), k: self.k(), } } } impl + AsRef<[u8]>> 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 { 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 { fn to_mut(&mut self) -> GLWECiphertext<&mut [u8]>; } impl + AsRef<[u8]>> 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 D: AsRef<[u8]> + AsMut<[u8]>, GLWECiphertext: GLWECiphertextToMut + Infos + SetMetaData, { }