1 #include <tomcrypt_test.h> 2 3 prng_state yarrow_prng; 4 5 struct list results[100]; 6 int no_results; 7 int sorter(const void *a, const void *b) 8 { 9 const struct list *A, *B; 10 A = a; 11 B = b; 12 if (A->avg < B->avg) return -1; 13 if (A->avg > B->avg) return 1; 14 return 0; 15 } 16 17 void tally_results(int type) 18 { 19 int x; 20 21 /* qsort the results */ 22 qsort(results, no_results, sizeof(struct list), &sorter); 23 24 fprintf(stderr, "\n"); 25 if (type == 0) { 26 for (x = 0; x < no_results; x++) { 27 fprintf(stderr, "%-20s: Schedule at %6lu\n", cipher_descriptor[results[x].id].name, (unsigned long)results[x].spd1); 28 } 29 } else if (type == 1) { 30 for (x = 0; x < no_results; x++) { 31 printf 32 ("%-20s[%3d]: Encrypt at %5lu, Decrypt at %5lu\n", cipher_descriptor[results[x].id].name, cipher_descriptor[results[x].id].ID, results[x].spd1, results[x].spd2); 33 } 34 } else { 35 for (x = 0; x < no_results; x++) { 36 printf 37 ("%-20s: Process at %5lu\n", hash_descriptor[results[x].id].name, results[x].spd1 / 1000); 38 } 39 } 40 } 41 42 /* RDTSC from Scott Duplichan */ 43 ulong64 rdtsc (void) 44 { 45 #if defined __GNUC__ && !defined(LTC_NO_ASM) 46 #ifdef INTEL_CC 47 ulong64 a; 48 asm ( " rdtsc ":"=A"(a)); 49 return a; 50 #elif defined(__i386__) || defined(__x86_64__) 51 ulong64 a; 52 asm __volatile__ ("rdtsc\nmovl %%eax,(%0)\nmovl %%edx,4(%0)\n"::"r"(&a):"%eax","%edx"); 53 return a; 54 #elif defined(LTC_PPC32) || defined(TFM_PPC32) 55 unsigned long a, b; 56 __asm__ __volatile__ ("mftbu %1 \nmftb %0\n":"=r"(a), "=r"(b)); 57 return (((ulong64)b) << 32ULL) | ((ulong64)a); 58 #elif defined(__ia64__) /* gcc-IA64 version */ 59 unsigned long result; 60 __asm__ __volatile__("mov %0=ar.itc" : "=r"(result) :: "memory"); 61 while (__builtin_expect ((int) result == -1, 0)) 62 __asm__ __volatile__("mov %0=ar.itc" : "=r"(result) :: "memory"); 63 return result; 64 #elif defined(__sparc__) 65 #if defined(__arch64__) 66 ulong64 a; 67 asm volatile("rd %%tick,%0" : "=r" (a)); 68 return a; 69 #else 70 register unsigned long x, y; 71 __asm__ __volatile__ ("rd %%tick, %0; clruw %0, %1; srlx %0, 32, %0" : "=r" (x), "=r" (y) : "0" (x), "1" (y)); 72 return ((unsigned long long) x << 32) | y; 73 #endif 74 #else 75 return XCLOCK(); 76 #endif 77 78 /* Microsoft and Intel Windows compilers */ 79 #elif defined _M_IX86 && !defined(LTC_NO_ASM) 80 __asm rdtsc 81 #elif defined _M_AMD64 && !defined(LTC_NO_ASM) 82 return __rdtsc (); 83 #elif defined _M_IA64 && !defined(LTC_NO_ASM) 84 #if defined __INTEL_COMPILER 85 #include <ia64intrin.h> 86 #endif 87 return __getReg (3116); 88 #else 89 return XCLOCK(); 90 #endif 91 } 92 93 static ulong64 timer, skew = 0; 94 95 void t_start(void) 96 { 97 timer = rdtsc(); 98 } 99 100 ulong64 t_read(void) 101 { 102 return rdtsc() - timer; 103 } 104 105 void init_timer(void) 106 { 107 ulong64 c1, c2, t1, t2, t3; 108 unsigned long y1; 109 110 c1 = c2 = (ulong64)-1; 111 for (y1 = 0; y1 < TIMES*100; y1++) { 112 t_start(); 113 t1 = t_read(); 114 t3 = t_read(); 115 t2 = (t_read() - t1)>>1; 116 117 c1 = (t1 > c1) ? t1 : c1; 118 c2 = (t2 > c2) ? t2 : c2; 119 } 120 skew = c2 - c1; 121 fprintf(stderr, "Clock Skew: %lu\n", (unsigned long)skew); 122 } 123 124 void reg_algs(void) 125 { 126 int err; 127 #ifdef RIJNDAEL 128 register_cipher (&aes_desc); 129 #endif 130 #ifdef BLOWFISH 131 register_cipher (&blowfish_desc); 132 #endif 133 #ifdef XTEA 134 register_cipher (&xtea_desc); 135 #endif 136 #ifdef RC5 137 register_cipher (&rc5_desc); 138 #endif 139 #ifdef RC6 140 register_cipher (&rc6_desc); 141 #endif 142 #ifdef SAFERP 143 register_cipher (&saferp_desc); 144 #endif 145 #ifdef TWOFISH 146 register_cipher (&twofish_desc); 147 #endif 148 #ifdef SAFER 149 register_cipher (&safer_k64_desc); 150 register_cipher (&safer_sk64_desc); 151 register_cipher (&safer_k128_desc); 152 register_cipher (&safer_sk128_desc); 153 #endif 154 #ifdef RC2 155 register_cipher (&rc2_desc); 156 #endif 157 #ifdef DES 158 register_cipher (&des_desc); 159 register_cipher (&des3_desc); 160 #endif 161 #ifdef CAST5 162 register_cipher (&cast5_desc); 163 #endif 164 #ifdef NOEKEON 165 register_cipher (&noekeon_desc); 166 #endif 167 #ifdef SKIPJACK 168 register_cipher (&skipjack_desc); 169 #endif 170 #ifdef KHAZAD 171 register_cipher (&khazad_desc); 172 #endif 173 #ifdef ANUBIS 174 register_cipher (&anubis_desc); 175 #endif 176 #ifdef KSEED 177 register_cipher (&kseed_desc); 178 #endif 179 #ifdef LTC_KASUMI 180 register_cipher (&kasumi_desc); 181 #endif 182 183 #ifdef TIGER 184 register_hash (&tiger_desc); 185 #endif 186 #ifdef MD2 187 register_hash (&md2_desc); 188 #endif 189 #ifdef MD4 190 register_hash (&md4_desc); 191 #endif 192 #ifdef MD5 193 register_hash (&md5_desc); 194 #endif 195 #ifdef SHA1 196 register_hash (&sha1_desc); 197 #endif 198 #ifdef SHA224 199 register_hash (&sha224_desc); 200 #endif 201 #ifdef SHA256 202 register_hash (&sha256_desc); 203 #endif 204 #ifdef SHA384 205 register_hash (&sha384_desc); 206 #endif 207 #ifdef SHA512 208 register_hash (&sha512_desc); 209 #endif 210 #ifdef RIPEMD128 211 register_hash (&rmd128_desc); 212 #endif 213 #ifdef RIPEMD160 214 register_hash (&rmd160_desc); 215 #endif 216 #ifdef RIPEMD256 217 register_hash (&rmd256_desc); 218 #endif 219 #ifdef RIPEMD320 220 register_hash (&rmd320_desc); 221 #endif 222 #ifdef WHIRLPOOL 223 register_hash (&whirlpool_desc); 224 #endif 225 #ifdef CHC_HASH 226 register_hash(&chc_desc); 227 if ((err = chc_register(register_cipher(&aes_desc))) != CRYPT_OK) { 228 fprintf(stderr, "chc_register error: %s\n", error_to_string(err)); 229 exit(EXIT_FAILURE); 230 } 231 #endif 232 233 234 #ifndef YARROW 235 #error This demo requires Yarrow. 236 #endif 237 register_prng(&yarrow_desc); 238 #ifdef FORTUNA 239 register_prng(&fortuna_desc); 240 #endif 241 #ifdef RC4 242 register_prng(&rc4_desc); 243 #endif 244 #ifdef SOBER128 245 register_prng(&sober128_desc); 246 #endif 247 248 if ((err = rng_make_prng(128, find_prng("yarrow"), &yarrow_prng, NULL)) != CRYPT_OK) { 249 fprintf(stderr, "rng_make_prng failed: %s\n", error_to_string(err)); 250 exit(EXIT_FAILURE); 251 } 252 253 } 254 255 int time_keysched(void) 256 { 257 unsigned long x, y1; 258 ulong64 t1, c1; 259 symmetric_key skey; 260 int kl; 261 int (*func) (const unsigned char *, int , int , symmetric_key *); 262 unsigned char key[MAXBLOCKSIZE]; 263 264 fprintf(stderr, "\n\nKey Schedule Time Trials for the Symmetric Ciphers:\n(Times are cycles per key)\n"); 265 no_results = 0; 266 for (x = 0; cipher_descriptor[x].name != NULL; x++) { 267 #define DO1(k) func(k, kl, 0, &skey); 268 269 func = cipher_descriptor[x].setup; 270 kl = cipher_descriptor[x].min_key_length; 271 c1 = (ulong64)-1; 272 for (y1 = 0; y1 < KTIMES; y1++) { 273 yarrow_read(key, kl, &yarrow_prng); 274 t_start(); 275 DO1(key); 276 t1 = t_read(); 277 c1 = (t1 > c1) ? c1 : t1; 278 } 279 t1 = c1 - skew; 280 results[no_results].spd1 = results[no_results].avg = t1; 281 results[no_results++].id = x; 282 fprintf(stderr, "."); fflush(stdout); 283 284 #undef DO1 285 } 286 tally_results(0); 287 288 return 0; 289 } 290 291 int time_cipher(void) 292 { 293 unsigned long x, y1; 294 ulong64 t1, t2, c1, c2, a1, a2; 295 symmetric_ECB ecb; 296 unsigned char key[MAXBLOCKSIZE], pt[4096]; 297 int err; 298 299 fprintf(stderr, "\n\nECB Time Trials for the Symmetric Ciphers:\n"); 300 no_results = 0; 301 for (x = 0; cipher_descriptor[x].name != NULL; x++) { 302 ecb_start(x, key, cipher_descriptor[x].min_key_length, 0, &ecb); 303 304 /* sanity check on cipher */ 305 if ((err = cipher_descriptor[x].test()) != CRYPT_OK) { 306 fprintf(stderr, "\n\nERROR: Cipher %s failed self-test %s\n", cipher_descriptor[x].name, error_to_string(err)); 307 exit(EXIT_FAILURE); 308 } 309 310 #define DO1 ecb_encrypt(pt, pt, sizeof(pt), &ecb); 311 #define DO2 DO1 DO1 312 313 c1 = c2 = (ulong64)-1; 314 for (y1 = 0; y1 < 100; y1++) { 315 t_start(); 316 DO1; 317 t1 = t_read(); 318 DO2; 319 t2 = t_read(); 320 t2 -= t1; 321 322 c1 = (t1 > c1 ? c1 : t1); 323 c2 = (t2 > c2 ? c2 : t2); 324 } 325 a1 = c2 - c1 - skew; 326 327 #undef DO1 328 #undef DO2 329 #define DO1 ecb_decrypt(pt, pt, sizeof(pt), &ecb); 330 #define DO2 DO1 DO1 331 332 c1 = c2 = (ulong64)-1; 333 for (y1 = 0; y1 < 100; y1++) { 334 t_start(); 335 DO1; 336 t1 = t_read(); 337 DO2; 338 t2 = t_read(); 339 t2 -= t1; 340 341 c1 = (t1 > c1 ? c1 : t1); 342 c2 = (t2 > c2 ? c2 : t2); 343 } 344 a2 = c2 - c1 - skew; 345 ecb_done(&ecb); 346 347 results[no_results].id = x; 348 results[no_results].spd1 = a1/(sizeof(pt)/cipher_descriptor[x].block_length); 349 results[no_results].spd2 = a2/(sizeof(pt)/cipher_descriptor[x].block_length); 350 results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2; 351 ++no_results; 352 fprintf(stderr, "."); fflush(stdout); 353 354 #undef DO2 355 #undef DO1 356 } 357 tally_results(1); 358 359 return 0; 360 } 361 362 #ifdef LTC_CBC_MODE 363 int time_cipher2(void) 364 { 365 unsigned long x, y1; 366 ulong64 t1, t2, c1, c2, a1, a2; 367 symmetric_CBC cbc; 368 unsigned char key[MAXBLOCKSIZE], pt[4096]; 369 int err; 370 371 fprintf(stderr, "\n\nCBC Time Trials for the Symmetric Ciphers:\n"); 372 no_results = 0; 373 for (x = 0; cipher_descriptor[x].name != NULL; x++) { 374 cbc_start(x, pt, key, cipher_descriptor[x].min_key_length, 0, &cbc); 375 376 /* sanity check on cipher */ 377 if ((err = cipher_descriptor[x].test()) != CRYPT_OK) { 378 fprintf(stderr, "\n\nERROR: Cipher %s failed self-test %s\n", cipher_descriptor[x].name, error_to_string(err)); 379 exit(EXIT_FAILURE); 380 } 381 382 #define DO1 cbc_encrypt(pt, pt, sizeof(pt), &cbc); 383 #define DO2 DO1 DO1 384 385 c1 = c2 = (ulong64)-1; 386 for (y1 = 0; y1 < 100; y1++) { 387 t_start(); 388 DO1; 389 t1 = t_read(); 390 DO2; 391 t2 = t_read(); 392 t2 -= t1; 393 394 c1 = (t1 > c1 ? c1 : t1); 395 c2 = (t2 > c2 ? c2 : t2); 396 } 397 a1 = c2 - c1 - skew; 398 399 #undef DO1 400 #undef DO2 401 #define DO1 cbc_decrypt(pt, pt, sizeof(pt), &cbc); 402 #define DO2 DO1 DO1 403 404 c1 = c2 = (ulong64)-1; 405 for (y1 = 0; y1 < 100; y1++) { 406 t_start(); 407 DO1; 408 t1 = t_read(); 409 DO2; 410 t2 = t_read(); 411 t2 -= t1; 412 413 c1 = (t1 > c1 ? c1 : t1); 414 c2 = (t2 > c2 ? c2 : t2); 415 } 416 a2 = c2 - c1 - skew; 417 cbc_done(&cbc); 418 419 results[no_results].id = x; 420 results[no_results].spd1 = a1/(sizeof(pt)/cipher_descriptor[x].block_length); 421 results[no_results].spd2 = a2/(sizeof(pt)/cipher_descriptor[x].block_length); 422 results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2; 423 ++no_results; 424 fprintf(stderr, "."); fflush(stdout); 425 426 #undef DO2 427 #undef DO1 428 } 429 tally_results(1); 430 431 return 0; 432 } 433 #else 434 int time_cipher2(void) { fprintf(stderr, "NO CBC\n"); return 0; } 435 #endif 436 437 #ifdef LTC_CTR_MODE 438 int time_cipher3(void) 439 { 440 unsigned long x, y1; 441 ulong64 t1, t2, c1, c2, a1, a2; 442 symmetric_CTR ctr; 443 unsigned char key[MAXBLOCKSIZE], pt[4096]; 444 int err; 445 446 fprintf(stderr, "\n\nCTR Time Trials for the Symmetric Ciphers:\n"); 447 no_results = 0; 448 for (x = 0; cipher_descriptor[x].name != NULL; x++) { 449 ctr_start(x, pt, key, cipher_descriptor[x].min_key_length, 0, CTR_COUNTER_LITTLE_ENDIAN, &ctr); 450 451 /* sanity check on cipher */ 452 if ((err = cipher_descriptor[x].test()) != CRYPT_OK) { 453 fprintf(stderr, "\n\nERROR: Cipher %s failed self-test %s\n", cipher_descriptor[x].name, error_to_string(err)); 454 exit(EXIT_FAILURE); 455 } 456 457 #define DO1 ctr_encrypt(pt, pt, sizeof(pt), &ctr); 458 #define DO2 DO1 DO1 459 460 c1 = c2 = (ulong64)-1; 461 for (y1 = 0; y1 < 100; y1++) { 462 t_start(); 463 DO1; 464 t1 = t_read(); 465 DO2; 466 t2 = t_read(); 467 t2 -= t1; 468 469 c1 = (t1 > c1 ? c1 : t1); 470 c2 = (t2 > c2 ? c2 : t2); 471 } 472 a1 = c2 - c1 - skew; 473 474 #undef DO1 475 #undef DO2 476 #define DO1 ctr_decrypt(pt, pt, sizeof(pt), &ctr); 477 #define DO2 DO1 DO1 478 479 c1 = c2 = (ulong64)-1; 480 for (y1 = 0; y1 < 100; y1++) { 481 t_start(); 482 DO1; 483 t1 = t_read(); 484 DO2; 485 t2 = t_read(); 486 t2 -= t1; 487 488 c1 = (t1 > c1 ? c1 : t1); 489 c2 = (t2 > c2 ? c2 : t2); 490 } 491 a2 = c2 - c1 - skew; 492 ctr_done(&ctr); 493 494 results[no_results].id = x; 495 results[no_results].spd1 = a1/(sizeof(pt)/cipher_descriptor[x].block_length); 496 results[no_results].spd2 = a2/(sizeof(pt)/cipher_descriptor[x].block_length); 497 results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2; 498 ++no_results; 499 fprintf(stderr, "."); fflush(stdout); 500 501 #undef DO2 502 #undef DO1 503 } 504 tally_results(1); 505 506 return 0; 507 } 508 #else 509 int time_cipher3(void) { fprintf(stderr, "NO CTR\n"); return 0; } 510 #endif 511 512 #ifdef LTC_LRW_MODE 513 int time_cipher4(void) 514 { 515 unsigned long x, y1; 516 ulong64 t1, t2, c1, c2, a1, a2; 517 symmetric_LRW lrw; 518 unsigned char key[MAXBLOCKSIZE], pt[4096]; 519 int err; 520 521 fprintf(stderr, "\n\nLRW Time Trials for the Symmetric Ciphers:\n"); 522 no_results = 0; 523 for (x = 0; cipher_descriptor[x].name != NULL; x++) { 524 if (cipher_descriptor[x].block_length != 16) continue; 525 lrw_start(x, pt, key, cipher_descriptor[x].min_key_length, key, 0, &lrw); 526 527 /* sanity check on cipher */ 528 if ((err = cipher_descriptor[x].test()) != CRYPT_OK) { 529 fprintf(stderr, "\n\nERROR: Cipher %s failed self-test %s\n", cipher_descriptor[x].name, error_to_string(err)); 530 exit(EXIT_FAILURE); 531 } 532 533 #define DO1 lrw_encrypt(pt, pt, sizeof(pt), &lrw); 534 #define DO2 DO1 DO1 535 536 c1 = c2 = (ulong64)-1; 537 for (y1 = 0; y1 < 100; y1++) { 538 t_start(); 539 DO1; 540 t1 = t_read(); 541 DO2; 542 t2 = t_read(); 543 t2 -= t1; 544 545 c1 = (t1 > c1 ? c1 : t1); 546 c2 = (t2 > c2 ? c2 : t2); 547 } 548 a1 = c2 - c1 - skew; 549 550 #undef DO1 551 #undef DO2 552 #define DO1 lrw_decrypt(pt, pt, sizeof(pt), &lrw); 553 #define DO2 DO1 DO1 554 555 c1 = c2 = (ulong64)-1; 556 for (y1 = 0; y1 < 100; y1++) { 557 t_start(); 558 DO1; 559 t1 = t_read(); 560 DO2; 561 t2 = t_read(); 562 t2 -= t1; 563 564 c1 = (t1 > c1 ? c1 : t1); 565 c2 = (t2 > c2 ? c2 : t2); 566 } 567 a2 = c2 - c1 - skew; 568 569 lrw_done(&lrw); 570 571 results[no_results].id = x; 572 results[no_results].spd1 = a1/(sizeof(pt)/cipher_descriptor[x].block_length); 573 results[no_results].spd2 = a2/(sizeof(pt)/cipher_descriptor[x].block_length); 574 results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2; 575 ++no_results; 576 fprintf(stderr, "."); fflush(stdout); 577 578 #undef DO2 579 #undef DO1 580 } 581 tally_results(1); 582 583 return 0; 584 } 585 #else 586 int time_cipher4(void) { fprintf(stderr, "NO LRW\n"); return 0; } 587 #endif 588 589 590 int time_hash(void) 591 { 592 unsigned long x, y1, len; 593 ulong64 t1, t2, c1, c2; 594 hash_state md; 595 int (*func)(hash_state *, const unsigned char *, unsigned long), err; 596 unsigned char pt[MAXBLOCKSIZE]; 597 598 599 fprintf(stderr, "\n\nHASH Time Trials for:\n"); 600 no_results = 0; 601 for (x = 0; hash_descriptor[x].name != NULL; x++) { 602 603 /* sanity check on hash */ 604 if ((err = hash_descriptor[x].test()) != CRYPT_OK) { 605 fprintf(stderr, "\n\nERROR: Hash %s failed self-test %s\n", hash_descriptor[x].name, error_to_string(err)); 606 exit(EXIT_FAILURE); 607 } 608 609 hash_descriptor[x].init(&md); 610 611 #define DO1 func(&md,pt,len); 612 #define DO2 DO1 DO1 613 614 func = hash_descriptor[x].process; 615 len = hash_descriptor[x].blocksize; 616 617 c1 = c2 = (ulong64)-1; 618 for (y1 = 0; y1 < TIMES; y1++) { 619 t_start(); 620 DO1; 621 t1 = t_read(); 622 DO2; 623 t2 = t_read() - t1; 624 c1 = (t1 > c1) ? c1 : t1; 625 c2 = (t2 > c2) ? c2 : t2; 626 } 627 t1 = c2 - c1 - skew; 628 t1 = ((t1 * CONST64(1000))) / ((ulong64)hash_descriptor[x].blocksize); 629 results[no_results].id = x; 630 results[no_results].spd1 = results[no_results].avg = t1; 631 ++no_results; 632 fprintf(stderr, "."); fflush(stdout); 633 #undef DO2 634 #undef DO1 635 } 636 tally_results(2); 637 638 return 0; 639 } 640 641 #undef MPI 642 /*#warning you need an mp_rand!!!*/ 643 644 #ifdef MPI 645 void time_mult(void) 646 { 647 ulong64 t1, t2; 648 unsigned long x, y; 649 void *a, *b, *c; 650 651 fprintf(stderr, "Timing Multiplying:\n"); 652 mp_init_multi(&a,&b,&c,NULL); 653 for (x = 128/DIGIT_BIT; x <= 1536/DIGIT_BIT; x += 128/DIGIT_BIT) { 654 mp_rand(&a, x); 655 mp_rand(&b, x); 656 657 #define DO1 mp_mul(&a, &b, &c); 658 #define DO2 DO1; DO1; 659 660 t2 = -1; 661 for (y = 0; y < TIMES; y++) { 662 t_start(); 663 t1 = t_read(); 664 DO2; 665 t1 = (t_read() - t1)>>1; 666 if (t1 < t2) t2 = t1; 667 } 668 fprintf(stderr, "%4lu bits: %9llu cycles\n", x*DIGIT_BIT, t2); 669 } 670 mp_clear_multi(&a,&b,&c,NULL); 671 672 #undef DO1 673 #undef DO2 674 } 675 676 void time_sqr(void) 677 { 678 ulong64 t1, t2; 679 unsigned long x, y; 680 mp_int a, b; 681 682 fprintf(stderr, "Timing Squaring:\n"); 683 mp_init_multi(&a,&b,NULL); 684 for (x = 128/DIGIT_BIT; x <= 1536/DIGIT_BIT; x += 128/DIGIT_BIT) { 685 mp_rand(&a, x); 686 687 #define DO1 mp_sqr(&a, &b); 688 #define DO2 DO1; DO1; 689 690 t2 = -1; 691 for (y = 0; y < TIMES; y++) { 692 t_start(); 693 t1 = t_read(); 694 DO2; 695 t1 = (t_read() - t1)>>1; 696 if (t1 < t2) t2 = t1; 697 } 698 fprintf(stderr, "%4lu bits: %9llu cycles\n", x*DIGIT_BIT, t2); 699 } 700 mp_clear_multi(&a,&b,NULL); 701 702 #undef DO1 703 #undef DO2 704 } 705 #else 706 void time_mult(void) { fprintf(stderr, "NO MULT\n"); } 707 void time_sqr(void) { fprintf(stderr, "NO SQR\n"); } 708 #endif 709 710 void time_prng(void) 711 { 712 ulong64 t1, t2; 713 unsigned char buf[4096]; 714 prng_state tprng; 715 unsigned long x, y; 716 int err; 717 718 fprintf(stderr, "Timing PRNGs (cycles/byte output, cycles add_entropy (32 bytes) :\n"); 719 for (x = 0; prng_descriptor[x].name != NULL; x++) { 720 721 /* sanity check on prng */ 722 if ((err = prng_descriptor[x].test()) != CRYPT_OK) { 723 fprintf(stderr, "\n\nERROR: PRNG %s failed self-test %s\n", prng_descriptor[x].name, error_to_string(err)); 724 exit(EXIT_FAILURE); 725 } 726 727 prng_descriptor[x].start(&tprng); 728 zeromem(buf, 256); 729 prng_descriptor[x].add_entropy(buf, 256, &tprng); 730 prng_descriptor[x].ready(&tprng); 731 t2 = -1; 732 733 #define DO1 if (prng_descriptor[x].read(buf, 4096, &tprng) != 4096) { fprintf(stderr, "\n\nERROR READ != 4096\n\n"); exit(EXIT_FAILURE); } 734 #define DO2 DO1 DO1 735 for (y = 0; y < 10000; y++) { 736 t_start(); 737 t1 = t_read(); 738 DO2; 739 t1 = (t_read() - t1)>>1; 740 if (t1 < t2) t2 = t1; 741 } 742 fprintf(stderr, "%20s: %5llu ", prng_descriptor[x].name, t2>>12); 743 #undef DO2 744 #undef DO1 745 746 #define DO1 prng_descriptor[x].start(&tprng); prng_descriptor[x].add_entropy(buf, 32, &tprng); prng_descriptor[x].ready(&tprng); prng_descriptor[x].done(&tprng); 747 #define DO2 DO1 DO1 748 for (y = 0; y < 10000; y++) { 749 t_start(); 750 t1 = t_read(); 751 DO2; 752 t1 = (t_read() - t1)>>1; 753 if (t1 < t2) t2 = t1; 754 } 755 fprintf(stderr, "%5llu\n", t2); 756 #undef DO2 757 #undef DO1 758 759 } 760 } 761 762 #ifdef MDSA 763 /* time various DSA operations */ 764 void time_dsa(void) 765 { 766 dsa_key key; 767 ulong64 t1, t2; 768 unsigned long x, y; 769 int err; 770 static const struct { 771 int group, modulus; 772 } groups[] = { 773 { 20, 96 }, 774 { 20, 128 }, 775 { 24, 192 }, 776 { 28, 256 }, 777 { 32, 512 } 778 }; 779 780 for (x = 0; x < (sizeof(groups)/sizeof(groups[0])); x++) { 781 t2 = 0; 782 for (y = 0; y < 4; y++) { 783 t_start(); 784 t1 = t_read(); 785 if ((err = dsa_make_key(&yarrow_prng, find_prng("yarrow"), groups[x].group, groups[x].modulus, &key)) != CRYPT_OK) { 786 fprintf(stderr, "\n\ndsa_make_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 787 exit(EXIT_FAILURE); 788 } 789 t1 = t_read() - t1; 790 t2 += t1; 791 792 #ifdef LTC_PROFILE 793 t2 <<= 2; 794 break; 795 #endif 796 if (y < 3) { 797 dsa_free(&key); 798 } 799 } 800 t2 >>= 2; 801 fprintf(stderr, "DSA-(%lu, %lu) make_key took %15llu cycles\n", (unsigned long)groups[x].group*8, (unsigned long)groups[x].modulus*8, t2); 802 } 803 } 804 #endif 805 806 807 #ifdef MRSA 808 /* time various RSA operations */ 809 void time_rsa(void) 810 { 811 rsa_key key; 812 ulong64 t1, t2; 813 unsigned char buf[2][2048]; 814 unsigned long x, y, z, zzz; 815 int err, zz, stat; 816 817 for (x = 1024; x <= 2048; x += 256) { 818 t2 = 0; 819 for (y = 0; y < 4; y++) { 820 t_start(); 821 t1 = t_read(); 822 if ((err = rsa_make_key(&yarrow_prng, find_prng("yarrow"), x/8, 65537, &key)) != CRYPT_OK) { 823 fprintf(stderr, "\n\nrsa_make_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 824 exit(EXIT_FAILURE); 825 } 826 t1 = t_read() - t1; 827 t2 += t1; 828 829 #ifdef LTC_PROFILE 830 t2 <<= 2; 831 break; 832 #endif 833 834 if (y < 3) { 835 rsa_free(&key); 836 } 837 } 838 t2 >>= 2; 839 fprintf(stderr, "RSA-%lu make_key took %15llu cycles\n", x, t2); 840 841 t2 = 0; 842 for (y = 0; y < 16; y++) { 843 t_start(); 844 t1 = t_read(); 845 z = sizeof(buf[1]); 846 if ((err = rsa_encrypt_key(buf[0], 32, buf[1], &z, (const unsigned char *)"testprog", 8, &yarrow_prng, 847 find_prng("yarrow"), find_hash("sha1"), 848 &key)) != CRYPT_OK) { 849 fprintf(stderr, "\n\nrsa_encrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 850 exit(EXIT_FAILURE); 851 } 852 t1 = t_read() - t1; 853 t2 += t1; 854 #ifdef LTC_PROFILE 855 t2 <<= 4; 856 break; 857 #endif 858 } 859 t2 >>= 4; 860 fprintf(stderr, "RSA-%lu encrypt_key took %15llu cycles\n", x, t2); 861 862 t2 = 0; 863 for (y = 0; y < 2048; y++) { 864 t_start(); 865 t1 = t_read(); 866 zzz = sizeof(buf[0]); 867 if ((err = rsa_decrypt_key(buf[1], z, buf[0], &zzz, (const unsigned char *)"testprog", 8, find_hash("sha1"), 868 &zz, &key)) != CRYPT_OK) { 869 fprintf(stderr, "\n\nrsa_decrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 870 exit(EXIT_FAILURE); 871 } 872 t1 = t_read() - t1; 873 t2 += t1; 874 #ifdef LTC_PROFILE 875 t2 <<= 11; 876 break; 877 #endif 878 } 879 t2 >>= 11; 880 fprintf(stderr, "RSA-%lu decrypt_key took %15llu cycles\n", x, t2); 881 882 t2 = 0; 883 for (y = 0; y < 256; y++) { 884 t_start(); 885 t1 = t_read(); 886 z = sizeof(buf[1]); 887 if ((err = rsa_sign_hash(buf[0], 20, buf[1], &z, &yarrow_prng, 888 find_prng("yarrow"), find_hash("sha1"), 8, &key)) != CRYPT_OK) { 889 fprintf(stderr, "\n\nrsa_sign_hash says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 890 exit(EXIT_FAILURE); 891 } 892 t1 = t_read() - t1; 893 t2 += t1; 894 #ifdef LTC_PROFILE 895 t2 <<= 8; 896 break; 897 #endif 898 } 899 t2 >>= 8; 900 fprintf(stderr, "RSA-%lu sign_hash took %15llu cycles\n", x, t2); 901 902 t2 = 0; 903 for (y = 0; y < 2048; y++) { 904 t_start(); 905 t1 = t_read(); 906 if ((err = rsa_verify_hash(buf[1], z, buf[0], 20, find_hash("sha1"), 8, &stat, &key)) != CRYPT_OK) { 907 fprintf(stderr, "\n\nrsa_verify_hash says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 908 exit(EXIT_FAILURE); 909 } 910 if (stat == 0) { 911 fprintf(stderr, "\n\nrsa_verify_hash for RSA-%lu failed to verify signature(%lu)\n", x, y); 912 exit(EXIT_FAILURE); 913 } 914 t1 = t_read() - t1; 915 t2 += t1; 916 #ifdef LTC_PROFILE 917 t2 <<= 11; 918 break; 919 #endif 920 } 921 t2 >>= 11; 922 fprintf(stderr, "RSA-%lu verify_hash took %15llu cycles\n", x, t2); 923 fprintf(stderr, "\n\n"); 924 rsa_free(&key); 925 } 926 } 927 #else 928 void time_rsa(void) { fprintf(stderr, "NO RSA\n"); } 929 #endif 930 931 #ifdef MKAT 932 /* time various KAT operations */ 933 void time_katja(void) 934 { 935 katja_key key; 936 ulong64 t1, t2; 937 unsigned char buf[2][4096]; 938 unsigned long x, y, z, zzz; 939 int err, zz; 940 941 for (x = 1024; x <= 2048; x += 256) { 942 t2 = 0; 943 for (y = 0; y < 4; y++) { 944 t_start(); 945 t1 = t_read(); 946 if ((err = katja_make_key(&yarrow_prng, find_prng("yarrow"), x/8, &key)) != CRYPT_OK) { 947 fprintf(stderr, "\n\nkatja_make_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 948 exit(EXIT_FAILURE); 949 } 950 t1 = t_read() - t1; 951 t2 += t1; 952 953 if (y < 3) { 954 katja_free(&key); 955 } 956 } 957 t2 >>= 2; 958 fprintf(stderr, "Katja-%lu make_key took %15llu cycles\n", x, t2); 959 960 t2 = 0; 961 for (y = 0; y < 16; y++) { 962 t_start(); 963 t1 = t_read(); 964 z = sizeof(buf[1]); 965 if ((err = katja_encrypt_key(buf[0], 32, buf[1], &z, "testprog", 8, &yarrow_prng, 966 find_prng("yarrow"), find_hash("sha1"), 967 &key)) != CRYPT_OK) { 968 fprintf(stderr, "\n\nkatja_encrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 969 exit(EXIT_FAILURE); 970 } 971 t1 = t_read() - t1; 972 t2 += t1; 973 } 974 t2 >>= 4; 975 fprintf(stderr, "Katja-%lu encrypt_key took %15llu cycles\n", x, t2); 976 977 t2 = 0; 978 for (y = 0; y < 2048; y++) { 979 t_start(); 980 t1 = t_read(); 981 zzz = sizeof(buf[0]); 982 if ((err = katja_decrypt_key(buf[1], z, buf[0], &zzz, "testprog", 8, find_hash("sha1"), 983 &zz, &key)) != CRYPT_OK) { 984 fprintf(stderr, "\n\nkatja_decrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 985 exit(EXIT_FAILURE); 986 } 987 t1 = t_read() - t1; 988 t2 += t1; 989 } 990 t2 >>= 11; 991 fprintf(stderr, "Katja-%lu decrypt_key took %15llu cycles\n", x, t2); 992 993 994 katja_free(&key); 995 } 996 } 997 #else 998 void time_katja(void) { fprintf(stderr, "NO Katja\n"); } 999 #endif 1000 1001 #ifdef MECC 1002 /* time various ECC operations */ 1003 void time_ecc(void) 1004 { 1005 ecc_key key; 1006 ulong64 t1, t2; 1007 unsigned char buf[2][256]; 1008 unsigned long i, w, x, y, z; 1009 int err, stat; 1010 static unsigned long sizes[] = { 1011 #ifdef ECC112 1012 112/8, 1013 #endif 1014 #ifdef ECC128 1015 128/8, 1016 #endif 1017 #ifdef ECC160 1018 160/8, 1019 #endif 1020 #ifdef ECC192 1021 192/8, 1022 #endif 1023 #ifdef ECC224 1024 224/8, 1025 #endif 1026 #ifdef ECC256 1027 256/8, 1028 #endif 1029 #ifdef ECC384 1030 384/8, 1031 #endif 1032 #ifdef ECC521 1033 521/8, 1034 #endif 1035 100000}; 1036 1037 for (x = sizes[i=0]; x < 100000; x = sizes[++i]) { 1038 t2 = 0; 1039 for (y = 0; y < 256; y++) { 1040 t_start(); 1041 t1 = t_read(); 1042 if ((err = ecc_make_key(&yarrow_prng, find_prng("yarrow"), x, &key)) != CRYPT_OK) { 1043 fprintf(stderr, "\n\necc_make_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 1044 exit(EXIT_FAILURE); 1045 } 1046 t1 = t_read() - t1; 1047 t2 += t1; 1048 1049 #ifdef LTC_PROFILE 1050 t2 <<= 8; 1051 break; 1052 #endif 1053 1054 if (y < 255) { 1055 ecc_free(&key); 1056 } 1057 } 1058 t2 >>= 8; 1059 fprintf(stderr, "ECC-%lu make_key took %15llu cycles\n", x*8, t2); 1060 1061 t2 = 0; 1062 for (y = 0; y < 256; y++) { 1063 t_start(); 1064 t1 = t_read(); 1065 z = sizeof(buf[1]); 1066 if ((err = ecc_encrypt_key(buf[0], 20, buf[1], &z, &yarrow_prng, find_prng("yarrow"), find_hash("sha1"), 1067 &key)) != CRYPT_OK) { 1068 fprintf(stderr, "\n\necc_encrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 1069 exit(EXIT_FAILURE); 1070 } 1071 t1 = t_read() - t1; 1072 t2 += t1; 1073 #ifdef LTC_PROFILE 1074 t2 <<= 8; 1075 break; 1076 #endif 1077 } 1078 t2 >>= 8; 1079 fprintf(stderr, "ECC-%lu encrypt_key took %15llu cycles\n", x*8, t2); 1080 1081 t2 = 0; 1082 for (y = 0; y < 256; y++) { 1083 t_start(); 1084 t1 = t_read(); 1085 w = 20; 1086 if ((err = ecc_decrypt_key(buf[1], z, buf[0], &w, &key)) != CRYPT_OK) { 1087 fprintf(stderr, "\n\necc_decrypt_key says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 1088 exit(EXIT_FAILURE); 1089 } 1090 t1 = t_read() - t1; 1091 t2 += t1; 1092 #ifdef LTC_PROFILE 1093 t2 <<= 8; 1094 break; 1095 #endif 1096 } 1097 t2 >>= 8; 1098 fprintf(stderr, "ECC-%lu decrypt_key took %15llu cycles\n", x*8, t2); 1099 1100 t2 = 0; 1101 for (y = 0; y < 256; y++) { 1102 t_start(); 1103 t1 = t_read(); 1104 z = sizeof(buf[1]); 1105 if ((err = ecc_sign_hash(buf[0], 20, buf[1], &z, &yarrow_prng, 1106 find_prng("yarrow"), &key)) != CRYPT_OK) { 1107 fprintf(stderr, "\n\necc_sign_hash says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 1108 exit(EXIT_FAILURE); 1109 } 1110 t1 = t_read() - t1; 1111 t2 += t1; 1112 #ifdef LTC_PROFILE 1113 t2 <<= 8; 1114 break; 1115 #endif 1116 } 1117 t2 >>= 8; 1118 fprintf(stderr, "ECC-%lu sign_hash took %15llu cycles\n", x*8, t2); 1119 1120 t2 = 0; 1121 for (y = 0; y < 256; y++) { 1122 t_start(); 1123 t1 = t_read(); 1124 if ((err = ecc_verify_hash(buf[1], z, buf[0], 20, &stat, &key)) != CRYPT_OK) { 1125 fprintf(stderr, "\n\necc_verify_hash says %s, wait...no it should say %s...damn you!\n", error_to_string(err), error_to_string(CRYPT_OK)); 1126 exit(EXIT_FAILURE); 1127 } 1128 if (stat == 0) { 1129 fprintf(stderr, "\n\necc_verify_hash for ECC-%lu failed to verify signature(%lu)\n", x*8, y); 1130 exit(EXIT_FAILURE); 1131 } 1132 t1 = t_read() - t1; 1133 t2 += t1; 1134 #ifdef LTC_PROFILE 1135 t2 <<= 8; 1136 break; 1137 #endif 1138 } 1139 t2 >>= 8; 1140 fprintf(stderr, "ECC-%lu verify_hash took %15llu cycles\n", x*8, t2); 1141 1142 fprintf(stderr, "\n\n"); 1143 ecc_free(&key); 1144 } 1145 } 1146 #else 1147 void time_ecc(void) { fprintf(stderr, "NO ECC\n"); } 1148 #endif 1149 1150 void time_macs_(unsigned long MAC_SIZE) 1151 { 1152 unsigned char *buf, key[16], tag[16]; 1153 ulong64 t1, t2; 1154 unsigned long x, z; 1155 int err, cipher_idx, hash_idx; 1156 1157 fprintf(stderr, "\nMAC Timings (cycles/byte on %luKB blocks):\n", MAC_SIZE); 1158 1159 buf = XMALLOC(MAC_SIZE*1024); 1160 if (buf == NULL) { 1161 fprintf(stderr, "\n\nout of heap yo\n\n"); 1162 exit(EXIT_FAILURE); 1163 } 1164 1165 cipher_idx = find_cipher("aes"); 1166 hash_idx = find_hash("sha1"); 1167 1168 if (cipher_idx == -1 || hash_idx == -1) { 1169 fprintf(stderr, "Warning the MAC tests requires AES and SHA1 to operate... so sorry\n"); 1170 return; 1171 } 1172 1173 yarrow_read(buf, MAC_SIZE*1024, &yarrow_prng); 1174 yarrow_read(key, 16, &yarrow_prng); 1175 1176 #ifdef LTC_OMAC 1177 t2 = -1; 1178 for (x = 0; x < 10000; x++) { 1179 t_start(); 1180 t1 = t_read(); 1181 z = 16; 1182 if ((err = omac_memory(cipher_idx, key, 16, buf, MAC_SIZE*1024, tag, &z)) != CRYPT_OK) { 1183 fprintf(stderr, "\n\nomac error... %s\n", error_to_string(err)); 1184 exit(EXIT_FAILURE); 1185 } 1186 t1 = t_read() - t1; 1187 if (t1 < t2) t2 = t1; 1188 } 1189 fprintf(stderr, "OMAC-%s\t\t%9llu\n", cipher_descriptor[cipher_idx].name, t2/(ulong64)(MAC_SIZE*1024)); 1190 #endif 1191 1192 #ifdef LTC_XCBC 1193 t2 = -1; 1194 for (x = 0; x < 10000; x++) { 1195 t_start(); 1196 t1 = t_read(); 1197 z = 16; 1198 if ((err = xcbc_memory(cipher_idx, key, 16, buf, MAC_SIZE*1024, tag, &z)) != CRYPT_OK) { 1199 fprintf(stderr, "\n\nxcbc error... %s\n", error_to_string(err)); 1200 exit(EXIT_FAILURE); 1201 } 1202 t1 = t_read() - t1; 1203 if (t1 < t2) t2 = t1; 1204 } 1205 fprintf(stderr, "XCBC-%s\t\t%9llu\n", cipher_descriptor[cipher_idx].name, t2/(ulong64)(MAC_SIZE*1024)); 1206 #endif 1207 1208 #ifdef LTC_F9_MODE 1209 t2 = -1; 1210 for (x = 0; x < 10000; x++) { 1211 t_start(); 1212 t1 = t_read(); 1213 z = 16; 1214 if ((err = f9_memory(cipher_idx, key, 16, buf, MAC_SIZE*1024, tag, &z)) != CRYPT_OK) { 1215 fprintf(stderr, "\n\nF9 error... %s\n", error_to_string(err)); 1216 exit(EXIT_FAILURE); 1217 } 1218 t1 = t_read() - t1; 1219 if (t1 < t2) t2 = t1; 1220 } 1221 fprintf(stderr, "F9-%s\t\t\t%9llu\n", cipher_descriptor[cipher_idx].name, t2/(ulong64)(MAC_SIZE*1024)); 1222 #endif 1223 1224 #ifdef LTC_PMAC 1225 t2 = -1; 1226 for (x = 0; x < 10000; x++) { 1227 t_start(); 1228 t1 = t_read(); 1229 z = 16; 1230 if ((err = pmac_memory(cipher_idx, key, 16, buf, MAC_SIZE*1024, tag, &z)) != CRYPT_OK) { 1231 fprintf(stderr, "\n\npmac error... %s\n", error_to_string(err)); 1232 exit(EXIT_FAILURE); 1233 } 1234 t1 = t_read() - t1; 1235 if (t1 < t2) t2 = t1; 1236 } 1237 fprintf(stderr, "PMAC-AES\t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); 1238 #endif 1239 1240 #ifdef PELICAN 1241 t2 = -1; 1242 for (x = 0; x < 10000; x++) { 1243 t_start(); 1244 t1 = t_read(); 1245 z = 16; 1246 if ((err = pelican_memory(key, 16, buf, MAC_SIZE*1024, tag)) != CRYPT_OK) { 1247 fprintf(stderr, "\n\npelican error... %s\n", error_to_string(err)); 1248 exit(EXIT_FAILURE); 1249 } 1250 t1 = t_read() - t1; 1251 if (t1 < t2) t2 = t1; 1252 } 1253 fprintf(stderr, "PELICAN \t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); 1254 #endif 1255 1256 #ifdef LTC_HMAC 1257 t2 = -1; 1258 for (x = 0; x < 10000; x++) { 1259 t_start(); 1260 t1 = t_read(); 1261 z = 16; 1262 if ((err = hmac_memory(hash_idx, key, 16, buf, MAC_SIZE*1024, tag, &z)) != CRYPT_OK) { 1263 fprintf(stderr, "\n\nhmac error... %s\n", error_to_string(err)); 1264 exit(EXIT_FAILURE); 1265 } 1266 t1 = t_read() - t1; 1267 if (t1 < t2) t2 = t1; 1268 } 1269 fprintf(stderr, "HMAC-%s\t\t%9llu\n", hash_descriptor[hash_idx].name, t2/(ulong64)(MAC_SIZE*1024)); 1270 #endif 1271 1272 XFREE(buf); 1273 } 1274 1275 void time_macs(void) 1276 { 1277 time_macs_(1); 1278 time_macs_(4); 1279 time_macs_(32); 1280 } 1281 1282 void time_encmacs_(unsigned long MAC_SIZE) 1283 { 1284 unsigned char *buf, IV[16], key[16], tag[16]; 1285 ulong64 t1, t2; 1286 unsigned long x, z; 1287 int err, cipher_idx; 1288 symmetric_key skey; 1289 1290 fprintf(stderr, "\nENC+MAC Timings (zero byte AAD, 16 byte IV, cycles/byte on %luKB blocks):\n", MAC_SIZE); 1291 1292 buf = XMALLOC(MAC_SIZE*1024); 1293 if (buf == NULL) { 1294 fprintf(stderr, "\n\nout of heap yo\n\n"); 1295 exit(EXIT_FAILURE); 1296 } 1297 1298 cipher_idx = find_cipher("aes"); 1299 1300 yarrow_read(buf, MAC_SIZE*1024, &yarrow_prng); 1301 yarrow_read(key, 16, &yarrow_prng); 1302 yarrow_read(IV, 16, &yarrow_prng); 1303 1304 #ifdef EAX_MODE 1305 t2 = -1; 1306 for (x = 0; x < 10000; x++) { 1307 t_start(); 1308 t1 = t_read(); 1309 z = 16; 1310 if ((err = eax_encrypt_authenticate_memory(cipher_idx, key, 16, IV, 16, NULL, 0, buf, MAC_SIZE*1024, buf, tag, &z)) != CRYPT_OK) { 1311 fprintf(stderr, "\nEAX error... %s\n", error_to_string(err)); 1312 exit(EXIT_FAILURE); 1313 } 1314 t1 = t_read() - t1; 1315 if (t1 < t2) t2 = t1; 1316 } 1317 fprintf(stderr, "EAX \t\t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); 1318 #endif 1319 1320 #ifdef OCB_MODE 1321 t2 = -1; 1322 for (x = 0; x < 10000; x++) { 1323 t_start(); 1324 t1 = t_read(); 1325 z = 16; 1326 if ((err = ocb_encrypt_authenticate_memory(cipher_idx, key, 16, IV, buf, MAC_SIZE*1024, buf, tag, &z)) != CRYPT_OK) { 1327 fprintf(stderr, "\nOCB error... %s\n", error_to_string(err)); 1328 exit(EXIT_FAILURE); 1329 } 1330 t1 = t_read() - t1; 1331 if (t1 < t2) t2 = t1; 1332 } 1333 fprintf(stderr, "OCB \t\t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); 1334 #endif 1335 1336 #ifdef CCM_MODE 1337 t2 = -1; 1338 for (x = 0; x < 10000; x++) { 1339 t_start(); 1340 t1 = t_read(); 1341 z = 16; 1342 if ((err = ccm_memory(cipher_idx, key, 16, NULL, IV, 16, NULL, 0, buf, MAC_SIZE*1024, buf, tag, &z, CCM_ENCRYPT)) != CRYPT_OK) { 1343 fprintf(stderr, "\nCCM error... %s\n", error_to_string(err)); 1344 exit(EXIT_FAILURE); 1345 } 1346 t1 = t_read() - t1; 1347 if (t1 < t2) t2 = t1; 1348 } 1349 fprintf(stderr, "CCM (no-precomp) \t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); 1350 1351 cipher_descriptor[cipher_idx].setup(key, 16, 0, &skey); 1352 t2 = -1; 1353 for (x = 0; x < 10000; x++) { 1354 t_start(); 1355 t1 = t_read(); 1356 z = 16; 1357 if ((err = ccm_memory(cipher_idx, key, 16, &skey, IV, 16, NULL, 0, buf, MAC_SIZE*1024, buf, tag, &z, CCM_ENCRYPT)) != CRYPT_OK) { 1358 fprintf(stderr, "\nCCM error... %s\n", error_to_string(err)); 1359 exit(EXIT_FAILURE); 1360 } 1361 t1 = t_read() - t1; 1362 if (t1 < t2) t2 = t1; 1363 } 1364 fprintf(stderr, "CCM (precomp) \t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); 1365 cipher_descriptor[cipher_idx].done(&skey); 1366 #endif 1367 1368 #ifdef GCM_MODE 1369 t2 = -1; 1370 for (x = 0; x < 100; x++) { 1371 t_start(); 1372 t1 = t_read(); 1373 z = 16; 1374 if ((err = gcm_memory(cipher_idx, key, 16, IV, 16, NULL, 0, buf, MAC_SIZE*1024, buf, tag, &z, GCM_ENCRYPT)) != CRYPT_OK) { 1375 fprintf(stderr, "\nGCM error... %s\n", error_to_string(err)); 1376 exit(EXIT_FAILURE); 1377 } 1378 t1 = t_read() - t1; 1379 if (t1 < t2) t2 = t1; 1380 } 1381 fprintf(stderr, "GCM (no-precomp)\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); 1382 1383 { 1384 gcm_state gcm 1385 #ifdef GCM_TABLES_SSE2 1386 __attribute__ ((aligned (16))) 1387 #endif 1388 ; 1389 1390 if ((err = gcm_init(&gcm, cipher_idx, key, 16)) != CRYPT_OK) { fprintf(stderr, "gcm_init: %s\n", error_to_string(err)); exit(EXIT_FAILURE); } 1391 t2 = -1; 1392 for (x = 0; x < 10000; x++) { 1393 t_start(); 1394 t1 = t_read(); 1395 z = 16; 1396 if ((err = gcm_reset(&gcm)) != CRYPT_OK) { 1397 fprintf(stderr, "\nGCM error[%d]... %s\n", __LINE__, error_to_string(err)); 1398 exit(EXIT_FAILURE); 1399 } 1400 if ((err = gcm_add_iv(&gcm, IV, 16)) != CRYPT_OK) { 1401 fprintf(stderr, "\nGCM error[%d]... %s\n", __LINE__, error_to_string(err)); 1402 exit(EXIT_FAILURE); 1403 } 1404 if ((err = gcm_add_aad(&gcm, NULL, 0)) != CRYPT_OK) { 1405 fprintf(stderr, "\nGCM error[%d]... %s\n", __LINE__, error_to_string(err)); 1406 exit(EXIT_FAILURE); 1407 } 1408 if ((err = gcm_process(&gcm, buf, MAC_SIZE*1024, buf, GCM_ENCRYPT)) != CRYPT_OK) { 1409 fprintf(stderr, "\nGCM error[%d]... %s\n", __LINE__, error_to_string(err)); 1410 exit(EXIT_FAILURE); 1411 } 1412 1413 if ((err = gcm_done(&gcm, tag, &z)) != CRYPT_OK) { 1414 fprintf(stderr, "\nGCM error[%d]... %s\n", __LINE__, error_to_string(err)); 1415 exit(EXIT_FAILURE); 1416 } 1417 t1 = t_read() - t1; 1418 if (t1 < t2) t2 = t1; 1419 } 1420 fprintf(stderr, "GCM (precomp)\t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); 1421 } 1422 1423 #endif 1424 1425 } 1426 1427 void time_encmacs(void) 1428 { 1429 time_encmacs_(1); 1430 time_encmacs_(4); 1431 time_encmacs_(32); 1432 } 1433 1434 /* $Source: /cvs/libtom/libtomcrypt/testprof/x86_prof.c,v $ */ 1435 /* $Revision: 1.51 $ */ 1436 /* $Date: 2006/11/21 00:10:18 $ */ 1437