1290001Sglebius/*
2290001Sglebius * Copyright (C) 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
3290001Sglebius *
4290001Sglebius * Permission to use, copy, modify, and/or distribute this software for any
5290001Sglebius * purpose with or without fee is hereby granted, provided that the above
6290001Sglebius * copyright notice and this permission notice appear in all copies.
7290001Sglebius *
8290001Sglebius * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9290001Sglebius * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10290001Sglebius * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11290001Sglebius * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12290001Sglebius * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13290001Sglebius * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14290001Sglebius * PERFORMANCE OF THIS SOFTWARE.
15290001Sglebius */
16290001Sglebius
17290001Sglebius/* $Id$ */
18290001Sglebius
19290001Sglebius/* ! \file */
20290001Sglebius
21290001Sglebius#include <config.h>
22290001Sglebius
23290001Sglebius#include <atf-c.h>
24290001Sglebius
25290001Sglebius#include <stdio.h>
26290001Sglebius#include <string.h>
27290001Sglebius
28290001Sglebius#include <isc/hmacmd5.h>
29290001Sglebius#include <isc/hmacsha.h>
30290001Sglebius#include <isc/md5.h>
31290001Sglebius#include <isc/sha1.h>
32290001Sglebius#include <isc/util.h>
33290001Sglebius#include <isc/string.h>
34290001Sglebius
35290001Sglebius/*
36290001Sglebius * Test data from RFC6234
37290001Sglebius */
38290001Sglebius
39290001Sglebiusunsigned char digest[ISC_SHA512_DIGESTLENGTH];
40290001Sglebiusunsigned char buffer[1024];
41290001Sglebiusconst char *s;
42290001Sglebiuschar str[ISC_SHA512_DIGESTLENGTH];
43290001Sglebiusunsigned char key[20];
44290001Sglebiusint i = 0;
45290001Sglebius
46290001Sglebiusisc_result_t
47290001Sglebiustohexstr(unsigned char *d, unsigned int len, char *out);
48290001Sglebius/*
49290001Sglebius * Precondition: a hexadecimal number in *d, the length of that number in len,
50290001Sglebius *   and a pointer to a character array to put the output (*out).
51290001Sglebius * Postcondition: A String representation of the given hexadecimal number is
52290001Sglebius *   placed into the array *out
53290001Sglebius *
54290001Sglebius * 'out' MUST point to an array of at least len / 2 + 1
55290001Sglebius *
56290001Sglebius * Return values: ISC_R_SUCCESS if the operation is sucessful
57290001Sglebius */
58290001Sglebius
59290001Sglebiusisc_result_t
60290001Sglebiustohexstr(unsigned char *d, unsigned int len, char *out) {
61290001Sglebius
62290001Sglebius	out[0]='\0';
63290001Sglebius	char c_ret[] = "AA";
64290001Sglebius	unsigned int i;
65290001Sglebius	strcat(out, "0x");
66290001Sglebius	for (i = 0; i < len; i++) {
67290001Sglebius		sprintf(c_ret, "%02X", d[i]);
68290001Sglebius		strcat(out, c_ret);
69290001Sglebius	}
70290001Sglebius	strcat(out, "\0");
71290001Sglebius	return (ISC_R_SUCCESS);
72290001Sglebius}
73290001Sglebius
74290001Sglebius
75290001Sglebius#define TEST_INPUT(x) (x), sizeof(x)-1
76290001Sglebius
77290001Sglebiustypedef struct hash_testcase {
78290001Sglebius	const char *input;
79290001Sglebius	size_t input_len;
80290001Sglebius	const char *result;
81290001Sglebius	int repeats;
82290001Sglebius} hash_testcase_t;
83290001Sglebius
84290001Sglebiustypedef struct hash_test_key {
85290001Sglebius	const char *key;
86290001Sglebius	const int len;
87290001Sglebius} hash_test_key_t;
88290001Sglebius
89290001Sglebius/* non-hmac tests */
90290001Sglebius
91290001SglebiusATF_TC(isc_sha1);
92290001SglebiusATF_TC_HEAD(isc_sha1, tc) {
93290001Sglebius	atf_tc_set_md_var(tc, "descr", "sha1 examples from RFC4634");
94290001Sglebius}
95290001SglebiusATF_TC_BODY(isc_sha1, tc) {
96290001Sglebius	isc_sha1_t sha1;
97290001Sglebius
98290001Sglebius	UNUSED(tc);
99290001Sglebius
100290001Sglebius	/*
101290001Sglebius	 * These are the various test vectors.  All of these are passed
102290001Sglebius	 * through the hash function and the results are compared to the
103290001Sglebius	 * result specified here.
104290001Sglebius	 */
105290001Sglebius	hash_testcase_t testcases[] = {
106290001Sglebius		/* Test 1 */
107290001Sglebius		{
108290001Sglebius			TEST_INPUT("abc"),
109290001Sglebius			"0xA9993E364706816ABA3E25717850C26C9CD0D89D",
110290001Sglebius			1
111290001Sglebius		},
112290001Sglebius		/* Test 2 */
113290001Sglebius		{
114290001Sglebius			TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijk"
115290001Sglebius				   "ljklmklmnlmnomnopnopq"),
116290001Sglebius			"0x84983E441C3BD26EBAAE4AA1F95129E5E54670F1",
117290001Sglebius			1
118290001Sglebius		},
119290001Sglebius		/* Test 3 */
120290001Sglebius		{
121290001Sglebius			TEST_INPUT("a") /* times 1000000 */,
122290001Sglebius			"0x34AA973CD4C4DAA4F61EEB2BDBAD27316534016F",
123290001Sglebius			1000000
124290001Sglebius		},
125290001Sglebius		/* Test 4 -- exact multiple of 512 bits */
126290001Sglebius		{
127290001Sglebius			TEST_INPUT("01234567012345670123456701234567"),
128290001Sglebius			"0xDEA356A2CDDD90C7A7ECEDC5EBB563934F460452",
129290001Sglebius			20 /* 20 times */
130290001Sglebius		},
131290001Sglebius#if 0
132290001Sglebius		/* Test 5 -- optional feature, not implemented */
133290001Sglebius		{
134290001Sglebius			TEST_INPUT(""),
135290001Sglebius			/* "extrabits": 0x98 , "numberextrabits": 5 */
136290001Sglebius			"0x29826B003B906E660EFF4027CE98AF3531AC75BA",
137290001Sglebius			1
138290001Sglebius		},
139290001Sglebius#endif
140290001Sglebius		/* Test 6 */
141290001Sglebius		{
142290001Sglebius			TEST_INPUT("\x5e"),
143290001Sglebius			"0x5E6F80A34A9798CAFC6A5DB96CC57BA4C4DB59C2",
144290001Sglebius			1
145290001Sglebius		},
146290001Sglebius#if 0
147290001Sglebius		/* Test 7 -- optional feature, not implemented */
148290001Sglebius		{
149290001Sglebius			TEST_INPUT("\x49\xb2\xae\xc2\x59\x4b\xbe\x3a"
150290001Sglebius				   "\x3b\x11\x75\x42\xd9\x4a\xc8"),
151290001Sglebius			/* "extrabits": 0x80, "numberextrabits": 3 */
152290001Sglebius		  "0x6239781E03729919C01955B3FFA8ACB60B988340", 1 },
153290001Sglebius#endif
154290001Sglebius		/* Test 8 */
155290001Sglebius		{
156290001Sglebius			TEST_INPUT("\x9a\x7d\xfd\xf1\xec\xea\xd0\x6e\xd6\x46"
157290001Sglebius				   "\xaa\x55\xfe\x75\x71\x46"),
158290001Sglebius			"0x82ABFF6605DBE1C17DEF12A394FA22A82B544A35",
159290001Sglebius			1
160290001Sglebius		},
161290001Sglebius#if 0
162290001Sglebius		/* Test 9 -- optional feature, not implemented */
163290001Sglebius		{
164290001Sglebius			TEST_INPUT("\x65\xf9\x32\x99\x5b\xa4\xce\x2c\xb1\xb4"
165290001Sglebius				   "\xa2\xe7\x1a\xe7\x02\x20\xaa\xce\xc8\x96"
166290001Sglebius				   "\x2d\xd4\x49\x9c\xbd\x7c\x88\x7a\x94\xea"
167290001Sglebius				   "\xaa\x10\x1e\xa5\xaa\xbc\x52\x9b\x4e\x7e"
168290001Sglebius				   "\x43\x66\x5a\x5a\xf2\xcd\x03\xfe\x67\x8e"
169290001Sglebius				   "\xa6\xa5\x00\x5b\xba\x3b\x08\x22\x04\xc2"
170290001Sglebius				   "\x8b\x91\x09\xf4\x69\xda\xc9\x2a\xaa\xb3"
171290001Sglebius				   "\xaa\x7c\x11\xa1\xb3\x2a"),
172290001Sglebius			/* "extrabits": 0xE0 , "numberextrabits": 3 */
173290001Sglebius			"0x8C5B2A5DDAE5A97FC7F9D85661C672ADBF7933D4",
174290001Sglebius			1
175290001Sglebius		},
176290001Sglebius#endif
177290001Sglebius		/* Test 10 */
178290001Sglebius		{
179290001Sglebius			TEST_INPUT("\xf7\x8f\x92\x14\x1b\xcd\x17\x0a\xe8\x9b"
180290001Sglebius				   "\x4f\xba\x15\xa1\xd5\x9f\x3f\xd8\x4d\x22"
181290001Sglebius				   "\x3c\x92\x51\xbd\xac\xbb\xae\x61\xd0\x5e"
182290001Sglebius				   "\xd1\x15\xa0\x6a\x7c\xe1\x17\xb7\xbe\xea"
183290001Sglebius				   "\xd2\x44\x21\xde\xd9\xc3\x25\x92\xbd\x57"
184290001Sglebius				   "\xed\xea\xe3\x9c\x39\xfa\x1f\xe8\x94\x6a"
185290001Sglebius				   "\x84\xd0\xcf\x1f\x7b\xee\xad\x17\x13\xe2"
186290001Sglebius				   "\xe0\x95\x98\x97\x34\x7f\x67\xc8\x0b\x04"
187290001Sglebius				   "\x00\xc2\x09\x81\x5d\x6b\x10\xa6\x83\x83"
188290001Sglebius				   "\x6f\xd5\x56\x2a\x56\xca\xb1\xa2\x8e\x81"
189290001Sglebius				   "\xb6\x57\x66\x54\x63\x1c\xf1\x65\x66\xb8"
190290001Sglebius				   "\x6e\x3b\x33\xa1\x08\xb0\x53\x07\xc0\x0a"
191290001Sglebius				   "\xff\x14\xa7\x68\xed\x73\x50\x60\x6a\x0f"
192290001Sglebius				   "\x85\xe6\xa9\x1d\x39\x6f\x5b\x5c\xbe\x57"
193290001Sglebius				   "\x7f\x9b\x38\x80\x7c\x7d\x52\x3d\x6d\x79"
194290001Sglebius				   "\x2f\x6e\xbc\x24\xa4\xec\xf2\xb3\xa4\x27"
195290001Sglebius				   "\xcd\xbb\xfb"),
196290001Sglebius			"0xCB0082C8F197D260991BA6A460E76E202BAD27B3",
197290001Sglebius			1
198290001Sglebius		},
199290001Sglebius		{ NULL, 0, NULL, 1 }
200290001Sglebius	};
201290001Sglebius
202290001Sglebius	hash_testcase_t *testcase = testcases;
203290001Sglebius
204290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
205290001Sglebius		isc_sha1_init(&sha1);
206290001Sglebius		for(i = 0; i < testcase->repeats; i++) {
207290001Sglebius			isc_sha1_update(&sha1,
208290001Sglebius					(const isc_uint8_t *) testcase->input,
209290001Sglebius					testcase->input_len);
210290001Sglebius		}
211290001Sglebius		isc_sha1_final(&sha1, digest);
212290001Sglebius		tohexstr(digest, ISC_SHA1_DIGESTLENGTH, str);
213290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
214290001Sglebius
215290001Sglebius		testcase++;
216290001Sglebius	}
217290001Sglebius}
218290001Sglebius
219290001Sglebius
220290001SglebiusATF_TC(isc_sha224);
221290001SglebiusATF_TC_HEAD(isc_sha224, tc) {
222290001Sglebius	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
223290001Sglebius}
224290001SglebiusATF_TC_BODY(isc_sha224, tc) {
225290001Sglebius	isc_sha224_t sha224;
226290001Sglebius
227290001Sglebius	UNUSED(tc);
228290001Sglebius
229290001Sglebius	/*
230290001Sglebius	 * These are the various test vectors.  All of these are passed
231290001Sglebius	 * through the hash function and the results are compared to the
232290001Sglebius	 * result specified here.
233290001Sglebius	 */
234290001Sglebius	hash_testcase_t testcases[] = {
235290001Sglebius		/* Test 1 */
236290001Sglebius		{
237290001Sglebius			TEST_INPUT("abc"),
238290001Sglebius			"0x23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7"
239290001Sglebius				"E36C9DA7",
240290001Sglebius			1
241290001Sglebius		},
242290001Sglebius		/* Test 2 */
243290001Sglebius		{
244290001Sglebius			TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijklj"
245290001Sglebius				   "klmklmnlmnomnopnopq"),
246290001Sglebius			"0x75388B16512776CC5DBA5DA1FD890150B0C6455CB4F58B"
247290001Sglebius				"1952522525",
248290001Sglebius			1
249290001Sglebius		},
250290001Sglebius		/* Test 3 */
251290001Sglebius		{
252290001Sglebius			TEST_INPUT("a"),
253290001Sglebius			"0x20794655980C91D8BBB4C1EA97618A4BF03F42581948B2"
254290001Sglebius				"EE4EE7AD67",
255290001Sglebius			1000000
256290001Sglebius		},
257290001Sglebius		/* Test 4 */
258290001Sglebius		{
259290001Sglebius			TEST_INPUT("01234567012345670123456701234567"),
260290001Sglebius			"0x567F69F168CD7844E65259CE658FE7AADFA25216E68ECA"
261290001Sglebius				"0EB7AB8262",
262290001Sglebius			20
263290001Sglebius		},
264290001Sglebius#if 0
265290001Sglebius		/* Test 5 -- unimplemented optional functionality */
266290001Sglebius		{
267290001Sglebius			TEST_INPUT(""),
268290001Sglebius			"0xXXX",
269290001Sglebius			1
270290001Sglebius		},
271290001Sglebius#endif
272290001Sglebius		/* Test 6 */
273290001Sglebius		{
274290001Sglebius			TEST_INPUT("\x07"),
275290001Sglebius			"0x00ECD5F138422B8AD74C9799FD826C531BAD2FCABC7450"
276290001Sglebius				"BEE2AA8C2A",
277290001Sglebius			1
278290001Sglebius		},
279290001Sglebius#if 0
280290001Sglebius		/* Test 7 -- unimplemented optional functionality */
281290001Sglebius		{
282290001Sglebius			TEST_INPUT(""),
283290001Sglebius			"0xXXX",
284290001Sglebius			1
285290001Sglebius		},
286290001Sglebius#endif
287290001Sglebius		/* Test 8 */
288290001Sglebius		{
289290001Sglebius			TEST_INPUT("\x18\x80\x40\x05\xdd\x4f\xbd\x15\x56\x29"
290290001Sglebius				   "\x9d\x6f\x9d\x93\xdf\x62"),
291290001Sglebius			"0xDF90D78AA78821C99B40BA4C966921ACCD8FFB1E98AC38"
292290001Sglebius				"8E56191DB1",
293290001Sglebius			1
294290001Sglebius		},
295290001Sglebius#if 0
296290001Sglebius		/* Test 9 */
297290001Sglebius		{
298290001Sglebius			TEST_INPUT(""),
299290001Sglebius			"0xXXX",
300290001Sglebius			1
301290001Sglebius		},
302290001Sglebius#endif
303290001Sglebius		/* Test 10 */
304290001Sglebius		{
305290001Sglebius			TEST_INPUT("\x55\xb2\x10\x07\x9c\x61\xb5\x3a\xdd\x52"
306290001Sglebius				   "\x06\x22\xd1\xac\x97\xd5\xcd\xbe\x8c\xb3"
307290001Sglebius				   "\x3a\xa0\xae\x34\x45\x17\xbe\xe4\xd7\xba"
308290001Sglebius				   "\x09\xab\xc8\x53\x3c\x52\x50\x88\x7a\x43"
309290001Sglebius				   "\xbe\xbb\xac\x90\x6c\x2e\x18\x37\xf2\x6b"
310290001Sglebius				   "\x36\xa5\x9a\xe3\xbe\x78\x14\xd5\x06\x89"
311290001Sglebius				   "\x6b\x71\x8b\x2a\x38\x3e\xcd\xac\x16\xb9"
312290001Sglebius				   "\x61\x25\x55\x3f\x41\x6f\xf3\x2c\x66\x74"
313290001Sglebius				   "\xc7\x45\x99\xa9\x00\x53\x86\xd9\xce\x11"
314290001Sglebius				   "\x12\x24\x5f\x48\xee\x47\x0d\x39\x6c\x1e"
315290001Sglebius				   "\xd6\x3b\x92\x67\x0c\xa5\x6e\xc8\x4d\xee"
316290001Sglebius				   "\xa8\x14\xb6\x13\x5e\xca\x54\x39\x2b\xde"
317290001Sglebius				   "\xdb\x94\x89\xbc\x9b\x87\x5a\x8b\xaf\x0d"
318290001Sglebius				   "\xc1\xae\x78\x57\x36\x91\x4a\xb7\xda\xa2"
319290001Sglebius				   "\x64\xbc\x07\x9d\x26\x9f\x2c\x0d\x7e\xdd"
320290001Sglebius				   "\xd8\x10\xa4\x26\x14\x5a\x07\x76\xf6\x7c"
321290001Sglebius				   "\x87\x82\x73"),
322290001Sglebius			"0x0B31894EC8937AD9B91BDFBCBA294D9ADEFAA18E09305E"
323290001Sglebius				"9F20D5C3A4",
324290001Sglebius			1
325290001Sglebius		},
326290001Sglebius		{ NULL, 0, NULL, 1 }
327290001Sglebius	};
328290001Sglebius
329290001Sglebius	hash_testcase_t *testcase = testcases;
330290001Sglebius
331290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
332290001Sglebius		isc_sha224_init(&sha224);
333290001Sglebius		for(i = 0; i < testcase->repeats; i++) {
334290001Sglebius			isc_sha224_update(&sha224,
335290001Sglebius					  (const isc_uint8_t *) testcase->input,
336290001Sglebius					  testcase->input_len);
337290001Sglebius		}
338290001Sglebius		isc_sha224_final(digest, &sha224);
339290001Sglebius		/*
340290001Sglebius		*API inconsistency BUG HERE
341290001Sglebius		* in order to be consistant with the other isc_hash_final
342290001Sglebius		* functions the call should be
343290001Sglebius		* isc_sha224_final(&sha224, digest);
344290001Sglebius		 */
345290001Sglebius		tohexstr(digest, ISC_SHA224_DIGESTLENGTH, str);
346290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
347290001Sglebius
348290001Sglebius		testcase++;
349290001Sglebius	}
350290001Sglebius
351290001Sglebius}
352290001Sglebius
353290001SglebiusATF_TC(isc_sha256);
354290001SglebiusATF_TC_HEAD(isc_sha256, tc) {
355290001Sglebius	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
356290001Sglebius}
357290001SglebiusATF_TC_BODY(isc_sha256, tc) {
358290001Sglebius	isc_sha256_t sha256;
359290001Sglebius
360290001Sglebius	UNUSED(tc);
361290001Sglebius
362290001Sglebius	/*
363290001Sglebius	 * These are the various test vectors.  All of these are passed
364290001Sglebius	 * through the hash function and the results are compared to the
365290001Sglebius	 * result specified here.
366290001Sglebius	 */
367290001Sglebius	hash_testcase_t testcases[] = {
368290001Sglebius		/* Test 1 */
369290001Sglebius		{
370290001Sglebius			TEST_INPUT("abc"),
371290001Sglebius			"0xBA7816BF8F01CFEA414140DE5DAE2223B00361A396177A"
372290001Sglebius				"9CB410FF61F20015AD",
373290001Sglebius			1
374290001Sglebius		},
375290001Sglebius		/* Test 2 */
376290001Sglebius		{
377290001Sglebius			TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijkljk"
378290001Sglebius				   "lmklmnlmnomnopnopq"),
379290001Sglebius			"0x248D6A61D20638B8E5C026930C3E6039A33CE45964FF21"
380290001Sglebius				"67F6ECEDD419DB06C1",
381290001Sglebius			1
382290001Sglebius		},
383290001Sglebius		/* Test 3 */
384290001Sglebius		{
385290001Sglebius			TEST_INPUT("a"),
386290001Sglebius			"0xCDC76E5C9914FB9281A1C7E284D73E67F1809A48A49720"
387290001Sglebius				"0E046D39CCC7112CD0",
388290001Sglebius			1000000 },
389290001Sglebius		/* Test 4 */
390290001Sglebius		{
391290001Sglebius			TEST_INPUT("01234567012345670123456701234567"),
392290001Sglebius			"0x594847328451BDFA85056225462CC1D867D877FB388DF0"
393290001Sglebius				"CE35F25AB5562BFBB5",
394290001Sglebius			20
395290001Sglebius		},
396290001Sglebius#if 0
397290001Sglebius		/* Test 5 -- unimplemented optional functionality */
398290001Sglebius		{
399290001Sglebius			TEST_INPUT(""),
400290001Sglebius			"0xXXX",
401290001Sglebius			1
402290001Sglebius		},
403290001Sglebius#endif
404290001Sglebius		/* Test 6 */
405290001Sglebius		{
406290001Sglebius			TEST_INPUT("\x19"),
407290001Sglebius			"0x68AA2E2EE5DFF96E3355E6C7EE373E3D6A4E17F75F9518"
408290001Sglebius				"D843709C0C9BC3E3D4",
409290001Sglebius			1
410290001Sglebius		},
411290001Sglebius#if 0
412290001Sglebius		/* Test 7 -- unimplemented optional functionality */
413290001Sglebius		{
414290001Sglebius			TEST_INPUT(""),
415290001Sglebius			"0xXXX",
416290001Sglebius			1
417290001Sglebius		},
418290001Sglebius#endif
419290001Sglebius		/* Test 8 */
420290001Sglebius		{
421290001Sglebius			TEST_INPUT("\xe3\xd7\x25\x70\xdc\xdd\x78\x7c\xe3"
422290001Sglebius				   "\x88\x7a\xb2\xcd\x68\x46\x52"),
423290001Sglebius			"0x175EE69B02BA9B58E2B0A5FD13819CEA573F3940A94F82"
424290001Sglebius				"5128CF4209BEABB4E8",
425290001Sglebius			1
426290001Sglebius		},
427290001Sglebius#if 0
428290001Sglebius		/* Test 9 -- unimplemented optional functionality */
429290001Sglebius		{
430290001Sglebius			TEST_INPUT(""),
431290001Sglebius			"0xXXX",
432290001Sglebius			1
433290001Sglebius		},
434290001Sglebius#endif
435290001Sglebius		/* Test 10 */
436290001Sglebius		{
437290001Sglebius			TEST_INPUT("\x83\x26\x75\x4e\x22\x77\x37\x2f\x4f\xc1"
438290001Sglebius				   "\x2b\x20\x52\x7a\xfe\xf0\x4d\x8a\x05\x69"
439290001Sglebius				   "\x71\xb1\x1a\xd5\x71\x23\xa7\xc1\x37\x76"
440290001Sglebius				   "\x00\x00\xd7\xbe\xf6\xf3\xc1\xf7\xa9\x08"
441290001Sglebius				   "\x3a\xa3\x9d\x81\x0d\xb3\x10\x77\x7d\xab"
442290001Sglebius				   "\x8b\x1e\x7f\x02\xb8\x4a\x26\xc7\x73\x32"
443290001Sglebius				   "\x5f\x8b\x23\x74\xde\x7a\x4b\x5a\x58\xcb"
444290001Sglebius				   "\x5c\x5c\xf3\x5b\xce\xe6\xfb\x94\x6e\x5b"
445290001Sglebius				   "\xd6\x94\xfa\x59\x3a\x8b\xeb\x3f\x9d\x65"
446290001Sglebius				   "\x92\xec\xed\xaa\x66\xca\x82\xa2\x9d\x0c"
447290001Sglebius				   "\x51\xbc\xf9\x33\x62\x30\xe5\xd7\x84\xe4"
448290001Sglebius				   "\xc0\xa4\x3f\x8d\x79\xa3\x0a\x16\x5c\xba"
449290001Sglebius				   "\xbe\x45\x2b\x77\x4b\x9c\x71\x09\xa9\x7d"
450290001Sglebius				   "\x13\x8f\x12\x92\x28\x96\x6f\x6c\x0a\xdc"
451290001Sglebius				   "\x10\x6a\xad\x5a\x9f\xdd\x30\x82\x57\x69"
452290001Sglebius				   "\xb2\xc6\x71\xaf\x67\x59\xdf\x28\xeb\x39"
453290001Sglebius				   "\x3d\x54\xd6"),
454290001Sglebius			"0x97DBCA7DF46D62C8A422C941DD7E835B8AD3361763F7E9"
455290001Sglebius				"B2D95F4F0DA6E1CCBC",
456290001Sglebius			1
457290001Sglebius		},
458290001Sglebius		{ NULL, 0, NULL, 1 }
459290001Sglebius	};
460290001Sglebius
461290001Sglebius	hash_testcase_t *testcase = testcases;
462290001Sglebius
463290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
464290001Sglebius		isc_sha256_init(&sha256);
465290001Sglebius		for(i = 0; i < testcase->repeats; i++) {
466290001Sglebius			isc_sha256_update(&sha256,
467290001Sglebius					  (const isc_uint8_t *) testcase->input,
468290001Sglebius					  testcase->input_len);
469290001Sglebius		}
470290001Sglebius		isc_sha256_final(digest, &sha256);
471290001Sglebius		/*
472290001Sglebius		*API inconsistency BUG HERE
473290001Sglebius		* in order to be consistant with the other isc_hash_final
474290001Sglebius		* functions the call should be
475290001Sglebius		* isc_sha224_final(&sha224, digest);
476290001Sglebius		 */
477290001Sglebius		tohexstr(digest, ISC_SHA256_DIGESTLENGTH, str);
478290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
479290001Sglebius
480290001Sglebius		testcase++;
481290001Sglebius	}
482290001Sglebius
483290001Sglebius}
484290001Sglebius
485290001SglebiusATF_TC(isc_sha384);
486290001SglebiusATF_TC_HEAD(isc_sha384, tc) {
487290001Sglebius	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
488290001Sglebius}
489290001SglebiusATF_TC_BODY(isc_sha384, tc) {
490290001Sglebius	isc_sha384_t sha384;
491290001Sglebius
492290001Sglebius	UNUSED(tc);
493290001Sglebius
494290001Sglebius	/*
495290001Sglebius	 * These are the various test vectors.  All of these are passed
496290001Sglebius	 * through the hash function and the results are compared to the
497290001Sglebius	 * result specified here.
498290001Sglebius	 */
499290001Sglebius	hash_testcase_t testcases[] = {
500290001Sglebius		/* Test 1 */
501290001Sglebius		{
502290001Sglebius			TEST_INPUT("abc"),
503290001Sglebius			"0xCB00753F45A35E8BB5A03D699AC65007272C32AB0EDED1"
504290001Sglebius				"631A8B605A43FF5BED8086072BA1E7CC2358BAEC"
505290001Sglebius				"A134C825A7",
506290001Sglebius			1
507290001Sglebius		},
508290001Sglebius		/* Test 2 */
509290001Sglebius		{
510290001Sglebius			TEST_INPUT("abcdefghbcdefghicdefghijdefghijkefghijkl"
511290001Sglebius				   "fghijklmghijklmnhijklmnoijklmnopjklmnopq"
512290001Sglebius				   "klmnopqrlmnopqrsmnopqrstnopqrstu"),
513290001Sglebius			"0x09330C33F71147E83D192FC782CD1B4753111B173B3B05"
514290001Sglebius				"D22FA08086E3B0F712FCC7C71A557E2DB966C3E9"
515290001Sglebius				"FA91746039",
516290001Sglebius			1
517290001Sglebius		},
518290001Sglebius		/* Test 3 */
519290001Sglebius		{
520290001Sglebius			TEST_INPUT("a"),
521290001Sglebius			"0x9D0E1809716474CB086E834E310A4A1CED149E9C00F248"
522290001Sglebius				"527972CEC5704C2A5B07B8B3DC38ECC4EBAE97DD"
523290001Sglebius				"D87F3D8985",
524290001Sglebius			1000000
525290001Sglebius		},
526290001Sglebius		/* Test 4 */
527290001Sglebius		{
528290001Sglebius			TEST_INPUT("01234567012345670123456701234567"),
529290001Sglebius			"0x2FC64A4F500DDB6828F6A3430B8DD72A368EB7F3A8322A"
530290001Sglebius				"70BC84275B9C0B3AB00D27A5CC3C2D224AA6B61A"
531290001Sglebius				"0D79FB4596",
532290001Sglebius			20
533290001Sglebius		},
534290001Sglebius#if 0
535290001Sglebius		/* Test 5 -- unimplemented optional functionality */
536290001Sglebius		{
537290001Sglebius			TEST_INPUT(""),
538290001Sglebius			"0xXXX",
539290001Sglebius			1
540290001Sglebius		},
541290001Sglebius#endif
542290001Sglebius		/* Test 6 */
543290001Sglebius		{ TEST_INPUT("\xb9"),
544290001Sglebius			"0xBC8089A19007C0B14195F4ECC74094FEC64F01F9092928"
545290001Sglebius				"2C2FB392881578208AD466828B1C6C283D2722CF"
546290001Sglebius				"0AD1AB6938",
547290001Sglebius			1
548290001Sglebius		},
549290001Sglebius#if 0
550290001Sglebius		/* Test 7 -- unimplemented optional functionality */
551290001Sglebius		{
552290001Sglebius			TEST_INPUT(""),
553290001Sglebius			"0xXXX",
554290001Sglebius			1
555290001Sglebius		},
556290001Sglebius#endif
557290001Sglebius		/* Test 8 */
558290001Sglebius		{
559290001Sglebius			TEST_INPUT("\xa4\x1c\x49\x77\x79\xc0\x37\x5f\xf1"
560290001Sglebius				   "\x0a\x7f\x4e\x08\x59\x17\x39"),
561290001Sglebius			"0xC9A68443A005812256B8EC76B00516F0DBB74FAB26D665"
562290001Sglebius				"913F194B6FFB0E91EA9967566B58109CBC675CC2"
563290001Sglebius				"08E4C823F7",
564290001Sglebius			1
565290001Sglebius		},
566290001Sglebius#if 0
567290001Sglebius		/* Test 9 -- unimplemented optional functionality */
568290001Sglebius		{
569290001Sglebius			TEST_INPUT(""),
570290001Sglebius			"0xXXX",
571290001Sglebius			1
572290001Sglebius		},
573290001Sglebius#endif
574290001Sglebius		/* Test 10 */
575290001Sglebius		{
576290001Sglebius			TEST_INPUT("\x39\x96\x69\xe2\x8f\x6b\x9c\x6d\xbc\xbb"
577290001Sglebius				   "\x69\x12\xec\x10\xff\xcf\x74\x79\x03\x49"
578290001Sglebius				   "\xb7\xdc\x8f\xbe\x4a\x8e\x7b\x3b\x56\x21"
579290001Sglebius				   "\xdb\x0f\x3e\x7d\xc8\x7f\x82\x32\x64\xbb"
580290001Sglebius				   "\xe4\x0d\x18\x11\xc9\xea\x20\x61\xe1\xc8"
581290001Sglebius				   "\x4a\xd1\x0a\x23\xfa\xc1\x72\x7e\x72\x02"
582290001Sglebius				   "\xfc\x3f\x50\x42\xe6\xbf\x58\xcb\xa8\xa2"
583290001Sglebius				   "\x74\x6e\x1f\x64\xf9\xb9\xea\x35\x2c\x71"
584290001Sglebius				   "\x15\x07\x05\x3c\xf4\xe5\x33\x9d\x52\x86"
585290001Sglebius				   "\x5f\x25\xcc\x22\xb5\xe8\x77\x84\xa1\x2f"
586290001Sglebius				   "\xc9\x61\xd6\x6c\xb6\xe8\x95\x73\x19\x9a"
587290001Sglebius				   "\x2c\xe6\x56\x5c\xbd\xf1\x3d\xca\x40\x38"
588290001Sglebius				   "\x32\xcf\xcb\x0e\x8b\x72\x11\xe8\x3a\xf3"
589290001Sglebius				   "\x2a\x11\xac\x17\x92\x9f\xf1\xc0\x73\xa5"
590290001Sglebius				   "\x1c\xc0\x27\xaa\xed\xef\xf8\x5a\xad\x7c"
591290001Sglebius				   "\x2b\x7c\x5a\x80\x3e\x24\x04\xd9\x6d\x2a"
592290001Sglebius				   "\x77\x35\x7b\xda\x1a\x6d\xae\xed\x17\x15"
593290001Sglebius				   "\x1c\xb9\xbc\x51\x25\xa4\x22\xe9\x41\xde"
594290001Sglebius				   "\x0c\xa0\xfc\x50\x11\xc2\x3e\xcf\xfe\xfd"
595290001Sglebius				   "\xd0\x96\x76\x71\x1c\xf3\xdb\x0a\x34\x40"
596290001Sglebius				   "\x72\x0e\x16\x15\xc1\xf2\x2f\xbc\x3c\x72"
597290001Sglebius				   "\x1d\xe5\x21\xe1\xb9\x9b\xa1\xbd\x55\x77"
598290001Sglebius				   "\x40\x86\x42\x14\x7e\xd0\x96"),
599290001Sglebius			"0x4F440DB1E6EDD2899FA335F09515AA025EE177A79F4B4A"
600290001Sglebius				"AF38E42B5C4DE660F5DE8FB2A5B2FBD2A3CBFFD2"
601290001Sglebius				"0CFF1288C0",
602290001Sglebius			1
603290001Sglebius		},
604290001Sglebius		{ NULL, 0, NULL, 1 }
605290001Sglebius	};
606290001Sglebius
607290001Sglebius	hash_testcase_t *testcase = testcases;
608290001Sglebius
609290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
610290001Sglebius		isc_sha384_init(&sha384);
611290001Sglebius		for(i = 0; i < testcase->repeats; i++) {
612290001Sglebius			isc_sha384_update(&sha384,
613290001Sglebius					  (const isc_uint8_t *) testcase->input,
614290001Sglebius					  testcase->input_len);
615290001Sglebius		}
616290001Sglebius		isc_sha384_final(digest, &sha384);
617290001Sglebius		/*
618290001Sglebius		*API inconsistency BUG HERE
619290001Sglebius		* in order to be consistant with the other isc_hash_final
620290001Sglebius		* functions the call should be
621290001Sglebius		* isc_sha224_final(&sha224, digest);
622290001Sglebius		 */
623290001Sglebius		tohexstr(digest, ISC_SHA384_DIGESTLENGTH, str);
624290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
625290001Sglebius
626290001Sglebius		testcase++;
627290001Sglebius	}
628290001Sglebius
629290001Sglebius}
630290001Sglebius
631290001SglebiusATF_TC(isc_sha512);
632290001SglebiusATF_TC_HEAD(isc_sha512, tc) {
633290001Sglebius	atf_tc_set_md_var(tc, "descr", "sha224 examples from RFC4634");
634290001Sglebius}
635290001SglebiusATF_TC_BODY(isc_sha512, tc) {
636290001Sglebius	isc_sha512_t sha512;
637290001Sglebius
638290001Sglebius	UNUSED(tc);
639290001Sglebius
640290001Sglebius	/*
641290001Sglebius	 * These are the various test vectors.  All of these are passed
642290001Sglebius	 * through the hash function and the results are compared to the
643290001Sglebius	 * result specified here.
644290001Sglebius	 */
645290001Sglebius	hash_testcase_t testcases[] = {
646290001Sglebius		/* Test 1 */
647290001Sglebius		{
648290001Sglebius			TEST_INPUT("abc"),
649290001Sglebius			"0xDDAF35A193617ABACC417349AE20413112E6FA4E89A97E"
650290001Sglebius				"A20A9EEEE64B55D39A2192992A274FC1A836BA3C"
651290001Sglebius				"23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F",
652290001Sglebius			1
653290001Sglebius		},
654290001Sglebius		/* Test 2 */
655290001Sglebius		{
656290001Sglebius			TEST_INPUT("abcdefghbcdefghicdefghijdefghijkefghijkl"
657290001Sglebius				   "fghijklmghijklmnhijklmnoijklmnopjklmnopq"
658290001Sglebius				   "klmnopqrlmnopqrsmnopqrstnopqrstu"),
659290001Sglebius			"0x8E959B75DAE313DA8CF4F72814FC143F8F7779C6EB9F7F"
660290001Sglebius				"A17299AEADB6889018501D289E4900F7E4331B99"
661290001Sglebius				"DEC4B5433AC7D329EEB6DD26545E96E55B874BE909",
662290001Sglebius			1
663290001Sglebius		},
664290001Sglebius		/* Test 3 */
665290001Sglebius		{
666290001Sglebius			TEST_INPUT("a"),
667290001Sglebius			"0xE718483D0CE769644E2E42C7BC15B4638E1F98B13B2044"
668290001Sglebius				"285632A803AFA973EBDE0FF244877EA60A4CB043"
669290001Sglebius				"2CE577C31BEB009C5C2C49AA2E4EADB217AD8CC09B",
670290001Sglebius			1000000
671290001Sglebius		},
672290001Sglebius		/* Test 4 */
673290001Sglebius		{
674290001Sglebius			TEST_INPUT("01234567012345670123456701234567"),
675290001Sglebius			"0x89D05BA632C699C31231DED4FFC127D5A894DAD412C0E0"
676290001Sglebius				"24DB872D1ABD2BA8141A0F85072A9BE1E2AA04CF"
677290001Sglebius				"33C765CB510813A39CD5A84C4ACAA64D3F3FB7BAE9",
678290001Sglebius			20
679290001Sglebius		},
680290001Sglebius#if 0
681290001Sglebius		/* Test 5 -- unimplemented optional functionality */
682290001Sglebius		{
683290001Sglebius			TEST_INPUT(""),
684290001Sglebius			"0xXXX",
685290001Sglebius			1
686290001Sglebius		},
687290001Sglebius#endif
688290001Sglebius		/* Test 6 */
689290001Sglebius		{
690290001Sglebius			TEST_INPUT("\xD0"),
691290001Sglebius			"0x9992202938E882E73E20F6B69E68A0A7149090423D93C8"
692290001Sglebius				"1BAB3F21678D4ACEEEE50E4E8CAFADA4C85A54EA"
693290001Sglebius				"8306826C4AD6E74CECE9631BFA8A549B4AB3FBBA15",
694290001Sglebius			1
695290001Sglebius		},
696290001Sglebius#if 0
697290001Sglebius		/* Test 7 -- unimplemented optional functionality */
698290001Sglebius		{
699290001Sglebius			TEST_INPUT(""),
700290001Sglebius			"0xXXX",
701290001Sglebius			1
702290001Sglebius		},
703290001Sglebius#endif
704290001Sglebius		/* Test 8 */
705290001Sglebius		{
706290001Sglebius			TEST_INPUT("\x8d\x4e\x3c\x0e\x38\x89\x19\x14\x91\x81"
707290001Sglebius				   "\x6e\x9d\x98\xbf\xf0\xa0"),
708290001Sglebius			"0xCB0B67A4B8712CD73C9AABC0B199E9269B20844AFB75AC"
709290001Sglebius				"BDD1C153C9828924C3DDEDAAFE669C5FDD0BC66F"
710290001Sglebius				"630F6773988213EB1B16F517AD0DE4B2F0C95C90F8",
711290001Sglebius			1
712290001Sglebius		},
713290001Sglebius#if 0
714290001Sglebius		/* Test 9 -- unimplemented optional functionality */
715290001Sglebius		{
716290001Sglebius			TEST_INPUT(""),
717290001Sglebius			"0xXXX",
718290001Sglebius			1
719290001Sglebius		},
720290001Sglebius#endif
721290001Sglebius		/* Test 10 */
722290001Sglebius		{
723290001Sglebius			TEST_INPUT("\xa5\x5f\x20\xc4\x11\xaa\xd1\x32\x80\x7a"
724290001Sglebius				   "\x50\x2d\x65\x82\x4e\x31\xa2\x30\x54\x32"
725290001Sglebius				   "\xaa\x3d\x06\xd3\xe2\x82\xa8\xd8\x4e\x0d"
726290001Sglebius				   "\xe1\xde\x69\x74\xbf\x49\x54\x69\xfc\x7f"
727290001Sglebius				   "\x33\x8f\x80\x54\xd5\x8c\x26\xc4\x93\x60"
728290001Sglebius				   "\xc3\xe8\x7a\xf5\x65\x23\xac\xf6\xd8\x9d"
729290001Sglebius				   "\x03\xe5\x6f\xf2\xf8\x68\x00\x2b\xc3\xe4"
730290001Sglebius				   "\x31\xed\xc4\x4d\xf2\xf0\x22\x3d\x4b\xb3"
731290001Sglebius				   "\xb2\x43\x58\x6e\x1a\x7d\x92\x49\x36\x69"
732290001Sglebius				   "\x4f\xcb\xba\xf8\x8d\x95\x19\xe4\xeb\x50"
733290001Sglebius				   "\xa6\x44\xf8\xe4\xf9\x5e\xb0\xea\x95\xbc"
734290001Sglebius				   "\x44\x65\xc8\x82\x1a\xac\xd2\xfe\x15\xab"
735290001Sglebius				   "\x49\x81\x16\x4b\xbb\x6d\xc3\x2f\x96\x90"
736290001Sglebius				   "\x87\xa1\x45\xb0\xd9\xcc\x9c\x67\xc2\x2b"
737290001Sglebius				   "\x76\x32\x99\x41\x9c\xc4\x12\x8b\xe9\xa0"
738290001Sglebius				   "\x77\xb3\xac\xe6\x34\x06\x4e\x6d\x99\x28"
739290001Sglebius				   "\x35\x13\xdc\x06\xe7\x51\x5d\x0d\x73\x13"
740290001Sglebius				   "\x2e\x9a\x0d\xc6\xd3\xb1\xf8\xb2\x46\xf1"
741290001Sglebius				   "\xa9\x8a\x3f\xc7\x29\x41\xb1\xe3\xbb\x20"
742290001Sglebius				   "\x98\xe8\xbf\x16\xf2\x68\xd6\x4f\x0b\x0f"
743290001Sglebius				   "\x47\x07\xfe\x1e\xa1\xa1\x79\x1b\xa2\xf3"
744290001Sglebius				   "\xc0\xc7\x58\xe5\xf5\x51\x86\x3a\x96\xc9"
745290001Sglebius				   "\x49\xad\x47\xd7\xfb\x40\xd2"),
746290001Sglebius		  "0xC665BEFB36DA189D78822D10528CBF3B12B3EEF7260399"
747290001Sglebius			  "09C1A16A270D48719377966B957A878E72058477"
748290001Sglebius			  "9A62825C18DA26415E49A7176A894E7510FD1451F5",
749290001Sglebius		  1
750290001Sglebius		},
751290001Sglebius		{ NULL, 0, NULL, 1 }
752290001Sglebius	};
753290001Sglebius
754290001Sglebius	hash_testcase_t *testcase = testcases;
755290001Sglebius
756290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
757290001Sglebius		isc_sha512_init(&sha512);
758290001Sglebius		for(i = 0; i < testcase->repeats; i++) {
759290001Sglebius			isc_sha512_update(&sha512,
760290001Sglebius					  (const isc_uint8_t *) testcase->input,
761290001Sglebius					  testcase->input_len);
762290001Sglebius		}
763290001Sglebius		isc_sha512_final(digest, &sha512);
764290001Sglebius		/*
765290001Sglebius		*API inconsistency BUG HERE
766290001Sglebius		* in order to be consistant with the other isc_hash_final
767290001Sglebius		* functions the call should be
768290001Sglebius		* isc_sha224_final(&sha224, digest);
769290001Sglebius		 */
770290001Sglebius		tohexstr(digest, ISC_SHA512_DIGESTLENGTH, str);
771290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
772290001Sglebius
773290001Sglebius		testcase++;
774290001Sglebius	}
775290001Sglebius
776290001Sglebius}
777290001Sglebius
778290001SglebiusATF_TC(isc_md5);
779290001SglebiusATF_TC_HEAD(isc_md5, tc) {
780290001Sglebius	atf_tc_set_md_var(tc, "descr", "md5 example from RFC1321");
781290001Sglebius}
782290001SglebiusATF_TC_BODY(isc_md5, tc) {
783290001Sglebius	isc_md5_t md5;
784290001Sglebius
785290001Sglebius	UNUSED(tc);
786290001Sglebius
787290001Sglebius	/*
788290001Sglebius	 * These are the various test vectors.  All of these are passed
789290001Sglebius	 * through the hash function and the results are compared to the
790290001Sglebius	 * result specified here.
791290001Sglebius	 */
792290001Sglebius	hash_testcase_t testcases[] = {
793290001Sglebius		{
794290001Sglebius			TEST_INPUT(""),
795290001Sglebius			"0xD41D8CD98F00B204E9800998ECF8427E",
796290001Sglebius			1
797290001Sglebius		},
798290001Sglebius		{
799290001Sglebius			TEST_INPUT("a"),
800290001Sglebius			"0x0CC175B9C0F1B6A831C399E269772661",
801290001Sglebius			1
802290001Sglebius		},
803290001Sglebius		{
804290001Sglebius			TEST_INPUT("abc"),
805290001Sglebius			"0x900150983CD24FB0D6963F7D28E17F72",
806290001Sglebius			1
807290001Sglebius		},
808290001Sglebius		{
809290001Sglebius			TEST_INPUT("message digest"),
810290001Sglebius			"0xF96B697D7CB7938D525A2F31AAF161D0",
811290001Sglebius			1
812290001Sglebius		},
813290001Sglebius		{
814290001Sglebius			TEST_INPUT("abcdefghijklmnopqrstuvwxyz"),
815290001Sglebius			"0xC3FCD3D76192E4007DFB496CCA67E13B",
816290001Sglebius			1
817290001Sglebius		},
818290001Sglebius		{
819290001Sglebius			TEST_INPUT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm"
820290001Sglebius				   "nopqrstuvwxyz0123456789"),
821290001Sglebius			"0xD174AB98D277D9F5A5611C2C9F419D9F",
822290001Sglebius			1
823290001Sglebius		},
824290001Sglebius		{
825290001Sglebius			TEST_INPUT("123456789012345678901234567890123456789"
826290001Sglebius				   "01234567890123456789012345678901234567890"),
827290001Sglebius			"0x57EDF4A22BE3C955AC49DA2E2107B67A",
828290001Sglebius			1
829290001Sglebius		},
830290001Sglebius		{ NULL, 0, NULL, 1 }
831290001Sglebius	};
832290001Sglebius
833290001Sglebius	hash_testcase_t *testcase = testcases;
834290001Sglebius
835290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
836290001Sglebius		isc_md5_init(&md5);
837290001Sglebius		for(i = 0; i < testcase->repeats; i++) {
838290001Sglebius			isc_md5_update(&md5,
839290001Sglebius				       (const isc_uint8_t *) testcase->input,
840290001Sglebius				       testcase->input_len);
841290001Sglebius		}
842290001Sglebius		isc_md5_final(&md5, digest);
843290001Sglebius		tohexstr(digest, ISC_MD5_DIGESTLENGTH, str);
844290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
845290001Sglebius
846290001Sglebius		testcase++;
847290001Sglebius	}
848290001Sglebius}
849290001Sglebius
850290001Sglebius/* HMAC-SHA1 test */
851290001SglebiusATF_TC(isc_hmacsha1);
852290001SglebiusATF_TC_HEAD(isc_hmacsha1, tc) {
853290001Sglebius	atf_tc_set_md_var(tc, "descr", "HMAC-SHA1 examples from RFC2104");
854290001Sglebius}
855290001SglebiusATF_TC_BODY(isc_hmacsha1, tc) {
856290001Sglebius	isc_hmacsha1_t hmacsha1;
857290001Sglebius
858290001Sglebius	UNUSED(tc);
859290001Sglebius	/*
860290001Sglebius	 * These are the various test vectors.  All of these are passed
861290001Sglebius	 * through the hash function and the results are compared to the
862290001Sglebius	 * result specified here.
863290001Sglebius	 */
864290001Sglebius	hash_testcase_t testcases[] = {
865290001Sglebius		/* Test 1 */
866290001Sglebius		{
867290001Sglebius			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
868290001Sglebius			"0xB617318655057264E28BC0B6FB378C8EF146BE00",
869290001Sglebius			1
870290001Sglebius		},
871290001Sglebius		/* Test 2 */
872290001Sglebius		{
873290001Sglebius			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
874290001Sglebius				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
875290001Sglebius				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
876290001Sglebius			"0xEFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79",
877290001Sglebius			1
878290001Sglebius		},
879290001Sglebius		/* Test 3 */
880290001Sglebius		{
881290001Sglebius			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
882290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
883290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
884290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
885290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
886290001Sglebius			"0x125D7342B9AC11CD91A39AF48AA17B4F63F175D3",
887290001Sglebius			1
888290001Sglebius		},
889290001Sglebius		/* Test 4 */
890290001Sglebius		{
891290001Sglebius			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
892290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
893290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
894290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
895290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
896290001Sglebius			"0x4C9007F4026250C6BC8414F9BF50C86C2D7235DA",
897290001Sglebius			1
898290001Sglebius		},
899290001Sglebius#if 0
900290001Sglebius		/* Test 5 -- unimplemented optional functionality */
901290001Sglebius		{
902290001Sglebius			TEST_INPUT("Test With Truncation"),
903290001Sglebius			"0x4C1A03424B55E07FE7F27BE1",
904290001Sglebius			1
905290001Sglebius		},
906290001Sglebius#endif
907290001Sglebius		/* Test 6 */
908290001Sglebius		{
909290001Sglebius			TEST_INPUT("Test Using Larger Than Block-Size Key - "
910290001Sglebius				   "Hash Key First"),
911290001Sglebius			"0xAA4AE5E15272D00E95705637CE8A3B55ED402112", 1 },
912290001Sglebius		/* Test 7 */
913290001Sglebius		{
914290001Sglebius			TEST_INPUT("Test Using Larger Than Block-Size Key and "
915290001Sglebius				   "Larger Than One Block-Size Data"),
916290001Sglebius			"0xE8E99D0F45237D786D6BBAA7965C7808BBFF1A91",
917290001Sglebius			1
918290001Sglebius		},
919290001Sglebius		{ NULL, 0, NULL, 1 }
920290001Sglebius	};
921290001Sglebius
922290001Sglebius	hash_testcase_t *testcase = testcases;
923290001Sglebius
924290001Sglebius	hash_test_key_t test_keys[] = {
925290001Sglebius		/* Key 1 */
926290001Sglebius		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
927290001Sglebius		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
928290001Sglebius		/* Key 2 */
929290001Sglebius		{ "Jefe", 4 },
930290001Sglebius		/* Key 3 */
931290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
932290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
933290001Sglebius		/* Key 4 */
934290001Sglebius		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
935290001Sglebius		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
936290001Sglebius		  "\x15\x16\x17\x18\x19", 25 },
937290001Sglebius#if 0
938290001Sglebius		/* Key 5 */
939290001Sglebius		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
940290001Sglebius		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
941290001Sglebius#endif
942290001Sglebius		/* Key 6 */
943290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
944290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
945290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
946290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
947290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
948290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
949290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
950290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 80 },
951290001Sglebius		/* Key 7 */
952290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
953290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
954290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
955290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
956290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
957290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
958290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
959290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 80 },
960290001Sglebius		{ "", 0 }
961290001Sglebius	};
962290001Sglebius
963290001Sglebius	hash_test_key_t *test_key = test_keys;
964290001Sglebius
965290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
966290001Sglebius		memcpy(buffer, test_key->key, test_key->len);
967290001Sglebius		isc_hmacsha1_init(&hmacsha1, buffer, test_key->len);
968290001Sglebius		isc_hmacsha1_update(&hmacsha1,
969290001Sglebius				    (const isc_uint8_t *) testcase->input,
970290001Sglebius				    testcase->input_len);
971290001Sglebius		isc_hmacsha1_sign(&hmacsha1, digest, ISC_SHA1_DIGESTLENGTH);
972290001Sglebius		tohexstr(digest, ISC_SHA1_DIGESTLENGTH, str);
973290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
974290001Sglebius
975290001Sglebius		testcase++;
976290001Sglebius		test_key++;
977290001Sglebius	}
978290001Sglebius}
979290001Sglebius
980290001Sglebius/* HMAC-SHA224 test */
981290001SglebiusATF_TC(isc_hmacsha224);
982290001SglebiusATF_TC_HEAD(isc_hmacsha224, tc) {
983290001Sglebius	atf_tc_set_md_var(tc, "descr", "HMAC-SHA224 examples from RFC4634");
984290001Sglebius}
985290001SglebiusATF_TC_BODY(isc_hmacsha224, tc) {
986290001Sglebius	isc_hmacsha224_t hmacsha224;
987290001Sglebius
988290001Sglebius	UNUSED(tc);
989290001Sglebius
990290001Sglebius	/*
991290001Sglebius	 * These are the various test vectors.  All of these are passed
992290001Sglebius	 * through the hash function and the results are compared to the
993290001Sglebius	 * result specified here.
994290001Sglebius	 */
995290001Sglebius	hash_testcase_t testcases[] = {
996290001Sglebius		/* Test 1 */
997290001Sglebius		{
998290001Sglebius			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
999290001Sglebius			"0x896FB1128ABBDF196832107CD49DF33F47B4B1169912BA"
1000290001Sglebius				"4F53684B22",
1001290001Sglebius			1
1002290001Sglebius		},
1003290001Sglebius		/* Test 2 */
1004290001Sglebius		{
1005290001Sglebius			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1006290001Sglebius				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1007290001Sglebius				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1008290001Sglebius			"0xA30E01098BC6DBBF45690F3A7E9E6D0F8BBEA2A39E61480"
1009290001Sglebius				"08FD05E44",
1010290001Sglebius			1
1011290001Sglebius		},
1012290001Sglebius		/* Test 3 */
1013290001Sglebius		{
1014290001Sglebius			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1015290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1016290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1017290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1018290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1019290001Sglebius			"0x7FB3CB3588C6C1F6FFA9694D7D6AD2649365B0C1F65D69"
1020290001Sglebius				"D1EC8333EA",
1021290001Sglebius			1
1022290001Sglebius		},
1023290001Sglebius		/* Test 4 */
1024290001Sglebius		{
1025290001Sglebius			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1026290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1027290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1028290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1029290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1030290001Sglebius			"0x6C11506874013CAC6A2ABC1BB382627CEC6A90D86EFC01"
1031290001Sglebius				"2DE7AFEC5A",
1032290001Sglebius			1
1033290001Sglebius		},
1034290001Sglebius#if 0
1035290001Sglebius		/* Test 5 -- unimplemented optional functionality */
1036290001Sglebius		{
1037290001Sglebius			TEST_INPUT("Test With Truncation"),
1038290001Sglebius			"0x4C1A03424B55E07FE7F27BE1",
1039290001Sglebius			1
1040290001Sglebius		},
1041290001Sglebius#endif
1042290001Sglebius		/* Test 6 */
1043290001Sglebius		{
1044290001Sglebius			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1045290001Sglebius				   "Hash Key First"),
1046290001Sglebius			"0x95E9A0DB962095ADAEBE9B2D6F0DBCE2D499F112F2D2B7"
1047290001Sglebius				"273FA6870E",
1048290001Sglebius			1
1049290001Sglebius		},
1050290001Sglebius		/* Test 7 */
1051290001Sglebius		{
1052290001Sglebius			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1053290001Sglebius				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1054290001Sglebius				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1055290001Sglebius				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1056290001Sglebius				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1057290001Sglebius				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1058290001Sglebius				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1059290001Sglebius				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1060290001Sglebius				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1061290001Sglebius				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1062290001Sglebius				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1063290001Sglebius				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1064290001Sglebius				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1065290001Sglebius				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1066290001Sglebius				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1067290001Sglebius				   "\x6d\x2e"),
1068290001Sglebius			"0x3A854166AC5D9F023F54D517D0B39DBD946770DB9C2B95"
1069290001Sglebius				"C9F6F565D1",
1070290001Sglebius			1
1071290001Sglebius		},
1072290001Sglebius		{ NULL, 0, NULL, 1 }
1073290001Sglebius	};
1074290001Sglebius
1075290001Sglebius	hash_testcase_t *testcase = testcases;
1076290001Sglebius
1077290001Sglebius	hash_test_key_t test_keys[] = {
1078290001Sglebius		/* Key 1 */
1079290001Sglebius		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1080290001Sglebius		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1081290001Sglebius		/* Key 2 */
1082290001Sglebius		{ "Jefe", 4 },
1083290001Sglebius		/* Key 3 */
1084290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1085290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1086290001Sglebius		/* Key 4 */
1087290001Sglebius		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1088290001Sglebius		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1089290001Sglebius		  "\x15\x16\x17\x18\x19", 25 },
1090290001Sglebius#if 0
1091290001Sglebius		/* Key 5 */
1092290001Sglebius		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1093290001Sglebius		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1094290001Sglebius#endif
1095290001Sglebius		/* Key 6 */
1096290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1097290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1098290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1099290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1100290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1101290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1102290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1103290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1104290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1105290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1106290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1107290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1108290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1109290001Sglebius		/* Key 7 */
1110290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1111290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1112290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1113290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1114290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1115290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1116290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1117290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1118290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1119290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1120290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1121290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1122290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1123290001Sglebius		{ "", 0 }
1124290001Sglebius	};
1125290001Sglebius
1126290001Sglebius	hash_test_key_t *test_key = test_keys;
1127290001Sglebius
1128290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
1129290001Sglebius		memcpy(buffer, test_key->key, test_key->len);
1130290001Sglebius		isc_hmacsha224_init(&hmacsha224, buffer, test_key->len);
1131290001Sglebius		isc_hmacsha224_update(&hmacsha224,
1132290001Sglebius				      (const isc_uint8_t *) testcase->input,
1133290001Sglebius				      testcase->input_len);
1134290001Sglebius		isc_hmacsha224_sign(&hmacsha224, digest, ISC_SHA224_DIGESTLENGTH);
1135290001Sglebius		tohexstr(digest, ISC_SHA224_DIGESTLENGTH, str);
1136290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
1137290001Sglebius
1138290001Sglebius		testcase++;
1139290001Sglebius		test_key++;
1140290001Sglebius	}
1141290001Sglebius}
1142290001Sglebius
1143290001Sglebius/* HMAC-SHA256 test */
1144290001SglebiusATF_TC(isc_hmacsha256);
1145290001SglebiusATF_TC_HEAD(isc_hmacsha256, tc) {
1146290001Sglebius	atf_tc_set_md_var(tc, "descr", "HMAC-SHA256 examples from RFC4634");
1147290001Sglebius}
1148290001SglebiusATF_TC_BODY(isc_hmacsha256, tc) {
1149290001Sglebius	isc_hmacsha256_t hmacsha256;
1150290001Sglebius
1151290001Sglebius	UNUSED(tc);
1152290001Sglebius
1153290001Sglebius	/*
1154290001Sglebius	 * These are the various test vectors.  All of these are passed
1155290001Sglebius	 * through the hash function and the results are compared to the
1156290001Sglebius	 * result specified here.
1157290001Sglebius	 */
1158290001Sglebius	hash_testcase_t testcases[] = {
1159290001Sglebius		/* Test 1 */
1160290001Sglebius		{
1161290001Sglebius			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1162290001Sglebius			"0xB0344C61D8DB38535CA8AFCEAF0BF12B881DC200C9833D"
1163290001Sglebius				"A726E9376C2E32CFF7",
1164290001Sglebius			1
1165290001Sglebius		},
1166290001Sglebius		/* Test 2 */
1167290001Sglebius		{
1168290001Sglebius			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1169290001Sglebius				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1170290001Sglebius				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1171290001Sglebius			"0x5BDCC146BF60754E6A042426089575C75A003F089D2739"
1172290001Sglebius				"839DEC58B964EC3843",
1173290001Sglebius			1
1174290001Sglebius		},
1175290001Sglebius		/* Test 3 */
1176290001Sglebius		{
1177290001Sglebius			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1178290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1179290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1180290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1181290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1182290001Sglebius			"0x773EA91E36800E46854DB8EBD09181A72959098B3EF8C1"
1183290001Sglebius				"22D9635514CED565FE",
1184290001Sglebius			1
1185290001Sglebius		},
1186290001Sglebius		/* Test 4 */
1187290001Sglebius		{
1188290001Sglebius			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1189290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1190290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1191290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1192290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1193290001Sglebius			"0x82558A389A443C0EA4CC819899F2083A85F0FAA3E578F8"
1194290001Sglebius				"077A2E3FF46729665B",
1195290001Sglebius			1
1196290001Sglebius		},
1197290001Sglebius#if 0
1198290001Sglebius		/* Test 5 -- unimplemented optional functionality */
1199290001Sglebius		{
1200290001Sglebius			TEST_INPUT("Test With Truncation"),
1201290001Sglebius			"0x4C1A03424B55E07FE7F27BE1",
1202290001Sglebius			1
1203290001Sglebius		},
1204290001Sglebius#endif
1205290001Sglebius		/* Test 6 */
1206290001Sglebius		{
1207290001Sglebius			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1208290001Sglebius				   "Hash Key First"),
1209290001Sglebius			"0x60E431591EE0B67F0D8A26AACBF5B77F8E0BC6213728C5"
1210290001Sglebius				"140546040F0EE37F54",
1211290001Sglebius			1
1212290001Sglebius		},
1213290001Sglebius		/* Test 7 */
1214290001Sglebius		{
1215290001Sglebius			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1216290001Sglebius				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1217290001Sglebius				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1218290001Sglebius				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1219290001Sglebius				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1220290001Sglebius				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1221290001Sglebius				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1222290001Sglebius				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1223290001Sglebius				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1224290001Sglebius				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1225290001Sglebius				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1226290001Sglebius				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1227290001Sglebius				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1228290001Sglebius				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1229290001Sglebius				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1230290001Sglebius				   "\x6d\x2e"),
1231290001Sglebius			"0x9B09FFA71B942FCB27635FBCD5B0E944BFDC63644F0713"
1232290001Sglebius				"938A7F51535C3A35E2",
1233290001Sglebius			1
1234290001Sglebius		},
1235290001Sglebius		{ NULL, 0, NULL, 1 }
1236290001Sglebius	};
1237290001Sglebius
1238290001Sglebius	hash_testcase_t *testcase = testcases;
1239290001Sglebius
1240290001Sglebius	hash_test_key_t test_keys[] = {
1241290001Sglebius		/* Key 1 */
1242290001Sglebius		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1243290001Sglebius		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1244290001Sglebius		/* Key 2 */
1245290001Sglebius		{ "Jefe", 4 },
1246290001Sglebius		/* Key 3 */
1247290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1248290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1249290001Sglebius		/* Key 4 */
1250290001Sglebius		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1251290001Sglebius		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1252290001Sglebius		  "\x15\x16\x17\x18\x19", 25 },
1253290001Sglebius#if 0
1254290001Sglebius		/* Key 5 */
1255290001Sglebius		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1256290001Sglebius		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1257290001Sglebius#endif
1258290001Sglebius		/* Key 6 */
1259290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1260290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1261290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1262290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1263290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1264290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1265290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1266290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1267290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1268290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1269290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1270290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1271290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1272290001Sglebius		/* Key 7 */
1273290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1274290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1275290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1276290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1277290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1278290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1279290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1280290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1281290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1282290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1283290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1284290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1285290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1286290001Sglebius		{ "", 0 }
1287290001Sglebius	};
1288290001Sglebius
1289290001Sglebius	hash_test_key_t *test_key = test_keys;
1290290001Sglebius
1291290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
1292290001Sglebius		memcpy(buffer, test_key->key, test_key->len);
1293290001Sglebius		isc_hmacsha256_init(&hmacsha256, buffer, test_key->len);
1294290001Sglebius		isc_hmacsha256_update(&hmacsha256,
1295290001Sglebius				      (const isc_uint8_t *) testcase->input,
1296290001Sglebius				      testcase->input_len);
1297290001Sglebius		isc_hmacsha256_sign(&hmacsha256, digest, ISC_SHA256_DIGESTLENGTH);
1298290001Sglebius		tohexstr(digest, ISC_SHA256_DIGESTLENGTH, str);
1299290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
1300290001Sglebius
1301290001Sglebius		testcase++;
1302290001Sglebius		test_key++;
1303290001Sglebius	}
1304290001Sglebius}
1305290001Sglebius
1306290001Sglebius/* HMAC-SHA384 test */
1307290001SglebiusATF_TC(isc_hmacsha384);
1308290001SglebiusATF_TC_HEAD(isc_hmacsha384, tc) {
1309290001Sglebius	atf_tc_set_md_var(tc, "descr", "HMAC-SHA384 examples from RFC4634");
1310290001Sglebius}
1311290001SglebiusATF_TC_BODY(isc_hmacsha384, tc) {
1312290001Sglebius	isc_hmacsha384_t hmacsha384;
1313290001Sglebius
1314290001Sglebius	UNUSED(tc);
1315290001Sglebius
1316290001Sglebius	/*
1317290001Sglebius	 * These are the various test vectors.  All of these are passed
1318290001Sglebius	 * through the hash function and the results are compared to the
1319290001Sglebius	 * result specified here.
1320290001Sglebius	 */
1321290001Sglebius	hash_testcase_t testcases[] = {
1322290001Sglebius		/* Test 1 */
1323290001Sglebius		{
1324290001Sglebius			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1325290001Sglebius			"0xAFD03944D84895626B0825F4AB46907F15F9DADBE4101E"
1326290001Sglebius				"C682AA034C7CEBC59CFAEA9EA9076EDE7F4AF152"
1327290001Sglebius				"E8B2FA9CB6",
1328290001Sglebius			1
1329290001Sglebius		},
1330290001Sglebius		/* Test 2 */
1331290001Sglebius		{
1332290001Sglebius			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1333290001Sglebius				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1334290001Sglebius				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1335290001Sglebius			"0xAF45D2E376484031617F78D2B58A6B1B9C7EF464F5A01B"
1336290001Sglebius				"47E42EC3736322445E8E2240CA5E69E2C78B3239"
1337290001Sglebius				"ECFAB21649",
1338290001Sglebius			1
1339290001Sglebius		},
1340290001Sglebius		/* Test 3 */
1341290001Sglebius		{
1342290001Sglebius			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1343290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1344290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1345290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1346290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1347290001Sglebius			"0x88062608D3E6AD8A0AA2ACE014C8A86F0AA635D947AC9F"
1348290001Sglebius				"EBE83EF4E55966144B2A5AB39DC13814B94E3AB6"
1349290001Sglebius				"E101A34F27",
1350290001Sglebius			1
1351290001Sglebius		},
1352290001Sglebius		/* Test 4 */
1353290001Sglebius		{
1354290001Sglebius			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1355290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1356290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1357290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1358290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1359290001Sglebius			"0x3E8A69B7783C25851933AB6290AF6CA77A998148085000"
1360290001Sglebius				"9CC5577C6E1F573B4E6801DD23C4A7D679CCF8A3"
1361290001Sglebius				"86C674CFFB",
1362290001Sglebius			1
1363290001Sglebius		},
1364290001Sglebius#if 0
1365290001Sglebius		/* Test 5 -- unimplemented optional functionality */
1366290001Sglebius		{
1367290001Sglebius			TEST_INPUT("Test With Truncation"),
1368290001Sglebius			"0x4C1A03424B55E07FE7F27BE1",
1369290001Sglebius			1
1370290001Sglebius		},
1371290001Sglebius#endif
1372290001Sglebius		/* Test 6 */
1373290001Sglebius		{
1374290001Sglebius			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1375290001Sglebius				   "Hash Key First"),
1376290001Sglebius			"0x4ECE084485813E9088D2C63A041BC5B44F9EF1012A2B58"
1377290001Sglebius				"8F3CD11F05033AC4C60C2EF6AB4030FE8296248D"
1378290001Sglebius				"F163F44952",
1379290001Sglebius			1
1380290001Sglebius		},
1381290001Sglebius		/* Test 7 */
1382290001Sglebius		{
1383290001Sglebius			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1384290001Sglebius				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1385290001Sglebius				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1386290001Sglebius				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1387290001Sglebius				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1388290001Sglebius				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1389290001Sglebius				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1390290001Sglebius				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1391290001Sglebius				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1392290001Sglebius				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1393290001Sglebius				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1394290001Sglebius				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1395290001Sglebius				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1396290001Sglebius				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1397290001Sglebius				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1398290001Sglebius				   "\x6d\x2e"),
1399290001Sglebius			"0x6617178E941F020D351E2F254E8FD32C602420FEB0B8FB"
1400290001Sglebius				"9ADCCEBB82461E99C5A678CC31E799176D3860E6"
1401290001Sglebius				"110C46523E",
1402290001Sglebius			1
1403290001Sglebius		},
1404290001Sglebius		{ NULL, 0, NULL, 1 }
1405290001Sglebius	};
1406290001Sglebius
1407290001Sglebius	hash_testcase_t *testcase = testcases;
1408290001Sglebius
1409290001Sglebius	hash_test_key_t test_keys[] = {
1410290001Sglebius		/* Key 1 */
1411290001Sglebius		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1412290001Sglebius		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1413290001Sglebius		/* Key 2 */
1414290001Sglebius		{ "Jefe", 4 },
1415290001Sglebius		/* Key 3 */
1416290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1417290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1418290001Sglebius		/* Key 4 */
1419290001Sglebius		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1420290001Sglebius		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1421290001Sglebius		  "\x15\x16\x17\x18\x19", 25 },
1422290001Sglebius#if 0
1423290001Sglebius		/* Key 5 */
1424290001Sglebius		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1425290001Sglebius		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1426290001Sglebius#endif
1427290001Sglebius		/* Key 6 */
1428290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1429290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1430290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1431290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1432290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1433290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1434290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1435290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1436290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1437290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1438290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1439290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1440290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1441290001Sglebius		/* Key 7 */
1442290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1443290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1444290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1445290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1446290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1447290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1448290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1449290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1450290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1451290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1452290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1453290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1454290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1455290001Sglebius		{ "", 0 }
1456290001Sglebius	};
1457290001Sglebius
1458290001Sglebius	hash_test_key_t *test_key = test_keys;
1459290001Sglebius
1460290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
1461290001Sglebius		memcpy(buffer, test_key->key, test_key->len);
1462290001Sglebius		isc_hmacsha384_init(&hmacsha384, buffer, test_key->len);
1463290001Sglebius		isc_hmacsha384_update(&hmacsha384,
1464290001Sglebius				      (const isc_uint8_t *) testcase->input,
1465290001Sglebius				      testcase->input_len);
1466290001Sglebius		isc_hmacsha384_sign(&hmacsha384, digest, ISC_SHA384_DIGESTLENGTH);
1467290001Sglebius		tohexstr(digest, ISC_SHA384_DIGESTLENGTH, str);
1468290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
1469290001Sglebius
1470290001Sglebius		testcase++;
1471290001Sglebius		test_key++;
1472290001Sglebius	}
1473290001Sglebius}
1474290001Sglebius
1475290001Sglebius/* HMAC-SHA512 test */
1476290001SglebiusATF_TC(isc_hmacsha512);
1477290001SglebiusATF_TC_HEAD(isc_hmacsha512, tc) {
1478290001Sglebius	atf_tc_set_md_var(tc, "descr", "HMAC-SHA512 examples from RFC4634");
1479290001Sglebius}
1480290001SglebiusATF_TC_BODY(isc_hmacsha512, tc) {
1481290001Sglebius	isc_hmacsha512_t hmacsha512;
1482290001Sglebius
1483290001Sglebius	UNUSED(tc);
1484290001Sglebius
1485290001Sglebius	/*
1486290001Sglebius	 * These are the various test vectors.  All of these are passed
1487290001Sglebius	 * through the hash function and the results are compared to the
1488290001Sglebius	 * result specified here.
1489290001Sglebius	 */
1490290001Sglebius	hash_testcase_t testcases[] = {
1491290001Sglebius		/* Test 1 */
1492290001Sglebius		{
1493290001Sglebius			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1494290001Sglebius			"0x87AA7CDEA5EF619D4FF0B4241A1D6CB02379F4E2CE4EC2"
1495290001Sglebius				"787AD0B30545E17CDEDAA833B7D6B8A702038B27"
1496290001Sglebius				"4EAEA3F4E4BE9D914EEB61F1702E696C203A126854",
1497290001Sglebius			1
1498290001Sglebius		},
1499290001Sglebius		/* Test 2 */
1500290001Sglebius		{
1501290001Sglebius			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61"
1502290001Sglebius				   "\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20"
1503290001Sglebius				   "\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1504290001Sglebius			"0x164B7A7BFCF819E2E395FBE73B56E0A387BD64222E831F"
1505290001Sglebius				"D610270CD7EA2505549758BF75C05A994A6D034F"
1506290001Sglebius				"65F8F0E6FDCAEAB1A34D4A6B4B636E070A38BCE737",
1507290001Sglebius			1
1508290001Sglebius		},
1509290001Sglebius		/* Test 3 */
1510290001Sglebius		{
1511290001Sglebius			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1512290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1513290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1514290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1515290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1516290001Sglebius			"0xFA73B0089D56A284EFB0F0756C890BE9B1B5DBDD8EE81A"
1517290001Sglebius				"3655F83E33B2279D39BF3E848279A722C806B485"
1518290001Sglebius				"A47E67C807B946A337BEE8942674278859E13292FB",
1519290001Sglebius			1
1520290001Sglebius		},
1521290001Sglebius		/* Test 4 */
1522290001Sglebius		{
1523290001Sglebius			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1524290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1525290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1526290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1527290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1528290001Sglebius			"0xB0BA465637458C6990E5A8C5F61D4AF7E576D97FF94B87"
1529290001Sglebius				"2DE76F8050361EE3DBA91CA5C11AA25EB4D67927"
1530290001Sglebius				"5CC5788063A5F19741120C4F2DE2ADEBEB10A298DD",
1531290001Sglebius			1
1532290001Sglebius		},
1533290001Sglebius#if 0
1534290001Sglebius		/* Test 5 -- unimplemented optional functionality */
1535290001Sglebius		{
1536290001Sglebius			TEST_INPUT("Test With Truncation"),
1537290001Sglebius			"0x4C1A03424B55E07FE7F27BE1",
1538290001Sglebius			1
1539290001Sglebius		},
1540290001Sglebius#endif
1541290001Sglebius		/* Test 6 */
1542290001Sglebius		{
1543290001Sglebius			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1544290001Sglebius				   "Hash Key First"),
1545290001Sglebius			"0x80B24263C7C1A3EBB71493C1DD7BE8B49B46D1F41B4AEE"
1546290001Sglebius				"C1121B013783F8F3526B56D037E05F2598BD0FD2"
1547290001Sglebius				"215D6A1E5295E64F73F63F0AEC8B915A985D786598",
1548290001Sglebius			1
1549290001Sglebius		},
1550290001Sglebius		/* Test 7 */
1551290001Sglebius		{
1552290001Sglebius			TEST_INPUT("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20"
1553290001Sglebius				   "\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67"
1554290001Sglebius				   "\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
1555290001Sglebius				   "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1556290001Sglebius				   "\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20"
1557290001Sglebius				   "\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
1558290001Sglebius				   "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c"
1559290001Sglebius				   "\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1560290001Sglebius				   "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
1561290001Sglebius				   "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74"
1562290001Sglebius				   "\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65"
1563290001Sglebius				   "\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
1564290001Sglebius				   "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20"
1565290001Sglebius				   "\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41"
1566290001Sglebius				   "\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
1567290001Sglebius				   "\x6d\x2e"),
1568290001Sglebius			"0xE37B6A775DC87DBAA4DFA9F96E5E3FFDDEBD71F8867289"
1569290001Sglebius				"865DF5A32D20CDC944B6022CAC3C4982B10D5EEB"
1570290001Sglebius				"55C3E4DE15134676FB6DE0446065C97440FA8C6A58",
1571290001Sglebius			1
1572290001Sglebius		},
1573290001Sglebius		{ NULL, 0, NULL, 1 }
1574290001Sglebius	};
1575290001Sglebius
1576290001Sglebius	hash_testcase_t *testcase = testcases;
1577290001Sglebius
1578290001Sglebius	hash_test_key_t test_keys[] = {
1579290001Sglebius		/* Key 1 */
1580290001Sglebius		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1581290001Sglebius		  "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20 },
1582290001Sglebius		/* Key 2 */
1583290001Sglebius		{ "Jefe", 4 },
1584290001Sglebius		/* Key 3 */
1585290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1586290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20 },
1587290001Sglebius		/* Key 4 */
1588290001Sglebius		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1589290001Sglebius		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1590290001Sglebius		  "\x15\x16\x17\x18\x19", 25 },
1591290001Sglebius#if 0
1592290001Sglebius		/* Key 5 */
1593290001Sglebius		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1594290001Sglebius		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1595290001Sglebius#endif
1596290001Sglebius		/* Key 6 */
1597290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1598290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1599290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1600290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1601290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1602290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1603290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1604290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1605290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1606290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1607290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1608290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1609290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1610290001Sglebius		/* Key 7 */
1611290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1612290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1613290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1614290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1615290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1616290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1617290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1618290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1619290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1620290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1621290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1622290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1623290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1624290001Sglebius		{ "", 0 }
1625290001Sglebius	};
1626290001Sglebius
1627290001Sglebius	hash_test_key_t *test_key = test_keys;
1628290001Sglebius
1629290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
1630290001Sglebius		memcpy(buffer, test_key->key, test_key->len);
1631290001Sglebius		isc_hmacsha512_init(&hmacsha512, buffer, test_key->len);
1632290001Sglebius		isc_hmacsha512_update(&hmacsha512,
1633290001Sglebius				      (const isc_uint8_t *) testcase->input,
1634290001Sglebius				      testcase->input_len);
1635290001Sglebius		isc_hmacsha512_sign(&hmacsha512, digest, ISC_SHA512_DIGESTLENGTH);
1636290001Sglebius		tohexstr(digest, ISC_SHA512_DIGESTLENGTH, str);
1637290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
1638290001Sglebius
1639290001Sglebius		testcase++;
1640290001Sglebius		test_key++;
1641290001Sglebius	}
1642290001Sglebius}
1643290001Sglebius
1644290001Sglebius
1645290001Sglebius/* HMAC-MD5 Test */
1646290001SglebiusATF_TC(isc_hmacmd5);
1647290001SglebiusATF_TC_HEAD(isc_hmacmd5, tc) {
1648290001Sglebius	atf_tc_set_md_var(tc, "descr", "HMAC-MD5 examples from RFC2104");
1649290001Sglebius}
1650290001SglebiusATF_TC_BODY(isc_hmacmd5, tc) {
1651290001Sglebius	isc_hmacmd5_t hmacmd5;
1652290001Sglebius
1653290001Sglebius	UNUSED(tc);
1654290001Sglebius
1655290001Sglebius	/*
1656290001Sglebius	 * These are the various test vectors.  All of these are passed
1657290001Sglebius	 * through the hash function and the results are compared to the
1658290001Sglebius	 * result specified here.
1659290001Sglebius	 */
1660290001Sglebius	hash_testcase_t testcases[] = {
1661290001Sglebius		/* Test 1 */
1662290001Sglebius		{
1663290001Sglebius			TEST_INPUT("\x48\x69\x20\x54\x68\x65\x72\x65"),
1664290001Sglebius			"0x9294727A3638BB1C13F48EF8158BFC9D",
1665290001Sglebius			1
1666290001Sglebius		},
1667290001Sglebius		/* Test 2 */
1668290001Sglebius		{
1669290001Sglebius			TEST_INPUT("\x77\x68\x61\x74\x20\x64\x6f\x20\x79"
1670290001Sglebius				   "\x61\x20\x77\x61\x6e\x74\x20\x66\x6f"
1671290001Sglebius				   "\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f"),
1672290001Sglebius			"0x750C783E6AB0B503EAA86E310A5DB738", 1
1673290001Sglebius		},
1674290001Sglebius		/* Test 3 */
1675290001Sglebius		{
1676290001Sglebius			TEST_INPUT("\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1677290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1678290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1679290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
1680290001Sglebius				   "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"),
1681290001Sglebius			"0x56BE34521D144C88DBB8C733F0E8B3F6",
1682290001Sglebius			1
1683290001Sglebius		},
1684290001Sglebius		/* Test 4 */
1685290001Sglebius		{
1686290001Sglebius			TEST_INPUT("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1687290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1688290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1689290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1690290001Sglebius				   "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"),
1691290001Sglebius			"0x697EAF0ACA3A3AEA3A75164746FFAA79",
1692290001Sglebius			1
1693290001Sglebius		},
1694290001Sglebius#if 0
1695290001Sglebius		/* Test 5 -- unimplemented optional functionality */
1696290001Sglebius		{
1697290001Sglebius			TEST_INPUT("Test With Truncation"),
1698290001Sglebius			"0x4C1A03424B55E07FE7F27BE1",
1699290001Sglebius			1
1700290001Sglebius		},
1701290001Sglebius		/* Test 6 -- unimplemented optional functionality */
1702290001Sglebius		{
1703290001Sglebius			TEST_INPUT("Test Using Larger Than Block-Size Key - "
1704290001Sglebius				   "Hash Key First"),
1705290001Sglebius			"0xAA4AE5E15272D00E95705637CE8A3B55ED402112",
1706290001Sglebius			1
1707290001Sglebius		 },
1708290001Sglebius		/* Test 7 -- unimplemented optional functionality */
1709290001Sglebius		{
1710290001Sglebius			TEST_INPUT("Test Using Larger Than Block-Size Key and "
1711290001Sglebius				   "Larger Than One Block-Size Data"),
1712290001Sglebius			"0xE8E99D0F45237D786D6BBAA7965C7808BBFF1A91",
1713290001Sglebius			1
1714290001Sglebius		},
1715290001Sglebius#endif
1716290001Sglebius		{ NULL, 0, NULL, 1 }
1717290001Sglebius	};
1718290001Sglebius
1719290001Sglebius	hash_testcase_t *testcase = testcases;
1720290001Sglebius
1721290001Sglebius	hash_test_key_t test_keys[] = {
1722290001Sglebius		/* Key 1 */
1723290001Sglebius		{ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1724290001Sglebius		  "\x0b\x0b\x0b\x0b\x0b\x0b", 16 },
1725290001Sglebius		/* Key 2 */
1726290001Sglebius		{ "Jefe", 4 },
1727290001Sglebius		/* Key 3 */
1728290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1729290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa", 16 },
1730290001Sglebius		/* Key 4 */
1731290001Sglebius		{ "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
1732290001Sglebius		  "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
1733290001Sglebius		  "\x15\x16\x17\x18\x19", 25 },
1734290001Sglebius#if 0
1735290001Sglebius		/* Key 5 */
1736290001Sglebius		{ "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1737290001Sglebius		  "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20 },
1738290001Sglebius		/* Key 6 */
1739290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1740290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1741290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1742290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1743290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1744290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1745290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1746290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1747290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1748290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1749290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1750290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1751290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1752290001Sglebius		/* Key 7 */
1753290001Sglebius		{ "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1754290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1755290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1756290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1757290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1758290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1759290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1760290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1761290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1762290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1763290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1764290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1765290001Sglebius		  "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131 },
1766290001Sglebius#endif
1767290001Sglebius		{ "", 0 }
1768290001Sglebius	};
1769290001Sglebius
1770290001Sglebius	hash_test_key_t *test_key = test_keys;
1771290001Sglebius
1772290001Sglebius	while (testcase->input != NULL && testcase->result != NULL) {
1773290001Sglebius		memcpy(buffer, test_key->key, test_key->len);
1774290001Sglebius		isc_hmacmd5_init(&hmacmd5, buffer, test_key->len);
1775290001Sglebius		isc_hmacmd5_update(&hmacmd5,
1776290001Sglebius				   (const isc_uint8_t *) testcase->input,
1777290001Sglebius				   testcase->input_len);
1778290001Sglebius		isc_hmacmd5_sign(&hmacmd5, digest);
1779290001Sglebius		tohexstr(digest, ISC_MD5_DIGESTLENGTH, str);
1780290001Sglebius		ATF_CHECK_STREQ(str, testcase->result);
1781290001Sglebius
1782290001Sglebius		testcase++;
1783290001Sglebius		test_key++;
1784290001Sglebius	}
1785290001Sglebius}
1786290001Sglebius
1787290001Sglebius/*
1788290001Sglebius * Main
1789290001Sglebius */
1790290001SglebiusATF_TP_ADD_TCS(tp) {
1791290001Sglebius	ATF_TP_ADD_TC(tp, isc_hmacmd5);
1792290001Sglebius	ATF_TP_ADD_TC(tp, isc_hmacsha1);
1793290001Sglebius	ATF_TP_ADD_TC(tp, isc_hmacsha224);
1794290001Sglebius	ATF_TP_ADD_TC(tp, isc_hmacsha256);
1795290001Sglebius	ATF_TP_ADD_TC(tp, isc_hmacsha384);
1796290001Sglebius	ATF_TP_ADD_TC(tp, isc_hmacsha512);
1797290001Sglebius	ATF_TP_ADD_TC(tp, isc_md5);
1798290001Sglebius	ATF_TP_ADD_TC(tp, isc_sha1);
1799290001Sglebius	ATF_TP_ADD_TC(tp, isc_sha224);
1800290001Sglebius	ATF_TP_ADD_TC(tp, isc_sha256);
1801290001Sglebius	ATF_TP_ADD_TC(tp, isc_sha384);
1802290001Sglebius	ATF_TP_ADD_TC(tp, isc_sha512);
1803290001Sglebius	return (atf_no_error());
1804290001Sglebius}
1805290001Sglebius
1806