From caaf7016fcecd3a95df53e65150666d50bd0fbcf Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 18 Apr 2019 02:23:35 -0400 Subject: problem 34 --- tests/set5.rs | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) (limited to 'tests') diff --git a/tests/set5.rs b/tests/set5.rs index d969212..594b420 100644 --- a/tests/set5.rs +++ b/tests/set5.rs @@ -1,3 +1,5 @@ +use rand::Rng; + #[test] fn problem_33() { let p_hex = "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024\ @@ -19,3 +21,117 @@ fn problem_33() { assert_eq!(s1, s2); } + +#[test] +fn problem_34() { + let p_hex = "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024\ + e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd\ + 3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec\ + 6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f\ + 24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361\ + c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552\ + bb9ed529077096966d670c354e4abc9804f1746c08ca237327fff\ + fffffffffffff"; + let p = num_bigint::BigUint::parse_bytes(p_hex.as_bytes(), 16).unwrap(); + let g = num_bigint::BigUint::from(2 as u8); + + let a = matasano::DHKeyPair::new(p.clone(), g.clone()); + let b = matasano::DHKeyPair::new(p.clone(), g.clone()); + + let plaintext = b"Summertime and the wind is blowing outside in \ + lower Chelsea and I don't know what I'm doing \ + in the city, the sun is always in my eyes"; + + let null_exchanger = matasano::NullDiffieHellmanMessageExchanger::new(); + run_dh_message_exchange(&null_exchanger, &a, &b, &plaintext[..]); + + let parameter_injection_exchanger = + matasano::ParameterInjectionDiffieHellmanMessageExchanger::new(); + run_dh_message_exchange( + ¶meter_injection_exchanger, + &a, + &b, + &plaintext[..], + ); + assert_eq!( + parameter_injection_exchanger.retrieve_plaintext(), + plaintext.to_vec(), + ); +} + +fn run_dh_message_exchange( + exchanger: &T, + a: &matasano::DHKeyPair, + b: &matasano::DHKeyPair, + plaintext: &[u8], +) where + T: matasano::DiffieHellmanMessageExchanger, +{ + crossbeam::thread::scope(|s| { + let (a_sender, a_recver) = exchanger.a_channel(); + let (b_sender, b_recver) = exchanger.b_channel(); + + let (key_compare_sender_a, key_compare_recver) = + crossbeam::channel::unbounded(); + let key_compare_sender_b = key_compare_sender_a.clone(); + + let a_runner = s.spawn(move |_| { + a_sender.send(serde_json::to_vec(a).unwrap()).unwrap(); + let b_bytes = a_recver.recv().unwrap(); + let b: matasano::DHKeyPair = + serde_json::from_slice(&b_bytes).unwrap(); + let s = a.key_exchange(&b.pubkey); + + let mut aes_key = matasano::sha1(&s.to_bytes_le()).to_vec(); + aes_key.truncate(16); + key_compare_sender_a.send(aes_key.clone()).unwrap(); + let mut iv = [0; 16]; + rand::thread_rng().fill(&mut iv); + + let ciphertext = + matasano::encrypt_aes_128_cbc(plaintext, &aes_key, &iv); + a_sender.send(ciphertext.clone()).unwrap(); + a_sender.send(iv.to_vec()).unwrap(); + let b_ciphertext = a_recver.recv().unwrap(); + let b_iv = a_recver.recv().unwrap(); + let b_plaintext = + matasano::decrypt_aes_128_cbc(&b_ciphertext, &aes_key, &b_iv) + .unwrap(); + + assert_eq!(&plaintext[..], b_plaintext.as_slice()); + assert_ne!(&iv[..], b_iv.as_slice()); + assert_ne!(ciphertext, b_ciphertext); + }); + let b_runner = s.spawn(move |_| { + b_sender.send(serde_json::to_vec(b).unwrap()).unwrap(); + let a_bytes = b_recver.recv().unwrap(); + let a: matasano::DHKeyPair = + serde_json::from_slice(&a_bytes).unwrap(); + let s = b.key_exchange(&a.pubkey); + + let mut aes_key = matasano::sha1(&s.to_bytes_le()).to_vec(); + aes_key.truncate(16); + key_compare_sender_b.send(aes_key.clone()).unwrap(); + let mut iv = [0; 16]; + rand::thread_rng().fill(&mut iv); + + let a_ciphertext = b_recver.recv().unwrap(); + let a_iv = b_recver.recv().unwrap(); + let a_plaintext = + matasano::decrypt_aes_128_cbc(&a_ciphertext, &aes_key, &a_iv) + .unwrap(); + let ciphertext = + matasano::encrypt_aes_128_cbc(&a_plaintext, &aes_key, &iv); + b_sender.send(ciphertext.clone()).unwrap(); + b_sender.send(iv.to_vec()).unwrap(); + }); + + let key1 = key_compare_recver.recv().unwrap(); + let key2 = key_compare_recver.recv().unwrap(); + assert_eq!(key1, key2); + + a_runner.join().unwrap(); + b_runner.join().unwrap(); + }) + .unwrap(); +} -- cgit v1.2.3-54-g00ecf