diff mbox series

[1/4] validation: crypto: add HMAC-SHA-1-96 test cases

Message ID 1493758812-21347-1-git-send-email-odpbot@yandex.ru
State New
Headers show
Series [1/4] validation: crypto: add HMAC-SHA-1-96 test cases | expand

Commit Message

Github ODP bot May 2, 2017, 9 p.m. UTC
From: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>


Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>

---
/** Email created from pull request 10 (lumag:crypto-update)
 ** https://github.com/Linaro/odp/pull/10
 ** Patch: https://github.com/Linaro/odp/pull/10.patch
 ** Base sha: 0b1dbf37b4030c6da4c6f13645c63fd4ac8ff923
 ** Merge commit sha: 72489ef29ea4586f487b1c806cf37fab63272c7a
 **/
 test/common_plat/validation/api/crypto/crypto.h    |   3 +-
 .../validation/api/crypto/odp_crypto_test_inp.c    | 123 +++++++++++++++++++--
 .../validation/api/crypto/test_vectors.h           |  44 ++++++++
 .../validation/api/crypto/test_vectors_len.h       |   6 +
 4 files changed, 164 insertions(+), 12 deletions(-)
diff mbox series

Patch

diff --git a/test/common_plat/validation/api/crypto/crypto.h b/test/common_plat/validation/api/crypto/crypto.h
index 4d810f6..1e14869 100644
--- a/test/common_plat/validation/api/crypto/crypto.h
+++ b/test/common_plat/validation/api/crypto/crypto.h
@@ -24,7 +24,8 @@  void crypto_test_dec_alg_aes128_gcm(void);
 void crypto_test_dec_alg_aes128_gcm_ovr_iv(void);
 void crypto_test_gen_alg_hmac_md5(void);
 void crypto_test_check_alg_hmac_md5(void);
-void crypto_test_alg_hmac_sha1(void);
+void crypto_test_gen_alg_hmac_sha1(void);
+void crypto_test_check_alg_hmac_sha1(void);
 void crypto_test_gen_alg_hmac_sha256(void);
 void crypto_test_check_alg_hmac_sha256(void);
 void crypto_test_alg_hmac_sha512(void);
diff --git a/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c b/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c
index db380c2..f8e96ca 100644
--- a/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c
+++ b/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c
@@ -28,6 +28,8 @@  static const char *auth_alg_name(odp_auth_alg_t auth)
 		return "ODP_AUTH_ALG_NULL";
 	case ODP_AUTH_ALG_MD5_HMAC:
 		return "ODP_AUTH_ALG_MD5_HMAC";
+	case ODP_AUTH_ALG_SHA1_HMAC:
+		return "ODP_AUTH_ALG_SHA1_HMAC";
 	case ODP_AUTH_ALG_SHA256_HMAC:
 		return "ODP_AUTH_ALG_SHA256_HMAC";
 	case ODP_AUTH_ALG_AES_GCM:
@@ -129,6 +131,9 @@  static void alg_test(odp_crypto_op_t op,
 	if (auth_alg == ODP_AUTH_ALG_NULL &&
 	    !(capa.auths.bit.null))
 		rc = -1;
+	if (auth_alg == ODP_AUTH_ALG_SHA1_HMAC &&
+	    !(capa.auths.bit.sha1_hmac))
+		rc = -1;
 	if (auth_alg == ODP_AUTH_ALG_SHA256_HMAC &&
 	    !(capa.auths.bit.sha256_hmac))
 		rc = -1;
@@ -1037,6 +1042,110 @@  void crypto_test_check_alg_hmac_md5(void)
 	}
 }
 
