]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ntp/lib/isc/tests/hash_test.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / ntp / lib / isc / tests / hash_test.c
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
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);
92 ATF_TC_HEAD(isc_sha1, tc) {
93         atf_tc_set_md_var(tc, "descr", "sha1 examples from RFC4634");
94 }
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);
221 ATF_TC_HEAD(isc_sha224, tc) {
222         atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
223 }
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);
354 ATF_TC_HEAD(isc_sha256, tc) {
355         atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
356 }
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);
486 ATF_TC_HEAD(isc_sha384, tc) {
487         atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
488 }
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);
632 ATF_TC_HEAD(isc_sha512, tc) {
633         atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
634 }
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);
779 ATF_TC_HEAD(isc_md5, tc) {
780         atf_tc_set_md_var(tc, "descr", "md5 example from RFC1321");
781 }
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);
852 ATF_TC_HEAD(isc_hmacsha1, tc) {
853         atf_tc_set_md_var(tc, "descr", "HMAC-SHA1 examples from RFC2104");
854 }
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);
982 ATF_TC_HEAD(isc_hmacsha224, tc) {
983         atf_tc_set_md_var(tc, "descr", "HMAC-SHA224 examples from RFC4634");
984 }
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);
1145 ATF_TC_HEAD(isc_hmacsha256, tc) {
1146         atf_tc_set_md_var(tc, "descr", "HMAC-SHA256 examples from RFC4634");
1147 }
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);
1308 ATF_TC_HEAD(isc_hmacsha384, tc) {
1309         atf_tc_set_md_var(tc, "descr", "HMAC-SHA384 examples from RFC4634");
1310 }
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);
1477 ATF_TC_HEAD(isc_hmacsha512, tc) {
1478         atf_tc_set_md_var(tc, "descr", "HMAC-SHA512 examples from RFC4634");
1479 }
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);
1647 ATF_TC_HEAD(isc_hmacmd5, tc) {
1648         atf_tc_set_md_var(tc, "descr", "HMAC-MD5 examples from RFC2104");
1649 }
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  */
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