Moore's Law caught up with us; when doing speed tests on new platforms
(for AES-NI) we found that the calculation of the number of operations
to do was overflowing a 31-bit 'long'.

By switching to 'unsigned long' and re-ordering the calculations a bit,
we can postpone that overflow for a year or two. We may eventually need
to use a 64-bit datatype, or impose an upper limit of 4 milliard loops.

Patches attached for 1.0.0 (which also applies to HEAD), and 0.9.8.

-- 
David Woodhouse                            Open Source Technology Centre
[email protected]                              Intel Corporation

Index: apps/speed.c
===================================================================
RCS file: /home/dwmw2/openssl-cvs/openssl/apps/speed.c,v
retrieving revision 1.143.2.3
diff -u -p -r1.143.2.3 speed.c
--- apps/speed.c	10 Aug 2009 15:53:11 -0000	1.143.2.3
+++ apps/speed.c	9 Nov 2009 15:00:36 -0000
@@ -203,7 +203,7 @@ static double Time_F(int s);
 static void print_message(const char *s,long num,int length);
 static void pkey_print_message(const char *str, const char *str2,
 	long num, int bits, int sec);
-static void print_result(int alg,int run_no,int count,double time_used);
+static void print_result(int alg,int run_no,unsigned long count,double time_used);
 #ifndef NO_FORK
 static int do_multi(int multi);
 #endif
@@ -329,7 +329,7 @@ int MAIN(int argc, char **argv)
 #endif
 	unsigned char *buf=NULL,*buf2=NULL;
 	int mret=1;
-	long count=0,save_count=0;
+	unsigned long count=0,save_count=0;
 	int i,j,k;
 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
 	long rsa_count;
@@ -464,7 +464,7 @@ int MAIN(int argc, char **argv)
 #define D_IGE_192_AES   27
 #define D_IGE_256_AES   28
 	double d=0.0;
-	long c[ALGOR_NUM][SIZE_NUM];
+	unsigned long c[ALGOR_NUM][SIZE_NUM];
 #define	R_DSA_512	0
 #define	R_DSA_1024	1
 #define	R_DSA_2048	2
@@ -492,7 +492,7 @@ int MAIN(int argc, char **argv)
 
 #ifndef OPENSSL_NO_RSA
 	RSA *rsa_key[RSA_NUM];
-	long rsa_c[RSA_NUM][2];
+	unsigned long rsa_c[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};
@@ -502,7 +502,7 @@ int MAIN(int argc, char **argv)
 #endif
 #ifndef OPENSSL_NO_DSA
 	DSA *dsa_key[DSA_NUM];
-	long dsa_c[DSA_NUM][2];
+	unsigned long dsa_c[DSA_NUM][2];
 	static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
 #endif
 #ifndef OPENSSL_NO_EC
@@ -566,7 +566,7 @@ int MAIN(int argc, char **argv)
 	unsigned char ecdsasig[256];
 	unsigned int ecdsasiglen;
 	EC_KEY *ecdsa[EC_NUM];
-	long ecdsa_c[EC_NUM][2];
+	unsigned long ecdsa_c[EC_NUM][2];
 #endif
 
 #ifndef OPENSSL_NO_ECDH
@@ -575,7 +575,7 @@ int MAIN(int argc, char **argv)
 	int secret_size_a, secret_size_b;
 	int ecdh_checks = 0;
 	int secret_idx = 0;
-	long ecdh_c[EC_NUM][2];
+	unsigned long ecdh_c[EC_NUM][2];
 #endif
 
 	int rsa_doit[RSA_NUM];
