@@ -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,9 +131,13 @@ 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;
+ rc = -1;
CU_ASSERT(!rc);
CU_ASSERT((~capa.auths.all_bits & capa.hw_auths.all_bits) == 0);
@@ -1146,14 +1152,103 @@ 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)
{
- printf(" TEST NOT IMPLEMENTED YET ");
+ 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)
{
- printf(" TEST NOT IMPLEMENTED YET ");
+ 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_sha512(void)
@@ -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
@@ -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
Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org> --- .../validation/api/crypto/odp_crypto_test_inp.c | 99 +++++++++++++++++++++- .../validation/api/crypto/test_vectors.h | 44 ++++++++++ .../validation/api/crypto/test_vectors_len.h | 6 ++ 3 files changed, 147 insertions(+), 2 deletions(-) -- 2.11.0