use polynomial_ring::Polynomial;
use std::collections::HashMap;
use crate::utils::{Parameters, add_vec, mul_mat_vec_simple, gen_small_vector, gen_uniform_matrix,compress};
pub fn keygen(
params: &Parameters,
seed: Option<u64> ) -> ((Vec<Vec<Polynomial<i64>>>, Vec<Polynomial<i64>>), Vec<Polynomial<i64>>) {
let (n,q,k,f,omega) = (params.n, params.q, params.k, ¶ms.f, params.omega);
let a = gen_uniform_matrix(n, k, q, seed);
let sk = gen_small_vector(n, k, seed);
let e = gen_small_vector(n, k, seed);
let t = add_vec(&mul_mat_vec_simple(&a, &sk, q, &f, omega), &e, q, &f);
((a, t), sk)
}
pub fn keygen_string(params: &Parameters, seed: Option<u64>) -> HashMap<String, String> {
let (pk, sk) = keygen(params, seed);
let mut pk_coeffs: Vec<i64> = pk.0
.iter()
.flat_map(|row| {
row.iter().flat_map(|poly| {
let mut coeffs = poly.coeffs().to_vec();
coeffs.resize(params.n, 0); coeffs
})
})
.collect();
pk_coeffs.extend(
pk.1.iter()
.flat_map(|poly| {
let mut coeffs = poly.coeffs().to_vec();
coeffs.resize(params.n, 0); coeffs
})
);
let sk_coeffs: Vec<i64> = sk
.iter()
.flat_map(|poly| {
let mut coeffs = poly.coeffs().to_vec();
coeffs.resize(params.n, 0); coeffs
})
.collect();
let mut keys: HashMap<String, String> = HashMap::new();
keys.insert(String::from("secret"), compress(&sk_coeffs));
keys.insert(String::from("public"), compress(&pk_coeffs));
keys
}