@@ -1263,41 +1263,39 @@ int MAIN(int argc, char **argv)
 
 	for (i=1; i<SIZE_NUM; i++)
 		{
-		c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
-		c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
-		c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
-		c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
-		c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
-		c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
-		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];
+		c[D_MD2][i]=c[D_MD2][0]*4/(lengths[i]/lengths[0]);
+		c[D_MDC2][i]=c[D_MDC2][0]*4/(lengths[i]/lengths[0]);
+		c[D_MD4][i]=c[D_MD4][0]*4/(lengths[i]/lengths[0]);
+		c[D_MD5][i]=c[D_MD5][0]*4/(lengths[i]/lengths[0]);
+		c[D_HMAC][i]=c[D_HMAC][0]*4/(lengths[i]/lengths[0]);
+		c[D_SHA1][i]=c[D_SHA1][0]*4/(lengths[i]/lengths[0]);
+		c[D_RMD160][i]=c[D_RMD160][0]*4/(lengths[i]/lengths[0]);
+		c[D_SHA256][i]=c[D_SHA256][0]*4/(lengths[i]/lengths[0]);
+		c[D_SHA512][i]=c[D_SHA512][0]*4/(lengths[i]/lengths[0]);
+		c[D_WHIRLPOOL][i]=c[D_WHIRLPOOL][0]*4/(lengths[i]/lengths[0]);
 		}
 	for (i=1; i<SIZE_NUM; i++)
 		{
-		long l0,l1;
+		long div = lengths[i] / lengths[i-1];
 
-		l0=(long)lengths[i-1];
-		l1=(long)lengths[i];
-		c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
-		c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
-		c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
-		c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
-		c[D_CBC_SEED][i]=c[D_CBC_SEED][i-1]*l0/l1;
-		c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
-		c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
-		c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
-		c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
-		c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
-		c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
-		c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
- 		c[D_CBC_128_CML][i]=c[D_CBC_128_CML][i-1]*l0/l1;
-		c[D_CBC_192_CML][i]=c[D_CBC_192_CML][i-1]*l0/l1;
-		c[D_CBC_256_CML][i]=c[D_CBC_256_CML][i-1]*l0/l1;
-		c[D_IGE_128_AES][i]=c[D_IGE_128_AES][i-1]*l0/l1;
-		c[D_IGE_192_AES][i]=c[D_IGE_192_AES][i-1]*l0/l1;
-		c[D_IGE_256_AES][i]=c[D_IGE_256_AES][i-1]*l0/l1;
+		c[D_RC4][i]=c[D_RC4][i-1]/div;
+		c[D_CBC_DES][i]=c[D_CBC_DES][i-1]/div;
+		c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]/div;
+		c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]/div;
+		c[D_CBC_SEED][i]=c[D_CBC_SEED][i-1]/div;
+		c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]/div;
+		c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]/div;
+		c[D_CBC_BF][i]=c[D_CBC_BF][i-1]/div;
+		c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]/div;
+		c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]/div;
+		c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]/div;
+		c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]/div;
+ 		c[D_CBC_128_CML][i]=c[D_CBC_128_CML][i-1]/div;
+		c[D_CBC_192_CML][i]=c[D_CBC_192_CML][i-1]/div;
+		c[D_CBC_256_CML][i]=c[D_CBC_256_CML][i-1]/div;
+		c[D_IGE_128_AES][i]=c[D_IGE_128_AES][i-1]/div;
+		c[D_IGE_192_AES][i]=c[D_IGE_192_AES][i-1]/div;
+		c[D_IGE_256_AES][i]=c[D_IGE_256_AES][i-1]/div;
 		}
 #ifndef OPENSSL_NO_RSA
 	rsa_c[R_RSA_512][0]=count/2000;
@@ -2555,10 +2553,10 @@ static void pkey_print_message(const cha
 #endif
 	}
 
-static void print_result(int alg,int run_no,int count,double time_used)
+static void print_result(int alg,int run_no,unsigned long count,double time_used)
 	{
-	BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
-		   : "%d %s's in %.2fs\n",count,names[alg],time_used);
+	BIO_printf(bio_err,mr ? "+R:%lu:%s:%f\n"
+		   : "%lu %s's in %.2fs\n",count,names[alg],time_used);
 	results[alg][run_no]=((double)count)/time_used*lengths[run_no];
 	}
 
