modify rgsw/runtime ot use traits

This commit is contained in:
Janmajaya Mall
2024-06-29 19:22:15 +05:30
parent e4ceab23d8
commit bc02262f9d
7 changed files with 1260 additions and 1214 deletions

View File

@@ -25,15 +25,15 @@ use crate::{
RandomFillUniformInModulus, RandomGaussianElementInModulus,
},
rgsw::{
decrypt_rlwe, generate_auto_map, public_key_encrypt_rgsw, rgsw_by_rgsw_inplace, rlwe_auto,
secret_key_encrypt_rgsw, seeded_auto_key_gen,
decrypt_rlwe, generate_auto_map, public_key_encrypt_rgsw, rgsw_by_rgsw_inplace,
rgsw_x_rgsw_scratch_rows, rlwe_auto, secret_key_encrypt_rgsw, seeded_auto_key_gen,
RgswCiphertext, RgswCiphertextMutRef, RgswCiphertextRef, RuntimeScratchMutRef,
},
utils::{
encode_x_pow_si_with_emebedding_factor, fill_random_ternary_secret_with_hamming_weight,
generate_prime, mod_exponent, puncture_p_rng, Global, TryConvertFrom1, WithLocal,
},
Decryptor, Encoder, Encryptor, Matrix, MatrixEntity, MatrixMut, MultiPartyDecryptor, Row,
RowEntity, RowMut, Secret,
Encoder, Matrix, MatrixEntity, MatrixMut, RowEntity, RowMut,
};
use super::{
@@ -45,10 +45,7 @@ use super::{
SeededMultiPartyServerKey, SeededNonInteractiveMultiPartyServerKey,
SeededSinglePartyServerKey, SinglePartyClientKey,
},
parameters::{
BoolParameters, CiphertextModulus, DecompositionCount, DecompostionLogBase,
DoubleDecomposerParams,
},
parameters::{BoolParameters, CiphertextModulus, DecompositionCount, DoubleDecomposerParams},
};
/// Common reference seed used for Interactive multi-party,
@@ -1146,12 +1143,12 @@ where
// rgsw ciphertext (most expensive part!)
let rgsw_cts = {
let rgsw_by_rgsw_decomposer =
let rgsw_x_rgsw_decomposer =
parameters.rgsw_rgsw_decomposer::<DefaultDecomposer<M::MatElement>>();
let rlwe_x_rgsw_decomposer = self.pbs_info().rlwe_rgsw_decomposer();
let rgsw_x_rgsw_dimension = (
rgsw_by_rgsw_decomposer.a().decomposition_count() * 2
+ rgsw_by_rgsw_decomposer.b().decomposition_count() * 2,
rgsw_x_rgsw_decomposer.a().decomposition_count() * 2
+ rgsw_x_rgsw_decomposer.b().decomposition_count() * 2,
rlwe_n,
);
let rlwe_x_rgsw_dimension = (
@@ -1159,11 +1156,9 @@ where
+ rlwe_x_rgsw_decomposer.b().decomposition_count() * 2,
rlwe_n,
);
let mut rgsw_x_rgsw_scratch_mat = M::zeros(
std::cmp::max(
rgsw_by_rgsw_decomposer.a().decomposition_count(),
rgsw_by_rgsw_decomposer.b().decomposition_count(),
) + rlwe_x_rgsw_dimension.0,
let mut rgsw_x_rgsw_scratch = M::zeros(
rgsw_x_rgsw_scratch_rows(rlwe_x_rgsw_decomposer, &rgsw_x_rgsw_decomposer),
rlwe_n,
);
@@ -1216,15 +1211,22 @@ where
.for_each(|r| rlweq_nttop.forward(r.as_mut()));
rgsw_by_rgsw_inplace(
&mut rgsw_i,
rlwe_x_rgsw_decomposer.a().decomposition_count(),
rlwe_x_rgsw_decomposer.b().decomposition_count(),
&other_rgsw_i,
&rgsw_by_rgsw_decomposer,
&mut rgsw_x_rgsw_scratch_mat,
&mut RgswCiphertextMutRef::new(
rgsw_i.as_mut(),
rlwe_x_rgsw_decomposer.a().decomposition_count(),
rlwe_x_rgsw_decomposer.b().decomposition_count(),
),
&RgswCiphertextRef::new(
other_rgsw_i.as_ref(),
rgsw_x_rgsw_decomposer.a().decomposition_count(),
rgsw_x_rgsw_decomposer.b().decomposition_count(),
),
rlwe_x_rgsw_decomposer,
&rgsw_x_rgsw_decomposer,
&mut RuntimeScratchMutRef::new(rgsw_x_rgsw_scratch.as_mut()),
rlweq_nttop,
rlweq_modop,
)
);
});
rgsw_cts.push(rgsw_i);
@@ -1370,11 +1372,7 @@ where
};
let mut scratch_rgsw_x_rgsw = M::zeros(
std::cmp::max(
rgsw_x_rgsw_decomposer.a().decomposition_count(),
rgsw_x_rgsw_decomposer.b().decomposition_count(),
) + rlwe_x_rgsw_decomposer.a().decomposition_count() * 2
+ rlwe_x_rgsw_decomposer.b().decomposition_count() * 2,
rgsw_x_rgsw_scratch_rows(&rlwe_x_rgsw_decomposer, &rgsw_x_rgsw_decomposer),
self.parameters().rlwe_n().0,
);
@@ -1534,7 +1532,7 @@ where
(0..total_users)
.filter(|i| *i != user_id)
.for_each(|other_user_id| {
let other_rgsw_i = produce_rgsw_ciphertext_from_ni_rgsw(
let mut other_rgsw_i = produce_rgsw_ciphertext_from_ni_rgsw(
key_shares[other_user_id]
.ni_rgsw_cts_for_self_not_leader_lwe_index(lwe_index),
&ni_rgsw_zero_encs,
@@ -1551,12 +1549,21 @@ where
);
rgsw_by_rgsw_inplace(
&mut rgsw_i,
rlwe_x_rgsw_decomposer.a().decomposition_count(),
rlwe_x_rgsw_decomposer.b().decomposition_count(),
&other_rgsw_i,
&mut RgswCiphertextMutRef::new(
rgsw_i.as_mut(),
rlwe_x_rgsw_decomposer.a().decomposition_count(),
rlwe_x_rgsw_decomposer.b().decomposition_count(),
),
&RgswCiphertextRef::new(
other_rgsw_i.as_ref(),
rgsw_x_rgsw_decomposer.a().decomposition_count(),
rgsw_x_rgsw_decomposer.b().decomposition_count(),
),
&rlwe_x_rgsw_decomposer,
&rgsw_x_rgsw_decomposer,
&mut scratch_rgsw_x_rgsw,
&mut RuntimeScratchMutRef::new(
scratch_rgsw_x_rgsw.as_mut(),
),
nttop,
rlwe_modop,
)
@@ -2096,9 +2103,7 @@ where
});
let e = DefaultSecureRng::with_local_mut(|rng| {
let mut e =
RandomGaussianElementInModulus::random(rng, self.pbs_info.parameters.rlwe_q());
e
RandomGaussianElementInModulus::random(rng, self.pbs_info.parameters.rlwe_q())
});
let share = modop.add(&neg_sa, &e);

View File

@@ -4,7 +4,6 @@ use crate::{
backend::{ModInit, VectorOps},
pbs::WithShoupRepr,
random::{NewWithSeed, RandomFillUniformInModulus},
rgsw::RlweSecret,
utils::{ToShoup, WithLocal},
Decryptor, Encryptor, Matrix, MatrixEntity, MatrixMut, MultiPartyDecryptor, RowEntity, RowMut,
};

View File

@@ -10,7 +10,10 @@ use crate::{
lwe::{decrypt_lwe, lwe_key_switch},
parameters::{BoolParameters, CiphertextModulus},
random::{DefaultSecureRng, RandomFillUniformInModulus},
rgsw::{decrypt_rlwe, rlwe_auto, IsTrivial, RlweCiphertext},
rgsw::{
decrypt_rlwe, rlwe_auto, rlwe_auto_scratch_rows, RlweCiphertextMutRef, RlweKskRef,
RuntimeScratchMutRef,
},
utils::{encode_x_pow_si_with_emebedding_factor, tests::Stats, TryConvertFrom1},
ArithmeticOps, ClientKey, Decomposer, MatrixEntity, MatrixMut, ModInit, Ntt, NttInit,
RowEntity, RowMut, VectorOps,
@@ -223,7 +226,8 @@ where
let br_q = parameters.br_q();
let g_dlogs = parameters.auto_element_dlogs();
let auto_decomposer = parameters.auto_decomposer::<D>();
let mut scratch_matrix = M::zeros(auto_decomposer.decomposition_count() + 2, rlwe_n);
let mut scratch_matrix = M::zeros(rlwe_auto_scratch_rows(&auto_decomposer), rlwe_n);
let mut scratch_matrix_ref = RuntimeScratchMutRef::new(scratch_matrix.as_mut());
g_dlogs.iter().for_each(|k| {
let g_pow_k = if *k == 0 {
@@ -279,19 +283,22 @@ where
// RLWE auto sends part A, A(X), of RLWE to A(X^{g^k}) and then multiplies it
// with -s(X^{g^k}) using auto key. Deliberately set RLWE = (0, m(X))
// (ie. m in part A) to get back RLWE(-m(X^{g^k})s(X^{g^k}))
let mut rlwe = RlweCiphertext::<_, DefaultSecureRng>::new_trivial(M::zeros(2, rlwe_n));
rlwe.data.get_row_mut(0).copy_from_slice(m.as_ref());
rlwe.set_not_trivial();
let mut rlwe = M::zeros(2, rlwe_n);
rlwe.get_row_mut(0).copy_from_slice(m.as_ref());
rlwe_auto(
&mut rlwe,
server_key.galois_key_for_auto(*k),
&mut scratch_matrix,
&mut RlweCiphertextMutRef::new(rlwe.as_mut()),
&RlweKskRef::new(
server_key.galois_key_for_auto(*k).as_ref(),
auto_decomposer.decomposition_count(),
),
&mut scratch_matrix_ref,
&auto_index_map,
&auto_sign_map,
&rlwe_modop,
&rlwe_nttop,
&auto_decomposer,
false,
);
// decrypt RLWE(-m(X)s(X^{g^k]}))
@@ -430,7 +437,7 @@ mod tests {
set_parameter_set(crate::ParameterSelector::NonInteractiveLTE2Party);
set_common_reference_seed(NonInteractiveMultiPartyCrs::random().seed);
let parties = 2;
let cks = (0..parties).map(|i| gen_client_key()).collect_vec();
let cks = (0..parties).map(|_| gen_client_key()).collect_vec();
let server_key_shares = cks
.iter()
.enumerate()