round5 0.1.2

Implementation of Round5 post-quantum PKE and KEM algorithms
Documentation
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
}