mirror of
https://github.com/arnaucube/phantom-zone.git
synced 2026-01-09 23:51:30 +01:00
make tests
This commit is contained in:
@@ -42,8 +42,8 @@ use crate::{
|
|||||||
fill_random_ternary_secret_with_hamming_weight, generate_prime, mod_exponent,
|
fill_random_ternary_secret_with_hamming_weight, generate_prime, mod_exponent,
|
||||||
puncture_p_rng, Global, TryConvertFrom1, WithLocal,
|
puncture_p_rng, Global, TryConvertFrom1, WithLocal,
|
||||||
},
|
},
|
||||||
Decryptor, Encryptor, Matrix, MatrixEntity, MatrixMut, MultiPartyDecryptor, Row, RowEntity,
|
Decryptor, Encoder, Encryptor, Matrix, MatrixEntity, MatrixMut, MultiPartyDecryptor, Row,
|
||||||
RowMut, Secret,
|
RowEntity, RowMut, Secret,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
@@ -292,6 +292,19 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<B> Encoder<bool, B::Element> for B
|
||||||
|
where
|
||||||
|
B: BoolEncoding,
|
||||||
|
{
|
||||||
|
fn encode(&self, v: bool) -> B::Element {
|
||||||
|
if v {
|
||||||
|
self.true_el()
|
||||||
|
} else {
|
||||||
|
self.false_el()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(super) struct BoolPbsInfo<M: Matrix, Ntt, RlweModOp, LweModOp> {
|
pub(super) struct BoolPbsInfo<M: Matrix, Ntt, RlweModOp, LweModOp> {
|
||||||
auto_decomposer: DefaultDecomposer<M::MatElement>,
|
auto_decomposer: DefaultDecomposer<M::MatElement>,
|
||||||
rlwe_rgsw_decomposer: (
|
rlwe_rgsw_decomposer: (
|
||||||
|
|||||||
@@ -372,11 +372,11 @@ mod impl_enc_dec {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use impl_enc_dec::NonInteractiveBatchedFheBools;
|
use impl_enc_dec::NonInteractiveBatchedFheBools;
|
||||||
use itertools::{izip, Itertools};
|
use itertools::{izip, Itertools};
|
||||||
use num_traits::ToPrimitive;
|
use num_traits::{FromPrimitive, PrimInt, ToPrimitive, Zero};
|
||||||
use rand::{thread_rng, RngCore};
|
use rand::{thread_rng, RngCore};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
backend::Modulus,
|
backend::{GetModulus, Modulus},
|
||||||
bool::{
|
bool::{
|
||||||
evaluator::{BoolEncoding, BooleanGates},
|
evaluator::{BoolEncoding, BooleanGates},
|
||||||
keys::SinglePartyClientKey,
|
keys::SinglePartyClientKey,
|
||||||
@@ -384,12 +384,49 @@ mod tests {
|
|||||||
lwe::decrypt_lwe,
|
lwe::decrypt_lwe,
|
||||||
rgsw::decrypt_rlwe,
|
rgsw::decrypt_rlwe,
|
||||||
utils::{Stats, TryConvertFrom1},
|
utils::{Stats, TryConvertFrom1},
|
||||||
ArithmeticOps, Encryptor, KeySwitchWithId, ModInit, MultiPartyDecryptor, NttInit,
|
ArithmeticOps, Encoder, Encryptor, KeySwitchWithId, ModInit, MultiPartyDecryptor, NttInit,
|
||||||
VectorOps,
|
Row, VectorOps,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
pub(crate) fn ideal_sk_rlwe(cks: &[ClientKey]) -> Vec<i32> {
|
||||||
|
let mut ideal_rlwe_sk = cks[0].sk_rlwe();
|
||||||
|
cks.iter().for_each(|k| {
|
||||||
|
let sk_rlwe = k.sk_rlwe();
|
||||||
|
izip!(ideal_rlwe_sk.iter_mut(), sk_rlwe.iter()).for_each(|(a, b)| {
|
||||||
|
*a = *a + b;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
ideal_rlwe_sk
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn measure_noise_lwe<
|
||||||
|
R: Row,
|
||||||
|
S,
|
||||||
|
Modop: ArithmeticOps<Element = R::Element>
|
||||||
|
+ GetModulus<M = CiphertextModulus<R::Element>, Element = R::Element>,
|
||||||
|
>(
|
||||||
|
lwe_ct: R,
|
||||||
|
m_expected: R::Element,
|
||||||
|
sk: &[S],
|
||||||
|
modop: &Modop,
|
||||||
|
) -> f64
|
||||||
|
where
|
||||||
|
R: TryConvertFrom1<[S], CiphertextModulus<R::Element>>,
|
||||||
|
R::Element: Zero + FromPrimitive + PrimInt,
|
||||||
|
{
|
||||||
|
let noisy_m = decrypt_lwe(&lwe_ct, &sk, modop);
|
||||||
|
let noise = modop.sub(&m_expected, &noisy_m);
|
||||||
|
modop
|
||||||
|
.modulus()
|
||||||
|
.map_element_to_i64(&noise)
|
||||||
|
.abs()
|
||||||
|
.to_f64()
|
||||||
|
.unwrap()
|
||||||
|
.log2()
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn non_interactive_mp_bool_nand() {
|
fn non_interactive_mp_bool_nand() {
|
||||||
set_parameter_set(ParameterSelector::NonInteractiveMultiPartyLessThanOrEqualTo16);
|
set_parameter_set(ParameterSelector::NonInteractiveMultiPartyLessThanOrEqualTo16);
|
||||||
@@ -411,16 +448,9 @@ mod tests {
|
|||||||
seeded_server_key.set_server_key();
|
seeded_server_key.set_server_key();
|
||||||
|
|
||||||
let parameters = BoolEvaluator::with_local(|e| e.parameters().clone());
|
let parameters = BoolEvaluator::with_local(|e| e.parameters().clone());
|
||||||
let nttop = NttBackendU64::new(parameters.rlwe_q(), parameters.rlwe_n().0);
|
let rlwe_modop = parameters.default_rlwe_modop();
|
||||||
let rlwe_q_modop = ModularOpsU64::new(*parameters.rlwe_q());
|
|
||||||
|
|
||||||
let mut ideal_rlwe_sk = vec![0i32; parameters.rlwe_n().0];
|
let ideal_sk_rlwe = ideal_sk_rlwe(&cks);
|
||||||
cks.iter().for_each(|k| {
|
|
||||||
let sk_rlwe = k.sk_rlwe();
|
|
||||||
izip!(ideal_rlwe_sk.iter_mut(), sk_rlwe.iter()).for_each(|(a, b)| {
|
|
||||||
*a = *a + b;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
let mut m0 = false;
|
let mut m0 = false;
|
||||||
let mut m1 = true;
|
let mut m1 = true;
|
||||||
@@ -449,12 +479,8 @@ mod tests {
|
|||||||
let m_expected = (m0 ^ m1);
|
let m_expected = (m0 ^ m1);
|
||||||
|
|
||||||
{
|
{
|
||||||
let noisy_m = decrypt_lwe(&ct_out, &ideal_rlwe_sk, &rlwe_q_modop);
|
let noisy_m = decrypt_lwe(&ct_out, &ideal_sk_rlwe, &rlwe_modop);
|
||||||
let noise = if m_expected {
|
let noise = rlwe_modop.sub(¶meters.rlwe_q().encode(m_expected), &noisy_m);
|
||||||
rlwe_q_modop.sub(¶meters.rlwe_q().true_el(), &noisy_m)
|
|
||||||
} else {
|
|
||||||
rlwe_q_modop.sub(¶meters.rlwe_q().false_el(), &noisy_m)
|
|
||||||
};
|
|
||||||
println!(
|
println!(
|
||||||
"Noise: {}",
|
"Noise: {}",
|
||||||
parameters
|
parameters
|
||||||
@@ -464,7 +490,10 @@ mod tests {
|
|||||||
.to_f64()
|
.to_f64()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.log2()
|
.log2()
|
||||||
)
|
);
|
||||||
|
// let noise = measure_noise_lwe(ct_out,
|
||||||
|
// parameters.rlwe_q().encode(m_expected), &ideal_sk_rlwe,
|
||||||
|
// &rlwe_modop); println!("Noise: {noise}");
|
||||||
}
|
}
|
||||||
|
|
||||||
assert!(m_out == m_expected, "Expected {m_expected} but got {m_out}");
|
assert!(m_out == m_expected, "Expected {m_expected} but got {m_out}");
|
||||||
@@ -513,13 +542,7 @@ mod tests {
|
|||||||
|
|
||||||
let message = m
|
let message = m
|
||||||
.iter()
|
.iter()
|
||||||
.map(|b| {
|
.map(|b| parameters.rlwe_q().encode(*b))
|
||||||
if *b {
|
|
||||||
parameters.rlwe_q().true_el()
|
|
||||||
} else {
|
|
||||||
parameters.rlwe_q().false_el()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect_vec();
|
.collect_vec();
|
||||||
|
|
||||||
let mut m_out = vec![0u64; parameters.rlwe_n().0];
|
let mut m_out = vec![0u64; parameters.rlwe_n().0];
|
||||||
|
|||||||
@@ -531,7 +531,19 @@ pub(crate) const NON_INTERACTIVE_SMALL_MP_BOOL_PARAMS: BoolParameters<u64> = Boo
|
|||||||
};
|
};
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::utils::generate_prime;
|
|
||||||
|
impl BoolParameters<u64> {
|
||||||
|
pub(crate) fn default_rlwe_modop(&self) -> ModularOpsU64<CiphertextModulus<u64>> {
|
||||||
|
ModularOpsU64::new(self.rlwe_q)
|
||||||
|
}
|
||||||
|
pub(crate) fn default_rlwe_nttop(&self) -> NttBackendU64 {
|
||||||
|
NttBackendU64::new(&self.rlwe_q, self.rlwe_n.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
use crate::{utils::generate_prime, ModInit, ModularOpsU64, Ntt, NttBackendU64, NttInit};
|
||||||
|
|
||||||
|
use super::{BoolParameters, CiphertextModulus};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn find_prime() {
|
fn find_prime() {
|
||||||
|
|||||||
@@ -183,3 +183,7 @@ pub trait MultiPartyDecryptor<M, C> {
|
|||||||
pub trait KeySwitchWithId<C> {
|
pub trait KeySwitchWithId<C> {
|
||||||
fn key_switch(&self, user_id: usize) -> C;
|
fn key_switch(&self, user_id: usize) -> C;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) trait Encoder<F, T> {
|
||||||
|
fn encode(&self, v: F) -> T;
|
||||||
|
}
|
||||||
|
|||||||
@@ -273,6 +273,7 @@ where
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|
||||||
use super::is_probably_prime;
|
use super::is_probably_prime;
|
||||||
// let n = 1 << (11 + 1);
|
// let n = 1 << (11 + 1);
|
||||||
// let mut start = 1 << 55;
|
// let mut start = 1 << 55;
|
||||||
|
|||||||
Reference in New Issue
Block a user