From 398ad604d9a1a3237bcaf2b917082b3131c5b766 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Bossuat Date: Thu, 8 May 2025 10:24:35 +0200 Subject: [PATCH] added GRLWE and RGSW --- rlwe/src/elem.rs | 104 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 2 deletions(-) diff --git a/rlwe/src/elem.rs b/rlwe/src/elem.rs index d1ddb74..e86fd08 100644 --- a/rlwe/src/elem.rs +++ b/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 { @@ -197,6 +197,106 @@ where } } +pub struct GRLWECt { + pub data: MatZnxDft, + pub log_base2k: usize, + pub log_k: usize, +} + +impl GRLWECt, B> { + pub fn new(module: &Module, 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 Infos for GRLWECt { + type Inner = MatZnxDft; + + fn inner(&self) -> &Self::Inner { + &self.data + } + + fn log_base2k(&self) -> usize { + self.log_base2k + } + + fn log_k(&self) -> usize { + self.log_k + } +} + +impl MatZnxDftToMut for GRLWECt +where + MatZnxDft: MatZnxDftToMut, +{ + fn to_mut(&mut self) -> MatZnxDft<&mut [u8], B> { + self.data.to_mut() + } +} + +impl MatZnxDftToRef for GRLWECt +where + MatZnxDft: MatZnxDftToRef, +{ + fn to_ref(&self) -> MatZnxDft<&[u8], B> { + self.data.to_ref() + } +} + +pub struct RGSWCt { + pub data: MatZnxDft, + pub log_base2k: usize, + pub log_k: usize, +} + +impl RGSWCt, B> { + pub fn new(module: &Module, 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 Infos for RGSWCt { + type Inner = MatZnxDft; + + fn inner(&self) -> &Self::Inner { + &self.data + } + + fn log_base2k(&self) -> usize { + self.log_base2k + } + + fn log_k(&self) -> usize { + self.log_k + } +} + +impl MatZnxDftToMut for RGSWCt +where + MatZnxDft: MatZnxDftToMut, +{ + fn to_mut(&mut self) -> MatZnxDft<&mut [u8], B> { + self.data.to_mut() + } +} + +impl MatZnxDftToRef for RGSWCt +where + MatZnxDft: MatZnxDftToRef, +{ + fn to_ref(&self) -> MatZnxDft<&[u8], B> { + self.data.to_ref() + } +} + pub(crate) fn derive_size(log_base2k: usize, log_k: usize) -> usize { (log_k + log_base2k - 1) / log_base2k }