/* Copyright 2016 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include #include #include #include #include "2sha.h" #include "2hmac.h" #include "test_common.h" const char short_key[] = "key"; const char message[] = "The quick brown fox jumps over the lazy dog"; /* This is supposed to be longer than the supported block sizes */ const char long_key[] = "loooooooooooooooooooooooooooooooooooooooooooonooooooooooooooooooo" "ooooooooooooooooooooooooooooooooooooooooooooonooooooooooooog key"; static void test_hmac_by_openssl(enum vb2_hash_algorithm alg, const void *key, uint32_t key_size, const void *msg, uint32_t msg_size) { uint8_t mac[VB2_MAX_DIGEST_SIZE]; uint32_t mac_size = sizeof(mac); uint8_t md[VB2_MAX_DIGEST_SIZE]; uint32_t md_size = sizeof(md); char test_name[256]; switch (alg) { case VB2_HASH_SHA1: HMAC(EVP_sha1(), key, key_size, msg, msg_size, md, &md_size); break; case VB2_HASH_SHA256: HMAC(EVP_sha256(), key, key_size, msg, msg_size, md, &md_size); break; case VB2_HASH_SHA512: HMAC(EVP_sha512(), key, key_size, msg, msg_size, md, &md_size); break; default: TEST_SUCC(-1, "Unsupported hash algorithm"); } sprintf(test_name, "%s: HMAC-%s (key_size=%d)", __func__, vb2_get_hash_algorithm_name(alg), key_size); TEST_SUCC(hmac(alg, key, key_size, msg, msg_size, mac, mac_size), test_name); TEST_SUCC(memcmp(mac, md, md_size), "HMAC digests match"); } static void test_hmac_error(void) { uint8_t mac[VB2_MAX_DIGEST_SIZE]; enum vb2_hash_algorithm alg; alg = VB2_HASH_SHA1; TEST_TRUE(hmac(alg, NULL, 0, message, strlen(message), mac, sizeof(mac)), "key = NULL"); TEST_TRUE(hmac(alg, short_key, strlen(short_key), NULL, 0, mac, sizeof(mac)), "msg = NULL"); TEST_TRUE(hmac(alg, short_key, strlen(short_key), message, strlen(message), NULL, 0), "mac = NULL"); TEST_TRUE(hmac(alg, short_key, strlen(short_key), message, strlen(message), mac, 0), "Buffer too small"); alg = -1; TEST_TRUE(hmac(alg, short_key, strlen(short_key), message, strlen(message), mac, sizeof(mac)), "Invalid algorithm"); } static void test_hmac(void) { int alg; for (alg = 1; alg < VB2_HASH_ALG_COUNT; alg++) { /* Try short key */ test_hmac_by_openssl(alg, short_key, strlen(short_key), message, strlen(message)); /* Try key longer than a block size */ test_hmac_by_openssl(alg, long_key, strlen(long_key), message, strlen(message)); /* Try empty key and message */ test_hmac_by_openssl(alg, "", 0, "", 0); } } int main(void) { test_hmac(); test_hmac_error(); return gTestSuccess ? 0 : 255; }