summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/cast
diff options
context:
space:
mode:
authorryker <>1998-10-05 20:13:15 +0000
committerryker <>1998-10-05 20:13:15 +0000
commit536c76cbb863bab152f19842ab88772c01e922c7 (patch)
treedfecec371a097b73d605aae665887946d9982219 /src/lib/libcrypto/cast
downloadopenbsd-536c76cbb863bab152f19842ab88772c01e922c7.tar.gz
openbsd-536c76cbb863bab152f19842ab88772c01e922c7.tar.bz2
openbsd-536c76cbb863bab152f19842ab88772c01e922c7.zip
Import of SSLeay-0.9.0b with RSA and IDEA stubbed + OpenBSD build
functionality for shared libs. Note that routines such as sslv2_init and friends that use RSA will not work due to lack of RSA in this library. Needs documentation and help from ports for easy upgrade to full functionality where legally possible.
Diffstat (limited to 'src/lib/libcrypto/cast')
-rw-r--r--src/lib/libcrypto/cast/asm/readme7
-rw-r--r--src/lib/libcrypto/cast/cast_spd.c294
-rw-r--r--src/lib/libcrypto/cast/castopts.c358
-rw-r--r--src/lib/libcrypto/cast/casts.cpp70
-rw-r--r--src/lib/libcrypto/cast/casttest.c223
5 files changed, 952 insertions, 0 deletions
diff --git a/src/lib/libcrypto/cast/asm/readme b/src/lib/libcrypto/cast/asm/readme
new file mode 100644
index 0000000000..fbcd76289e
--- /dev/null
+++ b/src/lib/libcrypto/cast/asm/readme
@@ -0,0 +1,7 @@
1There is a ppro flag in cast-586 which turns on/off
2generation of pentium pro/II friendly code
3
4This flag makes the inner loop one cycle longer, but generates
5code that runs %30 faster on the pentium pro/II, while only %7 slower
6on the pentium. By default, this flag is on.
7
diff --git a/src/lib/libcrypto/cast/cast_spd.c b/src/lib/libcrypto/cast/cast_spd.c
new file mode 100644
index 0000000000..ab75e65386
--- /dev/null
+++ b/src/lib/libcrypto/cast/cast_spd.c
@@ -0,0 +1,294 @@
1/* crypto/cast/cast_spd.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/* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
60/* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
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 int 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 "cast.h"
101
102/* The following if from times(3) man page. It may need to be changed */
103#ifndef HZ
104#ifndef CLK_TCK
105#ifndef VMS
106#define HZ 100.0
107#else /* VMS */
108#define HZ 100.0
109#endif
110#else /* CLK_TCK */
111#define HZ ((double)CLK_TCK)
112#endif
113#endif
114
115#define BUFSIZE ((long)1024)
116long run=0;
117
118#ifndef NOPROTO
119double Time_F(int s);
120#else
121double Time_F();
122#endif
123
124#ifdef SIGALRM
125#if defined(__STDC__) || defined(sgi) || defined(_AIX)
126#define SIGRETTYPE void
127#else
128#define SIGRETTYPE int
129#endif
130
131#ifndef NOPROTO
132SIGRETTYPE sig_done(int sig);
133#else
134SIGRETTYPE sig_done();
135#endif
136
137SIGRETTYPE sig_done(sig)
138int sig;
139 {
140 signal(SIGALRM,sig_done);
141 run=0;
142#ifdef LINT
143 sig=sig;
144#endif
145 }
146#endif
147
148#define START 0
149#define STOP 1
150
151double Time_F(s)
152int s;
153 {
154 double ret;
155#ifdef TIMES
156 static struct tms tstart,tend;
157
158 if (s == START)
159 {
160 times(&tstart);
161 return(0);
162 }
163 else
164 {
165 times(&tend);
166 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
167 return((ret == 0.0)?1e-6:ret);
168 }
169#else /* !times() */
170 static struct timeb tstart,tend;
171 long i;
172
173 if (s == START)
174 {
175 ftime(&tstart);
176 return(0);
177 }
178 else
179 {
180 ftime(&tend);
181 i=(long)tend.millitm-(long)tstart.millitm;
182 ret=((double)(tend.time-tstart.time))+((double)i)/1e3;
183 return((ret == 0.0)?1e-6:ret);
184 }
185#endif
186 }
187
188int main(argc,argv)
189int argc;
190char **argv;
191 {
192 long count;
193 static unsigned char buf[BUFSIZE];
194 static unsigned char key[] ={
195 0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
196 0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,
197 };
198 CAST_KEY sch;
199 double a,b,c,d;
200#ifndef SIGALRM
201 long ca,cb,cc;
202#endif
203
204#ifndef TIMES
205 printf("To get the most acurate results, try to run this\n");
206 printf("program when this computer is idle.\n");
207#endif
208
209#ifndef SIGALRM
210 printf("First we calculate the approximate speed ...\n");
211 CAST_set_key(&sch,16,key);
212 count=10;
213 do {
214 long i;
215 CAST_LONG data[2];
216
217 count*=2;
218 Time_F(START);
219 for (i=count; i; i--)
220 CAST_encrypt(data,&sch);
221 d=Time_F(STOP);
222 } while (d < 3.0);
223 ca=count/512;
224 cb=count;
225 cc=count*8/BUFSIZE+1;
226 printf("Doing CAST_set_key %ld times\n",ca);
227#define COND(d) (count != (d))
228#define COUNT(d) (d)
229#else
230#define COND(c) (run)
231#define COUNT(d) (count)
232 signal(SIGALRM,sig_done);
233 printf("Doing CAST_set_key for 10 seconds\n");
234 alarm(10);
235#endif
236
237 Time_F(START);
238 for (count=0,run=1; COND(ca); count+=4)
239 {
240 CAST_set_key(&sch,16,key);
241 CAST_set_key(&sch,16,key);
242 CAST_set_key(&sch,16,key);
243 CAST_set_key(&sch,16,key);
244 }
245 d=Time_F(STOP);
246 printf("%ld cast set_key's in %.2f seconds\n",count,d);
247 a=((double)COUNT(ca))/d;
248
249#ifdef SIGALRM
250 printf("Doing CAST_encrypt's for 10 seconds\n");
251 alarm(10);
252#else
253 printf("Doing CAST_encrypt %ld times\n",cb);
254#endif
255 Time_F(START);
256 for (count=0,run=1; COND(cb); count+=4)
257 {
258 CAST_LONG data[2];
259
260 CAST_encrypt(data,&sch);
261 CAST_encrypt(data,&sch);
262 CAST_encrypt(data,&sch);
263 CAST_encrypt(data,&sch);
264 }
265 d=Time_F(STOP);
266 printf("%ld CAST_encrypt's in %.2f second\n",count,d);
267 b=((double)COUNT(cb)*8)/d;
268
269#ifdef SIGALRM
270 printf("Doing CAST_cbc_encrypt on %ld byte blocks for 10 seconds\n",
271 BUFSIZE);
272 alarm(10);
273#else
274 printf("Doing CAST_cbc_encrypt %ld times on %ld byte blocks\n",cc,
275 BUFSIZE);
276#endif
277 Time_F(START);
278 for (count=0,run=1; COND(cc); count++)
279 CAST_cbc_encrypt(buf,buf,BUFSIZE,&sch,
280 &(key[0]),CAST_ENCRYPT);
281 d=Time_F(STOP);
282 printf("%ld CAST_cbc_encrypt's of %ld byte blocks in %.2f second\n",
283 count,BUFSIZE,d);
284 c=((double)COUNT(cc)*BUFSIZE)/d;
285
286 printf("CAST set_key per sec = %12.2f (%9.3fuS)\n",a,1.0e6/a);
287 printf("CAST raw ecb bytes per sec = %12.2f (%9.3fuS)\n",b,8.0e6/b);
288 printf("CAST cbc bytes per sec = %12.2f (%9.3fuS)\n",c,8.0e6/c);
289 exit(0);
290#if defined(LINT) || defined(MSDOS)
291 return(0);
292#endif
293 }
294
diff --git a/src/lib/libcrypto/cast/castopts.c b/src/lib/libcrypto/cast/castopts.c
new file mode 100644
index 0000000000..68cf5a4a60
--- /dev/null
+++ b/src/lib/libcrypto/cast/castopts.c
@@ -0,0 +1,358 @@
1/* crypto/cast/castopts.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#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 "cast.h"
101
102#define CAST_DEFAULT_OPTIONS
103
104#undef E_CAST
105#define CAST_encrypt CAST_encrypt_normal
106#define CAST_decrypt CAST_decrypt_normal
107#define CAST_cbc_encrypt CAST_cbc_encrypt_normal
108#undef HEADER_CAST_LOCL_H
109#include "c_enc.c"
110
111#define CAST_PTR
112#undef CAST_PTR2
113#undef E_CAST
114#undef CAST_encrypt
115#undef CAST_decrypt
116#undef CAST_cbc_encrypt
117#define CAST_encrypt CAST_encrypt_ptr
118#define CAST_decrypt CAST_decrypt_ptr
119#define CAST_cbc_encrypt CAST_cbc_encrypt_ptr
120#undef HEADER_CAST_LOCL_H
121#include "c_enc.c"
122
123#undef CAST_PTR
124#define CAST_PTR2
125#undef E_CAST
126#undef CAST_encrypt
127#undef CAST_decrypt
128#undef CAST_cbc_encrypt
129#define CAST_encrypt CAST_encrypt_ptr2
130#define CAST_decrypt CAST_decrypt_ptr2
131#define CAST_cbc_encrypt CAST_cbc_encrypt_ptr2
132#undef HEADER_CAST_LOCL_H
133#include "c_enc.c"
134
135/* The following if from times(3) man page. It may need to be changed */
136#ifndef HZ
137# ifndef CLK_TCK
138# ifndef _BSD_CLK_TCK_ /* FreeBSD fix */
139# ifndef VMS
140# define HZ 100.0
141# else /* VMS */
142# define HZ 100.0
143# endif
144# else /* _BSD_CLK_TCK_ */
145# define HZ ((double)_BSD_CLK_TCK_)
146# endif
147# else /* CLK_TCK */
148# define HZ ((double)CLK_TCK)
149# endif
150#endif
151
152#define BUFSIZE ((long)1024)
153long run=0;
154
155#ifndef NOPROTO
156double Time_F(int s);
157#else
158double Time_F();
159#endif
160
161#ifdef SIGALRM
162#if defined(__STDC__) || defined(sgi)
163#define SIGRETTYPE void
164#else
165#define SIGRETTYPE int
166#endif
167
168#ifndef NOPROTO
169SIGRETTYPE sig_done(int sig);
170#else
171SIGRETTYPE sig_done();
172#endif
173
174SIGRETTYPE sig_done(sig)
175int sig;
176 {
177 signal(SIGALRM,sig_done);
178 run=0;
179#ifdef LINT
180 sig=sig;
181#endif
182 }
183#endif
184
185#define START 0
186#define STOP 1
187
188double Time_F(s)
189int s;
190 {
191 double ret;
192#ifdef TIMES
193 static struct tms tstart,tend;
194
195 if (s == START)
196 {
197 times(&tstart);
198 return(0);
199 }
200 else
201 {
202 times(&tend);
203 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
204 return((ret == 0.0)?1e-6:ret);
205 }
206#else /* !times() */
207 static struct timeb tstart,tend;
208 long i;
209
210 if (s == START)
211 {
212 ftime(&tstart);
213 return(0);
214 }
215 else
216 {
217 ftime(&tend);
218 i=(long)tend.millitm-(long)tstart.millitm;
219 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
220 return((ret == 0.0)?1e-6:ret);
221 }
222#endif
223 }
224
225#ifdef SIGALRM
226#define print_name(name) fprintf(stderr,"Doing %s's for 10 seconds\n",name); alarm(10);
227#else
228#define print_name(name) fprintf(stderr,"Doing %s %ld times\n",name,cb);
229#endif
230
231#define time_it(func,name,index) \
232 print_name(name); \
233 Time_F(START); \
234 for (count=0,run=1; COND(cb); count+=4) \
235 { \
236 unsigned long d[2]; \
237 func(d,&sch); \
238 func(d,&sch); \
239 func(d,&sch); \
240 func(d,&sch); \
241 } \
242 tm[index]=Time_F(STOP); \
243 fprintf(stderr,"%ld %s's in %.2f second\n",count,name,tm[index]); \
244 tm[index]=((double)COUNT(cb))/tm[index];
245
246#define print_it(name,index) \
247 fprintf(stderr,"%s bytes per sec = %12.2f (%5.1fuS)\n",name, \
248 tm[index]*8,1.0e6/tm[index]);
249
250int main(argc,argv)
251int argc;
252char **argv;
253 {
254 long count;
255 static unsigned char buf[BUFSIZE];
256 static char key[16]={ 0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
257 0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
258 CAST_KEY sch;
259 double d,tm[16],max=0;
260 int rank[16];
261 char *str[16];
262 int max_idx=0,i,num=0,j;
263#ifndef SIGALARM
264 long ca,cb,cc,cd,ce;
265#endif
266
267 for (i=0; i<12; i++)
268 {
269 tm[i]=0.0;
270 rank[i]=0;
271 }
272
273#ifndef TIMES
274 fprintf(stderr,"To get the most acurate results, try to run this\n");
275 fprintf(stderr,"program when this computer is idle.\n");
276#endif
277
278 CAST_set_key(&sch,16,key);
279
280#ifndef SIGALRM
281 fprintf(stderr,"First we calculate the approximate speed ...\n");
282 count=10;
283 do {
284 long i;
285 unsigned long data[2];
286
287 count*=2;
288 Time_F(START);
289 for (i=count; i; i--)
290 CAST_encrypt(data,&sch);
291 d=Time_F(STOP);
292 } while (d < 3.0);
293 ca=count;
294 cb=count*3;
295 cc=count*3*8/BUFSIZE+1;
296 cd=count*8/BUFSIZE+1;
297
298 ce=count/20+1;
299#define COND(d) (count != (d))
300#define COUNT(d) (d)
301#else
302#define COND(c) (run)
303#define COUNT(d) (count)
304 signal(SIGALRM,sig_done);
305 alarm(10);
306#endif
307
308 time_it(CAST_encrypt_normal, "CAST_encrypt_normal ", 0);
309 time_it(CAST_encrypt_ptr, "CAST_encrypt_ptr ", 1);
310 time_it(CAST_encrypt_ptr2, "CAST_encrypt_ptr2 ", 2);
311 num+=3;
312
313 str[0]="<nothing>";
314 print_it("CAST_encrypt_normal ",0);
315 max=tm[0];
316 max_idx=0;
317 str[1]="ptr ";
318 print_it("CAST_encrypt_ptr ",1);
319 if (max < tm[1]) { max=tm[1]; max_idx=1; }
320 str[2]="ptr2 ";
321 print_it("CAST_encrypt_ptr2 ",2);
322 if (max < tm[2]) { max=tm[2]; max_idx=2; }
323
324 printf("options CAST ecb/s\n");
325 printf("%s %12.2f 100.0%%\n",str[max_idx],tm[max_idx]);
326 d=tm[max_idx];
327 tm[max_idx]= -2.0;
328 max= -1.0;
329 for (;;)
330 {
331 for (i=0; i<3; i++)
332 {
333 if (max < tm[i]) { max=tm[i]; j=i; }
334 }
335 if (max < 0.0) break;
336 printf("%s %12.2f %4.1f%%\n",str[j],tm[j],tm[j]/d*100.0);
337 tm[j]= -2.0;
338 max= -1.0;
339 }
340
341 switch (max_idx)
342 {
343 case 0:
344 printf("-DCAST_DEFAULT_OPTIONS\n");
345 break;
346 case 1:
347 printf("-DCAST_PTR\n");
348 break;
349 case 2:
350 printf("-DCAST_PTR2\n");
351 break;
352 }
353 exit(0);
354#if defined(LINT) || defined(MSDOS)
355 return(0);
356#endif
357 }
358
diff --git a/src/lib/libcrypto/cast/casts.cpp b/src/lib/libcrypto/cast/casts.cpp
new file mode 100644
index 0000000000..bac7be2c9c
--- /dev/null
+++ b/src/lib/libcrypto/cast/casts.cpp
@@ -0,0 +1,70 @@
1//
2// gettsc.inl
3//
4// gives access to the Pentium's (secret) cycle counter
5//
6// This software was written by Leonard Janke (janke@unixg.ubc.ca)
7// in 1996-7 and is entered, by him, into the public domain.
8
9#if defined(__WATCOMC__)
10void GetTSC(unsigned long&);
11#pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax];
12#elif defined(__GNUC__)
13inline
14void GetTSC(unsigned long& tsc)
15{
16 asm volatile(".byte 15, 49\n\t"
17 : "=eax" (tsc)
18 :
19 : "%edx", "%eax");
20}
21#elif defined(_MSC_VER)
22inline
23void GetTSC(unsigned long& tsc)
24{
25 unsigned long a;
26 __asm _emit 0fh
27 __asm _emit 31h
28 __asm mov a, eax;
29 tsc=a;
30}
31#endif
32
33#include <stdio.h>
34#include <stdlib.h>
35#include "cast.h"
36
37void main(int argc,char *argv[])
38 {
39 CAST_KEY key;
40 unsigned long s1,s2,e1,e2;
41 unsigned long data[2];
42 int i,j;
43 static unsigned char d[16]={0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF};
44
45 CAST_set_key(&key, 16,d);
46
47 for (j=0; j<6; j++)
48 {
49 for (i=0; i<1000; i++) /**/
50 {
51 CAST_encrypt(&data[0],&key);
52 GetTSC(s1);
53 CAST_encrypt(&data[0],&key);
54 CAST_encrypt(&data[0],&key);
55 CAST_encrypt(&data[0],&key);
56 GetTSC(e1);
57 GetTSC(s2);
58 CAST_encrypt(&data[0],&key);
59 CAST_encrypt(&data[0],&key);
60 CAST_encrypt(&data[0],&key);
61 CAST_encrypt(&data[0],&key);
62 GetTSC(e2);
63 CAST_encrypt(&data[0],&key);
64 }
65
66 printf("cast %d %d (%d)\n",
67 e1-s1,e2-s2,((e2-s2)-(e1-s1)));
68 }
69 }
70
diff --git a/src/lib/libcrypto/cast/casttest.c b/src/lib/libcrypto/cast/casttest.c
new file mode 100644
index 0000000000..8b009bc249
--- /dev/null
+++ b/src/lib/libcrypto/cast/casttest.c
@@ -0,0 +1,223 @@
1/* crypto/cast/casttest.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#include <stdio.h>
60#include <string.h>
61#include <stdlib.h>
62#include "cast.h"
63
64/* #define FULL_TEST */
65
66unsigned char k[16]={
67 0x01,0x23,0x45,0x67,0x12,0x34,0x56,0x78,
68 0x23,0x45,0x67,0x89,0x34,0x56,0x78,0x9A
69 };
70
71unsigned char in[8]={ 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF};
72
73int k_len[3]={16,10};
74unsigned char c[3][8]={
75 {0x23,0x8B,0x4F,0xE5,0x84,0x7E,0x44,0xB2},
76 {0xEB,0x6A,0x71,0x1A,0x2C,0x02,0x27,0x1B},
77 {0x7A,0xC8,0x16,0xD1,0x6E,0x9B,0x30,0x2E},
78 };
79unsigned char out[80];
80
81unsigned char in_a[16]={
82 0x01,0x23,0x45,0x67,0x12,0x34,0x56,0x78,
83 0x23,0x45,0x67,0x89,0x34,0x56,0x78,0x9A};
84unsigned char in_b[16]={
85 0x01,0x23,0x45,0x67,0x12,0x34,0x56,0x78,
86 0x23,0x45,0x67,0x89,0x34,0x56,0x78,0x9A};
87
88unsigned char c_a[16]={
89 0xEE,0xA9,0xD0,0xA2,0x49,0xFD,0x3B,0xA6,
90 0xB3,0x43,0x6F,0xB8,0x9D,0x6D,0xCA,0x92};
91unsigned char c_b[16]={
92 0xB2,0xC9,0x5E,0xB0,0x0C,0x31,0xAD,0x71,
93 0x80,0xAC,0x05,0xB8,0xE8,0x3D,0x69,0x6E};
94
95#if 0
96char *text="Hello to all people out there";
97
98static unsigned char cfb_key[16]={
99 0xe1,0xf0,0xc3,0xd2,0xa5,0xb4,0x87,0x96,
100 0x69,0x78,0x4b,0x5a,0x2d,0x3c,0x0f,0x1e,
101 };
102static unsigned char cfb_iv[80]={0x34,0x12,0x78,0x56,0xab,0x90,0xef,0xcd};
103static unsigned char cfb_buf1[40],cfb_buf2[40],cfb_tmp[8];
104#define CFB_TEST_SIZE 24
105static unsigned char plain[CFB_TEST_SIZE]=
106 {
107 0x4e,0x6f,0x77,0x20,0x69,0x73,
108 0x20,0x74,0x68,0x65,0x20,0x74,
109 0x69,0x6d,0x65,0x20,0x66,0x6f,
110 0x72,0x20,0x61,0x6c,0x6c,0x20
111 };
112static unsigned char cfb_cipher64[CFB_TEST_SIZE]={
113 0x59,0xD8,0xE2,0x65,0x00,0x58,0x6C,0x3F,
114 0x2C,0x17,0x25,0xD0,0x1A,0x38,0xB7,0x2A,
115 0x39,0x61,0x37,0xDC,0x79,0xFB,0x9F,0x45
116
117/* 0xF9,0x78,0x32,0xB5,0x42,0x1A,0x6B,0x38,
118 0x9A,0x44,0xD6,0x04,0x19,0x43,0xC4,0xD9,
119 0x3D,0x1E,0xAE,0x47,0xFC,0xCF,0x29,0x0B,*/
120 };
121#endif
122
123int main(argc,argv)
124int argc;
125char *argv[];
126 {
127#ifdef FULL_TEST
128 long l;
129 CAST_KEY key_b;
130#endif
131 int i,z,err=0;
132 CAST_KEY key;
133
134 for (z=0; z<1; z++)
135 {
136 CAST_set_key(&key,k_len[z],k);
137
138 CAST_ecb_encrypt(in,out,&key,CAST_ENCRYPT);
139 if (memcmp(out,&(c[z][0]),8) != 0)
140 {
141 printf("ecb cast error encrypting\n");
142 printf("got :");
143 for (i=0; i<8; i++)
144 printf("%02X ",out[i]);
145 printf("\n");
146 printf("expected:");
147 for (i=0; i<8; i++)
148 printf("%02X ",c[z][i]);
149 err=20;
150 printf("\n");
151 }
152
153 CAST_ecb_encrypt(out,out,&key,CAST_DECRYPT);
154 if (memcmp(out,in,8) != 0)
155 {
156 printf("ecb cast error decrypting\n");
157 printf("got :");
158 for (i=0; i<8; i++)
159 printf("%02X ",out[i]);
160 printf("\n");
161 printf("expected:");
162 for (i=0; i<8; i++)
163 printf("%02X ",in[i]);
164 printf("\n");
165 err=3;
166 }
167 }
168 if (err == 0) printf("ecb cast5 ok\n");
169
170#ifdef FULL_TEST
171 {
172 unsigned char out_a[16],out_b[16];
173 static char *hex="0123456789ABCDEF";
174
175 printf("This test will take some time....");
176 fflush(stdout);
177 memcpy(out_a,in_a,sizeof(in_a));
178 memcpy(out_b,in_b,sizeof(in_b));
179 i=1;
180
181 for (l=0; l<1000000L; l++)
182 {
183 CAST_set_key(&key_b,16,out_b);
184 CAST_ecb_encrypt(&(out_a[0]),&(out_a[0]),&key_b,CAST_ENCRYPT);
185 CAST_ecb_encrypt(&(out_a[8]),&(out_a[8]),&key_b,CAST_ENCRYPT);
186 CAST_set_key(&key,16,out_a);
187 CAST_ecb_encrypt(&(out_b[0]),&(out_b[0]),&key,CAST_ENCRYPT);
188 CAST_ecb_encrypt(&(out_b[8]),&(out_b[8]),&key,CAST_ENCRYPT);
189 if ((l & 0xffff) == 0xffff)
190 {
191 printf("%c",hex[i&0x0f]);
192 fflush(stdout);
193 i++;
194 }
195 }
196
197 if ( (memcmp(out_a,c_a,sizeof(c_a)) != 0) ||
198 (memcmp(out_b,c_b,sizeof(c_b)) != 0))
199 {
200 printf("\n");
201 printf("Error\n");
202
203 printf("A out =");
204 for (i=0; i<16; i++) printf("%02X ",out_a[i]);
205 printf("\nactual=");
206 for (i=0; i<16; i++) printf("%02X ",c_a[i]);
207 printf("\n");
208
209 printf("B out =");
210 for (i=0; i<16; i++) printf("%02X ",out_b[i]);
211 printf("\nactual=");
212 for (i=0; i<16; i++) printf("%02X ",c_b[i]);
213 printf("\n");
214 }
215 else
216 printf(" ok\n");
217 }
218#endif
219
220 exit(err);
221 return(err);
222 }
223