2 * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
14 #include "internal/nelem.h"
16 # include <openssl/hmac.h>
17 # include <openssl/sha.h>
18 # ifndef OPENSSL_NO_MD5
19 # include <openssl/md5.h>
22 # ifdef CHARSET_EBCDIC
23 # include <openssl/ebcdic.h>
28 # ifndef OPENSSL_NO_MD5
29 static struct test_st {
32 const unsigned char data[64];
37 "", 0, "More text test vectors to stuff up EBCDIC machines :-)", 54,
38 "e9139d1e6ee064ef8cf514fc7dc83e86",
42 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
43 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
45 "9294727a3638bb1c13f48ef8158bfc9d",
48 "Jefe", 4, "what do ya want for nothing?", 28,
49 "750c783e6ab0b503eaa86e310a5db738",
53 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
54 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
56 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
57 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
58 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
59 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
60 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd
61 }, 50, "56be34521d144c88dbb8c733f0e8b3f6",
64 "", 0, "My test data", 12,
65 "61afdecb95429ef494d61fdee15990cabf0826fc"
68 "", 0, "My test data", 12,
69 "2274b195d90ce8e03406f4b526a47e0787a88a65479938f1a5baa3ce0f079776"
72 "123456", 6, "My test data", 12,
73 "bab53058ae861a7f191abe2d0145cbb123776a6369ee3f9d79ce455667e411dd"
76 "12345", 5, "My test data again", 18,
77 "a12396ceddd2a85f4c656bc1e0aa50c78cffde3e"
82 static char *pt(unsigned char *md, unsigned int len);
85 # ifndef OPENSSL_NO_MD5
86 static int test_hmac_md5(int idx)
89 # ifdef CHARSET_EBCDIC
90 ebcdic2ascii(test[0].data, test[0].data, test[0].data_len);
91 ebcdic2ascii(test[1].data, test[1].data, test[1].data_len);
92 ebcdic2ascii(test[2].key, test[2].key, test[2].key_len);
93 ebcdic2ascii(test[2].data, test[2].data, test[2].data_len);
96 p = pt(HMAC(EVP_md5(),
97 test[idx].key, test[idx].key_len,
98 test[idx].data, test[idx].data_len, NULL, NULL),
101 if (!TEST_str_eq(p, test[idx].digest))
108 static int test_hmac_bad(void)
110 HMAC_CTX *ctx = NULL;
113 ctx = HMAC_CTX_new();
115 || !TEST_ptr_null(HMAC_CTX_get_md(ctx))
116 || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL))
117 || !TEST_false(HMAC_Update(ctx, test[4].data, test[4].data_len))
118 || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, EVP_sha1(), NULL))
119 || !TEST_false(HMAC_Update(ctx, test[4].data, test[4].data_len)))
128 static int test_hmac_run(void)
131 HMAC_CTX *ctx = NULL;
132 unsigned char buf[EVP_MAX_MD_SIZE];
136 ctx = HMAC_CTX_new();
140 || !TEST_ptr_null(HMAC_CTX_get_md(ctx))
141 || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL))
142 || !TEST_false(HMAC_Update(ctx, test[4].data, test[4].data_len))
143 || !TEST_false(HMAC_Init_ex(ctx, test[4].key, -1, EVP_sha1(), NULL)))
146 if (!TEST_true(HMAC_Init_ex(ctx, test[4].key, test[4].key_len, EVP_sha1(), NULL))
147 || !TEST_true(HMAC_Update(ctx, test[4].data, test[4].data_len))
148 || !TEST_true(HMAC_Final(ctx, buf, &len)))
152 if (!TEST_str_eq(p, test[4].digest))
155 if (!TEST_false(HMAC_Init_ex(ctx, NULL, 0, EVP_sha256(), NULL)))
158 if (!TEST_true(HMAC_Init_ex(ctx, test[5].key, test[5].key_len, EVP_sha256(), NULL))
159 || !TEST_ptr_eq(HMAC_CTX_get_md(ctx), EVP_sha256())
160 || !TEST_true(HMAC_Update(ctx, test[5].data, test[5].data_len))
161 || !TEST_true(HMAC_Final(ctx, buf, &len)))
165 if (!TEST_str_eq(p, test[5].digest))
168 if (!TEST_true(HMAC_Init_ex(ctx, test[6].key, test[6].key_len, NULL, NULL))
169 || !TEST_true(HMAC_Update(ctx, test[6].data, test[6].data_len))
170 || !TEST_true(HMAC_Final(ctx, buf, &len)))
173 if (!TEST_str_eq(p, test[6].digest))
183 static int test_hmac_single_shot(void)
187 /* Test single-shot with an empty key. */
188 p = pt(HMAC(EVP_sha1(), NULL, 0, test[4].data, test[4].data_len,
189 NULL, NULL), SHA_DIGEST_LENGTH);
190 if (!TEST_str_eq(p, test[4].digest))
197 static int test_hmac_copy(void)
200 HMAC_CTX *ctx = NULL, *ctx2 = NULL;
201 unsigned char buf[EVP_MAX_MD_SIZE];
205 ctx = HMAC_CTX_new();
206 ctx2 = HMAC_CTX_new();
207 if (!TEST_ptr(ctx) || !TEST_ptr(ctx2))
210 if (!TEST_true(HMAC_Init_ex(ctx, test[7].key, test[7].key_len, EVP_sha1(), NULL))
211 || !TEST_true(HMAC_Update(ctx, test[7].data, test[7].data_len))
212 || !TEST_true(HMAC_CTX_copy(ctx2, ctx))
213 || !TEST_true(HMAC_Final(ctx2, buf, &len)))
217 if (!TEST_str_eq(p, test[7].digest))
227 # ifndef OPENSSL_NO_MD5
228 static char *pt(unsigned char *md, unsigned int len)
233 for (i = 0; i < len; i++)
234 sprintf(&(buf[i * 2]), "%02x", md[i]);
239 int setup_tests(void)
241 ADD_ALL_TESTS(test_hmac_md5, 4);
242 ADD_TEST(test_hmac_single_shot);
243 ADD_TEST(test_hmac_bad);
244 ADD_TEST(test_hmac_run);
245 ADD_TEST(test_hmac_copy);