diff options
author | Jesse Luehrs <doy@tozt.net> | 2015-03-20 10:00:26 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2015-03-20 10:00:26 -0400 |
commit | e47104a3369cc76e718b0c68d4faf69fdcd7f2ee (patch) | |
tree | b303104058ce613ca067fb0f94be99f747a68b81 /tests | |
parent | 1b809825ec0b5e4ef0fed2776d410e1d79e7a7e8 (diff) | |
download | matasano-e47104a3369cc76e718b0c68d4faf69fdcd7f2ee.tar.gz matasano-e47104a3369cc76e718b0c68d4faf69fdcd7f2ee.zip |
problem 13
Diffstat (limited to 'tests')
-rw-r--r-- | tests/lib.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/tests/lib.rs b/tests/lib.rs index 577eeb4..629b7c2 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -2,6 +2,8 @@ extern crate matasano; extern crate "rustc-serialize" as serialize; extern crate rand; +use std::borrow::ToOwned; +use std::collections::HashMap; use std::io::prelude::*; use std::fs::File; @@ -210,3 +212,43 @@ fn problem_12 () { let got = matasano::crack_padded_aes_128_ecb(&random_encrypter); assert_eq!(got, padding); } + +#[test] +fn problem_13 () { + fn profile_for (email: &str) -> String { + let mut params = HashMap::new(); + params.insert("email", email); + params.insert("uid", "10"); + params.insert("role", "user"); + return matasano::create_query_string(params); + } + + let key = random_aes_128_key(); + let encrypter = |email: &str| -> Vec<u8> { + matasano::encrypt_aes_128_ecb(profile_for(email).as_bytes(), &key[..]) + }; + let decrypter = |ciphertext: &[u8]| -> Option<HashMap<String, String>> { + let plaintext = matasano::decrypt_aes_128_ecb(ciphertext, &key[..]); + let plaintext_str = std::str::from_utf8(&plaintext[..]).unwrap(); + if let Some(params) = matasano::parse_query_string(plaintext_str) { + return Some( + params + .into_iter() + .map(|(k, v)| (String::from_str(k), String::from_str(v))) + .collect() + ); + } + else { + return None; + } + }; + + let (email, ciphertexts) = matasano::crack_querystring_aes_128_ecb(encrypter); + let mut expected = HashMap::new(); + expected.insert(String::from_str("email"), email); + expected.insert(String::from_str("uid"), String::from_str("10")); + expected.insert(String::from_str("role"), String::from_str("admin")); + assert!(ciphertexts.iter().any(|ciphertext| { + decrypter(ciphertext).map(|params| params == expected).unwrap_or(false) + })); +} |