From 350e0dc3582af9a0b8c51968937dc096ae786a4a Mon Sep 17 00:00:00 2001 From: HimbeerserverDE Date: Fri, 17 Feb 2023 22:30:28 +0100 Subject: [PATCH] include username in client proof --- srp/src/client.rs | 1 + srp/src/server.rs | 6 ++++++ srp/src/utils.rs | 2 ++ 3 files changed, 9 insertions(+) diff --git a/srp/src/client.rs b/srp/src/client.rs index 263e5f3..eed1153 100644 --- a/srp/src/client.rs +++ b/srp/src/client.rs @@ -204,6 +204,7 @@ impl<'a, D: Digest> SrpClient<'a, D> { let m1 = compute_m1::( self.params, + identity_hash.as_slice(), &a_pub.to_bytes_be(), &b_pub.to_bytes_be(), &key.to_bytes_be(), diff --git a/srp/src/server.rs b/srp/src/server.rs index b7d3eff..e1eb331 100644 --- a/srp/src/server.rs +++ b/srp/src/server.rs @@ -124,6 +124,7 @@ impl<'a, D: Digest> SrpServer<'a, D> { /// v is the provided during initial user registration pub fn process_reply( &self, + username: &str, b: &[u8], v: &[u8], a_pub: &[u8], @@ -142,10 +143,15 @@ impl<'a, D: Digest> SrpServer<'a, D> { let u = compute_u::(&a_pub.to_bytes_be(), &b_pub.to_bytes_be()); + let mut d = D::new(); + d.update(username); + let identity_hash = d.finalize(); + let key = self.compute_premaster_secret(&a_pub, &v, &u, &b); let m1 = compute_m1::( self.params, + identity_hash.as_slice(), &a_pub.to_bytes_be(), &b_pub.to_bytes_be(), &key.to_bytes_be(), diff --git a/srp/src/utils.rs b/srp/src/utils.rs index 2bd7639..d053f5d 100644 --- a/srp/src/utils.rs +++ b/srp/src/utils.rs @@ -28,6 +28,7 @@ pub fn compute_k(params: &SrpGroup) -> BigUint { // M1 = H(H(N) XOR H(g) | H(U) | s | A | B | K) pub fn compute_m1( params: &SrpGroup, + identity_hash: &[u8], a_pub: &[u8], b_pub: &[u8], key: &[u8], @@ -44,6 +45,7 @@ pub fn compute_m1( let mut d = D::new(); d.update(ng_xor); + d.update(identity_hash); d.update(a_pub); d.update(b_pub); d.update(key); -- 2.44.0