Browse Source

put gadget_vector inside decomposer

par-agg-key-shares
Janmajaya Mall 11 months ago
parent
commit
ad5d00241c
5 changed files with 30 additions and 43 deletions
  1. +10
    -28
      src/bool/evaluator.rs
  2. +5
    -1
      src/decomposer.rs
  3. +3
    -2
      src/lwe.rs
  4. +4
    -4
      src/noise.rs
  5. +8
    -8
      src/rgsw.rs

+ 10
- 28
src/bool/evaluator.rs

@ -10,7 +10,7 @@ use num_traits::{FromPrimitive, Num, One, PrimInt, ToPrimitive, WrappingSub, Zer
use crate::{ use crate::{
backend::{ArithmeticOps, ModInit, ModularOpsU64, VectorOps}, 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}, lwe::{decrypt_lwe, encrypt_lwe, lwe_key_switch, lwe_ksk_keygen, measure_noise_lwe, LweSecret},
multi_party::public_key_share, multi_party::public_key_share,
ntt::{self, Ntt, NttBackendU64, NttInit}, ntt::{self, Ntt, NttBackendU64, NttInit},
@ -715,11 +715,7 @@ where
let sk_rlwe = &client_key.sk_rlwe; let sk_rlwe = &client_key.sk_rlwe;
let sk_lwe = &client_key.sk_lwe; 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 // generate auto keys -g, g
let mut auto_keys = HashMap::new(); let mut auto_keys = HashMap::new();
@ -775,11 +771,7 @@ where
.collect_vec(); .collect_vec();
// LWE KSK from RLWE secret s -> LWE secret z // 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); let mut lwe_ksk = M::R::zeros(self.parameters.d_lwe * ring_size);
lwe_ksk_keygen( lwe_ksk_keygen(
@ -822,8 +814,7 @@ where
let rlwe_q = self.parameters.rlwe_q; let rlwe_q = self.parameters.rlwe_q;
let lwe_q = self.parameters.lwe_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_modop = ModOp::new(rlwe_q);
let rlweq_nttop = NttOp::new(rlwe_q, ring_size); let rlweq_nttop = NttOp::new(rlwe_q, ring_size);
@ -887,8 +878,7 @@ where
// LWE ksk // LWE ksk
let mut lwe_ksk = M::R::zeros(d_lwe * ring_size); let mut lwe_ksk = M::R::zeros(d_lwe * ring_size);
let lwe_modop = ModOp::new(lwe_q); 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( lwe_ksk_keygen(
sk_rlwe.values(), sk_rlwe.values(),
sk_lwe.values(), sk_lwe.values(),
@ -1944,8 +1934,10 @@ mod tests {
let lwe_q = 1 << lwe_logq; let lwe_q = 1 << lwe_logq;
let d_lwe = 1; let d_lwe = 1;
let logb_lwe = 6; let logb_lwe = 6;
let lwe_gadgect_vec = gadget_vector(lwe_logq, logb_lwe, d_lwe);
let lweq_modop = ModularOpsU64::new(lwe_q); 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 logp = 2;
let from_lwe_n = 2048; let from_lwe_n = 2048;
@ -2020,7 +2012,6 @@ mod tests {
// Key switch // Key switch
let lwe_ct_key_switched = { let lwe_ct_key_switched = {
let mut lwe_ct_key_switched = vec![0u64; to_lwe_n + 1]; 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( lwe_key_switch(
&mut lwe_ct_key_switched, &mut lwe_ct_key_switched,
&lwe_ct, &lwe_ct,
@ -2214,12 +2205,7 @@ mod tests {
// Measure noise in RGSW ciphertexts of ideal LWE secrets // Measure noise in RGSW ciphertexts of ideal LWE secrets
if true { 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 { for i in 0..20 {
// measure noise in RGSW(s[i]) // measure noise in RGSW(s[i])
let si = let si =
@ -2548,11 +2534,7 @@ mod tests {
let rlwe_nttop = &bool_evaluator.rlwe_nttop; let rlwe_nttop = &bool_evaluator.rlwe_nttop;
let rlwe_modop = &bool_evaluator.rlwe_modop; let rlwe_modop = &bool_evaluator.rlwe_modop;
let rlwe_decomposer = &bool_evaluator.decomposer_rlwe; 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) let parties = (0..no_of_parties)
.map(|_| bool_evaluator.client_key()) .map(|_| bool_evaluator.client_key())

+ 5
- 1
src/decomposer.rs

@ -4,7 +4,7 @@ use std::{fmt::Debug, marker::PhantomData, ops::Rem};
use crate::backend::{ArithmeticOps, ModularOpsU64}; 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 d_ideal = (logq as f64 / logb as f64).ceil().to_usize().unwrap();
let ignored_limbs = d_ideal - d; let ignored_limbs = d_ideal - d;
(ignored_limbs..ignored_limbs + d) (ignored_limbs..ignored_limbs + d)
@ -83,6 +83,10 @@ impl DefaultDecomposer {
} }
value value
} }
pub(crate) fn gadget_vector(&self) -> Vec<T> {
return gadget_vector(self.logq, self.logb, self.d);
}
} }
impl<T: PrimInt + WrappingSub + Debug> Decomposer for DefaultDecomposer<T> { impl<T: PrimInt + WrappingSub + Debug> Decomposer for DefaultDecomposer<T> {

+ 3
- 2
src/lwe.rs

@ -274,7 +274,7 @@ mod tests {
use crate::{ use crate::{
backend::{ModInit, ModularOpsU64}, backend::{ModInit, ModularOpsU64},
decomposer::{gadget_vector, DefaultDecomposer},
decomposer::DefaultDecomposer,
lwe::{lwe_key_switch, measure_noise_lwe}, lwe::{lwe_key_switch, measure_noise_lwe},
random::DefaultSecureRng, random::DefaultSecureRng,
rgsw::measure_noise, rgsw::measure_noise,
@ -342,7 +342,8 @@ mod tests {
let mut seeded_ksk = let mut seeded_ksk =
SeededLweKeySwitchingKey::empty(lwe_in_n, lwe_out_n, d_ks, ksk_seed, q); SeededLweKeySwitchingKey::empty(lwe_in_n, lwe_out_n, d_ks, ksk_seed, q);
let mut p_rng = DefaultSecureRng::new_seeded(ksk_seed); 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_ksk_keygen(
&lwe_sk_in.values(), &lwe_sk_in.values(),
&lwe_sk_out.values(), &lwe_sk_out.values(),

+ 4
- 4
src/noise.rs

@ -4,7 +4,7 @@ mod tests {
use crate::{ use crate::{
backend::{ArithmeticOps, ModInit, ModularOpsU64}, backend::{ArithmeticOps, ModInit, ModularOpsU64},
decomposer::{gadget_vector, Decomposer, DefaultDecomposer},
decomposer::{Decomposer, DefaultDecomposer},
ntt::{Ntt, NttBackendU64, NttInit}, ntt::{Ntt, NttBackendU64, NttInit},
random::{DefaultSecureRng, RandomGaussianDist, RandomUniformDist}, random::{DefaultSecureRng, RandomGaussianDist, RandomUniformDist},
rgsw::{ rgsw::{
@ -30,7 +30,8 @@ mod tests {
let sk = RlweSecret::random((ring_size >> 1) as usize, ring_size as usize); let sk = RlweSecret::random((ring_size >> 1) as usize, ring_size as usize);
let mut rng = DefaultSecureRng::new(); 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 { for i in 0..100 {
// m should have norm 1 // m should have norm 1
@ -82,7 +83,6 @@ mod tests {
// RLWE(m0m1) = RLWE(m1) x RGSW(m0) // RLWE(m0m1) = RLWE(m1) x RGSW(m0)
let mut scratch = vec![vec![0u64; ring_size]; d0 + 2]; let mut scratch = vec![vec![0u64; ring_size]; d0 + 2];
let decomposer = DefaultDecomposer::new(q, logb, d0);
less1_rlwe_by_rgsw( less1_rlwe_by_rgsw(
&mut rlwe, &mut rlwe,
&rgsw.data, &rgsw.data,
@ -122,9 +122,9 @@ mod tests {
let sk = RlweSecret::random((ring_size >> 1) as usize, ring_size as usize); let sk = RlweSecret::random((ring_size >> 1) as usize, ring_size as usize);
let mut rng = DefaultSecureRng::new(); let mut rng = DefaultSecureRng::new();
let gadget_vector = gadget_vector(logq, logb, d0);
let decomposer = DefaultDecomposer::new(q, logb, d0); let decomposer = DefaultDecomposer::new(q, logb, d0);
let gadget_vector = decomposer.gadget_vector();
for i in 0..100 { for i in 0..100 {
let modq_op = ModularOpsU64::new(q); let modq_op = ModularOpsU64::new(q);

+ 8
- 8
src/rgsw.rs

@ -1502,7 +1502,7 @@ pub(crate) mod tests {
use crate::{ use crate::{
backend::{ModInit, ModularOpsU64, VectorOps}, backend::{ModInit, ModularOpsU64, VectorOps},
decomposer::{gadget_vector, DefaultDecomposer},
decomposer::DefaultDecomposer,
ntt::{self, Ntt, NttBackendU64, NttInit}, ntt::{self, Ntt, NttBackendU64, NttInit},
random::{DefaultSecureRng, NewWithSeed, RandomUniformDist}, random::{DefaultSecureRng, NewWithSeed, RandomUniformDist},
rgsw::{ rgsw::{
@ -1600,7 +1600,8 @@ pub(crate) mod tests {
let ntt_op = NttBackendU64::new(q, ring_size as usize); let ntt_op = NttBackendU64::new(q, ring_size as usize);
let mod_op = ModularOpsU64::new(q); 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) // Encrypt m1 as RGSW(m1)
let rgsw_ct = { let rgsw_ct = {
@ -1665,7 +1666,6 @@ pub(crate) mod tests {
// RLWE(m0m1) = RLWE(m0) x RGSW(m1) // RLWE(m0m1) = RLWE(m0) x RGSW(m1)
let mut scratch_space = vec![vec![0u64; ring_size as usize]; d_rgsw + 2]; 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( rlwe_by_rgsw(
&mut rlwe_in_ct, &mut rlwe_in_ct,
&rgsw_ct.data, &rgsw_ct.data,
@ -1752,8 +1752,8 @@ pub(crate) mod tests {
let ntt_op = NttBackendU64::new(q, ring_size as usize); let ntt_op = NttBackendU64::new(q, ring_size as usize);
let mod_op = ModularOpsU64::new(q); let mod_op = ModularOpsU64::new(q);
let gadget_vector = gadget_vector(logq, logb, d_rgsw);
let decomposer = DefaultDecomposer::new(q, 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; 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 mut rng = DefaultSecureRng::new();
let ntt_op = NttBackendU64::new(q, ring_size as usize); let ntt_op = NttBackendU64::new(q, ring_size as usize);
let mod_op = ModularOpsU64::new(q); let mod_op = ModularOpsU64::new(q);
let gadget_vector = gadget_vector(logq, logb, d_rgsw);
let decomposer = DefaultDecomposer::new(q, 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 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 mut rng = DefaultSecureRng::new();
let ntt_op = NttBackendU64::new(q, ring_size as usize); let ntt_op = NttBackendU64::new(q, ring_size as usize);
let mod_op = ModularOpsU64::new(q); let mod_op = ModularOpsU64::new(q);
let gadget_vector = gadget_vector(logq, logb, d_rgsw);
let decomposer = DefaultDecomposer::new(q, 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 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]; let mut carry_m = vec![0u64; ring_size as usize];
@ -2167,7 +2167,8 @@ pub(crate) mod tests {
rng.fill_bytes(&mut seed_auto); rng.fill_bytes(&mut seed_auto);
let mut seeded_auto_key = SeededAutoKey::empty(ring_size as usize, d_rgsw, seed_auto, q); 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 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( galois_key_gen(
&mut seeded_auto_key.data, &mut seeded_auto_key.data,
s.values(), s.values(),
@ -2186,7 +2187,6 @@ pub(crate) mod tests {
// Send RLWE_{s}(m) -> RLWE_{s}(m^k) // Send RLWE_{s}(m) -> RLWE_{s}(m^k)
let mut scratch_space = vec![vec![0u64; ring_size as usize]; d_rgsw + 2]; 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 (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( galois_auto(
&mut rlwe_m, &mut rlwe_m,
&auto_key.data, &auto_key.data,

Loading…
Cancel
Save