+static int check_alg_hmac_sha1(void)
+{
+	return check_alg_support(ODP_CIPHER_ALG_NULL, ODP_AUTH_ALG_SHA1_HMAC);
+}
+
+/* This test verifies the correctness of HMAC_SHA1 digest operation.
+ * The output check length is truncated to 12 bytes (96 bits) as
+ * returned by the crypto operation API call.
+ * Note that hash digest is a one-way operation.
+ * In addition the test verifies if the implementation can use the
+ * packet buffer as completion event buffer.
+ * */
+void crypto_test_gen_alg_hmac_sha1(void)
+{
+	odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
+			 auth_key   = { .data = NULL, .length = 0 };
+	odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
+
+	unsigned int test_vec_num = (sizeof(hmac_sha1_reference_length) /
+				     sizeof(hmac_sha1_reference_length[0]));
+
+	unsigned int i;
+
+	for (i = 0; i < test_vec_num; i++) {
+		auth_key.data = hmac_sha1_reference_key[i];
+		auth_key.length = sizeof(hmac_sha1_reference_key[i]);
+
+		if (!check_auth_options(ODP_AUTH_ALG_SHA1_HMAC,
+					auth_key.length,
+					HMAC_SHA1_96_CHECK_LEN))
+			continue;
+
+		alg_test(ODP_CRYPTO_OP_ENCODE,
+			 0,
+			 ODP_CIPHER_ALG_NULL,
+			 iv,
+			 iv.data,
+			 cipher_key,
+			 ODP_AUTH_ALG_SHA1_HMAC,
+			 auth_key,
+			 NULL, NULL,
+			 hmac_sha1_reference_plaintext[i],
+			 hmac_sha1_reference_length[i],
+			 NULL, 0,
+			 hmac_sha1_reference_digest[i],
+			 HMAC_SHA1_96_CHECK_LEN);
+	}
+}
+
+void crypto_test_check_alg_hmac_sha1(void)
+{
+	odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
+			 auth_key   = { .data = NULL, .length = 0 };
+	odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
+	uint8_t wrong_digest[HMAC_SHA1_DIGEST_LEN];
+
+	unsigned int test_vec_num = (sizeof(hmac_sha1_reference_length) /
+				     sizeof(hmac_sha1_reference_length[0]));
+
+	unsigned int i;
+
+	memset(wrong_digest, 0xa5, sizeof(wrong_digest));
+
+	for (i = 0; i < test_vec_num; i++) {
+		auth_key.data = hmac_sha1_reference_key[i];
+		auth_key.length = sizeof(hmac_sha1_reference_key[i]);
+
+		if (!check_auth_options(ODP_AUTH_ALG_SHA1_HMAC,
+					auth_key.length,
+					HMAC_SHA1_96_CHECK_LEN))
+			continue;
+
+		alg_test(ODP_CRYPTO_OP_DECODE,
+			 0,
+			 ODP_CIPHER_ALG_NULL,
+			 iv,
+			 iv.data,
+			 cipher_key,
+			 ODP_AUTH_ALG_SHA1_HMAC,
+			 auth_key,
+			 NULL, NULL,
+			 hmac_sha1_reference_plaintext[i],
+			 hmac_sha1_reference_length[i],
+			 NULL, 0,
+			 hmac_sha1_reference_digest[i],
+			 HMAC_SHA1_96_CHECK_LEN);
+
+		alg_test(ODP_CRYPTO_OP_DECODE,
+			 1,
+			 ODP_CIPHER_ALG_NULL,
+			 iv,
+			 iv.data,
+			 cipher_key,
+			 ODP_AUTH_ALG_SHA1_HMAC,
+			 auth_key,
+			 NULL, NULL,
+			 hmac_sha1_reference_plaintext[i],
+			 hmac_sha1_reference_length[i],
+			 NULL, 0,
+			 wrong_digest,
+			 HMAC_SHA1_96_CHECK_LEN);
+	}
+}
+
 static int check_alg_hmac_sha256(void)
 {
 	return check_alg_support(ODP_CIPHER_ALG_NULL, ODP_AUTH_ALG_SHA256_HMAC);
@@ -1141,16 +1250,6 @@  void crypto_test_check_alg_hmac_sha256(void)
 	}
 }
 
