1 /*
2  * Copyright (C) 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14  * PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /* $Id$ */
18 
19 /* ! \file */
20 
21 #include <config.h>
22 
23 #include <atf-c.h>
24 
25 #include <stdio.h>
26 #include <string.h>
27 
28 #include <isc/hmacmd5.h>
29 #include <isc/hmacsha.h>
30 #include <isc/md5.h>
31 #include <isc/sha1.h>
32 #include <isc/util.h>
33 #include <isc/string.h>
34 
35 /*
36  * Test data from RFC6234
37  */
38 
39 unsigned char digest[ISC_SHA512_DIGESTLENGTH];
40 unsigned char buffer[1024];
41 const char *s;
42 char str[ISC_SHA512_DIGESTLENGTH];
43 unsigned char key[20];
44 int i = 0;
45 
46 isc_result_t
47 tohexstr(unsigned char *d, unsigned int len, char *out);
48 /*
49  * Precondition: a hexadecimal number in *d, the length of that number in len,
50  *   and a pointer to a character array to put the output (*out).
51  * Postcondition: A String representation of the given hexadecimal number is
52  *   placed into the array *out
53  *
54  * 'out' MUST point to an array of at least len / 2 + 1
55  *
56  * Return values: ISC_R_SUCCESS if the operation is sucessful
57  */
58 
59 isc_result_t
tohexstr(unsigned char * d,unsigned int len,char * out)60 tohexstr(unsigned char *d, unsigned int len, char *out) {
61 
62 	out[0]='\0';
63 	char c_ret[] = "AA";
64 	unsigned int i;
65 	strcat(out, "0x");
66 	for (i = 0; i < len; i++) {
67 		sprintf(c_ret, "%02X", d[i]);
68 		strcat(out, c_ret);
69 	}
70 	strcat(out, "\0");
71 	return (ISC_R_SUCCESS);
72 }
73 
74 
75 #define TEST_INPUT(x) (x), sizeof(x)-1
76 
77 typedef struct hash_testcase {
78 	const char *input;
79 	size_t input_len;
80 	const char *result;
81 	int repeats;
82 } hash_testcase_t;
83 
84 typedef struct hash_test_key {
85 	const char *key;
86 	const int len;
87 } hash_test_key_t;
88 
89 /* non-hmac tests */
90 
91 ATF_TC(isc_sha1);
ATF_TC_HEAD(isc_sha1,tc)92 ATF_TC_HEAD(isc_sha1, tc) {
93 	atf_tc_set_md_var(tc, "descr", "sha1 examples from RFC4634");
94 }
ATF_TC_BODY(isc_sha1,tc)95 ATF_TC_BODY(isc_sha1, tc) {
96 	isc_sha1_t sha1;
97 
98 	UNUSED(tc);
99 
100 	/*
101 	 * These are the various test vectors.  All of these are passed
102 	 * through the hash function and the results are compared to the
103 	 * result specified here.
104 	 */
105 	hash_testcase_t testcases[] = {
106 		/* Test 1 */
107 		{
108 			TEST_INPUT("abc"),
109 			"0xA9993E364706816ABA3E25717850C26C9CD0D89D",
110 			1
111 		},
112 		/* Test 2 */
113 		{
114 			TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijk"
115 				   "ljklmklmnlmnomnopnopq"),
116 			"0x84983E441C3BD26EBAAE4AA1F95129E5E54670F1",
117 			1
118 		},
119 		/* Test 3 */
120 		{
121 			TEST_INPUT("a") /* times 1000000 */,
122 			"0x34AA973CD4C4DAA4F61EEB2BDBAD27316534016F",
123 			1000000
124 		},
125 		/* Test 4 -- exact multiple of 512 bits */
126 		{
127 			TEST_INPUT("01234567012345670123456701234567"),
128 			"0xDEA356A2CDDD90C7A7ECEDC5EBB563934F460452",
129 			20 /* 20 times */
130 		},
131 #if 0
132 		/* Test 5 -- optional feature, not implemented */
133 		{
134 			TEST_INPUT(""),
135 			/* "extrabits": 0x98 , "numberextrabits": 5 */
136 			"0x29826B003B906E660EFF4027CE98AF3531AC75BA",
137 			1
138 		},
139 #endif
140 		/* Test 6 */
141 		{
142 			TEST_INPUT("\x5e"),
143 			"0x5E6F80A34A9798CAFC6A5DB96CC57BA4C4DB59C2",
144 			1
145 		},
146 #if 0
147 		/* Test 7 -- optional feature, not implemented */
148 		{
149 			TEST_INPUT("\x49\xb2\xae\xc2\x59\x4b\xbe\x3a"
150 				   "\x3b\x11\x75\x42\xd9\x4a\xc8"),
151 			/* "extrabits": 0x80, "numberextrabits": 3 */
152 		  "0x6239781E03729919C01955B3FFA8ACB60B988340", 1 },
153 #endif
154 		/* Test 8 */
155 		{
156 			TEST_INPUT("\x9a\x7d\xfd\xf1\xec\xea\xd0\x6e\xd6\x46"
157 				   "\xaa\x55\xfe\x75\x71\x46"),
158 			"0x82ABFF6605DBE1C17DEF12A394FA22A82B544A35",
159 			1
160 		},
161 #if 0
162 		/* Test 9 -- optional feature, not implemented */
163 		{
164 			TEST_INPUT("\x65\xf9\x32\x99\x5b\xa4\xce\x2c\xb1\xb4"
165 				   "\xa2\xe7\x1a\xe7\x02\x20\xaa\xce\xc8\x96"
166 				   "\x2d\xd4\x49\x9c\xbd\x7c\x88\x7a\x94\xea"
167 				   "\xaa\x10\x1e\xa5\xaa\xbc\x52\x9b\x4e\x7e"
168 				   "\x43\x66\x5a\x5a\xf2\xcd\x03\xfe\x67\x8e"
169 				   "\xa6\xa5\x00\x5b\xba\x3b\x08\x22\x04\xc2"
170 				   "\x8b\x91\x09\xf4\x69\xda\xc9\x2a\xaa\xb3"
171 				   "\xaa\x7c\x11\xa1\xb3\x2a"),
172 			/* "extrabits": 0xE0 , "numberextrabits": 3 */
173 			"0x8C5B2A5DDAE5A97FC7F9D85661C672ADBF7933D4",
174 			1
175 		},
176 #endif
177 		/* Test 10 */
178 		{
179 			TEST_INPUT("\xf7\x8f\x92\x14\x1b\xcd\x17\x0a\xe8\x9b"
180 				   "\x4f\xba\x15\xa1\xd5\x9f\x3f\xd8\x4d\x22"
181 				   "\x3c\x92\x51\xbd\xac\xbb\xae\x61\xd0\x5e"
182 				   "\xd1\x15\xa0\x6a\x7c\xe1\x17\xb7\xbe\xea"
183 				   "\xd2\x44\x21\xde\xd9\xc3\x25\x92\xbd\x57"
184 				   "\xed\xea\xe3\x9c\x39\xfa\x1f\xe8\x94\x6a"
185 				   "\x84\xd0\xcf\x1f\x7b\xee\xad\x17\x13\xe2"
186 				   "\xe0\x95\x98\x97\x34\x7f\x67\xc8\x0b\x04"
187 				   "\x00\xc2\x09\x81\x5d\x6b\x10\xa6\x83\x83"
188 				   "\x6f\xd5\x56\x2a\x56\xca\xb1\xa2\x8e\x81"
189 				   "\xb6\x57\x66\x54\x63\x1c\xf1\x65\x66\xb8"
190 				   "\x6e\x3b\x33\xa1\x08\xb0\x53\x07\xc0\x0a"
191 				   "\xff\x14\xa7\x68\xed\x73\x50\x60\x6a\x0f"
192 				   "\x85\xe6\xa9\x1d\x39\x6f\x5b\x5c\xbe\x57"
193 				   "\x7f\x9b\x38\x80\x7c\x7d\x52\x3d\x6d\x79"
194 				   "\x2f\x6e\xbc\x24\xa4\xec\xf2\xb3\xa4\x27"
195 				   "\xcd\xbb\xfb"),
196 			"0xCB0082C8F197D260991BA6A460E76E202BAD27B3",
197 			1
198 		},
199 		{ NULL, 0, NULL, 1 }
200 	};
201 
202 	hash_testcase_t *testcase = testcases;
203 
204 	while (testcase->input != NULL && testcase->result != NULL) {
205 		isc_sha1_init(&sha1);
206 		for(i = 0; i < testcase->repeats; i++) {
207 			isc_sha1_update(&sha1,
208 					(const isc_uint8_t *) testcase->input,
209 					testcase->input_len);
210 		}
211 		isc_sha1_final(&sha1, digest);
212 		tohexstr(digest, ISC_SHA1_DIGESTLENGTH, str);
213 		ATF_CHECK_STREQ(str, testcase->result);
214 
215 		testcase++;
216 	}
217 }
218 
219 
220 ATF_TC(isc_sha224);
ATF_TC_HEAD(isc_sha224,tc)221 ATF_TC_HEAD(isc_sha224, tc) {
222 	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
223 }
ATF_TC_BODY(isc_sha224,tc)224 ATF_TC_BODY(isc_sha224, tc) {
225 	isc_sha224_t sha224;
226 
227 	UNUSED(tc);
228 
229 	/*
230 	 * These are the various test vectors.  All of these are passed
231 	 * through the hash function and the results are compared to the
232 	 * result specified here.
233 	 */
234 	hash_testcase_t testcases[] = {
235 		/* Test 1 */
236 		{
237 			TEST_INPUT("abc"),
238 			"0x23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7"
239 				"E36C9DA7",
240 			1
241 		},
242 		/* Test 2 */
243 		{
244 			TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijklj"
245 				   "klmklmnlmnomnopnopq"),
246 			"0x75388B16512776CC5DBA5DA1FD890150B0C6455CB4F58B"
247 				"1952522525",
248 			1
249 		},
250 		/* Test 3 */
251 		{
252 			TEST_INPUT("a"),
253 			"0x20794655980C91D8BBB4C1EA97618A4BF03F42581948B2"
254 				"EE4EE7AD67",
255 			1000000
256 		},
257 		/* Test 4 */
258 		{
259 			TEST_INPUT("01234567012345670123456701234567"),
260 			"0x567F69F168CD7844E65259CE658FE7AADFA25216E68ECA"
261 				"0EB7AB8262",
262 			20
263 		},
264 #if 0
265 		/* Test 5 -- unimplemented optional functionality */
266 		{
267 			TEST_INPUT(""),
268 			"0xXXX",
269 			1
270 		},
271 #endif
272 		/* Test 6 */
273 		{
274 			TEST_INPUT("\x07"),
275 			"0x00ECD5F138422B8AD74C9799FD826C531BAD2FCABC7450"
276 				"BEE2AA8C2A",
277 			1
278 		},
279 #if 0
280 		/* Test 7 -- unimplemented optional functionality */
281 		{
282 			TEST_INPUT(""),
283 			"0xXXX",
284 			1
285 		},
286 #endif
287 		/* Test 8 */
288 		{
289 			TEST_INPUT("\x18\x80\x40\x05\xdd\x4f\xbd\x15\x56\x29"
290 				   "\x9d\x6f\x9d\x93\xdf\x62"),
291 			"0xDF90D78AA78821C99B40BA4C966921ACCD8FFB1E98AC38"
292 				"8E56191DB1",
293 			1
294 		},
295 #if 0
296 		/* Test 9 */
297 		{
298 			TEST_INPUT(""),
299 			"0xXXX",
300 			1
301 		},
302 #endif
303 		/* Test 10 */
304 		{
305 			TEST_INPUT("\x55\xb2\x10\x07\x9c\x61\xb5\x3a\xdd\x52"
306 				   "\x06\x22\xd1\xac\x97\xd5\xcd\xbe\x8c\xb3"
307 				   "\x3a\xa0\xae\x34\x45\x17\xbe\xe4\xd7\xba"
308 				   "\x09\xab\xc8\x53\x3c\x52\x50\x88\x7a\x43"
309 				   "\xbe\xbb\xac\x90\x6c\x2e\x18\x37\xf2\x6b"
310 				   "\x36\xa5\x9a\xe3\xbe\x78\x14\xd5\x06\x89"
311 				   "\x6b\x71\x8b\x2a\x38\x3e\xcd\xac\x16\xb9"
312 				   "\x61\x25\x55\x3f\x41\x6f\xf3\x2c\x66\x74"
313 				   "\xc7\x45\x99\xa9\x00\x53\x86\xd9\xce\x11"
314 				   "\x12\x24\x5f\x48\xee\x47\x0d\x39\x6c\x1e"
315 				   "\xd6\x3b\x92\x67\x0c\xa5\x6e\xc8\x4d\xee"
316 				   "\xa8\x14\xb6\x13\x5e\xca\x54\x39\x2b\xde"
317 				   "\xdb\x94\x89\xbc\x9b\x87\x5a\x8b\xaf\x0d"
318 				   "\xc1\xae\x78\x57\x36\x91\x4a\xb7\xda\xa2"
319 				   "\x64\xbc\x07\x9d\x26\x9f\x2c\x0d\x7e\xdd"
320 				   "\xd8\x10\xa4\x26\x14\x5a\x07\x76\xf6\x7c"
321 				   "\x87\x82\x73"),
322 			"0x0B31894EC8937AD9B91BDFBCBA294D9ADEFAA18E09305E"
323 				"9F20D5C3A4",
324 			1
325 		},
326 		{ NULL, 0, NULL, 1 }
327 	};
328 
329 	hash_testcase_t *testcase = testcases;
330 
331 	while (testcase->input != NULL && testcase->result != NULL) {
332 		isc_sha224_init(&sha224);
333 		for(i = 0; i < testcase->repeats; i++) {
334 			isc_sha224_update(&sha224,
335 					  (const isc_uint8_t *) testcase->input,
336 					  testcase->input_len);
337 		}
338 		isc_sha224_final(digest, &sha224);
339 		/*
340 		*API inconsistency BUG HERE
341 		* in order to be consistant with the other isc_hash_final
342 		* functions the call should be
343 		* isc_sha224_final(&sha224, digest);
344 		 */
345 		tohexstr(digest, ISC_SHA224_DIGESTLENGTH, str);
346 		ATF_CHECK_STREQ(str, testcase->result);
347 
348 		testcase++;
349 	}
350 
351 }
352 
353 ATF_TC(isc_sha256);
ATF_TC_HEAD(isc_sha256,tc)354 ATF_TC_HEAD(isc_sha256, tc) {
355 	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
356 }
ATF_TC_BODY(isc_sha256,tc)357 ATF_TC_BODY(isc_sha256, tc) {
358 	isc_sha256_t sha256;
359 
360 	UNUSED(tc);
361 
362 	/*
363 	 * These are the various test vectors.  All of these are passed
364 	 * through the hash function and the results are compared to the
365 	 * result specified here.
366 	 */
367 	hash_testcase_t testcases[] = {
368 		/* Test 1 */
369 		{
370 			TEST_INPUT("abc"),
371 			"0xBA7816BF8F01CFEA414140DE5DAE2223B00361A396177A"
372 				"9CB410FF61F20015AD",
373 			1
374 		},
375 		/* Test 2 */
376 		{
377 			TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijkljk"
378 				   "lmklmnlmnomnopnopq"),
379 			"0x248D6A61D20638B8E5C026930C3E6039A33CE45964FF21"
380 				"67F6ECEDD419DB06C1",
381 			1
382 		},
383 		/* Test 3 */
384 		{
385 			TEST_INPUT("a"),
386 			"0xCDC76E5C9914FB9281A1C7E284D73E67F1809A48A49720"
387 				"0E046D39CCC7112CD0",
388 			1000000 },
389 		/* Test 4 */
390 		{
391 			TEST_INPUT("01234567012345670123456701234567"),
392 			"0x594847328451BDFA85056225462CC1D867D877FB388DF0"
393 				"CE35F25AB5562BFBB5",
394 			20
395 		},
396 #if 0
397 		/* Test 5 -- unimplemented optional functionality */
398 		{
399 			TEST_INPUT(""),
400 			"0xXXX",
401 			1
402 		},
403 #endif
404 		/* Test 6 */
405 		{
406 			TEST_INPUT("\x19"),
407 			"0x68AA2E2EE5DFF96E3355E6C7EE373E3D6A4E17F75F9518"
408 				"D843709C0C9BC3E3D4",
409 			1
410 		},
411 #if 0
412 		/* Test 7 -- unimplemented optional functionality */
413 		{
414 			TEST_INPUT(""),
415 			"0xXXX",
416 			1
417 		},
418 #endif
419 		/* Test 8 */
420 		{
421 			TEST_INPUT("\xe3\xd7\x25\x70\xdc\xdd\x78\x7c\xe3"
422 				   "\x88\x7a\xb2\xcd\x68\x46\x52"),
423 			"0x175EE69B02BA9B58E2B0A5FD13819CEA573F3940A94F82"
424 				"5128CF4209BEABB4E8",
425 			1
426 		},
427 #if 0
428 		/* Test 9 -- unimplemented optional functionality */
429 		{
430 			TEST_INPUT(""),
431 			"0xXXX",
432 			1
433 		},
434 #endif
435 		/* Test 10 */
436 		{
437 			TEST_INPUT("\x83\x26\x75\x4e\x22\x77\x37\x2f\x4f\xc1"
438 				   "\x2b\x20\x52\x7a\xfe\xf0\x4d\x8a\x05\x69"
439 				   "\x71\xb1\x1a\xd5\x71\x23\xa7\xc1\x37\x76"
440 				   "\x00\x00\xd7\xbe\xf6\xf3\xc1\xf7\xa9\x08"
441 				   "\x3a\xa3\x9d\x81\x0d\xb3\x10\x77\x7d\xab"
442 				   "\x8b\x1e\x7f\x02\xb8\x4a\x26\xc7\x73\x32"
443 				   "\x5f\x8b\x23\x74\xde\x7a\x4b\x5a\x58\xcb"
444 				   "\x5c\x5c\xf3\x5b\xce\xe6\xfb\x94\x6e\x5b"
445 				   "\xd6\x94\xfa\x59\x3a\x8b\xeb\x3f\x9d\x65"
446 				   "\x92\xec\xed\xaa\x66\xca\x82\xa2\x9d\x0c"
447 				   "\x51\xbc\xf9\x33\x62\x30\xe5\xd7\x84\xe4"
448 				   "\xc0\xa4\x3f\x8d\x79\xa3\x0a\x16\x5c\xba"
449 				   "\xbe\x45\x2b\x77\x4b\x9c\x71\x09\xa9\x7d"
450 				   "\x13\x8f\x12\x92\x28\x96\x6f\x6c\x0a\xdc"
451 				   "\x10\x6a\xad\x5a\x9f\xdd\x30\x82\x57\x69"
452 				   "\xb2\xc6\x71\xaf\x67\x59\xdf\x28\xeb\x39"
453 				   "\x3d\x54\xd6"),
454 			"0x97DBCA7DF46D62C8A422C941DD7E835B8AD3361763F7E9"
455 				"B2D95F4F0DA6E1CCBC",
456 			1
457 		},
458 		{ NULL, 0, NULL, 1 }
459 	};
460 
461 	hash_testcase_t *testcase = testcases;
462 
463 	while (testcase->input != NULL && testcase->result != NULL) {
464 		isc_sha256_init(&sha256);
465 		for(i = 0; i < testcase->repeats; i++) {
466 			isc_sha256_update(&sha256,
467 					  (const isc_uint8_t *) testcase->input,
468 					  testcase->input_len);
469 		}
470 		isc_sha256_final(digest, &sha256);
471 		/*
472 		*API inconsistency BUG HERE
473 		* in order to be consistant with the other isc_hash_final
474 		* functions the call should be
475 		* isc_sha224_final(&sha224, digest);
476 		 */
477 		tohexstr(digest, ISC_SHA256_DIGESTLENGTH, str);
478 		ATF_CHECK_STREQ(str, testcase->result);
479 
480 		testcase++;
481 	}
482 
483 }
484 
485 ATF_TC(isc_sha384);
ATF_TC_HEAD(isc_sha384,tc)486 ATF_TC_HEAD(isc_sha384, tc) {
487 	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
488 }
ATF_TC_BODY(isc_sha384,tc)489 ATF_TC_BODY(isc_sha384, tc) {
490 	isc_sha384_t sha384;
491 
492 	UNUSED(tc);
493 
494 	/*
495 	 * These are the various test vectors.  All of these are passed
496 	 * through the hash function and the results are compared to the
497 	 * result specified here.
498 	 */
499 	hash_testcase_t testcases[] = {
500 		/* Test 1 */
501 		{
502 			TEST_INPUT("abc"),
503 			"0xCB00753F45A35E8BB5A03D699AC65007272C32AB0EDED1"
504 				"631A8B605A43FF5BED8086072BA1E7CC2358BAEC"
505 				"A134C825A7",
506 			1
507 		},
508 		/* Test 2 */
509 		{
510 			TEST_INPUT("abcdefghbcdefghicdefghijdefghijkefghijkl"
511 				   "fghijklmghijklmnhijklmnoijklmnopjklmnopq"
512 				   "klmnopqrlmnopqrsmnopqrstnopqrstu"),
513 			"0x09330C33F71147E83D192FC782CD1B4753111B173B3B05"
514 				"D22FA08086E3B0F712FCC7C71A557E2DB966C3E9"
515 				"FA91746039",
516 			1
517 		},
518 		/* Test 3 */
519 		{
520 			TEST_INPUT("a"),
521 			"0x9D0E1809716474CB086E834E310A4A1CED149E9C00F248"
522 				"527972CEC5704C2A5B07B8B3DC38ECC4EBAE97DD"
523 				"D87F3D8985",
524 			1000000
525 		},
526 		/* Test 4 */
527 		{
528 			TEST_INPUT("01234567012345670123456701234567"),
529 			"0x2FC64A4F500DDB6828F6A3430B8DD72A368EB7F3A8322A"
530 				"70BC84275B9C0B3AB00D27A5CC3C2D224AA6B61A"
531 				"0D79FB4596",
532 			20
533 		},
534 #if 0
535 		/* Test 5 -- unimplemented optional functionality */
536 		{
537 			TEST_INPUT(""),
538 			"0xXXX",
539 			1
540 		},
541 #endif
542 		/* Test 6 */
543 		{ TEST_INPUT("\xb9"),
544 			"0xBC8089A19007C0B14195F4ECC74094FEC64F01F9092928"
545 				"2C2FB392881578208AD466828B1C6C283D2722CF"
546 				"0AD1AB6938",
547 			1
548 		},
549 #if 0
550 		/* Test 7 -- unimplemented optional functionality */
551 		{
552 			TEST_INPUT(""),
553 			"0xXXX",
554 			1
555 		},
556 #endif
557 		/* Test 8 */
558 		{
559 			TEST_INPUT("\xa4\x1c\x49\x77\x79\xc0\x37\x5f\xf1"
560 				   "\x0a\x7f\x4e\x08\x59\x17\x39"),
561 			"0xC9A68443A005812256B8EC76B00516F0DBB74FAB26D665"
562 				"913F194B6FFB0E91EA9967566B58109CBC675CC2"
563 				"08E4C823F7",
564 			1
565 		},
566 #if 0
567 		/* Test 9 -- unimplemented optional functionality */
568 		{
569 			TEST_INPUT(""),
570 			"0xXXX",
571 			1
572 		},
573 #endif
574 		/* Test 10 */
575 		{
576 			TEST_INPUT("\x39\x96\x69\xe2\x8f\x6b\x9c\x6d\xbc\xbb"
577 				   "\x69\x12\xec\x10\xff\xcf\x74\x79\x03\x49"
578 				   "\xb7\xdc\x8f\xbe\x4a\x8e\x7b\x3b\x56\x21"
579 				   "\xdb\x0f\x3e\x7d\xc8\x7f\x82\x32\x64\xbb"
580 				   "\xe4\x0d\x18\x11\xc9\xea\x20\x61\xe1\xc8"
581 				   "\x4a\xd1\x0a\x23\xfa\xc1\x72\x7e\x72\x02"
582 				   "\xfc\x3f\x50\x42\xe6\xbf\x58\xcb\xa8\xa2"
583 				   "\x74\x6e\x1f\x64\xf9\xb9\xea\x35\x2c\x71"
584 				   "\x15\x07\x05\x3c\xf4\xe5\x33\x9d\x52\x86"
585 				   "\x5f\x25\xcc\x22\xb5\xe8\x77\x84\xa1\x2f"
586 				   "\xc9\x61\xd6\x6c\xb6\xe8\x95\x73\x19\x9a"
587 				   "\x2c\xe6\x56\x5c\xbd\xf1\x3d\xca\x40\x38"
588 				   "\x32\xcf\xcb\x0e\x8b\x72\x11\xe8\x3a\xf3"
589 				   "\x2a\x11\xac\x17\x92\x9f\xf1\xc0\x73\xa5"
590 				   "\x1c\xc0\x27\xaa\xed\xef\xf8\x5a\xad\x7c"
591 				   "\x2b\x7c\x5a\x80\x3e\x24\x04\xd9\x6d\x2a"
592 				   "\x77\x35\x7b\xda\x1a\x6d\xae\xed\x17\x15"
593 				   "\x1c\xb9\xbc\x51\x25\xa4\x22\xe9\x41\xde"
594 				   "\x0c\xa0\xfc\x50\x11\xc2\x3e\xcf\xfe\xfd"
595 				   "\xd0\x96\x76\x71\x1c\xf3\xdb\x0a\x34\x40"
596 				   "\x72\x0e\x16\x15\xc1\xf2\x2f\xbc\x3c\x72"
597 				   "\x1d\xe5\x21\xe1\xb9\x9b\xa1\xbd\x55\x77"
598 				   "\x40\x86\x42\x14\x7e\xd0\x96"),
599 			"0x4F440DB1E6EDD2899FA335F09515AA025EE177A79F4B4A"
600 				"AF38E42B5C4DE660F5DE8FB2A5B2FBD2A3CBFFD2"
601 				"0CFF1288C0",
602 			1
603 		},
604 		{ NULL, 0, NULL, 1 }
605 	};
606 
607 	hash_testcase_t *testcase = testcases;
608 
609 	while (testcase->input != NULL && testcase->result != NULL) {
610 		isc_sha384_init(&sha384);
611 		for(i = 0; i < testcase->repeats; i++) {
612 			isc_sha384_update(&sha384,
613 					  (const isc_uint8_t *) testcase->input,
614 					  testcase->input_len);
615 		}
616 		isc_sha384_final(digest, &sha384);
617 		/*
618 		*API inconsistency BUG HERE
619 		* in order to be consistant with the other isc_hash_final
620 		* functions the call should be
621 		* isc_sha224_final(&sha224, digest);
622 		 */
623 		tohexstr(digest, ISC_SHA384_DIGESTLENGTH, str);
624 		ATF_CHECK_STREQ(str, testcase->result);
625 
626 		testcase++;
627 	}
628 
629 }
630 
631 ATF_TC(isc_sha512);
ATF_TC_HEAD(isc_sha512,tc)632 ATF_TC_HEAD(isc_sha512, tc) {
633 	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
634 }
ATF_TC_BODY(isc_sha512,tc)635 ATF_TC_BODY(isc_sha512, tc) {
636 	isc_sha512_t sha512;
637 
638 	UNUSED(tc);
639 
640 	/*
641 	 * These are the various test vectors.  All of these are passed
642 	 * through the hash function and the results are compared to the
643 	 * result specified here.
644 	 */
645 	hash_testcase_t testcases[] = {
646 		/* Test 1 */
647 		{
648 			TEST_INPUT("abc"),
649 			"0xDDAF35A193617ABACC417349AE20413112E6FA4E89A97E"
650 				"A20A9EEEE64B55D39A2192992A274FC1A836BA3C"
651 				"23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F",
652 			1
653 		},
654 		/* Test 2 */
655 		{
656 			TEST_INPUT("abcdefghbcdefghicdefghijdefghijkefghijkl"
657 				   "fghijklmghijklmnhijklmnoijklmnopjklmnopq"
658 				   "klmnopqrlmnopqrsmnopqrstnopqrstu"),
659 			"0x8E959B75DAE313DA8CF4F72814FC143F8F7779C6EB9F7F"
660 				"A17299AEADB6889018501D289E4900F7E4331B99"
661 				"DEC4B5433AC7D329EEB6DD26545E96E55B874BE909",
662 			1
663 		},
664 		/* Test 3 */
665 		{
666 			TEST_INPUT("a"),
667 			"0xE718483D0CE769644E2E42C7BC15B4638E1F98B13B2044"
668 				"285632A803AFA973EBDE0FF244877EA60A4CB043"
669 				"2CE577C31BEB009C5C2C49AA2E4EADB217AD8CC09B",
670 			1000000
671 		},
672 		/* Test 4 */
673 		{
674 			TEST_INPUT("01234567012345670123456701234567"),
675 			"0x89D05BA632C699C31231DED4FFC127D5A894DAD412C0E0"
676 				"24DB872D1ABD2BA8141A0F85072A9BE1E2AA04CF"
677 				"33C765CB510813A39CD5A84C4ACAA64D3F3FB7BAE9",
678 			20
679 		},
680 #if 0
681 		/* Test 5 -- unimplemented optional functionality */
682 		{
683 			TEST_INPUT(""),
684 			"0xXXX",
685 			1
686 		},
687 #endif
688 		/* Test 6 */
689 		{
690 			TEST_INPUT("\xD0"),
691 			"0x9992202938E882E73E20F6B69E68A0A7149090423D93C8"
692 				"1BAB3F21678D4ACEEEE50E4E8CAFADA4C85A54EA"
693 				"8306826C4AD6E74CECE9631BFA8A549B4AB3FBBA15",
694 			1
695 		},
696 #if 0
697 		/* Test 7 -- unimplemented optional functionality */
698 		{
699 			TEST_INPUT(""),
700 			"0xXXX",
701 			1
702 		},
703 #endif
704 		/* Test 8 */
705 		{
706 			TEST_INPUT("\x8d\x4e\x3c\x0e\x38\x89\x19\x14\x91\x81"
707 				   "\x6e\x9d\x98\xbf\xf0\xa0"),
708 			"0xCB0B67A4B8712CD73C9AABC0B199E9269B20844AFB75AC"
709 				"BDD1C153C9828924C3DDEDAAFE669C5FDD0BC66F"
710 				"630F6773988213EB1B16F517AD0DE4B2F0C95C90F8",
711 			1
712 		},
713 #if 0
714 		/* Test 9 -- unimplemented optional functionality */
715 		{
716 			TEST_INPUT(""),
717 			"0xXXX",
718 			1
719 		},
720 #endif
721 		/* Test 10 */
722 		{
723 			TEST_INPUT("\xa5\x5f\x20\xc4\x11\xaa\xd1\x32\x80\x7a"
724 				   "\x50\x2d\x65\x82\x4e\x31\xa2\x30\x54\x32"
725 				   "\xaa\x3d\x06\xd3\xe2\x82\xa8\xd8\x4e\x0d"
726 				   "\xe1\xde\x69\x74\xbf\x49\x54\x69\xfc\x7f"
727 				   "\x33\x8f\x80\x54\xd5\x8c\x26\xc4\x93\x60"
728 				   "\xc3\xe8\x7a\xf5\x65\x23\xac\xf6\xd8\x9d"
729 				   "\x03\xe5\x6f\xf2\xf8\x68\x00\x2b\xc3\xe4"
730 				   "\x31\xed\xc4\x4d\xf2\xf0\x22\x3d\x4b\xb3"
731 				   "\xb2\x43\x58\x6e\x1a\x7d\x92\x49\x36\x69"
732 				   "\x4f\xcb\xba\xf8\x8d\x95\x19\xe4\xeb\x50"
733 				   "\xa6\x44\xf8\xe4\xf9\x5e\xb0\xea\x95\xbc"
734 				   "\x44\x65\xc8\x82\x1a\xac\xd2\xfe\x15\xab"
735 				   "\x49\x81\x16\x4b\xbb\x6d\xc3\x2f\x96\x90"
736 				   "\x87\xa1\x45\xb0\xd9\xcc\x9c\x67\xc2\x2b"
737 				   "\x76\x32\x99\x41\x9c\xc4\x12\x8b\xe9\xa0"
738 				   "\x77\xb3\xac\xe6\x34\x06\x4e\x6d\x99\x28"
739 				   "\x35\x13\xdc\x06\xe7\x51\x5d\x0d\x73\x13"
740 				   "\x2e\x9a\x0d\xc6\xd3\xb1\xf8\xb2\x46\xf1"
741 				   "\xa9\x8a\x3f\xc7\x29\x41\xb1\xe3\xbb\x20"
742 				   "\x98\xe8\xbf\x16\xf2\x68\xd6\x4f\x0b\x0f"
743 				   "\x47\x07\xfe\x1e\xa1\xa1\x79\x1b\xa2\xf3"
744 				   "\xc0\xc7\x58\xe5\xf5\x51\x86\x3a\x96\xc9"
745 				   "\x49\xad\x47\xd7\xfb\x40\xd2"),
746 		  "0xC665BEFB36DA189D78822D10528CBF3B12B3EEF7260399"
747 			  "09C1A16A270D48719377966B957A878E72058477"
748 			  "9A62825C18DA26415E49A7176A894E7510FD1451F5",
749 		  1
750 		},
751 		{ NULL, 0, NULL, 1 }
752 	};
753 
754 	hash_testcase_t *testcase = testcases;
755 
756 	while (testcase->input != NULL && testcase->result != NULL) {
757 		isc_sha512_init(&sha512);
758 		for(i = 0; i < testcase->repeats; i++) {
759 			isc_sha512_update(&sha512,
760 					  (const isc_uint8_t *) testcase->input,
761 					  testcase->input_len);
762 		}
763 		isc_sha512_final(digest, &sha512);
764 		/*
765 		*API inconsistency BUG HERE
766 		* in order to be consistant with the other isc_hash_final
767 		* functions the call should be
768 		* isc_sha224_final(&sha224, digest);
769 		 */
770 		tohexstr(digest, ISC_SHA512_DIGESTLENGTH, str);
771 		ATF_CHECK_STREQ(str, testcase->result);
772 
773 		testcase++;
774 	}
775 
776 }
777 
778 ATF_TC(isc_md5);
ATF_TC_HEAD(isc_md5,tc)779 ATF_TC_HEAD(isc_md5, tc) {
780 	atf_tc_set_md_var(tc, "descr", "md5 example from RFC1321");
781 }
ATF_TC_BODY(isc_md5,tc)782 ATF_TC_BODY(isc_md5, tc) {
783 	isc_md5_t md5;
784 
785 	UNUSED(tc);
786 
787 	/*
788 	 * These are the various test vectors.  All of these are passed
789 	 * through the hash function and the results are compared to the
790 	 * result specified here.
791 	 */
792 	hash_testcase_t testcases[] = {
793 		{
794 			TEST_INPUT(""),
795 			"0xD41D8CD98F00B204E9800998ECF8427E",
796 			1
797 		},
798 		{
799 			TEST_INPUT("a"),
800 			"0x0CC175B9C0F1B6A831C399E269772661",
801 			1
802 		},
803 		{
804 			TEST_INPUT("abc"),
805 			"0x900150983CD24FB0D6963F7D28E17F72",
806 			1
807 		},
808 		{
809 			TEST_INPUT("message digest"),
810 			"0xF96B697D7CB7938D525A2F31AAF161D0",
811 			1
812 		},
813 		{
814 			TEST_INPUT("abcdefghijklmnopqrstuvwxyz"),
815 			"0xC3FCD3D76192E4007DFB496CCA67E13B",
816 			1
817 		},
818 		{
819 			TEST_INPUT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm"
820 				   "nopqrstuvwxyz0123456789"),
821 			"0xD174AB98D277D9F5A5611C2C9F419D9F",
822 			1
823 		},
824 		{
825 			TEST_INPUT("123456789012345678901234567890123456789"
826 				   "01234567890123456789012345678901234567890"),
827 			"0x57EDF4A22BE3C955AC49DA2E2107B67A",
828 			1
829 		},
830 		{ NULL, 0, NULL, 1 }
831 	};
832 
833 	hash_testcase_t *testcase = testcases;
834 
835 	while (testcase->input != NULL && testcase->result != NULL) {
836 		isc_md5_init(&md5);
837 		for(i = 0; i < testcase->repeats; i++) {
838 			isc_md5_update(&md5,
839 				       (const isc_uint8_t *) testcase->input,
840 				       testcase->input_len);
841 		}
842 		isc_md5_final(&md5, digest);
843 		tohexstr(digest, ISC_MD5_DIGESTLENGTH, str);
844 		ATF_CHECK_STREQ(str, testcase->result);
845 
846 		testcase++;
847 	}
848 }
849 
850 /* HMAC-SHA1 test */
851 ATF_TC(isc_hmacsha1);
ATF_TC_HEAD(isc_hmacsha1,tc)852 ATF_TC_HEAD(isc_hmacsha1, tc) {
853 	atf_tc_set_md_var(tc, "descr", "HMAC-SHA1 examples from RFC2104");
854 }
ATF_TC_BODY(isc_hmacsha1,tc)855 ATF_TC_BODY(isc_hmacsha1, tc) {
856 	isc_hmacsha1_t hmacsha1;
857 
858 	UNUSED(tc);
859 	/*
860 	 * These are the various test vectors.  All of these are passed
861 	 * through the hash function and the results are compared to the
862 	 * result specified here.
863 	 */
864 	hash_testcase_t testcases[] = {
865 		/* Test 1 */
866 		{
867 			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
868 			"0xB617318655057264E28BC0B6FB378C8EF146BE00",
869 			1
870 		},
871 		/* Test 2 */
872 		{
873 			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
874 				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
875 				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
876 			"0xEFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79",
877 			1
878 		},
879 		/* Test 3 */
880 		{
881 			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
882 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
883 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
884 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
885 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
886 			"0x125D7342B9AC11CD91A39AF48AA17B4F63F175D3",
887 			1
888 		},
889 		/* Test 4 */
890 		{
891 			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
892 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
893 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
894 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
895 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
896 			"0x4C9007F4026250C6BC8414F9BF50C86C2D7235DA",
897 			1
898 		},
899 #if 0
900 		/* Test 5 -- unimplemented optional functionality */
901 		{
902 			TEST_INPUT("Test With Truncation"),
903 			"0x4C1A03424B55E07FE7F27BE1",
904 			1
905 		},
906 #endif
907 		/* Test 6 */
908 		{
909 			TEST_INPUT("Test Using Larger Than Block-Size Key - "
910 				   "Hash Key First"),
911 			"0xAA4AE5E15272D00E95705637CE8A3B55ED402112", 1 },
912 		/* Test 7 */
913 		{
914 			TEST_INPUT("Test Using Larger Than Block-Size Key and "
915 				   "Larger Than One Block-Size Data"),
916 			"0xE8E99D0F45237D786D6BBAA7965C7808BBFF1A91",
917 			1
918 		},
919 		{ NULL, 0, NULL, 1 }
920 	};
921 
922 	hash_testcase_t *testcase = testcases;
923 
924 	hash_test_key_t test_keys[] = {
925 		/* Key 1 */
926 		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
927 		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
928 		/* Key 2 */
929 		{ "Jefe", 4 },
930 		/* Key 3 */
931 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
932 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
933 		/* Key 4 */
934 		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
935 		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
936 		  "\x15\x16\x17\x18\x19", 25 },
937 #if 0
938 		/* Key 5 */
939 		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
940 		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
941 #endif
942 		/* Key 6 */
943 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
944 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
945 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
946 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
947 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
948 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
949 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
950 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 80 },
951 		/* Key 7 */
952 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
953 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
954 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
955 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
956 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
957 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
958 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
959 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 80 },
960 		{ "", 0 }
961 	};
962 
963 	hash_test_key_t *test_key = test_keys;
964 
965 	while (testcase->input != NULL && testcase->result != NULL) {
966 		memcpy(buffer, test_key->key, test_key->len);
967 		isc_hmacsha1_init(&hmacsha1, buffer, test_key->len);
968 		isc_hmacsha1_update(&hmacsha1,
969 				    (const isc_uint8_t *) testcase->input,
970 				    testcase->input_len);
971 		isc_hmacsha1_sign(&hmacsha1, digest, ISC_SHA1_DIGESTLENGTH);
972 		tohexstr(digest, ISC_SHA1_DIGESTLENGTH, str);
973 		ATF_CHECK_STREQ(str, testcase->result);
974 
975 		testcase++;
976 		test_key++;
977 	}
978 }
979 
980 /* HMAC-SHA224 test */
981 ATF_TC(isc_hmacsha224);
ATF_TC_HEAD(isc_hmacsha224,tc)982 ATF_TC_HEAD(isc_hmacsha224, tc) {
983 	atf_tc_set_md_var(tc, "descr", "HMAC-SHA224 examples from RFC4634");
984 }
ATF_TC_BODY(isc_hmacsha224,tc)985 ATF_TC_BODY(isc_hmacsha224, tc) {
986 	isc_hmacsha224_t hmacsha224;
987 
988 	UNUSED(tc);
989 
990 	/*
991 	 * These are the various test vectors.  All of these are passed
992 	 * through the hash function and the results are compared to the
993 	 * result specified here.
994 	 */
995 	hash_testcase_t testcases[] = {
996 		/* Test 1 */
997 		{
998 			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
999 			"0x896FB1128ABBDF196832107CD49DF33F47B4B1169912BA"
1000 				"4F53684B22",
1001 			1
1002 		},
1003 		/* Test 2 */
1004 		{
1005 			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1006 				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1007 				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1008 			"0xA30E01098BC6DBBF45690F3A7E9E6D0F8BBEA2A39E61480"
1009 				"08FD05E44",
1010 			1
1011 		},
1012 		/* Test 3 */
1013 		{
1014 			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1015 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1016 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1017 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1018 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1019 			"0x7FB3CB3588C6C1F6FFA9694D7D6AD2649365B0C1F65D69"
1020 				"D1EC8333EA",
1021 			1
1022 		},
1023 		/* Test 4 */
1024 		{
1025 			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1026 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1027 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1028 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1029 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1030 			"0x6C11506874013CAC6A2ABC1BB382627CEC6A90D86EFC01"
1031 				"2DE7AFEC5A",
1032 			1
1033 		},
1034 #if 0
1035 		/* Test 5 -- unimplemented optional functionality */
1036 		{
1037 			TEST_INPUT("Test With Truncation"),
1038 			"0x4C1A03424B55E07FE7F27BE1",
1039 			1
1040 		},
1041 #endif
1042 		/* Test 6 */
1043 		{
1044 			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1045 				   "Hash Key First"),
1046 			"0x95E9A0DB962095ADAEBE9B2D6F0DBCE2D499F112F2D2B7"
1047 				"273FA6870E",
1048 			1
1049 		},
1050 		/* Test 7 */
1051 		{
1052 			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1053 				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1054 				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1055 				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1056 				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1057 				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1058 				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1059 				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1060 				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1061 				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1062 				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1063 				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1064 				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1065 				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1066 				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1067 				   "\x6d\x2e"),
1068 			"0x3A854166AC5D9F023F54D517D0B39DBD946770DB9C2B95"
1069 				"C9F6F565D1",
1070 			1
1071 		},
1072 		{ NULL, 0, NULL, 1 }
1073 	};
1074 
1075 	hash_testcase_t *testcase = testcases;
1076 
1077 	hash_test_key_t test_keys[] = {
1078 		/* Key 1 */
1079 		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1080 		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1081 		/* Key 2 */
1082 		{ "Jefe", 4 },
1083 		/* Key 3 */
1084 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1085 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1086 		/* Key 4 */
1087 		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1088 		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1089 		  "\x15\x16\x17\x18\x19", 25 },
1090 #if 0
1091 		/* Key 5 */
1092 		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1093 		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1094 #endif
1095 		/* Key 6 */
1096 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1097 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1098 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1099 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1100 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1101 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1102 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1103 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1104 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1105 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1106 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1107 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1108 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1109 		/* Key 7 */
1110 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1111 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1112 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1113 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1114 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1115 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1116 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1117 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1118 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1119 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1120 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1121 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1122 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1123 		{ "", 0 }
1124 	};
1125 
1126 	hash_test_key_t *test_key = test_keys;
1127 
1128 	while (testcase->input != NULL && testcase->result != NULL) {
1129 		memcpy(buffer, test_key->key, test_key->len);
1130 		isc_hmacsha224_init(&hmacsha224, buffer, test_key->len);
1131 		isc_hmacsha224_update(&hmacsha224,
1132 				      (const isc_uint8_t *) testcase->input,
1133 				      testcase->input_len);
1134 		isc_hmacsha224_sign(&hmacsha224, digest, ISC_SHA224_DIGESTLENGTH);
1135 		tohexstr(digest, ISC_SHA224_DIGESTLENGTH, str);
1136 		ATF_CHECK_STREQ(str, testcase->result);
1137 
1138 		testcase++;
1139 		test_key++;
1140 	}
1141 }
1142 
1143 /* HMAC-SHA256 test */
1144 ATF_TC(isc_hmacsha256);
ATF_TC_HEAD(isc_hmacsha256,tc)1145 ATF_TC_HEAD(isc_hmacsha256, tc) {
1146 	atf_tc_set_md_var(tc, "descr", "HMAC-SHA256 examples from RFC4634");
1147 }
ATF_TC_BODY(isc_hmacsha256,tc)1148 ATF_TC_BODY(isc_hmacsha256, tc) {
1149 	isc_hmacsha256_t hmacsha256;
1150 
1151 	UNUSED(tc);
1152 
1153 	/*
1154 	 * These are the various test vectors.  All of these are passed
1155 	 * through the hash function and the results are compared to the
1156 	 * result specified here.
1157 	 */
1158 	hash_testcase_t testcases[] = {
1159 		/* Test 1 */
1160 		{
1161 			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1162 			"0xB0344C61D8DB38535CA8AFCEAF0BF12B881DC200C9833D"
1163 				"A726E9376C2E32CFF7",
1164 			1
1165 		},
1166 		/* Test 2 */
1167 		{
1168 			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1169 				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1170 				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1171 			"0x5BDCC146BF60754E6A042426089575C75A003F089D2739"
1172 				"839DEC58B964EC3843",
1173 			1
1174 		},
1175 		/* Test 3 */
1176 		{
1177 			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1178 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1179 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1180 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1181 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1182 			"0x773EA91E36800E46854DB8EBD09181A72959098B3EF8C1"
1183 				"22D9635514CED565FE",
1184 			1
1185 		},
1186 		/* Test 4 */
1187 		{
1188 			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1189 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1190 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1191 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1192 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1193 			"0x82558A389A443C0EA4CC819899F2083A85F0FAA3E578F8"
1194 				"077A2E3FF46729665B",
1195 			1
1196 		},
1197 #if 0
1198 		/* Test 5 -- unimplemented optional functionality */
1199 		{
1200 			TEST_INPUT("Test With Truncation"),
1201 			"0x4C1A03424B55E07FE7F27BE1",
1202 			1
1203 		},
1204 #endif
1205 		/* Test 6 */
1206 		{
1207 			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1208 				   "Hash Key First"),
1209 			"0x60E431591EE0B67F0D8A26AACBF5B77F8E0BC6213728C5"
1210 				"140546040F0EE37F54",
1211 			1
1212 		},
1213 		/* Test 7 */
1214 		{
1215 			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1216 				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1217 				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1218 				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1219 				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1220 				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1221 				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1222 				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1223 				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1224 				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1225 				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1226 				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1227 				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1228 				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1229 				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1230 				   "\x6d\x2e"),
1231 			"0x9B09FFA71B942FCB27635FBCD5B0E944BFDC63644F0713"
1232 				"938A7F51535C3A35E2",
1233 			1
1234 		},
1235 		{ NULL, 0, NULL, 1 }
1236 	};
1237 
1238 	hash_testcase_t *testcase = testcases;
1239 
1240 	hash_test_key_t test_keys[] = {
1241 		/* Key 1 */
1242 		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1243 		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1244 		/* Key 2 */
1245 		{ "Jefe", 4 },
1246 		/* Key 3 */
1247 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1248 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1249 		/* Key 4 */
1250 		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1251 		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1252 		  "\x15\x16\x17\x18\x19", 25 },
1253 #if 0
1254 		/* Key 5 */
1255 		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1256 		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1257 #endif
1258 		/* Key 6 */
1259 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1260 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1261 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1262 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1263 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1264 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1265 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1266 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1267 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1268 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1269 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1270 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1271 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1272 		/* Key 7 */
1273 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1274 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1275 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1276 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1277 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1278 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1279 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1280 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1281 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1282 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1283 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1284 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1285 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1286 		{ "", 0 }
1287 	};
1288 
1289 	hash_test_key_t *test_key = test_keys;
1290 
1291 	while (testcase->input != NULL && testcase->result != NULL) {
1292 		memcpy(buffer, test_key->key, test_key->len);
1293 		isc_hmacsha256_init(&hmacsha256, buffer, test_key->len);
1294 		isc_hmacsha256_update(&hmacsha256,
1295 				      (const isc_uint8_t *) testcase->input,
1296 				      testcase->input_len);
1297 		isc_hmacsha256_sign(&hmacsha256, digest, ISC_SHA256_DIGESTLENGTH);
1298 		tohexstr(digest, ISC_SHA256_DIGESTLENGTH, str);
1299 		ATF_CHECK_STREQ(str, testcase->result);
1300 
1301 		testcase++;
1302 		test_key++;
1303 	}
1304 }
1305 
1306 /* HMAC-SHA384 test */
1307 ATF_TC(isc_hmacsha384);
ATF_TC_HEAD(isc_hmacsha384,tc)1308 ATF_TC_HEAD(isc_hmacsha384, tc) {
1309 	atf_tc_set_md_var(tc, "descr", "HMAC-SHA384 examples from RFC4634");
1310 }
ATF_TC_BODY(isc_hmacsha384,tc)1311 ATF_TC_BODY(isc_hmacsha384, tc) {
1312 	isc_hmacsha384_t hmacsha384;
1313 
1314 	UNUSED(tc);
1315 
1316 	/*
1317 	 * These are the various test vectors.  All of these are passed
1318 	 * through the hash function and the results are compared to the
1319 	 * result specified here.
1320 	 */
1321 	hash_testcase_t testcases[] = {
1322 		/* Test 1 */
1323 		{
1324 			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1325 			"0xAFD03944D84895626B0825F4AB46907F15F9DADBE4101E"
1326 				"C682AA034C7CEBC59CFAEA9EA9076EDE7F4AF152"
1327 				"E8B2FA9CB6",
1328 			1
1329 		},
1330 		/* Test 2 */
1331 		{
1332 			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1333 				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1334 				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1335 			"0xAF45D2E376484031617F78D2B58A6B1B9C7EF464F5A01B"
1336 				"47E42EC3736322445E8E2240CA5E69E2C78B3239"
1337 				"ECFAB21649",
1338 			1
1339 		},
1340 		/* Test 3 */
1341 		{
1342 			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1343 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1344 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1345 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1346 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1347 			"0x88062608D3E6AD8A0AA2ACE014C8A86F0AA635D947AC9F"
1348 				"EBE83EF4E55966144B2A5AB39DC13814B94E3AB6"
1349 				"E101A34F27",
1350 			1
1351 		},
1352 		/* Test 4 */
1353 		{
1354 			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1355 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1356 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1357 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1358 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1359 			"0x3E8A69B7783C25851933AB6290AF6CA77A998148085000"
1360 				"9CC5577C6E1F573B4E6801DD23C4A7D679CCF8A3"
1361 				"86C674CFFB",
1362 			1
1363 		},
1364 #if 0
1365 		/* Test 5 -- unimplemented optional functionality */
1366 		{
1367 			TEST_INPUT("Test With Truncation"),
1368 			"0x4C1A03424B55E07FE7F27BE1",
1369 			1
1370 		},
1371 #endif
1372 		/* Test 6 */
1373 		{
1374 			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1375 				   "Hash Key First"),
1376 			"0x4ECE084485813E9088D2C63A041BC5B44F9EF1012A2B58"
1377 				"8F3CD11F05033AC4C60C2EF6AB4030FE8296248D"
1378 				"F163F44952",
1379 			1
1380 		},
1381 		/* Test 7 */
1382 		{
1383 			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1384 				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1385 				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1386 				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1387 				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1388 				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1389 				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1390 				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1391 				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1392 				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1393 				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1394 				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1395 				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1396 				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1397 				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1398 				   "\x6d\x2e"),
1399 			"0x6617178E941F020D351E2F254E8FD32C602420FEB0B8FB"
1400 				"9ADCCEBB82461E99C5A678CC31E799176D3860E6"
1401 				"110C46523E",
1402 			1
1403 		},
1404 		{ NULL, 0, NULL, 1 }
1405 	};
1406 
1407 	hash_testcase_t *testcase = testcases;
1408 
1409 	hash_test_key_t test_keys[] = {
1410 		/* Key 1 */
1411 		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1412 		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1413 		/* Key 2 */
1414 		{ "Jefe", 4 },
1415 		/* Key 3 */
1416 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1417 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1418 		/* Key 4 */
1419 		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1420 		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1421 		  "\x15\x16\x17\x18\x19", 25 },
1422 #if 0
1423 		/* Key 5 */
1424 		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1425 		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1426 #endif
1427 		/* Key 6 */
1428 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1429 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1430 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1431 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1432 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1433 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1434 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1435 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1436 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1437 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1438 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1439 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1440 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1441 		/* Key 7 */
1442 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1443 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1444 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1445 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1446 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1447 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1448 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1449 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1450 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1451 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1452 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1453 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1454 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1455 		{ "", 0 }
1456 	};
1457 
1458 	hash_test_key_t *test_key = test_keys;
1459 
1460 	while (testcase->input != NULL && testcase->result != NULL) {
1461 		memcpy(buffer, test_key->key, test_key->len);
1462 		isc_hmacsha384_init(&hmacsha384, buffer, test_key->len);
1463 		isc_hmacsha384_update(&hmacsha384,
1464 				      (const isc_uint8_t *) testcase->input,
1465 				      testcase->input_len);
1466 		isc_hmacsha384_sign(&hmacsha384, digest, ISC_SHA384_DIGESTLENGTH);
1467 		tohexstr(digest, ISC_SHA384_DIGESTLENGTH, str);
1468 		ATF_CHECK_STREQ(str, testcase->result);
1469 
1470 		testcase++;
1471 		test_key++;
1472 	}
1473 }
1474 
1475 /* HMAC-SHA512 test */
1476 ATF_TC(isc_hmacsha512);
ATF_TC_HEAD(isc_hmacsha512,tc)1477 ATF_TC_HEAD(isc_hmacsha512, tc) {
1478 	atf_tc_set_md_var(tc, "descr", "HMAC-SHA512 examples from RFC4634");
1479 }
ATF_TC_BODY(isc_hmacsha512,tc)1480 ATF_TC_BODY(isc_hmacsha512, tc) {
1481 	isc_hmacsha512_t hmacsha512;
1482 
1483 	UNUSED(tc);
1484 
1485 	/*
1486 	 * These are the various test vectors.  All of these are passed
1487 	 * through the hash function and the results are compared to the
1488 	 * result specified here.
1489 	 */
1490 	hash_testcase_t testcases[] = {
1491 		/* Test 1 */
1492 		{
1493 			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1494 			"0x87AA7CDEA5EF619D4FF0B4241A1D6CB02379F4E2CE4EC2"
1495 				"787AD0B30545E17CDEDAA833B7D6B8A702038B27"
1496 				"4EAEA3F4E4BE9D914EEB61F1702E696C203A126854",
1497 			1
1498 		},
1499 		/* Test 2 */
1500 		{
1501 			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1502 				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1503 				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1504 			"0x164B7A7BFCF819E2E395FBE73B56E0A387BD64222E831F"
1505 				"D610270CD7EA2505549758BF75C05A994A6D034F"
1506 				"65F8F0E6FDCAEAB1A34D4A6B4B636E070A38BCE737",
1507 			1
1508 		},
1509 		/* Test 3 */
1510 		{
1511 			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1512 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1513 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1514 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1515 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1516 			"0xFA73B0089D56A284EFB0F0756C890BE9B1B5DBDD8EE81A"
1517 				"3655F83E33B2279D39BF3E848279A722C806B485"
1518 				"A47E67C807B946A337BEE8942674278859E13292FB",
1519 			1
1520 		},
1521 		/* Test 4 */
1522 		{
1523 			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1524 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1525 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1526 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1527 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1528 			"0xB0BA465637458C6990E5A8C5F61D4AF7E576D97FF94B87"
1529 				"2DE76F8050361EE3DBA91CA5C11AA25EB4D67927"
1530 				"5CC5788063A5F19741120C4F2DE2ADEBEB10A298DD",
1531 			1
1532 		},
1533 #if 0
1534 		/* Test 5 -- unimplemented optional functionality */
1535 		{
1536 			TEST_INPUT("Test With Truncation"),
1537 			"0x4C1A03424B55E07FE7F27BE1",
1538 			1
1539 		},
1540 #endif
1541 		/* Test 6 */
1542 		{
1543 			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1544 				   "Hash Key First"),
1545 			"0x80B24263C7C1A3EBB71493C1DD7BE8B49B46D1F41B4AEE"
1546 				"C1121B013783F8F3526B56D037E05F2598BD0FD2"
1547 				"215D6A1E5295E64F73F63F0AEC8B915A985D786598",
1548 			1
1549 		},
1550 		/* Test 7 */
1551 		{
1552 			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1553 				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1554 				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1555 				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1556 				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1557 				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1558 				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1559 				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1560 				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1561 				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1562 				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1563 				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1564 				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1565 				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1566 				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1567 				   "\x6d\x2e"),
1568 			"0xE37B6A775DC87DBAA4DFA9F96E5E3FFDDEBD71F8867289"
1569 				"865DF5A32D20CDC944B6022CAC3C4982B10D5EEB"
1570 				"55C3E4DE15134676FB6DE0446065C97440FA8C6A58",
1571 			1
1572 		},
1573 		{ NULL, 0, NULL, 1 }
1574 	};
1575 
1576 	hash_testcase_t *testcase = testcases;
1577 
1578 	hash_test_key_t test_keys[] = {
1579 		/* Key 1 */
1580 		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1581 		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1582 		/* Key 2 */
1583 		{ "Jefe", 4 },
1584 		/* Key 3 */
1585 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1586 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1587 		/* Key 4 */
1588 		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1589 		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1590 		  "\x15\x16\x17\x18\x19", 25 },
1591 #if 0
1592 		/* Key 5 */
1593 		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1594 		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1595 #endif
1596 		/* Key 6 */
1597 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1598 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1599 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1600 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1601 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1602 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1603 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1604 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1605 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1606 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1607 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1608 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1609 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1610 		/* Key 7 */
1611 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1612 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1613 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1614 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1615 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1616 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1617 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1618 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1619 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1620 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1621 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1622 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1623 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1624 		{ "", 0 }
1625 	};
1626 
1627 	hash_test_key_t *test_key = test_keys;
1628 
1629 	while (testcase->input != NULL && testcase->result != NULL) {
1630 		memcpy(buffer, test_key->key, test_key->len);
1631 		isc_hmacsha512_init(&hmacsha512, buffer, test_key->len);
1632 		isc_hmacsha512_update(&hmacsha512,
1633 				      (const isc_uint8_t *) testcase->input,
1634 				      testcase->input_len);
1635 		isc_hmacsha512_sign(&hmacsha512, digest, ISC_SHA512_DIGESTLENGTH);
1636 		tohexstr(digest, ISC_SHA512_DIGESTLENGTH, str);
1637 		ATF_CHECK_STREQ(str, testcase->result);
1638 
1639 		testcase++;
1640 		test_key++;
1641 	}
1642 }
1643 
1644 
1645 /* HMAC-MD5 Test */
1646 ATF_TC(isc_hmacmd5);
ATF_TC_HEAD(isc_hmacmd5,tc)1647 ATF_TC_HEAD(isc_hmacmd5, tc) {
1648 	atf_tc_set_md_var(tc, "descr", "HMAC-MD5 examples from RFC2104");
1649 }
ATF_TC_BODY(isc_hmacmd5,tc)1650 ATF_TC_BODY(isc_hmacmd5, tc) {
1651 	isc_hmacmd5_t hmacmd5;
1652 
1653 	UNUSED(tc);
1654 
1655 	/*
1656 	 * These are the various test vectors.  All of these are passed
1657 	 * through the hash function and the results are compared to the
1658 	 * result specified here.
1659 	 */
1660 	hash_testcase_t testcases[] = {
1661 		/* Test 1 */
1662 		{
1663 			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1664 			"0x9294727A3638BB1C13F48EF8158BFC9D",
1665 			1
1666 		},
1667 		/* Test 2 */
1668 		{
1669 			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79"
1670 				   "\x61\x20\x77\x61\x6e\x74\x20\x66\x6f"
1671 				   "\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1672 			"0x750C783E6AB0B503EAA86E310A5DB738", 1
1673 		},
1674 		/* Test 3 */
1675 		{
1676 			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1677 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1678 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1679 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1680 				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1681 			"0x56BE34521D144C88DBB8C733F0E8B3F6",
1682 			1
1683 		},
1684 		/* Test 4 */
1685 		{
1686 			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1687 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1688 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1689 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1690 				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1691 			"0x697EAF0ACA3A3AEA3A75164746FFAA79",
1692 			1
1693 		},
1694 #if 0
1695 		/* Test 5 -- unimplemented optional functionality */
1696 		{
1697 			TEST_INPUT("Test With Truncation"),
1698 			"0x4C1A03424B55E07FE7F27BE1",
1699 			1
1700 		},
1701 		/* Test 6 -- unimplemented optional functionality */
1702 		{
1703 			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1704 				   "Hash Key First"),
1705 			"0xAA4AE5E15272D00E95705637CE8A3B55ED402112",
1706 			1
1707 		 },
1708 		/* Test 7 -- unimplemented optional functionality */
1709 		{
1710 			TEST_INPUT("Test Using Larger Than Block-Size Key and "
1711 				   "Larger Than One Block-Size Data"),
1712 			"0xE8E99D0F45237D786D6BBAA7965C7808BBFF1A91",
1713 			1
1714 		},
1715 #endif
1716 		{ NULL, 0, NULL, 1 }
1717 	};
1718 
1719 	hash_testcase_t *testcase = testcases;
1720 
1721 	hash_test_key_t test_keys[] = {
1722 		/* Key 1 */
1723 		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1724 		  "\x0b\x0b\x0b\x0b\x0b\x0b", 16 },
1725 		/* Key 2 */
1726 		{ "Jefe", 4 },
1727 		/* Key 3 */
1728 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1729 		  "\xaa\xaa\xaa\xaa\xaa\xaa", 16 },
1730 		/* Key 4 */
1731 		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1732 		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1733 		  "\x15\x16\x17\x18\x19", 25 },
1734 #if 0
1735 		/* Key 5 */
1736 		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1737 		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1738 		/* Key 6 */
1739 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1740 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1741 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1742 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1743 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1744 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1745 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1746 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1747 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1748 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1749 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1750 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1751 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1752 		/* Key 7 */
1753 		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1754 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1755 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1756 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1757 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1758 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1759 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1760 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1761 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1762 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1763 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1764 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1765 		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1766 #endif
1767 		{ "", 0 }
1768 	};
1769 
1770 	hash_test_key_t *test_key = test_keys;
1771 
1772 	while (testcase->input != NULL && testcase->result != NULL) {
1773 		memcpy(buffer, test_key->key, test_key->len);
1774 		isc_hmacmd5_init(&hmacmd5, buffer, test_key->len);
1775 		isc_hmacmd5_update(&hmacmd5,
1776 				   (const isc_uint8_t *) testcase->input,
1777 				   testcase->input_len);
1778 		isc_hmacmd5_sign(&hmacmd5, digest);
1779 		tohexstr(digest, ISC_MD5_DIGESTLENGTH, str);
1780 		ATF_CHECK_STREQ(str, testcase->result);
1781 
1782 		testcase++;
1783 		test_key++;
1784 	}
1785 }
1786 
1787 /*
1788  * Main
1789  */
ATF_TP_ADD_TCS(tp)1790 ATF_TP_ADD_TCS(tp) {
1791 	ATF_TP_ADD_TC(tp, isc_hmacmd5);
1792 	ATF_TP_ADD_TC(tp, isc_hmacsha1);
1793 	ATF_TP_ADD_TC(tp, isc_hmacsha224);
1794 	ATF_TP_ADD_TC(tp, isc_hmacsha256);
1795 	ATF_TP_ADD_TC(tp, isc_hmacsha384);
1796 	ATF_TP_ADD_TC(tp, isc_hmacsha512);
1797 	ATF_TP_ADD_TC(tp, isc_md5);
1798 	ATF_TP_ADD_TC(tp, isc_sha1);
1799 	ATF_TP_ADD_TC(tp, isc_sha224);
1800 	ATF_TP_ADD_TC(tp, isc_sha256);
1801 	ATF_TP_ADD_TC(tp, isc_sha384);
1802 	ATF_TP_ADD_TC(tp, isc_sha512);
1803 	return (atf_no_error());
1804 }
1805 
1806