Browse Source

fix non-interactive RGSW key gen

par-agg-key-shares
Janmajaya Mall 10 months ago
parent
commit
a34f34757f
3 changed files with 29 additions and 6 deletions
  1. +16
    -3
      src/bool/evaluator.rs
  2. +1
    -1
      src/bool/parameters.rs
  3. +12
    -2
      src/multi_party.rs

+ 16
- 3
src/bool/evaluator.rs

@ -112,7 +112,7 @@ impl NonInteractiveMultiPartyCrs {
// puncture user_i times // puncture user_i times
let mut out = S::default(); 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); RandomFill::<S>::random_fill(&mut p_rng, &mut out);
} }
@ -892,7 +892,7 @@ where
key_shares: &[NonInteractiveMultiPartyServerKeyShare<M>], key_shares: &[NonInteractiveMultiPartyServerKeyShare<M>],
) -> Vec<M> ) -> Vec<M>
where where
M: Clone,
M: Clone + Debug,
{ {
let rlwe_modop = &self.pbs_info().rlwe_modop; let rlwe_modop = &self.pbs_info().rlwe_modop;
let nttop = &self.pbs_info().rlwe_nttop; let nttop = &self.pbs_info().rlwe_nttop;
@ -907,6 +907,9 @@ where
.iter() .iter()
.map(|share| { .map(|share| {
let mut useri_ui_to_s_ksk = share.ui_to_s_ksk.clone(); 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 key_shares
.iter() .iter()
.filter(|x| x.user_index != share.user_index) .filter(|x| x.user_index != share.user_index)
@ -946,14 +949,18 @@ where
cr_seed.ui_to_s_ks_seed_for_user_i::<DefaultSecureRng>(share.user_index), 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); 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| { ais.iter_rows_mut().for_each(|r_ai| {
RandomFillUniformInModulus::random_fill( RandomFillUniformInModulus::random_fill(
&mut ksk_prng, &mut ksk_prng,
rlwe_q, rlwe_q,
r_ai.as_mut(), r_ai.as_mut(),
); );
println!("{:?}", r_ai.as_ref());
nttop.forward(r_ai.as_mut()) nttop.forward(r_ai.as_mut())
}); });
println!("...END {}", share.user_index);
ais ais
}) })
.collect_vec(); .collect_vec();
@ -988,6 +995,9 @@ where
ring_size, ring_size,
); );
// set temp_space to all zeros
tmp_space.as_mut().fill(M::MatElement::zero());
// a_i*s + E // a_i*s + E
key_shares.iter().for_each(|s| { key_shares.iter().for_each(|s| {
rlwe_modop.elwise_add_mut( rlwe_modop.elwise_add_mut(
@ -1343,6 +1353,7 @@ where
let mut p_rng = DefaultSecureRng::new_seeded( let mut p_rng = DefaultSecureRng::new_seeded(
cr_seed.ui_to_s_ks_seed_for_user_i::<DefaultSecureRng>(self_index), cr_seed.ui_to_s_ks_seed_for_user_i::<DefaultSecureRng>(self_index),
); );
non_interactive_ksk_gen::<M, _, _, _, _, _>( non_interactive_ksk_gen::<M, _, _, _, _, _>(
client_key.sk_rlwe().values(), client_key.sk_rlwe().values(),
client_key.sk_u_rlwe().values(), client_key.sk_u_rlwe().values(),
@ -3108,6 +3119,7 @@ mod tests {
let mut neg_s_poly_eval = s_poly.clone(); let mut neg_s_poly_eval = s_poly.clone();
rlwe_modop.elwise_neg_mut(&mut neg_s_poly_eval); rlwe_modop.elwise_neg_mut(&mut neg_s_poly_eval);
nttop.forward(neg_s_poly_eval.as_mut()); nttop.forward(neg_s_poly_eval.as_mut());
rgsw_cts.iter().enumerate().for_each(|(s_index, ct)| { rgsw_cts.iter().enumerate().for_each(|(s_index, ct)| {
// X^{lwe_s[i]} // X^{lwe_s[i]}
let mut m = vec![0u64; ring_size]; let mut m = vec![0u64; ring_size];
@ -3125,7 +3137,7 @@ mod tests {
// RLWE'(-sm) // RLWE'(-sm)
gadget_vec_a.iter().enumerate().for_each(|(index, beta)| { gadget_vec_a.iter().enumerate().for_each(|(index, beta)| {
// RLWE(\beta -sm) // RLWE(\beta -sm)
dbg!(beta);
// \beta * -sX^[lwe_s[i]] // \beta * -sX^[lwe_s[i]]
let mut beta_neg_sm = neg_sm.clone(); let mut beta_neg_sm = neg_sm.clone();
rlwe_modop.elwise_scalar_mul_mut(&mut beta_neg_sm, beta); rlwe_modop.elwise_scalar_mul_mut(&mut beta_neg_sm, beta);
@ -3138,6 +3150,7 @@ mod tests {
// decrypt // decrypt
let mut m_out = vec![0u64; ring_size]; let mut m_out = vec![0u64; ring_size];
decrypt_rlwe(&rlwe, &ideal_rlwe, &mut m_out, nttop, rlwe_modop); decrypt_rlwe(&rlwe, &ideal_rlwe, &mut m_out, nttop, rlwe_modop);
// println!("{:?}", &beta_neg_sm);
let mut diff = m_out; let mut diff = m_out;
rlwe_modop.elwise_sub_mut(&mut diff, &beta_neg_sm); rlwe_modop.elwise_sub_mut(&mut diff, &beta_neg_sm);

+ 1
- 1
src/bool/parameters.rs

@ -504,7 +504,7 @@ pub(crate) const SMALL_MP_BOOL_PARAMS: BoolParameters = BoolParameters::
pub(crate) const NON_INTERACTIVE_SMALL_MP_BOOL_PARAMS: BoolParameters<u64> = BoolParameters::<u64> { pub(crate) const NON_INTERACTIVE_SMALL_MP_BOOL_PARAMS: BoolParameters<u64> = BoolParameters::<u64> {
rlwe_q: CiphertextModulus::new_non_native(36028797018820609), rlwe_q: CiphertextModulus::new_non_native(36028797018820609),
lwe_q: CiphertextModulus::new_non_native(1 << 20), lwe_q: CiphertextModulus::new_non_native(1 << 20),
br_q: 1 << 11,
br_q: 1 << 12,
rlwe_n: PolynomialSize(1 << 11), rlwe_n: PolynomialSize(1 << 11),
lwe_n: LweDimension(10), lwe_n: LweDimension(10),
lwe_decomposer_params: (DecompostionLogBase(4), DecompositionCount(5)), lwe_decomposer_params: (DecompostionLogBase(4), DecompositionCount(5)),

+ 12
- 2
src/multi_party.rs

@ -1,3 +1,5 @@
use std::fmt::Debug;
use itertools::izip; use itertools::izip;
use crate::{ use crate::{
@ -143,7 +145,7 @@ pub(crate) fn non_interactive_ksk_gen<
) -> M ) -> M
where where
<M as Matrix>::R: RowMut + TryConvertFrom1<[S], ModOp::M> + RowEntity, <M as Matrix>::R: RowMut + TryConvertFrom1<[S], ModOp::M> + RowEntity,
M::MatElement: Copy,
M::MatElement: Copy + Debug,
{ {
assert_eq!(s.len(), u.len()); assert_eq!(s.len(), u.len());
@ -159,10 +161,13 @@ where
let mut scratch_space = M::R::zeros(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)| { izip!(ksk.iter_rows_mut(), gadget_vec.iter()).for_each(|(e_ksk, beta)| {
// sample a_i // sample a_i
RandomFillUniformInModulus::random_fill(p_rng, q, e_ksk.as_mut()); RandomFillUniformInModulus::random_fill(p_rng, q, e_ksk.as_mut());
println!("{:?}", e_ksk.as_ref());
// a_i * s + e + beta u // a_i * s + e + beta u
nttop.forward(e_ksk.as_mut()); nttop.forward(e_ksk.as_mut());
modop.elwise_mul_mut(e_ksk.as_mut(), s_poly_eval.as_ref()); modop.elwise_mul_mut(e_ksk.as_mut(), s_poly_eval.as_ref());
@ -176,6 +181,7 @@ where
// a_i * s + e + \beta * u // a_i * s + e + \beta * u
modop.elwise_add_mut(e_ksk.as_mut(), scratch_space.as_ref()); modop.elwise_add_mut(e_ksk.as_mut(), scratch_space.as_ref());
}); });
println!("...END");
ksk ksk
} }
@ -197,7 +203,7 @@ pub(crate) fn non_interactive_ksk_zero_encryptions_for_other_party_i<
) -> M ) -> M
where where
<M as Matrix>::R: RowMut + TryConvertFrom1<[S], ModOp::M> + RowEntity, <M as Matrix>::R: RowMut + TryConvertFrom1<[S], ModOp::M> + RowEntity,
M::MatElement: Copy,
M::MatElement: Copy + Debug,
{ {
let q = modop.modulus(); let q = modop.modulus();
let d = gadget_vec.len(); let d = gadget_vec.len();
@ -211,9 +217,11 @@ where
let mut scratch_space = M::R::zeros(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)| { izip!(zero_encs.iter_rows_mut()).for_each(|(e_zero)| {
// sample a_i // sample a_i
RandomFillUniformInModulus::random_fill(p_rng, q, e_zero.as_mut()); RandomFillUniformInModulus::random_fill(p_rng, q, e_zero.as_mut());
println!("{:?}", e_zero.as_ref());
// a_i * s + e // a_i * s + e
nttop.forward(e_zero.as_mut()); nttop.forward(e_zero.as_mut());
@ -223,5 +231,7 @@ where
RandomFillGaussianInModulus::random_fill(rng, q, scratch_space.as_mut()); RandomFillGaussianInModulus::random_fill(rng, q, scratch_space.as_mut());
modop.elwise_add_mut(e_zero.as_mut(), scratch_space.as_ref()); modop.elwise_add_mut(e_zero.as_mut(), scratch_space.as_ref());
}); });
println!("...END");
zero_encs zero_encs
} }

Loading…
Cancel
Save