Add NIST test vectors.
This commit is contained in:
@@ -30,7 +30,8 @@ macro_rules! expand128 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AES128 {
|
impl AES128 {
|
||||||
pub fn new(base_key: &[u8; 16]) -> AES128 {
|
pub fn new(base_key: &[u8]) -> AES128 {
|
||||||
|
assert_eq!(base_key.len(), 16);
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut expanded_enc: [__m128i; 11] = uninitialized();
|
let mut expanded_enc: [__m128i; 11] = uninitialized();
|
||||||
let mut expanded_dec: [__m128i; 11] = uninitialized();
|
let mut expanded_dec: [__m128i; 11] = uninitialized();
|
||||||
@@ -122,6 +123,7 @@ fn unpack_m128(b: __m128i) -> (u64, u64)
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod aes128 {
|
mod aes128 {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use testing::run_test;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn expansion() {
|
fn expansion() {
|
||||||
@@ -180,6 +182,23 @@ mod aes128 {
|
|||||||
0xd8,0xcd,0xb7,0x80,0x70,0xb4,0xc5,0x5a]);
|
0xd8,0xcd,0xb7,0x80,0x70,0xb4,0xc5,0x5a]);
|
||||||
assert_eq!(input2.to_vec(), aeskey2.decrypt(&cipher2));
|
assert_eq!(input2.to_vec(), aeskey2.decrypt(&cipher2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn nist_test_vectors() {
|
||||||
|
let fname = "testdata/aes/aes128.test";
|
||||||
|
run_test(fname.to_string(), 3, |case| {
|
||||||
|
let (negk, kbytes) = case.get("k").unwrap();
|
||||||
|
let (negp, pbytes) = case.get("p").unwrap();
|
||||||
|
let (negc, cbytes) = case.get("c").unwrap();
|
||||||
|
|
||||||
|
assert!(!negk && !negp && !negc);
|
||||||
|
let key = AES128::new(&kbytes);
|
||||||
|
let cipher = key.encrypt(&pbytes);
|
||||||
|
let plain = key.decrypt(&cipher);
|
||||||
|
assert_eq!(&cipher, cbytes);
|
||||||
|
assert_eq!(&plain, pbytes);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -206,7 +225,8 @@ macro_rules! expand256 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AES256 {
|
impl AES256 {
|
||||||
pub fn new(base_key: &[u8; 32]) -> AES256 {
|
pub fn new(base_key: &[u8]) -> AES256 {
|
||||||
|
assert_eq!(base_key.len(), 32);
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut expanded_enc: [__m128i; 15] = uninitialized();
|
let mut expanded_enc: [__m128i; 15] = uninitialized();
|
||||||
let mut expanded_dec: [__m128i; 15] = uninitialized();
|
let mut expanded_dec: [__m128i; 15] = uninitialized();
|
||||||
@@ -304,6 +324,7 @@ impl AES256 {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod aes256 {
|
mod aes256 {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use testing::run_test;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn expansion() {
|
fn expansion() {
|
||||||
@@ -371,4 +392,21 @@ mod aes256 {
|
|||||||
0xea,0xfc,0x49,0x90,0x4b,0x49,0x60,0x89]);
|
0xea,0xfc,0x49,0x90,0x4b,0x49,0x60,0x89]);
|
||||||
assert_eq!(input.to_vec(), aeskey.decrypt(&cipher));
|
assert_eq!(input.to_vec(), aeskey.decrypt(&cipher));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn nist_test_vectors() {
|
||||||
|
let fname = "testdata/aes/aes256.test";
|
||||||
|
run_test(fname.to_string(), 3, |case| {
|
||||||
|
let (negk, kbytes) = case.get("k").unwrap();
|
||||||
|
let (negp, pbytes) = case.get("p").unwrap();
|
||||||
|
let (negc, cbytes) = case.get("c").unwrap();
|
||||||
|
|
||||||
|
assert!(!negk && !negp && !negc);
|
||||||
|
let key = AES256::new(&kbytes);
|
||||||
|
let cipher = key.encrypt(&pbytes);
|
||||||
|
let plain = key.decrypt(&cipher);
|
||||||
|
assert_eq!(&cipher, cbytes);
|
||||||
|
assert_eq!(&plain, pbytes);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -385,10 +385,11 @@ struct AES128 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AES128 {
|
impl AES128 {
|
||||||
pub fn new(base_key: &[u8; 16]) -> AES128 {
|
pub fn new(base_key: &[u8]) -> AES128 {
|
||||||
let mut expanded = [0; AES128_STATE_WORDS];
|
let mut expanded = [0; AES128_STATE_WORDS];
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
|
|
||||||
|
assert_eq!(base_key.len(), 16);
|
||||||
// while (i < Nk)
|
// while (i < Nk)
|
||||||
// w[i] = word(key[4*i],key[4*i+1],key[4*i+2],key[4*i+3])
|
// w[i] = word(key[4*i],key[4*i+1],key[4*i+2],key[4*i+3])
|
||||||
// i = i+1
|
// i = i+1
|
||||||
@@ -481,6 +482,7 @@ impl AES128 {
|
|||||||
mod aes128 {
|
mod aes128 {
|
||||||
use super::*;
|
use super::*;
|
||||||
use super::aes256::RandomBlock;
|
use super::aes256::RandomBlock;
|
||||||
|
use testing::run_test;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn fips197_key_expansion_example() {
|
fn fips197_key_expansion_example() {
|
||||||
@@ -559,6 +561,23 @@ mod aes128 {
|
|||||||
block2 == block.block.to_vec()
|
block2 == block.block.to_vec()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn nist_test_vectors() {
|
||||||
|
let fname = "testdata/aes/aes128.test";
|
||||||
|
run_test(fname.to_string(), 3, |case| {
|
||||||
|
let (negk, kbytes) = case.get("k").unwrap();
|
||||||
|
let (negp, pbytes) = case.get("p").unwrap();
|
||||||
|
let (negc, cbytes) = case.get("c").unwrap();
|
||||||
|
|
||||||
|
assert!(!negk && !negp && !negc);
|
||||||
|
let key = AES128::new(&kbytes);
|
||||||
|
let cipher = key.encrypt(&pbytes);
|
||||||
|
let plain = key.decrypt(&cipher);
|
||||||
|
assert_eq!(&cipher, cbytes);
|
||||||
|
assert_eq!(&plain, pbytes);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************************************/
|
/**************************************************************************************************/
|
||||||
@@ -577,10 +596,11 @@ struct AES256 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AES256 {
|
impl AES256 {
|
||||||
pub fn new(base_key: &[u8; 32]) -> AES256 {
|
pub fn new(base_key: &[u8]) -> AES256 {
|
||||||
let mut expanded = [0; AES256_STATE_WORDS];
|
let mut expanded = [0; AES256_STATE_WORDS];
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
|
|
||||||
|
assert_eq!(base_key.len(), 32);
|
||||||
// while (i < Nk)
|
// while (i < Nk)
|
||||||
// w[i] = word(key[4*i],key[4*i+1],key[4*i+2],key[4*i+3])
|
// w[i] = word(key[4*i],key[4*i+1],key[4*i+2],key[4*i+3])
|
||||||
// i = i+1
|
// i = i+1
|
||||||
@@ -677,6 +697,7 @@ impl AES256 {
|
|||||||
mod aes256 {
|
mod aes256 {
|
||||||
use quickcheck::{Arbitrary,Gen};
|
use quickcheck::{Arbitrary,Gen};
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use testing::run_test;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn fips197_key_expansion_example() {
|
fn fips197_key_expansion_example() {
|
||||||
@@ -793,5 +814,22 @@ mod aes256 {
|
|||||||
block2 == block.block.to_vec()
|
block2 == block.block.to_vec()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn nist_test_vectors() {
|
||||||
|
let fname = "testdata/aes/aes256.test";
|
||||||
|
run_test(fname.to_string(), 3, |case| {
|
||||||
|
let (negk, kbytes) = case.get("k").unwrap();
|
||||||
|
let (negp, pbytes) = case.get("p").unwrap();
|
||||||
|
let (negc, cbytes) = case.get("c").unwrap();
|
||||||
|
|
||||||
|
assert!(!negk && !negp && !negc);
|
||||||
|
let key = AES256::new(&kbytes);
|
||||||
|
let cipher = key.encrypt(&pbytes);
|
||||||
|
let plain = key.decrypt(&cipher);
|
||||||
|
assert_eq!(&cipher, cbytes);
|
||||||
|
assert_eq!(&plain, pbytes);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1704
testdata/aes/aes128.test
vendored
Normal file
1704
testdata/aes/aes128.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2430
testdata/aes/aes256.test
vendored
Normal file
2430
testdata/aes/aes256.test
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user