| Index: openssl/apps/speed.c
|
| ===================================================================
|
| --- openssl/apps/speed.c (revision 105093)
|
| +++ openssl/apps/speed.c (working copy)
|
| @@ -108,55 +108,10 @@
|
| #include <signal.h>
|
| #endif
|
|
|
| -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
|
| -# define USE_TOD
|
| -#elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
|
| -# define TIMES
|
| +#ifdef _WIN32
|
| +#include <windows.h>
|
| #endif
|
| -#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) && !defined(OPENSSL_SYS_VXWORKS) /* FIXME */
|
| -# define TIMEB
|
| -#endif
|
|
|
| -#if defined(OPENSSL_SYS_NETWARE)
|
| -#undef TIMES
|
| -#undef TIMEB
|
| -#include <time.h>
|
| -#endif
|
| -
|
| -#ifndef _IRIX
|
| -# include <time.h>
|
| -#endif
|
| -#ifdef TIMES
|
| -# include <sys/types.h>
|
| -# include <sys/times.h>
|
| -#endif
|
| -#ifdef USE_TOD
|
| -# include <sys/time.h>
|
| -# include <sys/resource.h>
|
| -#endif
|
| -
|
| -/* Depending on the VMS version, the tms structure is perhaps defined.
|
| - The __TMS macro will show if it was. If it wasn't defined, we should
|
| - undefine TIMES, since that tells the rest of the program how things
|
| - should be handled. -- Richard Levitte */
|
| -#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
|
| -#undef TIMES
|
| -#endif
|
| -
|
| -#ifdef TIMEB
|
| -#include <sys/timeb.h>
|
| -#endif
|
| -
|
| -#if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_NETWARE)
|
| -#error "It seems neither struct tms nor struct timeb is supported in this platform!"
|
| -#endif
|
| -
|
| -#if defined(sun) || defined(__ultrix)
|
| -#define _POSIX_SOURCE
|
| -#include <limits.h>
|
| -#include <sys/param.h>
|
| -#endif
|
| -
|
| #include <openssl/bn.h>
|
| #ifndef OPENSSL_NO_DES
|
| #include <openssl/des.h>
|
| @@ -189,6 +144,9 @@
|
| #ifndef OPENSSL_NO_RIPEMD
|
| #include <openssl/ripemd.h>
|
| #endif
|
| +#ifndef OPENSSL_NO_WHIRLPOOL
|
| +#include <openssl/whrlpool.h>
|
| +#endif
|
| #ifndef OPENSSL_NO_RC4
|
| #include <openssl/rc4.h>
|
| #endif
|
| @@ -226,34 +184,6 @@
|
| #include <openssl/ecdh.h>
|
| #endif
|
|
|
| -/*
|
| - * The following "HZ" timing stuff should be sync'd up with the code in
|
| - * crypto/tmdiff.[ch]. That appears to try to do the same job, though I think
|
| - * this code is more up to date than libcrypto's so there may be features to
|
| - * migrate over first. This is used in two places further down AFAICS.
|
| - * The point is that nothing in openssl actually *uses* that tmdiff stuff, so
|
| - * either speed.c should be using it or it should go because it's obviously not
|
| - * useful enough. Anyone want to do a janitorial job on this?
|
| - */
|
| -
|
| -/* The following if from times(3) man page. It may need to be changed */
|
| -#ifndef HZ
|
| -# if defined(_SC_CLK_TCK) \
|
| - && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
|
| -# define HZ sysconf(_SC_CLK_TCK)
|
| -# else
|
| -# ifndef CLK_TCK
|
| -# ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
|
| -# define HZ 100.0
|
| -# else /* _BSD_CLK_TCK_ */
|
| -# define HZ ((double)_BSD_CLK_TCK_)
|
| -# endif
|
| -# else /* CLK_TCK */
|
| -# define HZ ((double)CLK_TCK)
|
| -# endif
|
| -# endif
|
| -#endif
|
| -
|
| #ifndef HAVE_FORK
|
| # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE)
|
| # define HAVE_FORK 0
|
| @@ -263,16 +193,15 @@
|
| #endif
|
|
|
| #if HAVE_FORK
|
| -# undef NO_FORK
|
| +#undef NO_FORK
|
| #else
|
| -# define NO_FORK
|
| +#define NO_FORK
|
| #endif
|
|
|
| #undef BUFSIZE
|
| #define BUFSIZE ((long)1024*8+1)
|
| int run=0;
|
|
|
| -static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
|
| static int mr=0;
|
| static int usertime=1;
|
|
|
| @@ -285,7 +214,7 @@
|
| static int do_multi(int multi);
|
| #endif
|
|
|
| -#define ALGOR_NUM 28
|
| +#define ALGOR_NUM 29
|
| #define SIZE_NUM 5
|
| #define RSA_NUM 4
|
| #define DSA_NUM 3
|
| @@ -299,7 +228,7 @@
|
| "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc",
|
| "aes-128 cbc","aes-192 cbc","aes-256 cbc",
|
| "camellia-128 cbc","camellia-192 cbc","camellia-256 cbc",
|
| - "evp","sha256","sha512",
|
| + "evp","sha256","sha512","whirlpool",
|
| "aes-128 ige","aes-192 ige","aes-256 ige"};
|
| static double results[ALGOR_NUM][SIZE_NUM];
|
| static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
|
| @@ -342,141 +271,46 @@
|
| #define START 0
|
| #define STOP 1
|
|
|
| -#if defined(OPENSSL_SYS_NETWARE)
|
| +#if defined(_WIN32)
|
|
|
| - /* for NetWare the best we can do is use clock() which returns the
|
| - * time, in hundredths of a second, since the NLM began executing
|
| - */
|
| -static double Time_F(int s)
|
| +#define SIGALRM
|
| +static unsigned int lapse,schlock;
|
| +static void alarm(unsigned int secs) { lapse = secs*1000; }
|
| +
|
| +static DWORD WINAPI sleepy(VOID *arg)
|
| {
|
| - double ret;
|
| + schlock = 1;
|
| + Sleep(lapse);
|
| + run = 0;
|
| + return 0;
|
| + }
|
|
|
| - static clock_t tstart,tend;
|
| -
|
| - if (s == START)
|
| - {
|
| - tstart=clock();
|
| - return(0);
|
| - }
|
| - else
|
| - {
|
| - tend=clock();
|
| - ret=(double)((double)(tend)-(double)(tstart));
|
| - return((ret < 0.001)?0.001:ret);
|
| - }
|
| - }
|
| -
|
| -#else
|
| -
|
| static double Time_F(int s)
|
| {
|
| - double ret;
|
| -
|
| -#ifdef USE_TOD
|
| - if(usertime)
|
| + if (s == START)
|
| {
|
| - static struct rusage tstart,tend;
|
| -
|
| - getrusage_used = 1;
|
| - if (s == START)
|
| + HANDLE thr;
|
| + schlock = 0;
|
| + thr = CreateThread(NULL,4096,sleepy,NULL,0,NULL);
|
| + if (thr==NULL)
|
| {
|
| - getrusage(RUSAGE_SELF,&tstart);
|
| - return(0);
|
| + DWORD ret=GetLastError();
|
| + BIO_printf(bio_err,"unable to CreateThread (%d)",ret);
|
| + ExitProcess(ret);
|
| }
|
| - else
|
| - {
|
| - long i;
|
| -
|
| - getrusage(RUSAGE_SELF,&tend);
|
| - i=(long)tend.ru_utime.tv_usec-(long)tstart.ru_utime.tv_usec;
|
| - ret=((double)(tend.ru_utime.tv_sec-tstart.ru_utime.tv_sec))
|
| - +((double)i)/1000000.0;
|
| - return((ret < 0.001)?0.001:ret);
|
| - }
|
| + CloseHandle(thr); /* detach the thread */
|
| + while (!schlock) Sleep(0); /* scheduler spinlock */
|
| }
|
| - else
|
| - {
|
| - static struct timeval tstart,tend;
|
| - long i;
|
|
|
| - gettimeofday_used = 1;
|
| - if (s == START)
|
| - {
|
| - gettimeofday(&tstart,NULL);
|
| - return(0);
|
| - }
|
| - else
|
| - {
|
| - gettimeofday(&tend,NULL);
|
| - i=(long)tend.tv_usec-(long)tstart.tv_usec;
|
| - ret=((double)(tend.tv_sec-tstart.tv_sec))+((double)i)/1000000.0;
|
| - return((ret < 0.001)?0.001:ret);
|
| - }
|
| - }
|
| -#else /* ndef USE_TOD */
|
| -
|
| -# ifdef TIMES
|
| - if (usertime)
|
| - {
|
| - static struct tms tstart,tend;
|
| + return app_tminterval(s,usertime);
|
| + }
|
| +#else
|
|
|
| - times_used = 1;
|
| - if (s == START)
|
| - {
|
| - times(&tstart);
|
| - return(0);
|
| - }
|
| - else
|
| - {
|
| - times(&tend);
|
| - ret = HZ;
|
| - ret=(double)(tend.tms_utime-tstart.tms_utime) / ret;
|
| - return((ret < 1e-3)?1e-3:ret);
|
| - }
|
| - }
|
| -# endif /* times() */
|
| -# if defined(TIMES) && defined(TIMEB)
|
| - else
|
| -# endif
|
| -# ifdef OPENSSL_SYS_VXWORKS
|
| - {
|
| - static unsigned long tick_start, tick_end;
|
| -
|
| - if( s == START )
|
| - {
|
| - tick_start = tickGet();
|
| - return 0;
|
| - }
|
| - else
|
| - {
|
| - tick_end = tickGet();
|
| - ret = (double)(tick_end - tick_start) / (double)sysClkRateGet();
|
| - return((ret < 0.001)?0.001:ret);
|
| - }
|
| - }
|
| -# elif defined(TIMEB)
|
| - {
|
| - static struct timeb tstart,tend;
|
| - long i;
|
| -
|
| - ftime_used = 1;
|
| - 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
|
| -#endif
|
| +static double Time_F(int s)
|
| + {
|
| + return app_tminterval(s,usertime);
|
| }
|
| -#endif /* if defined(OPENSSL_SYS_NETWARE) */
|
| +#endif
|
|
|
|
|
| #ifndef OPENSSL_NO_ECDH
|
| @@ -500,9 +334,6 @@
|
|
|
| int MAIN(int argc, char **argv)
|
| {
|
| -#ifndef OPENSSL_NO_ENGINE
|
| - ENGINE *e = NULL;
|
| -#endif
|
| unsigned char *buf=NULL,*buf2=NULL;
|
| int mret=1;
|
| long count=0,save_count=0;
|
| @@ -536,6 +367,9 @@
|
| unsigned char sha512[SHA512_DIGEST_LENGTH];
|
| #endif
|
| #endif
|
| +#ifndef OPENSSL_NO_WHIRLPOOL
|
| + unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
|
| +#endif
|
| #ifndef OPENSSL_NO_RIPEMD
|
| unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
|
| #endif
|
| @@ -593,7 +427,6 @@
|
| unsigned char DES_iv[8];
|
| unsigned char iv[2*MAX_BLOCK_SIZE/8];
|
| #ifndef OPENSSL_NO_DES
|
| - DES_cblock *buf_as_des_cblock = NULL;
|
| 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};
|
| @@ -632,9 +465,10 @@
|
| #define D_EVP 22
|
| #define D_SHA256 23
|
| #define D_SHA512 24
|
| -#define D_IGE_128_AES 25
|
| -#define D_IGE_192_AES 26
|
| -#define D_IGE_256_AES 27
|
| +#define D_WHIRLPOOL 25
|
| +#define D_IGE_128_AES 26
|
| +#define D_IGE_192_AES 27
|
| +#define D_IGE_256_AES 28
|
| double d=0.0;
|
| long c[ALGOR_NUM][SIZE_NUM];
|
| #define R_DSA_512 0
|
| @@ -806,9 +640,6 @@
|
| BIO_printf(bio_err,"out of memory\n");
|
| goto end;
|
| }
|
| -#ifndef OPENSSL_NO_DES
|
| - buf_as_des_cblock = (DES_cblock *)buf;
|
| -#endif
|
| if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
|
| {
|
| BIO_printf(bio_err,"out of memory\n");
|
| @@ -883,7 +714,7 @@
|
| BIO_printf(bio_err,"no engine given\n");
|
| goto end;
|
| }
|
| - e = setup_engine(bio_err, *argv, 0);
|
| + setup_engine(bio_err, *argv, 0);
|
| /* j will be increased again further down. We just
|
| don't want speed to confuse an engine with an
|
| algorithm, especially when none is given (which
|
| @@ -954,6 +785,10 @@
|
| else
|
| #endif
|
| #endif
|
| +#ifndef OPENSSL_NO_WHIRLPOOL
|
| + if (strcmp(*argv,"whirlpool") == 0) doit[D_WHIRLPOOL]=1;
|
| + else
|
| +#endif
|
| #ifndef OPENSSL_NO_RIPEMD
|
| if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
|
| else
|
| @@ -1165,12 +1000,16 @@
|
| #ifndef OPENSSL_NO_SHA512
|
| BIO_printf(bio_err,"sha512 ");
|
| #endif
|
| +#ifndef OPENSSL_NO_WHIRLPOOL
|
| + BIO_printf(bio_err,"whirlpool");
|
| +#endif
|
| #ifndef OPENSSL_NO_RIPEMD160
|
| BIO_printf(bio_err,"rmd160");
|
| #endif
|
| #if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
|
| !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
|
| - !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
|
| + !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160) || \
|
| + !defined(OPENSSL_NO_WHIRLPOOL)
|
| BIO_printf(bio_err,"\n");
|
| #endif
|
|
|
| @@ -1297,17 +1136,20 @@
|
| rsa_doit[i]=1;
|
| for (i=0; i<DSA_NUM; i++)
|
| dsa_doit[i]=1;
|
| +#ifndef OPENSSL_NO_ECDSA
|
| + for (i=0; i<EC_NUM; i++)
|
| + ecdsa_doit[i]=1;
|
| +#endif
|
| +#ifndef OPENSSL_NO_ECDH
|
| + for (i=0; i<EC_NUM; i++)
|
| + ecdh_doit[i]=1;
|
| +#endif
|
| }
|
| for (i=0; i<ALGOR_NUM; i++)
|
| if (doit[i]) pr_header++;
|
|
|
| if (usertime == 0 && !mr)
|
| BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
|
| - if (usertime <= 0 && !mr)
|
| - {
|
| - BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
|
| - BIO_printf(bio_err,"program when this computer is idle.\n");
|
| - }
|
|
|
| #ifndef OPENSSL_NO_RSA
|
| for (i=0; i<RSA_NUM; i++)
|
| @@ -1388,7 +1230,8 @@
|
| count*=2;
|
| Time_F(START);
|
| for (it=count; it; it--)
|
| - DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
|
| + DES_ecb_encrypt((DES_cblock *)buf,
|
| + (DES_cblock *)buf,
|
| &sch,DES_ENCRYPT);
|
| d=Time_F(STOP);
|
| } while (d <3);
|
| @@ -1417,6 +1260,7 @@
|
| c[D_CBC_256_CML][0]=count;
|
| c[D_SHA256][0]=count;
|
| c[D_SHA512][0]=count;
|
| + c[D_WHIRLPOOL][0]=count;
|
| c[D_IGE_128_AES][0]=count;
|
| c[D_IGE_192_AES][0]=count;
|
| c[D_IGE_256_AES][0]=count;
|
| @@ -1432,6 +1276,7 @@
|
| c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
|
| c[D_SHA256][i]=c[D_SHA256][0]*4*lengths[0]/lengths[i];
|
| c[D_SHA512][i]=c[D_SHA512][0]*4*lengths[0]/lengths[i];
|
| + c[D_WHIRLPOOL][i]=c[D_WHIRLPOOL][0]*4*lengths[0]/lengths[i];
|
| }
|
| for (i=1; i<SIZE_NUM; i++)
|
| {
|
| @@ -1615,7 +1460,9 @@
|
| #else
|
| #define COND(c) (run)
|
| #define COUNT(d) (count)
|
| +#ifndef _WIN32
|
| signal(SIGALRM,sig_done);
|
| +#endif
|
| #endif /* SIGALRM */
|
|
|
| #ifndef OPENSSL_NO_MD2
|
| @@ -1745,8 +1592,23 @@
|
| }
|
| }
|
| #endif
|
| +#endif
|
|
|
| +#ifndef OPENSSL_NO_WHIRLPOOL
|
| + if (doit[D_WHIRLPOOL])
|
| + {
|
| + for (j=0; j<SIZE_NUM; j++)
|
| + {
|
| + print_message(names[D_WHIRLPOOL],c[D_WHIRLPOOL][j],lengths[j]);
|
| + Time_F(START);
|
| + for (count=0,run=1; COND(c[D_WHIRLPOOL][j]); count++)
|
| + WHIRLPOOL(buf,lengths[j],whirlpool);
|
| + d=Time_F(STOP);
|
| + print_result(D_WHIRLPOOL,j,count,d);
|
| + }
|
| + }
|
| #endif
|
| +
|
| #ifndef OPENSSL_NO_RIPEMD
|
| if (doit[D_RMD160])
|
| {
|
| @@ -1850,6 +1712,7 @@
|
| }
|
| }
|
|
|
| +#if 0 /* ANDROID */
|
| if (doit[D_IGE_128_AES])
|
| {
|
| for (j=0; j<SIZE_NUM; j++)
|
| @@ -1892,7 +1755,10 @@
|
| print_result(D_IGE_256_AES,j,count,d);
|
| }
|
| }
|
| +
|
| +
|
| #endif
|
| +#endif
|
| #ifndef OPENSSL_NO_CAMELLIA
|
| if (doit[D_CBC_128_CML])
|
| {
|
| @@ -2504,36 +2370,7 @@
|
| printf("%s ",BF_options());
|
| #endif
|
| fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
|
| - printf("available timing options: ");
|
| -#ifdef TIMES
|
| - printf("TIMES ");
|
| -#endif
|
| -#ifdef TIMEB
|
| - printf("TIMEB ");
|
| -#endif
|
| -#ifdef USE_TOD
|
| - printf("USE_TOD ");
|
| -#endif
|
| -#ifdef HZ
|
| -#define as_string(s) (#s)
|
| - {
|
| - double dbl = HZ;
|
| - printf("HZ=%g", dbl);
|
| }
|
| -# ifdef _SC_CLK_TCK
|
| - printf(" [sysconf value]");
|
| -# endif
|
| -#endif
|
| - printf("\n");
|
| - printf("timing function used: %s%s%s%s%s%s%s\n",
|
| - (ftime_used ? "ftime" : ""),
|
| - (ftime_used + times_used > 1 ? "," : ""),
|
| - (times_used ? "times" : ""),
|
| - (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
|
| - (gettimeofday_used ? "gettimeofday" : ""),
|
| - (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
|
| - (getrusage_used ? "getrusage" : ""));
|
| - }
|
|
|
| if (pr_header)
|
| {
|
| @@ -2789,6 +2626,7 @@
|
| close(fd[1]);
|
| mr=1;
|
| usertime=0;
|
| + free(fds);
|
| return 0;
|
| }
|
| printf("Forked child %d\n",n);
|
| @@ -2867,6 +2705,7 @@
|
| else
|
| rsa_results[k][1]=d;
|
| }
|
| +#ifndef OPENSSL_NO_DSA
|
| else if(!strncmp(buf,"+F3:",4))
|
| {
|
| int k;
|
| @@ -2888,6 +2727,7 @@
|
| else
|
| dsa_results[k][1]=d;
|
| }
|
| +#endif
|
| #ifndef OPENSSL_NO_ECDSA
|
| else if(!strncmp(buf,"+F4:",4))
|
| {
|
| @@ -2937,7 +2777,10 @@
|
| else
|
| fprintf(stderr,"Unknown type '%s' from child %d\n",buf,n);
|
| }
|
| +
|
| + fclose(f);
|
| }
|
| + free(fds);
|
| return 1;
|
| }
|
| #endif
|
|
|