use aes_ctr_drbg crate
This commit is contained in:
vanhempi
ebaeebc5da
commit
188e672764
11
test/katrunner/Cargo.lock
generated
11
test/katrunner/Cargo.lock
generated
@ -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",
|
||||
|
@ -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"
|
||||
lazy_static = "1.4.0"
|
||||
aes_ctr_drbg = "0.0.2"
|
@ -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<u8>) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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) => {
|
||||
|
Ladataan…
Viittaa uudesa ongelmassa
Block a user