diff options
author | Jesse Luehrs <doy@tozt.net> | 2019-05-22 02:08:01 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2019-05-22 02:08:01 -0400 |
commit | 5a35ab9eee8d070cbc6a0f073e131cd6e567ed4d (patch) | |
tree | d30527d024f2be72797137175d89cad1ed55cd65 | |
parent | c272cfc4241f2c19fd948202caf0328b172958c4 (diff) | |
download | matasano-5a35ab9eee8d070cbc6a0f073e131cd6e567ed4d.tar.gz matasano-5a35ab9eee8d070cbc6a0f073e131cd6e567ed4d.zip |
-rw-r--r-- | src/crack.rs | 30 | ||||
-rw-r--r-- | src/lib.rs | 1 | ||||
-rw-r--r-- | tests/set5.rs | 27 |
3 files changed, 58 insertions, 0 deletions
diff --git a/src/crack.rs b/src/crack.rs index 731cfbd..535b12a 100644 --- a/src/crack.rs +++ b/src/crack.rs @@ -1016,6 +1016,36 @@ impl<'a> SRPClient for CorrectSRPClient<'a> { } } +#[derive(Debug)] +pub struct ZeroKeySRPClient<'a> { + server: &'a mut crate::dh::SRPServer, +} + +impl<'a> ZeroKeySRPClient<'a> { + pub fn new(server: &'a mut crate::dh::SRPServer) -> ZeroKeySRPClient<'a> { + ZeroKeySRPClient { server } + } +} + +impl<'a> SRPClient for ZeroKeySRPClient<'a> { + fn server(&mut self) -> &mut crate::dh::SRPServer { + self.server + } + + fn key_exchange_impl( + &mut self, + user: &str, + _: &str, + ) -> (Vec<u8>, Vec<u8>, num_bigint::BigUint) { + let a_pub = num_bigint::BigUint::from(0 as u8); + let (session, salt, _b_pub) = + self.server.exchange_pubkeys(user, &a_pub); + + let s = num_bigint::BigUint::from(0 as u8); + (session, salt, s) + } +} + fn crack_single_byte_xor_with_confidence(input: &[u8]) -> (u8, f64) { let mut min_diff = 100.0; let mut best_key = 0; @@ -42,6 +42,7 @@ pub use crack::DiffieHellmanMessageExchanger; pub use crack::NullDiffieHellmanMessageExchanger; pub use crack::ParameterInjectionDiffieHellmanMessageExchanger; pub use crack::SRPClient; +pub use crack::ZeroKeySRPClient; pub use dh::DHKeyPair; pub use dh::SRPServer; pub use dh::SRPUser; diff --git a/tests/set5.rs b/tests/set5.rs index 66d2420..81030be 100644 --- a/tests/set5.rs +++ b/tests/set5.rs @@ -260,3 +260,30 @@ fn problem_36() { assert!(key.is_some()); } + +#[test] +fn problem_37() { + let n_hex = "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024\ + e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd\ + 3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec\ + 6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f\ + 24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361\ + c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552\ + bb9ed529077096966d670c354e4abc9804f1746c08ca237327fff\ + fffffffffffff"; + let n = num_bigint::BigUint::parse_bytes(n_hex.as_bytes(), 16).unwrap(); + let g = num_bigint::BigUint::from(2 as u8); + let k = num_bigint::BigUint::from(3 as u8); + + let user = "doy@tozt.net"; + let pass = "supersecret"; + + let mut server = matasano::SRPServer::new(n, g, k); + let mut client = matasano::ZeroKeySRPClient::new(&mut server); + + client.register(user, pass); + + let key = client.key_exchange(user, pass); + + assert!(key.is_some()); +} |