srp6a 0.1.0

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

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

#[test]
fn test_compute_k() {
    let server: Server<Sha1> = Server::<Sha1>::new(create_test_group_1024());

    let expected_k = create_test_k();

    assert_eq!(server.k, expected_k);
}

#[test]
fn test_generate_keypair_from_private_key() {
    let server = Server::<Sha1>::new(create_test_group_1024());

    let verifier = create_test_verifier();

    let (private_key, expected_public_key) = create_test_server_keypair();

    let (_, public_key) = server
        .generate_keypair_from_private_key(&private_key.to_bytes_be(), &verifier)
        .unwrap();

    assert_eq!(public_key, expected_public_key);
}

#[test]
fn test_generate_keypair() {
    let server = Server::<Sha1>::new(create_test_group_1024());

    let verifier = create_test_verifier();

    let result = server.generate_keypair(128, &verifier);
    assert!(result.is_ok());

    let (private, public) = result.unwrap();
    assert!(private > BigUint::from(0u32));
    assert!(public > BigUint::from(0u32));
    assert!(public < server.group.n);
}

#[test]
fn test_generate_keypair_invalid_length() {
    let server = Server::<Sha1>::new(create_test_group_1024());

    let verifier = create_test_verifier();

    // Zero length
    let result = server.generate_keypair(0, &verifier);
    assert!(matches!(
        result,
        Err(crate::server::ServerError::InvalidKeyLength(_))
    ));

    // Non-multiple of 8
    let result = server.generate_keypair(127, &verifier);
    assert!(matches!(
        result,
        Err(crate::server::ServerError::InvalidKeyLength(_))
    ));

    // Length exceeds maximum
    let result = server.generate_keypair(2048, &verifier);
    assert!(matches!(
        result,
        Err(crate::server::ServerError::InvalidKeyLength(_))
    ));
}

#[test]
fn test_compute_premaster_key() {
    let server = Server::<Sha1>::new(create_test_group_1024());

    let verifier = create_test_verifier();

    let (_, public_client_key) = create_test_client_keypair();

    let (private_server_key, public_server_key) = create_test_server_keypair();

    let premaster_key = server
        .compute_premaster_key(
            &public_client_key,
            &verifier,
            &private_server_key,
            &public_server_key,
        )
        .unwrap();

    let expected_premaster_key = create_test_premaster_key();

    assert_eq!(premaster_key, expected_premaster_key);
}