1 /* crypto/des/speed.c */ 2 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay (at) 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 (at) 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 (at) 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 (at) 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 #define crypt(c,s) (des_crypt((c),(s))) 75 #endif 76 77 #ifndef _IRIX 78 #include <time.h> 79 #endif 80 #ifdef TIMES 81 #include <sys/types.h> 82 #include <sys/times.h> 83 #endif 84 85 /* Depending on the VMS version, the tms structure is perhaps defined. 86 The __TMS macro will show if it was. If it wasn't defined, we should 87 undefine TIMES, since that tells the rest of the program how things 88 should be handled. -- Richard Levitte */ 89 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS) 90 #undef TIMES 91 #endif 92 93 #ifndef TIMES 94 #include <sys/timeb.h> 95 #endif 96 97 #if defined(sun) || defined(__ultrix) 98 #define _POSIX_SOURCE 99 #include <limits.h> 100 #include <sys/param.h> 101 #endif 102 103 #include <openssl/des.h> 104 105 /* The following if from times(3) man page. It may need to be changed */ 106 #ifndef HZ 107 # ifndef CLK_TCK 108 # ifndef _BSD_CLK_TCK_ /* FreeBSD fix */ 109 # define HZ 100.0 110 # else /* _BSD_CLK_TCK_ */ 111 # define HZ ((double)_BSD_CLK_TCK_) 112 # endif 113 # else /* CLK_TCK */ 114 # define HZ ((double)CLK_TCK) 115 # endif 116 #endif 117 118 #define BUFSIZE ((long)1024) 119 long run=0; 120 121 double Time_F(int s); 122 #ifdef SIGALRM 123 #if defined(__STDC__) || defined(sgi) || defined(_AIX) 124 #define SIGRETTYPE void 125 #else 126 #define SIGRETTYPE int 127 #endif 128 129 SIGRETTYPE sig_done(int sig); 130 SIGRETTYPE sig_done(int sig) 131 { 132 signal(SIGALRM,sig_done); 133 run=0; 134 #ifdef LINT 135 sig=sig; 136 #endif 137 } 138 #endif 139 140 #define START 0 141 #define STOP 1 142 143 double Time_F(int s) 144 { 145 double ret; 146 #ifdef TIMES 147 static struct tms tstart,tend; 148 149 if (s == START) 150 { 151 times(&tstart); 152 return(0); 153 } 154 else 155 { 156 times(&tend); 157 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ; 158 return((ret == 0.0)?1e-6:ret); 159 } 160 #else /* !times() */ 161 static struct timeb tstart,tend; 162 long i; 163 164 if (s == START) 165 { 166 ftime(&tstart); 167 return(0); 168 } 169 else 170 { 171 ftime(&tend); 172 i=(long)tend.millitm-(long)tstart.millitm; 173 ret=((double)(tend.time-tstart.time))+((double)i)/1e3; 174 return((ret == 0.0)?1e-6:ret); 175 } 176 #endif 177 } 178 179 int main(int argc, char **argv) 180 { 181 long count; 182 static unsigned char buf[BUFSIZE]; 183 static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}; 184 static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12}; 185 static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34}; 186 DES_key_schedule sch,sch2,sch3; 187 double a,b,c,d,e; 188 #ifndef SIGALRM 189 long ca,cb,cc,cd,ce; 190 #endif 191 192 #ifndef TIMES 193 printf("To get the most accurate results, try to run this\n"); 194 printf("program when this computer is idle.\n"); 195 #endif 196 197 DES_set_key_unchecked(&key2,&sch2); 198 DES_set_key_unchecked(&key3,&sch3); 199 200 #ifndef SIGALRM 201 printf("First we calculate the approximate speed ...\n"); 202 DES_set_key_unchecked(&key,&sch); 203 count=10; 204 do { 205 long i; 206 DES_LONG data[2]; 207 208 count*=2; 209 Time_F(START); 210 for (i=count; i; i--) 211 DES_encrypt1(data,&sch,DES_ENCRYPT); 212 d=Time_F(STOP); 213 } while (d < 3.0); 214 ca=count; 215 cb=count*3; 216 cc=count*3*8/BUFSIZE+1; 217 cd=count*8/BUFSIZE+1; 218 ce=count/20+1; 219 printf("Doing set_key %ld times\n",ca); 220 #define COND(d) (count != (d)) 221 #define COUNT(d) (d) 222 #else 223 #define COND(c) (run) 224 #define COUNT(d) (count) 225 signal(SIGALRM,sig_done); 226 printf("Doing set_key for 10 seconds\n"); 227 alarm(10); 228 #endif 229 230 Time_F(START); 231 for (count=0,run=1; COND(ca); count++) 232 DES_set_key_unchecked(&key,&sch); 233 d=Time_F(STOP); 234 printf("%ld set_key's in %.2f seconds\n",count,d); 235 a=((double)COUNT(ca))/d; 236 237 #ifdef SIGALRM 238 printf("Doing DES_encrypt's for 10 seconds\n"); 239 alarm(10); 240 #else 241 printf("Doing DES_encrypt %ld times\n",cb); 242 #endif 243 Time_F(START); 244 for (count=0,run=1; COND(cb); count++) 245 { 246 DES_LONG data[2]; 247 248 DES_encrypt1(data,&sch,DES_ENCRYPT); 249 } 250 d=Time_F(STOP); 251 printf("%ld DES_encrypt's in %.2f second\n",count,d); 252 b=((double)COUNT(cb)*8)/d; 253 254 #ifdef SIGALRM 255 printf("Doing DES_cbc_encrypt on %ld byte blocks for 10 seconds\n", 256 BUFSIZE); 257 alarm(10); 258 #else 259 printf("Doing DES_cbc_encrypt %ld times on %ld byte blocks\n",cc, 260 BUFSIZE); 261 #endif 262 Time_F(START); 263 for (count=0,run=1; COND(cc); count++) 264 DES_ncbc_encrypt(buf,buf,BUFSIZE,&sch, 265 &key,DES_ENCRYPT); 266 d=Time_F(STOP); 267 printf("%ld DES_cbc_encrypt's of %ld byte blocks in %.2f second\n", 268 count,BUFSIZE,d); 269 c=((double)COUNT(cc)*BUFSIZE)/d; 270 271 #ifdef SIGALRM 272 printf("Doing DES_ede_cbc_encrypt on %ld byte blocks for 10 seconds\n", 273 BUFSIZE); 274 alarm(10); 275 #else 276 printf("Doing DES_ede_cbc_encrypt %ld times on %ld byte blocks\n",cd, 277 BUFSIZE); 278 #endif 279 Time_F(START); 280 for (count=0,run=1; COND(cd); count++) 281 DES_ede3_cbc_encrypt(buf,buf,BUFSIZE, 282 &sch, 283 &sch2, 284 &sch3, 285 &key, 286 DES_ENCRYPT); 287 d=Time_F(STOP); 288 printf("%ld DES_ede_cbc_encrypt's of %ld byte blocks in %.2f second\n", 289 count,BUFSIZE,d); 290 d=((double)COUNT(cd)*BUFSIZE)/d; 291 292 #ifdef SIGALRM 293 printf("Doing crypt for 10 seconds\n"); 294 alarm(10); 295 #else 296 printf("Doing crypt %ld times\n",ce); 297 #endif 298 Time_F(START); 299 for (count=0,run=1; COND(ce); count++) 300 crypt("testing1","ef"); 301 e=Time_F(STOP); 302 printf("%ld crypts in %.2f second\n",count,e); 303 e=((double)COUNT(ce))/e; 304 305 printf("set_key per sec = %12.2f (%9.3fuS)\n",a,1.0e6/a); 306 printf("DES raw ecb bytes per sec = %12.2f (%9.3fuS)\n",b,8.0e6/b); 307 printf("DES cbc bytes per sec = %12.2f (%9.3fuS)\n",c,8.0e6/c); 308 printf("DES ede cbc bytes per sec = %12.2f (%9.3fuS)\n",d,8.0e6/d); 309 printf("crypt per sec = %12.2f (%9.3fuS)\n",e,1.0e6/e); 310 exit(0); 311 #if defined(LINT) || defined(OPENSSL_SYS_MSDOS) 312 return(0); 313 #endif 314 } 315