Index: apps/speed.c
===================================================================
RCS file: /home/dwmw2/openssl-cvs/openssl/apps/speed.c,v
retrieving revision 1.126.2.13
diff -u -p -r1.126.2.13 speed.c
--- apps/speed.c	10 Aug 2009 15:52:33 -0000	1.126.2.13
+++ apps/speed.c	9 Nov 2009 15:00:25 -0000
@@ -274,7 +274,7 @@ static double Time_F(int s);
 static void print_message(const char *s,long num,int length);
 static void pkey_print_message(const char *str, const char *str2,
 	long num, int bits, int sec);
-static void print_result(int alg,int run_no,int count,double time_used);
+static void print_result(int alg,int run_no,unsigned long count,double time_used);
 #ifndef NO_FORK
 static int do_multi(int multi);
 #endif
@@ -495,7 +495,7 @@ int MAIN(int argc, char **argv)
 #endif
 	unsigned char *buf=NULL,*buf2=NULL;
 	int mret=1;
-	long count=0,save_count=0;
+	unsigned long count=0,save_count=0;
 	int i,j,k;
 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA)
 	long rsa_count;
@@ -626,7 +626,7 @@ int MAIN(int argc, char **argv)
 #define D_IGE_192_AES   26
 #define D_IGE_256_AES   27
 	double d=0.0;
-	long c[ALGOR_NUM][SIZE_NUM];
+	unsigned long c[ALGOR_NUM][SIZE_NUM];
 #define	R_DSA_512	0
 #define	R_DSA_1024	1
 #define	R_DSA_2048	2
@@ -654,7 +654,7 @@ int MAIN(int argc, char **argv)
 
 #ifndef OPENSSL_NO_RSA
 	RSA *rsa_key[RSA_NUM];
-	long rsa_c[RSA_NUM][2];
+	unsigned long rsa_c[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};
@@ -664,7 +664,7 @@ int MAIN(int argc, char **argv)
 #endif
 #ifndef OPENSSL_NO_DSA
 	DSA *dsa_key[DSA_NUM];
-	long dsa_c[DSA_NUM][2];
+	unsigned long dsa_c[DSA_NUM][2];
 	static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
 #endif
 #ifndef OPENSSL_NO_EC
@@ -728,7 +728,7 @@ int MAIN(int argc, char **argv)
 	unsigned char ecdsasig[256];
 	unsigned int ecdsasiglen;
 	EC_KEY *ecdsa[EC_NUM];
-	long ecdsa_c[EC_NUM][2];
+	unsigned long ecdsa_c[EC_NUM][2];
 #endif
 
 #ifndef OPENSSL_NO_ECDH
@@ -737,7 +737,7 @@ int MAIN(int argc, char **argv)
 	int secret_size_a, secret_size_b;
 	int ecdh_checks = 0;
 	int secret_idx = 0;
-	long ecdh_c[EC_NUM][2];
+	unsigned long ecdh_c[EC_NUM][2];
 #endif
 
 	int rsa_doit[RSA_NUM];
