]> git.lizzy.rs Git - PAKEs.git/blob - srp/tests/mod.rs
deps: update to rand-0.6
[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::RngCore;
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::rngs::OsRng::new().unwrap();
15     let username = b"alice";
16
17     // Client instance creation
18     let mut a = [0u8; 64];
19     rng.fill_bytes(&mut a);
20     let client = SrpClient::<Sha256>::new(&a, &G_2048);
21
22     // Registration
23     let mut salt = [0u8; 16];
24     rng.fill_bytes(&mut salt);
25     let reg_priv_key = srp_private_key::<Sha256>(username, reg_pwd, &salt);
26     let verif = client.get_password_verifier(&reg_priv_key);
27
28     // User sends handshake
29     let a_pub = client.get_a_pub();
30
31     // Server retrieve user record from db and processes handshake
32     let user = UserRecord {
33         username,
34         salt: &salt,
35         verifier: &verif,
36     };
37     let mut b = [0u8; 64];
38     rng.fill_bytes(&mut b);
39     let server = SrpServer::<Sha256>::new(&user, &a_pub, &b, &G_2048).unwrap();
40     let (salt, b_pub) = (&user.salt, server.get_b_pub());
41
42     // Client processes handshake reply
43     let auth_priv_key = srp_private_key::<Sha256>(username, auth_pwd, salt);
44     let client2 = client.process_reply(&auth_priv_key, &b_pub).unwrap();
45     let proof = client2.get_proof();
46
47     // Server processes verification data
48     println!("Client verification");
49     let proof2 = server.verify(&proof).unwrap();
50     let server_key = server.get_key();
51
52     // Client verifies server
53     println!("Server verification");
54     let user_key = client2.verify_server(&proof2).unwrap();
55     assert_eq!(server_key, user_key, "server and client keys are not equal");
56 }
57
58 #[test]
59 fn good_password() {
60     auth_test(b"password", b"password");
61 }
62
63 #[test]
64 #[should_panic]
65 fn bad_password() {
66     auth_test(b"password", b"paSsword");
67 }