OpenSSL: update to 1.0.1m
[tomato.git] / release / src / router / openssl / crypto / cast / castopts.c
blob42687f2884b089fc6e59a7aa52f4cf4df9af4b6f
1 /* crypto/cast/castopts.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))
65 # define TIMES
66 #endif
68 #include <stdio.h>
70 #include <openssl/e_os2.h>
71 #include OPENSSL_UNISTD_IO
72 OPENSSL_DECLARE_EXIT
73 #ifndef OPENSSL_SYS_NETWARE
74 # include <signal.h>
75 #endif
76 #ifndef _IRIX
77 # include <time.h>
78 #endif
79 #ifdef TIMES
80 # include <sys/types.h>
81 # include <sys/times.h>
82 #endif
84 * Depending on the VMS version, the tms structure is perhaps defined.
85 * The __TMS macro will show if it was. If it wasn't defined, we should
86 * undefine TIMES, since that tells the rest of the program how things
87 * should be handled. -- Richard Levitte
89 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
90 # undef TIMES
91 #endif
92 #ifndef TIMES
93 # include <sys/timeb.h>
94 #endif
95 #if defined(sun) || defined(__ultrix)
96 # define _POSIX_SOURCE
97 # include <limits.h>
98 # include <sys/param.h>
99 #endif
100 #include <openssl/cast.h>
101 #define CAST_DEFAULT_OPTIONS
102 #undef E_CAST
103 #define CAST_encrypt CAST_encrypt_normal
104 #define CAST_decrypt CAST_decrypt_normal
105 #define CAST_cbc_encrypt CAST_cbc_encrypt_normal
106 #undef HEADER_CAST_LOCL_H
107 #include "c_enc.c"
108 #define CAST_PTR
109 #undef CAST_PTR2
110 #undef E_CAST
111 #undef CAST_encrypt
112 #undef CAST_decrypt
113 #undef CAST_cbc_encrypt
114 #define CAST_encrypt CAST_encrypt_ptr
115 #define CAST_decrypt CAST_decrypt_ptr
116 #define CAST_cbc_encrypt CAST_cbc_encrypt_ptr
117 #undef HEADER_CAST_LOCL_H
118 #include "c_enc.c"
119 #undef CAST_PTR
120 #define CAST_PTR2
121 #undef E_CAST
122 #undef CAST_encrypt
123 #undef CAST_decrypt
124 #undef CAST_cbc_encrypt
125 #define CAST_encrypt CAST_encrypt_ptr2
126 #define CAST_decrypt CAST_decrypt_ptr2
127 #define CAST_cbc_encrypt CAST_cbc_encrypt_ptr2
128 #undef HEADER_CAST_LOCL_H
129 #include "c_enc.c"
130 /* The following if from times(3) man page. It may need to be changed */
131 #ifndef HZ
132 # ifndef CLK_TCK
133 # ifndef _BSD_CLK_TCK_ /* FreeBSD fix */
134 # define HZ 100.0
135 # else /* _BSD_CLK_TCK_ */
136 # define HZ ((double)_BSD_CLK_TCK_)
137 # endif
138 # else /* CLK_TCK */
139 # define HZ ((double)CLK_TCK)
140 # endif
141 #endif
142 #define BUFSIZE ((long)1024)
143 long run = 0;
145 double Time_F(int s);
146 #ifdef SIGALRM
147 # if defined(__STDC__) || defined(sgi)
148 # define SIGRETTYPE void
149 # else
150 # define SIGRETTYPE int
151 # endif
153 SIGRETTYPE sig_done(int sig);
154 SIGRETTYPE sig_done(int sig)
156 signal(SIGALRM, sig_done);
157 run = 0;
158 # ifdef LINT
159 sig = sig;
160 # endif
162 #endif
164 #define START 0
165 #define STOP 1
167 double Time_F(int s)
169 double ret;
170 #ifdef TIMES
171 static struct tms tstart, tend;
173 if (s == START) {
174 times(&tstart);
175 return (0);
176 } else {
177 times(&tend);
178 ret = ((double)(tend.tms_utime - tstart.tms_utime)) / HZ;
179 return ((ret == 0.0) ? 1e-6 : ret);
181 #else /* !times() */
182 static struct timeb tstart, tend;
183 long i;
185 if (s == START) {
186 ftime(&tstart);
187 return (0);
188 } else {
189 ftime(&tend);
190 i = (long)tend.millitm - (long)tstart.millitm;
191 ret = ((double)(tend.time - tstart.time)) + ((double)i) / 1000.0;
192 return ((ret == 0.0) ? 1e-6 : ret);
194 #endif
197 #ifdef SIGALRM
198 # define print_name(name) fprintf(stderr,"Doing %s's for 10 seconds\n",name); alarm(10);
199 #else
200 # define print_name(name) fprintf(stderr,"Doing %s %ld times\n",name,cb);
201 #endif
203 #define time_it(func,name,index) \
204 print_name(name); \
205 Time_F(START); \
206 for (count=0,run=1; COND(cb); count+=4) \
208 unsigned long d[2]; \
209 func(d,&sch); \
210 func(d,&sch); \
211 func(d,&sch); \
212 func(d,&sch); \
214 tm[index]=Time_F(STOP); \
215 fprintf(stderr,"%ld %s's in %.2f second\n",count,name,tm[index]); \
216 tm[index]=((double)COUNT(cb))/tm[index];
218 #define print_it(name,index) \
219 fprintf(stderr,"%s bytes per sec = %12.2f (%5.1fuS)\n",name, \
220 tm[index]*8,1.0e6/tm[index]);
222 int main(int argc, char **argv)
224 long count;
225 static unsigned char buf[BUFSIZE];
226 static char key[16] = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
227 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0
229 CAST_KEY sch;
230 double d, tm[16], max = 0;
231 int rank[16];
232 char *str[16];
233 int max_idx = 0, i, num = 0, j;
234 #ifndef SIGALARM
235 long ca, cb, cc, cd, ce;
236 #endif
238 for (i = 0; i < 12; i++) {
239 tm[i] = 0.0;
240 rank[i] = 0;
243 #ifndef TIMES
244 fprintf(stderr, "To get the most accurate results, try to run this\n");
245 fprintf(stderr, "program when this computer is idle.\n");
246 #endif
248 CAST_set_key(&sch, 16, key);
250 #ifndef SIGALRM
251 fprintf(stderr, "First we calculate the approximate speed ...\n");
252 count = 10;
253 do {
254 long i;
255 unsigned long data[2];
257 count *= 2;
258 Time_F(START);
259 for (i = count; i; i--)
260 CAST_encrypt(data, &sch);
261 d = Time_F(STOP);
262 } while (d < 3.0);
263 ca = count;
264 cb = count * 3;
265 cc = count * 3 * 8 / BUFSIZE + 1;
266 cd = count * 8 / BUFSIZE + 1;
268 ce = count / 20 + 1;
269 # define COND(d) (count != (d))
270 # define COUNT(d) (d)
271 #else
272 # define COND(c) (run)
273 # define COUNT(d) (count)
274 signal(SIGALRM, sig_done);
275 alarm(10);
276 #endif
278 time_it(CAST_encrypt_normal, "CAST_encrypt_normal ", 0);
279 time_it(CAST_encrypt_ptr, "CAST_encrypt_ptr ", 1);
280 time_it(CAST_encrypt_ptr2, "CAST_encrypt_ptr2 ", 2);
281 num += 3;
283 str[0] = "<nothing>";
284 print_it("CAST_encrypt_normal ", 0);
285 max = tm[0];
286 max_idx = 0;
287 str[1] = "ptr ";
288 print_it("CAST_encrypt_ptr ", 1);
289 if (max < tm[1]) {
290 max = tm[1];
291 max_idx = 1;
293 str[2] = "ptr2 ";
294 print_it("CAST_encrypt_ptr2 ", 2);
295 if (max < tm[2]) {
296 max = tm[2];
297 max_idx = 2;
300 printf("options CAST ecb/s\n");
301 printf("%s %12.2f 100.0%%\n", str[max_idx], tm[max_idx]);
302 d = tm[max_idx];
303 tm[max_idx] = -2.0;
304 max = -1.0;
305 for (;;) {
306 for (i = 0; i < 3; i++) {
307 if (max < tm[i]) {
308 max = tm[i];
309 j = i;
312 if (max < 0.0)
313 break;
314 printf("%s %12.2f %4.1f%%\n", str[j], tm[j], tm[j] / d * 100.0);
315 tm[j] = -2.0;
316 max = -1.0;
319 switch (max_idx) {
320 case 0:
321 printf("-DCAST_DEFAULT_OPTIONS\n");
322 break;
323 case 1:
324 printf("-DCAST_PTR\n");
325 break;
326 case 2:
327 printf("-DCAST_PTR2\n");
328 break;
330 exit(0);
331 #if defined(LINT) || defined(OPENSSL_SYS_MSDOS)
332 return (0);
333 #endif