arnaucube
arnaucube/phantom-zonePublic Self-hosted repository
put gadget_vector inside decomposer
Janmajaya Mall janmajayamall@protonmail.com
Thu, 16 May 2024 13:48:30 +0530
commit

ad5d00241c2ebf6dc6c658805a27bec9d7396df3

parent

c1018f80d4429d1f16a8a56325020091ba7bbccb

5 files changed, 30 insertions(+), 43 deletions(-)

jump to
M src/bool/evaluator.rs → src/bool/evaluator.rs

@@ -10,7 +10,7 @@ use num_traits::{FromPrimitive, Num, One, PrimInt, ToPrimitive, WrappingSub, Zero};

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 @@

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 @@ })

.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 @@ let d_lwe = self.parameters.d_lwe;

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 @@

// 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 @@ let lwe_logq = 18;

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 @@

// 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 @@ }

// 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 @@ let lwe_modop = &bool_evaluator.lwe_modop;

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())
M src/decomposer.rs → src/decomposer.rs

@@ -4,7 +4,7 @@ use std::{fmt::Debug, marker::PhantomData, ops::Rem};

use crate::backend::{ArithmeticOps, ModularOpsU64}; -pub fn gadget_vector<T: PrimInt>(logq: usize, logb: usize, d: usize) -> Vec<T> { +fn gadget_vector<T: PrimInt>(logq: usize, logb: usize, d: usize) -> Vec<T> { let d_ideal = (logq as f64 / logb as f64).ceil().to_usize().unwrap(); let ignored_limbs = d_ideal - d; (ignored_limbs..ignored_limbs + d)

@@ -82,6 +82,10 @@ )),

) } value + } + + pub(crate) fn gadget_vector(&self) -> Vec<T> { + return gadget_vector(self.logq, self.logb, self.d); } }
M src/lwe.rs → 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 @@ rng.fill_bytes(&mut ksk_seed);

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(),
M src/noise.rs → src/noise.rs

@@ -4,7 +4,7 @@ use rand::{thread_rng, Rng};

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 @@

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 @@ );

// 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 @@

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);
M src/rgsw.rs → src/rgsw.rs

@@ -1502,7 +1502,7 @@ use rand::{thread_rng, Rng};

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 @@ m1[thread_rng().gen_range(0..ring_size) as usize] = 1;

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 @@ };

// 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 @@ let s = RlweSecret::random((ring_size >> 1) as usize, ring_size as usize);

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 @@

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 @@

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 @@ let mut seed_auto = [0u8; 32];

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 @@

// 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,