@@ -1413,40 +1413,38 @@ int MAIN(int argc, char **argv)
 
 	for (i=1; i<SIZE_NUM; i++)
 		{
-		c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
-		c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
-		c[D_MD4][i]=c[D_MD4][0]*4*lengths[0]/lengths[i];
-		c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
-		c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
-		c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
-		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_MD2][i]=c[D_MD2][0]*4/(lengths[i]/lengths[0]);
+		c[D_MDC2][i]=c[D_MDC2][0]*4/(lengths[i]/lengths[0]);
+		c[D_MD4][i]=c[D_MD4][0]*4/(lengths[i]/lengths[0]);
+		c[D_MD5][i]=c[D_MD5][0]*4/(lengths[i]/lengths[0]);
+		c[D_HMAC][i]=c[D_HMAC][0]*4/(lengths[i]/lengths[0]);
+		c[D_SHA1][i]=c[D_SHA1][0]*4/(lengths[i]/lengths[0]);
+		c[D_RMD160][i]=c[D_RMD160][0]*4/(lengths[i]/lengths[0]);
+		c[D_SHA256][i]=c[D_SHA256][0]*4/(lengths[i]/lengths[0]);
+		c[D_SHA512][i]=c[D_SHA512][0]*4/(lengths[i]/lengths[0]);
 		}
 	for (i=1; i<SIZE_NUM; i++)
 		{
-		long l0,l1;
+		long div = lenghts[1] / lengths[i-1];
 
-		l0=(long)lengths[i-1];
-		l1=(long)lengths[i];
-		c[D_RC4][i]=c[D_RC4][i-1]*l0/l1;
-		c[D_CBC_DES][i]=c[D_CBC_DES][i-1]*l0/l1;
-		c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
-		c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
-		c[D_CBC_SEED][i]=c[D_CBC_SEED][i-1]*l0/l1;
-		c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
-		c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
-		c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
-		c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
-		c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]*l0/l1;
-		c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]*l0/l1;
-		c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]*l0/l1;
- 		c[D_CBC_128_CML][i]=c[D_CBC_128_CML][i-1]*l0/l1;
-		c[D_CBC_192_CML][i]=c[D_CBC_192_CML][i-1]*l0/l1;
-		c[D_CBC_256_CML][i]=c[D_CBC_256_CML][i-1]*l0/l1;
-		c[D_IGE_128_AES][i]=c[D_IGE_128_AES][i-1]*l0/l1;
-		c[D_IGE_192_AES][i]=c[D_IGE_192_AES][i-1]*l0/l1;
-		c[D_IGE_256_AES][i]=c[D_IGE_256_AES][i-1]*l0/l1;
+		c[D_RC4][i]=c[D_RC4][i-1]/div;
+		c[D_CBC_DES][i]=c[D_CBC_DES][i-1]/div;
+		c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]/div;
+		c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]/div;
+		c[D_CBC_SEED][i]=c[D_CBC_SEED][i-1]/div;
+		c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]/div;
+		c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]/div;
+		c[D_CBC_BF][i]=c[D_CBC_BF][i-1]/div;
+		c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]/div;
+		c[D_CBC_128_AES][i]=c[D_CBC_128_AES][i-1]/div;
+		c[D_CBC_192_AES][i]=c[D_CBC_192_AES][i-1]/div;
+		c[D_CBC_256_AES][i]=c[D_CBC_256_AES][i-1]/div;
+ 		c[D_CBC_128_CML][i]=c[D_CBC_128_CML][i-1]/div;
+		c[D_CBC_192_CML][i]=c[D_CBC_192_CML][i-1]/div;
+		c[D_CBC_256_CML][i]=c[D_CBC_256_CML][i-1]/div;
+		c[D_IGE_128_AES][i]=c[D_IGE_128_AES][i-1]/div;
+		c[D_IGE_192_AES][i]=c[D_IGE_192_AES][i-1]/div;
+		c[D_IGE_256_AES][i]=c[D_IGE_256_AES][i-1]/div;
 		}
 #ifndef OPENSSL_NO_RSA
 	rsa_c[R_RSA_512][0]=count/2000;
@@ -2714,10 +2712,10 @@ static void pkey_print_message(const cha
 #endif
 	}
 
-static void print_result(int alg,int run_no,int count,double time_used)
+static void print_result(int alg,int run_no,unsigned long count,double time_used)
 	{
-	BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
-		   : "%d %s's in %.2fs\n",count,names[alg],time_used);
+	BIO_printf(bio_err,mr ? "+R:%lu:%s:%f\n"
+		   : "%lu %s's in %.2fs\n",count,names[alg],time_used);
 	results[alg][run_no]=((double)count)/time_used*lengths[run_no];
 	}
 

Reply via email to