mirror of
https://github.com/arnaucube/phantom-zone.git
synced 2026-01-09 23:51:30 +01:00
fix non-interactive RGSW key gen
This commit is contained in:
@@ -112,7 +112,7 @@ impl<S: Default + Copy> NonInteractiveMultiPartyCrs<S> {
|
|||||||
|
|
||||||
// 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);
|
||||||
|
|||||||
@@ -504,7 +504,7 @@ pub(crate) const SMALL_MP_BOOL_PARAMS: BoolParameters<u64> = BoolParameters::<u6
|
|||||||
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)),
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user