xref: /minix3/external/bsd/bind/dist/bin/tests/hashes/t_hashes.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: t_hashes.c,v 1.5 2014/12/10 04:37:53 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2010, 2013  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id: t_hashes.c,v 1.5 2010/10/04 22:27:41 marka Exp  */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek /*
22*00b67f09SDavid van Moolenbroek  * -d1 or larger shows hash or HMAC result even if correct
23*00b67f09SDavid van Moolenbroek  */
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek #include <config.h>
26*00b67f09SDavid van Moolenbroek 
27*00b67f09SDavid van Moolenbroek #include <stdlib.h>
28*00b67f09SDavid van Moolenbroek 
29*00b67f09SDavid van Moolenbroek #include <isc/hmacmd5.h>
30*00b67f09SDavid van Moolenbroek #include <isc/hmacsha.h>
31*00b67f09SDavid van Moolenbroek #include <isc/md5.h>
32*00b67f09SDavid van Moolenbroek #include <isc/print.h>
33*00b67f09SDavid van Moolenbroek #include <isc/sha1.h>
34*00b67f09SDavid van Moolenbroek #include <isc/string.h>
35*00b67f09SDavid van Moolenbroek #include <isc/util.h>
36*00b67f09SDavid van Moolenbroek 
37*00b67f09SDavid van Moolenbroek #include <tests/t_api.h>
38*00b67f09SDavid van Moolenbroek 
39*00b67f09SDavid van Moolenbroek 
40*00b67f09SDavid van Moolenbroek static int	    nprobs;
41*00b67f09SDavid van Moolenbroek 
42*00b67f09SDavid van Moolenbroek typedef void(*HASH_INIT)(void *);
43*00b67f09SDavid van Moolenbroek typedef void(*HMAC_INIT)(void *, const unsigned char *, unsigned int);
44*00b67f09SDavid van Moolenbroek typedef void(*UPDATE)(void *, const unsigned char *, unsigned int);
45*00b67f09SDavid van Moolenbroek typedef void(*FINAL)(void *, const unsigned char *);
46*00b67f09SDavid van Moolenbroek typedef void(*SIGN)(void *, const unsigned char *, unsigned int);
47*00b67f09SDavid van Moolenbroek 
48*00b67f09SDavid van Moolenbroek typedef struct {
49*00b67f09SDavid van Moolenbroek     const char *name;
50*00b67f09SDavid van Moolenbroek     const unsigned char	*key;
51*00b67f09SDavid van Moolenbroek     const unsigned int	key_len;
52*00b67f09SDavid van Moolenbroek     const unsigned char	*str;
53*00b67f09SDavid van Moolenbroek     const unsigned int	str_len;
54*00b67f09SDavid van Moolenbroek } IN_;
55*00b67f09SDavid van Moolenbroek #define STR_INIT(s)	(const unsigned char *)(s), sizeof(s)-1
56*00b67f09SDavid van Moolenbroek 
57*00b67f09SDavid van Moolenbroek 
58*00b67f09SDavid van Moolenbroek union {
59*00b67f09SDavid van Moolenbroek     unsigned char b[1024];
60*00b67f09SDavid van Moolenbroek     unsigned char md5[16];
61*00b67f09SDavid van Moolenbroek     unsigned char sha1[ISC_SHA1_DIGESTLENGTH];
62*00b67f09SDavid van Moolenbroek     unsigned char sha224[ISC_SHA224_DIGESTLENGTH];
63*00b67f09SDavid van Moolenbroek     unsigned char sha256[ISC_SHA256_DIGESTLENGTH];
64*00b67f09SDavid van Moolenbroek     unsigned char sha384[ISC_SHA384_DIGESTLENGTH];
65*00b67f09SDavid van Moolenbroek     unsigned char sha512[ISC_SHA512_DIGESTLENGTH];
66*00b67f09SDavid van Moolenbroek } dbuf;
67*00b67f09SDavid van Moolenbroek #define DIGEST_FILL 0xdf
68*00b67f09SDavid van Moolenbroek 
69*00b67f09SDavid van Moolenbroek typedef struct {
70*00b67f09SDavid van Moolenbroek     const char		*str;
71*00b67f09SDavid van Moolenbroek     const unsigned int	digest_len;
72*00b67f09SDavid van Moolenbroek } OUT_;
73*00b67f09SDavid van Moolenbroek 
74*00b67f09SDavid van Moolenbroek 
75*00b67f09SDavid van Moolenbroek /*
76*00b67f09SDavid van Moolenbroek  * two ad hoc hash examples
77*00b67f09SDavid van Moolenbroek  */
78*00b67f09SDavid van Moolenbroek static IN_ abc = { "\"abc\"", NULL, 0, STR_INIT("abc")};
79*00b67f09SDavid van Moolenbroek static OUT_ abc_sha1 = {
80*00b67f09SDavid van Moolenbroek 	"a9993e364706816aba3e25717850c26c9cd0d89d",
81*00b67f09SDavid van Moolenbroek 	ISC_SHA1_DIGESTLENGTH};
82*00b67f09SDavid van Moolenbroek static OUT_ abc_sha224 = {
83*00b67f09SDavid van Moolenbroek 	"23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7",
84*00b67f09SDavid van Moolenbroek 	ISC_SHA224_DIGESTLENGTH};
85*00b67f09SDavid van Moolenbroek static OUT_ abc_md5 = {
86*00b67f09SDavid van Moolenbroek 	"900150983cd24fb0d6963f7d28e17f72",
87*00b67f09SDavid van Moolenbroek 	16};
88*00b67f09SDavid van Moolenbroek 
89*00b67f09SDavid van Moolenbroek static IN_ abc_blah = { "\"abcdbc...\"", NULL, 0,
90*00b67f09SDavid van Moolenbroek 	STR_INIT("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq")};
91*00b67f09SDavid van Moolenbroek static OUT_ abc_blah_sha1 =  {
92*00b67f09SDavid van Moolenbroek 	"84983e441c3bd26ebaae4aa1f95129e5e54670f1",
93*00b67f09SDavid van Moolenbroek 	ISC_SHA1_DIGESTLENGTH};
94*00b67f09SDavid van Moolenbroek static OUT_ abc_blah_sha224 = {
95*00b67f09SDavid van Moolenbroek 	"75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525",
96*00b67f09SDavid van Moolenbroek 	ISC_SHA224_DIGESTLENGTH};
97*00b67f09SDavid van Moolenbroek static OUT_ abc_blah_md5 = {
98*00b67f09SDavid van Moolenbroek 	"8215ef0796a20bcaaae116d3876c664a",
99*00b67f09SDavid van Moolenbroek 	16};
100*00b67f09SDavid van Moolenbroek 
101*00b67f09SDavid van Moolenbroek /*
102*00b67f09SDavid van Moolenbroek  * three HMAC-md5 examples from RFC 2104
103*00b67f09SDavid van Moolenbroek  */
104*00b67f09SDavid van Moolenbroek static const unsigned char rfc2104_1_key[16] = {
105*00b67f09SDavid van Moolenbroek 	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
106*00b67f09SDavid van Moolenbroek 	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
107*00b67f09SDavid van Moolenbroek static IN_ rfc2104_1 = {"RFC 2104 #1", rfc2104_1_key, sizeof(rfc2104_1_key),
108*00b67f09SDavid van Moolenbroek 	STR_INIT("Hi There")};
109*00b67f09SDavid van Moolenbroek static OUT_ rfc2104_1_hmac = {
110*00b67f09SDavid van Moolenbroek 	"9294727a3638bb1c13f48ef8158bfc9d",
111*00b67f09SDavid van Moolenbroek 	16};
112*00b67f09SDavid van Moolenbroek 
113*00b67f09SDavid van Moolenbroek static IN_ rfc2104_2 = {"RFC 2104 #2", STR_INIT("Jefe"),
114*00b67f09SDavid van Moolenbroek 	STR_INIT("what do ya want for nothing?")};
115*00b67f09SDavid van Moolenbroek static OUT_ rfc2104_2_hmac = {
116*00b67f09SDavid van Moolenbroek 	"750c783e6ab0b503eaa86e310a5db738",
117*00b67f09SDavid van Moolenbroek 	16};
118*00b67f09SDavid van Moolenbroek 
119*00b67f09SDavid van Moolenbroek static const unsigned char rfc2104_3_key[16] = {
120*00b67f09SDavid van Moolenbroek 	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
121*00b67f09SDavid van Moolenbroek 	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
122*00b67f09SDavid van Moolenbroek static const unsigned char rfc2104_3_s[50] = {
123*00b67f09SDavid van Moolenbroek 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
124*00b67f09SDavid van Moolenbroek 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
125*00b67f09SDavid van Moolenbroek 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
126*00b67f09SDavid van Moolenbroek 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
127*00b67f09SDavid van Moolenbroek 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
128*00b67f09SDavid van Moolenbroek 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
129*00b67f09SDavid van Moolenbroek 	0xDD, 0xDD};
130*00b67f09SDavid van Moolenbroek static IN_ rfc2104_3 = {"RFC 2104 #3", rfc2104_3_key, sizeof(rfc2104_3_key),
131*00b67f09SDavid van Moolenbroek 	rfc2104_3_s, sizeof(rfc2104_3_s)};
132*00b67f09SDavid van Moolenbroek static OUT_ rfc2104_3_hmac = {
133*00b67f09SDavid van Moolenbroek 	"56be34521d144c88dbb8c733f0e8b3f6",
134*00b67f09SDavid van Moolenbroek 	16};
135*00b67f09SDavid van Moolenbroek 
136*00b67f09SDavid van Moolenbroek /*
137*00b67f09SDavid van Moolenbroek  * four three HMAC-SHA tests cut-and-pasted from RFC 4634 starting on page 86
138*00b67f09SDavid van Moolenbroek  */
139*00b67f09SDavid van Moolenbroek static const unsigned char rfc4634_1_key[20] = {
140*00b67f09SDavid van Moolenbroek       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
141*00b67f09SDavid van Moolenbroek       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
142*00b67f09SDavid van Moolenbroek };
143*00b67f09SDavid van Moolenbroek static IN_ rfc4634_1 = {"RFC 4634 #1", rfc4634_1_key, sizeof(rfc4634_1_key),
144*00b67f09SDavid van Moolenbroek 	STR_INIT("Hi There")};
145*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_1_sha1 = {
146*00b67f09SDavid van Moolenbroek 	"B617318655057264E28BC0B6FB378C8EF146BE00",
147*00b67f09SDavid van Moolenbroek 	ISC_SHA1_DIGESTLENGTH};
148*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_1_sha224 = {
149*00b67f09SDavid van Moolenbroek 	"896FB1128ABBDF196832107CD49DF33F47B4B1169912BA4F53684B22",
150*00b67f09SDavid van Moolenbroek 	ISC_SHA224_DIGESTLENGTH};
151*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_1_sha256 = {
152*00b67f09SDavid van Moolenbroek 	"B0344C61D8DB38535CA8AFCEAF0BF12B881DC200C9833DA726E9376C2E32"
153*00b67f09SDavid van Moolenbroek 	"CFF7",
154*00b67f09SDavid van Moolenbroek 	ISC_SHA256_DIGESTLENGTH};
155*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_1_sha384 = {
156*00b67f09SDavid van Moolenbroek 	"AFD03944D84895626B0825F4AB46907F15F9DADBE4101EC682AA034C7CEB"
157*00b67f09SDavid van Moolenbroek 	"C59CFAEA9EA9076EDE7F4AF152E8B2FA9CB6",
158*00b67f09SDavid van Moolenbroek 	ISC_SHA384_DIGESTLENGTH};
159*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_1_sha512 = {
160*00b67f09SDavid van Moolenbroek 	"87AA7CDEA5EF619D4FF0B4241A1D6CB02379F4E2CE4EC2787AD0B30545E1"
161*00b67f09SDavid van Moolenbroek 	"7CDEDAA833B7D6B8A702038B274EAEA3F4E4BE9D914EEB61F1702E696C20"
162*00b67f09SDavid van Moolenbroek 	"3A126854",
163*00b67f09SDavid van Moolenbroek 	ISC_SHA512_DIGESTLENGTH};
164*00b67f09SDavid van Moolenbroek 
165*00b67f09SDavid van Moolenbroek static IN_ rfc4634_2 = {"RFC 4634 #2", STR_INIT("Jefe"),
166*00b67f09SDavid van Moolenbroek 	STR_INIT("what do ya want for nothing?")};
167*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_2_sha1 = {
168*00b67f09SDavid van Moolenbroek 	"EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79",
169*00b67f09SDavid van Moolenbroek 	ISC_SHA1_DIGESTLENGTH};
170*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_2_sha224 = {
171*00b67f09SDavid van Moolenbroek 	"A30E01098BC6DBBF45690F3A7E9E6D0F8BBEA2A39E6148008FD05E44",
172*00b67f09SDavid van Moolenbroek 	ISC_SHA224_DIGESTLENGTH};
173*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_2_sha256 = {
174*00b67f09SDavid van Moolenbroek 	"5BDCC146BF60754E6A042426089575C75A003F089D2739839DEC58B964EC"
175*00b67f09SDavid van Moolenbroek 	"3843",
176*00b67f09SDavid van Moolenbroek 	ISC_SHA256_DIGESTLENGTH};
177*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_2_sha384 = {
178*00b67f09SDavid van Moolenbroek 	"AF45D2E376484031617F78D2B58A6B1B9C7EF464F5A01B47E42EC3736322"
179*00b67f09SDavid van Moolenbroek 	"445E8E2240CA5E69E2C78B3239ECFAB21649",
180*00b67f09SDavid van Moolenbroek 	ISC_SHA384_DIGESTLENGTH};
181*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_2_sha512 = {
182*00b67f09SDavid van Moolenbroek 	"164B7A7BFCF819E2E395FBE73B56E0A387BD64222E831FD610270CD7EA25"
183*00b67f09SDavid van Moolenbroek 	"05549758BF75C05A994A6D034F65F8F0E6FDCAEAB1A34D4A6B4B636E070A"
184*00b67f09SDavid van Moolenbroek 	"38BCE737",
185*00b67f09SDavid van Moolenbroek 	ISC_SHA512_DIGESTLENGTH};
186*00b67f09SDavid van Moolenbroek 
187*00b67f09SDavid van Moolenbroek static const unsigned char rfc4634_3_key[20] = {
188*00b67f09SDavid van Moolenbroek 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
189*00b67f09SDavid van Moolenbroek 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
190*00b67f09SDavid van Moolenbroek };
191*00b67f09SDavid van Moolenbroek static const unsigned char rfc4634_3_s[50] = {
192*00b67f09SDavid van Moolenbroek 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
193*00b67f09SDavid van Moolenbroek 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
194*00b67f09SDavid van Moolenbroek 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
195*00b67f09SDavid van Moolenbroek 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
196*00b67f09SDavid van Moolenbroek 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd
197*00b67f09SDavid van Moolenbroek };
198*00b67f09SDavid van Moolenbroek static IN_ rfc4634_3 = {"RFC 4634 #3", rfc4634_3_key, sizeof(rfc4634_3_key),
199*00b67f09SDavid van Moolenbroek 	rfc4634_3_s, sizeof(rfc4634_3_s)};
200*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_3_sha1 = {
201*00b67f09SDavid van Moolenbroek 	"125D7342B9AC11CD91A39AF48AA17B4F63F175D3",
202*00b67f09SDavid van Moolenbroek 	ISC_SHA1_DIGESTLENGTH};
203*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_3_sha224 = {
204*00b67f09SDavid van Moolenbroek 	"7FB3CB3588C6C1F6FFA9694D7D6AD2649365B0C1F65D69D1EC8333EA",
205*00b67f09SDavid van Moolenbroek 	ISC_SHA224_DIGESTLENGTH};
206*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_3_sha256 = {
207*00b67f09SDavid van Moolenbroek 	"773EA91E36800E46854DB8EBD09181A72959098B3EF8C122D9635514CED5"
208*00b67f09SDavid van Moolenbroek 	"65FE",
209*00b67f09SDavid van Moolenbroek 	ISC_SHA256_DIGESTLENGTH};
210*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_3_sha384 = {
211*00b67f09SDavid van Moolenbroek 	"88062608D3E6AD8A0AA2ACE014C8A86F0AA635D947AC9FEBE83EF4E55966"
212*00b67f09SDavid van Moolenbroek 	"144B2A5AB39DC13814B94E3AB6E101A34F27",
213*00b67f09SDavid van Moolenbroek 	ISC_SHA384_DIGESTLENGTH};
214*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_3_sha512 = {
215*00b67f09SDavid van Moolenbroek 	"FA73B0089D56A284EFB0F0756C890BE9B1B5DBDD8EE81A3655F83E33B227"
216*00b67f09SDavid van Moolenbroek 	"9D39BF3E848279A722C806B485A47E67C807B946A337BEE8942674278859"
217*00b67f09SDavid van Moolenbroek 	"E13292FB",
218*00b67f09SDavid van Moolenbroek 	ISC_SHA512_DIGESTLENGTH};
219*00b67f09SDavid van Moolenbroek 
220*00b67f09SDavid van Moolenbroek static const unsigned char rfc4634_4_key[25] = {
221*00b67f09SDavid van Moolenbroek 	0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
222*00b67f09SDavid van Moolenbroek 	0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
223*00b67f09SDavid van Moolenbroek 	0x15, 0x16, 0x17, 0x18, 0x19
224*00b67f09SDavid van Moolenbroek };
225*00b67f09SDavid van Moolenbroek static const unsigned char rfc4634_4_s[50] = {
226*00b67f09SDavid van Moolenbroek 	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
227*00b67f09SDavid van Moolenbroek 	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
228*00b67f09SDavid van Moolenbroek 	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
229*00b67f09SDavid van Moolenbroek 	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
230*00b67f09SDavid van Moolenbroek 	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd
231*00b67f09SDavid van Moolenbroek };
232*00b67f09SDavid van Moolenbroek static IN_ rfc4634_4 = {"RFC 4634 #3", rfc4634_4_key, sizeof(rfc4634_4_key),
233*00b67f09SDavid van Moolenbroek 	rfc4634_4_s, sizeof(rfc4634_4_s)};
234*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_4_sha1 = {
235*00b67f09SDavid van Moolenbroek 	"4C9007F4026250C6BC8414F9BF50C86C2D7235DA",
236*00b67f09SDavid van Moolenbroek 	ISC_SHA1_DIGESTLENGTH};
237*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_4_sha224 = {
238*00b67f09SDavid van Moolenbroek 	"6C11506874013CAC6A2ABC1BB382627CEC6A90D86EFC012DE7AFEC5A",
239*00b67f09SDavid van Moolenbroek 	ISC_SHA224_DIGESTLENGTH};
240*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_4_sha256 = {
241*00b67f09SDavid van Moolenbroek 	"82558A389A443C0EA4CC819899F2083A85F0FAA3E578F8077A2E3FF46729"
242*00b67f09SDavid van Moolenbroek 	"665B",
243*00b67f09SDavid van Moolenbroek 	ISC_SHA256_DIGESTLENGTH};
244*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_4_sha384 = {
245*00b67f09SDavid van Moolenbroek 	"3E8A69B7783C25851933AB6290AF6CA77A9981480850009CC5577C6E1F57"
246*00b67f09SDavid van Moolenbroek 	"3B4E6801DD23C4A7D679CCF8A386C674CFFB",
247*00b67f09SDavid van Moolenbroek 	ISC_SHA384_DIGESTLENGTH};
248*00b67f09SDavid van Moolenbroek static OUT_ rfc4634_4_sha512 = {
249*00b67f09SDavid van Moolenbroek 	"B0BA465637458C6990E5A8C5F61D4AF7E576D97FF94B872DE76F8050361E"
250*00b67f09SDavid van Moolenbroek 	"E3DBA91CA5C11AA25EB4D679275CC5788063A5F19741120C4F2DE2ADEBEB"
251*00b67f09SDavid van Moolenbroek 	"10A298DD",
252*00b67f09SDavid van Moolenbroek 	ISC_SHA512_DIGESTLENGTH};
253*00b67f09SDavid van Moolenbroek 
254*00b67f09SDavid van Moolenbroek 
255*00b67f09SDavid van Moolenbroek 
256*00b67f09SDavid van Moolenbroek static const char *
d2str(char * buf,unsigned int buf_len,const unsigned char * d,unsigned int d_len)257*00b67f09SDavid van Moolenbroek d2str(char *buf, unsigned int buf_len,
258*00b67f09SDavid van Moolenbroek       const unsigned char *d, unsigned int d_len)
259*00b67f09SDavid van Moolenbroek {
260*00b67f09SDavid van Moolenbroek 	unsigned int i, l;
261*00b67f09SDavid van Moolenbroek 
262*00b67f09SDavid van Moolenbroek 	l = 0;
263*00b67f09SDavid van Moolenbroek 	for (i = 0; i < d_len && l < buf_len-4; ++i) {
264*00b67f09SDavid van Moolenbroek 		l += snprintf(&buf[l], buf_len-l, "%02x", d[i]);
265*00b67f09SDavid van Moolenbroek 	}
266*00b67f09SDavid van Moolenbroek 	if (l >= buf_len-3) {
267*00b67f09SDavid van Moolenbroek 		REQUIRE(buf_len > sizeof("..."));
268*00b67f09SDavid van Moolenbroek 		strcpy(&buf[l-sizeof(" ...")], " ...");
269*00b67f09SDavid van Moolenbroek 	}
270*00b67f09SDavid van Moolenbroek 	return buf;
271*00b67f09SDavid van Moolenbroek }
272*00b67f09SDavid van Moolenbroek 
273*00b67f09SDavid van Moolenbroek 
274*00b67f09SDavid van Moolenbroek 
275*00b67f09SDavid van Moolenbroek /*
276*00b67f09SDavid van Moolenbroek  * Compare binary digest or HMAC to string of hex digits from an RFC
277*00b67f09SDavid van Moolenbroek  */
278*00b67f09SDavid van Moolenbroek static void
ck(const char * name,const IN_ * in,const OUT_ * out)279*00b67f09SDavid van Moolenbroek ck(const char *name, const IN_ *in, const OUT_ *out)
280*00b67f09SDavid van Moolenbroek {
281*00b67f09SDavid van Moolenbroek 	char buf[sizeof(dbuf)*2+1];
282*00b67f09SDavid van Moolenbroek 	const char *str_name;
283*00b67f09SDavid van Moolenbroek 	unsigned int l;
284*00b67f09SDavid van Moolenbroek 
285*00b67f09SDavid van Moolenbroek 	d2str(buf, sizeof(buf), dbuf.b, out->digest_len);
286*00b67f09SDavid van Moolenbroek 	str_name = in->name != NULL ? in->name : (const char *)in->str;
287*00b67f09SDavid van Moolenbroek 
288*00b67f09SDavid van Moolenbroek 	if (T_debug != 0)
289*00b67f09SDavid van Moolenbroek 		t_info("%s(%s) = %s\n", name, str_name, buf);
290*00b67f09SDavid van Moolenbroek 
291*00b67f09SDavid van Moolenbroek 	if (strcasecmp(buf, out->str)) {
292*00b67f09SDavid van Moolenbroek 		t_info("%s(%s)\n%9s %s\n%9s %s\n",
293*00b67f09SDavid van Moolenbroek 		       name, str_name,
294*00b67f09SDavid van Moolenbroek 		       "is", buf,
295*00b67f09SDavid van Moolenbroek 		       "should be", out->str);
296*00b67f09SDavid van Moolenbroek 		++nprobs;
297*00b67f09SDavid van Moolenbroek 		return;
298*00b67f09SDavid van Moolenbroek 	}
299*00b67f09SDavid van Moolenbroek 
300*00b67f09SDavid van Moolenbroek 	/*
301*00b67f09SDavid van Moolenbroek 	 * check that the hash or HMAC is no longer than we think it is
302*00b67f09SDavid van Moolenbroek 	 */
303*00b67f09SDavid van Moolenbroek 	for (l = out->digest_len; l < sizeof(dbuf); ++l) {
304*00b67f09SDavid van Moolenbroek 		if (dbuf.b[l] != DIGEST_FILL) {
305*00b67f09SDavid van Moolenbroek 			t_info("byte #%d after end of %s(%s) changed to %02x\n",
306*00b67f09SDavid van Moolenbroek 			       l-out->digest_len, name, str_name, dbuf.b[l]);
307*00b67f09SDavid van Moolenbroek 			++nprobs;
308*00b67f09SDavid van Moolenbroek 			break;
309*00b67f09SDavid van Moolenbroek 		}
310*00b67f09SDavid van Moolenbroek 	}
311*00b67f09SDavid van Moolenbroek }
312*00b67f09SDavid van Moolenbroek 
313*00b67f09SDavid van Moolenbroek 
314*00b67f09SDavid van Moolenbroek 
315*00b67f09SDavid van Moolenbroek static void
t_hash(const char * hname,HASH_INIT init,UPDATE update,FINAL final,IN_ * in,OUT_ * out)316*00b67f09SDavid van Moolenbroek t_hash(const char *hname, HASH_INIT init, UPDATE update, FINAL final,
317*00b67f09SDavid van Moolenbroek       IN_ *in, OUT_ *out)
318*00b67f09SDavid van Moolenbroek {
319*00b67f09SDavid van Moolenbroek 	union {
320*00b67f09SDavid van Moolenbroek 	    unsigned char b[1024];
321*00b67f09SDavid van Moolenbroek 	    isc_sha1_t sha1;
322*00b67f09SDavid van Moolenbroek 	    isc_md5_t md5;
323*00b67f09SDavid van Moolenbroek 	} ctx;
324*00b67f09SDavid van Moolenbroek 
325*00b67f09SDavid van Moolenbroek 	init(&ctx);
326*00b67f09SDavid van Moolenbroek 	update(&ctx, in->str, in->str_len);
327*00b67f09SDavid van Moolenbroek 	memset(dbuf.b, DIGEST_FILL, sizeof(dbuf));
328*00b67f09SDavid van Moolenbroek 	final(&ctx, dbuf.b);
329*00b67f09SDavid van Moolenbroek 	ck(hname, in, out);
330*00b67f09SDavid van Moolenbroek }
331*00b67f09SDavid van Moolenbroek 
332*00b67f09SDavid van Moolenbroek 
333*00b67f09SDavid van Moolenbroek 
334*00b67f09SDavid van Moolenbroek /*
335*00b67f09SDavid van Moolenbroek  * isc_sha224_final has a different calling sequence
336*00b67f09SDavid van Moolenbroek  */
337*00b67f09SDavid van Moolenbroek static void
t_sha224(IN_ * in,OUT_ * out)338*00b67f09SDavid van Moolenbroek t_sha224(IN_ *in, OUT_ *out)
339*00b67f09SDavid van Moolenbroek {
340*00b67f09SDavid van Moolenbroek 	isc_sha224_t ctx;
341*00b67f09SDavid van Moolenbroek 
342*00b67f09SDavid van Moolenbroek 	memset(dbuf.b, DIGEST_FILL, sizeof(dbuf));
343*00b67f09SDavid van Moolenbroek 	isc_sha224_init(&ctx);
344*00b67f09SDavid van Moolenbroek 	isc_sha224_update(&ctx, in->str, in->str_len);
345*00b67f09SDavid van Moolenbroek 	memset(dbuf.b, DIGEST_FILL, sizeof(dbuf));
346*00b67f09SDavid van Moolenbroek 	isc_sha224_final(dbuf.b, &ctx);
347*00b67f09SDavid van Moolenbroek 	ck("SHA224", in, out);
348*00b67f09SDavid van Moolenbroek }
349*00b67f09SDavid van Moolenbroek 
350*00b67f09SDavid van Moolenbroek 
351*00b67f09SDavid van Moolenbroek 
352*00b67f09SDavid van Moolenbroek static void
t_hashes(IN_ * in,OUT_ * out_sha1,OUT_ * out_sha224,OUT_ * out_md5)353*00b67f09SDavid van Moolenbroek t_hashes(IN_ *in, OUT_ *out_sha1, OUT_ *out_sha224, OUT_ *out_md5)
354*00b67f09SDavid van Moolenbroek {
355*00b67f09SDavid van Moolenbroek 	t_hash("SHA1", (HASH_INIT)isc_sha1_init, (UPDATE)isc_sha1_update,
356*00b67f09SDavid van Moolenbroek 	       (FINAL)isc_sha1_final, in, out_sha1);
357*00b67f09SDavid van Moolenbroek 	t_sha224(in, out_sha224);
358*00b67f09SDavid van Moolenbroek 	t_hash("md5", (HASH_INIT)isc_md5_init, (UPDATE)isc_md5_update,
359*00b67f09SDavid van Moolenbroek 	       (FINAL)isc_md5_final, in, out_md5);
360*00b67f09SDavid van Moolenbroek }
361*00b67f09SDavid van Moolenbroek 
362*00b67f09SDavid van Moolenbroek 
363*00b67f09SDavid van Moolenbroek 
364*00b67f09SDavid van Moolenbroek /*
365*00b67f09SDavid van Moolenbroek  * isc_hmacmd5_sign has a different calling sequence
366*00b67f09SDavid van Moolenbroek  */
367*00b67f09SDavid van Moolenbroek static void
t_md5hmac(IN_ * in,OUT_ * out)368*00b67f09SDavid van Moolenbroek t_md5hmac(IN_ *in, OUT_ *out)
369*00b67f09SDavid van Moolenbroek {
370*00b67f09SDavid van Moolenbroek 	isc_hmacmd5_t ctx;
371*00b67f09SDavid van Moolenbroek 
372*00b67f09SDavid van Moolenbroek 	isc_hmacmd5_init(&ctx, in->key, in->key_len);
373*00b67f09SDavid van Moolenbroek 	isc_hmacmd5_update(&ctx, in->str, in->str_len);
374*00b67f09SDavid van Moolenbroek 	memset(dbuf.b, DIGEST_FILL, sizeof(dbuf));
375*00b67f09SDavid van Moolenbroek 	isc_hmacmd5_sign(&ctx, dbuf.b);
376*00b67f09SDavid van Moolenbroek 	ck("HMAC-md5", in, out);
377*00b67f09SDavid van Moolenbroek }
378*00b67f09SDavid van Moolenbroek 
379*00b67f09SDavid van Moolenbroek 
380*00b67f09SDavid van Moolenbroek 
381*00b67f09SDavid van Moolenbroek static void
t_hmac(const char * hname,HMAC_INIT init,UPDATE update,SIGN sign,IN_ * in,OUT_ * out)382*00b67f09SDavid van Moolenbroek t_hmac(const char *hname, HMAC_INIT init, UPDATE update, SIGN sign,
383*00b67f09SDavid van Moolenbroek       IN_ *in, OUT_ *out)
384*00b67f09SDavid van Moolenbroek {
385*00b67f09SDavid van Moolenbroek 	union {
386*00b67f09SDavid van Moolenbroek 	    unsigned char b[1024];
387*00b67f09SDavid van Moolenbroek 	    isc_hmacmd5_t hmacmd5;
388*00b67f09SDavid van Moolenbroek 	    isc_hmacsha1_t hmacsha1;
389*00b67f09SDavid van Moolenbroek 	    isc_hmacsha224_t hmacsha224;
390*00b67f09SDavid van Moolenbroek 	    isc_hmacsha256_t hmacsha256;
391*00b67f09SDavid van Moolenbroek 	    isc_hmacsha384_t hmacsha384;
392*00b67f09SDavid van Moolenbroek 	    isc_hmacsha512_t hmacsha512;
393*00b67f09SDavid van Moolenbroek 	} ctx;
394*00b67f09SDavid van Moolenbroek 
395*00b67f09SDavid van Moolenbroek 	init(&ctx, in->key, in->key_len);
396*00b67f09SDavid van Moolenbroek 	update(&ctx, in->str, in->str_len);
397*00b67f09SDavid van Moolenbroek 	memset(dbuf.b, DIGEST_FILL, sizeof(dbuf));
398*00b67f09SDavid van Moolenbroek 	sign(&ctx, dbuf.b, out->digest_len);
399*00b67f09SDavid van Moolenbroek 	ck(hname, in, out);
400*00b67f09SDavid van Moolenbroek }
401*00b67f09SDavid van Moolenbroek 
402*00b67f09SDavid van Moolenbroek 
403*00b67f09SDavid van Moolenbroek 
404*00b67f09SDavid van Moolenbroek static void
t_hmacs(IN_ * in,OUT_ * out_sha1,OUT_ * out_sha224,OUT_ * out_sha256,OUT_ * out_sha384,OUT_ * out_sha512)405*00b67f09SDavid van Moolenbroek t_hmacs(IN_ *in, OUT_ *out_sha1, OUT_ *out_sha224, OUT_ *out_sha256,
406*00b67f09SDavid van Moolenbroek 	OUT_ *out_sha384, OUT_ *out_sha512)
407*00b67f09SDavid van Moolenbroek {
408*00b67f09SDavid van Moolenbroek 	t_hmac("HMAC-SHA1", (HMAC_INIT)isc_hmacsha1_init,
409*00b67f09SDavid van Moolenbroek 	       (UPDATE)isc_hmacsha1_update, (SIGN)isc_hmacsha1_sign,
410*00b67f09SDavid van Moolenbroek 	       in, out_sha1);
411*00b67f09SDavid van Moolenbroek 	t_hmac("HMAC-SHA224", (HMAC_INIT)isc_hmacsha224_init,
412*00b67f09SDavid van Moolenbroek 	       (UPDATE)isc_hmacsha224_update, (SIGN)isc_hmacsha224_sign,
413*00b67f09SDavid van Moolenbroek 	       in, out_sha224);
414*00b67f09SDavid van Moolenbroek 	t_hmac("HMAC-SHA256", (HMAC_INIT)isc_hmacsha256_init,
415*00b67f09SDavid van Moolenbroek 	       (UPDATE)isc_hmacsha256_update, (SIGN)isc_hmacsha256_sign,
416*00b67f09SDavid van Moolenbroek 	       in, out_sha256);
417*00b67f09SDavid van Moolenbroek 	t_hmac("HMAC-SHA384", (HMAC_INIT)isc_hmacsha384_init,
418*00b67f09SDavid van Moolenbroek 	       (UPDATE)isc_hmacsha384_update, (SIGN)isc_hmacsha384_sign,
419*00b67f09SDavid van Moolenbroek 	       in, out_sha384);
420*00b67f09SDavid van Moolenbroek 	t_hmac("HMAC-SHA512", (HMAC_INIT)isc_hmacsha512_init,
421*00b67f09SDavid van Moolenbroek 	       (UPDATE)isc_hmacsha512_update, (SIGN)isc_hmacsha512_sign,
422*00b67f09SDavid van Moolenbroek 	       in, out_sha512);
423*00b67f09SDavid van Moolenbroek }
424*00b67f09SDavid van Moolenbroek 
425*00b67f09SDavid van Moolenbroek 
426*00b67f09SDavid van Moolenbroek 
427*00b67f09SDavid van Moolenbroek /*
428*00b67f09SDavid van Moolenbroek  * This will almost never fail, and so there is no need for the extra noise
429*00b67f09SDavid van Moolenbroek  * that would come from breaking it into several tests.
430*00b67f09SDavid van Moolenbroek  */
431*00b67f09SDavid van Moolenbroek static void
t1(void)432*00b67f09SDavid van Moolenbroek t1(void)
433*00b67f09SDavid van Moolenbroek {
434*00b67f09SDavid van Moolenbroek 	/*
435*00b67f09SDavid van Moolenbroek 	 * two ad hoc hash examples
436*00b67f09SDavid van Moolenbroek 	 */
437*00b67f09SDavid van Moolenbroek 	t_hashes(&abc, &abc_sha1, &abc_sha224, &abc_md5);
438*00b67f09SDavid van Moolenbroek 	t_hashes(&abc_blah, &abc_blah_sha1, &abc_blah_sha224, &abc_blah_md5);
439*00b67f09SDavid van Moolenbroek 
440*00b67f09SDavid van Moolenbroek 	/*
441*00b67f09SDavid van Moolenbroek 	 * three HMAC-md5 examples from RFC 2104
442*00b67f09SDavid van Moolenbroek 	 */
443*00b67f09SDavid van Moolenbroek 	t_md5hmac(&rfc2104_1, &rfc2104_1_hmac);
444*00b67f09SDavid van Moolenbroek 	t_md5hmac(&rfc2104_2, &rfc2104_2_hmac);
445*00b67f09SDavid van Moolenbroek 	t_md5hmac(&rfc2104_3, &rfc2104_3_hmac);
446*00b67f09SDavid van Moolenbroek 
447*00b67f09SDavid van Moolenbroek 	/*
448*00b67f09SDavid van Moolenbroek 	 * four HMAC-SHA tests from RFC 4634 starting on page 86
449*00b67f09SDavid van Moolenbroek 	 */
450*00b67f09SDavid van Moolenbroek 	t_hmacs(&rfc4634_1, &rfc4634_1_sha1, &rfc4634_1_sha224,
451*00b67f09SDavid van Moolenbroek 		&rfc4634_1_sha256, &rfc4634_1_sha384, &rfc4634_1_sha512);
452*00b67f09SDavid van Moolenbroek 	t_hmacs(&rfc4634_2, &rfc4634_2_sha1, &rfc4634_2_sha224,
453*00b67f09SDavid van Moolenbroek 		&rfc4634_2_sha256, &rfc4634_2_sha384, &rfc4634_2_sha512);
454*00b67f09SDavid van Moolenbroek 	t_hmacs(&rfc4634_3, &rfc4634_3_sha1, &rfc4634_3_sha224,
455*00b67f09SDavid van Moolenbroek 		&rfc4634_3_sha256, &rfc4634_3_sha384, &rfc4634_3_sha512);
456*00b67f09SDavid van Moolenbroek 	t_hmacs(&rfc4634_4, &rfc4634_4_sha1, &rfc4634_4_sha224,
457*00b67f09SDavid van Moolenbroek 		&rfc4634_4_sha256, &rfc4634_4_sha384, &rfc4634_4_sha512);
458*00b67f09SDavid van Moolenbroek 
459*00b67f09SDavid van Moolenbroek 	if (nprobs != 0)
460*00b67f09SDavid van Moolenbroek 		t_result(T_FAIL);
461*00b67f09SDavid van Moolenbroek 	else
462*00b67f09SDavid van Moolenbroek 		t_result(T_PASS);
463*00b67f09SDavid van Moolenbroek }
464*00b67f09SDavid van Moolenbroek 
465*00b67f09SDavid van Moolenbroek 
466*00b67f09SDavid van Moolenbroek testspec_t	T_testlist[] = {
467*00b67f09SDavid van Moolenbroek 	{	(PFV) t1,		"hashes"		},
468*00b67f09SDavid van Moolenbroek 	{	(PFV) 0,		NULL			}
469*00b67f09SDavid van Moolenbroek };
470*00b67f09SDavid van Moolenbroek 
471*00b67f09SDavid van Moolenbroek #ifdef WIN32
472*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)473*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
474*00b67f09SDavid van Moolenbroek 	t_settests(T_testlist);
475*00b67f09SDavid van Moolenbroek 	return (t_main(argc, argv));
476*00b67f09SDavid van Moolenbroek }
477*00b67f09SDavid van Moolenbroek #endif
478