summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2015-03-17 07:46:55 -0400
committerJesse Luehrs <doy@tozt.net>2015-03-17 08:21:12 -0400
commit07b711c7736dcf0a7f25ec7a59ae4bffa2c3df9d (patch)
tree34a86585c2b7f4af8a143101dbd46082a26ae0a2 /tests
parent8da56e330ebf3141249e2f48e7ffcb7e2d65dbc0 (diff)
downloadmatasano-07b711c7736dcf0a7f25ec7a59ae4bffa2c3df9d.tar.gz
matasano-07b711c7736dcf0a7f25ec7a59ae4bffa2c3df9d.zip
problem 11
Diffstat (limited to 'tests')
-rw-r--r--tests/lib.rs58
1 files changed, 58 insertions, 0 deletions
diff --git a/tests/lib.rs b/tests/lib.rs
index 553213a..d1bc806 100644
--- a/tests/lib.rs
+++ b/tests/lib.rs
@@ -1,9 +1,11 @@
extern crate matasano;
extern crate "rustc-serialize" as serialize;
+extern crate rand;
use std::io::prelude::*;
use std::fs::File;
+use rand::{Rng, thread_rng};
use serialize::base64::FromBase64;
use serialize::hex::FromHex;
@@ -29,6 +31,16 @@ fn read (filename: &str) -> Vec<u8> {
return outfh.bytes().map(|c| c.unwrap()).collect();
}
+fn random_aes_128_key () -> [u8; 16] {
+ let mut key = [0; 16];
+ thread_rng().fill_bytes(&mut key);
+ return key;
+}
+
+fn coinflip () -> bool {
+ thread_rng().gen()
+}
+
#[test]
fn problem_1 () {
let hex = "49276d206b696c6c696e6720796f757220627261\
@@ -127,3 +139,49 @@ fn problem_10 () {
let got = matasano::decrypt_aes_128_cbc(&ciphertext[..], key, &[0; 16]);
assert_eq!(got, plaintext);
}
+
+#[test]
+fn problem_11 () {
+ static mut last_mode: matasano::BlockCipherMode = matasano::BlockCipherMode::ECB;
+
+ fn random_padding (input: &[u8]) -> Vec<u8> {
+ let front_padding: Vec<u8> = thread_rng()
+ .gen_iter()
+ .take(thread_rng().gen_range(5, 10))
+ .collect();
+ let back_padding: Vec<u8> = thread_rng()
+ .gen_iter()
+ .take(thread_rng().gen_range(5, 10))
+ .collect();
+ return front_padding
+ .iter()
+ .chain(input.iter())
+ .chain(back_padding.iter())
+ .map(|x| *x)
+ .collect()
+ }
+
+ fn random_encrypter (input: &[u8]) -> Vec<u8> {
+ let key = random_aes_128_key();
+ let padded_input = random_padding(input);
+ if coinflip() {
+ unsafe {
+ last_mode = matasano::BlockCipherMode::ECB;
+ }
+ return matasano::encrypt_aes_128_ecb(&padded_input[..], &key[..]);
+ }
+ else {
+ unsafe {
+ last_mode = matasano::BlockCipherMode::CBC;
+ }
+ let iv = random_aes_128_key();
+ return matasano::encrypt_aes_128_cbc(&padded_input[..], &key[..], &iv[..]);
+ }
+ }
+
+ for _ in 0..100 {
+ let got = matasano::detect_ecb_cbc(random_encrypter);
+ let expected = unsafe { &last_mode };
+ assert_eq!(&got, expected);
+ }
+}