arnaucube
arnaucube/phantom-zonePublic Self-hosted repository
fix non-interactive RGSW key gen
Janmajaya Mall janmajayamall@protonmail.com
Sun, 16 Jun 2024 20:29:34 +0530
commit

a34f34757f2cf5eb264b800a4cfd08fa0e9fae40

parent

6226995179c919b09ecc03eef277ab222802233b

3 files changed, 29 insertions(+), 6 deletions(-)

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

@@ -112,7 +112,7 @@ let mut p_rng = R::new_with_seed(ks_seed);

// puncture user_i times let mut out = S::default(); - for _ in 0..user_i { + for _ in 0..user_i + 1 { RandomFill::<S>::random_fill(&mut p_rng, &mut out); }

@@ -892,7 +892,7 @@ total_users: usize,

key_shares: &[NonInteractiveMultiPartyServerKeyShare<M>], ) -> Vec<M> where - M: Clone, + M: Clone + Debug, { let rlwe_modop = &self.pbs_info().rlwe_modop; let nttop = &self.pbs_info().rlwe_nttop;

@@ -907,6 +907,9 @@ let mut ui_to_s_ksks = key_shares

.iter() .map(|share| { let mut useri_ui_to_s_ksk = share.ui_to_s_ksk.clone(); + assert!( + useri_ui_to_s_ksk.dimension() == (ui_to_s_ksk_decomposition_count.0, ring_size) + ); key_shares .iter() .filter(|x| x.user_index != share.user_index)

@@ -946,14 +949,18 @@ let mut ksk_prng = DefaultSecureRng::new_seeded(

cr_seed.ui_to_s_ks_seed_for_user_i::<DefaultSecureRng>(share.user_index), ); let mut ais = M::zeros(ui_to_s_ksk_decomposition_count.0, ring_size); + + println!("START {}...", share.user_index); ais.iter_rows_mut().for_each(|r_ai| { RandomFillUniformInModulus::random_fill( &mut ksk_prng, rlwe_q, r_ai.as_mut(), ); + println!("{:?}", r_ai.as_ref()); nttop.forward(r_ai.as_mut()) }); + println!("...END {}", share.user_index); ais }) .collect_vec();

@@ -987,6 +994,9 @@ let mut sum = M::zeros(

ui_to_s_ksk_decomposer.decomposition_count(), ring_size, ); + + // set temp_space to all zeros + tmp_space.as_mut().fill(M::MatElement::zero()); // a_i*s + E key_shares.iter().for_each(|s| {

@@ -1343,6 +1353,7 @@ let ui_to_s_ksk = {

let mut p_rng = DefaultSecureRng::new_seeded( cr_seed.ui_to_s_ks_seed_for_user_i::<DefaultSecureRng>(self_index), ); + non_interactive_ksk_gen::<M, _, _, _, _, _>( client_key.sk_rlwe().values(), client_key.sk_u_rlwe().values(),

@@ -3108,6 +3119,7 @@ let s_poly = Vec::<u64>::try_convert_from(ideal_rlwe.as_slice(), rlwe_q);

let mut neg_s_poly_eval = s_poly.clone(); rlwe_modop.elwise_neg_mut(&mut neg_s_poly_eval); nttop.forward(neg_s_poly_eval.as_mut()); + rgsw_cts.iter().enumerate().for_each(|(s_index, ct)| { // X^{lwe_s[i]} let mut m = vec![0u64; ring_size];

@@ -3125,7 +3137,7 @@

// RLWE'(-sm) gadget_vec_a.iter().enumerate().for_each(|(index, beta)| { // RLWE(\beta -sm) - + dbg!(beta); // \beta * -sX^[lwe_s[i]] let mut beta_neg_sm = neg_sm.clone(); rlwe_modop.elwise_scalar_mul_mut(&mut beta_neg_sm, beta);

@@ -3138,6 +3150,7 @@

// decrypt let mut m_out = vec![0u64; ring_size]; decrypt_rlwe(&rlwe, &ideal_rlwe, &mut m_out, nttop, rlwe_modop); + // println!("{:?}", &beta_neg_sm); let mut diff = m_out; rlwe_modop.elwise_sub_mut(&mut diff, &beta_neg_sm);
M src/bool/parameters.rs → src/bool/parameters.rs

@@ -504,7 +504,7 @@

pub(crate) const NON_INTERACTIVE_SMALL_MP_BOOL_PARAMS: BoolParameters<u64> = BoolParameters::<u64> { rlwe_q: CiphertextModulus::new_non_native(36028797018820609), lwe_q: CiphertextModulus::new_non_native(1 << 20), - br_q: 1 << 11, + br_q: 1 << 12, rlwe_n: PolynomialSize(1 << 11), lwe_n: LweDimension(10), lwe_decomposer_params: (DecompostionLogBase(4), DecompositionCount(5)),
M src/multi_party.rs → src/multi_party.rs

@@ -1,3 +1,5 @@

+use std::fmt::Debug; + use itertools::izip; use crate::{

@@ -143,7 +145,7 @@ modop: &ModOp,

) -> M where <M as Matrix>::R: RowMut + TryConvertFrom1<[S], ModOp::M> + RowEntity, - M::MatElement: Copy, + M::MatElement: Copy + Debug, { assert_eq!(s.len(), u.len());

@@ -159,10 +161,13 @@ let mut ksk = M::zeros(d, ring_size);

let mut scratch_space = M::R::zeros(ring_size); + println!("START KSK..."); izip!(ksk.iter_rows_mut(), gadget_vec.iter()).for_each(|(e_ksk, beta)| { // sample a_i RandomFillUniformInModulus::random_fill(p_rng, q, e_ksk.as_mut()); + println!("{:?}", e_ksk.as_ref()); + // a_i * s + e + beta u nttop.forward(e_ksk.as_mut()); modop.elwise_mul_mut(e_ksk.as_mut(), s_poly_eval.as_ref());

@@ -176,6 +181,7 @@ modop.elwise_scalar_mul(scratch_space.as_mut(), u_poly.as_ref(), beta);

// a_i * s + e + \beta * u modop.elwise_add_mut(e_ksk.as_mut(), scratch_space.as_ref()); }); + println!("...END"); ksk }

@@ -197,7 +203,7 @@ modop: &ModOp,

) -> M where <M as Matrix>::R: RowMut + TryConvertFrom1<[S], ModOp::M> + RowEntity, - M::MatElement: Copy, + M::MatElement: Copy + Debug, { let q = modop.modulus(); let d = gadget_vec.len();

@@ -211,9 +217,11 @@ let mut zero_encs = M::zeros(d, ring_size);

let mut scratch_space = M::R::zeros(ring_size); + println!("START KSK 0 ENC..."); izip!(zero_encs.iter_rows_mut()).for_each(|(e_zero)| { // sample a_i RandomFillUniformInModulus::random_fill(p_rng, q, e_zero.as_mut()); + println!("{:?}", e_zero.as_ref()); // a_i * s + e nttop.forward(e_zero.as_mut());

@@ -223,5 +231,7 @@ // sample error e

RandomFillGaussianInModulus::random_fill(rng, q, scratch_space.as_mut()); modop.elwise_add_mut(e_zero.as_mut(), scratch_space.as_ref()); }); + println!("...END"); + zero_encs }