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