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 |