~etc-pgh-launchpad/wildpockets/trunk

« back to all changes in this revision

Viewing changes to openssl-src/crypto/rc4/rc4speed.c

  • Committer: etc-pgh-launchpad at cmu
  • Date: 2010-11-30 20:56:30 UTC
  • Revision ID: etc-pgh-launchpad@lists.andrew.cmu.edu-20101130205630-0blbkcz28ovjl8wj
Committing the Wild Pockets code base to Launchpad.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* crypto/rc4/rc4speed.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
#if !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX)
 
63
#define TIMES
 
64
#endif
 
65
 
 
66
#include <stdio.h>
 
67
 
 
68
#include <openssl/e_os2.h>
 
69
#include OPENSSL_UNISTD_IO
 
70
OPENSSL_DECLARE_EXIT
 
71
 
 
72
#ifndef OPENSSL_SYS_NETWARE
 
73
#include <signal.h>
 
74
#endif
 
75
 
 
76
#ifndef _IRIX
 
77
#include <time.h>
 
78
#endif
 
79
#ifdef TIMES
 
80
#include <sys/types.h>
 
81
#include <sys/times.h>
 
82
#endif
 
83
 
 
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 */
 
88
#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
 
89
#undef TIMES
 
90
#endif
 
91
 
 
92
#ifndef TIMES
 
93
#include <sys/timeb.h>
 
94
#endif
 
95
 
 
96
#if defined(sun) || defined(__ultrix)
 
97
#define _POSIX_SOURCE
 
98
#include <limits.h>
 
99
#include <sys/param.h>
 
100
#endif
 
101
 
 
102
#include <openssl/rc4.h>
 
103
 
 
104
/* The following if from times(3) man page.  It may need to be changed */
 
105
#ifndef HZ
 
106
#ifndef CLK_TCK
 
107
#define HZ      100.0
 
108
#else /* CLK_TCK */
 
109
#define HZ ((double)CLK_TCK)
 
110
#endif
 
111
#endif
 
112
 
 
113
#define BUFSIZE ((long)1024)
 
114
long run=0;
 
115
 
 
116
double Time_F(int s);
 
117
#ifdef SIGALRM
 
118
#if defined(__STDC__) || defined(sgi) || defined(_AIX)
 
119
#define SIGRETTYPE void
 
120
#else
 
121
#define SIGRETTYPE int
 
122
#endif
 
123
 
 
124
SIGRETTYPE sig_done(int sig);
 
125
SIGRETTYPE sig_done(int sig)
 
126
        {
 
127
        signal(SIGALRM,sig_done);
 
128
        run=0;
 
129
#ifdef LINT
 
130
        sig=sig;
 
131
#endif
 
132
        }
 
133
#endif
 
134
 
 
135
#define START   0
 
136
#define STOP    1
 
137
 
 
138
double Time_F(int s)
 
139
        {
 
140
        double ret;
 
141
#ifdef TIMES
 
142
        static struct tms tstart,tend;
 
143
 
 
144
        if (s == START)
 
145
                {
 
146
                times(&tstart);
 
147
                return(0);
 
148
                }
 
149
        else
 
150
                {
 
151
                times(&tend);
 
152
                ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
 
153
                return((ret == 0.0)?1e-6:ret);
 
154
                }
 
155
#else /* !times() */
 
156
        static struct timeb tstart,tend;
 
157
        long i;
 
158
 
 
159
        if (s == START)
 
160
                {
 
161
                ftime(&tstart);
 
162
                return(0);
 
163
                }
 
164
        else
 
165
                {
 
166
                ftime(&tend);
 
167
                i=(long)tend.millitm-(long)tstart.millitm;
 
168
                ret=((double)(tend.time-tstart.time))+((double)i)/1e3;
 
169
                return((ret == 0.0)?1e-6:ret);
 
170
                }
 
171
#endif
 
172
        }
 
173
 
 
174
int main(int argc, char **argv)
 
175
        {
 
176
        long count;
 
177
        static unsigned char buf[BUFSIZE];
 
178
        static unsigned char key[] ={
 
179
                        0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
 
180
                        0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,
 
181
                        };
 
182
        RC4_KEY sch;
 
183
        double a,b,c,d;
 
184
#ifndef SIGALRM
 
185
        long ca,cb,cc;
 
186
#endif
 
187
 
 
188
#ifndef TIMES
 
189
        printf("To get the most accurate results, try to run this\n");
 
190
        printf("program when this computer is idle.\n");
 
191
#endif
 
192
 
 
193
#ifndef SIGALRM
 
194
        printf("First we calculate the approximate speed ...\n");
 
195
        RC4_set_key(&sch,16,key);
 
196
        count=10;
 
197
        do      {
 
198
                long i;
 
199
                unsigned long data[2];
 
200
 
 
201
                count*=2;
 
202
                Time_F(START);
 
203
                for (i=count; i; i--)
 
204
                        RC4(&sch,8,buf,buf);
 
205
                d=Time_F(STOP);
 
206
                } while (d < 3.0);
 
207
        ca=count/512;
 
208
        cc=count*8/BUFSIZE+1;
 
209
        printf("Doing RC4_set_key %ld times\n",ca);
 
210
#define COND(d) (count != (d))
 
211
#define COUNT(d) (d)
 
212
#else
 
213
#define COND(c) (run)
 
214
#define COUNT(d) (count)
 
215
        signal(SIGALRM,sig_done);
 
216
        printf("Doing RC4_set_key for 10 seconds\n");
 
217
        alarm(10);
 
218
#endif
 
219
 
 
220
        Time_F(START);
 
221
        for (count=0,run=1; COND(ca); count+=4)
 
222
                {
 
223
                RC4_set_key(&sch,16,key);
 
224
                RC4_set_key(&sch,16,key);
 
225
                RC4_set_key(&sch,16,key);
 
226
                RC4_set_key(&sch,16,key);
 
227
                }
 
228
        d=Time_F(STOP);
 
229
        printf("%ld RC4_set_key's in %.2f seconds\n",count,d);
 
230
        a=((double)COUNT(ca))/d;
 
231
 
 
232
#ifdef SIGALRM
 
233
        printf("Doing RC4 on %ld byte blocks for 10 seconds\n",BUFSIZE);
 
234
        alarm(10);
 
235
#else
 
236
        printf("Doing RC4 %ld times on %ld byte blocks\n",cc,BUFSIZE);
 
237
#endif
 
238
        Time_F(START);
 
239
        for (count=0,run=1; COND(cc); count++)
 
240
                RC4(&sch,BUFSIZE,buf,buf);
 
241
        d=Time_F(STOP);
 
242
        printf("%ld RC4's of %ld byte blocks in %.2f second\n",
 
243
                count,BUFSIZE,d);
 
244
        c=((double)COUNT(cc)*BUFSIZE)/d;
 
245
 
 
246
        printf("RC4 set_key per sec = %12.2f (%9.3fuS)\n",a,1.0e6/a);
 
247
        printf("RC4   bytes per sec = %12.2f (%9.3fuS)\n",c,8.0e6/c);
 
248
        exit(0);
 
249
#if defined(LINT) || defined(OPENSSL_SYS_MSDOS)
 
250
        return(0);
 
251
#endif
 
252
        }
 
253