diff --git a/test/katrunner/Cargo.lock b/test/katrunner/Cargo.lock index d6f2e2ae..f8a29eb7 100644 --- a/test/katrunner/Cargo.lock +++ b/test/katrunner/Cargo.lock @@ -1,5 +1,15 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "aes_ctr_drbg" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a42e20bb5f9502c40bee62428fae5d67b5c111b4a48502bbea4b284da790d0" +dependencies = [ + "hex", + "rust-crypto", +] + [[package]] name = "aho-corasick" version = "0.7.15" @@ -170,6 +180,7 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" name = "katrunner" version = "0.1.0" dependencies = [ + "aes_ctr_drbg", "hex", "katwalk", "lazy_static", diff --git a/test/katrunner/Cargo.toml b/test/katrunner/Cargo.toml index ee1d8744..c5adb4dc 100644 --- a/test/katrunner/Cargo.toml +++ b/test/katrunner/Cargo.toml @@ -10,4 +10,5 @@ pqc-sys = { path = "../../src/rustapi/pqc-sys" } hex = "0.4.2" threadpool = "1.8.1" rust-crypto = "^0.2" -lazy_static = "1.4.0" \ No newline at end of file +lazy_static = "1.4.0" +aes_ctr_drbg = "0.0.2" \ No newline at end of file diff --git a/test/katrunner/src/drbg.rs b/test/katrunner/src/drbg.rs deleted file mode 100644 index 56fdded9..00000000 --- a/test/katrunner/src/drbg.rs +++ /dev/null @@ -1,113 +0,0 @@ -// -// Modified version of AES-CTR-DRBG by Bassham & Lawrence. -// Copyright © 2017 Bassham, Lawrence E (Fed). All rights reserved. -// Rust implementation by K. Kwiatkowski. All rights reserved. -// -pub mod ctr { - use crypto::aes; - use crypto::buffer::{ RefReadBuffer, RefWriteBuffer, BufferResult }; - - pub struct DrbgCtx{ - pub reseed_counter: usize, - pub key: [u8;32], - pub ctr: [u8;16] - } - - impl DrbgCtx { - const CTR_LEN: usize = 16; - const KEY_LEN: usize = 32; - pub const fn new() -> Self { - Self { - reseed_counter: 0, - key: [0; DrbgCtx::KEY_LEN], - ctr: [0; DrbgCtx::CTR_LEN] - } - } - - fn inc(&mut self) { - for i in 0..16 { - let j = 15-i; - if self.ctr[j] == 0xFF { - self.ctr[j] = 0 - } else { - self.ctr[j] = self.ctr[j] + 1; - break; - } - } - } - - fn process_aes_block(&self, block: &mut [u8]) { - let mut e = aes::ecb_encryptor( - aes::KeySize::KeySize256, - &self.key, - crypto::blockmodes::NoPadding); - let mut r = RefReadBuffer::new(&self.ctr); - let mut w = RefWriteBuffer::new(block); - match e.encrypt(&mut r, &mut w, true).unwrap() { - BufferResult::BufferOverflow => panic!("Wrong implementation"), - BufferResult::BufferUnderflow => {} - } - } - - fn update(&mut self, seed: &[u8]) { - let mut t = vec![0;48]; - - for i in 0..3 { - self.inc(); - self.process_aes_block(&mut t[i*16..]); - } - for i in 0..seed.len() { - t[i] ^= seed[i]; - } - for i in 0..32 { - self.key[i] = t[i]; - } - for i in 32..48 { - self.ctr[i-32] = t[i]; - } - } - - pub fn init(&mut self, entropy: &[u8], diversifier: Vec) { - let mut m = vec![0;48]; - for i in 0..48 { - m[i] = entropy[i]; - } - if diversifier.len() >= 48 { - for i in 0..48 { - m[i] ^= diversifier[i]; - } - } - self.key = [0; DrbgCtx::KEY_LEN]; - self.ctr = [0; DrbgCtx::CTR_LEN]; - self.update(m.as_slice()); - self.reseed_counter = 1; - } - - pub fn get_random(&mut self, data: &mut [u8]) { - let mut i = 0; - let mut b = vec![0; 16]; - let mut l = data.len(); - - while l > 0 { - self.inc(); - self.process_aes_block(&mut b); - - if l > 15 { - for k in 0..16 { - data[i+k] = b[k]; - } - i += 16; - l -= 16; - } else { - for k in 0..l { - data[i+k] = b[k]; - } - l = 0; - } - } - - self.update(Vec::new().as_slice()); - self.reseed_counter = self.reseed_counter+1; - } - } -} diff --git a/test/katrunner/src/main.rs b/test/katrunner/src/main.rs index 00808ec6..6e6dad92 100644 --- a/test/katrunner/src/main.rs +++ b/test/katrunner/src/main.rs @@ -5,14 +5,12 @@ use std::env; use std::path::Path; use threadpool::ThreadPool; use std::convert::TryInto; -use drbg::ctr::DrbgCtx; +use aes_ctr_drbg::DrbgCtx; use std::collections::HashMap; use std::thread; use std::sync::Mutex; use lazy_static::lazy_static; -mod drbg; - // Used for signature algorithm registration macro_rules! REG_SIGN { ($ID:expr,$F:expr) => {