comparison src/mac/hmac/hmac_test.c @ 191:1c15b283127b libtomcrypt-orig

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