1/* crypto/des/des_opts.c */ 2/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay@mincom.oz.au). 7 * The implementation was written so as to conform with Netscapes SSL. 8 * 9 * This library is free for commercial and non-commercial use as long as 10 * the following conditions are aheared to. The following conditions 11 * apply to all code found in this distribution, be it the RC4, RSA, 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13 * included with this distribution is covered by the same copyright terms 14 * except that the holder is Tim Hudson (tjh@mincom.oz.au). 15 * 16 * Copyright remains Eric Young's, and as such any Copyright notices in 17 * the code are not to be removed. 18 * If this package is used in a product, Eric Young should be given attribution 19 * as the author of the parts of the library used. 20 * This can be in the form of a textual message at program startup or 21 * in documentation (online or textual) provided with the package. 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 2. Redistributions in binary form must reproduce the above copyright 29 * notice, this list of conditions and the following disclaimer in the 30 * documentation and/or other materials provided with the distribution. 31 * 3. All advertising materials mentioning features or use of this software 32 * must display the following acknowledgement: 33 * "This product includes cryptographic software written by 34 * Eric Young (eay@mincom.oz.au)" 35 * The word 'cryptographic' can be left out if the rouines from the library 36 * being used are not cryptographic related :-). 37 * 4. If you include any Windows specific code (or a derivative thereof) from 38 * the apps directory (application code) you must include an acknowledgement: 39 * "This product includes software written by Tim Hudson (tjh@mincom.oz.au)" 40 * 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * 53 * The licence and distribution terms for any publically available version or 54 * derivative of this code cannot be changed. i.e. this code cannot simply be 55 * copied and put under another distribution licence 56 * [including the GNU Public Licence.] 57 */ 58 59/* define PART1, PART2, PART3 or PART4 to build only with a few of the options. 60 * This is for machines with 64k code segment size restrictions. */ 61 62#ifndef MSDOS 63#define TIMES 64#endif 65 66#include <stdio.h> 67#ifndef MSDOS 68#include <unistd.h> 69#else 70#include <io.h> 71extern void exit(); 72#endif 73#include <signal.h> 74#ifndef VMS 75#ifndef _IRIX 76#include <time.h> 77#endif 78#ifdef TIMES 79#include <sys/types.h> 80#include <sys/times.h> 81#endif 82#else /* VMS */ 83#include <types.h> 84struct tms { 85 time_t tms_utime; 86 time_t tms_stime; 87 time_t tms_uchild; /* I dunno... */ 88 time_t tms_uchildsys; /* so these names are a guess :-) */ 89 } 90#endif 91#ifndef TIMES 92#include <sys/timeb.h> 93#endif 94 95#ifdef sun 96#include <limits.h> 97#include <sys/param.h> 98#endif 99 100#include "des.h" 101#include "spr.h" 102 103#define DES_DEFAULT_OPTIONS 104 105#if !defined(PART1) && !defined(PART2) && !defined(PART3) && !defined(PART4) 106#define PART1 107#define PART2 108#define PART3 109#define PART4 110#endif 111 112#ifdef PART1 113 114#undef DES_UNROLL 115#undef DES_RISC1 116#undef DES_RISC2 117#undef DES_PTR 118#undef D_ENCRYPT 119#define des_encrypt des_encrypt_u4_cisc_idx 120#define des_encrypt2 des_encrypt2_u4_cisc_idx 121#define des_encrypt3 des_encrypt3_u4_cisc_idx 122#define des_decrypt3 des_decrypt3_u4_cisc_idx 123#undef HEADER_DES_LOCL_H 124#include "des_enc.c" 125 126#define DES_UNROLL 127#undef DES_RISC1 128#undef DES_RISC2 129#undef DES_PTR 130#undef D_ENCRYPT 131#undef des_encrypt 132#undef des_encrypt2 133#undef des_encrypt3 134#undef des_decrypt3 135#define des_encrypt des_encrypt_u16_cisc_idx 136#define des_encrypt2 des_encrypt2_u16_cisc_idx 137#define des_encrypt3 des_encrypt3_u16_cisc_idx 138#define des_decrypt3 des_decrypt3_u16_cisc_idx 139#undef HEADER_DES_LOCL_H 140#include "des_enc.c" 141 142#undef DES_UNROLL 143#define DES_RISC1 144#undef DES_RISC2 145#undef DES_PTR 146#undef D_ENCRYPT 147#undef des_encrypt 148#undef des_encrypt2 149#undef des_encrypt3 150#undef des_decrypt3 151#define des_encrypt des_encrypt_u4_risc1_idx 152#define des_encrypt2 des_encrypt2_u4_risc1_idx 153#define des_encrypt3 des_encrypt3_u4_risc1_idx 154#define des_decrypt3 des_decrypt3_u4_risc1_idx 155#undef HEADER_DES_LOCL_H 156#include "des_enc.c" 157 158#endif 159 160#ifdef PART2 161 162#undef DES_UNROLL 163#undef DES_RISC1 164#define DES_RISC2 165#undef DES_PTR 166#undef D_ENCRYPT 167#undef des_encrypt 168#undef des_encrypt2 169#undef des_encrypt3 170#undef des_decrypt3 171#define des_encrypt des_encrypt_u4_risc2_idx 172#define des_encrypt2 des_encrypt2_u4_risc2_idx 173#define des_encrypt3 des_encrypt3_u4_risc2_idx 174#define des_decrypt3 des_decrypt3_u4_risc2_idx 175#undef HEADER_DES_LOCL_H 176#include "des_enc.c" 177 178#define DES_UNROLL 179#define DES_RISC1 180#undef DES_RISC2 181#undef DES_PTR 182#undef D_ENCRYPT 183#undef des_encrypt 184#undef des_encrypt2 185#undef des_encrypt3 186#undef des_decrypt3 187#define des_encrypt des_encrypt_u16_risc1_idx 188#define des_encrypt2 des_encrypt2_u16_risc1_idx 189#define des_encrypt3 des_encrypt3_u16_risc1_idx 190#define des_decrypt3 des_decrypt3_u16_risc1_idx 191#undef HEADER_DES_LOCL_H 192#include "des_enc.c" 193 194#define DES_UNROLL 195#undef DES_RISC1 196#define DES_RISC2 197#undef DES_PTR 198#undef D_ENCRYPT 199#undef des_encrypt 200#undef des_encrypt2 201#undef des_encrypt3 202#undef des_decrypt3 203#define des_encrypt des_encrypt_u16_risc2_idx 204#define des_encrypt2 des_encrypt2_u16_risc2_idx 205#define des_encrypt3 des_encrypt3_u16_risc2_idx 206#define des_decrypt3 des_decrypt3_u16_risc2_idx 207#undef HEADER_DES_LOCL_H 208#include "des_enc.c" 209 210#endif 211 212#ifdef PART3 213 214#undef DES_UNROLL 215#undef DES_RISC1 216#undef DES_RISC2 217#define DES_PTR 218#undef D_ENCRYPT 219#undef des_encrypt 220#undef des_encrypt2 221#undef des_encrypt3 222#undef des_decrypt3 223#define des_encrypt des_encrypt_u4_cisc_ptr 224#define des_encrypt2 des_encrypt2_u4_cisc_ptr 225#define des_encrypt3 des_encrypt3_u4_cisc_ptr 226#define des_decrypt3 des_decrypt3_u4_cisc_ptr 227#undef HEADER_DES_LOCL_H 228#include "des_enc.c" 229 230#define DES_UNROLL 231#undef DES_RISC1 232#undef DES_RISC2 233#define DES_PTR 234#undef D_ENCRYPT 235#undef des_encrypt 236#undef des_encrypt2 237#undef des_encrypt3 238#undef des_decrypt3 239#define des_encrypt des_encrypt_u16_cisc_ptr 240#define des_encrypt2 des_encrypt2_u16_cisc_ptr 241#define des_encrypt3 des_encrypt3_u16_cisc_ptr 242#define des_decrypt3 des_decrypt3_u16_cisc_ptr 243#undef HEADER_DES_LOCL_H 244#include "des_enc.c" 245 246#undef DES_UNROLL 247#define DES_RISC1 248#undef DES_RISC2 249#define DES_PTR 250#undef D_ENCRYPT 251#undef des_encrypt 252#undef des_encrypt2 253#undef des_encrypt3 254#undef des_decrypt3 255#define des_encrypt des_encrypt_u4_risc1_ptr 256#define des_encrypt2 des_encrypt2_u4_risc1_ptr 257#define des_encrypt3 des_encrypt3_u4_risc1_ptr 258#define des_decrypt3 des_decrypt3_u4_risc1_ptr 259#undef HEADER_DES_LOCL_H 260#include "des_enc.c" 261 262#endif 263 264#ifdef PART4 265 266#undef DES_UNROLL 267#undef DES_RISC1 268#define DES_RISC2 269#define DES_PTR 270#undef D_ENCRYPT 271#undef des_encrypt 272#undef des_encrypt2 273#undef des_encrypt3 274#undef des_decrypt3 275#define des_encrypt des_encrypt_u4_risc2_ptr 276#define des_encrypt2 des_encrypt2_u4_risc2_ptr 277#define des_encrypt3 des_encrypt3_u4_risc2_ptr 278#define des_decrypt3 des_decrypt3_u4_risc2_ptr 279#undef HEADER_DES_LOCL_H 280#include "des_enc.c" 281 282#define DES_UNROLL 283#define DES_RISC1 284#undef DES_RISC2 285#define DES_PTR 286#undef D_ENCRYPT 287#undef des_encrypt 288#undef des_encrypt2 289#undef des_encrypt3 290#undef des_decrypt3 291#define des_encrypt des_encrypt_u16_risc1_ptr 292#define des_encrypt2 des_encrypt2_u16_risc1_ptr 293#define des_encrypt3 des_encrypt3_u16_risc1_ptr 294#define des_decrypt3 des_decrypt3_u16_risc1_ptr 295#undef HEADER_DES_LOCL_H 296#include "des_enc.c" 297 298#define DES_UNROLL 299#undef DES_RISC1 300#define DES_RISC2 301#define DES_PTR 302#undef D_ENCRYPT 303#undef des_encrypt 304#undef des_encrypt2 305#undef des_encrypt3 306#undef des_decrypt3 307#define des_encrypt des_encrypt_u16_risc2_ptr 308#define des_encrypt2 des_encrypt2_u16_risc2_ptr 309#define des_encrypt3 des_encrypt3_u16_risc2_ptr 310#define des_decrypt3 des_decrypt3_u16_risc2_ptr 311#undef HEADER_DES_LOCL_H 312#include "des_enc.c" 313 314#endif 315 316/* The following if from times(3) man page. It may need to be changed */ 317#ifndef HZ 318#ifndef CLK_TCK 319#ifndef VMS 320#define HZ 100.0 321#else /* VMS */ 322#define HZ 100.0 323#endif 324#else /* CLK_TCK */ 325#define HZ ((double)CLK_TCK) 326#endif 327#endif 328 329#define BUFSIZE ((long)1024) 330long run=0; 331 332#ifndef NOPROTO 333double Time_F(int s); 334#else 335double Time_F(); 336#endif 337 338#ifdef SIGALRM 339#if defined(__STDC__) || defined(sgi) 340#define SIGRETTYPE void 341#else 342#define SIGRETTYPE int 343#endif 344 345#ifndef NOPROTO 346SIGRETTYPE sig_done(int sig); 347#else 348SIGRETTYPE sig_done(); 349#endif 350 351SIGRETTYPE sig_done(sig) 352int sig; 353 { 354 signal(SIGALRM,sig_done); 355 run=0; 356#ifdef LINT 357 sig=sig; 358#endif 359 } 360#endif 361 362#define START 0 363#define STOP 1 364 365double Time_F(s) 366int s; 367 { 368 double ret; 369#ifdef TIMES 370 static struct tms tstart,tend; 371 372 if (s == START) 373 { 374 times(&tstart); 375 return(0); 376 } 377 else 378 { 379 times(&tend); 380 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ; 381 return((ret == 0.0)?1e-6:ret); 382 } 383#else /* !times() */ 384 static struct timeb tstart,tend; 385 long i; 386 387 if (s == START) 388 { 389 ftime(&tstart); 390 return(0); 391 } 392 else 393 { 394 ftime(&tend); 395 i=(long)tend.millitm-(long)tstart.millitm; 396 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0; 397 return((ret == 0.0)?1e-6:ret); 398 } 399#endif 400 } 401 402#ifdef SIGALRM 403#define print_name(name) fprintf(stderr,"Doing %s's for 10 seconds\n",name); alarm(10); 404#else 405#define print_name(name) fprintf(stderr,"Doing %s %ld times\n",name,cb); 406#endif 407 408#define time_it(func,name,index) \ 409 print_name(name); \ 410 Time_F(START); \ 411 for (count=0,run=1; COND(cb); count++) \ 412 { \ 413 unsigned long d[2]; \ 414 func(d,&(sch[0]),DES_ENCRYPT); \ 415 } \ 416 tm[index]=Time_F(STOP); \ 417 fprintf(stderr,"%ld %s's in %.2f second\n",count,name,tm[index]); \ 418 tm[index]=((double)COUNT(cb))/tm[index]; 419 420#define print_it(name,index) \ 421 fprintf(stderr,"%s bytes per sec = %12.2f (%5.1fuS)\n",name, \ 422 tm[index]*8,1.0e6/tm[index]); 423 424int main(argc,argv) 425int argc; 426char **argv; 427 { 428 long count; 429 static unsigned char buf[BUFSIZE]; 430 static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}; 431 static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12}; 432 static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34}; 433 des_key_schedule sch,sch2,sch3; 434 double d,tm[16],max=0; 435 int rank[16]; 436 char *str[16]; 437 int max_idx=0,i,num=0,j; 438#ifndef SIGALARM 439 long ca,cb,cc,cd,ce; 440#endif 441 442 for (i=0; i<12; i++) 443 { 444 tm[i]=0.0; 445 rank[i]=0; 446 } 447 448#ifndef TIMES 449 fprintf(stderr,"To get the most acurate results, try to run this\n"); 450 fprintf(stderr,"program when this computer is idle.\n"); 451#endif 452 453 des_set_key((C_Block *)key,sch); 454 des_set_key((C_Block *)key2,sch2); 455 des_set_key((C_Block *)key3,sch3); 456 457#ifndef SIGALRM 458 fprintf(stderr,"First we calculate the approximate speed ...\n"); 459 des_set_key((C_Block *)key,sch); 460 count=10; 461 do { 462 long i; 463 unsigned long data[2]; 464 465 count*=2; 466 Time_F(START); 467 for (i=count; i; i--) 468 des_encrypt(data,&(sch[0]),DES_ENCRYPT); 469 d=Time_F(STOP); 470 } while (d < 3.0); 471 ca=count; 472 cb=count*3; 473 cc=count*3*8/BUFSIZE+1; 474 cd=count*8/BUFSIZE+1; 475 476 ce=count/20+1; 477#define COND(d) (count != (d)) 478#define COUNT(d) (d) 479#else 480#define COND(c) (run) 481#define COUNT(d) (count) 482 signal(SIGALRM,sig_done); 483 alarm(10); 484#endif 485 486#ifdef PART1 487 time_it(des_encrypt_u4_cisc_idx, "des_encrypt_u4_cisc_idx ", 0); 488 time_it(des_encrypt_u16_cisc_idx, "des_encrypt_u16_cisc_idx ", 1); 489 time_it(des_encrypt_u4_risc1_idx, "des_encrypt_u4_risc1_idx ", 2); 490 num+=3; 491#endif 492#ifdef PART2 493 time_it(des_encrypt_u16_risc1_idx,"des_encrypt_u16_risc1_idx", 3); 494 time_it(des_encrypt_u4_risc2_idx, "des_encrypt_u4_risc2_idx ", 4); 495 time_it(des_encrypt_u16_risc2_idx,"des_encrypt_u16_risc2_idx", 5); 496 num+=3; 497#endif 498#ifdef PART3 499 time_it(des_encrypt_u4_cisc_ptr, "des_encrypt_u4_cisc_ptr ", 6); 500 time_it(des_encrypt_u16_cisc_ptr, "des_encrypt_u16_cisc_ptr ", 7); 501 time_it(des_encrypt_u4_risc1_ptr, "des_encrypt_u4_risc1_ptr ", 8); 502 num+=3; 503#endif 504#ifdef PART4 505 time_it(des_encrypt_u16_risc1_ptr,"des_encrypt_u16_risc1_ptr", 9); 506 time_it(des_encrypt_u4_risc2_ptr, "des_encrypt_u4_risc2_ptr ",10); 507 time_it(des_encrypt_u16_risc2_ptr,"des_encrypt_u16_risc2_ptr",11); 508 num+=3; 509#endif 510 511#ifdef PART1 512 str[0]=" 4 c i"; 513 print_it("des_encrypt_u4_cisc_idx ",0); 514 max=tm[0]; 515 max_idx=0; 516 str[1]="16 c i"; 517 print_it("des_encrypt_u16_cisc_idx ",1); 518 if (max < tm[1]) { max=tm[1]; max_idx=1; } 519 str[2]=" 4 r1 i"; 520 print_it("des_encrypt_u4_risc1_idx ",2); 521 if (max < tm[2]) { max=tm[2]; max_idx=2; } 522#endif 523#ifdef PART2 524 str[3]="16 r1 i"; 525 print_it("des_encrypt_u16_risc1_idx",3); 526 if (max < tm[3]) { max=tm[3]; max_idx=3; } 527 str[4]=" 4 r2 i"; 528 print_it("des_encrypt_u4_risc2_idx ",4); 529 if (max < tm[4]) { max=tm[4]; max_idx=4; } 530 str[5]="16 r2 i"; 531 print_it("des_encrypt_u16_risc2_idx",5); 532 if (max < tm[5]) { max=tm[5]; max_idx=5; } 533#endif 534#ifdef PART3 535 str[6]=" 4 c p"; 536 print_it("des_encrypt_u4_cisc_ptr ",6); 537 if (max < tm[6]) { max=tm[6]; max_idx=6; } 538 str[7]="16 c p"; 539 print_it("des_encrypt_u16_cisc_ptr ",7); 540 if (max < tm[7]) { max=tm[7]; max_idx=7; } 541 str[8]=" 4 r1 p"; 542 print_it("des_encrypt_u4_risc1_ptr ",8); 543 if (max < tm[8]) { max=tm[8]; max_idx=8; } 544#endif 545#ifdef PART4 546 str[9]="16 r1 p"; 547 print_it("des_encrypt_u16_risc1_ptr",9); 548 if (max < tm[9]) { max=tm[9]; max_idx=9; } 549 str[10]=" 4 r2 p"; 550 print_it("des_encrypt_u4_risc2_ptr ",10); 551 if (max < tm[10]) { max=tm[10]; max_idx=10; } 552 str[11]="16 r2 p"; 553 print_it("des_encrypt_u16_risc2_ptr",11); 554 if (max < tm[11]) { max=tm[11]; max_idx=11; } 555#endif 556 printf("options des ecb/s\n"); 557 printf("%s %12.2f 100.0%%\n",str[max_idx],tm[max_idx]); 558 d=tm[max_idx]; 559 tm[max_idx]= -2.0; 560 max= -1.0; 561 for (;;) 562 { 563 for (i=0; i<12; i++) 564 { 565 if (max < tm[i]) { max=tm[i]; j=i; } 566 } 567 if (max < 0.0) break; 568 printf("%s %12.2f %4.1f%%\n",str[j],tm[j],tm[j]/d*100.0); 569 tm[j]= -2.0; 570 max= -1.0; 571 } 572 573 switch (max_idx) 574 { 575 case 0: 576 printf("-DDES_DEFAULT_OPTIONS\n"); 577 break; 578 case 1: 579 printf("-DDES_UNROLL\n"); 580 break; 581 case 2: 582 printf("-DDES_RISC1\n"); 583 break; 584 case 3: 585 printf("-DDES_UNROLL -DDES_RISC1\n"); 586 break; 587 case 4: 588 printf("-DDES_RISC2\n"); 589 break; 590 case 5: 591 printf("-DDES_UNROLL -DDES_RISC2\n"); 592 break; 593 case 6: 594 printf("-DDES_PTR\n"); 595 break; 596 case 7: 597 printf("-DDES_UNROLL -DDES_PTR\n"); 598 break; 599 case 8: 600 printf("-DDES_RISC1 -DDES_PTR\n"); 601 break; 602 case 9: 603 printf("-DDES_UNROLL -DDES_RISC1 -DDES_PTR\n"); 604 break; 605 case 10: 606 printf("-DDES_RISC2 -DDES_PTR\n"); 607 break; 608 case 11: 609 printf("-DDES_UNROLL -DDES_RISC2 -DDES_PTR\n"); 610 break; 611 } 612 exit(0); 613#if defined(LINT) || defined(MSDOS) 614 return(0); 615#endif 616 } 617