summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-05-22 02:08:01 -0400
committerJesse Luehrs <doy@tozt.net>2019-05-22 02:08:01 -0400
commit5a35ab9eee8d070cbc6a0f073e131cd6e567ed4d (patch)
treed30527d024f2be72797137175d89cad1ed55cd65
parentc272cfc4241f2c19fd948202caf0328b172958c4 (diff)
downloadmatasano-master.tar.gz
matasano-master.zip
problem 37HEADmaster
-rw-r--r--src/crack.rs30
-rw-r--r--src/lib.rs1
-rw-r--r--tests/set5.rs27
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;
diff --git a/src/lib.rs b/src/lib.rs
index 97ce460..42e484d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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());
+}