round5 0.1.2

Implementation of Round5 post-quantum PKE and KEM algorithms
Documentation
use crate::drbg::{DRBG};
use crate::parameters::Parameters;


static PERM_CUSTOMIZATION: [u8; 2] = [0, 1];


pub fn permutation_tau_1(seed: &[u8], params: &Parameters) -> Vec<u32> {
    let mut drbg = DRBG::new(seed, Some(&PERM_CUSTOMIZATION));
    let mut perm: Vec<u32> = Vec::with_capacity(params.d as usize);
    let mut rnd: u16;
    for i in 0u32..params.d as u32 {
        rnd = drbg.sampler16(params.d as u32);
        perm.push(i * params.d as u32 + rnd as u32);
    }
    perm
}


pub fn permutation_tau_2(seed: &[u8], params: &Parameters) -> Vec<u32> {
    let mut drbg = DRBG::new(seed, Some(&PERM_CUSTOMIZATION));
    let mut perm: Vec<u32> = Vec::with_capacity(params.d as usize);
    let mut rnd: u16;
    let mut v = vec![0u8; params.tau2_len as usize];
    for _ in 0u32..params.k as u32 {
        while {
            rnd = drbg.sampler16_2(params.tau2_len);
            v[rnd as usize] != 0
        } {};
        v[rnd as usize] = 1;
        perm.push(rnd as u32);
    }
    perm
}