mirror of
https://github.com/arnaucube/phantom-zone.git
synced 2026-01-07 22:51:29 +01:00
put gadget_vector inside decomposer
This commit is contained in:
@@ -10,7 +10,7 @@ use num_traits::{FromPrimitive, Num, One, PrimInt, ToPrimitive, WrappingSub, Zer
|
||||
|
||||
use crate::{
|
||||
backend::{ArithmeticOps, ModInit, ModularOpsU64, VectorOps},
|
||||
decomposer::{gadget_vector, Decomposer, DefaultDecomposer, NumInfo},
|
||||
decomposer::{Decomposer, DefaultDecomposer, NumInfo},
|
||||
lwe::{decrypt_lwe, encrypt_lwe, lwe_key_switch, lwe_ksk_keygen, measure_noise_lwe, LweSecret},
|
||||
multi_party::public_key_share,
|
||||
ntt::{self, Ntt, NttBackendU64, NttInit},
|
||||
@@ -715,11 +715,7 @@ where
|
||||
let sk_rlwe = &client_key.sk_rlwe;
|
||||
let sk_lwe = &client_key.sk_lwe;
|
||||
|
||||
let d_rgsw_gadget_vec = gadget_vector(
|
||||
self.parameters.rlwe_logq,
|
||||
self.parameters.logb_rgsw,
|
||||
self.parameters.d_rgsw,
|
||||
);
|
||||
let d_rgsw_gadget_vec = self.decomposer_rlwe.gadget_vector();
|
||||
|
||||
// generate auto keys -g, g
|
||||
let mut auto_keys = HashMap::new();
|
||||
@@ -775,11 +771,7 @@ where
|
||||
.collect_vec();
|
||||
|
||||
// LWE KSK from RLWE secret s -> LWE secret z
|
||||
let d_lwe_gadget = gadget_vector(
|
||||
self.parameters.lwe_logq,
|
||||
self.parameters.logb_lwe,
|
||||
self.parameters.d_lwe,
|
||||
);
|
||||
let d_lwe_gadget = self.decomposer_lwe.gadget_vector();
|
||||
|
||||
let mut lwe_ksk = M::R::zeros(self.parameters.d_lwe * ring_size);
|
||||
lwe_ksk_keygen(
|
||||
@@ -822,8 +814,7 @@ where
|
||||
let rlwe_q = self.parameters.rlwe_q;
|
||||
let lwe_q = self.parameters.lwe_q;
|
||||
|
||||
let d_rgsw_gadget_vec =
|
||||
gadget_vector(self.parameters.rlwe_logq, self.parameters.logb_rgsw, d_rgsw);
|
||||
let d_rgsw_gadget_vec = self.decomposer_rlwe.gadget_vector();
|
||||
|
||||
let rlweq_modop = ModOp::new(rlwe_q);
|
||||
let rlweq_nttop = NttOp::new(rlwe_q, ring_size);
|
||||
@@ -887,8 +878,7 @@ where
|
||||
// LWE ksk
|
||||
let mut lwe_ksk = M::R::zeros(d_lwe * ring_size);
|
||||
let lwe_modop = ModOp::new(lwe_q);
|
||||
let d_lwe_gadget_vec =
|
||||
gadget_vector(self.parameters.lwe_logq, self.parameters.logb_lwe, d_lwe);
|
||||
let d_lwe_gadget_vec = self.decomposer_lwe.gadget_vector();
|
||||
lwe_ksk_keygen(
|
||||
sk_rlwe.values(),
|
||||
sk_lwe.values(),
|
||||
@@ -1944,8 +1934,10 @@ mod tests {
|
||||
let lwe_q = 1 << lwe_logq;
|
||||
let d_lwe = 1;
|
||||
let logb_lwe = 6;
|
||||
let lwe_gadgect_vec = gadget_vector(lwe_logq, logb_lwe, d_lwe);
|
||||
let lweq_modop = ModularOpsU64::new(lwe_q);
|
||||
|
||||
let decomposer = DefaultDecomposer::new(lwe_q, logb_lwe, d_lwe);
|
||||
let lwe_gadgect_vec = decomposer.gadget_vector();
|
||||
let logp = 2;
|
||||
|
||||
let from_lwe_n = 2048;
|
||||
@@ -2020,7 +2012,6 @@ mod tests {
|
||||
// Key switch
|
||||
let lwe_ct_key_switched = {
|
||||
let mut lwe_ct_key_switched = vec![0u64; to_lwe_n + 1];
|
||||
let decomposer = DefaultDecomposer::new(lwe_q, logb_lwe, d_lwe);
|
||||
lwe_key_switch(
|
||||
&mut lwe_ct_key_switched,
|
||||
&lwe_ct,
|
||||
@@ -2214,12 +2205,7 @@ mod tests {
|
||||
|
||||
// Measure noise in RGSW ciphertexts of ideal LWE secrets
|
||||
if true {
|
||||
let gadget_vec = gadget_vector(
|
||||
bool_evaluator.parameters.rlwe_logq,
|
||||
bool_evaluator.parameters.logb_rgsw,
|
||||
bool_evaluator.parameters.d_rgsw,
|
||||
);
|
||||
|
||||
let gadget_vec = rlwe_decomposer.gadget_vector();
|
||||
for i in 0..20 {
|
||||
// measure noise in RGSW(s[i])
|
||||
let si =
|
||||
@@ -2548,11 +2534,7 @@ mod tests {
|
||||
let rlwe_nttop = &bool_evaluator.rlwe_nttop;
|
||||
let rlwe_modop = &bool_evaluator.rlwe_modop;
|
||||
let rlwe_decomposer = &bool_evaluator.decomposer_rlwe;
|
||||
let rlwe_gadget_vector = gadget_vector(
|
||||
bool_evaluator.parameters.rlwe_logq,
|
||||
bool_evaluator.parameters.logb_rgsw,
|
||||
d_rgsw,
|
||||
);
|
||||
let rlwe_gadget_vector = rlwe_decomposer.gadget_vector();
|
||||
|
||||
let parties = (0..no_of_parties)
|
||||
.map(|_| bool_evaluator.client_key())
|
||||
|
||||
@@ -4,7 +4,7 @@ use std::{fmt::Debug, marker::PhantomData, ops::Rem};
|
||||
|
||||
use crate::backend::{ArithmeticOps, ModularOpsU64};
|
||||
|
||||
pub fn gadget_vector<T: PrimInt>(logq: usize, logb: usize, d: usize) -> Vec<T> {
|
||||
fn gadget_vector<T: PrimInt>(logq: usize, logb: usize, d: usize) -> Vec<T> {
|
||||
let d_ideal = (logq as f64 / logb as f64).ceil().to_usize().unwrap();
|
||||
let ignored_limbs = d_ideal - d;
|
||||
(ignored_limbs..ignored_limbs + d)
|
||||
@@ -83,6 +83,10 @@ impl<T: PrimInt + NumInfo + Debug> DefaultDecomposer<T> {
|
||||
}
|
||||
value
|
||||
}
|
||||
|
||||
pub(crate) fn gadget_vector(&self) -> Vec<T> {
|
||||
return gadget_vector(self.logq, self.logb, self.d);
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: PrimInt + WrappingSub + Debug> Decomposer for DefaultDecomposer<T> {
|
||||
|
||||
@@ -274,7 +274,7 @@ mod tests {
|
||||
|
||||
use crate::{
|
||||
backend::{ModInit, ModularOpsU64},
|
||||
decomposer::{gadget_vector, DefaultDecomposer},
|
||||
decomposer::DefaultDecomposer,
|
||||
lwe::{lwe_key_switch, measure_noise_lwe},
|
||||
random::DefaultSecureRng,
|
||||
rgsw::measure_noise,
|
||||
@@ -342,7 +342,8 @@ mod tests {
|
||||
let mut seeded_ksk =
|
||||
SeededLweKeySwitchingKey::empty(lwe_in_n, lwe_out_n, d_ks, ksk_seed, q);
|
||||
let mut p_rng = DefaultSecureRng::new_seeded(ksk_seed);
|
||||
let gadget = gadget_vector(logq, logb, d_ks);
|
||||
let decomposer = DefaultDecomposer::new(q, logb, d_ks);
|
||||
let gadget = decomposer.gadget_vector();
|
||||
lwe_ksk_keygen(
|
||||
&lwe_sk_in.values(),
|
||||
&lwe_sk_out.values(),
|
||||
|
||||
@@ -4,7 +4,7 @@ mod tests {
|
||||
|
||||
use crate::{
|
||||
backend::{ArithmeticOps, ModInit, ModularOpsU64},
|
||||
decomposer::{gadget_vector, Decomposer, DefaultDecomposer},
|
||||
decomposer::{Decomposer, DefaultDecomposer},
|
||||
ntt::{Ntt, NttBackendU64, NttInit},
|
||||
random::{DefaultSecureRng, RandomGaussianDist, RandomUniformDist},
|
||||
rgsw::{
|
||||
@@ -30,7 +30,8 @@ mod tests {
|
||||
let sk = RlweSecret::random((ring_size >> 1) as usize, ring_size as usize);
|
||||
|
||||
let mut rng = DefaultSecureRng::new();
|
||||
let gadget_vector = gadget_vector(logq, logb, d0);
|
||||
let decomposer = DefaultDecomposer::new(q, logb, d0);
|
||||
let gadget_vector = decomposer.gadget_vector();
|
||||
|
||||
for i in 0..100 {
|
||||
// m should have norm 1
|
||||
@@ -82,7 +83,6 @@ mod tests {
|
||||
|
||||
// RLWE(m0m1) = RLWE(m1) x RGSW(m0)
|
||||
let mut scratch = vec![vec![0u64; ring_size]; d0 + 2];
|
||||
let decomposer = DefaultDecomposer::new(q, logb, d0);
|
||||
less1_rlwe_by_rgsw(
|
||||
&mut rlwe,
|
||||
&rgsw.data,
|
||||
@@ -122,9 +122,9 @@ mod tests {
|
||||
let sk = RlweSecret::random((ring_size >> 1) as usize, ring_size as usize);
|
||||
|
||||
let mut rng = DefaultSecureRng::new();
|
||||
let gadget_vector = gadget_vector(logq, logb, d0);
|
||||
|
||||
let decomposer = DefaultDecomposer::new(q, logb, d0);
|
||||
let gadget_vector = decomposer.gadget_vector();
|
||||
|
||||
for i in 0..100 {
|
||||
let modq_op = ModularOpsU64::new(q);
|
||||
|
||||
16
src/rgsw.rs
16
src/rgsw.rs
@@ -1502,7 +1502,7 @@ pub(crate) mod tests {
|
||||
|
||||
use crate::{
|
||||
backend::{ModInit, ModularOpsU64, VectorOps},
|
||||
decomposer::{gadget_vector, DefaultDecomposer},
|
||||
decomposer::DefaultDecomposer,
|
||||
ntt::{self, Ntt, NttBackendU64, NttInit},
|
||||
random::{DefaultSecureRng, NewWithSeed, RandomUniformDist},
|
||||
rgsw::{
|
||||
@@ -1600,7 +1600,8 @@ pub(crate) mod tests {
|
||||
|
||||
let ntt_op = NttBackendU64::new(q, ring_size as usize);
|
||||
let mod_op = ModularOpsU64::new(q);
|
||||
let gadget_vector = gadget_vector(logq, logb, d_rgsw);
|
||||
let decomposer = DefaultDecomposer::new(q, logb, d_rgsw);
|
||||
let gadget_vector = decomposer.gadget_vector();
|
||||
|
||||
// Encrypt m1 as RGSW(m1)
|
||||
let rgsw_ct = {
|
||||
@@ -1665,7 +1666,6 @@ pub(crate) mod tests {
|
||||
|
||||
// RLWE(m0m1) = RLWE(m0) x RGSW(m1)
|
||||
let mut scratch_space = vec![vec![0u64; ring_size as usize]; d_rgsw + 2];
|
||||
let decomposer = DefaultDecomposer::new(q, logb, d_rgsw);
|
||||
rlwe_by_rgsw(
|
||||
&mut rlwe_in_ct,
|
||||
&rgsw_ct.data,
|
||||
@@ -1752,8 +1752,8 @@ pub(crate) mod tests {
|
||||
|
||||
let ntt_op = NttBackendU64::new(q, ring_size as usize);
|
||||
let mod_op = ModularOpsU64::new(q);
|
||||
let gadget_vector = gadget_vector(logq, logb, d_rgsw);
|
||||
let decomposer = DefaultDecomposer::new(q, logb, d_rgsw);
|
||||
let gadget_vector = decomposer.gadget_vector();
|
||||
|
||||
let mul_mod = |v0: &u64, v1: &u64| ((*v0 as u128 * *v1 as u128) % (q as u128)) as u64;
|
||||
|
||||
@@ -1930,8 +1930,8 @@ pub(crate) mod tests {
|
||||
let mut rng = DefaultSecureRng::new();
|
||||
let ntt_op = NttBackendU64::new(q, ring_size as usize);
|
||||
let mod_op = ModularOpsU64::new(q);
|
||||
let gadget_vector = gadget_vector(logq, logb, d_rgsw);
|
||||
let decomposer = DefaultDecomposer::new(q, logb, d_rgsw);
|
||||
let gadget_vector = decomposer.gadget_vector();
|
||||
|
||||
let mul_mod = |a: &u64, b: &u64| ((*a as u128 * *b as u128) % q as u128) as u64;
|
||||
|
||||
@@ -2051,8 +2051,8 @@ pub(crate) mod tests {
|
||||
let mut rng = DefaultSecureRng::new();
|
||||
let ntt_op = NttBackendU64::new(q, ring_size as usize);
|
||||
let mod_op = ModularOpsU64::new(q);
|
||||
let gadget_vector = gadget_vector(logq, logb, d_rgsw);
|
||||
let decomposer = DefaultDecomposer::new(q, logb, d_rgsw);
|
||||
let gadget_vector = decomposer.gadget_vector();
|
||||
let mul_mod = |a: &u64, b: &u64| ((*a as u128 * *b as u128) % q as u128) as u64;
|
||||
|
||||
let mut carry_m = vec![0u64; ring_size as usize];
|
||||
@@ -2167,7 +2167,8 @@ pub(crate) mod tests {
|
||||
rng.fill_bytes(&mut seed_auto);
|
||||
let mut seeded_auto_key = SeededAutoKey::empty(ring_size as usize, d_rgsw, seed_auto, q);
|
||||
let mut p_rng = DefaultSecureRng::new_seeded(seed_auto);
|
||||
let gadget_vector = gadget_vector(logq, logb, d_rgsw);
|
||||
let decomposer = DefaultDecomposer::new(q, logb, d_rgsw);
|
||||
let gadget_vector = decomposer.gadget_vector();
|
||||
galois_key_gen(
|
||||
&mut seeded_auto_key.data,
|
||||
s.values(),
|
||||
@@ -2186,7 +2187,6 @@ pub(crate) mod tests {
|
||||
// Send RLWE_{s}(m) -> RLWE_{s}(m^k)
|
||||
let mut scratch_space = vec![vec![0u64; ring_size as usize]; d_rgsw + 2];
|
||||
let (auto_map_index, auto_map_sign) = generate_auto_map(ring_size as usize, auto_k);
|
||||
let decomposer = DefaultDecomposer::new(q, logb, d_rgsw);
|
||||
galois_auto(
|
||||
&mut rlwe_m,
|
||||
&auto_key.data,
|
||||
|
||||
Reference in New Issue
Block a user