use backend::{Backend, FFT64, Module, ScalarZnxDft, ScalarZnxDftAlloc, ScalarZnxDftOps, ZnxInfos}; use crate::{GLWESecret, dist::Distribution}; pub struct FourierGLWESecret { pub(crate) data: ScalarZnxDft, pub(crate) dist: Distribution, } impl FourierGLWESecret, B> { pub fn alloc(module: &Module, rank: usize) -> Self { Self { data: module.new_scalar_znx_dft(rank), dist: Distribution::NONE, } } pub fn bytes_of(module: &Module, rank: usize) -> usize { module.bytes_of_scalar_znx_dft(rank) } } impl FourierGLWESecret, FFT64> { pub fn from(module: &Module, sk: &GLWESecret) -> Self where D: AsRef<[u8]>, { let mut sk_dft: FourierGLWESecret, FFT64> = Self::alloc(module, sk.rank()); sk_dft.set(module, sk); sk_dft } } impl FourierGLWESecret { pub fn n(&self) -> usize { self.data.n() } pub fn log_n(&self) -> usize { self.data.log_n() } pub fn rank(&self) -> usize { self.data.cols() } } impl + AsRef<[u8]>> FourierGLWESecret { pub(crate) fn set(&mut self, module: &Module, sk: &GLWESecret) where D: AsRef<[u8]>, { (0..self.rank()).for_each(|i| { module.svp_prepare(&mut self.data, i, &sk.data, i); }); self.dist = sk.dist } }