]>
Commit | Line | Data |
---|---|---|
440e5d80 | 1 | /* |
33388b44 | 2 | * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. |
58964a49 | 3 | * |
909f1a2e | 4 | * Licensed under the Apache License 2.0 (the "License"). You may not use |
440e5d80 RS |
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 | |
58964a49 RE |
8 | */ |
9 | ||
dbde4726 P |
10 | /* |
11 | * HMAC low level APIs are deprecated for public use, but still ok for internal | |
12 | * use. | |
13 | */ | |
14 | #include "internal/deprecated.h" | |
15 | ||
58964a49 RE |
16 | #include <stdio.h> |
17 | #include <string.h> | |
18 | #include <stdlib.h> | |
f5d7a031 | 19 | |
176db6dc | 20 | #include "internal/nelem.h" |
55f78baf | 21 | |
0f113f3e | 22 | # include <openssl/hmac.h> |
b1413d9b | 23 | # include <openssl/sha.h> |
0f113f3e MC |
24 | # ifndef OPENSSL_NO_MD5 |
25 | # include <openssl/md5.h> | |
26 | # endif | |
58964a49 | 27 | |
0f113f3e MC |
28 | # ifdef CHARSET_EBCDIC |
29 | # include <openssl/ebcdic.h> | |
30 | # endif | |
a53955d8 | 31 | |
623d1056 RS |
32 | #include "testutil.h" |
33 | ||
0f113f3e MC |
34 | # ifndef OPENSSL_NO_MD5 |
35 | static struct test_st { | |
f53537b1 | 36 | const char key[16]; |
0f113f3e | 37 | int key_len; |
f53537b1 | 38 | const unsigned char data[64]; |
0f113f3e | 39 | int data_len; |
f53537b1 | 40 | const char *digest; |
2cfbdd71 | 41 | } test[8] = { |
0f113f3e MC |
42 | { |
43 | "", 0, "More text test vectors to stuff up EBCDIC machines :-)", 54, | |
f53537b1 | 44 | "e9139d1e6ee064ef8cf514fc7dc83e86", |
0f113f3e MC |
45 | }, |
46 | { | |
1057c2c3 | 47 | "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", |
73ff6d68 | 48 | 16, "Hi There", 8, |
f53537b1 | 49 | "9294727a3638bb1c13f48ef8158bfc9d", |
0f113f3e MC |
50 | }, |
51 | { | |
52 | "Jefe", 4, "what do ya want for nothing?", 28, | |
f53537b1 | 53 | "750c783e6ab0b503eaa86e310a5db738", |
0f113f3e MC |
54 | }, |
55 | { | |
1057c2c3 | 56 | "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", |
73ff6d68 | 57 | 16, { |
0f113f3e MC |
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, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, | |
61 | 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, | |
62 | 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd | |
f53537b1 | 63 | }, 50, "56be34521d144c88dbb8c733f0e8b3f6", |
0f113f3e | 64 | }, |
2cfbdd71 MC |
65 | { |
66 | "", 0, "My test data", 12, | |
f53537b1 | 67 | "61afdecb95429ef494d61fdee15990cabf0826fc" |
2cfbdd71 MC |
68 | }, |
69 | { | |
70 | "", 0, "My test data", 12, | |
f53537b1 | 71 | "2274b195d90ce8e03406f4b526a47e0787a88a65479938f1a5baa3ce0f079776" |
2cfbdd71 MC |
72 | }, |
73 | { | |
74 | "123456", 6, "My test data", 12, | |
f53537b1 | 75 | "bab53058ae861a7f191abe2d0145cbb123776a6369ee3f9d79ce455667e411dd" |
2cfbdd71 MC |
76 | }, |
77 | { | |
8a3c000c | 78 | "12345", 5, "My test data again", 18, |
f53537b1 | 79 | "a12396ceddd2a85f4c656bc1e0aa50c78cffde3e" |
2cfbdd71 | 80 | } |
0f113f3e MC |
81 | }; |
82 | # endif | |
58964a49 | 83 | |
2cfbdd71 MC |
84 | static char *pt(unsigned char *md, unsigned int len); |
85 | ||
623d1056 | 86 | |
0f113f3e | 87 | # ifndef OPENSSL_NO_MD5 |
623d1056 RS |
88 | static int test_hmac_md5(int idx) |
89 | { | |
0f113f3e | 90 | char *p; |
0f113f3e MC |
91 | # ifdef CHARSET_EBCDIC |
92 | ebcdic2ascii(test[0].data, test[0].data, test[0].data_len); | |
93 | ebcdic2ascii(test[1].data, test[1].data, test[1].data_len); | |
94 | ebcdic2ascii(test[2].key, test[2].key, test[2].key_len); | |
95 | ebcdic2ascii(test[2].data, test[2].data, test[2].data_len); | |
96 | # endif | |
a53955d8 | 97 | |
623d1056 RS |
98 | p = pt(HMAC(EVP_md5(), |
99 | test[idx].key, test[idx].key_len, | |
100 | test[idx].data, test[idx].data_len, NULL, NULL), | |
101 | MD5_DIGEST_LENGTH); | |
102 | ||
f53537b1 | 103 | if (!TEST_str_eq(p, test[idx].digest)) |
623d1056 RS |
104 | return 0; |
105 | ||
106 | return 1; | |
107 | } | |
108 | # endif | |
109 | ||
31a80694 | 110 | static int test_hmac_bad(void) |
623d1056 RS |
111 | { |
112 | HMAC_CTX *ctx = NULL; | |
113 | int ret = 0; | |
2cfbdd71 | 114 | |
bf7c6817 | 115 | ctx = HMAC_CTX_new(); |
623d1056 RS |
116 | if (!TEST_ptr(ctx) |
117 | || !TEST_ptr_null(HMAC_CTX_get_md(ctx)) | |
118 | || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL)) | |
119 | || !TEST_false(HMAC_Update(ctx, test[4].data, test[4].data_len)) | |
120 | || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, EVP_sha1(), NULL)) | |
121 | || !TEST_false(HMAC_Update(ctx, test[4].data, test[4].data_len))) | |
122 | goto err; | |
123 | ||
124 | ret = 1; | |
125 | err: | |
126 | HMAC_CTX_free(ctx); | |
127 | return ret; | |
128 | } | |
129 | ||
31a80694 | 130 | static int test_hmac_run(void) |
623d1056 RS |
131 | { |
132 | char *p; | |
133 | HMAC_CTX *ctx = NULL; | |
134 | unsigned char buf[EVP_MAX_MD_SIZE]; | |
135 | unsigned int len; | |
136 | int ret = 0; | |
b1413d9b | 137 | |
623d1056 | 138 | ctx = HMAC_CTX_new(); |
a87a0a6e | 139 | HMAC_CTX_reset(ctx); |
623d1056 RS |
140 | |
141 | if (!TEST_ptr(ctx) | |
142 | || !TEST_ptr_null(HMAC_CTX_get_md(ctx)) | |
143 | || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL)) | |
144 | || !TEST_false(HMAC_Update(ctx, test[4].data, test[4].data_len)) | |
145 | || !TEST_false(HMAC_Init_ex(ctx, test[4].key, -1, EVP_sha1(), NULL))) | |
146 | goto err; | |
147 | ||
148 | if (!TEST_true(HMAC_Init_ex(ctx, test[4].key, test[4].key_len, EVP_sha1(), NULL)) | |
149 | || !TEST_true(HMAC_Update(ctx, test[4].data, test[4].data_len)) | |
150 | || !TEST_true(HMAC_Final(ctx, buf, &len))) | |
151 | goto err; | |
152 | ||
2cfbdd71 | 153 | p = pt(buf, len); |
f53537b1 | 154 | if (!TEST_str_eq(p, test[4].digest)) |
623d1056 RS |
155 | goto err; |
156 | ||
157 | if (!TEST_false(HMAC_Init_ex(ctx, NULL, 0, EVP_sha256(), NULL))) | |
158 | goto err; | |
159 | ||
160 | if (!TEST_true(HMAC_Init_ex(ctx, test[5].key, test[5].key_len, EVP_sha256(), NULL)) | |
161 | || !TEST_ptr_eq(HMAC_CTX_get_md(ctx), EVP_sha256()) | |
162 | || !TEST_true(HMAC_Update(ctx, test[5].data, test[5].data_len)) | |
163 | || !TEST_true(HMAC_Final(ctx, buf, &len))) | |
164 | goto err; | |
165 | ||
2cfbdd71 | 166 | p = pt(buf, len); |
f53537b1 | 167 | if (!TEST_str_eq(p, test[5].digest)) |
623d1056 RS |
168 | goto err; |
169 | ||
170 | if (!TEST_true(HMAC_Init_ex(ctx, test[6].key, test[6].key_len, NULL, NULL)) | |
171 | || !TEST_true(HMAC_Update(ctx, test[6].data, test[6].data_len)) | |
172 | || !TEST_true(HMAC_Final(ctx, buf, &len))) | |
173 | goto err; | |
2cfbdd71 | 174 | p = pt(buf, len); |
f53537b1 | 175 | if (!TEST_str_eq(p, test[6].digest)) |
623d1056 RS |
176 | goto err; |
177 | ||
b1558c0b MC |
178 | /* Test reusing a key */ |
179 | if (!TEST_true(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL)) | |
180 | || !TEST_true(HMAC_Update(ctx, test[6].data, test[6].data_len)) | |
181 | || !TEST_true(HMAC_Final(ctx, buf, &len))) | |
182 | goto err; | |
183 | p = pt(buf, len); | |
184 | if (!TEST_str_eq(p, test[6].digest)) | |
185 | goto err; | |
186 | ||
187 | /* | |
188 | * Test reusing a key where the digest is provided again but is the same as | |
189 | * last time | |
190 | */ | |
191 | if (!TEST_true(HMAC_Init_ex(ctx, NULL, 0, EVP_sha256(), NULL)) | |
192 | || !TEST_true(HMAC_Update(ctx, test[6].data, test[6].data_len)) | |
193 | || !TEST_true(HMAC_Final(ctx, buf, &len))) | |
194 | goto err; | |
195 | p = pt(buf, len); | |
196 | if (!TEST_str_eq(p, test[6].digest)) | |
197 | goto err; | |
198 | ||
623d1056 RS |
199 | ret = 1; |
200 | err: | |
201 | HMAC_CTX_free(ctx); | |
202 | return ret; | |
203 | } | |
204 | ||
205 | ||
31a80694 | 206 | static int test_hmac_single_shot(void) |
623d1056 RS |
207 | { |
208 | char *p; | |
209 | ||
210 | /* Test single-shot with an empty key. */ | |
211 | p = pt(HMAC(EVP_sha1(), NULL, 0, test[4].data, test[4].data_len, | |
212 | NULL, NULL), SHA_DIGEST_LENGTH); | |
f53537b1 | 213 | if (!TEST_str_eq(p, test[4].digest)) |
623d1056 RS |
214 | return 0; |
215 | ||
216 | return 1; | |
217 | } | |
218 | ||
219 | ||
31a80694 | 220 | static int test_hmac_copy(void) |
623d1056 RS |
221 | { |
222 | char *p; | |
223 | HMAC_CTX *ctx = NULL, *ctx2 = NULL; | |
224 | unsigned char buf[EVP_MAX_MD_SIZE]; | |
225 | unsigned int len; | |
226 | int ret = 0; | |
227 | ||
228 | ctx = HMAC_CTX_new(); | |
bf7c6817 | 229 | ctx2 = HMAC_CTX_new(); |
623d1056 RS |
230 | if (!TEST_ptr(ctx) || !TEST_ptr(ctx2)) |
231 | goto err; | |
232 | ||
233 | if (!TEST_true(HMAC_Init_ex(ctx, test[7].key, test[7].key_len, EVP_sha1(), NULL)) | |
234 | || !TEST_true(HMAC_Update(ctx, test[7].data, test[7].data_len)) | |
235 | || !TEST_true(HMAC_CTX_copy(ctx2, ctx)) | |
236 | || !TEST_true(HMAC_Final(ctx2, buf, &len))) | |
237 | goto err; | |
238 | ||
2cfbdd71 | 239 | p = pt(buf, len); |
f53537b1 | 240 | if (!TEST_str_eq(p, test[7].digest)) |
623d1056 RS |
241 | goto err; |
242 | ||
243 | ret = 1; | |
244 | err: | |
bf7c6817 RL |
245 | HMAC_CTX_free(ctx2); |
246 | HMAC_CTX_free(ctx); | |
623d1056 | 247 | return ret; |
0f113f3e | 248 | } |
58964a49 | 249 | |
0f113f3e | 250 | # ifndef OPENSSL_NO_MD5 |
2cfbdd71 | 251 | static char *pt(unsigned char *md, unsigned int len) |
0f113f3e | 252 | { |
2cfbdd71 | 253 | unsigned int i; |
0f113f3e | 254 | static char buf[80]; |
58964a49 | 255 | |
2cfbdd71 | 256 | for (i = 0; i < len; i++) |
0f113f3e | 257 | sprintf(&(buf[i * 2]), "%02x", md[i]); |
c2500f65 | 258 | return buf; |
0f113f3e MC |
259 | } |
260 | # endif | |
623d1056 | 261 | |
ad887416 | 262 | int setup_tests(void) |
623d1056 RS |
263 | { |
264 | ADD_ALL_TESTS(test_hmac_md5, 4); | |
265 | ADD_TEST(test_hmac_single_shot); | |
266 | ADD_TEST(test_hmac_bad); | |
267 | ADD_TEST(test_hmac_run); | |
268 | ADD_TEST(test_hmac_copy); | |
ad887416 | 269 | return 1; |
623d1056 RS |
270 | } |
271 |