diff --git a/src/pbs.rs b/src/pbs.rs index a8a3ea1..000dab6 100644 --- a/src/pbs.rs +++ b/src/pbs.rs @@ -155,11 +155,7 @@ pub(crate) fn pbs< gb_monomial_sign = false } // monomial mul - let mut trivial_rlwe_test_poly = RlweCiphertext::<_, DefaultSecureRng> { - data: M::zeros(2, rlwe_n), - is_trivial: true, - _phatom: PhantomData, - }; + let mut trivial_rlwe_test_poly = M::zeros(2, rlwe_n); if pbs_info.embedding_factor() == 1 { monomial_mul( test_vec.as_ref(), @@ -218,16 +214,15 @@ pub(crate) fn pbs< /// /// gk_to_si: [g^0, ..., g^{q/2-1}, -g^0, -g^1, .., -g^{q/2-1}] fn blind_rotation< - MT: IsTrivial + MatrixMut, - Mmut: MatrixMut, - D: Decomposer, - NttOp: Ntt, - ModOp: ArithmeticOps + ShoupMatrixFMA, + Mmut: MatrixMut, + D: Decomposer, + NttOp: Ntt, + ModOp: ArithmeticOps + ShoupMatrixFMA, MShoup: WithShoupRepr, K: PbsKey, P: PbsInfo, >( - trivial_rlwe_test_poly: &mut MT, + trivial_rlwe_test_poly: &mut Mmut, scratch_matrix: &mut Mmut, _g: isize, w: usize, @@ -242,8 +237,9 @@ fn blind_rotation< ) where ::R: RowMut, Mmut::MatElement: Copy + Zero, - ::R: RowMut, { + let mut is_trivial = true; + let q_by_4 = q >> 2; let mut count = 0; // -(g^k) @@ -263,7 +259,9 @@ fn blind_rotation< rlwe_rgsw_decomposer, ntt_op, mod_op, + is_trivial, ); + is_trivial = false; // println!("Rlwe x Rgsw time: {:?}", new.elapsed()); }); v += 1; @@ -283,6 +281,7 @@ fn blind_rotation< mod_op, ntt_op, auto_decomposer, + is_trivial, ); // println!("Auto time: {:?}", now.elapsed()); @@ -303,7 +302,9 @@ fn blind_rotation< rlwe_rgsw_decomposer, ntt_op, mod_op, + is_trivial, ); + is_trivial = false; }); let (auto_map_index, auto_map_sign) = parameters.rlwe_auto_map(0); @@ -318,6 +319,7 @@ fn blind_rotation< mod_op, ntt_op, auto_decomposer, + is_trivial, ); count += 1; } @@ -336,7 +338,9 @@ fn blind_rotation< rlwe_rgsw_decomposer, ntt_op, mod_op, + is_trivial, ); + is_trivial = false; }); v += 1; @@ -353,6 +357,7 @@ fn blind_rotation< mod_op, ntt_op, auto_decomposer, + is_trivial, ); v = 0; count += 1; @@ -370,7 +375,9 @@ fn blind_rotation< rlwe_rgsw_decomposer, ntt_op, mod_op, + is_trivial, ); + is_trivial = false; }); // println!("Auto count: {count}"); } diff --git a/src/rgsw/mod.rs b/src/rgsw/mod.rs index 26c786c..2ae3597 100644 --- a/src/rgsw/mod.rs +++ b/src/rgsw/mod.rs @@ -762,11 +762,7 @@ pub(crate) mod tests { // rlwe x rgsw with additional RGSW ciphertexts in shoup repr let rlwe_in_ct_shoup = { - let mut rlwe_in_ct_shoup = RlweCiphertext::<_, DefaultSecureRng> { - data: rlwe_in_ct.data.clone(), - is_trivial: rlwe_in_ct.is_trivial, - _phatom: PhantomData::default(), - }; + let mut rlwe_in_ct_shoup = rlwe_in_ct.data.clone(); let rgsw_ct_shoup = ShoupRgswCiphertextEvaluationDomain::from(&rgsw_ct); @@ -778,6 +774,7 @@ pub(crate) mod tests { &decomposer, &ntt_op, &mod_op, + false, ); rlwe_in_ct_shoup @@ -797,7 +794,7 @@ pub(crate) mod tests { // output from both functions must be equal { - assert_eq!(rlwe_in_ct.data, rlwe_in_ct_shoup.data); + assert_eq!(rlwe_in_ct.data, rlwe_in_ct_shoup); } // Decrypt RLWE(m0m1) @@ -907,11 +904,7 @@ pub(crate) mod tests { // galois auto with additional auto key in shoup repr let rlwe_m_shoup = { let auto_key_shoup = ShoupAutoKeyEvaluationDomain::from(&auto_key); - let mut rlwe_m_shoup = RlweCiphertext::<_, DefaultSecureRng> { - data: rlwe_m.data.clone(), - is_trivial: rlwe_m.is_trivial, - _phatom: PhantomData::default(), - }; + let mut rlwe_m_shoup = rlwe_m.data.clone(); galois_auto_shoup( &mut rlwe_m_shoup, &auto_key.data, @@ -922,6 +915,7 @@ pub(crate) mod tests { &mod_op, &ntt_op, &decomposer, + false, ); rlwe_m_shoup }; @@ -941,7 +935,7 @@ pub(crate) mod tests { } // rlwe out from both functions must be same - assert_eq!(rlwe_m.data, rlwe_m_shoup.data); + assert_eq!(rlwe_m.data, rlwe_m_shoup); let rlwe_m_k = rlwe_m; diff --git a/src/rgsw/runtime.rs b/src/rgsw/runtime.rs index f4ba44b..db34679 100644 --- a/src/rgsw/runtime.rs +++ b/src/rgsw/runtime.rs @@ -195,15 +195,14 @@ pub(crate) fn rlwe_auto< /// key switching polynomials in evaluation domain, shoup representation, /// `ksk_shoup`, of the polynomials in evaluation domain is also supplied. pub(crate) fn galois_auto_shoup< - MT: Matrix + IsTrivial + MatrixMut, - Mmut: MatrixMut, - ModOp: ArithmeticOps + Mmut: MatrixMut, + ModOp: ArithmeticOps // + VectorOps + ShoupMatrixFMA, - NttOp: Ntt, - D: Decomposer, + NttOp: Ntt, + D: Decomposer, >( - rlwe_in: &mut MT, + rlwe_in: &mut Mmut, ksk: &Mmut, ksk_shoup: &Mmut, scratch_matrix: &mut Mmut, @@ -212,10 +211,10 @@ pub(crate) fn galois_auto_shoup< mod_op: &ModOp, ntt_op: &NttOp, decomposer: &D, + is_trivial: bool, ) where ::R: RowMut, - ::R: RowMut, - MT::MatElement: Copy + Zero, + Mmut::MatElement: Copy + Zero, { let d = decomposer.decomposition_count(); let ring_size = rlwe_in.dimension().1; @@ -228,7 +227,7 @@ pub(crate) fn galois_auto_shoup< debug_assert!(tmp_rlwe_out.len() == 2); debug_assert!(scratch_matrix_d_ring.len() == d); - if !rlwe_in.is_trivial() { + if !is_trivial { tmp_rlwe_out.iter_mut().for_each(|r| { r.as_mut().fill(Mmut::MatElement::zero()); }); @@ -436,22 +435,21 @@ pub(crate) fn rlwe_by_rgsw< /// evaluation domain, `rgsw_in_shoup`, is also supplied. pub(crate) fn rlwe_by_rgsw_shoup< Mmut: MatrixMut, - MT: Matrix + MatrixMut + IsTrivial, D: RlweDecomposer, ModOp: ShoupMatrixFMA, NttOp: Ntt, >( - rlwe_in: &mut MT, + rlwe_in: &mut Mmut, rgsw_in: &Mmut, rgsw_in_shoup: &Mmut, scratch_matrix: &mut Mmut, decomposer: &D, ntt_op: &NttOp, mod_op: &ModOp, + is_trivial: bool, ) where Mmut::MatElement: Copy + Zero, ::R: RowMut, - ::R: RowMut, { let decomposer_a = decomposer.a(); let decomposer_b = decomposer.b(); @@ -472,7 +470,7 @@ pub(crate) fn rlwe_by_rgsw_shoup< scratch_rlwe_out[0].as_mut().fill(Mmut::MatElement::zero()); // RLWE_in = a_in, b_in; RLWE_out = a_out, b_out - if !rlwe_in.is_trivial() { + if !is_trivial { // a_in = 0 when RLWE_in is trivial RLWE ciphertext // decomp decompose_r( @@ -541,7 +539,6 @@ pub(crate) fn rlwe_by_rgsw_shoup< rlwe_in .get_row_mut(1) .copy_from_slice(scratch_rlwe_out[1].as_mut()); - rlwe_in.set_not_trivial(); } /// Inplace mutates RGSW(m0) to equal RGSW(m0m1) = RGSW(m0)xRGSW(m1)