added GRLWE and RGSW
Jean-Philippe Bossuat jeanphilippe.bossuat@gmail.com
Thu, 08 May 2025 10:24:35 +0200
1 files changed,
102 insertions(+),
2 deletions(-)
jump to
M
rlwe/src/elem.rs
→
rlwe/src/elem.rs
@@ -1,6 +1,6 @@
use base2k::{ - Backend, Module, VecZnx, VecZnxAlloc, VecZnxDft, VecZnxDftAlloc, VecZnxDftToMut, VecZnxDftToRef, VecZnxToMut, VecZnxToRef, - ZnxInfos, + Backend, MatZnxDft, MatZnxDftAlloc, MatZnxDftToMut, MatZnxDftToRef, Module, VecZnx, VecZnxAlloc, VecZnxDft, VecZnxDftAlloc, + VecZnxDftToMut, VecZnxDftToRef, VecZnxToMut, VecZnxToRef, ZnxInfos, }; pub trait Infos {@@ -193,6 +193,106 @@ where
VecZnxDft<C, B>: VecZnxDftToRef<B>, { fn to_ref(&self) -> VecZnxDft<&[u8], B> { + self.data.to_ref() + } +} + +pub struct GRLWECt<C, B: Backend> { + pub data: MatZnxDft<C, B>, + pub log_base2k: usize, + pub log_k: usize, +} + +impl<B: Backend> GRLWECt<Vec<u8>, B> { + pub fn new(module: &Module<B>, log_base2k: usize, log_k: usize, rows: usize) -> Self { + Self { + data: module.new_mat_znx_dft(rows, 1, 2, derive_size(log_base2k, log_k)), + log_base2k: log_base2k, + log_k: log_k, + } + } +} + +impl<T, B: Backend> Infos for GRLWECt<T, B> { + type Inner = MatZnxDft<T, B>; + + fn inner(&self) -> &Self::Inner { + &self.data + } + + fn log_base2k(&self) -> usize { + self.log_base2k + } + + fn log_k(&self) -> usize { + self.log_k + } +} + +impl<C, B: Backend> MatZnxDftToMut<B> for GRLWECt<C, B> +where + MatZnxDft<C, B>: MatZnxDftToMut<B>, +{ + fn to_mut(&mut self) -> MatZnxDft<&mut [u8], B> { + self.data.to_mut() + } +} + +impl<C, B: Backend> MatZnxDftToRef<B> for GRLWECt<C, B> +where + MatZnxDft<C, B>: MatZnxDftToRef<B>, +{ + fn to_ref(&self) -> MatZnxDft<&[u8], B> { + self.data.to_ref() + } +} + +pub struct RGSWCt<C, B: Backend> { + pub data: MatZnxDft<C, B>, + pub log_base2k: usize, + pub log_k: usize, +} + +impl<B: Backend> RGSWCt<Vec<u8>, B> { + pub fn new(module: &Module<B>, log_base2k: usize, log_k: usize, rows: usize) -> Self { + Self { + data: module.new_mat_znx_dft(rows, 2, 2, derive_size(log_base2k, log_k)), + log_base2k: log_base2k, + log_k: log_k, + } + } +} + +impl<T, B: Backend> Infos for RGSWCt<T, B> { + type Inner = MatZnxDft<T, B>; + + fn inner(&self) -> &Self::Inner { + &self.data + } + + fn log_base2k(&self) -> usize { + self.log_base2k + } + + fn log_k(&self) -> usize { + self.log_k + } +} + +impl<C, B: Backend> MatZnxDftToMut<B> for RGSWCt<C, B> +where + MatZnxDft<C, B>: MatZnxDftToMut<B>, +{ + fn to_mut(&mut self) -> MatZnxDft<&mut [u8], B> { + self.data.to_mut() + } +} + +impl<C, B: Backend> MatZnxDftToRef<B> for RGSWCt<C, B> +where + MatZnxDft<C, B>: MatZnxDftToRef<B>, +{ + fn to_ref(&self) -> MatZnxDft<&[u8], B> { self.data.to_ref() } }