Mercurial > dropbear
comparison hmac_test.c @ 0:d7da3b1e1540 libtomcrypt
put back the 0.95 makefile which was inadvertently merged over
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Mon, 31 May 2004 18:21:40 +0000 |
parents | |
children | 5d99163f7e32 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:d7da3b1e1540 |
---|---|
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis | |
2 * | |
3 * LibTomCrypt is a library that provides various cryptographic | |
4 * algorithms in a highly modular and flexible manner. | |
5 * | |
6 * The library is free for all purposes without any express | |
7 * guarantee it works. | |
8 * | |
9 * Tom St Denis, [email protected], http://libtomcrypt.org | |
10 */ | |
11 /* Submited by Dobes Vandermeer ([email protected]) */ | |
12 | |
13 #include "mycrypt.h" | |
14 | |
15 /* | |
16 (1) append zeros to the end of K to create a B byte string | |
17 (e.g., if K is of length 20 bytes and B=64, then K will be | |
18 appended with 44 zero bytes 0x00) | |
19 (2) XOR (bitwise exclusive-OR) the B byte string computed in step | |
20 (1) with ipad (ipad = the byte 0x36 repeated B times) | |
21 (3) append the stream of data 'text' to the B byte string resulting | |
22 from step (2) | |
23 (4) apply H to the stream generated in step (3) | |
24 (5) XOR (bitwise exclusive-OR) the B byte string computed in | |
25 step (1) with opad (opad = the byte 0x5C repeated B times.) | |
26 (6) append the H result from step (4) to the B byte string | |
27 resulting from step (5) | |
28 (7) apply H to the stream generated in step (6) and output | |
29 the result | |
30 */ | |
31 | |
32 #ifdef HMAC | |
33 | |
34 #define HMAC_BLOCKSIZE hash_descriptor[hash].blocksize | |
35 | |
36 /* | |
37 | |
38 TEST CASES SOURCE: | |
39 | |
40 Network Working Group P. Cheng | |
41 Request for Comments: 2202 IBM | |
42 Category: Informational R. Glenn | |
43 NIST | |
44 September 1997 | |
45 | |
46 Test Cases for HMAC-MD5 and HMAC-SHA-1 | |
47 */ | |
48 | |
49 | |
50 int hmac_test(void) | |
51 { | |
52 #ifndef LTC_TEST | |
53 return CRYPT_NOP; | |
54 #else | |
55 unsigned char digest[MAXBLOCKSIZE]; | |
56 int i; | |
57 | |
58 static const struct hmac_test_case { | |
59 int num; | |
60 char *algo; | |
61 unsigned char key[128]; | |
62 unsigned long keylen; | |
63 unsigned char data[128]; | |
64 unsigned long datalen; | |
65 unsigned char digest[MAXBLOCKSIZE]; | |
66 } cases[] = { | |
67 /* | |
68 3. Test Cases for HMAC-SHA-1 | |
69 | |
70 test_case = 1 | |
71 key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b | |
72 key_len = 20 | |
73 data = "Hi Ther 20 | |
74 digest = 0x4c1a03424b55e07fe7f27be1d58bb9324a9a5a04 | |
75 digest-96 = 0x4c1a03424b55e07fe7f27be1 | |
76 */ | |
77 { 5, "sha1", | |
78 {0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, | |
79 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, | |
80 0x0c, 0x0c, 0x0c, 0x0c}, 20, | |
81 "Test With Truncation", 20, | |
82 {0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2, | |
83 0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04} }, | |
84 | |
85 /* | |
86 test_case = 6 | |
87 key = 0xaa repeated 80 times | |
88 key_len = 80 | |
89 data = "Test Using Larger Than Block-Size Key - Hash Key First" | |
90 data_len = 54 | |
91 digest = 0xaa4ae5e15272d00e95705637ce8a3b55ed402112 | |
92 */ | |
93 { 6, "sha1", | |
94 {0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
95 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
96 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
97 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
98 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
99 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
100 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
101 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
102 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
103 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa}, 80, | |
104 "Test Using Larger Than Block-Size Key - Hash Key First", 54, | |
105 {0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, | |
106 0x95, 0x70, 0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, | |
107 0xed, 0x40, 0x21, 0x12} }, | |
108 | |
109 /* | |
110 test_case = 7 | |
111 key = 0xaa repeated 80 times | |
112 key_len = 80 | |
113 data = "Test Using Larger Than Block-Size Key and Larger | |
114 Than One Block-Size Data" | |
115 data_len = 73 | |
116 digest = 0xe8e99d0f45237d786d6bbaa7965c7808bbff1a91 | |
117 */ | |
118 { 7, "sha1", | |
119 {0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
120 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
121 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
122 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
123 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
124 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
125 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
126 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
127 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
128 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa}, 80, | |
129 "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 73, | |
130 {0xe8, 0xe9, 0x9d, 0x0f, 0x45, 0x23, 0x7d, 0x78, 0x6d, | |
131 0x6b, 0xba, 0xa7, 0x96, 0x5c, 0x78, 0x08, 0xbb, 0xff, 0x1a, 0x91} }, | |
132 | |
133 /* | |
134 2. Test Cases for HMAC-MD5 | |
135 | |
136 test_case = 1 | |
137 key = 0x0b 0b 0b 0b | |
138 0b 0b 0b 0b | |
139 0b 0b 0b 0b | |
140 0b 0b 0b 0b | |
141 key_len = 16 | |
142 data = "Hi There" | |
143 data_len = 8 | |
144 digest = 0x92 94 72 7a | |
145 36 38 bb 1c | |
146 13 f4 8e f8 | |
147 15 8b fc 9d | |
148 */ | |
149 { 1, "md5", | |
150 {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, | |
151 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b}, 16, | |
152 "Hi There", 8, | |
153 {0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c, | |
154 0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d} }, | |
155 /* | |
156 test_case = 2 | |
157 key = "Jefe" | |
158 key_len = 4 | |
159 data = "what do ya want for nothing?" | |
160 data_len = 28 | |
161 digest = 0x750c783e6ab0b503eaa86e310a5db738 | |
162 */ | |
163 { 2, "md5", | |
164 "Jefe", 4, | |
165 "what do ya want for nothing?", 28, | |
166 {0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03, | |
167 0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38} }, | |
168 | |
169 /* | |
170 test_case = 3 | |
171 key = 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | |
172 key_len 16 | |
173 data = 0xdd repeated 50 times | |
174 data_len = 50 | |
175 digest = 0x56be34521d144c88dbb8c733f0e8b3f6 | |
176 */ | |
177 { 3, "md5", | |
178 {0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
179 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa}, 16, | |
180 {0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, | |
181 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, | |
182 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, | |
183 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, | |
184 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd}, 50, | |
185 {0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88, | |
186 0xdb, 0xb8, 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6} }, | |
187 /* | |
188 | |
189 test_case = 4 | |
190 key = 0x0102030405060708090a0b0c0d0e0f10111213141516171819 | |
191 key_len 25 | |
192 data = 0xcd repeated 50 times | |
193 data_len = 50 | |
194 digest = 0x697eaf0aca3a3aea3a75164746ffaa79 | |
195 */ | |
196 { 4, "md5", | |
197 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, | |
198 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, | |
199 0x15, 0x16, 0x17, 0x18, 0x19}, 25, | |
200 {0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, | |
201 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, | |
202 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, | |
203 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, | |
204 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd}, 50, | |
205 {0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea, | |
206 0x3a, 0x75, 0x16, 0x47, 0x46, 0xff, 0xaa, 0x79} }, | |
207 | |
208 | |
209 /* | |
210 | |
211 test_case = 5 | |
212 key = 0x0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c | |
213 key_len = 16 | |
214 data = "Test With Truncation" | |
215 data_len = 20 | |
216 digest = 0x56461ef2342edc00f9bab995690efd4c | |
217 digest-96 0x56461ef2342edc00f9bab995 | |
218 */ | |
219 { 5, "md5", | |
220 {0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, | |
221 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c}, 16, | |
222 "Test With Truncation", 20, | |
223 {0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00, | |
224 0xf9, 0xba, 0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c} }, | |
225 | |
226 /* | |
227 | |
228 test_case = 6 | |
229 key = 0xaa repeated 80 times | |
230 key_len = 80 | |
231 data = "Test Using Larger Than Block-Size Key - Hash | |
232 Key First" | |
233 data_len = 54 | |
234 digest = 0x6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd | |
235 */ | |
236 { 6, "md5", | |
237 {0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
238 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
239 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
240 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
241 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
242 | |
243 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
244 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
245 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
246 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
247 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa}, 80, | |
248 "Test Using Larger Than Block-Size Key - Hash Key First", 54, | |
249 {0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f, | |
250 0x0b, 0x62, 0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd} }, | |
251 | |
252 /* | |
253 | |
254 test_case = 7 | |
255 key = 0xaa repeated 80 times | |
256 key_len = 80 | |
257 data = "Test Using Larger Than Block-Size Key and Larger | |
258 Than One Block-Size Data" | |
259 data_len = 73 | |
260 digest = 0x6f630fad67cda0ee1fb1f562db3aa53e | |
261 */ | |
262 { 7, "md5", | |
263 {0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
264 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
265 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
266 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
267 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
268 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
269 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
270 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
271 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | |
272 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa}, 80, | |
273 "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 73, | |
274 {0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee, | |
275 0x1f, 0xb1, 0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e} } | |
276 }; | |
277 | |
278 unsigned long outlen; | |
279 int err; | |
280 int tested=0,failed=0; | |
281 for(i=0; i < (int)(sizeof(cases) / sizeof(cases[0])); i++) { | |
282 int hash = find_hash(cases[i].algo); | |
283 if (hash == -1) continue; | |
284 ++tested; | |
285 outlen = sizeof(digest); | |
286 if((err = hmac_memory(hash, cases[i].key, cases[i].keylen, cases[i].data, cases[i].datalen, digest, &outlen)) != CRYPT_OK) { | |
287 #if 0 | |
288 printf("HMAC-%s test #%d\n", cases[i].algo, cases[i].num); | |
289 #endif | |
290 return err; | |
291 } | |
292 | |
293 if(memcmp(digest, cases[i].digest, (size_t)hash_descriptor[hash].hashsize) != 0) { | |
294 #if 0 | |
295 unsigned int j; | |
296 printf("\nHMAC-%s test #%d:\n", cases[i].algo, cases[i].num); | |
297 printf( "Result: 0x"); | |
298 for(j=0; j < hash_descriptor[hash].hashsize; j++) { | |
299 printf("%2x ", digest[j]); | |
300 } | |
301 printf("\nCorrect: 0x"); | |
302 for(j=0; j < hash_descriptor[hash].hashsize; j++) { | |
303 printf("%2x ", cases[i].digest[j]); | |
304 } | |
305 printf("\n"); | |
306 #endif | |
307 failed++; | |
308 //return CRYPT_ERROR; | |
309 } else { | |
310 /* printf("HMAC-%s test #%d: Passed\n", cases[i].algo, cases[i].num); */ | |
311 } | |
312 } | |
313 | |
314 if (failed != 0) { | |
315 return CRYPT_FAIL_TESTVECTOR; | |
316 } else if (tested == 0) { | |
317 return CRYPT_NOP; | |
318 } else { | |
319 return CRYPT_OK; | |
320 } | |
321 #endif | |
322 } | |
323 | |
324 #endif | |
325 |