os/ossrv/ssl/libcrypto/src/crypto/des/des_opts.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /* crypto/des/des_opts.c */
     2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
     3  * All rights reserved.
     4  *
     5  * This package is an SSL implementation written
     6  * by Eric Young (eay@cryptsoft.com).
     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@cryptsoft.com).
    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@cryptsoft.com)"
    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@cryptsoft.com)"
    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 #if !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX)
    63 #define TIMES
    64 #endif
    65 
    66 #include <stdio.h>
    67 #ifndef OPENSSL_SYS_MSDOS
    68 #include <openssl/e_os2.h>
    69 #include OPENSSL_UNISTD
    70 #else
    71 #include <io.h>
    72 extern void exit();
    73 #endif
    74 
    75 #ifndef OPENSSL_SYS_NETWARE
    76 #include <signal.h>
    77 #endif
    78 
    79 #ifndef _IRIX
    80 #include <time.h>
    81 #endif
    82 #ifdef TIMES
    83 #include <sys/types.h>
    84 #include <sys/times.h>
    85 #endif
    86 
    87 /* Depending on the VMS version, the tms structure is perhaps defined.
    88    The __TMS macro will show if it was.  If it wasn't defined, we should
    89    undefine TIMES, since that tells the rest of the program how things
    90    should be handled.				-- Richard Levitte */
    91 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
    92 #undef TIMES
    93 #endif
    94 
    95 #ifndef TIMES
    96 #include <sys/timeb.h>
    97 #endif
    98 
    99 
   100 #if defined(sun) || defined(__ultrix)
   101 #define _POSIX_SOURCE
   102 #include <limits.h>
   103 #include <sys/param.h>
   104 #endif
   105 
   106 #include <openssl/des.h>
   107 #include "spr.h"
   108 
   109 #define DES_DEFAULT_OPTIONS
   110 
   111 #if !defined(PART1) && !defined(PART2) && !defined(PART3) && !defined(PART4)
   112 #define PART1
   113 #define PART2
   114 #define PART3
   115 #define PART4
   116 #endif
   117 
   118 #ifdef PART1
   119 
   120 #undef DES_UNROLL
   121 #undef DES_RISC1
   122 #undef DES_RISC2
   123 #undef DES_PTR
   124 #undef D_ENCRYPT
   125 #define DES_encrypt1 des_encrypt_u4_cisc_idx
   126 #define DES_encrypt2 des_encrypt2_u4_cisc_idx
   127 #define DES_encrypt3 des_encrypt3_u4_cisc_idx
   128 #define DES_decrypt3 des_decrypt3_u4_cisc_idx
   129 #undef HEADER_DES_LOCL_H
   130 #include "des_enc.c"
   131 
   132 #define DES_UNROLL
   133 #undef DES_RISC1
   134 #undef DES_RISC2
   135 #undef DES_PTR
   136 #undef D_ENCRYPT
   137 #undef DES_encrypt1
   138 #undef DES_encrypt2
   139 #undef DES_encrypt3
   140 #undef DES_decrypt3
   141 #define DES_encrypt1 des_encrypt_u16_cisc_idx
   142 #define DES_encrypt2 des_encrypt2_u16_cisc_idx
   143 #define DES_encrypt3 des_encrypt3_u16_cisc_idx
   144 #define DES_decrypt3 des_decrypt3_u16_cisc_idx
   145 #undef HEADER_DES_LOCL_H
   146 #include "des_enc.c"
   147 
   148 #undef DES_UNROLL
   149 #define DES_RISC1
   150 #undef DES_RISC2
   151 #undef DES_PTR
   152 #undef D_ENCRYPT
   153 #undef DES_encrypt1
   154 #undef DES_encrypt2
   155 #undef DES_encrypt3
   156 #undef DES_decrypt3
   157 #define DES_encrypt1 des_encrypt_u4_risc1_idx
   158 #define DES_encrypt2 des_encrypt2_u4_risc1_idx
   159 #define DES_encrypt3 des_encrypt3_u4_risc1_idx
   160 #define DES_decrypt3 des_decrypt3_u4_risc1_idx
   161 #undef HEADER_DES_LOCL_H
   162 #include "des_enc.c"
   163 
   164 #endif
   165 
   166 #ifdef PART2
   167 
   168 #undef DES_UNROLL
   169 #undef DES_RISC1
   170 #define DES_RISC2
   171 #undef DES_PTR
   172 #undef D_ENCRYPT
   173 #undef DES_encrypt1
   174 #undef DES_encrypt2
   175 #undef DES_encrypt3
   176 #undef DES_decrypt3
   177 #define DES_encrypt1 des_encrypt_u4_risc2_idx
   178 #define DES_encrypt2 des_encrypt2_u4_risc2_idx
   179 #define DES_encrypt3 des_encrypt3_u4_risc2_idx
   180 #define DES_decrypt3 des_decrypt3_u4_risc2_idx
   181 #undef HEADER_DES_LOCL_H
   182 #include "des_enc.c"
   183 
   184 #define DES_UNROLL
   185 #define DES_RISC1
   186 #undef DES_RISC2
   187 #undef DES_PTR
   188 #undef D_ENCRYPT
   189 #undef DES_encrypt1
   190 #undef DES_encrypt2
   191 #undef DES_encrypt3
   192 #undef DES_decrypt3
   193 #define DES_encrypt1 des_encrypt_u16_risc1_idx
   194 #define DES_encrypt2 des_encrypt2_u16_risc1_idx
   195 #define DES_encrypt3 des_encrypt3_u16_risc1_idx
   196 #define DES_decrypt3 des_decrypt3_u16_risc1_idx
   197 #undef HEADER_DES_LOCL_H
   198 #include "des_enc.c"
   199 
   200 #define DES_UNROLL
   201 #undef DES_RISC1
   202 #define DES_RISC2
   203 #undef DES_PTR
   204 #undef D_ENCRYPT
   205 #undef DES_encrypt1
   206 #undef DES_encrypt2
   207 #undef DES_encrypt3
   208 #undef DES_decrypt3
   209 #define DES_encrypt1 des_encrypt_u16_risc2_idx
   210 #define DES_encrypt2 des_encrypt2_u16_risc2_idx
   211 #define DES_encrypt3 des_encrypt3_u16_risc2_idx
   212 #define DES_decrypt3 des_decrypt3_u16_risc2_idx
   213 #undef HEADER_DES_LOCL_H
   214 #include "des_enc.c"
   215 
   216 #endif
   217 
   218 #ifdef PART3
   219 
   220 #undef DES_UNROLL
   221 #undef DES_RISC1
   222 #undef DES_RISC2
   223 #define DES_PTR
   224 #undef D_ENCRYPT
   225 #undef DES_encrypt1
   226 #undef DES_encrypt2
   227 #undef DES_encrypt3
   228 #undef DES_decrypt3
   229 #define DES_encrypt1 des_encrypt_u4_cisc_ptr
   230 #define DES_encrypt2 des_encrypt2_u4_cisc_ptr
   231 #define DES_encrypt3 des_encrypt3_u4_cisc_ptr
   232 #define DES_decrypt3 des_decrypt3_u4_cisc_ptr
   233 #undef HEADER_DES_LOCL_H
   234 #include "des_enc.c"
   235 
   236 #define DES_UNROLL
   237 #undef DES_RISC1
   238 #undef DES_RISC2
   239 #define DES_PTR
   240 #undef D_ENCRYPT
   241 #undef DES_encrypt1
   242 #undef DES_encrypt2
   243 #undef DES_encrypt3
   244 #undef DES_decrypt3
   245 #define DES_encrypt1 des_encrypt_u16_cisc_ptr
   246 #define DES_encrypt2 des_encrypt2_u16_cisc_ptr
   247 #define DES_encrypt3 des_encrypt3_u16_cisc_ptr
   248 #define DES_decrypt3 des_decrypt3_u16_cisc_ptr
   249 #undef HEADER_DES_LOCL_H
   250 #include "des_enc.c"
   251 
   252 #undef DES_UNROLL
   253 #define DES_RISC1
   254 #undef DES_RISC2
   255 #define DES_PTR
   256 #undef D_ENCRYPT
   257 #undef DES_encrypt1
   258 #undef DES_encrypt2
   259 #undef DES_encrypt3
   260 #undef DES_decrypt3
   261 #define DES_encrypt1 des_encrypt_u4_risc1_ptr
   262 #define DES_encrypt2 des_encrypt2_u4_risc1_ptr
   263 #define DES_encrypt3 des_encrypt3_u4_risc1_ptr
   264 #define DES_decrypt3 des_decrypt3_u4_risc1_ptr
   265 #undef HEADER_DES_LOCL_H
   266 #include "des_enc.c"
   267 
   268 #endif
   269 
   270 #ifdef PART4
   271 
   272 #undef DES_UNROLL
   273 #undef DES_RISC1
   274 #define DES_RISC2
   275 #define DES_PTR
   276 #undef D_ENCRYPT
   277 #undef DES_encrypt1
   278 #undef DES_encrypt2
   279 #undef DES_encrypt3
   280 #undef DES_decrypt3
   281 #define DES_encrypt1 des_encrypt_u4_risc2_ptr
   282 #define DES_encrypt2 des_encrypt2_u4_risc2_ptr
   283 #define DES_encrypt3 des_encrypt3_u4_risc2_ptr
   284 #define DES_decrypt3 des_decrypt3_u4_risc2_ptr
   285 #undef HEADER_DES_LOCL_H
   286 #include "des_enc.c"
   287 
   288 #define DES_UNROLL
   289 #define DES_RISC1
   290 #undef DES_RISC2
   291 #define DES_PTR
   292 #undef D_ENCRYPT
   293 #undef DES_encrypt1
   294 #undef DES_encrypt2
   295 #undef DES_encrypt3
   296 #undef DES_decrypt3
   297 #define DES_encrypt1 des_encrypt_u16_risc1_ptr
   298 #define DES_encrypt2 des_encrypt2_u16_risc1_ptr
   299 #define DES_encrypt3 des_encrypt3_u16_risc1_ptr
   300 #define DES_decrypt3 des_decrypt3_u16_risc1_ptr
   301 #undef HEADER_DES_LOCL_H
   302 #include "des_enc.c"
   303 
   304 #define DES_UNROLL
   305 #undef DES_RISC1
   306 #define DES_RISC2
   307 #define DES_PTR
   308 #undef D_ENCRYPT
   309 #undef DES_encrypt1
   310 #undef DES_encrypt2
   311 #undef DES_encrypt3
   312 #undef DES_decrypt3
   313 #define DES_encrypt1 des_encrypt_u16_risc2_ptr
   314 #define DES_encrypt2 des_encrypt2_u16_risc2_ptr
   315 #define DES_encrypt3 des_encrypt3_u16_risc2_ptr
   316 #define DES_decrypt3 des_decrypt3_u16_risc2_ptr
   317 #undef HEADER_DES_LOCL_H
   318 #include "des_enc.c"
   319 
   320 #endif
   321 
   322 /* The following if from times(3) man page.  It may need to be changed */
   323 #ifndef HZ
   324 # ifndef CLK_TCK
   325 #  ifndef _BSD_CLK_TCK_ /* FreeBSD fix */
   326 #   define HZ	100.0
   327 #  else /* _BSD_CLK_TCK_ */
   328 #   define HZ ((double)_BSD_CLK_TCK_)
   329 #  endif
   330 # else /* CLK_TCK */
   331 #  define HZ ((double)CLK_TCK)
   332 # endif
   333 #endif
   334 
   335 #define BUFSIZE	((long)1024)
   336 long run=0;
   337 
   338 double Time_F(int s);
   339 #ifdef SIGALRM
   340 #if defined(__STDC__) || defined(sgi)
   341 #define SIGRETTYPE void
   342 #else
   343 #define SIGRETTYPE int
   344 #endif
   345 
   346 SIGRETTYPE sig_done(int sig);
   347 SIGRETTYPE sig_done(int sig)
   348 	{
   349 	signal(SIGALRM,sig_done);
   350 	run=0;
   351 #ifdef LINT
   352 	sig=sig;
   353 #endif
   354 	}
   355 #endif
   356 
   357 #define START	0
   358 #define STOP	1
   359 
   360 double Time_F(int s)
   361 	{
   362 	double ret;
   363 #ifdef TIMES
   364 	static struct tms tstart,tend;
   365 
   366 	if (s == START)
   367 		{
   368 		times(&tstart);
   369 		return(0);
   370 		}
   371 	else
   372 		{
   373 		times(&tend);
   374 		ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
   375 		return((ret == 0.0)?1e-6:ret);
   376 		}
   377 #else /* !times() */
   378 	static struct timeb tstart,tend;
   379 	long i;
   380 
   381 	if (s == START)
   382 		{
   383 		ftime(&tstart);
   384 		return(0);
   385 		}
   386 	else
   387 		{
   388 		ftime(&tend);
   389 		i=(long)tend.millitm-(long)tstart.millitm;
   390 		ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
   391 		return((ret == 0.0)?1e-6:ret);
   392 		}
   393 #endif
   394 	}
   395 
   396 #ifdef SIGALRM
   397 #define print_name(name) fprintf(stderr,"Doing %s's for 10 seconds\n",name); alarm(10);
   398 #else
   399 #define print_name(name) fprintf(stderr,"Doing %s %ld times\n",name,cb);
   400 #endif
   401 	
   402 #define time_it(func,name,index) \
   403 	print_name(name); \
   404 	Time_F(START); \
   405 	for (count=0,run=1; COND(cb); count++) \
   406 		{ \
   407 		unsigned long d[2]; \
   408 		func(d,&sch,DES_ENCRYPT); \
   409 		} \
   410 	tm[index]=Time_F(STOP); \
   411 	fprintf(stderr,"%ld %s's in %.2f second\n",count,name,tm[index]); \
   412 	tm[index]=((double)COUNT(cb))/tm[index];
   413 
   414 #define print_it(name,index) \
   415 	fprintf(stderr,"%s bytes per sec = %12.2f (%5.1fuS)\n",name, \
   416 		tm[index]*8,1.0e6/tm[index]);
   417 
   418 int main(int argc, char **argv)
   419 	{
   420 	long count;
   421 	static unsigned char buf[BUFSIZE];
   422 	static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
   423 	static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
   424 	static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
   425 	DES_key_schedule sch,sch2,sch3;
   426 	double d,tm[16],max=0;
   427 	int rank[16];
   428 	char *str[16];
   429 	int max_idx=0,i,num=0,j;
   430 #ifndef SIGALARM
   431 	long ca,cb,cc,cd,ce;
   432 #endif
   433 
   434 	for (i=0; i<12; i++)
   435 		{
   436 		tm[i]=0.0;
   437 		rank[i]=0;
   438 		}
   439 
   440 #ifndef TIMES
   441 	fprintf(stderr,"To get the most accurate results, try to run this\n");
   442 	fprintf(stderr,"program when this computer is idle.\n");
   443 #endif
   444 
   445 	DES_set_key_unchecked(&key,&sch);
   446 	DES_set_key_unchecked(&key2,&sch2);
   447 	DES_set_key_unchecked(&key3,&sch3);
   448 
   449 #ifndef SIGALRM
   450 	fprintf(stderr,"First we calculate the approximate speed ...\n");
   451 	DES_set_key_unchecked(&key,sch);
   452 	count=10;
   453 	do	{
   454 		long i;
   455 		unsigned long data[2];
   456 
   457 		count*=2;
   458 		Time_F(START);
   459 		for (i=count; i; i--)
   460 			DES_encrypt1(data,&(sch[0]),DES_ENCRYPT);
   461 		d=Time_F(STOP);
   462 		} while (d < 3.0);
   463 	ca=count;
   464 	cb=count*3;
   465 	cc=count*3*8/BUFSIZE+1;
   466 	cd=count*8/BUFSIZE+1;
   467 
   468 	ce=count/20+1;
   469 #define COND(d) (count != (d))
   470 #define COUNT(d) (d)
   471 #else
   472 #define COND(c) (run)
   473 #define COUNT(d) (count)
   474         signal(SIGALRM,sig_done);
   475         alarm(10);
   476 #endif
   477 
   478 #ifdef PART1
   479 	time_it(des_encrypt_u4_cisc_idx,  "des_encrypt_u4_cisc_idx  ", 0);
   480 	time_it(des_encrypt_u16_cisc_idx, "des_encrypt_u16_cisc_idx ", 1);
   481 	time_it(des_encrypt_u4_risc1_idx, "des_encrypt_u4_risc1_idx ", 2);
   482 	num+=3;
   483 #endif
   484 #ifdef PART2
   485 	time_it(des_encrypt_u16_risc1_idx,"des_encrypt_u16_risc1_idx", 3);
   486 	time_it(des_encrypt_u4_risc2_idx, "des_encrypt_u4_risc2_idx ", 4);
   487 	time_it(des_encrypt_u16_risc2_idx,"des_encrypt_u16_risc2_idx", 5);
   488 	num+=3;
   489 #endif
   490 #ifdef PART3
   491 	time_it(des_encrypt_u4_cisc_ptr,  "des_encrypt_u4_cisc_ptr  ", 6);
   492 	time_it(des_encrypt_u16_cisc_ptr, "des_encrypt_u16_cisc_ptr ", 7);
   493 	time_it(des_encrypt_u4_risc1_ptr, "des_encrypt_u4_risc1_ptr ", 8);
   494 	num+=3;
   495 #endif
   496 #ifdef PART4
   497 	time_it(des_encrypt_u16_risc1_ptr,"des_encrypt_u16_risc1_ptr", 9);
   498 	time_it(des_encrypt_u4_risc2_ptr, "des_encrypt_u4_risc2_ptr ",10);
   499 	time_it(des_encrypt_u16_risc2_ptr,"des_encrypt_u16_risc2_ptr",11);
   500 	num+=3;
   501 #endif
   502 
   503 #ifdef PART1
   504 	str[0]=" 4  c i";
   505 	print_it("des_encrypt_u4_cisc_idx  ",0);
   506 	max=tm[0];
   507 	max_idx=0;
   508 	str[1]="16  c i";
   509 	print_it("des_encrypt_u16_cisc_idx ",1);
   510 	if (max < tm[1]) { max=tm[1]; max_idx=1; }
   511 	str[2]=" 4 r1 i";
   512 	print_it("des_encrypt_u4_risc1_idx ",2);
   513 	if (max < tm[2]) { max=tm[2]; max_idx=2; }
   514 #endif
   515 #ifdef PART2
   516 	str[3]="16 r1 i";
   517 	print_it("des_encrypt_u16_risc1_idx",3);
   518 	if (max < tm[3]) { max=tm[3]; max_idx=3; }
   519 	str[4]=" 4 r2 i";
   520 	print_it("des_encrypt_u4_risc2_idx ",4);
   521 	if (max < tm[4]) { max=tm[4]; max_idx=4; }
   522 	str[5]="16 r2 i";
   523 	print_it("des_encrypt_u16_risc2_idx",5);
   524 	if (max < tm[5]) { max=tm[5]; max_idx=5; }
   525 #endif
   526 #ifdef PART3
   527 	str[6]=" 4  c p";
   528 	print_it("des_encrypt_u4_cisc_ptr  ",6);
   529 	if (max < tm[6]) { max=tm[6]; max_idx=6; }
   530 	str[7]="16  c p";
   531 	print_it("des_encrypt_u16_cisc_ptr ",7);
   532 	if (max < tm[7]) { max=tm[7]; max_idx=7; }
   533 	str[8]=" 4 r1 p";
   534 	print_it("des_encrypt_u4_risc1_ptr ",8);
   535 	if (max < tm[8]) { max=tm[8]; max_idx=8; }
   536 #endif
   537 #ifdef PART4
   538 	str[9]="16 r1 p";
   539 	print_it("des_encrypt_u16_risc1_ptr",9);
   540 	if (max < tm[9]) { max=tm[9]; max_idx=9; }
   541 	str[10]=" 4 r2 p";
   542 	print_it("des_encrypt_u4_risc2_ptr ",10);
   543 	if (max < tm[10]) { max=tm[10]; max_idx=10; }
   544 	str[11]="16 r2 p";
   545 	print_it("des_encrypt_u16_risc2_ptr",11);
   546 	if (max < tm[11]) { max=tm[11]; max_idx=11; }
   547 #endif
   548 	printf("options    des ecb/s\n");
   549 	printf("%s %12.2f 100.0%%\n",str[max_idx],tm[max_idx]);
   550 	d=tm[max_idx];
   551 	tm[max_idx]= -2.0;
   552 	max= -1.0;
   553 	for (;;)
   554 		{
   555 		for (i=0; i<12; i++)
   556 			{
   557 			if (max < tm[i]) { max=tm[i]; j=i; }
   558 			}
   559 		if (max < 0.0) break;
   560 		printf("%s %12.2f  %4.1f%%\n",str[j],tm[j],tm[j]/d*100.0);
   561 		tm[j]= -2.0;
   562 		max= -1.0;
   563 		}
   564 
   565 	switch (max_idx)
   566 		{
   567 	case 0:
   568 		printf("-DDES_DEFAULT_OPTIONS\n");
   569 		break;
   570 	case 1:
   571 		printf("-DDES_UNROLL\n");
   572 		break;
   573 	case 2:
   574 		printf("-DDES_RISC1\n");
   575 		break;
   576 	case 3:
   577 		printf("-DDES_UNROLL -DDES_RISC1\n");
   578 		break;
   579 	case 4:
   580 		printf("-DDES_RISC2\n");
   581 		break;
   582 	case 5:
   583 		printf("-DDES_UNROLL -DDES_RISC2\n");
   584 		break;
   585 	case 6:
   586 		printf("-DDES_PTR\n");
   587 		break;
   588 	case 7:
   589 		printf("-DDES_UNROLL -DDES_PTR\n");
   590 		break;
   591 	case 8:
   592 		printf("-DDES_RISC1 -DDES_PTR\n");
   593 		break;
   594 	case 9:
   595 		printf("-DDES_UNROLL -DDES_RISC1 -DDES_PTR\n");
   596 		break;
   597 	case 10:
   598 		printf("-DDES_RISC2 -DDES_PTR\n");
   599 		break;
   600 	case 11:
   601 		printf("-DDES_UNROLL -DDES_RISC2 -DDES_PTR\n");
   602 		break;
   603 		}
   604 	exit(0);
   605 #if defined(LINT) || defined(OPENSSL_SYS_MSDOS)
   606 	return(0);
   607 #endif
   608 	}