summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bn/expspeed.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/bn/expspeed.c229
1 files changed, 176 insertions, 53 deletions
diff --git a/src/lib/libcrypto/bn/expspeed.c b/src/lib/libcrypto/bn/expspeed.c
index 344f883d35..07a1bcf51c 100644
--- a/src/lib/libcrypto/bn/expspeed.c
+++ b/src/lib/libcrypto/bn/expspeed.c
@@ -1,3 +1,5 @@
1/* unused */
2
1/* crypto/bn/expspeed.c */ 3/* crypto/bn/expspeed.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 4/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 5 * All rights reserved.
@@ -59,6 +61,31 @@
59/* most of this code has been pilfered from my libdes speed.c program */ 61/* most of this code has been pilfered from my libdes speed.c program */
60 62
61#define BASENUM 5000 63#define BASENUM 5000
64#define NUM_START 0
65
66
67/* determine timings for modexp, modmul, modsqr, gcd, Kronecker symbol,
68 * modular inverse, or modular square roots */
69#define TEST_EXP
70#undef TEST_MUL
71#undef TEST_SQR
72#undef TEST_GCD
73#undef TEST_KRON
74#undef TEST_INV
75#undef TEST_SQRT
76#define P_MOD_64 9 /* least significant 6 bits for prime to be used for BN_sqrt timings */
77
78#if defined(TEST_EXP) + defined(TEST_MUL) + defined(TEST_SQR) + defined(TEST_GCD) + defined(TEST_KRON) + defined(TEST_INV) +defined(TEST_SQRT) != 1
79# error "choose one test"
80#endif
81
82#if defined(TEST_INV) || defined(TEST_SQRT)
83# define C_PRIME
84static void genprime_cb(int p, int n, void *arg);
85#endif
86
87
88
62#undef PROG 89#undef PROG
63#define PROG bnspeed_main 90#define PROG bnspeed_main
64 91
@@ -66,14 +93,14 @@
66#include <stdlib.h> 93#include <stdlib.h>
67#include <signal.h> 94#include <signal.h>
68#include <string.h> 95#include <string.h>
69#include "crypto.h" 96#include <openssl/crypto.h>
70#include "err.h" 97#include <openssl/err.h>
98#include <openssl/rand.h>
71 99
72#ifndef MSDOS 100#if !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX)
73#define TIMES 101#define TIMES
74#endif 102#endif
75 103
76#ifndef VMS
77#ifndef _IRIX 104#ifndef _IRIX
78#include <time.h> 105#include <time.h>
79#endif 106#endif
@@ -81,36 +108,33 @@
81#include <sys/types.h> 108#include <sys/types.h>
82#include <sys/times.h> 109#include <sys/times.h>
83#endif 110#endif
84#else /* VMS */ 111
85#include <types.h> 112/* Depending on the VMS version, the tms structure is perhaps defined.
86struct tms { 113 The __TMS macro will show if it was. If it wasn't defined, we should
87 time_t tms_utime; 114 undefine TIMES, since that tells the rest of the program how things
88 time_t tms_stime; 115 should be handled. -- Richard Levitte */
89 time_t tms_uchild; /* I dunno... */ 116#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
90 time_t tms_uchildsys; /* so these names are a guess :-) */ 117#undef TIMES
91 }
92#endif 118#endif
119
93#ifndef TIMES 120#ifndef TIMES
94#include <sys/timeb.h> 121#include <sys/timeb.h>
95#endif 122#endif
96 123
97#ifdef sun 124#if defined(sun) || defined(__ultrix)
125#define _POSIX_SOURCE
98#include <limits.h> 126#include <limits.h>
99#include <sys/param.h> 127#include <sys/param.h>
100#endif 128#endif
101 129
102#include "bn.h" 130#include <openssl/bn.h>
103#include "x509.h" 131#include <openssl/x509.h>
104 132
105/* The following if from times(3) man page. It may need to be changed */ 133/* The following if from times(3) man page. It may need to be changed */
106#ifndef HZ 134#ifndef HZ
107# ifndef CLK_TCK 135# ifndef CLK_TCK
108# ifndef _BSD_CLK_TCK_ /* FreeBSD hack */ 136# ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
109# ifndef VMS 137# define HZ 100.0
110# define HZ 100.0
111# else /* VMS */
112# define HZ 100.0
113# endif
114# else /* _BSD_CLK_TCK_ */ 138# else /* _BSD_CLK_TCK_ */
115# define HZ ((double)_BSD_CLK_TCK_) 139# define HZ ((double)_BSD_CLK_TCK_)
116# endif 140# endif
@@ -123,17 +147,11 @@ struct tms {
123#define BUFSIZE ((long)1024*8) 147#define BUFSIZE ((long)1024*8)
124int run=0; 148int run=0;
125 149
126#ifndef NOPROTO
127static double Time_F(int s); 150static double Time_F(int s);
128#else
129static double Time_F();
130#endif
131
132#define START 0 151#define START 0
133#define STOP 1 152#define STOP 1
134 153
135static double Time_F(s) 154static double Time_F(int s)
136int s;
137 { 155 {
138 double ret; 156 double ret;
139#ifdef TIMES 157#ifdef TIMES
@@ -169,62 +187,167 @@ int s;
169#endif 187#endif
170 } 188 }
171 189
172#define NUM_SIZES 6 190#define NUM_SIZES 7
173static int sizes[NUM_SIZES]={256,512,1024,2048,4096,8192}; 191#if NUM_START > NUM_SIZES
174static int mul_c[NUM_SIZES]={8*8*8*8*8,8*8*8*8,8*8*8,8*8,8,1}; 192# error "NUM_START > NUM_SIZES"
193#endif
194static int sizes[NUM_SIZES]={128,256,512,1024,2048,4096,8192};
195static int mul_c[NUM_SIZES]={8*8*8*8*8*8,8*8*8*8*8,8*8*8*8,8*8*8,8*8,8,1};
175/*static int sizes[NUM_SIZES]={59,179,299,419,539}; */ 196/*static int sizes[NUM_SIZES]={59,179,299,419,539}; */
176 197
198#define RAND_SEED(string) { const char str[] = string; RAND_seed(string, sizeof str); }
199
177void do_mul_exp(BIGNUM *r,BIGNUM *a,BIGNUM *b,BIGNUM *c,BN_CTX *ctx); 200void do_mul_exp(BIGNUM *r,BIGNUM *a,BIGNUM *b,BIGNUM *c,BN_CTX *ctx);
178 201
179int main(argc,argv) 202int main(int argc, char **argv)
180int argc;
181char **argv;
182 { 203 {
183 BN_CTX *ctx; 204 BN_CTX *ctx;
184 BIGNUM *a,*b,*c,*r; 205 BIGNUM *a,*b,*c,*r;
185 206
207#if 1
208 if (!CRYPTO_set_mem_debug_functions(0,0,0,0,0))
209 abort();
210#endif
211
186 ctx=BN_CTX_new(); 212 ctx=BN_CTX_new();
187 a=BN_new(); 213 a=BN_new();
188 b=BN_new(); 214 b=BN_new();
189 c=BN_new(); 215 c=BN_new();
190 r=BN_new(); 216 r=BN_new();
191 217
218 while (!RAND_status())
219 /* not enough bits */
220 RAND_SEED("I demand a manual recount!");
221
192 do_mul_exp(r,a,b,c,ctx); 222 do_mul_exp(r,a,b,c,ctx);
223 return 0;
193 } 224 }
194 225
195void do_mul_exp(r,a,b,c,ctx) 226void do_mul_exp(BIGNUM *r, BIGNUM *a, BIGNUM *b, BIGNUM *c, BN_CTX *ctx)
196BIGNUM *r;
197BIGNUM *a;
198BIGNUM *b;
199BIGNUM *c;
200BN_CTX *ctx;
201 { 227 {
202 int i,k; 228 int i,k;
203 double tm; 229 double tm;
204 long num; 230 long num;
205 BN_MONT_CTX m;
206
207 memset(&m,0,sizeof(m));
208 231
209 num=BASENUM; 232 num=BASENUM;
210 for (i=0; i<NUM_SIZES; i++) 233 for (i=NUM_START; i<NUM_SIZES; i++)
211 { 234 {
212 BN_rand(a,sizes[i],1,0); 235#ifdef C_PRIME
213 BN_rand(b,sizes[i],1,0); 236# ifdef TEST_SQRT
214 BN_rand(c,sizes[i],1,1); 237 if (!BN_set_word(a, 64)) goto err;
215 BN_mod(a,a,c,ctx); 238 if (!BN_set_word(b, P_MOD_64)) goto err;
216 BN_mod(b,b,c,ctx); 239# define ADD a
217 240# define REM b
218 BN_MONT_CTX_set(&m,c,ctx); 241# else
242# define ADD NULL
243# define REM NULL
244# endif
245 if (!BN_generate_prime(c,sizes[i],0,ADD,REM,genprime_cb,NULL)) goto err;
246 putc('\n', stderr);
247 fflush(stderr);
248#endif
219 249
220 Time_F(START);
221 for (k=0; k<num; k++) 250 for (k=0; k<num; k++)
222 BN_mod_exp_mont(r,a,b,c,ctx,&m); 251 {
252 if (k%50 == 0) /* Average over num/50 different choices of random numbers. */
253 {
254 if (!BN_pseudo_rand(a,sizes[i],1,0)) goto err;
255
256 if (!BN_pseudo_rand(b,sizes[i],1,0)) goto err;
257
258#ifndef C_PRIME
259 if (!BN_pseudo_rand(c,sizes[i],1,1)) goto err;
260#endif
261
262#ifdef TEST_SQRT
263 if (!BN_mod_sqr(a,a,c,ctx)) goto err;
264 if (!BN_mod_sqr(b,b,c,ctx)) goto err;
265#else
266 if (!BN_nnmod(a,a,c,ctx)) goto err;
267 if (!BN_nnmod(b,b,c,ctx)) goto err;
268#endif
269
270 if (k == 0)
271 Time_F(START);
272 }
273
274#if defined(TEST_EXP)
275 if (!BN_mod_exp(r,a,b,c,ctx)) goto err;
276#elif defined(TEST_MUL)
277 {
278 int i = 0;
279 for (i = 0; i < 50; i++)
280 if (!BN_mod_mul(r,a,b,c,ctx)) goto err;
281 }
282#elif defined(TEST_SQR)
283 {
284 int i = 0;
285 for (i = 0; i < 50; i++)
286 {
287 if (!BN_mod_sqr(r,a,c,ctx)) goto err;
288 if (!BN_mod_sqr(r,b,c,ctx)) goto err;
289 }
290 }
291#elif defined(TEST_GCD)
292 if (!BN_gcd(r,a,b,ctx)) goto err;
293 if (!BN_gcd(r,b,c,ctx)) goto err;
294 if (!BN_gcd(r,c,a,ctx)) goto err;
295#elif defined(TEST_KRON)
296 if (-2 == BN_kronecker(a,b,ctx)) goto err;
297 if (-2 == BN_kronecker(b,c,ctx)) goto err;
298 if (-2 == BN_kronecker(c,a,ctx)) goto err;
299#elif defined(TEST_INV)
300 if (!BN_mod_inverse(r,a,c,ctx)) goto err;
301 if (!BN_mod_inverse(r,b,c,ctx)) goto err;
302#else /* TEST_SQRT */
303 if (!BN_mod_sqrt(r,a,c,ctx)) goto err;
304 if (!BN_mod_sqrt(r,b,c,ctx)) goto err;
305#endif
306 }
223 tm=Time_F(STOP); 307 tm=Time_F(STOP);
224 printf("mul %4d ^ %4d %% %d -> %8.3fms %5.1f\n",sizes[i],sizes[i],sizes[i],tm*1000.0/num,tm*mul_c[i]/num); 308 printf(
309#if defined(TEST_EXP)
310 "modexp %4d ^ %4d %% %4d"
311#elif defined(TEST_MUL)
312 "50*modmul %4d %4d %4d"
313#elif defined(TEST_SQR)
314 "100*modsqr %4d %4d %4d"
315#elif defined(TEST_GCD)
316 "3*gcd %4d %4d %4d"
317#elif defined(TEST_KRON)
318 "3*kronecker %4d %4d %4d"
319#elif defined(TEST_INV)
320 "2*inv %4d %4d mod %4d"
321#else /* TEST_SQRT */
322 "2*sqrt [prime == %d (mod 64)] %4d %4d mod %4d"
323#endif
324 " -> %8.3fms %5.1f (%ld)\n",
325#ifdef TEST_SQRT
326 P_MOD_64,
327#endif
328 sizes[i],sizes[i],sizes[i],tm*1000.0/num,tm*mul_c[i]/num, num);
225 num/=7; 329 num/=7;
226 if (num <= 0) num=1; 330 if (num <= 0) num=1;
227 } 331 }
332 return;
228 333
334 err:
335 ERR_print_errors_fp(stderr);
229 } 336 }
230 337
338
339#ifdef C_PRIME
340static void genprime_cb(int p, int n, void *arg)
341 {
342 char c='*';
343
344 if (p == 0) c='.';
345 if (p == 1) c='+';
346 if (p == 2) c='*';
347 if (p == 3) c='\n';
348 putc(c, stderr);
349 fflush(stderr);
350 (void)n;
351 (void)arg;
352 }
353#endif