From ad5d00241c2ebf6dc6c658805a27bec9d7396df3 Mon Sep 17 00:00:00 2001 From: Janmajaya Mall Date: Thu, 16 May 2024 13:48:30 +0530 Subject: [PATCH] put gadget_vector inside decomposer --- src/bool/evaluator.rs | 38 ++++++++++---------------------------- src/decomposer.rs | 6 +++++- src/lwe.rs | 5 +++-- src/noise.rs | 8 ++++---- src/rgsw.rs | 16 ++++++++-------- 5 files changed, 30 insertions(+), 43 deletions(-) diff --git a/src/bool/evaluator.rs b/src/bool/evaluator.rs index 2ae5998..54a360d 100644 --- a/src/bool/evaluator.rs +++ b/src/bool/evaluator.rs @@ -10,7 +10,7 @@ use num_traits::{FromPrimitive, Num, One, PrimInt, ToPrimitive, WrappingSub, Zer use crate::{ backend::{ArithmeticOps, ModInit, ModularOpsU64, VectorOps}, - decomposer::{gadget_vector, Decomposer, DefaultDecomposer, NumInfo}, + decomposer::{Decomposer, DefaultDecomposer, NumInfo}, lwe::{decrypt_lwe, encrypt_lwe, lwe_key_switch, lwe_ksk_keygen, measure_noise_lwe, LweSecret}, multi_party::public_key_share, ntt::{self, Ntt, NttBackendU64, NttInit}, @@ -715,11 +715,7 @@ where let sk_rlwe = &client_key.sk_rlwe; let sk_lwe = &client_key.sk_lwe; - let d_rgsw_gadget_vec = gadget_vector( - self.parameters.rlwe_logq, - self.parameters.logb_rgsw, - self.parameters.d_rgsw, - ); + let d_rgsw_gadget_vec = self.decomposer_rlwe.gadget_vector(); // generate auto keys -g, g let mut auto_keys = HashMap::new(); @@ -775,11 +771,7 @@ where .collect_vec(); // LWE KSK from RLWE secret s -> LWE secret z - let d_lwe_gadget = gadget_vector( - self.parameters.lwe_logq, - self.parameters.logb_lwe, - self.parameters.d_lwe, - ); + let d_lwe_gadget = self.decomposer_lwe.gadget_vector(); let mut lwe_ksk = M::R::zeros(self.parameters.d_lwe * ring_size); lwe_ksk_keygen( @@ -822,8 +814,7 @@ where let rlwe_q = self.parameters.rlwe_q; let lwe_q = self.parameters.lwe_q; - let d_rgsw_gadget_vec = - gadget_vector(self.parameters.rlwe_logq, self.parameters.logb_rgsw, d_rgsw); + let d_rgsw_gadget_vec = self.decomposer_rlwe.gadget_vector(); let rlweq_modop = ModOp::new(rlwe_q); let rlweq_nttop = NttOp::new(rlwe_q, ring_size); @@ -887,8 +878,7 @@ where // LWE ksk let mut lwe_ksk = M::R::zeros(d_lwe * ring_size); let lwe_modop = ModOp::new(lwe_q); - let d_lwe_gadget_vec = - gadget_vector(self.parameters.lwe_logq, self.parameters.logb_lwe, d_lwe); + let d_lwe_gadget_vec = self.decomposer_lwe.gadget_vector(); lwe_ksk_keygen( sk_rlwe.values(), sk_lwe.values(), @@ -1944,8 +1934,10 @@ mod tests { let lwe_q = 1 << lwe_logq; let d_lwe = 1; let logb_lwe = 6; - let lwe_gadgect_vec = gadget_vector(lwe_logq, logb_lwe, d_lwe); let lweq_modop = ModularOpsU64::new(lwe_q); + + let decomposer = DefaultDecomposer::new(lwe_q, logb_lwe, d_lwe); + let lwe_gadgect_vec = decomposer.gadget_vector(); let logp = 2; let from_lwe_n = 2048; @@ -2020,7 +2012,6 @@ mod tests { // Key switch let lwe_ct_key_switched = { let mut lwe_ct_key_switched = vec![0u64; to_lwe_n + 1]; - let decomposer = DefaultDecomposer::new(lwe_q, logb_lwe, d_lwe); lwe_key_switch( &mut lwe_ct_key_switched, &lwe_ct, @@ -2214,12 +2205,7 @@ mod tests { // Measure noise in RGSW ciphertexts of ideal LWE secrets if true { - let gadget_vec = gadget_vector( - bool_evaluator.parameters.rlwe_logq, - bool_evaluator.parameters.logb_rgsw, - bool_evaluator.parameters.d_rgsw, - ); - + let gadget_vec = rlwe_decomposer.gadget_vector(); for i in 0..20 { // measure noise in RGSW(s[i]) let si = @@ -2548,11 +2534,7 @@ mod tests { let rlwe_nttop = &bool_evaluator.rlwe_nttop; let rlwe_modop = &bool_evaluator.rlwe_modop; let rlwe_decomposer = &bool_evaluator.decomposer_rlwe; - let rlwe_gadget_vector = gadget_vector( - bool_evaluator.parameters.rlwe_logq, - bool_evaluator.parameters.logb_rgsw, - d_rgsw, - ); + let rlwe_gadget_vector = rlwe_decomposer.gadget_vector(); let parties = (0..no_of_parties) .map(|_| bool_evaluator.client_key()) diff --git a/src/decomposer.rs b/src/decomposer.rs index 98249f4..0b51dc9 100644 --- a/src/decomposer.rs +++ b/src/decomposer.rs @@ -4,7 +4,7 @@ use std::{fmt::Debug, marker::PhantomData, ops::Rem}; use crate::backend::{ArithmeticOps, ModularOpsU64}; -pub fn gadget_vector(logq: usize, logb: usize, d: usize) -> Vec { +fn gadget_vector(logq: usize, logb: usize, d: usize) -> Vec { let d_ideal = (logq as f64 / logb as f64).ceil().to_usize().unwrap(); let ignored_limbs = d_ideal - d; (ignored_limbs..ignored_limbs + d) @@ -83,6 +83,10 @@ impl DefaultDecomposer { } value } + + pub(crate) fn gadget_vector(&self) -> Vec { + return gadget_vector(self.logq, self.logb, self.d); + } } impl Decomposer for DefaultDecomposer { diff --git a/src/lwe.rs b/src/lwe.rs index acb6333..ce18b1a 100644 --- a/src/lwe.rs +++ b/src/lwe.rs @@ -274,7 +274,7 @@ mod tests { use crate::{ backend::{ModInit, ModularOpsU64}, - decomposer::{gadget_vector, DefaultDecomposer}, + decomposer::DefaultDecomposer, lwe::{lwe_key_switch, measure_noise_lwe}, random::DefaultSecureRng, rgsw::measure_noise, @@ -342,7 +342,8 @@ mod tests { let mut seeded_ksk = SeededLweKeySwitchingKey::empty(lwe_in_n, lwe_out_n, d_ks, ksk_seed, q); let mut p_rng = DefaultSecureRng::new_seeded(ksk_seed); - let gadget = gadget_vector(logq, logb, d_ks); + let decomposer = DefaultDecomposer::new(q, logb, d_ks); + let gadget = decomposer.gadget_vector(); lwe_ksk_keygen( &lwe_sk_in.values(), &lwe_sk_out.values(), diff --git a/src/noise.rs b/src/noise.rs index 41b56a2..fa7e28d 100644 --- a/src/noise.rs +++ b/src/noise.rs @@ -4,7 +4,7 @@ mod tests { use crate::{ backend::{ArithmeticOps, ModInit, ModularOpsU64}, - decomposer::{gadget_vector, Decomposer, DefaultDecomposer}, + decomposer::{Decomposer, DefaultDecomposer}, ntt::{Ntt, NttBackendU64, NttInit}, random::{DefaultSecureRng, RandomGaussianDist, RandomUniformDist}, rgsw::{ @@ -30,7 +30,8 @@ mod tests { let sk = RlweSecret::random((ring_size >> 1) as usize, ring_size as usize); let mut rng = DefaultSecureRng::new(); - let gadget_vector = gadget_vector(logq, logb, d0); + let decomposer = DefaultDecomposer::new(q, logb, d0); + let gadget_vector = decomposer.gadget_vector(); for i in 0..100 { // m should have norm 1 @@ -82,7 +83,6 @@ mod tests { // RLWE(m0m1) = RLWE(m1) x RGSW(m0) let mut scratch = vec![vec![0u64; ring_size]; d0 + 2]; - let decomposer = DefaultDecomposer::new(q, logb, d0); less1_rlwe_by_rgsw( &mut rlwe, &rgsw.data, @@ -122,9 +122,9 @@ mod tests { let sk = RlweSecret::random((ring_size >> 1) as usize, ring_size as usize); let mut rng = DefaultSecureRng::new(); - let gadget_vector = gadget_vector(logq, logb, d0); let decomposer = DefaultDecomposer::new(q, logb, d0); + let gadget_vector = decomposer.gadget_vector(); for i in 0..100 { let modq_op = ModularOpsU64::new(q); diff --git a/src/rgsw.rs b/src/rgsw.rs index 4c786f4..5ed7d0b 100644 --- a/src/rgsw.rs +++ b/src/rgsw.rs @@ -1502,7 +1502,7 @@ pub(crate) mod tests { use crate::{ backend::{ModInit, ModularOpsU64, VectorOps}, - decomposer::{gadget_vector, DefaultDecomposer}, + decomposer::DefaultDecomposer, ntt::{self, Ntt, NttBackendU64, NttInit}, random::{DefaultSecureRng, NewWithSeed, RandomUniformDist}, rgsw::{ @@ -1600,7 +1600,8 @@ pub(crate) mod tests { let ntt_op = NttBackendU64::new(q, ring_size as usize); let mod_op = ModularOpsU64::new(q); - let gadget_vector = gadget_vector(logq, logb, d_rgsw); + let decomposer = DefaultDecomposer::new(q, logb, d_rgsw); + let gadget_vector = decomposer.gadget_vector(); // Encrypt m1 as RGSW(m1) let rgsw_ct = { @@ -1665,7 +1666,6 @@ pub(crate) mod tests { // RLWE(m0m1) = RLWE(m0) x RGSW(m1) let mut scratch_space = vec![vec![0u64; ring_size as usize]; d_rgsw + 2]; - let decomposer = DefaultDecomposer::new(q, logb, d_rgsw); rlwe_by_rgsw( &mut rlwe_in_ct, &rgsw_ct.data, @@ -1752,8 +1752,8 @@ pub(crate) mod tests { let ntt_op = NttBackendU64::new(q, ring_size as usize); let mod_op = ModularOpsU64::new(q); - let gadget_vector = gadget_vector(logq, logb, d_rgsw); let decomposer = DefaultDecomposer::new(q, logb, d_rgsw); + let gadget_vector = decomposer.gadget_vector(); let mul_mod = |v0: &u64, v1: &u64| ((*v0 as u128 * *v1 as u128) % (q as u128)) as u64; @@ -1930,8 +1930,8 @@ pub(crate) mod tests { let mut rng = DefaultSecureRng::new(); let ntt_op = NttBackendU64::new(q, ring_size as usize); let mod_op = ModularOpsU64::new(q); - let gadget_vector = gadget_vector(logq, logb, d_rgsw); let decomposer = DefaultDecomposer::new(q, logb, d_rgsw); + let gadget_vector = decomposer.gadget_vector(); let mul_mod = |a: &u64, b: &u64| ((*a as u128 * *b as u128) % q as u128) as u64; @@ -2051,8 +2051,8 @@ pub(crate) mod tests { let mut rng = DefaultSecureRng::new(); let ntt_op = NttBackendU64::new(q, ring_size as usize); let mod_op = ModularOpsU64::new(q); - let gadget_vector = gadget_vector(logq, logb, d_rgsw); let decomposer = DefaultDecomposer::new(q, logb, d_rgsw); + let gadget_vector = decomposer.gadget_vector(); let mul_mod = |a: &u64, b: &u64| ((*a as u128 * *b as u128) % q as u128) as u64; let mut carry_m = vec![0u64; ring_size as usize]; @@ -2167,7 +2167,8 @@ pub(crate) mod tests { rng.fill_bytes(&mut seed_auto); let mut seeded_auto_key = SeededAutoKey::empty(ring_size as usize, d_rgsw, seed_auto, q); let mut p_rng = DefaultSecureRng::new_seeded(seed_auto); - let gadget_vector = gadget_vector(logq, logb, d_rgsw); + let decomposer = DefaultDecomposer::new(q, logb, d_rgsw); + let gadget_vector = decomposer.gadget_vector(); galois_key_gen( &mut seeded_auto_key.data, s.values(), @@ -2186,7 +2187,6 @@ pub(crate) mod tests { // Send RLWE_{s}(m) -> RLWE_{s}(m^k) let mut scratch_space = vec![vec![0u64; ring_size as usize]; d_rgsw + 2]; let (auto_map_index, auto_map_sign) = generate_auto_map(ring_size as usize, auto_k); - let decomposer = DefaultDecomposer::new(q, logb, d_rgsw); galois_auto( &mut rlwe_m, &auto_key.data,