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