Merge pull request #205 from rlkelly/203__test_key_generation
203 test key generation
This commit is contained in:
commit
4eb1bc08a7
|
@ -3,6 +3,7 @@
|
||||||
use generic_array::GenericArray;
|
use generic_array::GenericArray;
|
||||||
use generic_array::typenum::{U32, U64};
|
use generic_array::typenum::{U32, U64};
|
||||||
use rand::{ChaChaRng, Rng, SeedableRng};
|
use rand::{ChaChaRng, Rng, SeedableRng};
|
||||||
|
use rayon::prelude::*;
|
||||||
use ring::error::Unspecified;
|
use ring::error::Unspecified;
|
||||||
use ring::rand::SecureRandom;
|
use ring::rand::SecureRandom;
|
||||||
use ring::signature::Ed25519KeyPair;
|
use ring::signature::Ed25519KeyPair;
|
||||||
|
@ -88,12 +89,85 @@ impl SecureRandom for GenKeys {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
pub struct GenKeys2 {
|
||||||
|
// This is necessary because the rng needs to mutate its state to remain
|
||||||
|
// deterministic, and the fill trait requires an immuatble reference to self
|
||||||
|
generator: RefCell<ChaChaRng>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GenKeys2 {
|
||||||
|
pub fn new(seed_values: &[u8]) -> GenKeys2 {
|
||||||
|
let seed: &[u8] = &seed_values[..];
|
||||||
|
let rng: ChaChaRng = SeedableRng::from_seed(unsafe { mem::transmute(seed) });
|
||||||
|
GenKeys2 {
|
||||||
|
generator: RefCell::new(rng),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_key(&self) -> Vec<u8> {
|
||||||
|
KeyPair::generate_pkcs8(self).unwrap().to_vec()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn gen_n_seeds(&self, n_seeds: i64) -> Vec<[u8; 16]> {
|
||||||
|
let mut rng = self.generator.borrow_mut();
|
||||||
|
|
||||||
|
let seeds = (0..n_seeds)
|
||||||
|
.into_iter()
|
||||||
|
.map(|_| {
|
||||||
|
let seed: [u8; 16] = rng.gen();
|
||||||
|
seed
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
seeds
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn gen_n_keys(&self, n_keys: i64, tokens_per_user: i64) -> Vec<(Vec<u8>, i64)> {
|
||||||
|
let keys = self.gen_n_seeds(n_keys);
|
||||||
|
|
||||||
|
let users: Vec<_> = keys
|
||||||
|
.into_par_iter()
|
||||||
|
.map(|seed| {
|
||||||
|
let new: GenKeys2 = GenKeys2::new(&seed[..]);
|
||||||
|
let pkcs8 = KeyPair::generate_pkcs8(&new).unwrap().to_vec();
|
||||||
|
(pkcs8, tokens_per_user)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
users
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SecureRandom for GenKeys2 {
|
||||||
|
fn fill(&self, dest: &mut [u8]) -> Result<(), Unspecified> {
|
||||||
|
let mut rng = self.generator.borrow_mut();
|
||||||
|
rng.fill_bytes(dest);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[cfg(all(feature = "unstable", test))]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
extern crate test;
|
||||||
|
|
||||||
|
use self::test::Bencher;
|
||||||
use super::*;
|
use super::*;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::iter::FromIterator;
|
use std::iter::FromIterator;
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn bench_gen_keys(b: &mut Bencher) {
|
||||||
|
let seed: &[_] = &[1, 2, 3, 4];
|
||||||
|
let rnd = GenKeys::new(seed);
|
||||||
|
b.iter(|| rnd.gen_n_keys(1000, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn bench_gen_keys2(b: &mut Bencher) {
|
||||||
|
let seed: &[_] = &[1, 2, 3, 4];
|
||||||
|
let rnd = GenKeys2::new(seed);
|
||||||
|
b.iter(|| rnd.gen_n_keys(1000, 1));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_new_key_is_redundant() {
|
fn test_new_key_is_redundant() {
|
||||||
let seed: &[_] = &[1, 2, 3, 4];
|
let seed: &[_] = &[1, 2, 3, 4];
|
||||||
|
|
Loading…
Reference in New Issue