srp6a 0.1.0

Implementation of SRP 6a (Secure Remote Password) according to RFC 5054 (https://datatracker.ietf.org/doc/html/rfc5054)
Documentation
use sha1::Sha1;

use crate::client::Client;
use crate::server::Server;
use crate::tests::test_utils::*;

#[test]
fn test_full_srp_handshake() {
    let group = create_test_group_1024();
    let salt = create_test_salt();

    let client = Client::<Sha1>::new(group.clone());
    let server = Server::<Sha1>::new(group);

    let verifier = client.compute_verifier(TEST_USERNAME, TEST_PASSWORD, &salt);

    let (client_private, client_public) = client.generate_keypair(128).unwrap();

    let (server_private, server_public) = server.generate_keypair(128, &verifier).unwrap();

    let client_premaster = client
        .compute_premaster_key(
            &server_public,
            &client_private,
            &client_public,
            &salt,
            TEST_USERNAME,
            TEST_PASSWORD,
        )
        .unwrap();

    let server_premaster = server
        .compute_premaster_key(&client_public, &verifier, &server_private, &server_public)
        .unwrap();

    assert_eq!(client_premaster, server_premaster);

    let client_session_key = client.compute_session_key(&client_premaster);
    let server_session_key = server.compute_session_key(&server_premaster);

    assert_eq!(client_session_key, server_session_key);

    let client_proof = client.compute_client_proof(
        TEST_USERNAME,
        &salt,
        &client_public,
        &server_public,
        &client_session_key,
    );

    let server_proof =
        server.compute_server_proof(&client_public, &client_proof, &server_session_key);

    let is_client_proof_valid = server.verify_client_proof(
        TEST_USERNAME,
        &salt,
        &client_public,
        &server_public,
        &server_session_key,
        &client_proof,
    );

    let is_server_proof_valid = client.verify_server_proof(
        &client_public,
        &client_proof,
        &server_proof,
        &client_session_key,
    );

    assert!(is_client_proof_valid);
    assert!(is_server_proof_valid);
}