1/*	$NetBSD: md_test.c,v 1.2 2024/02/21 22:52:50 christos Exp $	*/
2
3/*
4 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5 *
6 * SPDX-License-Identifier: MPL-2.0
7 *
8 * This Source Code Form is subject to the terms of the Mozilla Public
9 * License, v. 2.0. If a copy of the MPL was not distributed with this
10 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11 *
12 * See the COPYRIGHT file distributed with this work for additional
13 * information regarding copyright ownership.
14 */
15
16#include <inttypes.h>
17#include <sched.h> /* IWYU pragma: keep */
18#include <setjmp.h>
19#include <stdarg.h>
20#include <stddef.h>
21#include <string.h>
22
23/* For FIPS_mode() */
24#include <openssl/crypto.h>
25
26#define UNIT_TESTING
27#include <cmocka.h>
28
29#include <isc/buffer.h>
30#include <isc/hex.h>
31#include <isc/md.h>
32#include <isc/region.h>
33#include <isc/result.h>
34
35#include "md.c"
36
37#include <tests/isc.h>
38
39#define TEST_INPUT(x) (x), sizeof(x) - 1
40
41static int
42_setup(void **state) {
43	isc_md_t *md = isc_md_new();
44	if (md == NULL) {
45		return (-1);
46	}
47	*state = md;
48	return (0);
49}
50
51static int
52_teardown(void **state) {
53	if (*state == NULL) {
54		return (-1);
55	}
56	isc_md_free(*state);
57	return (0);
58}
59
60static int
61_reset(void **state) {
62	if (*state == NULL) {
63		return (-1);
64	}
65	if (isc_md_reset(*state) != ISC_R_SUCCESS) {
66		return (-1);
67	}
68	return (0);
69}
70
71ISC_RUN_TEST_IMPL(isc_md_new) {
72	isc_md_t *md = isc_md_new();
73	assert_non_null(md);
74	isc_md_free(md); /* Cleanup */
75}
76
77ISC_RUN_TEST_IMPL(isc_md_free) {
78	isc_md_t *md = isc_md_new();
79	assert_non_null(md);
80	isc_md_free(md);   /* Test freeing valid message digest context */
81	isc_md_free(NULL); /* Test freeing NULL argument */
82}
83
84static void
85isc_md_test(isc_md_t *md, const isc_md_type_t *type, const char *buf,
86	    size_t buflen, const char *result, const size_t repeats) {
87	isc_result_t res;
88
89	assert_non_null(md);
90	assert_int_equal(isc_md_init(md, type), ISC_R_SUCCESS);
91
92	for (size_t i = 0; i < repeats; i++) {
93		assert_int_equal(
94			isc_md_update(md, (const unsigned char *)buf, buflen),
95			ISC_R_SUCCESS);
96	}
97
98	unsigned char digest[ISC_MAX_MD_SIZE];
99	unsigned int digestlen;
100	assert_int_equal(isc_md_final(md, digest, &digestlen), ISC_R_SUCCESS);
101
102	char hexdigest[ISC_MAX_MD_SIZE * 2 + 3];
103	isc_region_t r = { .base = digest, .length = digestlen };
104	isc_buffer_t b;
105	isc_buffer_init(&b, hexdigest, sizeof(hexdigest));
106
107	res = isc_hex_totext(&r, 0, "", &b);
108
109	assert_return_code(res, ISC_R_SUCCESS);
110
111	assert_memory_equal(hexdigest, result, (result ? strlen(result) : 0));
112	assert_int_equal(isc_md_reset(md), ISC_R_SUCCESS);
113}
114
115ISC_RUN_TEST_IMPL(isc_md_init) {
116	isc_md_t *md = *state;
117	assert_non_null(md);
118
119	expect_assert_failure(isc_md_init(NULL, ISC_MD_MD5));
120
121	assert_int_equal(isc_md_init(md, NULL), ISC_R_NOTIMPLEMENTED);
122
123	assert_int_equal(isc_md_init(md, ISC_MD_MD5), ISC_R_SUCCESS);
124	assert_int_equal(isc_md_reset(md), ISC_R_SUCCESS);
125
126	assert_int_equal(isc_md_init(md, ISC_MD_SHA1), ISC_R_SUCCESS);
127	assert_int_equal(isc_md_reset(md), ISC_R_SUCCESS);
128
129	assert_int_equal(isc_md_init(md, ISC_MD_SHA224), ISC_R_SUCCESS);
130	assert_int_equal(isc_md_reset(md), ISC_R_SUCCESS);
131
132	assert_int_equal(isc_md_init(md, ISC_MD_SHA256), ISC_R_SUCCESS);
133	assert_int_equal(isc_md_reset(md), ISC_R_SUCCESS);
134
135	assert_int_equal(isc_md_init(md, ISC_MD_SHA384), ISC_R_SUCCESS);
136	assert_int_equal(isc_md_reset(md), ISC_R_SUCCESS);
137
138	assert_int_equal(isc_md_init(md, ISC_MD_SHA512), ISC_R_SUCCESS);
139	assert_int_equal(isc_md_reset(md), ISC_R_SUCCESS);
140}
141
142ISC_RUN_TEST_IMPL(isc_md_update) {
143	isc_md_t *md = *state;
144	assert_non_null(md);
145
146	/* Uses message digest context initialized in isc_md_init_test() */
147	expect_assert_failure(isc_md_update(NULL, NULL, 0));
148
149	assert_int_equal(isc_md_update(md, NULL, 100), ISC_R_SUCCESS);
150	assert_int_equal(isc_md_update(md, (const unsigned char *)"", 0),
151			 ISC_R_SUCCESS);
152}
153
154ISC_RUN_TEST_IMPL(isc_md_reset) {
155	isc_md_t *md = *state;
156#if 0
157	unsigned char digest[ISC_MAX_MD_SIZE] __attribute((unused));
158	unsigned int digestlen __attribute((unused));
159#endif /* if 0 */
160
161	assert_non_null(md);
162
163	assert_int_equal(isc_md_init(md, ISC_MD_SHA512), ISC_R_SUCCESS);
164	assert_int_equal(isc_md_update(md, (const unsigned char *)"a", 1),
165			 ISC_R_SUCCESS);
166	assert_int_equal(isc_md_update(md, (const unsigned char *)"b", 1),
167			 ISC_R_SUCCESS);
168
169	assert_int_equal(isc_md_reset(md), ISC_R_SUCCESS);
170
171#if 0
172	/*
173	 * This test would require OpenSSL compiled with mock_assert(),
174	 * so this could be only manually checked that the test will
175	 * segfault when called by hand
176	 */
177	expect_assert_failure(isc_md_final(md,digest,&digestlen));
178#endif /* if 0 */
179}
180
181ISC_RUN_TEST_IMPL(isc_md_final) {
182	isc_md_t *md = *state;
183	assert_non_null(md);
184
185	unsigned char digest[ISC_MAX_MD_SIZE];
186	unsigned int digestlen;
187
188	/* Fail when message digest context is empty */
189	expect_assert_failure(isc_md_final(NULL, digest, &digestlen));
190	/* Fail when output buffer is empty */
191	expect_assert_failure(isc_md_final(md, NULL, &digestlen));
192
193	assert_int_equal(isc_md_init(md, ISC_MD_SHA512), ISC_R_SUCCESS);
194	assert_int_equal(isc_md_final(md, digest, NULL), ISC_R_SUCCESS);
195}
196
197ISC_RUN_TEST_IMPL(isc_md_md5) {
198	isc_md_t *md = *state;
199	isc_md_test(md, ISC_MD_MD5, NULL, 0, NULL, 0);
200	isc_md_test(md, ISC_MD_MD5, TEST_INPUT(""),
201		    "D41D8CD98F00B204E9800998ECF8427E", 1);
202	isc_md_test(md, ISC_MD_MD5, TEST_INPUT("a"),
203		    "0CC175B9C0F1B6A831C399E269772661", 1);
204	isc_md_test(md, ISC_MD_MD5, TEST_INPUT("abc"),
205		    "900150983CD24FB0D6963F7D28E17F72", 1);
206	isc_md_test(md, ISC_MD_MD5, TEST_INPUT("message digest"),
207		    "F96B697D7CB7938D525A2F31AAF161D0", 1);
208	isc_md_test(md, ISC_MD_MD5, TEST_INPUT("abcdefghijklmnopqrstuvwxyz"),
209		    "C3FCD3D76192E4007DFB496CCA67E13B", 1);
210	isc_md_test(md, ISC_MD_MD5,
211		    TEST_INPUT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm"
212			       "nopqrstuvwxyz0123456789"),
213		    "D174AB98D277D9F5A5611C2C9F419D9F", 1);
214	isc_md_test(md, ISC_MD_MD5,
215		    TEST_INPUT("123456789012345678901234567890123456789"
216			       "01234567890123456789012345678901234567890"),
217		    "57EDF4A22BE3C955AC49DA2E2107B67A", 1);
218}
219
220ISC_RUN_TEST_IMPL(isc_md_sha1) {
221	isc_md_t *md = *state;
222	isc_md_test(md, ISC_MD_SHA1, NULL, 0, NULL, 0);
223	isc_md_test(md, ISC_MD_SHA1, TEST_INPUT(""),
224		    "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709", 1);
225	isc_md_test(md, ISC_MD_SHA1, TEST_INPUT("abc"),
226		    "A9993E364706816ABA3E25717850C26C9CD0D89D", 1);
227	isc_md_test(md, ISC_MD_SHA1,
228		    TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijk"
229			       "ljklmklmnlmnomnopnopq"),
230		    "84983E441C3BD26EBAAE4AA1F95129E5E54670F1", 1);
231	isc_md_test(md, ISC_MD_SHA1, TEST_INPUT("a"),
232		    "34AA973CD4C4DAA4F61EEB2BDBAD27316534016F", 1000000);
233	isc_md_test(md, ISC_MD_SHA1,
234		    TEST_INPUT("01234567012345670123456701234567"),
235		    "DEA356A2CDDD90C7A7ECEDC5EBB563934F460452", 20);
236	isc_md_test(md, ISC_MD_SHA1, TEST_INPUT("\x5e"),
237		    "5E6F80A34A9798CAFC6A5DB96CC57BA4C4DB59C2", 1);
238	isc_md_test(md, ISC_MD_SHA1,
239		    TEST_INPUT("\x9a\x7d\xfd\xf1\xec\xea\xd0\x6e\xd6\x46"
240			       "\xaa\x55\xfe\x75\x71\x46"),
241		    "82ABFF6605DBE1C17DEF12A394FA22A82B544A35", 1);
242	isc_md_test(md, ISC_MD_SHA1,
243		    TEST_INPUT("\xf7\x8f\x92\x14\x1b\xcd\x17\x0a\xe8\x9b"
244			       "\x4f\xba\x15\xa1\xd5\x9f\x3f\xd8\x4d\x22"
245			       "\x3c\x92\x51\xbd\xac\xbb\xae\x61\xd0\x5e"
246			       "\xd1\x15\xa0\x6a\x7c\xe1\x17\xb7\xbe\xea"
247			       "\xd2\x44\x21\xde\xd9\xc3\x25\x92\xbd\x57"
248			       "\xed\xea\xe3\x9c\x39\xfa\x1f\xe8\x94\x6a"
249			       "\x84\xd0\xcf\x1f\x7b\xee\xad\x17\x13\xe2"
250			       "\xe0\x95\x98\x97\x34\x7f\x67\xc8\x0b\x04"
251			       "\x00\xc2\x09\x81\x5d\x6b\x10\xa6\x83\x83"
252			       "\x6f\xd5\x56\x2a\x56\xca\xb1\xa2\x8e\x81"
253			       "\xb6\x57\x66\x54\x63\x1c\xf1\x65\x66\xb8"
254			       "\x6e\x3b\x33\xa1\x08\xb0\x53\x07\xc0\x0a"
255			       "\xff\x14\xa7\x68\xed\x73\x50\x60\x6a\x0f"
256			       "\x85\xe6\xa9\x1d\x39\x6f\x5b\x5c\xbe\x57"
257			       "\x7f\x9b\x38\x80\x7c\x7d\x52\x3d\x6d\x79"
258			       "\x2f\x6e\xbc\x24\xa4\xec\xf2\xb3\xa4\x27"
259			       "\xcd\xbb\xfb"),
260		    "CB0082C8F197D260991BA6A460E76E202BAD27B3", 1);
261}
262
263ISC_RUN_TEST_IMPL(isc_md_sha224) {
264	isc_md_t *md = *state;
265
266	isc_md_test(md, ISC_MD_SHA224, NULL, 0, NULL, 0);
267	isc_md_test(md, ISC_MD_SHA224, TEST_INPUT(""),
268		    "D14A028C2A3A2BC9476102BB288234C415A2B01F828EA62AC5B3E42F",
269		    1);
270	isc_md_test(md, ISC_MD_SHA224, TEST_INPUT("abc"),
271		    "23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7"
272		    "E36C9DA7",
273		    1);
274	isc_md_test(md, ISC_MD_SHA224,
275		    TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijklj"
276			       "klmklmnlmnomnopnopq"),
277		    "75388B16512776CC5DBA5DA1FD890150B0C6455CB4F58B"
278		    "1952522525",
279		    1);
280	isc_md_test(md, ISC_MD_SHA224, TEST_INPUT("a"),
281		    "20794655980C91D8BBB4C1EA97618A4BF03F42581948B2"
282		    "EE4EE7AD67",
283		    1000000);
284	isc_md_test(md, ISC_MD_SHA224,
285		    TEST_INPUT("01234567012345670123456701234567"),
286		    "567F69F168CD7844E65259CE658FE7AADFA25216E68ECA"
287		    "0EB7AB8262",
288		    20);
289	isc_md_test(md, ISC_MD_SHA224, TEST_INPUT("\x07"),
290		    "00ECD5F138422B8AD74C9799FD826C531BAD2FCABC7450"
291		    "BEE2AA8C2A",
292		    1);
293	isc_md_test(md, ISC_MD_SHA224,
294		    TEST_INPUT("\x18\x80\x40\x05\xdd\x4f\xbd\x15\x56\x29"
295			       "\x9d\x6f\x9d\x93\xdf\x62"),
296		    "DF90D78AA78821C99B40BA4C966921ACCD8FFB1E98AC38"
297		    "8E56191DB1",
298		    1);
299	isc_md_test(md, ISC_MD_SHA224,
300		    TEST_INPUT("\x55\xb2\x10\x07\x9c\x61\xb5\x3a\xdd\x52"
301			       "\x06\x22\xd1\xac\x97\xd5\xcd\xbe\x8c\xb3"
302			       "\x3a\xa0\xae\x34\x45\x17\xbe\xe4\xd7\xba"
303			       "\x09\xab\xc8\x53\x3c\x52\x50\x88\x7a\x43"
304			       "\xbe\xbb\xac\x90\x6c\x2e\x18\x37\xf2\x6b"
305			       "\x36\xa5\x9a\xe3\xbe\x78\x14\xd5\x06\x89"
306			       "\x6b\x71\x8b\x2a\x38\x3e\xcd\xac\x16\xb9"
307			       "\x61\x25\x55\x3f\x41\x6f\xf3\x2c\x66\x74"
308			       "\xc7\x45\x99\xa9\x00\x53\x86\xd9\xce\x11"
309			       "\x12\x24\x5f\x48\xee\x47\x0d\x39\x6c\x1e"
310			       "\xd6\x3b\x92\x67\x0c\xa5\x6e\xc8\x4d\xee"
311			       "\xa8\x14\xb6\x13\x5e\xca\x54\x39\x2b\xde"
312			       "\xdb\x94\x89\xbc\x9b\x87\x5a\x8b\xaf\x0d"
313			       "\xc1\xae\x78\x57\x36\x91\x4a\xb7\xda\xa2"
314			       "\x64\xbc\x07\x9d\x26\x9f\x2c\x0d\x7e\xdd"
315			       "\xd8\x10\xa4\x26\x14\x5a\x07\x76\xf6\x7c"
316			       "\x87\x82\x73"),
317		    "0B31894EC8937AD9B91BDFBCBA294D9ADEFAA18E09305E"
318		    "9F20D5C3A4",
319		    1);
320}
321
322ISC_RUN_TEST_IMPL(isc_md_sha256) {
323	isc_md_t *md = *state;
324
325	isc_md_test(md, ISC_MD_SHA256, NULL, 0, NULL, 0);
326	isc_md_test(md, ISC_MD_SHA256, TEST_INPUT(""),
327		    "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B93"
328		    "4CA495991B7852B855",
329		    1);
330
331	isc_md_test(md, ISC_MD_SHA256, TEST_INPUT("abc"),
332		    "BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A"
333		    "9CB410FF61F20015AD",
334		    1);
335	isc_md_test(md, ISC_MD_SHA256,
336		    TEST_INPUT("abcdbcdecdefdefgefghfghighijhijkijkljk"
337			       "lmklmnlmnomnopnopq"),
338		    "248D6A61D20638B8E5C026930C3E6039A33CE45964FF21"
339		    "67F6ECEDD419DB06C1",
340		    1);
341	isc_md_test(md, ISC_MD_SHA256, TEST_INPUT("a"),
342		    "CDC76E5C9914FB9281A1C7E284D73E67F1809A48A49720"
343		    "0E046D39CCC7112CD0",
344		    1000000);
345	isc_md_test(md, ISC_MD_SHA256,
346		    TEST_INPUT("01234567012345670123456701234567"),
347		    "594847328451BDFA85056225462CC1D867D877FB388DF0"
348		    "CE35F25AB5562BFBB5",
349		    20);
350	isc_md_test(md, ISC_MD_SHA256, TEST_INPUT("\x19"),
351		    "68AA2E2EE5DFF96E3355E6C7EE373E3D6A4E17F75F9518"
352		    "D843709C0C9BC3E3D4",
353		    1);
354	isc_md_test(md, ISC_MD_SHA256,
355		    TEST_INPUT("\xe3\xd7\x25\x70\xdc\xdd\x78\x7c\xe3"
356			       "\x88\x7a\xb2\xcd\x68\x46\x52"),
357		    "175EE69B02BA9B58E2B0A5FD13819CEA573F3940A94F82"
358		    "5128CF4209BEABB4E8",
359		    1);
360	isc_md_test(md, ISC_MD_SHA256,
361		    TEST_INPUT("\x83\x26\x75\x4e\x22\x77\x37\x2f\x4f\xc1"
362			       "\x2b\x20\x52\x7a\xfe\xf0\x4d\x8a\x05\x69"
363			       "\x71\xb1\x1a\xd5\x71\x23\xa7\xc1\x37\x76"
364			       "\x00\x00\xd7\xbe\xf6\xf3\xc1\xf7\xa9\x08"
365			       "\x3a\xa3\x9d\x81\x0d\xb3\x10\x77\x7d\xab"
366			       "\x8b\x1e\x7f\x02\xb8\x4a\x26\xc7\x73\x32"
367			       "\x5f\x8b\x23\x74\xde\x7a\x4b\x5a\x58\xcb"
368			       "\x5c\x5c\xf3\x5b\xce\xe6\xfb\x94\x6e\x5b"
369			       "\xd6\x94\xfa\x59\x3a\x8b\xeb\x3f\x9d\x65"
370			       "\x92\xec\xed\xaa\x66\xca\x82\xa2\x9d\x0c"
371			       "\x51\xbc\xf9\x33\x62\x30\xe5\xd7\x84\xe4"
372			       "\xc0\xa4\x3f\x8d\x79\xa3\x0a\x16\x5c\xba"
373			       "\xbe\x45\x2b\x77\x4b\x9c\x71\x09\xa9\x7d"
374			       "\x13\x8f\x12\x92\x28\x96\x6f\x6c\x0a\xdc"
375			       "\x10\x6a\xad\x5a\x9f\xdd\x30\x82\x57\x69"
376			       "\xb2\xc6\x71\xaf\x67\x59\xdf\x28\xeb\x39"
377			       "\x3d\x54\xd6"),
378		    "97DBCA7DF46D62C8A422C941DD7E835B8AD3361763F7E9"
379		    "B2D95F4F0DA6E1CCBC",
380		    1);
381}
382
383ISC_RUN_TEST_IMPL(isc_md_sha384) {
384	isc_md_t *md = *state;
385
386	isc_md_test(md, ISC_MD_SHA384, NULL, 0, NULL, 0);
387	isc_md_test(md, ISC_MD_SHA384, TEST_INPUT(""),
388		    "38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07"
389		    "434C0CC7BF63F6E1DA274EDEBFE76F65FBD51AD2F14898"
390		    "B95B"
391		    "",
392		    1);
393	isc_md_test(md, ISC_MD_SHA384, TEST_INPUT("abc"),
394		    "CB00753F45A35E8BB5A03D699AC65007272C32AB0EDED1"
395		    "631A8B605A43FF5BED8086072BA1E7CC2358BAEC"
396		    "A134C825A7",
397		    1);
398	isc_md_test(md, ISC_MD_SHA384,
399		    TEST_INPUT("abcdefghbcdefghicdefghijdefghijkefghijkl"
400			       "fghijklmghijklmnhijklmnoijklmnopjklmnopq"
401			       "klmnopqrlmnopqrsmnopqrstnopqrstu"),
402		    "09330C33F71147E83D192FC782CD1B4753111B173B3B05"
403		    "D22FA08086E3B0F712FCC7C71A557E2DB966C3E9"
404		    "FA91746039",
405		    1);
406	isc_md_test(md, ISC_MD_SHA384, TEST_INPUT("a"),
407		    "9D0E1809716474CB086E834E310A4A1CED149E9C00F248"
408		    "527972CEC5704C2A5B07B8B3DC38ECC4EBAE97DD"
409		    "D87F3D8985",
410		    1000000);
411	isc_md_test(md, ISC_MD_SHA384,
412		    TEST_INPUT("01234567012345670123456701234567"),
413		    "2FC64A4F500DDB6828F6A3430B8DD72A368EB7F3A8322A"
414		    "70BC84275B9C0B3AB00D27A5CC3C2D224AA6B61A"
415		    "0D79FB4596",
416		    20);
417	isc_md_test(md, ISC_MD_SHA384, TEST_INPUT("\xb9"),
418		    "BC8089A19007C0B14195F4ECC74094FEC64F01F9092928"
419		    "2C2FB392881578208AD466828B1C6C283D2722CF"
420		    "0AD1AB6938",
421		    1);
422	isc_md_test(md, ISC_MD_SHA384,
423		    TEST_INPUT("\xa4\x1c\x49\x77\x79\xc0\x37\x5f\xf1"
424			       "\x0a\x7f\x4e\x08\x59\x17\x39"),
425		    "C9A68443A005812256B8EC76B00516F0DBB74FAB26D665"
426		    "913F194B6FFB0E91EA9967566B58109CBC675CC2"
427		    "08E4C823F7",
428		    1);
429	isc_md_test(md, ISC_MD_SHA384,
430		    TEST_INPUT("\x39\x96\x69\xe2\x8f\x6b\x9c\x6d\xbc\xbb"
431			       "\x69\x12\xec\x10\xff\xcf\x74\x79\x03\x49"
432			       "\xb7\xdc\x8f\xbe\x4a\x8e\x7b\x3b\x56\x21"
433			       "\xdb\x0f\x3e\x7d\xc8\x7f\x82\x32\x64\xbb"
434			       "\xe4\x0d\x18\x11\xc9\xea\x20\x61\xe1\xc8"
435			       "\x4a\xd1\x0a\x23\xfa\xc1\x72\x7e\x72\x02"
436			       "\xfc\x3f\x50\x42\xe6\xbf\x58\xcb\xa8\xa2"
437			       "\x74\x6e\x1f\x64\xf9\xb9\xea\x35\x2c\x71"
438			       "\x15\x07\x05\x3c\xf4\xe5\x33\x9d\x52\x86"
439			       "\x5f\x25\xcc\x22\xb5\xe8\x77\x84\xa1\x2f"
440			       "\xc9\x61\xd6\x6c\xb6\xe8\x95\x73\x19\x9a"
441			       "\x2c\xe6\x56\x5c\xbd\xf1\x3d\xca\x40\x38"
442			       "\x32\xcf\xcb\x0e\x8b\x72\x11\xe8\x3a\xf3"
443			       "\x2a\x11\xac\x17\x92\x9f\xf1\xc0\x73\xa5"
444			       "\x1c\xc0\x27\xaa\xed\xef\xf8\x5a\xad\x7c"
445			       "\x2b\x7c\x5a\x80\x3e\x24\x04\xd9\x6d\x2a"
446			       "\x77\x35\x7b\xda\x1a\x6d\xae\xed\x17\x15"
447			       "\x1c\xb9\xbc\x51\x25\xa4\x22\xe9\x41\xde"
448			       "\x0c\xa0\xfc\x50\x11\xc2\x3e\xcf\xfe\xfd"
449			       "\xd0\x96\x76\x71\x1c\xf3\xdb\x0a\x34\x40"
450			       "\x72\x0e\x16\x15\xc1\xf2\x2f\xbc\x3c\x72"
451			       "\x1d\xe5\x21\xe1\xb9\x9b\xa1\xbd\x55\x77"
452			       "\x40\x86\x42\x14\x7e\xd0\x96"),
453		    "4F440DB1E6EDD2899FA335F09515AA025EE177A79F4B4A"
454		    "AF38E42B5C4DE660F5DE8FB2A5B2FBD2A3CBFFD2"
455		    "0CFF1288C0",
456		    1);
457}
458
459ISC_RUN_TEST_IMPL(isc_md_sha512) {
460	isc_md_t *md = *state;
461
462	isc_md_test(md, ISC_MD_SHA512, NULL, 0, NULL, 0);
463	isc_md_test(md, ISC_MD_SHA512, TEST_INPUT(""),
464		    "CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715"
465		    "DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877E"
466		    "EC2F63B931BD47417A81A538327AF927DA3E",
467		    1);
468	isc_md_test(md, ISC_MD_SHA512, TEST_INPUT("abc"),
469		    "DDAF35A193617ABACC417349AE20413112E6FA4E89A97E"
470		    "A20A9EEEE64B55D39A2192992A274FC1A836BA3C"
471		    "23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F",
472		    1);
473	isc_md_test(md, ISC_MD_SHA512,
474		    TEST_INPUT("abcdefghbcdefghicdefghijdefghijkefghijkl"
475			       "fghijklmghijklmnhijklmnoijklmnopjklmnopq"
476			       "klmnopqrlmnopqrsmnopqrstnopqrstu"),
477		    "8E959B75DAE313DA8CF4F72814FC143F8F7779C6EB9F7F"
478		    "A17299AEADB6889018501D289E4900F7E4331B99"
479		    "DEC4B5433AC7D329EEB6DD26545E96E55B874BE909",
480		    1);
481	isc_md_test(md, ISC_MD_SHA512, TEST_INPUT("a"),
482		    "E718483D0CE769644E2E42C7BC15B4638E1F98B13B2044"
483		    "285632A803AFA973EBDE0FF244877EA60A4CB043"
484		    "2CE577C31BEB009C5C2C49AA2E4EADB217AD8CC09B",
485		    1000000);
486	isc_md_test(md, ISC_MD_SHA512,
487		    TEST_INPUT("01234567012345670123456701234567"),
488		    "89D05BA632C699C31231DED4FFC127D5A894DAD412C0E0"
489		    "24DB872D1ABD2BA8141A0F85072A9BE1E2AA04CF"
490		    "33C765CB510813A39CD5A84C4ACAA64D3F3FB7BAE9",
491		    20);
492	isc_md_test(md, ISC_MD_SHA512, TEST_INPUT("\xD0"),
493		    "9992202938E882E73E20F6B69E68A0A7149090423D93C8"
494		    "1BAB3F21678D4ACEEEE50E4E8CAFADA4C85A54EA"
495		    "8306826C4AD6E74CECE9631BFA8A549B4AB3FBBA15",
496		    1);
497	isc_md_test(md, ISC_MD_SHA512,
498		    TEST_INPUT("\x8d\x4e\x3c\x0e\x38\x89\x19\x14\x91\x81"
499			       "\x6e\x9d\x98\xbf\xf0\xa0"),
500		    "CB0B67A4B8712CD73C9AABC0B199E9269B20844AFB75AC"
501		    "BDD1C153C9828924C3DDEDAAFE669C5FDD0BC66F"
502		    "630F6773988213EB1B16F517AD0DE4B2F0C95C90F8",
503		    1);
504	isc_md_test(md, ISC_MD_SHA512,
505		    TEST_INPUT("\xa5\x5f\x20\xc4\x11\xaa\xd1\x32\x80\x7a"
506			       "\x50\x2d\x65\x82\x4e\x31\xa2\x30\x54\x32"
507			       "\xaa\x3d\x06\xd3\xe2\x82\xa8\xd8\x4e\x0d"
508			       "\xe1\xde\x69\x74\xbf\x49\x54\x69\xfc\x7f"
509			       "\x33\x8f\x80\x54\xd5\x8c\x26\xc4\x93\x60"
510			       "\xc3\xe8\x7a\xf5\x65\x23\xac\xf6\xd8\x9d"
511			       "\x03\xe5\x6f\xf2\xf8\x68\x00\x2b\xc3\xe4"
512			       "\x31\xed\xc4\x4d\xf2\xf0\x22\x3d\x4b\xb3"
513			       "\xb2\x43\x58\x6e\x1a\x7d\x92\x49\x36\x69"
514			       "\x4f\xcb\xba\xf8\x8d\x95\x19\xe4\xeb\x50"
515			       "\xa6\x44\xf8\xe4\xf9\x5e\xb0\xea\x95\xbc"
516			       "\x44\x65\xc8\x82\x1a\xac\xd2\xfe\x15\xab"
517			       "\x49\x81\x16\x4b\xbb\x6d\xc3\x2f\x96\x90"
518			       "\x87\xa1\x45\xb0\xd9\xcc\x9c\x67\xc2\x2b"
519			       "\x76\x32\x99\x41\x9c\xc4\x12\x8b\xe9\xa0"
520			       "\x77\xb3\xac\xe6\x34\x06\x4e\x6d\x99\x28"
521			       "\x35\x13\xdc\x06\xe7\x51\x5d\x0d\x73\x13"
522			       "\x2e\x9a\x0d\xc6\xd3\xb1\xf8\xb2\x46\xf1"
523			       "\xa9\x8a\x3f\xc7\x29\x41\xb1\xe3\xbb\x20"
524			       "\x98\xe8\xbf\x16\xf2\x68\xd6\x4f\x0b\x0f"
525			       "\x47\x07\xfe\x1e\xa1\xa1\x79\x1b\xa2\xf3"
526			       "\xc0\xc7\x58\xe5\xf5\x51\x86\x3a\x96\xc9"
527			       "\x49\xad\x47\xd7\xfb\x40\xd2"),
528		    "C665BEFB36DA189D78822D10528CBF3B12B3EEF7260399"
529		    "09C1A16A270D48719377966B957A878E72058477"
530		    "9A62825C18DA26415E49A7176A894E7510FD1451F5",
531		    1);
532}
533
534ISC_TEST_LIST_START
535
536ISC_TEST_ENTRY(isc_md_new)
537
538ISC_TEST_ENTRY_CUSTOM(isc_md_init, _reset, _reset)
539
540ISC_TEST_ENTRY_CUSTOM(isc_md_reset, _reset, _reset)
541
542ISC_TEST_ENTRY(isc_md_md5)
543ISC_TEST_ENTRY(isc_md_sha1)
544
545ISC_TEST_ENTRY(isc_md_sha224)
546ISC_TEST_ENTRY(isc_md_sha256)
547ISC_TEST_ENTRY(isc_md_sha384)
548ISC_TEST_ENTRY(isc_md_sha512)
549
550ISC_TEST_ENTRY_CUSTOM(isc_md_update, _reset, _reset)
551ISC_TEST_ENTRY_CUSTOM(isc_md_final, _reset, _reset)
552
553ISC_TEST_ENTRY(isc_md_free)
554
555ISC_TEST_LIST_END
556
557ISC_TEST_MAIN_CUSTOM(_setup, _teardown)
558