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