From ff879d5fa8c3ed9ba52cb44d9a4501e66531672d Mon Sep 17 00:00:00 2001 From: Dmitry Eremin-Solenikov Date: Sun, 21 Apr 2019 02:41:49 +0300 Subject: validation: crypto: add support for 3GPP AES EEA2/EIA2 algorithms Add support for AES-CTR variant as 128-EEA2 and AES-CMAC variant as 128-EIA algorithms defined by 3GPP. Signed-off-by: Dmitry Eremin-Solenikov Reviewed-by: Petri Savolainen --- test/validation/api/crypto/odp_crypto_test_inp.c | 134 +++++++++++++++++++++++ test/validation/api/crypto/test_vectors.h | 73 ++++++++++++ test/validation/api/crypto/test_vectors_len.h | 9 ++ 3 files changed, 216 insertions(+) diff --git a/test/validation/api/crypto/odp_crypto_test_inp.c b/test/validation/api/crypto/odp_crypto_test_inp.c index 2f5726033..faf4dba83 100644 --- a/test/validation/api/crypto/odp_crypto_test_inp.c +++ b/test/validation/api/crypto/odp_crypto_test_inp.c @@ -68,6 +68,8 @@ static const char *auth_alg_name(odp_auth_alg_t auth) return "ODP_AUTH_ALG_KASUMI_F9"; case ODP_AUTH_ALG_SNOW3G_UIA2: return "ODP_AUTH_ALG_SNOW3G_UIA2"; + case ODP_AUTH_ALG_AES_EIA2: + return "ODP_AUTH_ALG_AES_EIA2"; case ODP_AUTH_ALG_ZUC_EIA3: return "ODP_AUTH_ALG_ZUC_EIA3"; case ODP_AUTH_ALG_MD5: @@ -118,6 +120,8 @@ static const char *cipher_alg_name(odp_cipher_alg_t cipher) return "ODP_CIPHER_ALG_KASUMI_F8"; case ODP_CIPHER_ALG_SNOW3G_UEA2: return "ODP_CIPHER_ALG_SNOW3G_UEA2"; + case ODP_CIPHER_ALG_AES_EEA2: + return "ODP_CIPHER_ALG_AES_EEA2"; case ODP_CIPHER_ALG_ZUC_EEA3: return "ODP_CIPHER_ALG_ZUC_EEA3"; default: @@ -562,6 +566,9 @@ static void check_alg(odp_crypto_op_t op, if (cipher_alg == ODP_CIPHER_ALG_SNOW3G_UEA2 && !(capa.ciphers.bit.snow3g_uea2)) rc = -1; + if (cipher_alg == ODP_CIPHER_ALG_AES_EEA2 && + !(capa.ciphers.bit.aes_eea2)) + rc = -1; if (cipher_alg == ODP_CIPHER_ALG_ZUC_EEA3 && !(capa.ciphers.bit.zuc_eea3)) rc = -1; @@ -596,6 +603,9 @@ static void check_alg(odp_crypto_op_t op, if (auth_alg == ODP_AUTH_ALG_SNOW3G_UIA2 && !(capa.auths.bit.snow3g_uia2)) rc = -1; + if (auth_alg == ODP_AUTH_ALG_AES_EIA2 && + !(capa.auths.bit.aes_eia2)) + rc = -1; if (auth_alg == ODP_AUTH_ALG_ZUC_EIA3 && !(capa.auths.bit.zuc_eia3)) rc = -1; @@ -824,6 +834,10 @@ static int check_alg_support(odp_cipher_alg_t cipher, odp_auth_alg_t auth) if (!capability.ciphers.bit.snow3g_uea2) return ODP_TEST_INACTIVE; break; + case ODP_CIPHER_ALG_AES_EEA2: + if (!capability.ciphers.bit.aes_eea2) + return ODP_TEST_INACTIVE; + break; case ODP_CIPHER_ALG_ZUC_EEA3: if (!capability.ciphers.bit.zuc_eea3) return ODP_TEST_INACTIVE; @@ -895,6 +909,10 @@ static int check_alg_support(odp_cipher_alg_t cipher, odp_auth_alg_t auth) if (!capability.auths.bit.snow3g_uia2) return ODP_TEST_INACTIVE; break; + case ODP_AUTH_ALG_AES_EIA2: + if (!capability.auths.bit.aes_eia2) + return ODP_TEST_INACTIVE; + break; case ODP_AUTH_ALG_ZUC_EIA3: if (!capability.auths.bit.zuc_eia3) return ODP_TEST_INACTIVE; @@ -1622,6 +1640,56 @@ static void crypto_test_dec_alg_snow3g_uea2_ovr_iv(void) true); } +static int check_alg_aes_eea2(void) +{ + return check_alg_support(ODP_CIPHER_ALG_AES_EEA2, + ODP_AUTH_ALG_NULL); +} + +static void crypto_test_enc_alg_aes_eea2(void) +{ + check_alg(ODP_CRYPTO_OP_ENCODE, + ODP_CIPHER_ALG_AES_EEA2, + ODP_AUTH_ALG_NULL, + aes_eea2_reference, + ARRAY_SIZE(aes_eea2_reference), + false, + true); +} + +static void crypto_test_enc_alg_aes_eea2_ovr_iv(void) +{ + check_alg(ODP_CRYPTO_OP_ENCODE, + ODP_CIPHER_ALG_AES_EEA2, + ODP_AUTH_ALG_NULL, + aes_eea2_reference, + ARRAY_SIZE(aes_eea2_reference), + true, + true); +} + +static void crypto_test_dec_alg_aes_eea2(void) +{ + check_alg(ODP_CRYPTO_OP_DECODE, + ODP_CIPHER_ALG_AES_EEA2, + ODP_AUTH_ALG_NULL, + aes_eea2_reference, + ARRAY_SIZE(aes_eea2_reference), + false, + true); +} + +static void crypto_test_dec_alg_aes_eea2_ovr_iv(void) +{ + check_alg(ODP_CRYPTO_OP_DECODE, + ODP_CIPHER_ALG_AES_EEA2, + ODP_AUTH_ALG_NULL, + aes_eea2_reference, + ARRAY_SIZE(aes_eea2_reference), + true, + true); +} + static int check_alg_zuc_eea3(void) { return check_alg_support(ODP_CIPHER_ALG_ZUC_EEA3, ODP_AUTH_ALG_NULL); @@ -2077,6 +2145,56 @@ static void crypto_test_check_alg_snow3g_uia2_ovr_iv(void) true); } +static int check_alg_aes_eia2(void) +{ + return check_alg_support(ODP_CIPHER_ALG_NULL, + ODP_AUTH_ALG_AES_EIA2); +} + +static void crypto_test_gen_alg_aes_eia2(void) +{ + check_alg(ODP_CRYPTO_OP_ENCODE, + ODP_CIPHER_ALG_NULL, + ODP_AUTH_ALG_AES_EIA2, + aes_eia2_reference, + ARRAY_SIZE(aes_eia2_reference), + false, + true); +} + +static void crypto_test_gen_alg_aes_eia2_ovr_iv(void) +{ + check_alg(ODP_CRYPTO_OP_ENCODE, + ODP_CIPHER_ALG_NULL, + ODP_AUTH_ALG_AES_EIA2, + aes_eia2_reference, + ARRAY_SIZE(aes_eia2_reference), + true, + true); +} + +static void crypto_test_check_alg_aes_eia2(void) +{ + check_alg(ODP_CRYPTO_OP_DECODE, + ODP_CIPHER_ALG_NULL, + ODP_AUTH_ALG_AES_EIA2, + aes_eia2_reference, + ARRAY_SIZE(aes_eia2_reference), + false, + true); +} + +static void crypto_test_check_alg_aes_eia2_ovr_iv(void) +{ + check_alg(ODP_CRYPTO_OP_DECODE, + ODP_CIPHER_ALG_NULL, + ODP_AUTH_ALG_AES_EIA2, + aes_eia2_reference, + ARRAY_SIZE(aes_eia2_reference), + true, + true); +} + static int check_alg_zuc_eia3(void) { return check_alg_support(ODP_CIPHER_ALG_NULL, ODP_AUTH_ALG_ZUC_EIA3); @@ -2409,6 +2527,14 @@ odp_testinfo_t crypto_suite[] = { check_alg_snow3g_uea2), ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_snow3g_uea2_ovr_iv, check_alg_snow3g_uea2), + ODP_TEST_INFO_CONDITIONAL(crypto_test_enc_alg_aes_eea2, + check_alg_aes_eea2), + ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_aes_eea2, + check_alg_aes_eea2), + ODP_TEST_INFO_CONDITIONAL(crypto_test_enc_alg_aes_eea2_ovr_iv, + check_alg_aes_eea2), + ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_aes_eea2_ovr_iv, + check_alg_aes_eea2), ODP_TEST_INFO_CONDITIONAL(crypto_test_enc_alg_zuc_eea3, check_alg_zuc_eea3), ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_zuc_eea3, @@ -2497,6 +2623,14 @@ odp_testinfo_t crypto_suite[] = { check_alg_snow3g_uia2), ODP_TEST_INFO_CONDITIONAL(crypto_test_check_alg_snow3g_uia2_ovr_iv, check_alg_snow3g_uia2), + ODP_TEST_INFO_CONDITIONAL(crypto_test_gen_alg_aes_eia2, + check_alg_aes_eia2), + ODP_TEST_INFO_CONDITIONAL(crypto_test_check_alg_aes_eia2, + check_alg_aes_eia2), + ODP_TEST_INFO_CONDITIONAL(crypto_test_gen_alg_aes_eia2_ovr_iv, + check_alg_aes_eia2), + ODP_TEST_INFO_CONDITIONAL(crypto_test_check_alg_aes_eia2_ovr_iv, + check_alg_aes_eia2), ODP_TEST_INFO_CONDITIONAL(crypto_test_gen_alg_zuc_eia3, check_alg_zuc_eia3), ODP_TEST_INFO_CONDITIONAL(crypto_test_check_alg_zuc_eia3, diff --git a/test/validation/api/crypto/test_vectors.h b/test/validation/api/crypto/test_vectors.h index e9d702eae..6c4fc5b59 100644 --- a/test/validation/api/crypto/test_vectors.h +++ b/test/validation/api/crypto/test_vectors.h @@ -2536,6 +2536,79 @@ static crypto_test_reference_t snow3g_uia2_reference[] = { } }; +/* + * AES EEA2 and AES EIA2 test vectors from + * Specification of the 3GPP Confidentiality and Integrity + * Algorithms 128-EEA2 & 128-EIA2 + */ +static crypto_test_reference_t aes_eea2_reference[] = { + { + .cipher_key_length = AES_EEA2_KEY_LEN, + .cipher_key = { 0xD3, 0xC5, 0xD5, 0x92, 0x32, 0x7F, 0xB1, 0x1C, + 0x40, 0x35, 0xC6, 0x68, 0x0A, 0xF8, 0xC6, 0xD1}, + .cipher_iv_length = AES_EEA2_IV_LEN, + .cipher_iv = { 0x39, 0x8a, 0x59, 0xb4, 0xac, }, + .length = 248 /* + 5 */, /* 253 bits originally = 31 + 1 bytes*/ + .plaintext = { 0x98, 0x1B, 0xA6, 0x82, 0x4C, 0x1B, 0xFB, 0x1A, + 0xB4, 0x85, 0x47, 0x20, 0x29, 0xB7, 0x1D, 0x80, + 0x8C, 0xE3, 0x3E, 0x2C, 0xC3, 0xC0, 0xB5, 0xFC, + 0x1F, 0x3D, 0xE8, 0xA6, 0xDC, 0x66, 0xB1, 0xF0 }, + .ciphertext = { 0xE9, 0xFE, 0xD8, 0xA6, 0x3D, 0x15, 0x53, 0x04, + 0xD7, 0x1D, 0xF2, 0x0B, 0xF3, 0xE8, 0x22, 0x14, + 0xB2, 0x0E, 0xD7, 0xDA, 0xD2, 0xF2, 0x33, 0xDC, + 0x3C, 0x22, 0xD7, 0xBD, 0xEE, 0xED, 0x8E, 0x78} + }, + { + .cipher_key_length = AES_EEA2_KEY_LEN, + .cipher_key = { 0x2B, 0xD6, 0x45, 0x9F, 0x82, 0xC4, 0x40, 0xE0, + 0x95, 0x2C, 0x49, 0x10, 0x48, 0x05, 0xFF, 0x48}, + .cipher_iv_length = AES_EEA2_IV_LEN, + .cipher_iv = { 0xc6, 0x75, 0xa6, 0x4b, 0x64, }, + .length = 99 /* + 6 */, /* 798 bits originally = 99 + 1 bytes */ + .plaintext = { 0x7E, 0xC6, 0x12, 0x72, 0x74, 0x3B, 0xF1, 0x61, + 0x47, 0x26, 0x44, 0x6A, 0x6C, 0x38, 0xCE, 0xD1, + 0x66, 0xF6, 0xCA, 0x76, 0xEB, 0x54, 0x30, 0x04, + 0x42, 0x86, 0x34, 0x6C, 0xEF, 0x13, 0x0F, 0x92, + 0x92, 0x2B, 0x03, 0x45, 0x0D, 0x3A, 0x99, 0x75, + 0xE5, 0xBD, 0x2E, 0xA0, 0xEB, 0x55, 0xAD, 0x8E, + 0x1B, 0x19, 0x9E, 0x3E, 0xC4, 0x31, 0x60, 0x20, + 0xE9, 0xA1, 0xB2, 0x85, 0xE7, 0x62, 0x79, 0x53, + 0x59, 0xB7, 0xBD, 0xFD, 0x39, 0xBE, 0xF4, 0xB2, + 0x48, 0x45, 0x83, 0xD5, 0xAF, 0xE0, 0x82, 0xAE, + 0xE6, 0x38, 0xBF, 0x5F, 0xD5, 0xA6, 0x06, 0x19, + 0x39, 0x01, 0xA0, 0x8F, 0x4A, 0xB4, 0x1A, 0xAB, + 0x9B, 0x13, 0x48, 0x80 }, + .ciphertext = { 0x59, 0x61, 0x60, 0x53, 0x53, 0xC6, 0x4B, 0xDC, + 0xA1, 0x5B, 0x19, 0x5E, 0x28, 0x85, 0x53, 0xA9, + 0x10, 0x63, 0x25, 0x06, 0xD6, 0x20, 0x0A, 0xA7, + 0x90, 0xC4, 0xC8, 0x06, 0xC9, 0x99, 0x04, 0xCF, + 0x24, 0x45, 0xCC, 0x50, 0xBB, 0x1C, 0xF1, 0x68, + 0xA4, 0x96, 0x73, 0x73, 0x4E, 0x08, 0x1B, 0x57, + 0xE3, 0x24, 0xCE, 0x52, 0x59, 0xC0, 0xE7, 0x8D, + 0x4C, 0xD9, 0x7B, 0x87, 0x09, 0x76, 0x50, 0x3C, + 0x09, 0x43, 0xF2, 0xCB, 0x5A, 0xE8, 0xF0, 0x52, + 0xC7, 0xB7, 0xD3, 0x92, 0x23, 0x95, 0x87, 0xB8, + 0x95, 0x60, 0x86, 0xBC, 0xAB, 0x18, 0x83, 0x60, + 0x42, 0xE2, 0xE6, 0xCE, 0x42, 0x43, 0x2A, 0x17, + 0x10, 0x5C, 0x53, 0xD0 } + }, +}; + +static crypto_test_reference_t aes_eia2_reference[] = { + { + .auth_key_length = AES_EIA2_KEY_LEN, + .auth_key = { 0xD3, 0xC5, 0xD5, 0x92, 0x32, 0x7F, 0xB1, 0x1C, + 0x40, 0x35, 0xC6, 0x68, 0x0A, 0xF8, 0xC6, 0xD1 }, + .auth_iv_length = AES_EIA2_IV_LEN, + .auth_iv = { 0x39, 0x8a, 0x59, 0xb4, 0xd4, }, + .length = 64, /* 8 bytes */ + .plaintext = { 0x48, 0x45, 0x83, 0xd5, 0xaf, 0xe0, 0x82, 0xae }, + .ciphertext = { 0x48, 0x45, 0x83, 0xd5, 0xaf, 0xe0, 0x82, 0xae}, + .digest_length = AES_EIA2_DIGEST_LEN, + .digest = { 0xb9, 0x37, 0x87, 0xe6 } + }, +}; + /* * ZUC EEA3 and EIA3 test vectors from * Specification of the 3GPP Confidentiality and Integrity diff --git a/test/validation/api/crypto/test_vectors_len.h b/test/validation/api/crypto/test_vectors_len.h index fd5bccfc9..17121e12e 100644 --- a/test/validation/api/crypto/test_vectors_len.h +++ b/test/validation/api/crypto/test_vectors_len.h @@ -93,6 +93,10 @@ #define SNOW3G_UEA2_KEY_LEN 16 #define SNOW3G_UEA2_IV_LEN 16 +/* AES_EEA2 */ +#define AES_EEA2_KEY_LEN 16 +#define AES_EEA2_IV_LEN 16 + /* ZUC_EEA3 */ #define ZUC_EEA3_KEY_LEN 16 #define ZUC_EEA3_IV_LEN 16 @@ -107,6 +111,11 @@ #define SNOW3G_UIA2_IV_LEN 16 #define SNOW3G_UIA2_DIGEST_LEN 4 +/* AES_EIA2 */ +#define AES_EIA2_KEY_LEN 16 +#define AES_EIA2_IV_LEN 8 +#define AES_EIA2_DIGEST_LEN 4 + /* ZUC_EIA3 */ #define ZUC_EIA3_KEY_LEN 16 #define ZUC_EIA3_IV_LEN 16 -- cgit v1.2.3