summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/cast
diff options
context:
space:
mode:
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