-static int check_alg_hmac_sha1(void)
-{
-	return check_alg_support(ODP_CIPHER_ALG_NULL, ODP_AUTH_ALG_SHA1_HMAC);
-}
-
-void crypto_test_alg_hmac_sha1(void)
-{
-	printf(" TEST NOT IMPLEMENTED YET ");
-}
-
 static int check_alg_hmac_sha512(void)
 {
 	return check_alg_support(ODP_CIPHER_ALG_NULL, ODP_AUTH_ALG_SHA512_HMAC);
@@ -1214,7 +1313,9 @@  odp_testinfo_t crypto_suite[] = {
 				  check_alg_hmac_md5),
 	ODP_TEST_INFO_CONDITIONAL(crypto_test_check_alg_hmac_md5,
 				  check_alg_hmac_md5),
-	ODP_TEST_INFO_CONDITIONAL(crypto_test_alg_hmac_sha1,
+	ODP_TEST_INFO_CONDITIONAL(crypto_test_gen_alg_hmac_sha1,
+				  check_alg_hmac_sha1),
+	ODP_TEST_INFO_CONDITIONAL(crypto_test_check_alg_hmac_sha1,
 				  check_alg_hmac_sha1),
 	ODP_TEST_INFO_CONDITIONAL(crypto_test_gen_alg_hmac_sha256,
 				  check_alg_hmac_sha256),
diff --git a/test/common_plat/validation/api/crypto/test_vectors.h b/test/common_plat/validation/api/crypto/test_vectors.h
index da4610f..ce4ca8f 100644
--- a/test/common_plat/validation/api/crypto/test_vectors.h
+++ b/test/common_plat/validation/api/crypto/test_vectors.h
@@ -350,4 +350,48 @@  static uint8_t hmac_sha256_reference_digest[][HMAC_SHA256_DIGEST_LEN] = {
 	  0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7 }
 };
 
+static uint8_t hmac_sha1_reference_key[][HMAC_SHA1_KEY_LEN] = {
+	{ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+	  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+	  0x0b, 0x0b, 0x0b, 0x0b },
+
+	/* "Jefe" */
+	{ 0x4a, 0x65, 0x66, 0x65 },
+
+	{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	  0xaa, 0xaa, 0xaa, 0xaa }
+};
+
+static uint32_t hmac_sha1_reference_length[] = { 8, 28, 50 };
+
+static uint8_t
+hmac_sha1_reference_plaintext[][HMAC_SHA1_MAX_DATA_LEN] = {
+	/* "Hi There" */
+	{ 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65},
+
+	/* what do ya want for nothing?*/
+	{ 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20,
+	  0x79, 0x61, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20,
+	  0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68,
+	  0x69, 0x6e, 0x67, 0x3f },
+
+	{ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+	  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+	  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+	  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+	  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd }
+};
+
+static uint8_t hmac_sha1_reference_digest[][HMAC_SHA1_DIGEST_LEN] = {
+	{ 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05,
+	  0x72, 0x64, 0xe2, 0x8b, 0xc0, 0xb6 },
+
+	{ 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb,
+	  0x2f, 0xa2, 0xd2, 0x74, 0x16, 0xd5 },
+
+	{ 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac,
+	  0x11, 0xcd, 0x91, 0xa3, 0x9a, 0xf4 },
+};
+
 #endif
diff --git a/test/common_plat/validation/api/crypto/test_vectors_len.h b/test/common_plat/validation/api/crypto/test_vectors_len.h
index 4fbb5cd..609f430 100644
--- a/test/common_plat/validation/api/crypto/test_vectors_len.h
+++ b/test/common_plat/validation/api/crypto/test_vectors_len.h
@@ -35,4 +35,10 @@ 
 #define HMAC_SHA256_DIGEST_LEN     32
 #define HMAC_SHA256_128_CHECK_LEN  16
 
+/* HMAC-SHA1 */
+#define HMAC_SHA1_KEY_LEN        20
+#define HMAC_SHA1_MAX_DATA_LEN   128
+#define HMAC_SHA1_DIGEST_LEN     20
+#define HMAC_SHA1_96_CHECK_LEN   12
+
 #endif