paysec-keyblock 0.2.1

TR-31 key block processing for payment security applications.
Documentation
use super::super::key_derivations::derive_keys_version_d;

use hex::decode as hex_decode;
use paysec_crypto::AesKeySize;
use paysec_crypto_rustcrypto::RustCryptoProvider;
use paysec_crypto_soft_aes::SoftAesProvider;

macro_rules! for_each_crypto_provider {
    ($provider:ident, $body:block) => {{
        {
            let $provider = SoftAesProvider::new();
            $body
        }

        {
            let $provider = RustCryptoProvider::new();
            $body
        }
    }};
}

#[test]
fn test_derive_keys_version_d_aes_128() {
    for_each_crypto_provider!(provider, {
        let kbpk = hex_decode("00112233445566778899AABBCCDDEEFF").unwrap();

        let (kbek, kbak) =
            derive_keys_version_d(&provider, kbpk.as_slice(), AesKeySize::Bits128).unwrap();

        assert_eq!(
            kbek,
            hex_decode("37DC7700D70781C3E2498A41A027E0B1").unwrap()
        );

        assert_eq!(
            kbak,
            hex_decode("063E785CE4C4C8FE54921839BD1F9ADF").unwrap()
        );
    });
}

#[test]
fn test_derive_keys_version_d_aes_192() {
    for_each_crypto_provider!(provider, {
        let kbpk = hex_decode("00112233445566778899AABBCCDDEEFF0011223344556677").unwrap();

        let (kbek, kbak) =
            derive_keys_version_d(&provider, kbpk.as_slice(), AesKeySize::Bits192).unwrap();

        assert_eq!(
            kbek,
            hex_decode("F343DFB92345457EF5CB08309EEB65DEC170BE7B069FB351").unwrap()
        );

        assert_eq!(
            kbak,
            hex_decode("23F93132F6677CD822FA653562F71CCE3CB9361733BFA128").unwrap()
        );
    });
}

#[test]
fn test_derive_keys_version_d_aes_256() {
    for_each_crypto_provider!(provider, {
        let kbpk =
            hex_decode("00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF").unwrap();

        let (kbek, kbak) =
            derive_keys_version_d(&provider, kbpk.as_slice(), AesKeySize::Bits256).unwrap();

        assert_eq!(
            kbek,
            hex_decode("FCC7C7F7CA33DA31BA8C60493C7DD384C804C20EBA22022BC5AB29FEF42F20C7").unwrap()
        );

        assert_eq!(
            kbak,
            hex_decode("095DF0DCA65DC922BBEB015F8C855E254FD7CF399B6DA726ABA28206C9A7A3E2").unwrap()
        );
    });
}

#[test]
fn test_derive_keys_version_d_a7422() {
    for_each_crypto_provider!(provider, {
        let kbpk =
            hex_decode("88E1AB2A2E3DD38C1FA039A536500CC8A87AB9D62DC92C01058FA79F44657DE6").unwrap();

        let (kbek, kbak) =
            derive_keys_version_d(&provider, kbpk.as_slice(), AesKeySize::Bits256).unwrap();

        assert_eq!(
            kbek,
            hex_decode("396C9382A6E2E66A088774E1D6E46541F5EAD67D7204F8DD0D7AE8FDA334D3AC").unwrap()
        );

        assert_eq!(
            kbak,
            hex_decode("4EF24317696213840451890756757E573E0673483888F9B7F9B7517827F95022").unwrap()
        );
    });
}