1275970Scy/*
2275970Scy * Copyright (C) 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
3275970Scy *
4275970Scy * Permission to use, copy, modify, and/or distribute this software for any
5275970Scy * purpose with or without fee is hereby granted, provided that the above
6275970Scy * copyright notice and this permission notice appear in all copies.
7275970Scy *
8275970Scy * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9275970Scy * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10275970Scy * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11275970Scy * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12275970Scy * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13275970Scy * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14275970Scy * PERFORMANCE OF THIS SOFTWARE.
15275970Scy */
16275970Scy
17275970Scy/* $Id$ */
18275970Scy
19275970Scy/* ! \file */
20275970Scy
21275970Scy#include <config.h>
22275970Scy
23275970Scy#include <atf-c.h>
24275970Scy
25275970Scy#include <stdio.h>
26275970Scy#include <string.h>
27275970Scy
28275970Scy#include <isc/hmacmd5.h>
29275970Scy#include <isc/hmacsha.h>
30275970Scy#include <isc/md5.h>
31275970Scy#include <isc/sha1.h>
32275970Scy#include <isc/util.h>
33275970Scy#include <isc/string.h>
34275970Scy
35275970Scy/*
36275970Scy * Test data from RFC6234
37275970Scy */
38275970Scy
39275970Scyunsigned char digest[ISC_SHA512_DIGESTLENGTH];
40275970Scyunsigned char buffer[1024];
41275970Scyconst char *s;
42275970Scychar str[ISC_SHA512_DIGESTLENGTH];
43275970Scyunsigned char key[20];
44275970Scyint i = 0;
45275970Scy
46275970Scyisc_result_t
47275970Scytohexstr(unsigned char *d, unsigned int len, char *out);
48275970Scy/*
49275970Scy * Precondition: a hexadecimal number in *d, the length of that number in len,
50275970Scy *   and a pointer to a character array to put the output (*out).
51275970Scy * Postcondition: A String representation of the given hexadecimal number is
52275970Scy *   placed into the array *out
53275970Scy *
54275970Scy * 'out' MUST point to an array of at least len / 2 + 1
55275970Scy *
56275970Scy * Return values: ISC_R_SUCCESS if the operation is sucessful
57275970Scy */
58275970Scy
59275970Scyisc_result_t
60275970Scytohexstr(unsigned char *d, unsigned int len, char *out) {
61275970Scy
62275970Scy	out[0]='\0';
63275970Scy	char c_ret[] = "AA";
64275970Scy	unsigned int i;
65275970Scy	strcat(out, "0x");
66275970Scy	for (i = 0; i < len; i++) {
67275970Scy		sprintf(c_ret, "%02X", d[i]);
68275970Scy		strcat(out, c_ret);
69275970Scy	}
70275970Scy	strcat(out, "\0");
71275970Scy	return (ISC_R_SUCCESS);
72275970Scy}
73275970Scy
74275970Scy
75275970Scy#define TEST_INPUT(x) (x), sizeof(x)-1
76275970Scy
77275970Scytypedef struct hash_testcase {
78275970Scy	const char *input;
79275970Scy	size_t input_len;
80275970Scy	const char *result;
81275970Scy	int repeats;
82275970Scy} hash_testcase_t;
83275970Scy
84275970Scytypedef struct hash_test_key {
85275970Scy	const char *key;
86275970Scy	const int len;
87275970Scy} hash_test_key_t;
88275970Scy
89275970Scy/* non-hmac tests */
90275970Scy
91275970ScyATF_TC(isc_sha1);
92275970ScyATF_TC_HEAD(isc_sha1, tc) {
93275970Scy	atf_tc_set_md_var(tc, "descr", "sha1 examples from RFC4634");
94275970Scy}
95275970ScyATF_TC_BODY(isc_sha1, tc) {
96275970Scy	isc_sha1_t sha1;
97275970Scy
98275970Scy	UNUSED(tc);
99275970Scy
100275970Scy	/*
101275970Scy	 * These are the various test vectors.  All of these are passed
102275970Scy	 * through the hash function and the results are compared to the
103275970Scy	 * result specified here.
104275970Scy	 */
105275970Scy	hash_testcase_t testcases[] = {
106275970Scy		/* Test 1 */
107275970Scy		{
108275970Scy			TEST_INPUT("abc"),
109275970Scy			"0xA9993E364706816ABA3E25717850C26C9CD0D89D",
110275970Scy			1
111275970Scy		},
112275970Scy		/* Test 2 */
113275970Scy		{
114275970Scy			TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijk"
115275970Scy				   "ljklmklmnlmnomnopnopq"),
116275970Scy			"0x84983E441C3BD26EBAAE4AA1F95129E5E54670F1",
117275970Scy			1
118275970Scy		},
119275970Scy		/* Test 3 */
120275970Scy		{
121275970Scy			TEST_INPUT("a") /* times 1000000 */,
122275970Scy			"0x34AA973CD4C4DAA4F61EEB2BDBAD27316534016F",
123275970Scy			1000000
124275970Scy		},
125275970Scy		/* Test 4 -- exact multiple of 512 bits */
126275970Scy		{
127275970Scy			TEST_INPUT("01234567012345670123456701234567"),
128275970Scy			"0xDEA356A2CDDD90C7A7ECEDC5EBB563934F460452",
129275970Scy			20 /* 20 times */
130275970Scy		},
131275970Scy#if 0
132275970Scy		/* Test 5 -- optional feature, not implemented */
133275970Scy		{
134275970Scy			TEST_INPUT(""),
135275970Scy			/* "extrabits": 0x98 , "numberextrabits": 5 */
136275970Scy			"0x29826B003B906E660EFF4027CE98AF3531AC75BA",
137275970Scy			1
138275970Scy		},
139275970Scy#endif
140275970Scy		/* Test 6 */
141275970Scy		{
142275970Scy			TEST_INPUT("\x5e"),
143275970Scy			"0x5E6F80A34A9798CAFC6A5DB96CC57BA4C4DB59C2",
144275970Scy			1
145275970Scy		},
146275970Scy#if 0
147275970Scy		/* Test 7 -- optional feature, not implemented */
148275970Scy		{
149275970Scy			TEST_INPUT("\x49\xb2\xae\xc2\x59\x4b\xbe\x3a"
150275970Scy				   "\x3b\x11\x75\x42\xd9\x4a\xc8"),
151275970Scy			/* "extrabits": 0x80, "numberextrabits": 3 */
152275970Scy		  "0x6239781E03729919C01955B3FFA8ACB60B988340", 1 },
153275970Scy#endif
154275970Scy		/* Test 8 */
155275970Scy		{
156275970Scy			TEST_INPUT("\x9a\x7d\xfd\xf1\xec\xea\xd0\x6e\xd6\x46"
157275970Scy				   "\xaa\x55\xfe\x75\x71\x46"),
158275970Scy			"0x82ABFF6605DBE1C17DEF12A394FA22A82B544A35",
159275970Scy			1
160275970Scy		},
161275970Scy#if 0
162275970Scy		/* Test 9 -- optional feature, not implemented */
163275970Scy		{
164275970Scy			TEST_INPUT("\x65\xf9\x32\x99\x5b\xa4\xce\x2c\xb1\xb4"
165275970Scy				   "\xa2\xe7\x1a\xe7\x02\x20\xaa\xce\xc8\x96"
166275970Scy				   "\x2d\xd4\x49\x9c\xbd\x7c\x88\x7a\x94\xea"
167275970Scy				   "\xaa\x10\x1e\xa5\xaa\xbc\x52\x9b\x4e\x7e"
168275970Scy				   "\x43\x66\x5a\x5a\xf2\xcd\x03\xfe\x67\x8e"
169275970Scy				   "\xa6\xa5\x00\x5b\xba\x3b\x08\x22\x04\xc2"
170275970Scy				   "\x8b\x91\x09\xf4\x69\xda\xc9\x2a\xaa\xb3"
171275970Scy				   "\xaa\x7c\x11\xa1\xb3\x2a"),
172275970Scy			/* "extrabits": 0xE0 , "numberextrabits": 3 */
173275970Scy			"0x8C5B2A5DDAE5A97FC7F9D85661C672ADBF7933D4",
174275970Scy			1
175275970Scy		},
176275970Scy#endif
177275970Scy		/* Test 10 */
178275970Scy		{
179275970Scy			TEST_INPUT("\xf7\x8f\x92\x14\x1b\xcd\x17\x0a\xe8\x9b"
180275970Scy				   "\x4f\xba\x15\xa1\xd5\x9f\x3f\xd8\x4d\x22"
181275970Scy				   "\x3c\x92\x51\xbd\xac\xbb\xae\x61\xd0\x5e"
182275970Scy				   "\xd1\x15\xa0\x6a\x7c\xe1\x17\xb7\xbe\xea"
183275970Scy				   "\xd2\x44\x21\xde\xd9\xc3\x25\x92\xbd\x57"
184275970Scy				   "\xed\xea\xe3\x9c\x39\xfa\x1f\xe8\x94\x6a"
185275970Scy				   "\x84\xd0\xcf\x1f\x7b\xee\xad\x17\x13\xe2"
186275970Scy				   "\xe0\x95\x98\x97\x34\x7f\x67\xc8\x0b\x04"
187275970Scy				   "\x00\xc2\x09\x81\x5d\x6b\x10\xa6\x83\x83"
188275970Scy				   "\x6f\xd5\x56\x2a\x56\xca\xb1\xa2\x8e\x81"
189275970Scy				   "\xb6\x57\x66\x54\x63\x1c\xf1\x65\x66\xb8"
190275970Scy				   "\x6e\x3b\x33\xa1\x08\xb0\x53\x07\xc0\x0a"
191275970Scy				   "\xff\x14\xa7\x68\xed\x73\x50\x60\x6a\x0f"
192275970Scy				   "\x85\xe6\xa9\x1d\x39\x6f\x5b\x5c\xbe\x57"
193275970Scy				   "\x7f\x9b\x38\x80\x7c\x7d\x52\x3d\x6d\x79"
194275970Scy				   "\x2f\x6e\xbc\x24\xa4\xec\xf2\xb3\xa4\x27"
195275970Scy				   "\xcd\xbb\xfb"),
196275970Scy			"0xCB0082C8F197D260991BA6A460E76E202BAD27B3",
197275970Scy			1
198275970Scy		},
199275970Scy		{ NULL, 0, NULL, 1 }
200275970Scy	};
201275970Scy
202275970Scy	hash_testcase_t *testcase = testcases;
203275970Scy
204275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
205275970Scy		isc_sha1_init(&sha1);
206275970Scy		for(i = 0; i < testcase->repeats; i++) {
207275970Scy			isc_sha1_update(&sha1,
208275970Scy					(const isc_uint8_t *) testcase->input,
209275970Scy					testcase->input_len);
210275970Scy		}
211275970Scy		isc_sha1_final(&sha1, digest);
212275970Scy		tohexstr(digest, ISC_SHA1_DIGESTLENGTH, str);
213275970Scy		ATF_CHECK_STREQ(str, testcase->result);
214275970Scy
215275970Scy		testcase++;
216275970Scy	}
217275970Scy}
218275970Scy
219275970Scy
220275970ScyATF_TC(isc_sha224);
221275970ScyATF_TC_HEAD(isc_sha224, tc) {
222275970Scy	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
223275970Scy}
224275970ScyATF_TC_BODY(isc_sha224, tc) {
225275970Scy	isc_sha224_t sha224;
226275970Scy
227275970Scy	UNUSED(tc);
228275970Scy
229275970Scy	/*
230275970Scy	 * These are the various test vectors.  All of these are passed
231275970Scy	 * through the hash function and the results are compared to the
232275970Scy	 * result specified here.
233275970Scy	 */
234275970Scy	hash_testcase_t testcases[] = {
235275970Scy		/* Test 1 */
236275970Scy		{
237275970Scy			TEST_INPUT("abc"),
238275970Scy			"0x23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7"
239275970Scy				"E36C9DA7",
240275970Scy			1
241275970Scy		},
242275970Scy		/* Test 2 */
243275970Scy		{
244275970Scy			TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijklj"
245275970Scy				   "klmklmnlmnomnopnopq"),
246275970Scy			"0x75388B16512776CC5DBA5DA1FD890150B0C6455CB4F58B"
247275970Scy				"1952522525",
248275970Scy			1
249275970Scy		},
250275970Scy		/* Test 3 */
251275970Scy		{
252275970Scy			TEST_INPUT("a"),
253275970Scy			"0x20794655980C91D8BBB4C1EA97618A4BF03F42581948B2"
254275970Scy				"EE4EE7AD67",
255275970Scy			1000000
256275970Scy		},
257275970Scy		/* Test 4 */
258275970Scy		{
259275970Scy			TEST_INPUT("01234567012345670123456701234567"),
260275970Scy			"0x567F69F168CD7844E65259CE658FE7AADFA25216E68ECA"
261275970Scy				"0EB7AB8262",
262275970Scy			20
263275970Scy		},
264275970Scy#if 0
265275970Scy		/* Test 5 -- unimplemented optional functionality */
266275970Scy		{
267275970Scy			TEST_INPUT(""),
268275970Scy			"0xXXX",
269275970Scy			1
270275970Scy		},
271275970Scy#endif
272275970Scy		/* Test 6 */
273275970Scy		{
274275970Scy			TEST_INPUT("\x07"),
275275970Scy			"0x00ECD5F138422B8AD74C9799FD826C531BAD2FCABC7450"
276275970Scy				"BEE2AA8C2A",
277275970Scy			1
278275970Scy		},
279275970Scy#if 0
280275970Scy		/* Test 7 -- unimplemented optional functionality */
281275970Scy		{
282275970Scy			TEST_INPUT(""),
283275970Scy			"0xXXX",
284275970Scy			1
285275970Scy		},
286275970Scy#endif
287275970Scy		/* Test 8 */
288275970Scy		{
289275970Scy			TEST_INPUT("\x18\x80\x40\x05\xdd\x4f\xbd\x15\x56\x29"
290275970Scy				   "\x9d\x6f\x9d\x93\xdf\x62"),
291275970Scy			"0xDF90D78AA78821C99B40BA4C966921ACCD8FFB1E98AC38"
292275970Scy				"8E56191DB1",
293275970Scy			1
294275970Scy		},
295275970Scy#if 0
296275970Scy		/* Test 9 */
297275970Scy		{
298275970Scy			TEST_INPUT(""),
299275970Scy			"0xXXX",
300275970Scy			1
301275970Scy		},
302275970Scy#endif
303275970Scy		/* Test 10 */
304275970Scy		{
305275970Scy			TEST_INPUT("\x55\xb2\x10\x07\x9c\x61\xb5\x3a\xdd\x52"
306275970Scy				   "\x06\x22\xd1\xac\x97\xd5\xcd\xbe\x8c\xb3"
307275970Scy				   "\x3a\xa0\xae\x34\x45\x17\xbe\xe4\xd7\xba"
308275970Scy				   "\x09\xab\xc8\x53\x3c\x52\x50\x88\x7a\x43"
309275970Scy				   "\xbe\xbb\xac\x90\x6c\x2e\x18\x37\xf2\x6b"
310275970Scy				   "\x36\xa5\x9a\xe3\xbe\x78\x14\xd5\x06\x89"
311275970Scy				   "\x6b\x71\x8b\x2a\x38\x3e\xcd\xac\x16\xb9"
312275970Scy				   "\x61\x25\x55\x3f\x41\x6f\xf3\x2c\x66\x74"
313275970Scy				   "\xc7\x45\x99\xa9\x00\x53\x86\xd9\xce\x11"
314275970Scy				   "\x12\x24\x5f\x48\xee\x47\x0d\x39\x6c\x1e"
315275970Scy				   "\xd6\x3b\x92\x67\x0c\xa5\x6e\xc8\x4d\xee"
316275970Scy				   "\xa8\x14\xb6\x13\x5e\xca\x54\x39\x2b\xde"
317275970Scy				   "\xdb\x94\x89\xbc\x9b\x87\x5a\x8b\xaf\x0d"
318275970Scy				   "\xc1\xae\x78\x57\x36\x91\x4a\xb7\xda\xa2"
319275970Scy				   "\x64\xbc\x07\x9d\x26\x9f\x2c\x0d\x7e\xdd"
320275970Scy				   "\xd8\x10\xa4\x26\x14\x5a\x07\x76\xf6\x7c"
321275970Scy				   "\x87\x82\x73"),
322275970Scy			"0x0B31894EC8937AD9B91BDFBCBA294D9ADEFAA18E09305E"
323275970Scy				"9F20D5C3A4",
324275970Scy			1
325275970Scy		},
326275970Scy		{ NULL, 0, NULL, 1 }
327275970Scy	};
328275970Scy
329275970Scy	hash_testcase_t *testcase = testcases;
330275970Scy
331275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
332275970Scy		isc_sha224_init(&sha224);
333275970Scy		for(i = 0; i < testcase->repeats; i++) {
334275970Scy			isc_sha224_update(&sha224,
335275970Scy					  (const isc_uint8_t *) testcase->input,
336275970Scy					  testcase->input_len);
337275970Scy		}
338275970Scy		isc_sha224_final(digest, &sha224);
339275970Scy		/*
340275970Scy		*API inconsistency BUG HERE
341275970Scy		* in order to be consistant with the other isc_hash_final
342275970Scy		* functions the call should be
343275970Scy		* isc_sha224_final(&sha224, digest);
344275970Scy		 */
345275970Scy		tohexstr(digest, ISC_SHA224_DIGESTLENGTH, str);
346275970Scy		ATF_CHECK_STREQ(str, testcase->result);
347275970Scy
348275970Scy		testcase++;
349275970Scy	}
350275970Scy
351275970Scy}
352275970Scy
353275970ScyATF_TC(isc_sha256);
354275970ScyATF_TC_HEAD(isc_sha256, tc) {
355275970Scy	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
356275970Scy}
357275970ScyATF_TC_BODY(isc_sha256, tc) {
358275970Scy	isc_sha256_t sha256;
359275970Scy
360275970Scy	UNUSED(tc);
361275970Scy
362275970Scy	/*
363275970Scy	 * These are the various test vectors.  All of these are passed
364275970Scy	 * through the hash function and the results are compared to the
365275970Scy	 * result specified here.
366275970Scy	 */
367275970Scy	hash_testcase_t testcases[] = {
368275970Scy		/* Test 1 */
369275970Scy		{
370275970Scy			TEST_INPUT("abc"),
371275970Scy			"0xBA7816BF8F01CFEA414140DE5DAE2223B00361A396177A"
372275970Scy				"9CB410FF61F20015AD",
373275970Scy			1
374275970Scy		},
375275970Scy		/* Test 2 */
376275970Scy		{
377275970Scy			TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijkljk"
378275970Scy				   "lmklmnlmnomnopnopq"),
379275970Scy			"0x248D6A61D20638B8E5C026930C3E6039A33CE45964FF21"
380275970Scy				"67F6ECEDD419DB06C1",
381275970Scy			1
382275970Scy		},
383275970Scy		/* Test 3 */
384275970Scy		{
385275970Scy			TEST_INPUT("a"),
386275970Scy			"0xCDC76E5C9914FB9281A1C7E284D73E67F1809A48A49720"
387275970Scy				"0E046D39CCC7112CD0",
388275970Scy			1000000 },
389275970Scy		/* Test 4 */
390275970Scy		{
391275970Scy			TEST_INPUT("01234567012345670123456701234567"),
392275970Scy			"0x594847328451BDFA85056225462CC1D867D877FB388DF0"
393275970Scy				"CE35F25AB5562BFBB5",
394275970Scy			20
395275970Scy		},
396275970Scy#if 0
397275970Scy		/* Test 5 -- unimplemented optional functionality */
398275970Scy		{
399275970Scy			TEST_INPUT(""),
400275970Scy			"0xXXX",
401275970Scy			1
402275970Scy		},
403275970Scy#endif
404275970Scy		/* Test 6 */
405275970Scy		{
406275970Scy			TEST_INPUT("\x19"),
407275970Scy			"0x68AA2E2EE5DFF96E3355E6C7EE373E3D6A4E17F75F9518"
408275970Scy				"D843709C0C9BC3E3D4",
409275970Scy			1
410275970Scy		},
411275970Scy#if 0
412275970Scy		/* Test 7 -- unimplemented optional functionality */
413275970Scy		{
414275970Scy			TEST_INPUT(""),
415275970Scy			"0xXXX",
416275970Scy			1
417275970Scy		},
418275970Scy#endif
419275970Scy		/* Test 8 */
420275970Scy		{
421275970Scy			TEST_INPUT("\xe3\xd7\x25\x70\xdc\xdd\x78\x7c\xe3"
422275970Scy				   "\x88\x7a\xb2\xcd\x68\x46\x52"),
423275970Scy			"0x175EE69B02BA9B58E2B0A5FD13819CEA573F3940A94F82"
424275970Scy				"5128CF4209BEABB4E8",
425275970Scy			1
426275970Scy		},
427275970Scy#if 0
428275970Scy		/* Test 9 -- unimplemented optional functionality */
429275970Scy		{
430275970Scy			TEST_INPUT(""),
431275970Scy			"0xXXX",
432275970Scy			1
433275970Scy		},
434275970Scy#endif
435275970Scy		/* Test 10 */
436275970Scy		{
437275970Scy			TEST_INPUT("\x83\x26\x75\x4e\x22\x77\x37\x2f\x4f\xc1"
438275970Scy				   "\x2b\x20\x52\x7a\xfe\xf0\x4d\x8a\x05\x69"
439275970Scy				   "\x71\xb1\x1a\xd5\x71\x23\xa7\xc1\x37\x76"
440275970Scy				   "\x00\x00\xd7\xbe\xf6\xf3\xc1\xf7\xa9\x08"
441275970Scy				   "\x3a\xa3\x9d\x81\x0d\xb3\x10\x77\x7d\xab"
442275970Scy				   "\x8b\x1e\x7f\x02\xb8\x4a\x26\xc7\x73\x32"
443275970Scy				   "\x5f\x8b\x23\x74\xde\x7a\x4b\x5a\x58\xcb"
444275970Scy				   "\x5c\x5c\xf3\x5b\xce\xe6\xfb\x94\x6e\x5b"
445275970Scy				   "\xd6\x94\xfa\x59\x3a\x8b\xeb\x3f\x9d\x65"
446275970Scy				   "\x92\xec\xed\xaa\x66\xca\x82\xa2\x9d\x0c"
447275970Scy				   "\x51\xbc\xf9\x33\x62\x30\xe5\xd7\x84\xe4"
448275970Scy				   "\xc0\xa4\x3f\x8d\x79\xa3\x0a\x16\x5c\xba"
449275970Scy				   "\xbe\x45\x2b\x77\x4b\x9c\x71\x09\xa9\x7d"
450275970Scy				   "\x13\x8f\x12\x92\x28\x96\x6f\x6c\x0a\xdc"
451275970Scy				   "\x10\x6a\xad\x5a\x9f\xdd\x30\x82\x57\x69"
452275970Scy				   "\xb2\xc6\x71\xaf\x67\x59\xdf\x28\xeb\x39"
453275970Scy				   "\x3d\x54\xd6"),
454275970Scy			"0x97DBCA7DF46D62C8A422C941DD7E835B8AD3361763F7E9"
455275970Scy				"B2D95F4F0DA6E1CCBC",
456275970Scy			1
457275970Scy		},
458275970Scy		{ NULL, 0, NULL, 1 }
459275970Scy	};
460275970Scy
461275970Scy	hash_testcase_t *testcase = testcases;
462275970Scy
463275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
464275970Scy		isc_sha256_init(&sha256);
465275970Scy		for(i = 0; i < testcase->repeats; i++) {
466275970Scy			isc_sha256_update(&sha256,
467275970Scy					  (const isc_uint8_t *) testcase->input,
468275970Scy					  testcase->input_len);
469275970Scy		}
470275970Scy		isc_sha256_final(digest, &sha256);
471275970Scy		/*
472275970Scy		*API inconsistency BUG HERE
473275970Scy		* in order to be consistant with the other isc_hash_final
474275970Scy		* functions the call should be
475275970Scy		* isc_sha224_final(&sha224, digest);
476275970Scy		 */
477275970Scy		tohexstr(digest, ISC_SHA256_DIGESTLENGTH, str);
478275970Scy		ATF_CHECK_STREQ(str, testcase->result);
479275970Scy
480275970Scy		testcase++;
481275970Scy	}
482275970Scy
483275970Scy}
484275970Scy
485275970ScyATF_TC(isc_sha384);
486275970ScyATF_TC_HEAD(isc_sha384, tc) {
487275970Scy	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
488275970Scy}
489275970ScyATF_TC_BODY(isc_sha384, tc) {
490275970Scy	isc_sha384_t sha384;
491275970Scy
492275970Scy	UNUSED(tc);
493275970Scy
494275970Scy	/*
495275970Scy	 * These are the various test vectors.  All of these are passed
496275970Scy	 * through the hash function and the results are compared to the
497275970Scy	 * result specified here.
498275970Scy	 */
499275970Scy	hash_testcase_t testcases[] = {
500275970Scy		/* Test 1 */
501275970Scy		{
502275970Scy			TEST_INPUT("abc"),
503275970Scy			"0xCB00753F45A35E8BB5A03D699AC65007272C32AB0EDED1"
504275970Scy				"631A8B605A43FF5BED8086072BA1E7CC2358BAEC"
505275970Scy				"A134C825A7",
506275970Scy			1
507275970Scy		},
508275970Scy		/* Test 2 */
509275970Scy		{
510275970Scy			TEST_INPUT("abcdefghbcdefghicdefghijdefghijkefghijkl"
511275970Scy				   "fghijklmghijklmnhijklmnoijklmnopjklmnopq"
512275970Scy				   "klmnopqrlmnopqrsmnopqrstnopqrstu"),
513275970Scy			"0x09330C33F71147E83D192FC782CD1B4753111B173B3B05"
514275970Scy				"D22FA08086E3B0F712FCC7C71A557E2DB966C3E9"
515275970Scy				"FA91746039",
516275970Scy			1
517275970Scy		},
518275970Scy		/* Test 3 */
519275970Scy		{
520275970Scy			TEST_INPUT("a"),
521275970Scy			"0x9D0E1809716474CB086E834E310A4A1CED149E9C00F248"
522275970Scy				"527972CEC5704C2A5B07B8B3DC38ECC4EBAE97DD"
523275970Scy				"D87F3D8985",
524275970Scy			1000000
525275970Scy		},
526275970Scy		/* Test 4 */
527275970Scy		{
528275970Scy			TEST_INPUT("01234567012345670123456701234567"),
529275970Scy			"0x2FC64A4F500DDB6828F6A3430B8DD72A368EB7F3A8322A"
530275970Scy				"70BC84275B9C0B3AB00D27A5CC3C2D224AA6B61A"
531275970Scy				"0D79FB4596",
532275970Scy			20
533275970Scy		},
534275970Scy#if 0
535275970Scy		/* Test 5 -- unimplemented optional functionality */
536275970Scy		{
537275970Scy			TEST_INPUT(""),
538275970Scy			"0xXXX",
539275970Scy			1
540275970Scy		},
541275970Scy#endif
542275970Scy		/* Test 6 */
543275970Scy		{ TEST_INPUT("\xb9"),
544275970Scy			"0xBC8089A19007C0B14195F4ECC74094FEC64F01F9092928"
545275970Scy				"2C2FB392881578208AD466828B1C6C283D2722CF"
546275970Scy				"0AD1AB6938",
547275970Scy			1
548275970Scy		},
549275970Scy#if 0
550275970Scy		/* Test 7 -- unimplemented optional functionality */
551275970Scy		{
552275970Scy			TEST_INPUT(""),
553275970Scy			"0xXXX",
554275970Scy			1
555275970Scy		},
556275970Scy#endif
557275970Scy		/* Test 8 */
558275970Scy		{
559275970Scy			TEST_INPUT("\xa4\x1c\x49\x77\x79\xc0\x37\x5f\xf1"
560275970Scy				   "\x0a\x7f\x4e\x08\x59\x17\x39"),
561275970Scy			"0xC9A68443A005812256B8EC76B00516F0DBB74FAB26D665"
562275970Scy				"913F194B6FFB0E91EA9967566B58109CBC675CC2"
563275970Scy				"08E4C823F7",
564275970Scy			1
565275970Scy		},
566275970Scy#if 0
567275970Scy		/* Test 9 -- unimplemented optional functionality */
568275970Scy		{
569275970Scy			TEST_INPUT(""),
570275970Scy			"0xXXX",
571275970Scy			1
572275970Scy		},
573275970Scy#endif
574275970Scy		/* Test 10 */
575275970Scy		{
576275970Scy			TEST_INPUT("\x39\x96\x69\xe2\x8f\x6b\x9c\x6d\xbc\xbb"
577275970Scy				   "\x69\x12\xec\x10\xff\xcf\x74\x79\x03\x49"
578275970Scy				   "\xb7\xdc\x8f\xbe\x4a\x8e\x7b\x3b\x56\x21"
579275970Scy				   "\xdb\x0f\x3e\x7d\xc8\x7f\x82\x32\x64\xbb"
580275970Scy				   "\xe4\x0d\x18\x11\xc9\xea\x20\x61\xe1\xc8"
581275970Scy				   "\x4a\xd1\x0a\x23\xfa\xc1\x72\x7e\x72\x02"
582275970Scy				   "\xfc\x3f\x50\x42\xe6\xbf\x58\xcb\xa8\xa2"
583275970Scy				   "\x74\x6e\x1f\x64\xf9\xb9\xea\x35\x2c\x71"
584275970Scy				   "\x15\x07\x05\x3c\xf4\xe5\x33\x9d\x52\x86"
585275970Scy				   "\x5f\x25\xcc\x22\xb5\xe8\x77\x84\xa1\x2f"
586275970Scy				   "\xc9\x61\xd6\x6c\xb6\xe8\x95\x73\x19\x9a"
587275970Scy				   "\x2c\xe6\x56\x5c\xbd\xf1\x3d\xca\x40\x38"
588275970Scy				   "\x32\xcf\xcb\x0e\x8b\x72\x11\xe8\x3a\xf3"
589275970Scy				   "\x2a\x11\xac\x17\x92\x9f\xf1\xc0\x73\xa5"
590275970Scy				   "\x1c\xc0\x27\xaa\xed\xef\xf8\x5a\xad\x7c"
591275970Scy				   "\x2b\x7c\x5a\x80\x3e\x24\x04\xd9\x6d\x2a"
592275970Scy				   "\x77\x35\x7b\xda\x1a\x6d\xae\xed\x17\x15"
593275970Scy				   "\x1c\xb9\xbc\x51\x25\xa4\x22\xe9\x41\xde"
594275970Scy				   "\x0c\xa0\xfc\x50\x11\xc2\x3e\xcf\xfe\xfd"
595275970Scy				   "\xd0\x96\x76\x71\x1c\xf3\xdb\x0a\x34\x40"
596275970Scy				   "\x72\x0e\x16\x15\xc1\xf2\x2f\xbc\x3c\x72"
597275970Scy				   "\x1d\xe5\x21\xe1\xb9\x9b\xa1\xbd\x55\x77"
598275970Scy				   "\x40\x86\x42\x14\x7e\xd0\x96"),
599275970Scy			"0x4F440DB1E6EDD2899FA335F09515AA025EE177A79F4B4A"
600275970Scy				"AF38E42B5C4DE660F5DE8FB2A5B2FBD2A3CBFFD2"
601275970Scy				"0CFF1288C0",
602275970Scy			1
603275970Scy		},
604275970Scy		{ NULL, 0, NULL, 1 }
605275970Scy	};
606275970Scy
607275970Scy	hash_testcase_t *testcase = testcases;
608275970Scy
609275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
610275970Scy		isc_sha384_init(&sha384);
611275970Scy		for(i = 0; i < testcase->repeats; i++) {
612275970Scy			isc_sha384_update(&sha384,
613275970Scy					  (const isc_uint8_t *) testcase->input,
614275970Scy					  testcase->input_len);
615275970Scy		}
616275970Scy		isc_sha384_final(digest, &sha384);
617275970Scy		/*
618275970Scy		*API inconsistency BUG HERE
619275970Scy		* in order to be consistant with the other isc_hash_final
620275970Scy		* functions the call should be
621275970Scy		* isc_sha224_final(&sha224, digest);
622275970Scy		 */
623275970Scy		tohexstr(digest, ISC_SHA384_DIGESTLENGTH, str);
624275970Scy		ATF_CHECK_STREQ(str, testcase->result);
625275970Scy
626275970Scy		testcase++;
627275970Scy	}
628275970Scy
629275970Scy}
630275970Scy
631275970ScyATF_TC(isc_sha512);
632275970ScyATF_TC_HEAD(isc_sha512, tc) {
633275970Scy	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
634275970Scy}
635275970ScyATF_TC_BODY(isc_sha512, tc) {
636275970Scy	isc_sha512_t sha512;
637275970Scy
638275970Scy	UNUSED(tc);
639275970Scy
640275970Scy	/*
641275970Scy	 * These are the various test vectors.  All of these are passed
642275970Scy	 * through the hash function and the results are compared to the
643275970Scy	 * result specified here.
644275970Scy	 */
645275970Scy	hash_testcase_t testcases[] = {
646275970Scy		/* Test 1 */
647275970Scy		{
648275970Scy			TEST_INPUT("abc"),
649275970Scy			"0xDDAF35A193617ABACC417349AE20413112E6FA4E89A97E"
650275970Scy				"A20A9EEEE64B55D39A2192992A274FC1A836BA3C"
651275970Scy				"23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F",
652275970Scy			1
653275970Scy		},
654275970Scy		/* Test 2 */
655275970Scy		{
656275970Scy			TEST_INPUT("abcdefghbcdefghicdefghijdefghijkefghijkl"
657275970Scy				   "fghijklmghijklmnhijklmnoijklmnopjklmnopq"
658275970Scy				   "klmnopqrlmnopqrsmnopqrstnopqrstu"),
659275970Scy			"0x8E959B75DAE313DA8CF4F72814FC143F8F7779C6EB9F7F"
660275970Scy				"A17299AEADB6889018501D289E4900F7E4331B99"
661275970Scy				"DEC4B5433AC7D329EEB6DD26545E96E55B874BE909",
662275970Scy			1
663275970Scy		},
664275970Scy		/* Test 3 */
665275970Scy		{
666275970Scy			TEST_INPUT("a"),
667275970Scy			"0xE718483D0CE769644E2E42C7BC15B4638E1F98B13B2044"
668275970Scy				"285632A803AFA973EBDE0FF244877EA60A4CB043"
669275970Scy				"2CE577C31BEB009C5C2C49AA2E4EADB217AD8CC09B",
670275970Scy			1000000
671275970Scy		},
672275970Scy		/* Test 4 */
673275970Scy		{
674275970Scy			TEST_INPUT("01234567012345670123456701234567"),
675275970Scy			"0x89D05BA632C699C31231DED4FFC127D5A894DAD412C0E0"
676275970Scy				"24DB872D1ABD2BA8141A0F85072A9BE1E2AA04CF"
677275970Scy				"33C765CB510813A39CD5A84C4ACAA64D3F3FB7BAE9",
678275970Scy			20
679275970Scy		},
680275970Scy#if 0
681275970Scy		/* Test 5 -- unimplemented optional functionality */
682275970Scy		{
683275970Scy			TEST_INPUT(""),
684275970Scy			"0xXXX",
685275970Scy			1
686275970Scy		},
687275970Scy#endif
688275970Scy		/* Test 6 */
689275970Scy		{
690275970Scy			TEST_INPUT("\xD0"),
691275970Scy			"0x9992202938E882E73E20F6B69E68A0A7149090423D93C8"
692275970Scy				"1BAB3F21678D4ACEEEE50E4E8CAFADA4C85A54EA"
693275970Scy				"8306826C4AD6E74CECE9631BFA8A549B4AB3FBBA15",
694275970Scy			1
695275970Scy		},
696275970Scy#if 0
697275970Scy		/* Test 7 -- unimplemented optional functionality */
698275970Scy		{
699275970Scy			TEST_INPUT(""),
700275970Scy			"0xXXX",
701275970Scy			1
702275970Scy		},
703275970Scy#endif
704275970Scy		/* Test 8 */
705275970Scy		{
706275970Scy			TEST_INPUT("\x8d\x4e\x3c\x0e\x38\x89\x19\x14\x91\x81"
707275970Scy				   "\x6e\x9d\x98\xbf\xf0\xa0"),
708275970Scy			"0xCB0B67A4B8712CD73C9AABC0B199E9269B20844AFB75AC"
709275970Scy				"BDD1C153C9828924C3DDEDAAFE669C5FDD0BC66F"
710275970Scy				"630F6773988213EB1B16F517AD0DE4B2F0C95C90F8",
711275970Scy			1
712275970Scy		},
713275970Scy#if 0
714275970Scy		/* Test 9 -- unimplemented optional functionality */
715275970Scy		{
716275970Scy			TEST_INPUT(""),
717275970Scy			"0xXXX",
718275970Scy			1
719275970Scy		},
720275970Scy#endif
721275970Scy		/* Test 10 */
722275970Scy		{
723275970Scy			TEST_INPUT("\xa5\x5f\x20\xc4\x11\xaa\xd1\x32\x80\x7a"
724275970Scy				   "\x50\x2d\x65\x82\x4e\x31\xa2\x30\x54\x32"
725275970Scy				   "\xaa\x3d\x06\xd3\xe2\x82\xa8\xd8\x4e\x0d"
726275970Scy				   "\xe1\xde\x69\x74\xbf\x49\x54\x69\xfc\x7f"
727275970Scy				   "\x33\x8f\x80\x54\xd5\x8c\x26\xc4\x93\x60"
728275970Scy				   "\xc3\xe8\x7a\xf5\x65\x23\xac\xf6\xd8\x9d"
729275970Scy				   "\x03\xe5\x6f\xf2\xf8\x68\x00\x2b\xc3\xe4"
730275970Scy				   "\x31\xed\xc4\x4d\xf2\xf0\x22\x3d\x4b\xb3"
731275970Scy				   "\xb2\x43\x58\x6e\x1a\x7d\x92\x49\x36\x69"
732275970Scy				   "\x4f\xcb\xba\xf8\x8d\x95\x19\xe4\xeb\x50"
733275970Scy				   "\xa6\x44\xf8\xe4\xf9\x5e\xb0\xea\x95\xbc"
734275970Scy				   "\x44\x65\xc8\x82\x1a\xac\xd2\xfe\x15\xab"
735275970Scy				   "\x49\x81\x16\x4b\xbb\x6d\xc3\x2f\x96\x90"
736275970Scy				   "\x87\xa1\x45\xb0\xd9\xcc\x9c\x67\xc2\x2b"
737275970Scy				   "\x76\x32\x99\x41\x9c\xc4\x12\x8b\xe9\xa0"
738275970Scy				   "\x77\xb3\xac\xe6\x34\x06\x4e\x6d\x99\x28"
739275970Scy				   "\x35\x13\xdc\x06\xe7\x51\x5d\x0d\x73\x13"
740275970Scy				   "\x2e\x9a\x0d\xc6\xd3\xb1\xf8\xb2\x46\xf1"
741275970Scy				   "\xa9\x8a\x3f\xc7\x29\x41\xb1\xe3\xbb\x20"
742275970Scy				   "\x98\xe8\xbf\x16\xf2\x68\xd6\x4f\x0b\x0f"
743275970Scy				   "\x47\x07\xfe\x1e\xa1\xa1\x79\x1b\xa2\xf3"
744275970Scy				   "\xc0\xc7\x58\xe5\xf5\x51\x86\x3a\x96\xc9"
745275970Scy				   "\x49\xad\x47\xd7\xfb\x40\xd2"),
746275970Scy		  "0xC665BEFB36DA189D78822D10528CBF3B12B3EEF7260399"
747275970Scy			  "09C1A16A270D48719377966B957A878E72058477"
748275970Scy			  "9A62825C18DA26415E49A7176A894E7510FD1451F5",
749275970Scy		  1
750275970Scy		},
751275970Scy		{ NULL, 0, NULL, 1 }
752275970Scy	};
753275970Scy
754275970Scy	hash_testcase_t *testcase = testcases;
755275970Scy
756275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
757275970Scy		isc_sha512_init(&sha512);
758275970Scy		for(i = 0; i < testcase->repeats; i++) {
759275970Scy			isc_sha512_update(&sha512,
760275970Scy					  (const isc_uint8_t *) testcase->input,
761275970Scy					  testcase->input_len);
762275970Scy		}
763275970Scy		isc_sha512_final(digest, &sha512);
764275970Scy		/*
765275970Scy		*API inconsistency BUG HERE
766275970Scy		* in order to be consistant with the other isc_hash_final
767275970Scy		* functions the call should be
768275970Scy		* isc_sha224_final(&sha224, digest);
769275970Scy		 */
770275970Scy		tohexstr(digest, ISC_SHA512_DIGESTLENGTH, str);
771275970Scy		ATF_CHECK_STREQ(str, testcase->result);
772275970Scy
773275970Scy		testcase++;
774275970Scy	}
775275970Scy
776275970Scy}
777275970Scy
778275970ScyATF_TC(isc_md5);
779275970ScyATF_TC_HEAD(isc_md5, tc) {
780275970Scy	atf_tc_set_md_var(tc, "descr", "md5 example from RFC1321");
781275970Scy}
782275970ScyATF_TC_BODY(isc_md5, tc) {
783275970Scy	isc_md5_t md5;
784275970Scy
785275970Scy	UNUSED(tc);
786275970Scy
787275970Scy	/*
788275970Scy	 * These are the various test vectors.  All of these are passed
789275970Scy	 * through the hash function and the results are compared to the
790275970Scy	 * result specified here.
791275970Scy	 */
792275970Scy	hash_testcase_t testcases[] = {
793275970Scy		{
794275970Scy			TEST_INPUT(""),
795275970Scy			"0xD41D8CD98F00B204E9800998ECF8427E",
796275970Scy			1
797275970Scy		},
798275970Scy		{
799275970Scy			TEST_INPUT("a"),
800275970Scy			"0x0CC175B9C0F1B6A831C399E269772661",
801275970Scy			1
802275970Scy		},
803275970Scy		{
804275970Scy			TEST_INPUT("abc"),
805275970Scy			"0x900150983CD24FB0D6963F7D28E17F72",
806275970Scy			1
807275970Scy		},
808275970Scy		{
809275970Scy			TEST_INPUT("message digest"),
810275970Scy			"0xF96B697D7CB7938D525A2F31AAF161D0",
811275970Scy			1
812275970Scy		},
813275970Scy		{
814275970Scy			TEST_INPUT("abcdefghijklmnopqrstuvwxyz"),
815275970Scy			"0xC3FCD3D76192E4007DFB496CCA67E13B",
816275970Scy			1
817275970Scy		},
818275970Scy		{
819275970Scy			TEST_INPUT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm"
820275970Scy				   "nopqrstuvwxyz0123456789"),
821275970Scy			"0xD174AB98D277D9F5A5611C2C9F419D9F",
822275970Scy			1
823275970Scy		},
824275970Scy		{
825275970Scy			TEST_INPUT("123456789012345678901234567890123456789"
826275970Scy				   "01234567890123456789012345678901234567890"),
827275970Scy			"0x57EDF4A22BE3C955AC49DA2E2107B67A",
828275970Scy			1
829275970Scy		},
830275970Scy		{ NULL, 0, NULL, 1 }
831275970Scy	};
832275970Scy
833275970Scy	hash_testcase_t *testcase = testcases;
834275970Scy
835275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
836275970Scy		isc_md5_init(&md5);
837275970Scy		for(i = 0; i < testcase->repeats; i++) {
838275970Scy			isc_md5_update(&md5,
839275970Scy				       (const isc_uint8_t *) testcase->input,
840275970Scy				       testcase->input_len);
841275970Scy		}
842275970Scy		isc_md5_final(&md5, digest);
843275970Scy		tohexstr(digest, ISC_MD5_DIGESTLENGTH, str);
844275970Scy		ATF_CHECK_STREQ(str, testcase->result);
845275970Scy
846275970Scy		testcase++;
847275970Scy	}
848275970Scy}
849275970Scy
850275970Scy/* HMAC-SHA1 test */
851275970ScyATF_TC(isc_hmacsha1);
852275970ScyATF_TC_HEAD(isc_hmacsha1, tc) {
853275970Scy	atf_tc_set_md_var(tc, "descr", "HMAC-SHA1 examples from RFC2104");
854275970Scy}
855275970ScyATF_TC_BODY(isc_hmacsha1, tc) {
856275970Scy	isc_hmacsha1_t hmacsha1;
857275970Scy
858275970Scy	UNUSED(tc);
859275970Scy	/*
860275970Scy	 * These are the various test vectors.  All of these are passed
861275970Scy	 * through the hash function and the results are compared to the
862275970Scy	 * result specified here.
863275970Scy	 */
864275970Scy	hash_testcase_t testcases[] = {
865275970Scy		/* Test 1 */
866275970Scy		{
867275970Scy			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
868275970Scy			"0xB617318655057264E28BC0B6FB378C8EF146BE00",
869275970Scy			1
870275970Scy		},
871275970Scy		/* Test 2 */
872275970Scy		{
873275970Scy			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
874275970Scy				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
875275970Scy				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
876275970Scy			"0xEFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79",
877275970Scy			1
878275970Scy		},
879275970Scy		/* Test 3 */
880275970Scy		{
881275970Scy			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
882275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
883275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
884275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
885275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
886275970Scy			"0x125D7342B9AC11CD91A39AF48AA17B4F63F175D3",
887275970Scy			1
888275970Scy		},
889275970Scy		/* Test 4 */
890275970Scy		{
891275970Scy			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
892275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
893275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
894275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
895275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
896275970Scy			"0x4C9007F4026250C6BC8414F9BF50C86C2D7235DA",
897275970Scy			1
898275970Scy		},
899275970Scy#if 0
900275970Scy		/* Test 5 -- unimplemented optional functionality */
901275970Scy		{
902275970Scy			TEST_INPUT("Test With Truncation"),
903275970Scy			"0x4C1A03424B55E07FE7F27BE1",
904275970Scy			1
905275970Scy		},
906275970Scy#endif
907275970Scy		/* Test 6 */
908275970Scy		{
909275970Scy			TEST_INPUT("Test Using Larger Than Block-Size Key - "
910275970Scy				   "Hash Key First"),
911275970Scy			"0xAA4AE5E15272D00E95705637CE8A3B55ED402112", 1 },
912275970Scy		/* Test 7 */
913275970Scy		{
914275970Scy			TEST_INPUT("Test Using Larger Than Block-Size Key and "
915275970Scy				   "Larger Than One Block-Size Data"),
916275970Scy			"0xE8E99D0F45237D786D6BBAA7965C7808BBFF1A91",
917275970Scy			1
918275970Scy		},
919275970Scy		{ NULL, 0, NULL, 1 }
920275970Scy	};
921275970Scy
922275970Scy	hash_testcase_t *testcase = testcases;
923275970Scy
924275970Scy	hash_test_key_t test_keys[] = {
925275970Scy		/* Key 1 */
926275970Scy		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
927275970Scy		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
928275970Scy		/* Key 2 */
929275970Scy		{ "Jefe", 4 },
930275970Scy		/* Key 3 */
931275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
932275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
933275970Scy		/* Key 4 */
934275970Scy		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
935275970Scy		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
936275970Scy		  "\x15\x16\x17\x18\x19", 25 },
937275970Scy#if 0
938275970Scy		/* Key 5 */
939275970Scy		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
940275970Scy		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
941275970Scy#endif
942275970Scy		/* Key 6 */
943275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
944275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
945275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
946275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
947275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
948275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
949275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
950275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 80 },
951275970Scy		/* Key 7 */
952275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
953275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
954275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
955275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
956275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
957275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
958275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
959275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 80 },
960275970Scy		{ "", 0 }
961275970Scy	};
962275970Scy
963275970Scy	hash_test_key_t *test_key = test_keys;
964275970Scy
965275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
966275970Scy		memcpy(buffer, test_key->key, test_key->len);
967275970Scy		isc_hmacsha1_init(&hmacsha1, buffer, test_key->len);
968275970Scy		isc_hmacsha1_update(&hmacsha1,
969275970Scy				    (const isc_uint8_t *) testcase->input,
970275970Scy				    testcase->input_len);
971275970Scy		isc_hmacsha1_sign(&hmacsha1, digest, ISC_SHA1_DIGESTLENGTH);
972275970Scy		tohexstr(digest, ISC_SHA1_DIGESTLENGTH, str);
973275970Scy		ATF_CHECK_STREQ(str, testcase->result);
974275970Scy
975275970Scy		testcase++;
976275970Scy		test_key++;
977275970Scy	}
978275970Scy}
979275970Scy
980275970Scy/* HMAC-SHA224 test */
981275970ScyATF_TC(isc_hmacsha224);
982275970ScyATF_TC_HEAD(isc_hmacsha224, tc) {
983275970Scy	atf_tc_set_md_var(tc, "descr", "HMAC-SHA224 examples from RFC4634");
984275970Scy}
985275970ScyATF_TC_BODY(isc_hmacsha224, tc) {
986275970Scy	isc_hmacsha224_t hmacsha224;
987275970Scy
988275970Scy	UNUSED(tc);
989275970Scy
990275970Scy	/*
991275970Scy	 * These are the various test vectors.  All of these are passed
992275970Scy	 * through the hash function and the results are compared to the
993275970Scy	 * result specified here.
994275970Scy	 */
995275970Scy	hash_testcase_t testcases[] = {
996275970Scy		/* Test 1 */
997275970Scy		{
998275970Scy			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
999275970Scy			"0x896FB1128ABBDF196832107CD49DF33F47B4B1169912BA"
1000275970Scy				"4F53684B22",
1001275970Scy			1
1002275970Scy		},
1003275970Scy		/* Test 2 */
1004275970Scy		{
1005275970Scy			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1006275970Scy				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1007275970Scy				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1008275970Scy			"0xA30E01098BC6DBBF45690F3A7E9E6D0F8BBEA2A39E61480"
1009275970Scy				"08FD05E44",
1010275970Scy			1
1011275970Scy		},
1012275970Scy		/* Test 3 */
1013275970Scy		{
1014275970Scy			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1015275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1016275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1017275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1018275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1019275970Scy			"0x7FB3CB3588C6C1F6FFA9694D7D6AD2649365B0C1F65D69"
1020275970Scy				"D1EC8333EA",
1021275970Scy			1
1022275970Scy		},
1023275970Scy		/* Test 4 */
1024275970Scy		{
1025275970Scy			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1026275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1027275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1028275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1029275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1030275970Scy			"0x6C11506874013CAC6A2ABC1BB382627CEC6A90D86EFC01"
1031275970Scy				"2DE7AFEC5A",
1032275970Scy			1
1033275970Scy		},
1034275970Scy#if 0
1035275970Scy		/* Test 5 -- unimplemented optional functionality */
1036275970Scy		{
1037275970Scy			TEST_INPUT("Test With Truncation"),
1038275970Scy			"0x4C1A03424B55E07FE7F27BE1",
1039275970Scy			1
1040275970Scy		},
1041275970Scy#endif
1042275970Scy		/* Test 6 */
1043275970Scy		{
1044275970Scy			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1045275970Scy				   "Hash Key First"),
1046275970Scy			"0x95E9A0DB962095ADAEBE9B2D6F0DBCE2D499F112F2D2B7"
1047275970Scy				"273FA6870E",
1048275970Scy			1
1049275970Scy		},
1050275970Scy		/* Test 7 */
1051275970Scy		{
1052275970Scy			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1053275970Scy				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1054275970Scy				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1055275970Scy				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1056275970Scy				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1057275970Scy				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1058275970Scy				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1059275970Scy				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1060275970Scy				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1061275970Scy				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1062275970Scy				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1063275970Scy				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1064275970Scy				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1065275970Scy				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1066275970Scy				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1067275970Scy				   "\x6d\x2e"),
1068275970Scy			"0x3A854166AC5D9F023F54D517D0B39DBD946770DB9C2B95"
1069275970Scy				"C9F6F565D1",
1070275970Scy			1
1071275970Scy		},
1072275970Scy		{ NULL, 0, NULL, 1 }
1073275970Scy	};
1074275970Scy
1075275970Scy	hash_testcase_t *testcase = testcases;
1076275970Scy
1077275970Scy	hash_test_key_t test_keys[] = {
1078275970Scy		/* Key 1 */
1079275970Scy		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1080275970Scy		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1081275970Scy		/* Key 2 */
1082275970Scy		{ "Jefe", 4 },
1083275970Scy		/* Key 3 */
1084275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1085275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1086275970Scy		/* Key 4 */
1087275970Scy		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1088275970Scy		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1089275970Scy		  "\x15\x16\x17\x18\x19", 25 },
1090275970Scy#if 0
1091275970Scy		/* Key 5 */
1092275970Scy		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1093275970Scy		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1094275970Scy#endif
1095275970Scy		/* Key 6 */
1096275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1097275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1098275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1099275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1100275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1101275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1102275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1103275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1104275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1105275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1106275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1107275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1108275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1109275970Scy		/* Key 7 */
1110275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1111275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1112275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1113275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1114275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1115275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1116275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1117275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1118275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1119275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1120275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1121275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1122275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1123275970Scy		{ "", 0 }
1124275970Scy	};
1125275970Scy
1126275970Scy	hash_test_key_t *test_key = test_keys;
1127275970Scy
1128275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
1129275970Scy		memcpy(buffer, test_key->key, test_key->len);
1130275970Scy		isc_hmacsha224_init(&hmacsha224, buffer, test_key->len);
1131275970Scy		isc_hmacsha224_update(&hmacsha224,
1132275970Scy				      (const isc_uint8_t *) testcase->input,
1133275970Scy				      testcase->input_len);
1134275970Scy		isc_hmacsha224_sign(&hmacsha224, digest, ISC_SHA224_DIGESTLENGTH);
1135275970Scy		tohexstr(digest, ISC_SHA224_DIGESTLENGTH, str);
1136275970Scy		ATF_CHECK_STREQ(str, testcase->result);
1137275970Scy
1138275970Scy		testcase++;
1139275970Scy		test_key++;
1140275970Scy	}
1141275970Scy}
1142275970Scy
1143275970Scy/* HMAC-SHA256 test */
1144275970ScyATF_TC(isc_hmacsha256);
1145275970ScyATF_TC_HEAD(isc_hmacsha256, tc) {
1146275970Scy	atf_tc_set_md_var(tc, "descr", "HMAC-SHA256 examples from RFC4634");
1147275970Scy}
1148275970ScyATF_TC_BODY(isc_hmacsha256, tc) {
1149275970Scy	isc_hmacsha256_t hmacsha256;
1150275970Scy
1151275970Scy	UNUSED(tc);
1152275970Scy
1153275970Scy	/*
1154275970Scy	 * These are the various test vectors.  All of these are passed
1155275970Scy	 * through the hash function and the results are compared to the
1156275970Scy	 * result specified here.
1157275970Scy	 */
1158275970Scy	hash_testcase_t testcases[] = {
1159275970Scy		/* Test 1 */
1160275970Scy		{
1161275970Scy			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1162275970Scy			"0xB0344C61D8DB38535CA8AFCEAF0BF12B881DC200C9833D"
1163275970Scy				"A726E9376C2E32CFF7",
1164275970Scy			1
1165275970Scy		},
1166275970Scy		/* Test 2 */
1167275970Scy		{
1168275970Scy			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1169275970Scy				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1170275970Scy				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1171275970Scy			"0x5BDCC146BF60754E6A042426089575C75A003F089D2739"
1172275970Scy				"839DEC58B964EC3843",
1173275970Scy			1
1174275970Scy		},
1175275970Scy		/* Test 3 */
1176275970Scy		{
1177275970Scy			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1178275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1179275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1180275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1181275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1182275970Scy			"0x773EA91E36800E46854DB8EBD09181A72959098B3EF8C1"
1183275970Scy				"22D9635514CED565FE",
1184275970Scy			1
1185275970Scy		},
1186275970Scy		/* Test 4 */
1187275970Scy		{
1188275970Scy			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1189275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1190275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1191275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1192275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1193275970Scy			"0x82558A389A443C0EA4CC819899F2083A85F0FAA3E578F8"
1194275970Scy				"077A2E3FF46729665B",
1195275970Scy			1
1196275970Scy		},
1197275970Scy#if 0
1198275970Scy		/* Test 5 -- unimplemented optional functionality */
1199275970Scy		{
1200275970Scy			TEST_INPUT("Test With Truncation"),
1201275970Scy			"0x4C1A03424B55E07FE7F27BE1",
1202275970Scy			1
1203275970Scy		},
1204275970Scy#endif
1205275970Scy		/* Test 6 */
1206275970Scy		{
1207275970Scy			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1208275970Scy				   "Hash Key First"),
1209275970Scy			"0x60E431591EE0B67F0D8A26AACBF5B77F8E0BC6213728C5"
1210275970Scy				"140546040F0EE37F54",
1211275970Scy			1
1212275970Scy		},
1213275970Scy		/* Test 7 */
1214275970Scy		{
1215275970Scy			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1216275970Scy				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1217275970Scy				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1218275970Scy				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1219275970Scy				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1220275970Scy				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1221275970Scy				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1222275970Scy				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1223275970Scy				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1224275970Scy				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1225275970Scy				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1226275970Scy				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1227275970Scy				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1228275970Scy				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1229275970Scy				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1230275970Scy				   "\x6d\x2e"),
1231275970Scy			"0x9B09FFA71B942FCB27635FBCD5B0E944BFDC63644F0713"
1232275970Scy				"938A7F51535C3A35E2",
1233275970Scy			1
1234275970Scy		},
1235275970Scy		{ NULL, 0, NULL, 1 }
1236275970Scy	};
1237275970Scy
1238275970Scy	hash_testcase_t *testcase = testcases;
1239275970Scy
1240275970Scy	hash_test_key_t test_keys[] = {
1241275970Scy		/* Key 1 */
1242275970Scy		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1243275970Scy		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1244275970Scy		/* Key 2 */
1245275970Scy		{ "Jefe", 4 },
1246275970Scy		/* Key 3 */
1247275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1248275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1249275970Scy		/* Key 4 */
1250275970Scy		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1251275970Scy		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1252275970Scy		  "\x15\x16\x17\x18\x19", 25 },
1253275970Scy#if 0
1254275970Scy		/* Key 5 */
1255275970Scy		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1256275970Scy		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1257275970Scy#endif
1258275970Scy		/* Key 6 */
1259275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1260275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1261275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1262275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1263275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1264275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1265275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1266275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1267275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1268275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1269275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1270275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1271275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1272275970Scy		/* Key 7 */
1273275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1274275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1275275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1276275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1277275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1278275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1279275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1280275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1281275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1282275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1283275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1284275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1285275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1286275970Scy		{ "", 0 }
1287275970Scy	};
1288275970Scy
1289275970Scy	hash_test_key_t *test_key = test_keys;
1290275970Scy
1291275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
1292275970Scy		memcpy(buffer, test_key->key, test_key->len);
1293275970Scy		isc_hmacsha256_init(&hmacsha256, buffer, test_key->len);
1294275970Scy		isc_hmacsha256_update(&hmacsha256,
1295275970Scy				      (const isc_uint8_t *) testcase->input,
1296275970Scy				      testcase->input_len);
1297275970Scy		isc_hmacsha256_sign(&hmacsha256, digest, ISC_SHA256_DIGESTLENGTH);
1298275970Scy		tohexstr(digest, ISC_SHA256_DIGESTLENGTH, str);
1299275970Scy		ATF_CHECK_STREQ(str, testcase->result);
1300275970Scy
1301275970Scy		testcase++;
1302275970Scy		test_key++;
1303275970Scy	}
1304275970Scy}
1305275970Scy
1306275970Scy/* HMAC-SHA384 test */
1307275970ScyATF_TC(isc_hmacsha384);
1308275970ScyATF_TC_HEAD(isc_hmacsha384, tc) {
1309275970Scy	atf_tc_set_md_var(tc, "descr", "HMAC-SHA384 examples from RFC4634");
1310275970Scy}
1311275970ScyATF_TC_BODY(isc_hmacsha384, tc) {
1312275970Scy	isc_hmacsha384_t hmacsha384;
1313275970Scy
1314275970Scy	UNUSED(tc);
1315275970Scy
1316275970Scy	/*
1317275970Scy	 * These are the various test vectors.  All of these are passed
1318275970Scy	 * through the hash function and the results are compared to the
1319275970Scy	 * result specified here.
1320275970Scy	 */
1321275970Scy	hash_testcase_t testcases[] = {
1322275970Scy		/* Test 1 */
1323275970Scy		{
1324275970Scy			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1325275970Scy			"0xAFD03944D84895626B0825F4AB46907F15F9DADBE4101E"
1326275970Scy				"C682AA034C7CEBC59CFAEA9EA9076EDE7F4AF152"
1327275970Scy				"E8B2FA9CB6",
1328275970Scy			1
1329275970Scy		},
1330275970Scy		/* Test 2 */
1331275970Scy		{
1332275970Scy			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1333275970Scy				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1334275970Scy				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1335275970Scy			"0xAF45D2E376484031617F78D2B58A6B1B9C7EF464F5A01B"
1336275970Scy				"47E42EC3736322445E8E2240CA5E69E2C78B3239"
1337275970Scy				"ECFAB21649",
1338275970Scy			1
1339275970Scy		},
1340275970Scy		/* Test 3 */
1341275970Scy		{
1342275970Scy			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1343275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1344275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1345275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1346275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1347275970Scy			"0x88062608D3E6AD8A0AA2ACE014C8A86F0AA635D947AC9F"
1348275970Scy				"EBE83EF4E55966144B2A5AB39DC13814B94E3AB6"
1349275970Scy				"E101A34F27",
1350275970Scy			1
1351275970Scy		},
1352275970Scy		/* Test 4 */
1353275970Scy		{
1354275970Scy			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1355275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1356275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1357275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1358275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1359275970Scy			"0x3E8A69B7783C25851933AB6290AF6CA77A998148085000"
1360275970Scy				"9CC5577C6E1F573B4E6801DD23C4A7D679CCF8A3"
1361275970Scy				"86C674CFFB",
1362275970Scy			1
1363275970Scy		},
1364275970Scy#if 0
1365275970Scy		/* Test 5 -- unimplemented optional functionality */
1366275970Scy		{
1367275970Scy			TEST_INPUT("Test With Truncation"),
1368275970Scy			"0x4C1A03424B55E07FE7F27BE1",
1369275970Scy			1
1370275970Scy		},
1371275970Scy#endif
1372275970Scy		/* Test 6 */
1373275970Scy		{
1374275970Scy			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1375275970Scy				   "Hash Key First"),
1376275970Scy			"0x4ECE084485813E9088D2C63A041BC5B44F9EF1012A2B58"
1377275970Scy				"8F3CD11F05033AC4C60C2EF6AB4030FE8296248D"
1378275970Scy				"F163F44952",
1379275970Scy			1
1380275970Scy		},
1381275970Scy		/* Test 7 */
1382275970Scy		{
1383275970Scy			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1384275970Scy				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1385275970Scy				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1386275970Scy				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1387275970Scy				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1388275970Scy				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1389275970Scy				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1390275970Scy				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1391275970Scy				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1392275970Scy				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1393275970Scy				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1394275970Scy				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1395275970Scy				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1396275970Scy				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1397275970Scy				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1398275970Scy				   "\x6d\x2e"),
1399275970Scy			"0x6617178E941F020D351E2F254E8FD32C602420FEB0B8FB"
1400275970Scy				"9ADCCEBB82461E99C5A678CC31E799176D3860E6"
1401275970Scy				"110C46523E",
1402275970Scy			1
1403275970Scy		},
1404275970Scy		{ NULL, 0, NULL, 1 }
1405275970Scy	};
1406275970Scy
1407275970Scy	hash_testcase_t *testcase = testcases;
1408275970Scy
1409275970Scy	hash_test_key_t test_keys[] = {
1410275970Scy		/* Key 1 */
1411275970Scy		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1412275970Scy		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1413275970Scy		/* Key 2 */
1414275970Scy		{ "Jefe", 4 },
1415275970Scy		/* Key 3 */
1416275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1417275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1418275970Scy		/* Key 4 */
1419275970Scy		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1420275970Scy		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1421275970Scy		  "\x15\x16\x17\x18\x19", 25 },
1422275970Scy#if 0
1423275970Scy		/* Key 5 */
1424275970Scy		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1425275970Scy		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1426275970Scy#endif
1427275970Scy		/* Key 6 */
1428275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1429275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1430275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1431275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1432275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1433275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1434275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1435275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1436275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1437275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1438275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1439275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1440275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1441275970Scy		/* Key 7 */
1442275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1443275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1444275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1445275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1446275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1447275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1448275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1449275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1450275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1451275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1452275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1453275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1454275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1455275970Scy		{ "", 0 }
1456275970Scy	};
1457275970Scy
1458275970Scy	hash_test_key_t *test_key = test_keys;
1459275970Scy
1460275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
1461275970Scy		memcpy(buffer, test_key->key, test_key->len);
1462275970Scy		isc_hmacsha384_init(&hmacsha384, buffer, test_key->len);
1463275970Scy		isc_hmacsha384_update(&hmacsha384,
1464275970Scy				      (const isc_uint8_t *) testcase->input,
1465275970Scy				      testcase->input_len);
1466275970Scy		isc_hmacsha384_sign(&hmacsha384, digest, ISC_SHA384_DIGESTLENGTH);
1467275970Scy		tohexstr(digest, ISC_SHA384_DIGESTLENGTH, str);
1468275970Scy		ATF_CHECK_STREQ(str, testcase->result);
1469275970Scy
1470275970Scy		testcase++;
1471275970Scy		test_key++;
1472275970Scy	}
1473275970Scy}
1474275970Scy
1475275970Scy/* HMAC-SHA512 test */
1476275970ScyATF_TC(isc_hmacsha512);
1477275970ScyATF_TC_HEAD(isc_hmacsha512, tc) {
1478275970Scy	atf_tc_set_md_var(tc, "descr", "HMAC-SHA512 examples from RFC4634");
1479275970Scy}
1480275970ScyATF_TC_BODY(isc_hmacsha512, tc) {
1481275970Scy	isc_hmacsha512_t hmacsha512;
1482275970Scy
1483275970Scy	UNUSED(tc);
1484275970Scy
1485275970Scy	/*
1486275970Scy	 * These are the various test vectors.  All of these are passed
1487275970Scy	 * through the hash function and the results are compared to the
1488275970Scy	 * result specified here.
1489275970Scy	 */
1490275970Scy	hash_testcase_t testcases[] = {
1491275970Scy		/* Test 1 */
1492275970Scy		{
1493275970Scy			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1494275970Scy			"0x87AA7CDEA5EF619D4FF0B4241A1D6CB02379F4E2CE4EC2"
1495275970Scy				"787AD0B30545E17CDEDAA833B7D6B8A702038B27"
1496275970Scy				"4EAEA3F4E4BE9D914EEB61F1702E696C203A126854",
1497275970Scy			1
1498275970Scy		},
1499275970Scy		/* Test 2 */
1500275970Scy		{
1501275970Scy			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1502275970Scy				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1503275970Scy				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1504275970Scy			"0x164B7A7BFCF819E2E395FBE73B56E0A387BD64222E831F"
1505275970Scy				"D610270CD7EA2505549758BF75C05A994A6D034F"
1506275970Scy				"65F8F0E6FDCAEAB1A34D4A6B4B636E070A38BCE737",
1507275970Scy			1
1508275970Scy		},
1509275970Scy		/* Test 3 */
1510275970Scy		{
1511275970Scy			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1512275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1513275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1514275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1515275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1516275970Scy			"0xFA73B0089D56A284EFB0F0756C890BE9B1B5DBDD8EE81A"
1517275970Scy				"3655F83E33B2279D39BF3E848279A722C806B485"
1518275970Scy				"A47E67C807B946A337BEE8942674278859E13292FB",
1519275970Scy			1
1520275970Scy		},
1521275970Scy		/* Test 4 */
1522275970Scy		{
1523275970Scy			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1524275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1525275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1526275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1527275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1528275970Scy			"0xB0BA465637458C6990E5A8C5F61D4AF7E576D97FF94B87"
1529275970Scy				"2DE76F8050361EE3DBA91CA5C11AA25EB4D67927"
1530275970Scy				"5CC5788063A5F19741120C4F2DE2ADEBEB10A298DD",
1531275970Scy			1
1532275970Scy		},
1533275970Scy#if 0
1534275970Scy		/* Test 5 -- unimplemented optional functionality */
1535275970Scy		{
1536275970Scy			TEST_INPUT("Test With Truncation"),
1537275970Scy			"0x4C1A03424B55E07FE7F27BE1",
1538275970Scy			1
1539275970Scy		},
1540275970Scy#endif
1541275970Scy		/* Test 6 */
1542275970Scy		{
1543275970Scy			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1544275970Scy				   "Hash Key First"),
1545275970Scy			"0x80B24263C7C1A3EBB71493C1DD7BE8B49B46D1F41B4AEE"
1546275970Scy				"C1121B013783F8F3526B56D037E05F2598BD0FD2"
1547275970Scy				"215D6A1E5295E64F73F63F0AEC8B915A985D786598",
1548275970Scy			1
1549275970Scy		},
1550275970Scy		/* Test 7 */
1551275970Scy		{
1552275970Scy			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1553275970Scy				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1554275970Scy				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1555275970Scy				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1556275970Scy				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1557275970Scy				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1558275970Scy				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1559275970Scy				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1560275970Scy				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1561275970Scy				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1562275970Scy				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1563275970Scy				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1564275970Scy				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1565275970Scy				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1566275970Scy				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1567275970Scy				   "\x6d\x2e"),
1568275970Scy			"0xE37B6A775DC87DBAA4DFA9F96E5E3FFDDEBD71F8867289"
1569275970Scy				"865DF5A32D20CDC944B6022CAC3C4982B10D5EEB"
1570275970Scy				"55C3E4DE15134676FB6DE0446065C97440FA8C6A58",
1571275970Scy			1
1572275970Scy		},
1573275970Scy		{ NULL, 0, NULL, 1 }
1574275970Scy	};
1575275970Scy
1576275970Scy	hash_testcase_t *testcase = testcases;
1577275970Scy
1578275970Scy	hash_test_key_t test_keys[] = {
1579275970Scy		/* Key 1 */
1580275970Scy		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1581275970Scy		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1582275970Scy		/* Key 2 */
1583275970Scy		{ "Jefe", 4 },
1584275970Scy		/* Key 3 */
1585275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1586275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1587275970Scy		/* Key 4 */
1588275970Scy		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1589275970Scy		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1590275970Scy		  "\x15\x16\x17\x18\x19", 25 },
1591275970Scy#if 0
1592275970Scy		/* Key 5 */
1593275970Scy		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1594275970Scy		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1595275970Scy#endif
1596275970Scy		/* Key 6 */
1597275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1598275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1599275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1600275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1601275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1602275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1603275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1604275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1605275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1606275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1607275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1608275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1609275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1610275970Scy		/* Key 7 */
1611275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1612275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1613275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1614275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1615275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1616275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1617275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1618275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1619275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1620275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1621275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1622275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1623275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1624275970Scy		{ "", 0 }
1625275970Scy	};
1626275970Scy
1627275970Scy	hash_test_key_t *test_key = test_keys;
1628275970Scy
1629275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
1630275970Scy		memcpy(buffer, test_key->key, test_key->len);
1631275970Scy		isc_hmacsha512_init(&hmacsha512, buffer, test_key->len);
1632275970Scy		isc_hmacsha512_update(&hmacsha512,
1633275970Scy				      (const isc_uint8_t *) testcase->input,
1634275970Scy				      testcase->input_len);
1635275970Scy		isc_hmacsha512_sign(&hmacsha512, digest, ISC_SHA512_DIGESTLENGTH);
1636275970Scy		tohexstr(digest, ISC_SHA512_DIGESTLENGTH, str);
1637275970Scy		ATF_CHECK_STREQ(str, testcase->result);
1638275970Scy
1639275970Scy		testcase++;
1640275970Scy		test_key++;
1641275970Scy	}
1642275970Scy}
1643275970Scy
1644275970Scy
1645275970Scy/* HMAC-MD5 Test */
1646275970ScyATF_TC(isc_hmacmd5);
1647275970ScyATF_TC_HEAD(isc_hmacmd5, tc) {
1648275970Scy	atf_tc_set_md_var(tc, "descr", "HMAC-MD5 examples from RFC2104");
1649275970Scy}
1650275970ScyATF_TC_BODY(isc_hmacmd5, tc) {
1651275970Scy	isc_hmacmd5_t hmacmd5;
1652275970Scy
1653275970Scy	UNUSED(tc);
1654275970Scy
1655275970Scy	/*
1656275970Scy	 * These are the various test vectors.  All of these are passed
1657275970Scy	 * through the hash function and the results are compared to the
1658275970Scy	 * result specified here.
1659275970Scy	 */
1660275970Scy	hash_testcase_t testcases[] = {
1661275970Scy		/* Test 1 */
1662275970Scy		{
1663275970Scy			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1664275970Scy			"0x9294727A3638BB1C13F48EF8158BFC9D",
1665275970Scy			1
1666275970Scy		},
1667275970Scy		/* Test 2 */
1668275970Scy		{
1669275970Scy			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79"
1670275970Scy				   "\x61\x20\x77\x61\x6e\x74\x20\x66\x6f"
1671275970Scy				   "\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1672275970Scy			"0x750C783E6AB0B503EAA86E310A5DB738", 1
1673275970Scy		},
1674275970Scy		/* Test 3 */
1675275970Scy		{
1676275970Scy			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1677275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1678275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1679275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1680275970Scy				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1681275970Scy			"0x56BE34521D144C88DBB8C733F0E8B3F6",
1682275970Scy			1
1683275970Scy		},
1684275970Scy		/* Test 4 */
1685275970Scy		{
1686275970Scy			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1687275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1688275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1689275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1690275970Scy				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1691275970Scy			"0x697EAF0ACA3A3AEA3A75164746FFAA79",
1692275970Scy			1
1693275970Scy		},
1694275970Scy#if 0
1695275970Scy		/* Test 5 -- unimplemented optional functionality */
1696275970Scy		{
1697275970Scy			TEST_INPUT("Test With Truncation"),
1698275970Scy			"0x4C1A03424B55E07FE7F27BE1",
1699275970Scy			1
1700275970Scy		},
1701275970Scy		/* Test 6 -- unimplemented optional functionality */
1702275970Scy		{
1703275970Scy			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1704275970Scy				   "Hash Key First"),
1705275970Scy			"0xAA4AE5E15272D00E95705637CE8A3B55ED402112",
1706275970Scy			1
1707275970Scy		 },
1708275970Scy		/* Test 7 -- unimplemented optional functionality */
1709275970Scy		{
1710275970Scy			TEST_INPUT("Test Using Larger Than Block-Size Key and "
1711275970Scy				   "Larger Than One Block-Size Data"),
1712275970Scy			"0xE8E99D0F45237D786D6BBAA7965C7808BBFF1A91",
1713275970Scy			1
1714275970Scy		},
1715275970Scy#endif
1716275970Scy		{ NULL, 0, NULL, 1 }
1717275970Scy	};
1718275970Scy
1719275970Scy	hash_testcase_t *testcase = testcases;
1720275970Scy
1721275970Scy	hash_test_key_t test_keys[] = {
1722275970Scy		/* Key 1 */
1723275970Scy		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1724275970Scy		  "\x0b\x0b\x0b\x0b\x0b\x0b", 16 },
1725275970Scy		/* Key 2 */
1726275970Scy		{ "Jefe", 4 },
1727275970Scy		/* Key 3 */
1728275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1729275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa", 16 },
1730275970Scy		/* Key 4 */
1731275970Scy		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1732275970Scy		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1733275970Scy		  "\x15\x16\x17\x18\x19", 25 },
1734275970Scy#if 0
1735275970Scy		/* Key 5 */
1736275970Scy		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1737275970Scy		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1738275970Scy		/* Key 6 */
1739275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1740275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1741275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1742275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1743275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1744275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1745275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1746275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1747275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1748275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1749275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1750275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1751275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1752275970Scy		/* Key 7 */
1753275970Scy		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1754275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1755275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1756275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1757275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1758275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1759275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1760275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1761275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1762275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1763275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1764275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1765275970Scy		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1766275970Scy#endif
1767275970Scy		{ "", 0 }
1768275970Scy	};
1769275970Scy
1770275970Scy	hash_test_key_t *test_key = test_keys;
1771275970Scy
1772275970Scy	while (testcase->input != NULL && testcase->result != NULL) {
1773275970Scy		memcpy(buffer, test_key->key, test_key->len);
1774275970Scy		isc_hmacmd5_init(&hmacmd5, buffer, test_key->len);
1775275970Scy		isc_hmacmd5_update(&hmacmd5,
1776275970Scy				   (const isc_uint8_t *) testcase->input,
1777275970Scy				   testcase->input_len);
1778275970Scy		isc_hmacmd5_sign(&hmacmd5, digest);
1779275970Scy		tohexstr(digest, ISC_MD5_DIGESTLENGTH, str);
1780275970Scy		ATF_CHECK_STREQ(str, testcase->result);
1781275970Scy
1782275970Scy		testcase++;
1783275970Scy		test_key++;
1784275970Scy	}
1785275970Scy}
1786275970Scy
1787275970Scy/*
1788275970Scy * Main
1789275970Scy */
1790275970ScyATF_TP_ADD_TCS(tp) {
1791275970Scy	ATF_TP_ADD_TC(tp, isc_hmacmd5);
1792275970Scy	ATF_TP_ADD_TC(tp, isc_hmacsha1);
1793275970Scy	ATF_TP_ADD_TC(tp, isc_hmacsha224);
1794275970Scy	ATF_TP_ADD_TC(tp, isc_hmacsha256);
1795275970Scy	ATF_TP_ADD_TC(tp, isc_hmacsha384);
1796275970Scy	ATF_TP_ADD_TC(tp, isc_hmacsha512);
1797275970Scy	ATF_TP_ADD_TC(tp, isc_md5);
1798275970Scy	ATF_TP_ADD_TC(tp, isc_sha1);
1799275970Scy	ATF_TP_ADD_TC(tp, isc_sha224);
1800275970Scy	ATF_TP_ADD_TC(tp, isc_sha256);
1801275970Scy	ATF_TP_ADD_TC(tp, isc_sha384);
1802275970Scy	ATF_TP_ADD_TC(tp, isc_sha512);
1803275970Scy	return (atf_no_error());
1804275970Scy}
1805275970Scy
1806