1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2016 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker */
5*8617a60dSAndroid Build Coastguard Worker
6*8617a60dSAndroid Build Coastguard Worker #include <stdint.h>
7*8617a60dSAndroid Build Coastguard Worker #include <string.h>
8*8617a60dSAndroid Build Coastguard Worker #include <stdio.h>
9*8617a60dSAndroid Build Coastguard Worker #include <openssl/hmac.h>
10*8617a60dSAndroid Build Coastguard Worker
11*8617a60dSAndroid Build Coastguard Worker #include "2sha.h"
12*8617a60dSAndroid Build Coastguard Worker #include "2hmac.h"
13*8617a60dSAndroid Build Coastguard Worker #include "common/tests.h"
14*8617a60dSAndroid Build Coastguard Worker
15*8617a60dSAndroid Build Coastguard Worker const char short_key[] = "key";
16*8617a60dSAndroid Build Coastguard Worker const char message[] = "The quick brown fox jumps over the lazy dog";
17*8617a60dSAndroid Build Coastguard Worker /* This is supposed to be longer than the supported block sizes */
18*8617a60dSAndroid Build Coastguard Worker const char long_key[] =
19*8617a60dSAndroid Build Coastguard Worker "loooooooooooooooooooooooooooooooooooooooooooonooooooooooooooooooo"
20*8617a60dSAndroid Build Coastguard Worker "ooooooooooooooooooooooooooooooooooooooooooooonooooooooooooog key";
21*8617a60dSAndroid Build Coastguard Worker
test_hmac_by_openssl(enum vb2_hash_algorithm alg,const void * key,uint32_t key_size,const void * msg,uint32_t msg_size)22*8617a60dSAndroid Build Coastguard Worker static void test_hmac_by_openssl(enum vb2_hash_algorithm alg,
23*8617a60dSAndroid Build Coastguard Worker const void *key, uint32_t key_size,
24*8617a60dSAndroid Build Coastguard Worker const void *msg, uint32_t msg_size)
25*8617a60dSAndroid Build Coastguard Worker {
26*8617a60dSAndroid Build Coastguard Worker struct vb2_hash mac;
27*8617a60dSAndroid Build Coastguard Worker uint8_t md[VB2_MAX_DIGEST_SIZE];
28*8617a60dSAndroid Build Coastguard Worker uint32_t md_size = sizeof(md);
29*8617a60dSAndroid Build Coastguard Worker char test_name[256];
30*8617a60dSAndroid Build Coastguard Worker
31*8617a60dSAndroid Build Coastguard Worker switch (alg) {
32*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA1:
33*8617a60dSAndroid Build Coastguard Worker HMAC(EVP_sha1(), key, key_size, msg, msg_size, md, &md_size);
34*8617a60dSAndroid Build Coastguard Worker break;
35*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA224:
36*8617a60dSAndroid Build Coastguard Worker HMAC(EVP_sha224(), key, key_size, msg, msg_size, md, &md_size);
37*8617a60dSAndroid Build Coastguard Worker break;
38*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA256:
39*8617a60dSAndroid Build Coastguard Worker HMAC(EVP_sha256(), key, key_size, msg, msg_size, md, &md_size);
40*8617a60dSAndroid Build Coastguard Worker break;
41*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA384:
42*8617a60dSAndroid Build Coastguard Worker HMAC(EVP_sha384(), key, key_size, msg, msg_size, md, &md_size);
43*8617a60dSAndroid Build Coastguard Worker break;
44*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA512:
45*8617a60dSAndroid Build Coastguard Worker HMAC(EVP_sha512(), key, key_size, msg, msg_size, md, &md_size);
46*8617a60dSAndroid Build Coastguard Worker break;
47*8617a60dSAndroid Build Coastguard Worker default:
48*8617a60dSAndroid Build Coastguard Worker TEST_SUCC(-1, "Unsupported hash algorithm");
49*8617a60dSAndroid Build Coastguard Worker }
50*8617a60dSAndroid Build Coastguard Worker sprintf(test_name, "%s: HMAC-%s (key_size=%d)",
51*8617a60dSAndroid Build Coastguard Worker __func__, vb2_get_hash_algorithm_name(alg), key_size);
52*8617a60dSAndroid Build Coastguard Worker TEST_EQ(vb2_digest_size(alg), md_size, "HMAC size");
53*8617a60dSAndroid Build Coastguard Worker TEST_SUCC(vb2_hmac_calculate(false, alg, key, key_size, msg, msg_size, &mac),
54*8617a60dSAndroid Build Coastguard Worker test_name);
55*8617a60dSAndroid Build Coastguard Worker TEST_SUCC(memcmp(mac.raw, md, md_size), "HMAC digests match");
56*8617a60dSAndroid Build Coastguard Worker TEST_EQ(alg, mac.algo, "HMAC algo match");
57*8617a60dSAndroid Build Coastguard Worker }
58*8617a60dSAndroid Build Coastguard Worker
test_hmac_error(void)59*8617a60dSAndroid Build Coastguard Worker static void test_hmac_error(void)
60*8617a60dSAndroid Build Coastguard Worker {
61*8617a60dSAndroid Build Coastguard Worker struct vb2_hash mac;
62*8617a60dSAndroid Build Coastguard Worker enum vb2_hash_algorithm alg;
63*8617a60dSAndroid Build Coastguard Worker
64*8617a60dSAndroid Build Coastguard Worker alg = VB2_HASH_SHA1;
65*8617a60dSAndroid Build Coastguard Worker TEST_TRUE(vb2_hmac_calculate(false, alg, NULL, 0, message, strlen(message), &mac),
66*8617a60dSAndroid Build Coastguard Worker "key = NULL");
67*8617a60dSAndroid Build Coastguard Worker TEST_TRUE(vb2_hmac_calculate(false, alg, short_key, strlen(short_key), NULL, 0, &mac),
68*8617a60dSAndroid Build Coastguard Worker "msg = NULL");
69*8617a60dSAndroid Build Coastguard Worker TEST_TRUE(vb2_hmac_calculate(false, alg, short_key, strlen(short_key), message,
70*8617a60dSAndroid Build Coastguard Worker strlen(message), NULL),
71*8617a60dSAndroid Build Coastguard Worker "mac = NULL");
72*8617a60dSAndroid Build Coastguard Worker alg = -1;
73*8617a60dSAndroid Build Coastguard Worker TEST_TRUE(vb2_hmac_calculate(false, alg, short_key, strlen(short_key), message,
74*8617a60dSAndroid Build Coastguard Worker strlen(message), &mac),
75*8617a60dSAndroid Build Coastguard Worker "Invalid algorithm");
76*8617a60dSAndroid Build Coastguard Worker }
77*8617a60dSAndroid Build Coastguard Worker
test_hmac(void)78*8617a60dSAndroid Build Coastguard Worker static void test_hmac(void)
79*8617a60dSAndroid Build Coastguard Worker {
80*8617a60dSAndroid Build Coastguard Worker int alg;
81*8617a60dSAndroid Build Coastguard Worker
82*8617a60dSAndroid Build Coastguard Worker for (alg = 1; alg < VB2_HASH_ALG_COUNT; alg++) {
83*8617a60dSAndroid Build Coastguard Worker /* Try short key */
84*8617a60dSAndroid Build Coastguard Worker test_hmac_by_openssl(alg, short_key, strlen(short_key),
85*8617a60dSAndroid Build Coastguard Worker message, strlen(message));
86*8617a60dSAndroid Build Coastguard Worker /* Try key longer than a block size */
87*8617a60dSAndroid Build Coastguard Worker test_hmac_by_openssl(alg, long_key, strlen(long_key),
88*8617a60dSAndroid Build Coastguard Worker message, strlen(message));
89*8617a60dSAndroid Build Coastguard Worker /* Try empty key and message */
90*8617a60dSAndroid Build Coastguard Worker test_hmac_by_openssl(alg, "", 0, "", 0);
91*8617a60dSAndroid Build Coastguard Worker }
92*8617a60dSAndroid Build Coastguard Worker }
93*8617a60dSAndroid Build Coastguard Worker
main(void)94*8617a60dSAndroid Build Coastguard Worker int main(void)
95*8617a60dSAndroid Build Coastguard Worker {
96*8617a60dSAndroid Build Coastguard Worker test_hmac();
97*8617a60dSAndroid Build Coastguard Worker test_hmac_error();
98*8617a60dSAndroid Build Coastguard Worker
99*8617a60dSAndroid Build Coastguard Worker return gTestSuccess ? 0 : 255;
100*8617a60dSAndroid Build Coastguard Worker }
101