/* apps/speed.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ /* most of this code has been pilfered from my libdes speed.c program */ #undef SECONDS #define SECONDS 3 #define RSA_SECONDS 10 #define DSA_SECONDS 10 /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */ /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */ #undef PROG #define PROG speed_main #include #include #include #include #include #include "apps.h" #ifdef NO_STDIO #define APPS_WIN16 #endif #include "crypto.h" #include "rand.h" #include "err.h" #ifndef MSDOS #define TIMES #endif #ifndef VMS #ifndef _IRIX #include #endif #ifdef TIMES #include #include #endif #else /* VMS */ #include struct tms { time_t tms_utime; time_t tms_stime; time_t tms_uchild; /* I dunno... */ time_t tms_uchildsys; /* so these names are a guess :-) */ } #endif #ifndef TIMES #include #endif #if defined(sun) || defined(__ultrix) #define _POSIX_SOURCE #include #include #endif #ifndef NO_DES #include "des.h" #endif #ifndef NO_MD2 #include "md2.h" #endif #ifndef NO_MDC2 #include "mdc2.h" #endif #ifndef NO_MD5 #include "md5.h" #include "hmac.h" #include "evp.h" #endif #ifndef NO_SHA1 #include "sha.h" #endif #ifndef NO_RMD160 #include "ripemd.h" #endif #ifndef NO_RC4 #include "rc4.h" #endif #ifndef NO_RC5 #include "rc5.h" #endif #ifndef NO_RC2 #include "rc2.h" #endif #ifndef NO_IDEA #include "idea.h" #endif #ifndef NO_BLOWFISH #include "blowfish.h" #endif #ifndef NO_CAST #include "cast.h" #endif #ifndef NO_RSA #include "rsa.h" #endif #include "x509.h" #include "./testrsa.h" #ifndef NO_DSA #include "./testdsa.h" #endif /* The following if from times(3) man page. It may need to be changed */ #ifndef HZ # ifndef CLK_TCK # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */ # ifndef VMS # define HZ 100.0 # else /* VMS */ # define HZ 100.0 # endif # else /* _BSD_CLK_TCK_ */ # define HZ ((double)_BSD_CLK_TCK_) # endif # else /* CLK_TCK */ # define HZ ((double)CLK_TCK) # endif #endif #undef BUFSIZE #define BUFSIZE ((long)1024*8+1) int run=0; #ifndef NOPROTO static double Time_F(int s); static void print_message(char *s,long num,int length); static void pkey_print_message(char *str,char *str2,long num,int bits,int sec); #else static double Time_F(); static void print_message(); static void pkey_print_message(); #endif #ifdef SIGALRM #if defined(__STDC__) || defined(sgi) || defined(_AIX) #define SIGRETTYPE void #else #define SIGRETTYPE int #endif #ifndef NOPROTO static SIGRETTYPE sig_done(int sig); #else static SIGRETTYPE sig_done(); #endif static SIGRETTYPE sig_done(sig) int sig; { signal(SIGALRM,sig_done); run=0; #ifdef LINT sig=sig; #endif } #endif #define START 0 #define STOP 1 static double Time_F(s) int s; { double ret; #ifdef TIMES static struct tms tstart,tend; if (s == START) { times(&tstart); return(0); } else { times(&tend); ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ; return((ret < 1e-3)?1e-3:ret); } #else /* !times() */ static struct timeb tstart,tend; long i; if (s == START) { ftime(&tstart); return(0); } else { ftime(&tend); i=(long)tend.millitm-(long)tstart.millitm; ret=((double)(tend.time-tstart.time))+((double)i)/1000.0; return((ret < 0.001)?0.001:ret); } #endif } int MAIN(argc,argv) int argc; char **argv; { unsigned char *buf=NULL,*buf2=NULL; int ret=1; #define ALGOR_NUM 14 #define SIZE_NUM 5 #define RSA_NUM 4 #define DSA_NUM 3 long count,rsa_count; int i,j,k,rsa_num,rsa_num2; #ifndef NO_MD2 unsigned char md2[MD2_DIGEST_LENGTH]; #endif #ifndef NO_MDC2 unsigned char mdc2[MDC2_DIGEST_LENGTH]; #endif #ifndef NO_MD5 unsigned char md5[MD5_DIGEST_LENGTH]; unsigned char hmac[MD5_DIGEST_LENGTH]; #endif #ifndef NO_SHA1 unsigned char sha[SHA_DIGEST_LENGTH]; #endif #ifndef NO_RMD160 unsigned char rmd160[RIPEMD160_DIGEST_LENGTH]; #endif #ifndef NO_RC4 RC4_KEY rc4_ks; #endif #ifndef NO_RC5 RC5_32_KEY rc5_ks; #endif #ifndef NO_RC2 RC2_KEY rc2_ks; #endif #ifndef NO_IDEA IDEA_KEY_SCHEDULE idea_ks; #endif #ifndef NO_BLOWFISH BF_KEY bf_ks; #endif #ifndef NO_CAST CAST_KEY cast_ks; #endif static unsigned char key16[16]= {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0, 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12}; unsigned char iv[8]; #ifndef NO_DES static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}; static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12}; static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34}; des_key_schedule sch,sch2,sch3; #endif #define D_MD2 0 #define D_MDC2 1 #define D_MD5 2 #define D_HMAC 3 #define D_SHA1 4 #define D_RMD160 5 #define D_RC4 6 #define D_CBC_DES 7 #define D_EDE3_DES 8 #define D_CBC_IDEA 9 #define D_CBC_RC2 10 #define D_CBC_RC5 11 #define D_CBC_BF 12 #define D_CBC_CAST 13 double d,results[ALGOR_NUM][SIZE_NUM]; static int lengths[SIZE_NUM]={8,64,256,1024,8*1024}; long c[ALGOR_NUM][SIZE_NUM]; static char *names[ALGOR_NUM]={ "md2","mdc2","md5","hmac(md5)","sha1","rmd160","rc4", "des cbc","des ede3","idea cbc", "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"}; #define R_DSA_512 0 #define R_DSA_1024 1 #define R_DSA_2048 2 #define R_RSA_512 0 #define R_RSA_1024 1 #define R_RSA_2048 2 #define R_RSA_4096 3 RSA *rsa_key[RSA_NUM]; long rsa_c[RSA_NUM][2]; #ifndef NO_RSA double rsa_results[RSA_NUM][2]; static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096}; static unsigned char *rsa_data[RSA_NUM]= {test512,test1024,test2048,test4096}; static int rsa_data_length[RSA_NUM]={ sizeof(test512),sizeof(test1024), sizeof(test2048),sizeof(test4096)}; #endif #ifndef NO_DSA DSA *dsa_key[DSA_NUM]; long dsa_c[DSA_NUM][2]; double dsa_results[DSA_NUM][2]; static unsigned int dsa_bits[DSA_NUM]={512,1024,2048}; #endif int rsa_doit[RSA_NUM]; int dsa_doit[DSA_NUM]; int doit[ALGOR_NUM]; int pr_header=0; apps_startup(); #ifdef NO_DSA memset(dsa_key,0,sizeof(dsa_key)); #endif if (bio_err == NULL) if ((bio_err=BIO_new(BIO_s_file())) != NULL) BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); #ifndef NO_RSA memset(rsa_key,0,sizeof(rsa_key)); for (i=0; in)); BN_print(bio_err,rsa_key[i]->e); BIO_printf(bio_err,"\n"); } #endif } #endif #ifndef NO_DSA dsa_key[0]=get_dsa512(); dsa_key[1]=get_dsa1024(); dsa_key[2]=get_dsa2048(); #endif #ifndef NO_DES des_set_key(key,sch); des_set_key(key2,sch2); des_set_key(key3,sch3); #endif #ifndef NO_IDEA idea_set_encrypt_key(key16,&idea_ks); #endif #ifndef NO_RC4 RC4_set_key(&rc4_ks,16,key16); #endif #ifndef NO_RC2 RC2_set_key(&rc2_ks,16,key16,128); #endif #ifndef NO_RC5 RC5_32_set_key(&rc5_ks,16,key16,12); #endif #ifndef NO_BLOWFISH BF_set_key(&bf_ks,16,key16); #endif #ifndef NO_CAST CAST_set_key(&cast_ks,16,key16); #endif memset(rsa_c,0,sizeof(rsa_c)); #ifndef SIGALRM BIO_printf(bio_err,"First we calculate the approximate speed ...\n"); count=10; do { long i; count*=2; Time_F(START); for (i=count; i; i--) des_ecb_encrypt((C_Block *)buf,(C_Block *)buf, &(sch[0]),DES_ENCRYPT); d=Time_F(STOP); } while (d <3); c[D_MD2][0]=count/10; c[D_MDC2][0]=count/10; c[D_MD5][0]=count; c[D_HMAC][0]=count; c[D_SHA1][0]=count; c[D_RMD160][0]=count; c[D_RC4][0]=count*5; c[D_CBC_DES][0]=count; c[D_EDE3_DES][0]=count/3; c[D_CBC_IDEA][0]=count; c[D_CBC_RC2][0]=count; c[D_CBC_RC5][0]=count; c[D_CBC_BF][0]=count; c[D_CBC_CAST][0]=count; for (i=1; i 10000) fprintf(stdout," %11.2fk",results[k][j]/1e3); else fprintf(stdout," %11.2f ",results[k][j]); } fprintf(stdout,"\n"); } #ifndef NO_RSA j=1; for (k=0; k