srp6a 0.1.0

Implementation of SRP 6a (Secure Remote Password) according to RFC 5054 (https://datatracker.ietf.org/doc/html/rfc5054)
Documentation
pub mod client_tests;
pub mod integration_tests;
pub mod server_tests;

pub mod test_utils {
    use crate::group::Group;
    use num_bigint::BigUint;
    use num_traits::Num;

    pub fn create_test_group_1024() -> Group {
        Group::new_group_1024_bits().unwrap()
    }

    pub fn create_test_k() -> BigUint {
        BigUint::from_str_radix("7556AA045AEF2CDD07ABAF0F665C3E818913186F", 16).unwrap()
    }

    pub fn create_test_verifier() -> BigUint {
        BigUint::from_str_radix(
            "7E273DE8696FFC4F4E337D05B4B375BEB0DDE1569E8FA00A9886D8129BADA1F1822223CA1A605B530E379BA4729FDC59F105B4787E5186F5C671085A1447B52A48CF1970B4FB6F8400BBF4CEBFBB168152E08AB5EA53D15C1AFF87B2B9DA6E04E058AD51CC72BFC9033B564E26480D78E955A5E29E7AB245DB2BE315E2099AFB",
            16
        ).unwrap()
    }

    pub fn create_test_client_keypair() -> (BigUint, BigUint) {
        let private_key = BigUint::from_str_radix(
            "60975527035CF2AD1989806F0407210BC81EDC04E2762A56AFD529DDDA2D4393",
            16,
        )
        .unwrap();

        let public_key = BigUint::from_str_radix(
            "61D5E490F6F1B79547B0704C436F523DD0E560F0C64115BB72557EC44352E8903211C04692272D8B2D1A5358A2CF1B6E0BFCF99F921530EC8E39356179EAE45E42BA92AEACED825171E1E8B9AF6D9C03E1327F44BE087EF06530E69F66615261EEF54073CA11CF5858F0EDFDFE15EFEAB349EF5D76988A3672FAC47B0769447B",
            16
        ).unwrap();

        (private_key, public_key)
    }

    pub fn create_test_server_keypair() -> (BigUint, BigUint) {
        let private_key = BigUint::from_str_radix(
            "E487CB59D31AC550471E81F00F6928E01DDA08E974A004F49E61F5D105284D20",
            16,
        )
        .unwrap();

        let public_key = BigUint::from_str_radix(
            "BD0C61512C692C0CB6D041FA01BB152D4916A1E77AF46AE105393011BAF38964DC46A0670DD125B95A981652236F99D9B681CBF87837EC996C6DA04453728610D0C6DDB58B318885D7D82C7F8DEB75CE7BD4FBAA37089E6F9C6059F388838E7A00030B331EB76840910440B1B27AAEAEEB4012B7D7665238A8E3FB004B117B58",
            16
        ).unwrap();

        (private_key, public_key)
    }

    pub fn create_test_salt() -> Vec<u8> {
        hex::decode("BEB25379D1A8581EB5A727673A2441EE").unwrap()
    }

    pub fn create_test_premaster_key() -> BigUint {
        BigUint::from_str_radix(
            "B0DC82BABCF30674AE450C0287745E7990A3381F63B387AAF271A10D233861E359B48220F7C4693C9AE12B0A6F67809F0876E2D013800D6C41BB59B6D5979B5C00A172B4A2A5903A0BDCAF8A709585EB2AFAFA8F3499B200210DCC1F10EB33943CD67FC88A2F39A4BE5BEC4EC0A3212DC346D7E474B29EDE8A469FFECA686E5A",
            16
        ).unwrap()
    }

    pub const TEST_USERNAME: &[u8] = b"alice";
    pub const TEST_PASSWORD: &[u8] = b"password123";
}