155714Skris/* crypto/des/des_opts.c */
255714Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
355714Skris * All rights reserved.
455714Skris *
555714Skris * This package is an SSL implementation written
655714Skris * by Eric Young (eay@cryptsoft.com).
755714Skris * The implementation was written so as to conform with Netscapes SSL.
8280304Sjkim *
955714Skris * This library is free for commercial and non-commercial use as long as
1055714Skris * the following conditions are aheared to.  The following conditions
1155714Skris * apply to all code found in this distribution, be it the RC4, RSA,
1255714Skris * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
1355714Skris * included with this distribution is covered by the same copyright terms
1455714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15280304Sjkim *
1655714Skris * Copyright remains Eric Young's, and as such any Copyright notices in
1755714Skris * the code are not to be removed.
1855714Skris * If this package is used in a product, Eric Young should be given attribution
1955714Skris * as the author of the parts of the library used.
2055714Skris * This can be in the form of a textual message at program startup or
2155714Skris * in documentation (online or textual) provided with the package.
22280304Sjkim *
2355714Skris * Redistribution and use in source and binary forms, with or without
2455714Skris * modification, are permitted provided that the following conditions
2555714Skris * are met:
2655714Skris * 1. Redistributions of source code must retain the copyright
2755714Skris *    notice, this list of conditions and the following disclaimer.
2855714Skris * 2. Redistributions in binary form must reproduce the above copyright
2955714Skris *    notice, this list of conditions and the following disclaimer in the
3055714Skris *    documentation and/or other materials provided with the distribution.
3155714Skris * 3. All advertising materials mentioning features or use of this software
3255714Skris *    must display the following acknowledgement:
3355714Skris *    "This product includes cryptographic software written by
3455714Skris *     Eric Young (eay@cryptsoft.com)"
3555714Skris *    The word 'cryptographic' can be left out if the rouines from the library
3655714Skris *    being used are not cryptographic related :-).
37280304Sjkim * 4. If you include any Windows specific code (or a derivative thereof) from
3855714Skris *    the apps directory (application code) you must include an acknowledgement:
3955714Skris *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40280304Sjkim *
4155714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4255714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4355714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4455714Skris * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4555714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4955714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5055714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5155714Skris * SUCH DAMAGE.
52280304Sjkim *
5355714Skris * The licence and distribution terms for any publically available version or
5455714Skris * derivative of this code cannot be changed.  i.e. this code cannot simply be
5555714Skris * copied and put under another distribution licence
5655714Skris * [including the GNU Public Licence.]
5755714Skris */
5855714Skris
59280304Sjkim/*
60280304Sjkim * define PART1, PART2, PART3 or PART4 to build only with a few of the
61280304Sjkim * options. This is for machines with 64k code segment size restrictions.
62280304Sjkim */
6355714Skris
64109998Smarkm#if !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX)
65280304Sjkim# define TIMES
6655714Skris#endif
6755714Skris
6855714Skris#include <stdio.h>
69109998Smarkm#ifndef OPENSSL_SYS_MSDOS
70280304Sjkim# include <openssl/e_os2.h>
71280304Sjkim# include OPENSSL_UNISTD
7255714Skris#else
73280304Sjkim# include <io.h>
7455714Skrisextern void exit();
7555714Skris#endif
76160814Ssimon
77160814Ssimon#ifndef OPENSSL_SYS_NETWARE
78280304Sjkim# include <signal.h>
79160814Ssimon#endif
80160814Ssimon
8155714Skris#ifndef _IRIX
82280304Sjkim# include <time.h>
8355714Skris#endif
8455714Skris#ifdef TIMES
85280304Sjkim# include <sys/types.h>
86280304Sjkim# include <sys/times.h>
8755714Skris#endif
8855714Skris
89280304Sjkim/*
90280304Sjkim * Depending on the VMS version, the tms structure is perhaps defined. The
91280304Sjkim * __TMS macro will show if it was.  If it wasn't defined, we should undefine
92280304Sjkim * TIMES, since that tells the rest of the program how things should be
93280304Sjkim * handled.  -- Richard Levitte
94280304Sjkim */
95109998Smarkm#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
96280304Sjkim# undef TIMES
9755714Skris#endif
9855714Skris
9955714Skris#ifndef TIMES
100280304Sjkim# include <sys/timeb.h>
10155714Skris#endif
10255714Skris
10355714Skris#if defined(sun) || defined(__ultrix)
104280304Sjkim# define _POSIX_SOURCE
105280304Sjkim# include <limits.h>
106280304Sjkim# include <sys/param.h>
10755714Skris#endif
10855714Skris
10955714Skris#include <openssl/des.h>
11055714Skris#include "spr.h"
11155714Skris
11255714Skris#define DES_DEFAULT_OPTIONS
11355714Skris
11455714Skris#if !defined(PART1) && !defined(PART2) && !defined(PART3) && !defined(PART4)
115280304Sjkim# define PART1
116280304Sjkim# define PART2
117280304Sjkim# define PART3
118280304Sjkim# define PART4
11955714Skris#endif
12055714Skris
12155714Skris#ifdef PART1
12255714Skris
123280304Sjkim# undef DES_UNROLL
124280304Sjkim# undef DES_RISC1
125280304Sjkim# undef DES_RISC2
126280304Sjkim# undef DES_PTR
127280304Sjkim# undef D_ENCRYPT
128280304Sjkim# define DES_encrypt1 des_encrypt_u4_cisc_idx
129280304Sjkim# define DES_encrypt2 des_encrypt2_u4_cisc_idx
130280304Sjkim# define DES_encrypt3 des_encrypt3_u4_cisc_idx
131280304Sjkim# define DES_decrypt3 des_decrypt3_u4_cisc_idx
132280304Sjkim# undef HEADER_DES_LOCL_H
133280304Sjkim# include "des_enc.c"
13455714Skris
135280304Sjkim# define DES_UNROLL
136280304Sjkim# undef DES_RISC1
137280304Sjkim# undef DES_RISC2
138280304Sjkim# undef DES_PTR
139280304Sjkim# undef D_ENCRYPT
140280304Sjkim# undef DES_encrypt1
141280304Sjkim# undef DES_encrypt2
142280304Sjkim# undef DES_encrypt3
143280304Sjkim# undef DES_decrypt3
144280304Sjkim# define DES_encrypt1 des_encrypt_u16_cisc_idx
145280304Sjkim# define DES_encrypt2 des_encrypt2_u16_cisc_idx
146280304Sjkim# define DES_encrypt3 des_encrypt3_u16_cisc_idx
147280304Sjkim# define DES_decrypt3 des_decrypt3_u16_cisc_idx
148280304Sjkim# undef HEADER_DES_LOCL_H
149280304Sjkim# include "des_enc.c"
15055714Skris
151280304Sjkim# undef DES_UNROLL
152280304Sjkim# define DES_RISC1
153280304Sjkim# undef DES_RISC2
154280304Sjkim# undef DES_PTR
155280304Sjkim# undef D_ENCRYPT
156280304Sjkim# undef DES_encrypt1
157280304Sjkim# undef DES_encrypt2
158280304Sjkim# undef DES_encrypt3
159280304Sjkim# undef DES_decrypt3
160280304Sjkim# define DES_encrypt1 des_encrypt_u4_risc1_idx
161280304Sjkim# define DES_encrypt2 des_encrypt2_u4_risc1_idx
162280304Sjkim# define DES_encrypt3 des_encrypt3_u4_risc1_idx
163280304Sjkim# define DES_decrypt3 des_decrypt3_u4_risc1_idx
164280304Sjkim# undef HEADER_DES_LOCL_H
165280304Sjkim# include "des_enc.c"
16655714Skris
16755714Skris#endif
16855714Skris
16955714Skris#ifdef PART2
17055714Skris
171280304Sjkim# undef DES_UNROLL
172280304Sjkim# undef DES_RISC1
173280304Sjkim# define DES_RISC2
174280304Sjkim# undef DES_PTR
175280304Sjkim# undef D_ENCRYPT
176280304Sjkim# undef DES_encrypt1
177280304Sjkim# undef DES_encrypt2
178280304Sjkim# undef DES_encrypt3
179280304Sjkim# undef DES_decrypt3
180280304Sjkim# define DES_encrypt1 des_encrypt_u4_risc2_idx
181280304Sjkim# define DES_encrypt2 des_encrypt2_u4_risc2_idx
182280304Sjkim# define DES_encrypt3 des_encrypt3_u4_risc2_idx
183280304Sjkim# define DES_decrypt3 des_decrypt3_u4_risc2_idx
184280304Sjkim# undef HEADER_DES_LOCL_H
185280304Sjkim# include "des_enc.c"
18655714Skris
187280304Sjkim# define DES_UNROLL
188280304Sjkim# define DES_RISC1
189280304Sjkim# undef DES_RISC2
190280304Sjkim# undef DES_PTR
191280304Sjkim# undef D_ENCRYPT
192280304Sjkim# undef DES_encrypt1
193280304Sjkim# undef DES_encrypt2
194280304Sjkim# undef DES_encrypt3
195280304Sjkim# undef DES_decrypt3
196280304Sjkim# define DES_encrypt1 des_encrypt_u16_risc1_idx
197280304Sjkim# define DES_encrypt2 des_encrypt2_u16_risc1_idx
198280304Sjkim# define DES_encrypt3 des_encrypt3_u16_risc1_idx
199280304Sjkim# define DES_decrypt3 des_decrypt3_u16_risc1_idx
200280304Sjkim# undef HEADER_DES_LOCL_H
201280304Sjkim# include "des_enc.c"
20255714Skris
203280304Sjkim# define DES_UNROLL
204280304Sjkim# undef DES_RISC1
205280304Sjkim# define DES_RISC2
206280304Sjkim# undef DES_PTR
207280304Sjkim# undef D_ENCRYPT
208280304Sjkim# undef DES_encrypt1
209280304Sjkim# undef DES_encrypt2
210280304Sjkim# undef DES_encrypt3
211280304Sjkim# undef DES_decrypt3
212280304Sjkim# define DES_encrypt1 des_encrypt_u16_risc2_idx
213280304Sjkim# define DES_encrypt2 des_encrypt2_u16_risc2_idx
214280304Sjkim# define DES_encrypt3 des_encrypt3_u16_risc2_idx
215280304Sjkim# define DES_decrypt3 des_decrypt3_u16_risc2_idx
216280304Sjkim# undef HEADER_DES_LOCL_H
217280304Sjkim# include "des_enc.c"
21855714Skris
21955714Skris#endif
22055714Skris
22155714Skris#ifdef PART3
22255714Skris
223280304Sjkim# undef DES_UNROLL
224280304Sjkim# undef DES_RISC1
225280304Sjkim# undef DES_RISC2
226280304Sjkim# define DES_PTR
227280304Sjkim# undef D_ENCRYPT
228280304Sjkim# undef DES_encrypt1
229280304Sjkim# undef DES_encrypt2
230280304Sjkim# undef DES_encrypt3
231280304Sjkim# undef DES_decrypt3
232280304Sjkim# define DES_encrypt1 des_encrypt_u4_cisc_ptr
233280304Sjkim# define DES_encrypt2 des_encrypt2_u4_cisc_ptr
234280304Sjkim# define DES_encrypt3 des_encrypt3_u4_cisc_ptr
235280304Sjkim# define DES_decrypt3 des_decrypt3_u4_cisc_ptr
236280304Sjkim# undef HEADER_DES_LOCL_H
237280304Sjkim# include "des_enc.c"
23855714Skris
239280304Sjkim# define DES_UNROLL
240280304Sjkim# undef DES_RISC1
241280304Sjkim# undef DES_RISC2
242280304Sjkim# define DES_PTR
243280304Sjkim# undef D_ENCRYPT
244280304Sjkim# undef DES_encrypt1
245280304Sjkim# undef DES_encrypt2
246280304Sjkim# undef DES_encrypt3
247280304Sjkim# undef DES_decrypt3
248280304Sjkim# define DES_encrypt1 des_encrypt_u16_cisc_ptr
249280304Sjkim# define DES_encrypt2 des_encrypt2_u16_cisc_ptr
250280304Sjkim# define DES_encrypt3 des_encrypt3_u16_cisc_ptr
251280304Sjkim# define DES_decrypt3 des_decrypt3_u16_cisc_ptr
252280304Sjkim# undef HEADER_DES_LOCL_H
253280304Sjkim# include "des_enc.c"
25455714Skris
255280304Sjkim# undef DES_UNROLL
256280304Sjkim# define DES_RISC1
257280304Sjkim# undef DES_RISC2
258280304Sjkim# define DES_PTR
259280304Sjkim# undef D_ENCRYPT
260280304Sjkim# undef DES_encrypt1
261280304Sjkim# undef DES_encrypt2
262280304Sjkim# undef DES_encrypt3
263280304Sjkim# undef DES_decrypt3
264280304Sjkim# define DES_encrypt1 des_encrypt_u4_risc1_ptr
265280304Sjkim# define DES_encrypt2 des_encrypt2_u4_risc1_ptr
266280304Sjkim# define DES_encrypt3 des_encrypt3_u4_risc1_ptr
267280304Sjkim# define DES_decrypt3 des_decrypt3_u4_risc1_ptr
268280304Sjkim# undef HEADER_DES_LOCL_H
269280304Sjkim# include "des_enc.c"
27055714Skris
27155714Skris#endif
27255714Skris
27355714Skris#ifdef PART4
27455714Skris
275280304Sjkim# undef DES_UNROLL
276280304Sjkim# undef DES_RISC1
277280304Sjkim# define DES_RISC2
278280304Sjkim# define DES_PTR
279280304Sjkim# undef D_ENCRYPT
280280304Sjkim# undef DES_encrypt1
281280304Sjkim# undef DES_encrypt2
282280304Sjkim# undef DES_encrypt3
283280304Sjkim# undef DES_decrypt3
284280304Sjkim# define DES_encrypt1 des_encrypt_u4_risc2_ptr
285280304Sjkim# define DES_encrypt2 des_encrypt2_u4_risc2_ptr
286280304Sjkim# define DES_encrypt3 des_encrypt3_u4_risc2_ptr
287280304Sjkim# define DES_decrypt3 des_decrypt3_u4_risc2_ptr
288280304Sjkim# undef HEADER_DES_LOCL_H
289280304Sjkim# include "des_enc.c"
29055714Skris
291280304Sjkim# define DES_UNROLL
292280304Sjkim# define DES_RISC1
293280304Sjkim# undef DES_RISC2
294280304Sjkim# define DES_PTR
295280304Sjkim# undef D_ENCRYPT
296280304Sjkim# undef DES_encrypt1
297280304Sjkim# undef DES_encrypt2
298280304Sjkim# undef DES_encrypt3
299280304Sjkim# undef DES_decrypt3
300280304Sjkim# define DES_encrypt1 des_encrypt_u16_risc1_ptr
301280304Sjkim# define DES_encrypt2 des_encrypt2_u16_risc1_ptr
302280304Sjkim# define DES_encrypt3 des_encrypt3_u16_risc1_ptr
303280304Sjkim# define DES_decrypt3 des_decrypt3_u16_risc1_ptr
304280304Sjkim# undef HEADER_DES_LOCL_H
305280304Sjkim# include "des_enc.c"
30655714Skris
307280304Sjkim# define DES_UNROLL
308280304Sjkim# undef DES_RISC1
309280304Sjkim# define DES_RISC2
310280304Sjkim# define DES_PTR
311280304Sjkim# undef D_ENCRYPT
312280304Sjkim# undef DES_encrypt1
313280304Sjkim# undef DES_encrypt2
314280304Sjkim# undef DES_encrypt3
315280304Sjkim# undef DES_decrypt3
316280304Sjkim# define DES_encrypt1 des_encrypt_u16_risc2_ptr
317280304Sjkim# define DES_encrypt2 des_encrypt2_u16_risc2_ptr
318280304Sjkim# define DES_encrypt3 des_encrypt3_u16_risc2_ptr
319280304Sjkim# define DES_decrypt3 des_decrypt3_u16_risc2_ptr
320280304Sjkim# undef HEADER_DES_LOCL_H
321280304Sjkim# include "des_enc.c"
32255714Skris
32355714Skris#endif
32455714Skris
32555714Skris/* The following if from times(3) man page.  It may need to be changed */
32655714Skris#ifndef HZ
32755714Skris# ifndef CLK_TCK
328280304Sjkim#  ifndef _BSD_CLK_TCK_         /* FreeBSD fix */
329280304Sjkim#   define HZ   100.0
330280304Sjkim#  else                         /* _BSD_CLK_TCK_ */
33155714Skris#   define HZ ((double)_BSD_CLK_TCK_)
33255714Skris#  endif
333280304Sjkim# else                          /* CLK_TCK */
33455714Skris#  define HZ ((double)CLK_TCK)
33555714Skris# endif
33655714Skris#endif
33755714Skris
338280304Sjkim#define BUFSIZE ((long)1024)
339280304Sjkimlong run = 0;
34055714Skris
34155714Skrisdouble Time_F(int s);
34255714Skris#ifdef SIGALRM
343280304Sjkim# if defined(__STDC__) || defined(sgi)
344280304Sjkim#  define SIGRETTYPE void
345280304Sjkim# else
346280304Sjkim#  define SIGRETTYPE int
347280304Sjkim# endif
34855714Skris
34955714SkrisSIGRETTYPE sig_done(int sig);
35055714SkrisSIGRETTYPE sig_done(int sig)
351280304Sjkim{
352280304Sjkim    signal(SIGALRM, sig_done);
353280304Sjkim    run = 0;
354280304Sjkim# ifdef LINT
355280304Sjkim    sig = sig;
356280304Sjkim# endif
357280304Sjkim}
35855714Skris#endif
35955714Skris
360280304Sjkim#define START   0
361280304Sjkim#define STOP    1
36255714Skris
36355714Skrisdouble Time_F(int s)
364280304Sjkim{
365280304Sjkim    double ret;
36655714Skris#ifdef TIMES
367280304Sjkim    static struct tms tstart, tend;
36855714Skris
369280304Sjkim    if (s == START) {
370280304Sjkim        times(&tstart);
371280304Sjkim        return (0);
372280304Sjkim    } else {
373280304Sjkim        times(&tend);
374280304Sjkim        ret = ((double)(tend.tms_utime - tstart.tms_utime)) / HZ;
375280304Sjkim        return ((ret == 0.0) ? 1e-6 : ret);
376280304Sjkim    }
377280304Sjkim#else                           /* !times() */
378280304Sjkim    static struct timeb tstart, tend;
379280304Sjkim    long i;
38055714Skris
381280304Sjkim    if (s == START) {
382280304Sjkim        ftime(&tstart);
383280304Sjkim        return (0);
384280304Sjkim    } else {
385280304Sjkim        ftime(&tend);
386280304Sjkim        i = (long)tend.millitm - (long)tstart.millitm;
387280304Sjkim        ret = ((double)(tend.time - tstart.time)) + ((double)i) / 1000.0;
388280304Sjkim        return ((ret == 0.0) ? 1e-6 : ret);
389280304Sjkim    }
39055714Skris#endif
391280304Sjkim}
39255714Skris
39355714Skris#ifdef SIGALRM
394280304Sjkim# define print_name(name) fprintf(stderr,"Doing %s's for 10 seconds\n",name); alarm(10);
39555714Skris#else
396280304Sjkim# define print_name(name) fprintf(stderr,"Doing %s %ld times\n",name,cb);
39755714Skris#endif
398280304Sjkim
39955714Skris#define time_it(func,name,index) \
400280304Sjkim        print_name(name); \
401280304Sjkim        Time_F(START); \
402280304Sjkim        for (count=0,run=1; COND(cb); count++) \
403280304Sjkim                { \
404280304Sjkim                unsigned long d[2]; \
405280304Sjkim                func(d,&sch,DES_ENCRYPT); \
406280304Sjkim                } \
407280304Sjkim        tm[index]=Time_F(STOP); \
408280304Sjkim        fprintf(stderr,"%ld %s's in %.2f second\n",count,name,tm[index]); \
409280304Sjkim        tm[index]=((double)COUNT(cb))/tm[index];
41055714Skris
41155714Skris#define print_it(name,index) \
412280304Sjkim        fprintf(stderr,"%s bytes per sec = %12.2f (%5.1fuS)\n",name, \
413280304Sjkim                tm[index]*8,1.0e6/tm[index]);
41455714Skris
41555714Skrisint main(int argc, char **argv)
416280304Sjkim{
417280304Sjkim    long count;
418280304Sjkim    static unsigned char buf[BUFSIZE];
419280304Sjkim    static DES_cblock key =
420280304Sjkim        { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 };
421280304Sjkim    static DES_cblock key2 =
422280304Sjkim        { 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12 };
423280304Sjkim    static DES_cblock key3 =
424280304Sjkim        { 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34 };
425280304Sjkim    DES_key_schedule sch, sch2, sch3;
426280304Sjkim    double d, tm[16], max = 0;
427280304Sjkim    int rank[16];
428280304Sjkim    char *str[16];
429280304Sjkim    int max_idx = 0, i, num = 0, j;
43055714Skris#ifndef SIGALARM
431280304Sjkim    long ca, cb, cc, cd, ce;
43255714Skris#endif
43355714Skris
434280304Sjkim    for (i = 0; i < 12; i++) {
435280304Sjkim        tm[i] = 0.0;
436280304Sjkim        rank[i] = 0;
437280304Sjkim    }
43855714Skris
43955714Skris#ifndef TIMES
440280304Sjkim    fprintf(stderr, "To get the most accurate results, try to run this\n");
441280304Sjkim    fprintf(stderr, "program when this computer is idle.\n");
44255714Skris#endif
44355714Skris
444280304Sjkim    DES_set_key_unchecked(&key, &sch);
445280304Sjkim    DES_set_key_unchecked(&key2, &sch2);
446280304Sjkim    DES_set_key_unchecked(&key3, &sch3);
44755714Skris
44855714Skris#ifndef SIGALRM
449280304Sjkim    fprintf(stderr, "First we calculate the approximate speed ...\n");
450280304Sjkim    DES_set_key_unchecked(&key, sch);
451280304Sjkim    count = 10;
452280304Sjkim    do {
453280304Sjkim        long i;
454280304Sjkim        unsigned long data[2];
45555714Skris
456280304Sjkim        count *= 2;
457280304Sjkim        Time_F(START);
458280304Sjkim        for (i = count; i; i--)
459280304Sjkim            DES_encrypt1(data, &(sch[0]), DES_ENCRYPT);
460280304Sjkim        d = Time_F(STOP);
461280304Sjkim    } while (d < 3.0);
462280304Sjkim    ca = count;
463280304Sjkim    cb = count * 3;
464280304Sjkim    cc = count * 3 * 8 / BUFSIZE + 1;
465280304Sjkim    cd = count * 8 / BUFSIZE + 1;
46655714Skris
467280304Sjkim    ce = count / 20 + 1;
468280304Sjkim# define COND(d) (count != (d))
469280304Sjkim# define COUNT(d) (d)
47055714Skris#else
471280304Sjkim# define COND(c) (run)
472280304Sjkim# define COUNT(d) (count)
473280304Sjkim    signal(SIGALRM, sig_done);
474280304Sjkim    alarm(10);
47555714Skris#endif
47655714Skris
47755714Skris#ifdef PART1
478280304Sjkim    time_it(des_encrypt_u4_cisc_idx, "des_encrypt_u4_cisc_idx  ", 0);
479280304Sjkim    time_it(des_encrypt_u16_cisc_idx, "des_encrypt_u16_cisc_idx ", 1);
480280304Sjkim    time_it(des_encrypt_u4_risc1_idx, "des_encrypt_u4_risc1_idx ", 2);
481280304Sjkim    num += 3;
48255714Skris#endif
48355714Skris#ifdef PART2
484280304Sjkim    time_it(des_encrypt_u16_risc1_idx, "des_encrypt_u16_risc1_idx", 3);
485280304Sjkim    time_it(des_encrypt_u4_risc2_idx, "des_encrypt_u4_risc2_idx ", 4);
486280304Sjkim    time_it(des_encrypt_u16_risc2_idx, "des_encrypt_u16_risc2_idx", 5);
487280304Sjkim    num += 3;
48855714Skris#endif
48955714Skris#ifdef PART3
490280304Sjkim    time_it(des_encrypt_u4_cisc_ptr, "des_encrypt_u4_cisc_ptr  ", 6);
491280304Sjkim    time_it(des_encrypt_u16_cisc_ptr, "des_encrypt_u16_cisc_ptr ", 7);
492280304Sjkim    time_it(des_encrypt_u4_risc1_ptr, "des_encrypt_u4_risc1_ptr ", 8);
493280304Sjkim    num += 3;
49455714Skris#endif
49555714Skris#ifdef PART4
496280304Sjkim    time_it(des_encrypt_u16_risc1_ptr, "des_encrypt_u16_risc1_ptr", 9);
497280304Sjkim    time_it(des_encrypt_u4_risc2_ptr, "des_encrypt_u4_risc2_ptr ", 10);
498280304Sjkim    time_it(des_encrypt_u16_risc2_ptr, "des_encrypt_u16_risc2_ptr", 11);
499280304Sjkim    num += 3;
50055714Skris#endif
50155714Skris
50255714Skris#ifdef PART1
503280304Sjkim    str[0] = " 4  c i";
504280304Sjkim    print_it("des_encrypt_u4_cisc_idx  ", 0);
505280304Sjkim    max = tm[0];
506280304Sjkim    max_idx = 0;
507280304Sjkim    str[1] = "16  c i";
508280304Sjkim    print_it("des_encrypt_u16_cisc_idx ", 1);
509280304Sjkim    if (max < tm[1]) {
510280304Sjkim        max = tm[1];
511280304Sjkim        max_idx = 1;
512280304Sjkim    }
513280304Sjkim    str[2] = " 4 r1 i";
514280304Sjkim    print_it("des_encrypt_u4_risc1_idx ", 2);
515280304Sjkim    if (max < tm[2]) {
516280304Sjkim        max = tm[2];
517280304Sjkim        max_idx = 2;
518280304Sjkim    }
51955714Skris#endif
52055714Skris#ifdef PART2
521280304Sjkim    str[3] = "16 r1 i";
522280304Sjkim    print_it("des_encrypt_u16_risc1_idx", 3);
523280304Sjkim    if (max < tm[3]) {
524280304Sjkim        max = tm[3];
525280304Sjkim        max_idx = 3;
526280304Sjkim    }
527280304Sjkim    str[4] = " 4 r2 i";
528280304Sjkim    print_it("des_encrypt_u4_risc2_idx ", 4);
529280304Sjkim    if (max < tm[4]) {
530280304Sjkim        max = tm[4];
531280304Sjkim        max_idx = 4;
532280304Sjkim    }
533280304Sjkim    str[5] = "16 r2 i";
534280304Sjkim    print_it("des_encrypt_u16_risc2_idx", 5);
535280304Sjkim    if (max < tm[5]) {
536280304Sjkim        max = tm[5];
537280304Sjkim        max_idx = 5;
538280304Sjkim    }
53955714Skris#endif
54055714Skris#ifdef PART3
541280304Sjkim    str[6] = " 4  c p";
542280304Sjkim    print_it("des_encrypt_u4_cisc_ptr  ", 6);
543280304Sjkim    if (max < tm[6]) {
544280304Sjkim        max = tm[6];
545280304Sjkim        max_idx = 6;
546280304Sjkim    }
547280304Sjkim    str[7] = "16  c p";
548280304Sjkim    print_it("des_encrypt_u16_cisc_ptr ", 7);
549280304Sjkim    if (max < tm[7]) {
550280304Sjkim        max = tm[7];
551280304Sjkim        max_idx = 7;
552280304Sjkim    }
553280304Sjkim    str[8] = " 4 r1 p";
554280304Sjkim    print_it("des_encrypt_u4_risc1_ptr ", 8);
555280304Sjkim    if (max < tm[8]) {
556280304Sjkim        max = tm[8];
557280304Sjkim        max_idx = 8;
558280304Sjkim    }
55955714Skris#endif
56055714Skris#ifdef PART4
561280304Sjkim    str[9] = "16 r1 p";
562280304Sjkim    print_it("des_encrypt_u16_risc1_ptr", 9);
563280304Sjkim    if (max < tm[9]) {
564280304Sjkim        max = tm[9];
565280304Sjkim        max_idx = 9;
566280304Sjkim    }
567280304Sjkim    str[10] = " 4 r2 p";
568280304Sjkim    print_it("des_encrypt_u4_risc2_ptr ", 10);
569280304Sjkim    if (max < tm[10]) {
570280304Sjkim        max = tm[10];
571280304Sjkim        max_idx = 10;
572280304Sjkim    }
573280304Sjkim    str[11] = "16 r2 p";
574280304Sjkim    print_it("des_encrypt_u16_risc2_ptr", 11);
575280304Sjkim    if (max < tm[11]) {
576280304Sjkim        max = tm[11];
577280304Sjkim        max_idx = 11;
578280304Sjkim    }
57955714Skris#endif
580280304Sjkim    printf("options    des ecb/s\n");
581280304Sjkim    printf("%s %12.2f 100.0%%\n", str[max_idx], tm[max_idx]);
582280304Sjkim    d = tm[max_idx];
583280304Sjkim    tm[max_idx] = -2.0;
584280304Sjkim    max = -1.0;
585280304Sjkim    for (;;) {
586280304Sjkim        for (i = 0; i < 12; i++) {
587280304Sjkim            if (max < tm[i]) {
588280304Sjkim                max = tm[i];
589280304Sjkim                j = i;
590280304Sjkim            }
591280304Sjkim        }
592280304Sjkim        if (max < 0.0)
593280304Sjkim            break;
594280304Sjkim        printf("%s %12.2f  %4.1f%%\n", str[j], tm[j], tm[j] / d * 100.0);
595280304Sjkim        tm[j] = -2.0;
596280304Sjkim        max = -1.0;
597280304Sjkim    }
59855714Skris
599280304Sjkim    switch (max_idx) {
600280304Sjkim    case 0:
601280304Sjkim        printf("-DDES_DEFAULT_OPTIONS\n");
602280304Sjkim        break;
603280304Sjkim    case 1:
604280304Sjkim        printf("-DDES_UNROLL\n");
605280304Sjkim        break;
606280304Sjkim    case 2:
607280304Sjkim        printf("-DDES_RISC1\n");
608280304Sjkim        break;
609280304Sjkim    case 3:
610280304Sjkim        printf("-DDES_UNROLL -DDES_RISC1\n");
611280304Sjkim        break;
612280304Sjkim    case 4:
613280304Sjkim        printf("-DDES_RISC2\n");
614280304Sjkim        break;
615280304Sjkim    case 5:
616280304Sjkim        printf("-DDES_UNROLL -DDES_RISC2\n");
617280304Sjkim        break;
618280304Sjkim    case 6:
619280304Sjkim        printf("-DDES_PTR\n");
620280304Sjkim        break;
621280304Sjkim    case 7:
622280304Sjkim        printf("-DDES_UNROLL -DDES_PTR\n");
623280304Sjkim        break;
624280304Sjkim    case 8:
625280304Sjkim        printf("-DDES_RISC1 -DDES_PTR\n");
626280304Sjkim        break;
627280304Sjkim    case 9:
628280304Sjkim        printf("-DDES_UNROLL -DDES_RISC1 -DDES_PTR\n");
629280304Sjkim        break;
630280304Sjkim    case 10:
631280304Sjkim        printf("-DDES_RISC2 -DDES_PTR\n");
632280304Sjkim        break;
633280304Sjkim    case 11:
634280304Sjkim        printf("-DDES_UNROLL -DDES_RISC2 -DDES_PTR\n");
635280304Sjkim        break;
636280304Sjkim    }
637280304Sjkim    exit(0);
638109998Smarkm#if defined(LINT) || defined(OPENSSL_SYS_MSDOS)
639280304Sjkim    return (0);
64055714Skris#endif
641280304Sjkim}
642