]> git.lizzy.rs Git - PAKEs.git/blob - srp/tests/mod.rs
d7354803140e514f1ce0d3a2eededfb1d5c98f5c
[PAKEs.git] / srp / tests / mod.rs
1 extern crate num;
2 extern crate rand;
3 extern crate sha2;
4 extern crate srp;
5
6 use rand::Rng;
7 use sha2::Sha256;
8
9 use srp::client::{srp_private_key, SrpClient};
10 use srp::groups::G_2048;
11 use srp::server::{SrpServer, UserRecord};
12
13 fn auth_test(reg_pwd: &[u8], auth_pwd: &[u8]) {
14     let mut rng = rand::os::OsRng::new().unwrap();
15     let username = b"alice";
16
17     // Client instance creation
18     let a = rng.gen_iter::<u8>().take(64).collect::<Vec<u8>>();
19     let client = SrpClient::<Sha256>::new(&a, &G_2048);
20
21     // Registration
22     let salt: [u8; 16] = rng.gen();
23     let reg_priv_key = srp_private_key::<Sha256>(username, reg_pwd, &salt);
24     let verif = client.get_password_verifier(&reg_priv_key);
25
26     // User sends handshake
27     let a_pub = client.get_a_pub();
28
29     // Server retrieve user record from db and processes handshake
30     let user = UserRecord {
31         username,
32         salt: &salt,
33         verifier: &verif,
34     };
35     let b = rng.gen_iter::<u8>().take(64).collect::<Vec<u8>>();
36     let server = SrpServer::<Sha256>::new(&user, &a_pub, &b, &G_2048).unwrap();
37     let (salt, b_pub) = (&user.salt, server.get_b_pub());
38
39     // Client processes handshake reply
40     let auth_priv_key = srp_private_key::<Sha256>(username, auth_pwd, salt);
41     let client2 = client.process_reply(&auth_priv_key, &b_pub).unwrap();
42     let proof = client2.get_proof();
43
44     // Server processes verification data
45     println!("Client verification");
46     let proof2 = server.verify(&proof).unwrap();
47     let server_key = server.get_key();
48
49     // Client verifies server
50     println!("Server verification");
51     let user_key = client2.verify_server(&proof2).unwrap();
52     assert_eq!(server_key, user_key, "server and client keys are not equal");
53 }
54
55 #[test]
56 fn good_password() {
57     auth_test(b"password", b"password");
58 }
59
60 #[test]
61 #[should_panic]
62 fn bad_password() {
63     auth_test(b"password", b"paSsword");
64 }