use crate::types::Random;
use crate::r5_hash::hash;
use crate::parameters::Parameters;
use crate::r5_cpa_pke::{r5_cpa_pke_keygen, r5_cpa_pke_encrypt, r5_cpa_pke_decrypt};
pub fn r5_cpa_kem_keygen(pk: &mut [u8], sk: &mut [u8], drbg: &mut dyn Random, params: &Parameters) {
r5_cpa_pke_keygen(pk, sk, drbg, params);
}
pub fn r5_cpa_kem_encapsulate(pk: &[u8], drbg: &mut dyn Random, params: &Parameters) -> (Vec<u8>, Vec<u8>) {
let mut ct = vec![0u8; params.c_ct];
let mut k = vec![0u8; params.c_b];
let mut m = vec![0u8; params.kappa_bytes as usize];
drbg.fill_bytes(&mut m);
let mut rho = vec![0u8; params.kappa_bytes as usize];
drbg.fill_bytes(&mut rho);
r5_cpa_pke_encrypt(&mut ct, pk, &m, &rho, params);
let mut hash_input: Vec<u8> = Vec::with_capacity(params.kappa_bytes as usize + params.ct_size as usize);
hash_input.extend(&m);
hash_input.extend(&ct);
hash(&mut k, &hash_input, params.kappa_bytes);
(k, ct)
}
pub fn r5_cpa_kem_decapsulate(ct: &[u8], sk: &[u8], params: &Parameters) -> Vec<u8> {
let mut k = vec![0u8; params.c_b];
let mut m = vec![0u8; params.kappa_bytes as usize];
r5_cpa_pke_decrypt(&mut m, sk, ct, params);
let mut hash_input: Vec<u8> = Vec::with_capacity(params.kappa_bytes as usize + params.ct_size as usize);
hash_input.extend(&m);
hash_input.extend(ct);
hash(&mut k, &hash_input, params.kappa_bytes);
k
}