use crate::sample::g_trapdoor::{
gadget_classical::gen_trapdoor,
gadget_parameters::{GadgetParameters, GadgetParametersRing},
gadget_ring::gen_trapdoor_ring_lwe,
};
use qfall_math::{
integer::{MatPolyOverZ, MatZ, PolyOverZ, Z},
integer_mod_q::{MatPolynomialRingZq, MatZq, Modulus},
rational::Q,
};
pub fn gen_trapdoor_default(n: impl Into<Z>, q: impl Into<Modulus>) -> (MatZq, MatZ) {
let n = n.into();
assert!(n >= Z::ONE);
let params = GadgetParameters::init_default(n, q);
let a_bar = MatZq::sample_uniform(¶ms.n, ¶ms.m_bar, ¶ms.q);
let tag = MatZq::identity(¶ms.n, ¶ms.n, ¶ms.q);
gen_trapdoor(¶ms, &a_bar, &tag).unwrap()
}
pub fn gen_trapdoor_ring_default(
n: impl Into<Z>,
q: impl Into<Modulus>,
s: impl Into<Q>,
) -> (MatPolynomialRingZq, MatPolyOverZ, MatPolyOverZ) {
let n = n.into();
assert!(n >= Z::ONE);
let s = s.into();
let params = GadgetParametersRing::init_default(n, q);
let a_bar = PolyOverZ::sample_uniform(¶ms.n, 0, params.modulus.get_q()).unwrap();
gen_trapdoor_ring_lwe(¶ms, &a_bar, &s).unwrap()
}
#[cfg(test)]
mod test_gen_trapdoor_default {
use super::gen_trapdoor_default;
use crate::sample::g_trapdoor::gadget_classical::gen_gadget_mat;
use qfall_math::{
integer::{MatZ, Z},
traits::{Concatenate, MatrixDimensions, Pow},
};
#[test]
fn correct_default_dimensions() {
for n in [5, 10, 50] {
for k in [5, 10] {
let q = 2_i64.pow(k);
let n_log_2_pow_2 = Z::from(n).log_ceil(2).unwrap().pow(2).unwrap();
let m_bar = n * k + n_log_2_pow_2;
let m = &m_bar + n * k;
let (a, r) = gen_trapdoor_default(n, q);
assert_eq!(n as i64, a.get_num_rows());
assert_eq!(m, Z::from(a.get_num_columns()));
assert_eq!(m_bar, Z::from(r.get_num_rows()));
assert_eq!((n * k) as i64, r.get_num_columns());
}
}
}
#[test]
fn ensure_is_trapdoor() {
for n in [5i64, 10, 25] {
for k in [5, 10] {
let q = 2_i64.pow(k as u32);
let (a, r) = gen_trapdoor_default(n, q);
let trapdoor = r.concat_vertical(&MatZ::identity(n * k, n * k)).unwrap();
assert_eq!(
gen_gadget_mat(n, k, &Z::from(2)),
(a * trapdoor).get_representative_least_nonnegative_residue()
)
}
}
}
}