Mercurial > dropbear
comparison demos/test.c @ 0:d7da3b1e1540 libtomcrypt
put back the 0.95 makefile which was inadvertently merged over
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Mon, 31 May 2004 18:21:40 +0000 |
parents | |
children | 6362d3854bb4 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:d7da3b1e1540 |
---|---|
1 /* This is the worst code you have ever seen written on purpose.... this code is just a big hack to test | |
2 out the functionality of the library */ | |
3 | |
4 #ifdef SONY_PS2 | |
5 #include <eetypes.h> | |
6 #include <eeregs.h> | |
7 #include "timer.h" | |
8 #endif | |
9 | |
10 #include <mycrypt.h> | |
11 | |
12 int errnum; | |
13 | |
14 | |
15 int | |
16 null_setup (const unsigned char *key, int keylen, int num_rounds, | |
17 symmetric_key * skey) | |
18 { | |
19 return CRYPT_OK; | |
20 } | |
21 | |
22 void | |
23 null_ecb_encrypt (const unsigned char *pt, unsigned char *ct, | |
24 symmetric_key * key) | |
25 { | |
26 memcpy (ct, pt, 8); | |
27 } | |
28 | |
29 void | |
30 null_ecb_decrypt (const unsigned char *ct, unsigned char *pt, | |
31 symmetric_key * key) | |
32 { | |
33 memcpy (pt, ct, 8); | |
34 } | |
35 | |
36 int | |
37 null_test (void) | |
38 { | |
39 return CRYPT_OK; | |
40 } | |
41 | |
42 int | |
43 null_keysize (int *desired_keysize) | |
44 { | |
45 return CRYPT_OK; | |
46 } | |
47 | |
48 const struct _cipher_descriptor null_desc = { | |
49 "memcpy()", | |
50 255, | |
51 8, 8, 8, 1, | |
52 &null_setup, | |
53 &null_ecb_encrypt, | |
54 &null_ecb_decrypt, | |
55 &null_test, | |
56 &null_keysize | |
57 }; | |
58 | |
59 | |
60 prng_state prng; | |
61 | |
62 void | |
63 store_tests (void) | |
64 { | |
65 unsigned char buf[8]; | |
66 unsigned long L; | |
67 ulong64 LL; | |
68 | |
69 printf ("LOAD32/STORE32 tests\n"); | |
70 L = 0x12345678UL; | |
71 STORE32L (L, &buf[0]); | |
72 L = 0; | |
73 LOAD32L (L, &buf[0]); | |
74 if (L != 0x12345678UL) { | |
75 printf ("LOAD/STORE32 Little don't work\n"); | |
76 exit (-1); | |
77 } | |
78 LL = CONST64 (0x01020304050607); | |
79 STORE64L (LL, &buf[0]); | |
80 LL = 0; | |
81 LOAD64L (LL, &buf[0]) | |
82 if (LL != CONST64 (0x01020304050607)) { | |
83 printf ("LOAD/STORE64 Little don't work\n"); | |
84 exit (-1); | |
85 } | |
86 | |
87 L = 0x12345678UL; | |
88 STORE32H (L, &buf[0]); | |
89 L = 0; | |
90 LOAD32H (L, &buf[0]); | |
91 if (L != 0x12345678UL) { | |
92 printf ("LOAD/STORE32 High don't work, %08lx\n", L); | |
93 exit (-1); | |
94 } | |
95 LL = CONST64 (0x01020304050607); | |
96 STORE64H (LL, &buf[0]); | |
97 LL = 0; | |
98 LOAD64H (LL, &buf[0]) | |
99 if (LL != CONST64 (0x01020304050607)) { | |
100 printf ("LOAD/STORE64 High don't work\n"); | |
101 exit (-1); | |
102 } | |
103 } | |
104 | |
105 void | |
106 cipher_tests (void) | |
107 { | |
108 int x; | |
109 | |
110 printf ("Ciphers compiled in\n"); | |
111 for (x = 0; cipher_descriptor[x].name != NULL; x++) { | |
112 printf | |
113 (" %12s (%2d) Key Size: %4d to %4d, Block Size: %3d, Default # of rounds: %2d\n", | |
114 cipher_descriptor[x].name, cipher_descriptor[x].ID, | |
115 cipher_descriptor[x].min_key_length * 8, | |
116 cipher_descriptor[x].max_key_length * 8, | |
117 cipher_descriptor[x].block_length * 8, | |
118 cipher_descriptor[x].default_rounds); | |
119 } | |
120 | |
121 } | |
122 | |
123 void | |
124 ecb_tests (void) | |
125 { | |
126 int x; | |
127 | |
128 printf ("ECB tests\n"); | |
129 for (x = 0; cipher_descriptor[x].name != NULL; x++) { | |
130 printf (" %12s: ", cipher_descriptor[x].name); | |
131 if ((errnum = cipher_descriptor[x].test ()) != CRYPT_OK) { | |
132 printf (" **failed** Reason: %s\n", error_to_string (errnum)); | |
133 exit (-1); | |
134 } else { | |
135 printf ("passed\n"); | |
136 } | |
137 } | |
138 } | |
139 | |
140 #ifdef CBC | |
141 void | |
142 cbc_tests (void) | |
143 { | |
144 symmetric_CBC cbc; | |
145 int x, y; | |
146 unsigned char blk[32], ct[32], key[32], IV[32]; | |
147 const unsigned char test[] = | |
148 { 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; | |
149 | |
150 printf ("CBC tests\n"); | |
151 /* ---- CBC ENCODING ---- */ | |
152 /* make up a block and IV */ | |
153 for (x = 0; x < 32; x++) | |
154 blk[x] = IV[x] = x; | |
155 | |
156 /* now lets start a cbc session */ | |
157 if ((errnum = | |
158 cbc_start (find_cipher ("blowfish"), IV, key, 16, 0, | |
159 &cbc)) != CRYPT_OK) { | |
160 printf ("CBC Setup: %s\n", error_to_string (errnum)); | |
161 exit (-1); | |
162 } | |
163 | |
164 /* now lets encode 32 bytes */ | |
165 for (x = 0; x < 4; x++) { | |
166 if ((errnum = cbc_encrypt (blk + 8 * x, ct + 8 * x, &cbc)) != CRYPT_OK) { | |
167 printf ("CBC encrypt: %s\n", error_to_string (errnum)); | |
168 exit (-1); | |
169 } | |
170 } | |
171 | |
172 zeromem (blk, sizeof (blk)); | |
173 | |
174 /* ---- CBC DECODING ---- */ | |
175 /* make up a IV */ | |
176 for (x = 0; x < 32; x++) | |
177 IV[x] = x; | |
178 | |
179 /* now lets start a cbc session */ | |
180 if ((errnum = | |
181 cbc_start (find_cipher ("blowfish"), IV, key, 16, 0, | |
182 &cbc)) != CRYPT_OK) { | |
183 printf ("CBC Setup: %s\n", error_to_string (errnum)); | |
184 exit (-1); | |
185 } | |
186 | |
187 /* now lets decode 32 bytes */ | |
188 for (x = 0; x < 4; x++) { | |
189 if ((errnum = cbc_decrypt (ct + 8 * x, blk + 8 * x, &cbc)) != CRYPT_OK) { | |
190 printf ("CBC decrypt: %s\n", error_to_string (errnum)); | |
191 exit (-1); | |
192 } | |
193 } | |
194 | |
195 | |
196 /* print output */ | |
197 for (x = y = 0; x < 32; x++) | |
198 if (blk[x] != x) | |
199 y = 1; | |
200 printf (" %s\n", y ? "failed" : "passed"); | |
201 | |
202 /* lets actually check the bytes */ | |
203 memset (IV, 0, 8); | |
204 IV[0] = 0xFF; /* IV = FF 00 00 00 00 00 00 00 */ | |
205 memset (blk, 0, 32); | |
206 blk[8] = 0xFF; /* BLK = 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 */ | |
207 cbc_start (find_cipher ("memcpy()"), IV, key, 8, 0, &cbc); | |
208 cbc_encrypt (blk, ct, &cbc); /* expect: FF 00 00 00 00 00 00 00 */ | |
209 cbc_encrypt (blk + 8, ct + 8, &cbc); /* expect: 00 00 00 00 00 00 00 00 */ | |
210 if (memcmp (ct, test, 16)) { | |
211 printf ("CBC failed logical testing.\n"); | |
212 for (x = 0; x < 16; x++) | |
213 printf ("%02x ", ct[x]); | |
214 printf ("\n"); | |
215 exit (-1); | |
216 } else { | |
217 printf ("CBC passed logical testing.\n"); | |
218 } | |
219 } | |
220 #else | |
221 void | |
222 cbc_tests (void) | |
223 { | |
224 printf ("CBC not compiled in\n"); | |
225 } | |
226 #endif | |
227 | |
228 #ifdef OFB | |
229 void | |
230 ofb_tests (void) | |
231 { | |
232 symmetric_OFB ofb; | |
233 int x, y; | |
234 unsigned char blk[32], ct[32], key[32], IV[32]; | |
235 | |
236 printf ("OFB tests\n"); | |
237 /* ---- ofb ENCODING ---- */ | |
238 /* make up a block and IV */ | |
239 for (x = 0; x < 32; x++) | |
240 blk[x] = IV[x] = x; | |
241 | |
242 /* now lets start a ofb session */ | |
243 if ((errnum = | |
244 ofb_start (find_cipher ("cast5"), IV, key, 16, 0, &ofb)) != CRYPT_OK) { | |
245 printf ("OFB Setup: %s\n", error_to_string (errnum)); | |
246 exit (-1); | |
247 } | |
248 | |
249 /* now lets encode 32 bytes */ | |
250 for (x = 0; x < 4; x++) { | |
251 if ((errnum = ofb_encrypt (blk + 8 * x, ct + 8 * x, 8, &ofb)) != CRYPT_OK) { | |
252 printf ("OFB encrypt: %s\n", error_to_string (errnum)); | |
253 exit (-1); | |
254 } | |
255 } | |
256 | |
257 zeromem (blk, sizeof (blk)); | |
258 | |
259 /* ---- ofb DECODING ---- */ | |
260 /* make up a IV */ | |
261 for (x = 0; x < 32; x++) | |
262 IV[x] = x; | |
263 | |
264 /* now lets start a ofb session */ | |
265 if ((errnum = | |
266 ofb_start (find_cipher ("cast5"), IV, key, 16, 0, &ofb)) != CRYPT_OK) { | |
267 printf ("OFB setup: %s\n", error_to_string (errnum)); | |
268 exit (-1); | |
269 } | |
270 | |
271 /* now lets decode 32 bytes */ | |
272 for (x = 0; x < 4; x++) { | |
273 if ((errnum = ofb_decrypt (ct + 8 * x, blk + 8 * x, 8, &ofb)) != CRYPT_OK) { | |
274 printf ("OFB decrypt: %s\n", error_to_string (errnum)); | |
275 exit (-1); | |
276 } | |
277 } | |
278 | |
279 /* print output */ | |
280 for (x = y = 0; x < 32; x++) | |
281 if (blk[x] != x) | |
282 y = 1; | |
283 printf (" %s\n", y ? "failed" : "passed"); | |
284 if (y) | |
285 exit (-1); | |
286 } | |
287 #else | |
288 void | |
289 ofb_tests (void) | |
290 { | |
291 printf ("OFB not compiled in\n"); | |
292 } | |
293 #endif | |
294 | |
295 #ifdef CFB | |
296 void | |
297 cfb_tests (void) | |
298 { | |
299 symmetric_CFB cfb; | |
300 int x, y; | |
301 unsigned char blk[32], ct[32], key[32], IV[32]; | |
302 | |
303 printf ("CFB tests\n"); | |
304 /* ---- cfb ENCODING ---- */ | |
305 /* make up a block and IV */ | |
306 for (x = 0; x < 32; x++) | |
307 blk[x] = IV[x] = x; | |
308 | |
309 /* now lets start a cfb session */ | |
310 if ((errnum = | |
311 cfb_start (find_cipher ("blowfish"), IV, key, 16, 0, | |
312 &cfb)) != CRYPT_OK) { | |
313 printf ("CFB setup: %s\n", error_to_string (errnum)); | |
314 exit (-1); | |
315 } | |
316 | |
317 /* now lets encode 32 bytes */ | |
318 for (x = 0; x < 4; x++) { | |
319 if ((errnum = cfb_encrypt (blk + 8 * x, ct + 8 * x, 8, &cfb)) != CRYPT_OK) { | |
320 printf ("CFB encrypt: %s\n", error_to_string (errnum)); | |
321 exit (-1); | |
322 } | |
323 } | |
324 | |
325 zeromem (blk, sizeof (blk)); | |
326 | |
327 /* ---- cfb DECODING ---- */ | |
328 /* make up ahash_descriptor[prng->yarrow.hash].hashsize IV */ | |
329 for (x = 0; x < 32; x++) | |
330 IV[x] = x; | |
331 | |
332 /* now lets start a cfb session */ | |
333 if ((errnum = | |
334 cfb_start (find_cipher ("blowfish"), IV, key, 16, 0, | |
335 &cfb)) != CRYPT_OK) { | |
336 printf ("CFB Setup: %s\n", error_to_string (errnum)); | |
337 exit (-1); | |
338 } | |
339 | |
340 /* now lets decode 32 bytes */ | |
341 for (x = 0; x < 4; x++) { | |
342 if ((errnum = cfb_decrypt (ct + 8 * x, blk + 8 * x, 8, &cfb)) != CRYPT_OK) { | |
343 printf ("CFB decrypt: %s\n", error_to_string (errnum)); | |
344 exit (-1); | |
345 } | |
346 } | |
347 | |
348 /* print output */ | |
349 for (x = y = 0; x < 32; x++) | |
350 if (blk[x] != x) | |
351 y = 1; | |
352 printf (" %s\n", y ? "failed" : "passed"); | |
353 if (y) | |
354 exit (-1); | |
355 } | |
356 #else | |
357 void | |
358 cfb_tests (void) | |
359 { | |
360 printf ("CFB not compiled in\n"); | |
361 } | |
362 #endif | |
363 | |
364 #ifdef CTR | |
365 void | |
366 ctr_tests (void) | |
367 { | |
368 symmetric_CTR ctr; | |
369 int x, y; | |
370 unsigned char blk[32], ct[32], key[32], count[32]; | |
371 const unsigned char test[] = | |
372 { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0 }; | |
373 | |
374 printf ("CTR tests\n"); | |
375 /* ---- CTR ENCODING ---- */ | |
376 /* make up a block and IV */ | |
377 for (x = 0; x < 32; x++) | |
378 blk[x] = count[x] = x; | |
379 | |
380 /* now lets start a ctr session */ | |
381 if ((errnum = | |
382 ctr_start (find_cipher ("xtea"), count, key, 16, 0, | |
383 &ctr)) != CRYPT_OK) { | |
384 printf ("CTR Setup: %s\n", error_to_string (errnum)); | |
385 exit (-1); | |
386 } | |
387 | |
388 /* now lets encode 32 bytes */ | |
389 for (x = 0; x < 4; x++) { | |
390 if ((errnum = ctr_encrypt (blk + 8 * x, ct + 8 * x, 8, &ctr)) != CRYPT_OK) { | |
391 printf ("CTR encrypt: %s\n", error_to_string (errnum)); | |
392 exit (-1); | |
393 } | |
394 } | |
395 | |
396 zeromem (blk, sizeof (blk)); | |
397 | |
398 /* ---- CTR DECODING ---- */ | |
399 /* make up a IV */ | |
400 for (x = 0; x < 32; x++) | |
401 count[x] = x; | |
402 | |
403 /* now lets start a cbc session */ | |
404 if ((errnum = | |
405 ctr_start (find_cipher ("xtea"), count, key, 16, 0, | |
406 &ctr)) != CRYPT_OK) { | |
407 printf ("CTR Setup: %s\n", error_to_string (errnum)); | |
408 exit (-1); | |
409 } | |
410 | |
411 /* now lets decode 32 bytes */ | |
412 for (x = 0; x < 4; x++) { | |
413 if ((errnum = ctr_decrypt (ct + 8 * x, blk + 8 * x, 8, &ctr)) != CRYPT_OK) { | |
414 printf ("CTR decrypt: %s\n", error_to_string (errnum)); | |
415 exit (-1); | |
416 } | |
417 } | |
418 | |
419 /* print output */ | |
420 for (x = y = 0; x < 32; x++) | |
421 if (blk[x] != x) | |
422 y = 1; | |
423 printf (" %s\n", y ? "failed" : "passed"); | |
424 if (y) | |
425 exit (-1); | |
426 | |
427 /* lets actually check the bytes */ | |
428 memset (count, 0, 8); | |
429 count[0] = 0xFF; /* IV = FF 00 00 00 00 00 00 00 */ | |
430 memset (blk, 0, 32); | |
431 blk[9] = 2; /* BLK = 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 */ | |
432 ctr_start (find_cipher ("memcpy()"), count, key, 8, 0, &ctr); | |
433 ctr_encrypt (blk, ct, 8, &ctr); /* expect: FF 00 00 00 00 00 00 00 */ | |
434 ctr_encrypt (blk + 8, ct + 8, 8, &ctr); /* expect: 00 03 00 00 00 00 00 00 */ | |
435 if (memcmp (ct, test, 16)) { | |
436 printf ("CTR failed logical testing.\n"); | |
437 for (x = 0; x < 16; x++) | |
438 printf ("%02x ", ct[x]); | |
439 printf ("\n"); | |
440 } else { | |
441 printf ("CTR passed logical testing.\n"); | |
442 } | |
443 | |
444 } | |
445 #else | |
446 void | |
447 ctr_tests (void) | |
448 { | |
449 printf ("CTR not compiled in\n"); | |
450 } | |
451 #endif | |
452 | |
453 void | |
454 hash_tests (void) | |
455 { | |
456 int x; | |
457 printf ("Hash tests\n"); | |
458 for (x = 0; hash_descriptor[x].name != NULL; x++) { | |
459 printf (" %10s (%2d) ", hash_descriptor[x].name, hash_descriptor[x].ID); | |
460 if ((errnum = hash_descriptor[x].test ()) != CRYPT_OK) { | |
461 printf ("**failed** Reason: %s\n", error_to_string (errnum)); | |
462 exit(-1); | |
463 } else { | |
464 printf ("passed\n"); | |
465 } | |
466 } | |
467 } | |
468 | |
469 #ifdef MRSA | |
470 void | |
471 pad_test (void) | |
472 { | |
473 unsigned char in[100], out[100]; | |
474 unsigned long x, y; | |
475 | |
476 /* make a dummy message */ | |
477 for (x = 0; x < 16; x++) | |
478 in[x] = (unsigned char) x; | |
479 | |
480 /* pad the message so that random filler is placed before and after it */ | |
481 y = 100; | |
482 if ((errnum = | |
483 rsa_pad (in, 16, out, &y, find_prng ("yarrow"), &prng)) != CRYPT_OK) { | |
484 printf ("Error: %s\n", error_to_string (errnum)); | |
485 exit (-1); | |
486 } | |
487 | |
488 /* depad the message to get the original content */ | |
489 memset (in, 0, sizeof (in)); | |
490 x = 100; | |
491 if ((errnum = rsa_depad (out, y, in, &x)) != CRYPT_OK) { | |
492 printf ("Error: %s\n", error_to_string (errnum)); | |
493 exit (-1); | |
494 } | |
495 | |
496 /* check outcome */ | |
497 printf ("rsa_pad: "); | |
498 if (x != 16) { | |
499 printf ("Failed. Wrong size.\n"); | |
500 exit (-1); | |
501 } | |
502 for (x = 0; x < 16; x++) | |
503 if (in[x] != x) { | |
504 printf ("Failed. Expected %02lx and got %02x.\n", x, in[x]); | |
505 exit (-1); | |
506 } | |
507 printf ("passed.\n"); | |
508 } | |
509 void | |
510 rsa_test (void) | |
511 { | |
512 unsigned char in[520], out[520]; | |
513 unsigned long x, y, z, limit; | |
514 int stat; | |
515 rsa_key key; | |
516 clock_t t; | |
517 | |
518 /* ---- SINGLE ENCRYPT ---- */ | |
519 /* encrypt a short 8 byte string */ | |
520 if ((errnum = | |
521 rsa_make_key (&prng, find_prng ("yarrow"), 1024 / 8, 65537, | |
522 &key)) != CRYPT_OK) { | |
523 printf ("Error: %s\n", error_to_string (errnum)); | |
524 exit (-1); | |
525 } | |
526 for (x = 0; x < 8; x++) | |
527 in[x] = (unsigned char) (x + 1); | |
528 y = sizeof (in); | |
529 if ((errnum = rsa_exptmod (in, 8, out, &y, PK_PUBLIC, &key)) != CRYPT_OK) { | |
530 printf ("Error: %s\n", error_to_string (errnum)); | |
531 exit (-1); | |
532 } | |
533 | |
534 /* decrypt it */ | |
535 zeromem (in, sizeof (in)); | |
536 x = sizeof (out); | |
537 if ((errnum = rsa_exptmod (out, y, in, &x, PK_PRIVATE, &key)) != CRYPT_OK) { | |
538 printf ("Error: %s\n", error_to_string (errnum)); | |
539 exit (-1); | |
540 } | |
541 | |
542 /* compare */ | |
543 printf ("RSA : "); | |
544 for (x = 0; x < 8; x++) | |
545 if (in[x] != (x + 1)) { | |
546 printf ("Failed. x==%02lx, in[%ld]==%02x\n", x, x, in[x]); | |
547 exit (-1); | |
548 } | |
549 printf ("passed.\n"); | |
550 | |
551 /* test the rsa_encrypt_key functions */ | |
552 for (x = 0; x < 16; x++) | |
553 in[x] = x; | |
554 y = sizeof (out); | |
555 if ((errnum = | |
556 rsa_encrypt_key (in, 16, out, &y, &prng, find_prng ("yarrow"), | |
557 &key)) != CRYPT_OK) { | |
558 printf ("Error: %s\n", error_to_string (errnum)); | |
559 exit (-1); | |
560 } | |
561 zeromem (in, sizeof (in)); | |
562 x = sizeof (in); | |
563 if ((errnum = rsa_decrypt_key (out, y, in, &x, &key)) != CRYPT_OK) { | |
564 printf ("Error: %s\n", error_to_string (errnum)); | |
565 exit (-1); | |
566 } | |
567 printf ("RSA en/de crypt key routines: "); | |
568 if (x != 16) { | |
569 printf ("Failed (length)\n"); | |
570 exit (-1); | |
571 } | |
572 for (x = 0; x < 16; x++) | |
573 if (in[x] != x) { | |
574 printf ("Failed (contents)\n"); | |
575 exit (-1); | |
576 } | |
577 printf ("Passed\n"); | |
578 | |
579 /* test sign_hash functions */ | |
580 for (x = 0; x < 16; x++) | |
581 in[x] = x; | |
582 x = sizeof (in); | |
583 if ((errnum = rsa_sign_hash (in, 16, out, &x, &key)) != CRYPT_OK) { | |
584 printf ("Error: %s\n", error_to_string (errnum)); | |
585 exit (-1); | |
586 } | |
587 printf ("RSA signed hash: %lu bytes\n", x); | |
588 if ((errnum = rsa_verify_hash (out, x, in, &stat, &key)) != CRYPT_OK) { | |
589 printf ("Error: %s\n", error_to_string (errnum)); | |
590 exit (-1); | |
591 } | |
592 printf ("Verify hash: %s, ", stat ? "passed" : "failed"); | |
593 in[0] ^= 1; | |
594 if ((errnum = rsa_verify_hash (out, x, in, &stat, &key)) != CRYPT_OK) { | |
595 printf ("Error: %s\n", error_to_string (errnum)); | |
596 exit (-1); | |
597 } | |
598 printf ("%s\n", (!stat) ? "passed" : "failed"); | |
599 if (stat) | |
600 exit (-1); | |
601 rsa_free (&key); | |
602 | |
603 /* make a RSA key */ | |
604 #ifdef SONY_PS2_NOPE | |
605 limit = 1024; | |
606 #else | |
607 limit = 2048; | |
608 #endif | |
609 | |
610 { | |
611 int tt; | |
612 | |
613 for (z = 1024; z <= limit; z += 512) { | |
614 t = XCLOCK (); | |
615 for (tt = 0; tt < 3; tt++) { | |
616 if ((errnum = rsa_make_key (&prng, find_prng ("yarrow"), z / 8, 65537, &key)) != CRYPT_OK) { | |
617 printf ("Error: %s\n", error_to_string (errnum)); | |
618 exit (-1); | |
619 } | |
620 | |
621 /* check modulus size */ | |
622 if (mp_unsigned_bin_size(&key.N) != (int)(z/8)) { | |
623 printf("\nRSA key supposed to be %lu bits but was %d bits\n", z, mp_count_bits(&key.N)); | |
624 exit(EXIT_FAILURE); | |
625 } | |
626 | |
627 if (tt < 2) { | |
628 rsa_free (&key); | |
629 } | |
630 } | |
631 t = XCLOCK () - t; | |
632 printf ("Took %.0f ms to make a %ld-bit RSA key.\n", 1000.0 * (((double) t / 3.0) / (double) XCLOCKS_PER_SEC), z); | |
633 | |
634 /* time encryption */ | |
635 t = XCLOCK (); | |
636 | |
637 for (tt = 0; tt < 20; tt++) { | |
638 y = sizeof (in); | |
639 if ((errnum = rsa_exptmod (in, 8, out, &y, PK_PUBLIC, &key)) != CRYPT_OK) { | |
640 printf ("Error: %s\n", error_to_string (errnum)); | |
641 exit (-1); | |
642 } | |
643 } | |
644 t = XCLOCK () - t; | |
645 printf ("Took %.0f ms to encrypt with a %ld-bit RSA key.\n", | |
646 1000.0 * (((double) t / 20.0) / (double) XCLOCKS_PER_SEC), z); | |
647 | |
648 /* time decryption */ | |
649 t = XCLOCK (); | |
650 for (tt = 0; tt < 20; tt++) { | |
651 x = sizeof (out); | |
652 if ((errnum = rsa_exptmod (out, y, in, &x, PK_PRIVATE, &key)) != CRYPT_OK) { | |
653 printf ("Error: %s\n", error_to_string (errnum)); | |
654 exit (-1); | |
655 } | |
656 } | |
657 t = XCLOCK () - t; | |
658 printf ("Took %.0f ms to decrypt with a %ld-bit RSA key.\n", | |
659 1000.0 * (((double) t / 20.0) / (double) XCLOCKS_PER_SEC), z); | |
660 rsa_free (&key); | |
661 } | |
662 } | |
663 } | |
664 #else | |
665 void | |
666 pad_test (void) | |
667 { | |
668 printf ("MRSA not compiled in\n"); | |
669 } | |
670 | |
671 void | |
672 rsa_test (void) | |
673 { | |
674 printf ("MRSA not compiled in\n"); | |
675 } | |
676 #endif | |
677 | |
678 #ifdef BASE64 | |
679 void | |
680 base64_test (void) | |
681 { | |
682 unsigned char buf[2][100]; | |
683 unsigned long x, y; | |
684 | |
685 printf ("Base64 tests\n"); | |
686 zeromem (buf, sizeof (buf)); | |
687 for (x = 0; x < 16; x++) | |
688 buf[0][x] = (unsigned char) x; | |
689 | |
690 x = 100; | |
691 if (base64_encode (buf[0], 16, buf[1], &x) != CRYPT_OK) { | |
692 printf (" error: %s\n", error_to_string (errnum)); | |
693 exit (-1); | |
694 } | |
695 printf (" encoded 16 bytes to %ld bytes...[%s]\n", x, buf[1]); | |
696 memset (buf[0], 0, 100); | |
697 y = 100; | |
698 if (base64_decode (buf[1], x, buf[0], &y) != CRYPT_OK) { | |
699 printf (" error: %s\n", error_to_string (errnum)); | |
700 exit (-1); | |
701 } | |
702 printf (" decoded %ld bytes to %ld bytes\n", x, y); | |
703 for (x = 0; x < 16; x++) | |
704 if (buf[0][x] != x) { | |
705 printf (" **failed**\n"); | |
706 exit (-1); | |
707 } | |
708 printf (" passed\n"); | |
709 } | |
710 #else | |
711 void | |
712 base64_test (void) | |
713 { | |
714 printf ("Base64 not compiled in\n"); | |
715 } | |
716 #endif | |
717 | |
718 void | |
719 time_hash (void) | |
720 { | |
721 clock_t t1; | |
722 int x, y; | |
723 unsigned long z; | |
724 unsigned char input[4096], out[MAXBLOCKSIZE]; | |
725 printf ("Hash Time Trials (4KB blocks):\n"); | |
726 for (x = 0; hash_descriptor[x].name != NULL; x++) { | |
727 t1 = XCLOCK (); | |
728 z = sizeof (out); | |
729 y = 0; | |
730 while (XCLOCK () - t1 < (5 * XCLOCKS_PER_SEC)) { | |
731 hash_memory (x, input, 4096, out, &z); | |
732 hash_memory (x, input, 4096, out, &z); | |
733 hash_memory (x, input, 4096, out, &z); | |
734 hash_memory (x, input, 4096, out, &z); | |
735 hash_memory (x, input, 4096, out, &z); | |
736 hash_memory (x, input, 4096, out, &z); | |
737 hash_memory (x, input, 4096, out, &z); | |
738 hash_memory (x, input, 4096, out, &z); | |
739 hash_memory (x, input, 4096, out, &z); | |
740 hash_memory (x, input, 4096, out, &z); | |
741 hash_memory (x, input, 4096, out, &z); | |
742 hash_memory (x, input, 4096, out, &z); | |
743 hash_memory (x, input, 4096, out, &z); | |
744 hash_memory (x, input, 4096, out, &z); | |
745 hash_memory (x, input, 4096, out, &z); | |
746 hash_memory (x, input, 4096, out, &z); | |
747 hash_memory (x, input, 4096, out, &z); | |
748 hash_memory (x, input, 4096, out, &z); | |
749 hash_memory (x, input, 4096, out, &z); | |
750 hash_memory (x, input, 4096, out, &z); | |
751 hash_memory (x, input, 4096, out, &z); | |
752 hash_memory (x, input, 4096, out, &z); | |
753 hash_memory (x, input, 4096, out, &z); | |
754 hash_memory (x, input, 4096, out, &z); | |
755 hash_memory (x, input, 4096, out, &z); | |
756 hash_memory (x, input, 4096, out, &z); | |
757 hash_memory (x, input, 4096, out, &z); | |
758 hash_memory (x, input, 4096, out, &z); | |
759 hash_memory (x, input, 4096, out, &z); | |
760 hash_memory (x, input, 4096, out, &z); | |
761 hash_memory (x, input, 4096, out, &z); | |
762 hash_memory (x, input, 4096, out, &z); | |
763 y += 32; | |
764 } | |
765 t1 = XCLOCK () - t1; | |
766 printf ("%-20s: Hash at %5.2f Mbit/sec\n", hash_descriptor[x].name, | |
767 ((8.0 * 4096.0) * | |
768 ((double) y / ((double) t1 / (double) XCLOCKS_PER_SEC))) / | |
769 1000000.0); | |
770 } | |
771 } | |
772 | |
773 void | |
774 time_ecb (void) | |
775 { | |
776 clock_t t1, t2; | |
777 long x, y1, y2; | |
778 unsigned char pt[32], key[32]; | |
779 symmetric_key skey; | |
780 void (*func) (const unsigned char *, unsigned char *, symmetric_key *); | |
781 | |
782 printf ("ECB Time Trials for the Symmetric Ciphers:\n"); | |
783 for (x = 0; cipher_descriptor[x].name != NULL; x++) { | |
784 cipher_descriptor[x].setup (key, cipher_descriptor[x].min_key_length, 0, | |
785 &skey); | |
786 | |
787 #define DO1 func(pt,pt,&skey); | |
788 #define DO2 DO1 DO1 | |
789 #define DO4 DO2 DO2 | |
790 #define DO8 DO4 DO4 | |
791 #define DO16 DO8 DO8 | |
792 #define DO32 DO16 DO16 | |
793 #define DO64 DO32 DO32 | |
794 #define DO128 DO64 DO64 | |
795 #define DO256 DO128 DO128 | |
796 | |
797 func = cipher_descriptor[x].ecb_encrypt; | |
798 y1 = 0; | |
799 t1 = XCLOCK (); | |
800 while (XCLOCK () - t1 < 3 * XCLOCKS_PER_SEC) { | |
801 DO256; | |
802 y1 += 256; | |
803 } | |
804 t1 = XCLOCK () - t1; | |
805 | |
806 func = cipher_descriptor[x].ecb_decrypt; | |
807 y2 = 0; | |
808 t2 = XCLOCK (); | |
809 while (XCLOCK () - t2 < 3 * XCLOCKS_PER_SEC) { | |
810 DO256; | |
811 y2 += 256; | |
812 } | |
813 t2 = XCLOCK () - t2; | |
814 printf | |
815 ("%-20s: Encrypt at %5.2f Mbit/sec and Decrypt at %5.2f Mbit/sec\n", | |
816 cipher_descriptor[x].name, | |
817 ((8.0 * (double) cipher_descriptor[x].block_length) * | |
818 ((double) y1 / ((double) t1 / (double) XCLOCKS_PER_SEC))) / 1000000.0, | |
819 ((8.0 * (double) cipher_descriptor[x].block_length) * | |
820 ((double) y2 / ((double) t2 / (double) XCLOCKS_PER_SEC))) / | |
821 1000000.0); | |
822 | |
823 #undef DO256 | |
824 #undef DO128 | |
825 #undef DO64 | |
826 #undef DO32 | |
827 #undef DO16 | |
828 #undef DO8 | |
829 #undef DO4 | |
830 #undef DO2 | |
831 #undef DO1 | |
832 } | |
833 } | |
834 | |
835 #ifdef MDH | |
836 void | |
837 dh_tests (void) | |
838 { | |
839 unsigned char buf[3][4096]; | |
840 unsigned long x, y, z; | |
841 int low, high, stat, stat2; | |
842 dh_key usera, userb; | |
843 clock_t t1; | |
844 | |
845 printf("Testing builting DH parameters...."); fflush(stdout); | |
846 if ((errnum = dh_test()) != CRYPT_OK) { | |
847 printf("DH Error: %s\n", error_to_string(errnum)); | |
848 exit(-1); | |
849 } | |
850 printf("Passed.\n"); | |
851 | |
852 dh_sizes (&low, &high); | |
853 printf ("DH Keys from %d to %d supported.\n", low * 8, high * 8); | |
854 | |
855 /* make up two keys */ | |
856 if ((errnum = | |
857 dh_make_key (&prng, find_prng ("yarrow"), 96, &usera)) != CRYPT_OK) { | |
858 printf ("Error: %s\n", error_to_string (errnum)); | |
859 exit (-1); | |
860 } | |
861 if ((errnum = | |
862 dh_make_key (&prng, find_prng ("yarrow"), 96, &userb)) != CRYPT_OK) { | |
863 printf ("Error: %s\n", error_to_string (errnum)); | |
864 exit (-1); | |
865 } | |
866 | |
867 /* make the shared secret */ | |
868 x = 4096; | |
869 if ((errnum = dh_shared_secret (&usera, &userb, buf[0], &x)) != CRYPT_OK) { | |
870 printf ("Error: %s\n", error_to_string (errnum)); | |
871 exit (-1); | |
872 } | |
873 | |
874 y = 4096; | |
875 if ((errnum = dh_shared_secret (&userb, &usera, buf[1], &y)) != CRYPT_OK) { | |
876 printf ("Error: %s\n", error_to_string (errnum)); | |
877 exit (-1); | |
878 } | |
879 if (y != x) { | |
880 printf ("DH Shared keys are not same size.\n"); | |
881 exit (-1); | |
882 } | |
883 if (memcmp (buf[0], buf[1], x)) { | |
884 printf ("DH Shared keys not same contents.\n"); | |
885 exit (-1); | |
886 } | |
887 | |
888 /* now export userb */ | |
889 y = 4096; | |
890 if ((errnum = dh_export (buf[1], &y, PK_PUBLIC, &userb)) != CRYPT_OK) { | |
891 printf ("Error: %s\n", error_to_string (errnum)); | |
892 exit (-1); | |
893 } | |
894 dh_free (&userb); | |
895 | |
896 /* import and make the shared secret again */ | |
897 if ((errnum = dh_import (buf[1], y, &userb)) != CRYPT_OK) { | |
898 printf ("Error: %s\n", error_to_string (errnum)); | |
899 exit (-1); | |
900 } | |
901 z = 4096; | |
902 if ((errnum = dh_shared_secret (&usera, &userb, buf[2], &z)) != CRYPT_OK) { | |
903 printf ("Error: %s\n", error_to_string (errnum)); | |
904 exit (-1); | |
905 } | |
906 | |
907 printf ("DH routines: "); | |
908 if (z != x) { | |
909 printf ("failed. Size don't match?\n"); | |
910 exit (-1); | |
911 } | |
912 if (memcmp (buf[0], buf[2], x)) { | |
913 printf ("Failed. Content didn't match.\n"); | |
914 exit (-1); | |
915 } | |
916 printf ("Passed\n"); | |
917 dh_free (&usera); | |
918 dh_free (&userb); | |
919 | |
920 /* time stuff */ | |
921 { | |
922 static int sizes[] = { 96, 128, 160, 192, 224, 256, 320, 384, 512 }; | |
923 int ii, tt; | |
924 | |
925 for (ii = 0; ii < (int) (sizeof (sizes) / sizeof (sizes[0])); ii++) { | |
926 t1 = XCLOCK (); | |
927 for (tt = 0; tt < 25; tt++) { | |
928 dh_make_key (&prng, find_prng ("yarrow"), sizes[ii], &usera); | |
929 dh_free (&usera); | |
930 } | |
931 t1 = XCLOCK () - t1; | |
932 printf ("Make dh-%d key took %f msec\n", sizes[ii] * 8, | |
933 1000.0 * (((double) t1 / 25.0) / (double) XCLOCKS_PER_SEC)); | |
934 } | |
935 } | |
936 | |
937 /* test encrypt_key */ | |
938 dh_make_key (&prng, find_prng ("yarrow"), 128, &usera); | |
939 for (x = 0; x < 16; x++) | |
940 buf[0][x] = x; | |
941 y = sizeof (buf[1]); | |
942 if ((errnum = | |
943 dh_encrypt_key (buf[0], 16, buf[1], &y, &prng, find_prng ("yarrow"), | |
944 find_hash ("md5"), &usera)) != CRYPT_OK) { | |
945 printf ("Error: %s\n", error_to_string (errnum)); | |
946 exit (-1); | |
947 } | |
948 zeromem (buf[0], sizeof (buf[0])); | |
949 x = sizeof (buf[0]); | |
950 if ((errnum = dh_decrypt_key (buf[1], y, buf[0], &x, &usera)) != CRYPT_OK) { | |
951 printf ("Error: %s\n", error_to_string (errnum)); | |
952 exit (-1); | |
953 } | |
954 printf ("DH en/de crypt key routines: "); | |
955 if (x != 16) { | |
956 printf ("Failed (length)\n"); | |
957 exit (-1); | |
958 } | |
959 for (x = 0; x < 16; x++) | |
960 if (buf[0][x] != x) { | |
961 printf ("Failed (contents)\n"); | |
962 exit (-1); | |
963 } | |
964 printf ("Passed (size %lu)\n", y); | |
965 | |
966 /* test sign_hash */ | |
967 for (x = 0; x < 16; x++) | |
968 buf[0][x] = x; | |
969 x = sizeof (buf[1]); | |
970 if ((errnum = | |
971 dh_sign_hash (buf[0], 16, buf[1], &x, &prng, find_prng ("yarrow"), | |
972 &usera)) != CRYPT_OK) { | |
973 printf ("Error: %s\n", error_to_string (errnum)); | |
974 exit (-1); | |
975 } | |
976 if ((errnum = dh_verify_hash (buf[1], x, buf[0], 16, &stat, &usera)) != CRYPT_OK) { | |
977 printf ("Error: %s\n", error_to_string (errnum)); | |
978 exit (-1); | |
979 } | |
980 buf[0][0] ^= 1; | |
981 if ((errnum = dh_verify_hash (buf[1], x, buf[0], 16, &stat2, &usera)) != CRYPT_OK) { | |
982 printf ("Error: %s\n", error_to_string (errnum)); | |
983 exit (-1); | |
984 } | |
985 printf ("dh_sign/verify_hash: %s (%d,%d), %lu\n", | |
986 ((stat == 1) | |
987 && (stat2 == 0)) ? "passed" : "failed", stat, stat2, x); | |
988 dh_free (&usera); | |
989 } | |
990 #else | |
991 void | |
992 dh_tests (void) | |
993 { | |
994 printf ("MDH not compiled in\n"); | |
995 } | |
996 #endif | |
997 | |
998 int callback_x = 0; | |
999 void | |
1000 callback (void) | |
1001 { | |
1002 printf ("%c\x08", "-\\|/"[++callback_x & 3]); | |
1003 #ifndef SONY_PS2 | |
1004 fflush (stdout); | |
1005 #endif | |
1006 } | |
1007 | |
1008 void | |
1009 rng_tests (void) | |
1010 { | |
1011 unsigned char buf[16]; | |
1012 clock_t t1; | |
1013 int x, y; | |
1014 | |
1015 printf ("RNG tests\n"); | |
1016 t1 = XCLOCK (); | |
1017 x = rng_get_bytes (buf, sizeof (buf), &callback); | |
1018 t1 = XCLOCK () - t1; | |
1019 printf (" %f bytes per second...", | |
1020 (double) x / ((double) t1 / (double) XCLOCKS_PER_SEC)); | |
1021 printf ("read %d bytes.\n ", x); | |
1022 for (y = 0; y < x; y++) | |
1023 printf ("%02x ", buf[y]); | |
1024 printf ("\n"); | |
1025 | |
1026 #ifdef YARROW | |
1027 if ((errnum = | |
1028 rng_make_prng (128, find_prng ("yarrow"), &prng, | |
1029 &callback)) != CRYPT_OK) { | |
1030 printf (" starting yarrow error: %s\n", error_to_string (errnum)); | |
1031 exit (-1); | |
1032 } | |
1033 #endif | |
1034 } | |
1035 | |
1036 #ifdef MECC | |
1037 void | |
1038 ecc_tests (void) | |
1039 { | |
1040 unsigned char buf[4][4096]; | |
1041 unsigned long x, y, z; | |
1042 int stat, stat2, low, high; | |
1043 ecc_key usera, userb; | |
1044 clock_t t1; | |
1045 | |
1046 if ((errnum = ecc_test ()) != CRYPT_OK) { | |
1047 printf ("ecc Error: %s\n", error_to_string (errnum)); | |
1048 exit (-1); | |
1049 } | |
1050 | |
1051 ecc_sizes (&low, &high); | |
1052 printf ("ecc Keys from %d to %d supported.\n", low * 8, high * 8); | |
1053 | |
1054 /* make up two keys */ | |
1055 if ((errnum = | |
1056 ecc_make_key (&prng, find_prng ("yarrow"), 24, &usera)) != CRYPT_OK) { | |
1057 printf ("Error: %s\n", error_to_string (errnum)); | |
1058 exit (-1); | |
1059 } | |
1060 if ((errnum = | |
1061 ecc_make_key (&prng, find_prng ("yarrow"), 24, &userb)) != CRYPT_OK) { | |
1062 printf ("Error: %s\n", error_to_string (errnum)); | |
1063 exit (-1); | |
1064 } | |
1065 | |
1066 /* make the shared secret */ | |
1067 x = 4096; | |
1068 if ((errnum = ecc_shared_secret (&usera, &userb, buf[0], &x)) != CRYPT_OK) { | |
1069 printf ("Error: %s\n", error_to_string (errnum)); | |
1070 exit (-1); | |
1071 } | |
1072 | |
1073 y = 4096; | |
1074 if ((errnum = ecc_shared_secret (&userb, &usera, buf[1], &y)) != CRYPT_OK) { | |
1075 printf ("Error: %s\n", error_to_string (errnum)); | |
1076 exit (-1); | |
1077 } | |
1078 | |
1079 if (y != x) { | |
1080 printf ("ecc Shared keys are not same size.\n"); | |
1081 exit (-1); | |
1082 } | |
1083 | |
1084 if (memcmp (buf[0], buf[1], x)) { | |
1085 printf ("ecc Shared keys not same contents.\n"); | |
1086 exit (-1); | |
1087 } | |
1088 | |
1089 /* now export userb */ | |
1090 y = 4096; | |
1091 if ((errnum = ecc_export (buf[1], &y, PK_PUBLIC, &userb)) != CRYPT_OK) { | |
1092 printf ("Error: %s\n", error_to_string (errnum)); | |
1093 exit (-1); | |
1094 } | |
1095 ecc_free (&userb); | |
1096 printf ("ECC-192 export took %ld bytes\n", y); | |
1097 | |
1098 /* import and make the shared secret again */ | |
1099 if ((errnum = ecc_import (buf[1], y, &userb)) != CRYPT_OK) { | |
1100 printf ("Error: %s\n", error_to_string (errnum)); | |
1101 exit (-1); | |
1102 } | |
1103 | |
1104 z = 4096; | |
1105 if ((errnum = ecc_shared_secret (&usera, &userb, buf[2], &z)) != CRYPT_OK) { | |
1106 printf ("Error: %s\n", error_to_string (errnum)); | |
1107 exit (-1); | |
1108 } | |
1109 | |
1110 printf ("ecc routines: "); | |
1111 if (z != x) { | |
1112 printf ("failed. Size don't match?\n"); | |
1113 exit (-1); | |
1114 } | |
1115 if (memcmp (buf[0], buf[2], x)) { | |
1116 printf ("Failed. Content didn't match.\n"); | |
1117 exit (-1); | |
1118 } | |
1119 printf ("Passed\n"); | |
1120 ecc_free (&usera); | |
1121 ecc_free (&userb); | |
1122 | |
1123 /* time stuff */ | |
1124 { | |
1125 static int sizes[] = { 20, 24, 28, 32, 48, 65 }; | |
1126 int ii, tt; | |
1127 | |
1128 for (ii = 0; ii < (int) (sizeof (sizes) / sizeof (sizes[0])); ii++) { | |
1129 t1 = XCLOCK (); | |
1130 for (tt = 0; tt < 10; tt++) { | |
1131 if ((errnum = | |
1132 ecc_make_key (&prng, find_prng ("yarrow"), sizes[ii], | |
1133 &usera)) != CRYPT_OK) { | |
1134 printf ("Error: %s\n", error_to_string (errnum)); | |
1135 exit (-1); | |
1136 } | |
1137 ecc_free (&usera); | |
1138 } | |
1139 t1 = XCLOCK () - t1; | |
1140 printf ("Make ECC-%d key took %f msec\n", sizes[ii] * 8, | |
1141 1000.0 * (((double) t1 / 10.0) / (double) XCLOCKS_PER_SEC)); | |
1142 } | |
1143 } | |
1144 | |
1145 /* test encrypt_key */ | |
1146 ecc_make_key (&prng, find_prng ("yarrow"), 20, &usera); | |
1147 for (x = 0; x < 32; x++) | |
1148 buf[0][x] = x; | |
1149 y = sizeof (buf[1]); | |
1150 if ((errnum = | |
1151 ecc_encrypt_key (buf[0], 32, buf[1], &y, &prng, find_prng ("yarrow"), | |
1152 find_hash ("sha256"), &usera)) != CRYPT_OK) { | |
1153 printf ("Error: %s\n", error_to_string (errnum)); | |
1154 exit (-1); | |
1155 } | |
1156 zeromem (buf[0], sizeof (buf[0])); | |
1157 x = sizeof (buf[0]); | |
1158 if ((errnum = ecc_decrypt_key (buf[1], y, buf[0], &x, &usera)) != CRYPT_OK) { | |
1159 printf ("Error: %s\n", error_to_string (errnum)); | |
1160 exit (-1); | |
1161 } | |
1162 printf ("ECC en/de crypt key routines: "); | |
1163 if (x != 32) { | |
1164 printf ("Failed (length)\n"); | |
1165 exit (-1); | |
1166 } | |
1167 for (x = 0; x < 32; x++) | |
1168 if (buf[0][x] != x) { | |
1169 printf ("Failed (contents)\n"); | |
1170 exit (-1); | |
1171 } | |
1172 printf ("Passed (size: %lu)\n", y); | |
1173 /* test sign_hash */ | |
1174 for (x = 0; x < 16; x++) | |
1175 buf[0][x] = x; | |
1176 x = sizeof (buf[1]); | |
1177 if ((errnum = | |
1178 ecc_sign_hash (buf[0], 16, buf[1], &x, &prng, find_prng ("yarrow"), | |
1179 &usera)) != CRYPT_OK) { | |
1180 printf ("Error: %s\n", error_to_string (errnum)); | |
1181 exit (-1); | |
1182 } | |
1183 printf("Signature size: %lu\n", x); | |
1184 if (ecc_verify_hash (buf[1], x, buf[0], 16, &stat, &usera)) { | |
1185 printf ("Error: %s\n", error_to_string (errnum)); | |
1186 exit (-1); | |
1187 } | |
1188 buf[0][0] ^= 1; | |
1189 if (ecc_verify_hash (buf[1], x, buf[0], 16, &stat2, &usera)) { | |
1190 printf ("Error: %s\n", error_to_string (errnum)); | |
1191 exit (-1); | |
1192 } | |
1193 printf ("ecc_sign/verify_hash: %s (%d,%d)\n", | |
1194 ((stat == 1) && (stat2 == 0)) ? "passed" : "failed", stat, stat2); | |
1195 ecc_free (&usera); | |
1196 } | |
1197 #else | |
1198 void | |
1199 ecc_tests (void) | |
1200 { | |
1201 printf ("MECC not compiled in\n"); | |
1202 } | |
1203 #endif | |
1204 | |
1205 #ifdef GF | |
1206 void | |
1207 gf_tests (void) | |
1208 { | |
1209 gf_int a, b, c, d; | |
1210 int n; | |
1211 unsigned char buf[1024]; | |
1212 | |
1213 printf ("GF tests\n"); | |
1214 gf_zero (a); | |
1215 gf_zero (b); | |
1216 gf_zero (c); | |
1217 gf_zero (d); | |
1218 | |
1219 /* a == 0x18000000b */ | |
1220 a[1] = 1; | |
1221 a[0] = 0x8000000bUL; | |
1222 | |
1223 /* b == 0x012345678 */ | |
1224 b[0] = 0x012345678UL; | |
1225 | |
1226 /* find 1/b mod a */ | |
1227 gf_invmod (b, a, c); | |
1228 | |
1229 /* find 1/1/b mod a */ | |
1230 gf_invmod (c, a, d); | |
1231 | |
1232 /* display them */ | |
1233 printf (" %08lx %08lx\n", c[0], d[0]); | |
1234 | |
1235 /* store as binary string */ | |
1236 n = gf_size (a); | |
1237 printf (" a takes %d bytes\n", n); | |
1238 gf_toraw (a, buf); | |
1239 gf_readraw (a, buf, n); | |
1240 printf (" a == %08lx%08lx\n", a[1], a[0]); | |
1241 | |
1242 /* primality testing */ | |
1243 gf_zero (a); | |
1244 a[0] = 0x169; | |
1245 printf (" GF prime: %s, ", gf_is_prime (a) ? "passed" : "failed"); | |
1246 a[0] = 0x168; | |
1247 printf (" %s\n", gf_is_prime (a) ? "failed" : "passed"); | |
1248 | |
1249 /* test sqrt code */ | |
1250 gf_zero (a); | |
1251 a[1] = 0x00000001; | |
1252 a[0] = 0x8000000bUL; | |
1253 gf_zero (b); | |
1254 b[0] = 0x12345678UL; | |
1255 | |
1256 gf_sqrt (b, a, c); | |
1257 gf_mulmod (c, c, a, b); | |
1258 printf (" (%08lx)^2 = %08lx (mod %08lx%08lx) \n", c[0], b[0], a[1], a[0]); | |
1259 } | |
1260 #else | |
1261 void | |
1262 gf_tests (void) | |
1263 { | |
1264 printf ("GF not compiled in\n"); | |
1265 } | |
1266 #endif | |
1267 | |
1268 #ifdef MPI | |
1269 void | |
1270 test_prime (void) | |
1271 { | |
1272 char buf[1024]; | |
1273 mp_int a; | |
1274 int x; | |
1275 | |
1276 /* make a 1024 bit prime */ | |
1277 mp_init (&a); | |
1278 rand_prime (&a, 128*8, &prng, find_prng ("yarrow")); | |
1279 | |
1280 /* dump it */ | |
1281 mp_todecimal (&a, buf); | |
1282 printf ("1024-bit prime:\n"); | |
1283 for (x = 0; x < (int) strlen (buf);) { | |
1284 printf ("%c", buf[x]); | |
1285 if (!(++x % 60)) | |
1286 printf ("\\ \n"); | |
1287 } | |
1288 printf ("\n\n"); | |
1289 | |
1290 mp_clear (&a); | |
1291 } | |
1292 #else | |
1293 void | |
1294 test_prime (void) | |
1295 { | |
1296 printf ("MPI not compiled in\n"); | |
1297 } | |
1298 #endif | |
1299 | |
1300 void | |
1301 register_all_algs (void) | |
1302 { | |
1303 #ifdef RIJNDAEL | |
1304 register_cipher (&aes_desc); | |
1305 #endif | |
1306 #ifdef BLOWFISH | |
1307 register_cipher (&blowfish_desc); | |
1308 #endif | |
1309 #ifdef XTEA | |
1310 register_cipher (&xtea_desc); | |
1311 #endif | |
1312 #ifdef RC5 | |
1313 register_cipher (&rc5_desc); | |
1314 #endif | |
1315 #ifdef RC6 | |
1316 register_cipher (&rc6_desc); | |
1317 #endif | |
1318 #ifdef SAFERP | |
1319 register_cipher (&saferp_desc); | |
1320 #endif | |
1321 #ifdef TWOFISH | |
1322 register_cipher (&twofish_desc); | |
1323 #endif | |
1324 #ifdef SAFER | |
1325 register_cipher (&safer_k64_desc); | |
1326 register_cipher (&safer_sk64_desc); | |
1327 register_cipher (&safer_k128_desc); | |
1328 register_cipher (&safer_sk128_desc); | |
1329 #endif | |
1330 #ifdef RC2 | |
1331 register_cipher (&rc2_desc); | |
1332 #endif | |
1333 #ifdef DES | |
1334 register_cipher (&des_desc); | |
1335 register_cipher (&des3_desc); | |
1336 #endif | |
1337 #ifdef CAST5 | |
1338 register_cipher (&cast5_desc); | |
1339 #endif | |
1340 #ifdef NOEKEON | |
1341 register_cipher (&noekeon_desc); | |
1342 #endif | |
1343 #ifdef SKIPJACK | |
1344 register_cipher (&skipjack_desc); | |
1345 #endif | |
1346 register_cipher (&null_desc); | |
1347 | |
1348 #ifdef TIGER | |
1349 register_hash (&tiger_desc); | |
1350 #endif | |
1351 #ifdef MD2 | |
1352 register_hash (&md2_desc); | |
1353 #endif | |
1354 #ifdef MD4 | |
1355 register_hash (&md4_desc); | |
1356 #endif | |
1357 #ifdef MD5 | |
1358 register_hash (&md5_desc); | |
1359 #endif | |
1360 #ifdef SHA1 | |
1361 register_hash (&sha1_desc); | |
1362 #endif | |
1363 #ifdef SHA256 | |
1364 register_hash (&sha256_desc); | |
1365 #endif | |
1366 #ifdef SHA224 | |
1367 register_hash (&sha224_desc); | |
1368 #endif | |
1369 #ifdef SHA384 | |
1370 register_hash (&sha384_desc); | |
1371 #endif | |
1372 #ifdef SHA512 | |
1373 register_hash (&sha512_desc); | |
1374 #endif | |
1375 #ifdef RIPEMD128 | |
1376 register_hash (&rmd128_desc); | |
1377 #endif | |
1378 #ifdef RIPEMD160 | |
1379 register_hash (&rmd160_desc); | |
1380 #endif | |
1381 #ifdef WHIRLPOOL | |
1382 register_hash (&whirlpool_desc); | |
1383 #endif | |
1384 | |
1385 #ifdef YARROW | |
1386 register_prng (&yarrow_desc); | |
1387 #endif | |
1388 #ifdef SPRNG | |
1389 register_prng (&sprng_desc); | |
1390 #endif | |
1391 } | |
1392 | |
1393 #ifdef KR | |
1394 void | |
1395 kr_display (pk_key * kr) | |
1396 { | |
1397 static const char *sys[] = { "NON-KEY", "RSA", "DH", "ECC" }; | |
1398 static const char *type[] = { "PRIVATE", "PUBLIC", "PRIVATE_OPTIMIZED" }; | |
1399 | |
1400 while (kr->system != NON_KEY) { | |
1401 printf ("CRC [%08lx], System [%10s], Type [%20s], %s, %s, %s\n", kr->ID, | |
1402 sys[kr->system], type[kr->key_type], kr->name, kr->email, | |
1403 kr->description); | |
1404 kr = kr->next; | |
1405 } | |
1406 printf ("\n"); | |
1407 } | |
1408 | |
1409 void | |
1410 kr_test_makekeys (pk_key ** kr) | |
1411 { | |
1412 if ((errnum = kr_init (kr)) != CRYPT_OK) { | |
1413 printf ("KR init error %s\n", error_to_string (errnum)); | |
1414 exit (-1); | |
1415 } | |
1416 | |
1417 /* make a DH key */ | |
1418 printf ("KR: Making DH key...\n"); | |
1419 if ((errnum = | |
1420 kr_make_key (*kr, &prng, find_prng ("yarrow"), DH_KEY, 128, "dhkey", | |
1421 "[email protected]", "dhkey one")) != CRYPT_OK) { | |
1422 printf ("Make key error: %s\n", error_to_string (errnum)); | |
1423 exit (-1); | |
1424 } | |
1425 | |
1426 /* make a ECC key */ | |
1427 printf ("KR: Making ECC key...\n"); | |
1428 if ((errnum = | |
1429 kr_make_key (*kr, &prng, find_prng ("yarrow"), ECC_KEY, 20, "ecckey", | |
1430 "[email protected]", "ecckey one")) != CRYPT_OK) { | |
1431 printf ("Make key error: %s\n", error_to_string (errnum)); | |
1432 exit (-1); | |
1433 } | |
1434 | |
1435 /* make a RSA key */ | |
1436 printf ("KR: Making RSA key...\n"); | |
1437 if ((errnum = | |
1438 kr_make_key (*kr, &prng, find_prng ("yarrow"), RSA_KEY, 128, "rsakey", | |
1439 "[email protected]", "rsakey one")) != CRYPT_OK) { | |
1440 printf ("Make key error: %s\n", error_to_string (errnum)); | |
1441 exit (-1); | |
1442 } | |
1443 | |
1444 } | |
1445 | |
1446 void | |
1447 kr_test (void) | |
1448 { | |
1449 pk_key *kr, *_kr; | |
1450 unsigned char buf[8192], buf2[8192], buf3[8192]; | |
1451 unsigned long len; | |
1452 int i, j, stat; | |
1453 #ifndef NO_FILE | |
1454 FILE *f; | |
1455 #endif | |
1456 | |
1457 kr_test_makekeys (&kr); | |
1458 | |
1459 printf ("The original list:\n"); | |
1460 kr_display (kr); | |
1461 | |
1462 for (i = 0; i < 3; i++) { | |
1463 len = sizeof (buf); | |
1464 if ((errnum = kr_export (kr, kr->ID, kr->key_type, buf, &len)) != CRYPT_OK) { | |
1465 printf ("Error exporting key %d, %s\n", i, error_to_string (errnum)); | |
1466 exit (-1); | |
1467 } | |
1468 printf ("Exported key was: %lu bytes\n", len); | |
1469 if ((errnum = kr_del (&kr, kr->ID)) != CRYPT_OK) { | |
1470 printf ("Error deleting key %d, %s\n", i, error_to_string (errnum)); | |
1471 exit (-1); | |
1472 } | |
1473 kr_display (kr); | |
1474 if ((errnum = kr_import (kr, buf, len)) != CRYPT_OK) { | |
1475 printf ("Error importing key %d, %s\n", i, error_to_string (errnum)); | |
1476 exit (-1); | |
1477 } | |
1478 kr_display (kr); | |
1479 } | |
1480 | |
1481 for (i = 0; i < 3; i++) { | |
1482 len = sizeof (buf); | |
1483 if ((errnum = kr_export (kr, kr->ID, PK_PUBLIC, buf, &len)) != CRYPT_OK) { | |
1484 printf ("Error exporting key %d, %s\n", i, error_to_string (errnum)); | |
1485 exit (-1); | |
1486 } | |
1487 printf ("Exported key was: %lu bytes\n", len); | |
1488 if ((errnum = kr_del (&kr, kr->ID)) != CRYPT_OK) { | |
1489 printf ("Error deleting key %d, %s\n", i, error_to_string (errnum)); | |
1490 exit (-1); | |
1491 } | |
1492 kr_display (kr); | |
1493 if ((errnum = kr_import (kr, buf, len)) != CRYPT_OK) { | |
1494 printf ("Error importing key %d, %s\n", i, error_to_string (errnum)); | |
1495 exit (-1); | |
1496 } | |
1497 kr_display (kr); | |
1498 } | |
1499 | |
1500 if ((errnum = kr_clear (&kr)) != CRYPT_OK) { | |
1501 printf ("Error clearing ring: %s\n", error_to_string (errnum)); | |
1502 exit (-1); | |
1503 } | |
1504 | |
1505 | |
1506 /* TEST output to file */ | |
1507 #ifndef NO_FILE | |
1508 | |
1509 if ((errnum = kr_init (&kr)) != CRYPT_OK) { | |
1510 printf ("KR init error %s\n", error_to_string (errnum)); | |
1511 exit (-1); | |
1512 } | |
1513 kr_test_makekeys (&kr); | |
1514 | |
1515 /* save to file */ | |
1516 f = fopen ("ring.dat", "wb"); | |
1517 if ((errnum = kr_save (kr, f, NULL)) != CRYPT_OK) { | |
1518 printf ("kr_save error %s\n", error_to_string (errnum)); | |
1519 exit (-1); | |
1520 } | |
1521 fclose (f); | |
1522 | |
1523 /* delete and load */ | |
1524 if ((errnum = kr_clear (&kr)) != CRYPT_OK) { | |
1525 printf ("clear error: %s\n", error_to_string (errnum)); | |
1526 exit (-1); | |
1527 } | |
1528 | |
1529 f = fopen ("ring.dat", "rb"); | |
1530 if ((errnum = kr_load (&kr, f, NULL)) != CRYPT_OK) { | |
1531 printf ("kr_load error %s\n", error_to_string (errnum)); | |
1532 exit (-1); | |
1533 } | |
1534 fclose (f); | |
1535 remove ("ring.dat"); | |
1536 printf ("After load and save...\n"); | |
1537 kr_display (kr); | |
1538 | |
1539 if ((errnum = kr_clear (&kr)) != CRYPT_OK) { | |
1540 printf ("clear error: %s\n", error_to_string (errnum)); | |
1541 exit (-1); | |
1542 } | |
1543 #endif | |
1544 | |
1545 /* test the packet encryption/sign stuff */ | |
1546 for (i = 0; i < 32; i++) | |
1547 buf[i] = i; | |
1548 kr_test_makekeys (&kr); | |
1549 _kr = kr; | |
1550 for (i = 0; i < 3; i++) { | |
1551 printf ("Testing a key with system %d, type %d:\t", _kr->system, | |
1552 _kr->key_type); | |
1553 len = sizeof (buf2); | |
1554 if ((errnum = | |
1555 kr_encrypt_key (kr, _kr->ID, buf, 16, buf2, &len, &prng, | |
1556 find_prng ("yarrow"), | |
1557 find_hash ("md5"))) != CRYPT_OK) { | |
1558 printf ("Encrypt error, %d, %s\n", i, error_to_string (errnum)); | |
1559 exit (-1); | |
1560 } | |
1561 len = sizeof (buf3); | |
1562 if ((errnum = kr_decrypt_key (kr, buf2, buf3, &len)) != CRYPT_OK) { | |
1563 printf ("decrypt error, %d, %s\n", i, error_to_string (errnum)); | |
1564 exit (-1); | |
1565 } | |
1566 if (len != 16 || memcmp (buf3, buf, 16)) { | |
1567 printf ("kr_decrypt_key failed, %i, %lu\n", i, len); | |
1568 exit (-1); | |
1569 } | |
1570 printf ("kr_encrypt_key passed, "); | |
1571 | |
1572 len = sizeof (buf2); | |
1573 if ((errnum = | |
1574 kr_sign_hash (kr, _kr->ID, buf, 32, buf2, &len, &prng, | |
1575 find_prng ("yarrow"))) != CRYPT_OK) { | |
1576 printf ("kr_sign_hash failed, %i, %s\n", i, error_to_string (errnum)); | |
1577 exit (-1); | |
1578 } | |
1579 printf ("kr_sign_hash: "); | |
1580 if ((errnum = kr_verify_hash (kr, buf2, buf, 32, &stat)) != CRYPT_OK) { | |
1581 printf ("kr_sign_hash failed, %i, %s\n", i, error_to_string (errnum)); | |
1582 exit (-1); | |
1583 } | |
1584 printf ("%s, ", stat ? "passed" : "failed"); | |
1585 buf[15] ^= 1; | |
1586 if ((errnum = kr_verify_hash (kr, buf2, buf, 32, &stat)) != CRYPT_OK) { | |
1587 printf ("kr_sign_hash failed, %i, %s\n", i, error_to_string (errnum)); | |
1588 exit (-1); | |
1589 } | |
1590 printf ("%s\n", (!stat) ? "passed" : "failed"); | |
1591 buf[15] ^= 1; | |
1592 | |
1593 len = sizeof (buf); | |
1594 if ((errnum = | |
1595 kr_fingerprint (kr, _kr->ID, find_hash ("sha1"), buf, | |
1596 &len)) != CRYPT_OK) { | |
1597 printf ("kr_fingerprint failed, %i, %lu\n", i, len); | |
1598 exit (-1); | |
1599 } | |
1600 printf ("Fingerprint: "); | |
1601 for (j = 0; j < 20; j++) { | |
1602 printf ("%02x", buf[j]); | |
1603 if (j < 19) | |
1604 printf (":"); | |
1605 } | |
1606 printf ("\n\n"); | |
1607 | |
1608 _kr = _kr->next; | |
1609 } | |
1610 | |
1611 /* Test encrypting/decrypting to a public key */ | |
1612 /* first dump the other two keys */ | |
1613 kr_del (&kr, kr->ID); | |
1614 kr_del (&kr, kr->ID); | |
1615 kr_display (kr); | |
1616 | |
1617 /* now export it as public and private */ | |
1618 len = sizeof (buf); | |
1619 if ((errnum = kr_export (kr, kr->ID, PK_PUBLIC, buf, &len)) != CRYPT_OK) { | |
1620 printf ("Error exporting key %d, %s\n", i, error_to_string (errnum)); | |
1621 exit (-1); | |
1622 } | |
1623 | |
1624 /* check boundaries */ | |
1625 memset (buf + len, 0, sizeof (buf) - len); | |
1626 | |
1627 len = sizeof (buf2); | |
1628 if ((errnum = kr_export (kr, kr->ID, PK_PRIVATE, buf2, &len)) != CRYPT_OK) { | |
1629 printf ("Error exporting key %s\n", error_to_string (errnum)); | |
1630 exit (-1); | |
1631 } | |
1632 | |
1633 /* check boundaries */ | |
1634 memset (buf2 + len, 0, sizeof (buf2) - len); | |
1635 | |
1636 /* delete the key and import the public */ | |
1637 kr_clear (&kr); | |
1638 kr_init (&kr); | |
1639 kr_display (kr); | |
1640 if ((errnum = kr_import (kr, buf, len)) != CRYPT_OK) { | |
1641 printf ("Error importing key %s\n", error_to_string (errnum)); | |
1642 exit (-1); | |
1643 } | |
1644 kr_display (kr); | |
1645 | |
1646 /* now encrypt a buffer */ | |
1647 for (i = 0; i < 16; i++) | |
1648 buf[i] = i; | |
1649 len = sizeof (buf3); | |
1650 if ((errnum = | |
1651 kr_encrypt_key (kr, kr->ID, buf, 16, buf3, &len, &prng, | |
1652 find_prng ("yarrow"), | |
1653 find_hash ("md5"))) != CRYPT_OK) { | |
1654 printf ("Encrypt error, %d, %s\n", i, error_to_string (errnum)); | |
1655 exit (-1); | |
1656 } | |
1657 | |
1658 /* now delete the key and import the private one */ | |
1659 kr_clear (&kr); | |
1660 kr_init (&kr); | |
1661 kr_display (kr); | |
1662 if ((errnum = kr_import (kr, buf2, len)) != CRYPT_OK) { | |
1663 printf ("Error importing key %s\n", error_to_string (errnum)); | |
1664 exit (-1); | |
1665 } | |
1666 kr_display (kr); | |
1667 | |
1668 /* now decrypt */ | |
1669 len = sizeof (buf2); | |
1670 if ((errnum = kr_decrypt_key (kr, buf3, buf2, &len)) != CRYPT_OK) { | |
1671 printf ("decrypt error, %s\n", error_to_string (errnum)); | |
1672 exit (-1); | |
1673 } | |
1674 | |
1675 printf ("KR encrypt to public, decrypt with private: "); | |
1676 if (len == 16 && !memcmp (buf2, buf, 16)) { | |
1677 printf ("passed\n"); | |
1678 } else { | |
1679 printf ("failed\n"); | |
1680 } | |
1681 | |
1682 kr_clear (&kr); | |
1683 } | |
1684 #endif | |
1685 | |
1686 void | |
1687 test_errs (void) | |
1688 { | |
1689 #define ERR(x) printf("%25s => %s\n", #x, error_to_string(x)); | |
1690 | |
1691 ERR (CRYPT_OK); | |
1692 ERR (CRYPT_ERROR); | |
1693 | |
1694 ERR (CRYPT_INVALID_KEYSIZE); | |
1695 ERR (CRYPT_INVALID_ROUNDS); | |
1696 ERR (CRYPT_FAIL_TESTVECTOR); | |
1697 | |
1698 ERR (CRYPT_BUFFER_OVERFLOW); | |
1699 ERR (CRYPT_INVALID_PACKET); | |
1700 | |
1701 ERR (CRYPT_INVALID_PRNGSIZE); | |
1702 ERR (CRYPT_ERROR_READPRNG); | |
1703 | |
1704 ERR (CRYPT_INVALID_CIPHER); | |
1705 ERR (CRYPT_INVALID_HASH); | |
1706 ERR (CRYPT_INVALID_PRNG); | |
1707 | |
1708 ERR (CRYPT_MEM); | |
1709 | |
1710 ERR (CRYPT_PK_TYPE_MISMATCH); | |
1711 ERR (CRYPT_PK_NOT_PRIVATE); | |
1712 | |
1713 ERR (CRYPT_INVALID_ARG); | |
1714 ERR (CRYPT_FILE_NOTFOUND); | |
1715 | |
1716 ERR (CRYPT_PK_INVALID_TYPE); | |
1717 ERR (CRYPT_PK_INVALID_SYSTEM); | |
1718 ERR (CRYPT_PK_DUP); | |
1719 ERR (CRYPT_PK_NOT_FOUND); | |
1720 ERR (CRYPT_PK_INVALID_SIZE); | |
1721 | |
1722 ERR (CRYPT_INVALID_PRIME_SIZE); | |
1723 } | |
1724 | |
1725 | |
1726 void dsa_tests(void) | |
1727 { | |
1728 unsigned char msg[16], out[1024], out2[1024]; | |
1729 unsigned long x, y; | |
1730 int err, stat1, stat2; | |
1731 dsa_key key, key2; | |
1732 | |
1733 /* make a random key */ | |
1734 if ((err = dsa_make_key(&prng, find_prng("yarrow"), 20, 128, &key)) != CRYPT_OK) { | |
1735 printf("Error making DSA key: %s\n", error_to_string(err)); | |
1736 exit(-1); | |
1737 } | |
1738 printf("DSA Key Made\n"); | |
1739 | |
1740 /* verify it */ | |
1741 if ((err = dsa_verify_key(&key, &stat1)) != CRYPT_OK) { | |
1742 printf("Error verifying DSA key: %s\n", error_to_string(err)); | |
1743 exit(-1); | |
1744 } | |
1745 printf("DSA key verification: %s\n", stat1 == 1 ? "passed" : "failed"); | |
1746 if (stat1 == 0) exit(-1); | |
1747 | |
1748 /* sign the message */ | |
1749 x = sizeof(out); | |
1750 if ((err = dsa_sign_hash(msg, sizeof(msg), out, &x, &prng, find_prng("yarrow"), &key)) != CRYPT_OK) { | |
1751 printf("Error signing with DSA key: %s\n", error_to_string(err)); | |
1752 exit(-1); | |
1753 } | |
1754 printf("DSA 160/1024 signature is %lu bytes long\n", x); | |
1755 | |
1756 /* verify it once */ | |
1757 if ((err = dsa_verify_hash(out, x, msg, sizeof(msg), &stat1, &key)) != CRYPT_OK) { | |
1758 printf("Error verifying with DSA key 1: %s\n", error_to_string(err)); | |
1759 exit(-1); | |
1760 } | |
1761 | |
1762 /* Modify and verify again */ | |
1763 msg[0] ^= 1; | |
1764 if ((err = dsa_verify_hash(out, x, msg, sizeof(msg), &stat2, &key)) != CRYPT_OK) { | |
1765 printf("Error verifying with DSA key 2: %s\n", error_to_string(err)); | |
1766 exit(-1); | |
1767 } | |
1768 msg[0] ^= 1; | |
1769 printf("DSA Verification: %d, %d, %s\n", stat1, stat2, (stat1 == 1 && stat2 == 0) ? "passed" : "failed"); | |
1770 if (!(stat1 == 1 && stat2 == 0)) exit(-1); | |
1771 | |
1772 /* test exporting it */ | |
1773 x = sizeof(out2); | |
1774 if ((err = dsa_export(out2, &x, PK_PRIVATE, &key)) != CRYPT_OK) { | |
1775 printf("Error export PK_PRIVATE DSA key: %s\n", error_to_string(err)); | |
1776 exit(-1); | |
1777 } | |
1778 printf("Exported PK_PRIVATE DSA key in %lu bytes\n", x); | |
1779 if ((err = dsa_import(out2, x, &key2)) != CRYPT_OK) { | |
1780 printf("Error importing PK_PRIVATE DSA key: %s\n", error_to_string(err)); | |
1781 exit(-1); | |
1782 } | |
1783 /* verify a signature with it */ | |
1784 if ((err = dsa_verify_hash(out, x, msg, sizeof(msg), &stat1, &key2)) != CRYPT_OK) { | |
1785 printf("Error verifying with DSA key 3: %s\n", error_to_string(err)); | |
1786 exit(-1); | |
1787 } | |
1788 printf("PRIVATE Import Test: %s\n", stat1 == 1 ? "passed" : "failed"); | |
1789 if (stat1 == 0) exit(-1); | |
1790 dsa_free(&key2); | |
1791 | |
1792 /* export as public now */ | |
1793 x = sizeof(out2); | |
1794 if ((err = dsa_export(out2, &x, PK_PUBLIC, &key)) != CRYPT_OK) { | |
1795 printf("Error export PK_PUBLIC DSA key: %s\n", error_to_string(err)); | |
1796 exit(-1); | |
1797 } | |
1798 printf("Exported PK_PUBLIC DSA key in %lu bytes\n", x); | |
1799 if ((err = dsa_import(out2, x, &key2)) != CRYPT_OK) { | |
1800 printf("Error importing PK_PUBLIC DSA key: %s\n", error_to_string(err)); | |
1801 exit(-1); | |
1802 } | |
1803 /* verify a signature with it */ | |
1804 if ((err = dsa_verify_hash(out, x, msg, sizeof(msg), &stat1, &key2)) != CRYPT_OK) { | |
1805 printf("Error verifying with DSA key 4: %s\n", error_to_string(err)); | |
1806 exit(-1); | |
1807 } | |
1808 printf("PUBLIC Import Test: %s\n", stat1 == 1 ? "passed" : "failed"); | |
1809 if (stat1 == 0) exit(-1); | |
1810 | |
1811 dsa_free(&key2); | |
1812 dsa_free(&key); | |
1813 } | |
1814 | |
1815 #ifdef PKCS_1 | |
1816 void pkcs1_test(void) | |
1817 { | |
1818 unsigned char buf[3][128]; | |
1819 int err, res1, res2, res3, prng_idx, hash_idx; | |
1820 unsigned long x, y, l1, l2, l3, i1, i2; | |
1821 | |
1822 /* get hash/prng */ | |
1823 hash_idx = find_hash("sha1"); | |
1824 prng_idx = find_prng("yarrow"); | |
1825 | |
1826 /* do many tests */ | |
1827 for (x = 0; x < 10000; x++) { | |
1828 zeromem(buf, sizeof(buf)); | |
1829 | |
1830 /* make a dummy message (of random length) */ | |
1831 l3 = (rand() & 31) + 8; | |
1832 for (y = 0; y < l3; y++) buf[0][y] = rand() & 255; | |
1833 | |
1834 /* encode it */ | |
1835 l1 = sizeof(buf[1]); | |
1836 if ((err = pkcs_1_oaep_encode(buf[0], l3, NULL, 0, 1024, hash_idx, prng_idx, &prng, buf[1], &l1)) != CRYPT_OK) { | |
1837 printf("OAEP encode: %s\n", error_to_string(err)); | |
1838 exit(-1); | |
1839 } | |
1840 | |
1841 /* decode it */ | |
1842 l2 = sizeof(buf[2]); | |
1843 if ((err = pkcs_1_oaep_decode(buf[1], l1, NULL, 0, 1024, hash_idx, buf[2], &l2)) != CRYPT_OK) { | |
1844 printf("OAEP decode: %s\n", error_to_string(err)); | |
1845 exit(-1); | |
1846 } | |
1847 | |
1848 if (l2 != l3 || memcmp(buf[2], buf[0], l3) != 0) { | |
1849 printf("Outsize == %lu, should have been %lu, msg contents follow.\n", l2, l3); | |
1850 printf("ORIGINAL:\n"); | |
1851 for (x = 0; x < l3; x++) { | |
1852 printf("%02x ", buf[0][x]); | |
1853 } | |
1854 printf("\nRESULT:\n"); | |
1855 for (x = 0; x < l2; x++) { | |
1856 printf("%02x ", buf[2][x]); | |
1857 } | |
1858 printf("\n\n"); | |
1859 exit(-1); | |
1860 } | |
1861 | |
1862 /* test PSS */ | |
1863 l1 = sizeof(buf[1]); | |
1864 if ((err = pkcs_1_pss_encode(buf[0], l3, l3>>2, hash_idx, prng_idx, &prng, 1024, buf[1], &l1)) != CRYPT_OK) { | |
1865 printf("PSS encode: %s\n", error_to_string(err)); | |
1866 exit(-1); | |
1867 } | |
1868 | |
1869 if ((err = pkcs_1_pss_decode(buf[0], l3, buf[1], l1, l3>>2, hash_idx, 1024, &res1)) != CRYPT_OK) { | |
1870 printf("PSS decode1: %s\n", error_to_string(err)); | |
1871 exit(-1); | |
1872 } | |
1873 | |
1874 buf[0][i1 = abs(rand()) % l3] ^= 1; | |
1875 if ((err = pkcs_1_pss_decode(buf[0], l3, buf[1], l1, l3>>2, hash_idx, 1024, &res2)) != CRYPT_OK) { | |
1876 printf("PSS decode2: %s\n", error_to_string(err)); | |
1877 exit(-1); | |
1878 } | |
1879 | |
1880 buf[0][i1] ^= 1; | |
1881 buf[1][i2 = abs(rand()) % l1] ^= 1; | |
1882 if ((err = pkcs_1_pss_decode(buf[0], l3, buf[1], l1, l3>>2, hash_idx, 1024, &res3)) != CRYPT_OK) { | |
1883 printf("PSS decode3: %s\n", error_to_string(err)); | |
1884 exit(-1); | |
1885 } | |
1886 | |
1887 if (!(res1 == 1 && res2 == 0 && res3 == 0)) { | |
1888 printf("PSS failed: %d, %d, %d, %lu\n", res1, res2, res3, l3); | |
1889 exit(-1); | |
1890 } | |
1891 } | |
1892 printf("PKCS #1: Passed\n"); | |
1893 } | |
1894 | |
1895 #endif /* PKCS_1 */ | |
1896 | |
1897 int | |
1898 main (void) | |
1899 { | |
1900 #ifdef SONY_PS2 | |
1901 TIMER_Init (); | |
1902 #endif | |
1903 srand(time(NULL)); | |
1904 | |
1905 register_all_algs (); | |
1906 | |
1907 if ((errnum = yarrow_start (&prng)) != CRYPT_OK) { | |
1908 printf ("yarrow_start: %s\n", error_to_string (errnum)); | |
1909 } | |
1910 if ((errnum = yarrow_add_entropy ((unsigned char *)"hello", 5, &prng)) != CRYPT_OK) { | |
1911 printf ("yarrow_add_entropy: %s\n", error_to_string (errnum)); | |
1912 } | |
1913 if ((errnum = yarrow_ready (&prng)) != CRYPT_OK) { | |
1914 printf ("yarrow_ready: %s\n", error_to_string (errnum)); | |
1915 } | |
1916 | |
1917 printf (crypt_build_settings); | |
1918 test_errs (); | |
1919 | |
1920 #ifdef HMAC | |
1921 printf ("HMAC: %s\n", hmac_test () == CRYPT_OK ? "passed" : "failed"); | |
1922 if (hmac_test() != CRYPT_OK) exit(EXIT_FAILURE); | |
1923 #endif | |
1924 | |
1925 #ifdef OMAC | |
1926 printf ("OMAC: %s\n", omac_test () == CRYPT_OK ? "passed" : "failed"); | |
1927 if (omac_test() != CRYPT_OK) exit(EXIT_FAILURE); | |
1928 #endif | |
1929 | |
1930 #ifdef PMAC | |
1931 printf ("PMAC: %s\n", pmac_test () == CRYPT_OK ? "passed" : "failed"); | |
1932 if (pmac_test() != CRYPT_OK) exit(EXIT_FAILURE); | |
1933 #endif | |
1934 | |
1935 #ifdef EAX_MODE | |
1936 printf ("EAX : %s\n", eax_test () == CRYPT_OK ? "passed" : "failed"); | |
1937 if (eax_test() != CRYPT_OK) exit(EXIT_FAILURE); | |
1938 #endif | |
1939 | |
1940 #ifdef OCB_MODE | |
1941 printf ("OCB : %s\n", ocb_test () == CRYPT_OK ? "passed" : "failed"); | |
1942 if (ocb_test() != CRYPT_OK) exit(EXIT_FAILURE); | |
1943 #endif | |
1944 | |
1945 store_tests (); | |
1946 cipher_tests (); | |
1947 hash_tests (); | |
1948 | |
1949 #ifdef PKCS_1 | |
1950 pkcs1_test(); | |
1951 #endif | |
1952 | |
1953 ecb_tests (); | |
1954 cbc_tests (); | |
1955 ctr_tests (); | |
1956 ofb_tests (); | |
1957 cfb_tests (); | |
1958 | |
1959 rng_tests (); | |
1960 test_prime(); | |
1961 | |
1962 #ifdef KR | |
1963 kr_test (); | |
1964 #endif | |
1965 dsa_tests(); | |
1966 rsa_test (); | |
1967 pad_test (); | |
1968 ecc_tests (); | |
1969 dh_tests (); | |
1970 | |
1971 gf_tests (); | |
1972 base64_test (); | |
1973 | |
1974 time_ecb (); | |
1975 time_hash (); | |
1976 | |
1977 #ifdef SONY_PS2 | |
1978 TIMER_Shutdown (); | |
1979 #endif | |
1980 | |
1981 return 0; | |
1982 } |