aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Eremin-Solenikov <deremin-solenikov@cavium.com>2019-04-21 02:41:49 +0300
committerPetri Savolainen <petri.savolainen@nokia.com>2019-05-24 13:53:51 +0300
commitff879d5fa8c3ed9ba52cb44d9a4501e66531672d (patch)
tree529b3a48e48d8ecaa1ddc914bfa3773649ae486e
parent9fc4a95a6c7807a24d1595bd2c8c7884e6ce12a2 (diff)
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 <deremin-solenikov@cavium.com> Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
-rw-r--r--test/validation/api/crypto/odp_crypto_test_inp.c134
-rw-r--r--test/validation/api/crypto/test_vectors.h73
-rw-r--r--test/validation/api/crypto/test_vectors_len.h9
3 files changed, 216 insertions, 0 deletions
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
@@ -2537,6 +2537,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
* Algorithms 128-EEA3 & 128-EIA3
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