]> git.lizzy.rs Git - PAKEs.git/commitdiff
rfc compliant client proof
authorHimbeerserverDE <himbeerserverde@gmail.com>
Fri, 17 Feb 2023 21:17:02 +0000 (22:17 +0100)
committerHimbeerserverDE <himbeerserverde@gmail.com>
Fri, 17 Feb 2023 21:17:02 +0000 (22:17 +0100)
srp/src/client.rs
srp/src/server.rs
srp/src/utils.rs

index ee8fd8d2285cc7d6f8ceecef702ff35dd1cfb4e0..263e5f34b70cb34d1f883d320c1ddd1db1aaa254 100644 (file)
@@ -203,6 +203,7 @@ impl<'a, D: Digest> SrpClient<'a, D> {
         let key = self.compute_premaster_secret(&b_pub, &k, &x, &a, &u);
 
         let m1 = compute_m1::<D>(
+            self.params,
             &a_pub.to_bytes_be(),
             &b_pub.to_bytes_be(),
             &key.to_bytes_be(),
index 0ecc17cf05c401c6b2737b9642e032ca76308990..b7d3eff90e242c993ad8d15bf68d9423fabcc9b8 100644 (file)
@@ -145,6 +145,7 @@ impl<'a, D: Digest> SrpServer<'a, D> {
         let key = self.compute_premaster_secret(&a_pub, &v, &u, &b);
 
         let m1 = compute_m1::<D>(
+            self.params,
             &a_pub.to_bytes_be(),
             &b_pub.to_bytes_be(),
             &key.to_bytes_be(),
index a9372bd0649f182c3b49bcbf3458e7873b4c2409..6eeb3a366eda000964918fee363c9eed9229f9f7 100644 (file)
@@ -25,10 +25,25 @@ pub fn compute_k<D: Digest>(params: &SrpGroup) -> BigUint {
     BigUint::from_bytes_be(d.finalize().as_slice())
 }
 
-// M1 = H(A, B, K) this doesn't follow the spec but apparently no one does for M1
-// M1 should equal =  H(H(N) XOR H(g) | H(U) | s | A | B | K) according to the spec
-pub fn compute_m1<D: Digest>(a_pub: &[u8], b_pub: &[u8], key: &[u8]) -> Output<D> {
+// M1 = H(H(N) XOR H(g) | H(U) | s | A | B | K)
+pub fn compute_m1<D: Digest>(
+    params: &SrpGroup,
+    a_pub: &[u8],
+    b_pub: &[u8],
+    key: &[u8],
+) -> Output<D> {
+    let mut d_n = D::new();
+    d_n.update(params.n.to_bytes_be());
+    let h_n = d_n.finalize();
+
+    let mut d_g = D::new();
+    d_g.update(params.g.to_bytes_be());
+    let h_g = d_g.finalize();
+
+    let ng_xor: Vec<u8> = h_n.iter().zip(h_g.iter()).map(|(n, g)| n ^ g).collect();
+
     let mut d = D::new();
+    d.update(ng_xor);
     d.update(a_pub);
     d.update(b_pub);
     d.update(key);