summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2015-03-28 03:28:25 -0400
committerJesse Luehrs <doy@tozt.net>2015-03-28 03:28:25 -0400
commit1505a949589b17837319a292a07e1c15ed9296e4 (patch)
tree551764e450e4a8f0b9e367dc331c1bd1b87aab62 /tests
parentcf487bb3c09d4e0532bd452ad3aa5eb292b176ba (diff)
downloadmatasano-1505a949589b17837319a292a07e1c15ed9296e4.tar.gz
matasano-1505a949589b17837319a292a07e1c15ed9296e4.zip
problem 17
Diffstat (limited to 'tests')
-rw-r--r--tests/lib.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/tests/lib.rs b/tests/lib.rs
index 4ebeebf..5fb8261 100644
--- a/tests/lib.rs
+++ b/tests/lib.rs
@@ -344,3 +344,51 @@ fn problem_16 () {
let ciphertext = matasano::crack_cbc_bitflipping(&encode);
assert!(verify(&ciphertext[..]));
}
+
+#[test]
+fn problem_17 () {
+ let strings = [
+ &b"MDAwMDAwTm93IHRoYXQgdGhlIHBhcnR5IGlzIGp1bXBpbmc="[..],
+ &b"MDAwMDAxV2l0aCB0aGUgYmFzcyBraWNrZWQgaW4gYW5kIHRoZSBWZWdhJ3MgYXJlIHB1bXBpbic="[..],
+ &b"MDAwMDAyUXVpY2sgdG8gdGhlIHBvaW50LCB0byB0aGUgcG9pbnQsIG5vIGZha2luZw=="[..],
+ &b"MDAwMDAzQ29va2luZyBNQydzIGxpa2UgYSBwb3VuZCBvZiBiYWNvbg=="[..],
+ &b"MDAwMDA0QnVybmluZyAnZW0sIGlmIHlvdSBhaW4ndCBxdWljayBhbmQgbmltYmxl"[..],
+ &b"MDAwMDA1SSBnbyBjcmF6eSB3aGVuIEkgaGVhciBhIGN5bWJhbA=="[..],
+ &b"MDAwMDA2QW5kIGEgaGlnaCBoYXQgd2l0aCBhIHNvdXBlZCB1cCB0ZW1wbw=="[..],
+ &b"MDAwMDA3SSdtIG9uIGEgcm9sbCwgaXQncyB0aW1lIHRvIGdvIHNvbG8="[..],
+ &b"MDAwMDA4b2xsaW4nIGluIG15IGZpdmUgcG9pbnQgb2g="[..],
+ &b"MDAwMDA5aXRoIG15IHJhZy10b3AgZG93biBzbyBteSBoYWlyIGNhbiBibG93"[..],
+ ];
+ let key = random_aes_128_key();
+
+ static mut chosen_plaintext: Option<&'static[u8]> = None;
+ let encrypter = || {
+ let plaintext = strings[thread_rng().gen_range(0, strings.len())];
+ unsafe { chosen_plaintext = Some(plaintext) };
+ let iv = random_aes_128_key();
+ return (
+ iv,
+ matasano::encrypt_aes_128_cbc(plaintext, &key[..], &iv[..])
+ );
+ };
+
+ let validator = |iv: &[u8], ciphertext: &[u8]| {
+ let plaintext = matasano::decrypt_aes_128_cbc(
+ ciphertext,
+ &key[..],
+ &iv[..]
+ );
+ return plaintext.is_some();
+ };
+
+ let (iv, ciphertext) = encrypter();
+ for _ in 0..5 {
+ let plaintext = matasano::crack_cbc_padding_oracle(
+ &iv[..],
+ &ciphertext[..],
+ &validator
+ );
+ let expected = unsafe { &chosen_plaintext.unwrap() };
+ assert_eq!(&plaintext, expected);
+ }
+}