diff options
author | beck <> | 2002-05-15 02:29:21 +0000 |
---|---|---|
committer | beck <> | 2002-05-15 02:29:21 +0000 |
commit | b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9 (patch) | |
tree | fa27cf82a1250b64ed3bf5f4a18c7354d470bbcc /src/lib/libcrypto/bn/expspeed.c | |
parent | e471e1ea98d673597b182ea85f29e30c97cd08b5 (diff) | |
download | openbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.tar.gz openbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.tar.bz2 openbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.zip |
OpenSSL 0.9.7 stable 2002 05 08 merge
Diffstat (limited to 'src/lib/libcrypto/bn/expspeed.c')
-rw-r--r-- | src/lib/libcrypto/bn/expspeed.c | 176 |
1 files changed, 157 insertions, 19 deletions
diff --git a/src/lib/libcrypto/bn/expspeed.c b/src/lib/libcrypto/bn/expspeed.c index 2044ab9bff..07a1bcf51c 100644 --- a/src/lib/libcrypto/bn/expspeed.c +++ b/src/lib/libcrypto/bn/expspeed.c | |||
@@ -61,6 +61,31 @@ | |||
61 | /* 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 */ |
62 | 62 | ||
63 | #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 | ||
84 | static void genprime_cb(int p, int n, void *arg); | ||
85 | #endif | ||
86 | |||
87 | |||
88 | |||
64 | #undef PROG | 89 | #undef PROG |
65 | #define PROG bnspeed_main | 90 | #define PROG bnspeed_main |
66 | 91 | ||
@@ -70,8 +95,9 @@ | |||
70 | #include <string.h> | 95 | #include <string.h> |
71 | #include <openssl/crypto.h> | 96 | #include <openssl/crypto.h> |
72 | #include <openssl/err.h> | 97 | #include <openssl/err.h> |
98 | #include <openssl/rand.h> | ||
73 | 99 | ||
74 | #if !defined(MSDOS) && (!defined(VMS) || defined(__DECC)) | 100 | #if !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX) |
75 | #define TIMES | 101 | #define TIMES |
76 | #endif | 102 | #endif |
77 | 103 | ||
@@ -87,7 +113,7 @@ | |||
87 | The __TMS macro will show if it was. If it wasn't defined, we should | 113 | The __TMS macro will show if it was. If it wasn't defined, we should |
88 | undefine TIMES, since that tells the rest of the program how things | 114 | undefine TIMES, since that tells the rest of the program how things |
89 | should be handled. -- Richard Levitte */ | 115 | should be handled. -- Richard Levitte */ |
90 | #if defined(VMS) && defined(__DECC) && !defined(__TMS) | 116 | #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS) |
91 | #undef TIMES | 117 | #undef TIMES |
92 | #endif | 118 | #endif |
93 | 119 | ||
@@ -161,11 +187,16 @@ static double Time_F(int s) | |||
161 | #endif | 187 | #endif |
162 | } | 188 | } |
163 | 189 | ||
164 | #define NUM_SIZES 6 | 190 | #define NUM_SIZES 7 |
165 | static int sizes[NUM_SIZES]={256,512,1024,2048,4096,8192}; | 191 | #if NUM_START > NUM_SIZES |
166 | static 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 | ||
194 | static int sizes[NUM_SIZES]={128,256,512,1024,2048,4096,8192}; | ||
195 | static 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}; | ||
167 | /*static int sizes[NUM_SIZES]={59,179,299,419,539}; */ | 196 | /*static int sizes[NUM_SIZES]={59,179,299,419,539}; */ |
168 | 197 | ||
198 | #define RAND_SEED(string) { const char str[] = string; RAND_seed(string, sizeof str); } | ||
199 | |||
169 | void do_mul_exp(BIGNUM *r,BIGNUM *a,BIGNUM *b,BIGNUM *c,BN_CTX *ctx); | 200 | void do_mul_exp(BIGNUM *r,BIGNUM *a,BIGNUM *b,BIGNUM *c,BN_CTX *ctx); |
170 | 201 | ||
171 | int main(int argc, char **argv) | 202 | int main(int argc, char **argv) |
@@ -173,13 +204,23 @@ int main(int argc, char **argv) | |||
173 | BN_CTX *ctx; | 204 | BN_CTX *ctx; |
174 | BIGNUM *a,*b,*c,*r; | 205 | BIGNUM *a,*b,*c,*r; |
175 | 206 | ||
207 | #if 1 | ||
208 | if (!CRYPTO_set_mem_debug_functions(0,0,0,0,0)) | ||
209 | abort(); | ||
210 | #endif | ||
211 | |||
176 | ctx=BN_CTX_new(); | 212 | ctx=BN_CTX_new(); |
177 | a=BN_new(); | 213 | a=BN_new(); |
178 | b=BN_new(); | 214 | b=BN_new(); |
179 | c=BN_new(); | 215 | c=BN_new(); |
180 | r=BN_new(); | 216 | r=BN_new(); |
181 | 217 | ||
218 | while (!RAND_status()) | ||
219 | /* not enough bits */ | ||
220 | RAND_SEED("I demand a manual recount!"); | ||
221 | |||
182 | do_mul_exp(r,a,b,c,ctx); | 222 | do_mul_exp(r,a,b,c,ctx); |
223 | return 0; | ||
183 | } | 224 | } |
184 | 225 | ||
185 | void do_mul_exp(BIGNUM *r, BIGNUM *a, BIGNUM *b, BIGNUM *c, BN_CTX *ctx) | 226 | void do_mul_exp(BIGNUM *r, BIGNUM *a, BIGNUM *b, BIGNUM *c, BN_CTX *ctx) |
@@ -187,29 +228,126 @@ void do_mul_exp(BIGNUM *r, BIGNUM *a, BIGNUM *b, BIGNUM *c, BN_CTX *ctx) | |||
187 | int i,k; | 228 | int i,k; |
188 | double tm; | 229 | double tm; |
189 | long num; | 230 | long num; |
190 | BN_MONT_CTX m; | ||
191 | |||
192 | memset(&m,0,sizeof(m)); | ||
193 | 231 | ||
194 | num=BASENUM; | 232 | num=BASENUM; |
195 | for (i=0; i<NUM_SIZES; i++) | 233 | for (i=NUM_START; i<NUM_SIZES; i++) |
196 | { | 234 | { |
197 | BN_rand(a,sizes[i],1,0); | 235 | #ifdef C_PRIME |
198 | BN_rand(b,sizes[i],1,0); | 236 | # ifdef TEST_SQRT |
199 | BN_rand(c,sizes[i],1,1); | 237 | if (!BN_set_word(a, 64)) goto err; |
200 | BN_mod(a,a,c,ctx); | 238 | if (!BN_set_word(b, P_MOD_64)) goto err; |
201 | BN_mod(b,b,c,ctx); | 239 | # define ADD a |
202 | 240 | # define REM b | |
203 | 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 | ||
204 | 249 | ||
205 | Time_F(START); | ||
206 | for (k=0; k<num; k++) | 250 | for (k=0; k<num; k++) |
207 | 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 | } | ||
208 | tm=Time_F(STOP); | 307 | tm=Time_F(STOP); |
209 | 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); | ||
210 | num/=7; | 329 | num/=7; |
211 | if (num <= 0) num=1; | 330 | if (num <= 0) num=1; |
212 | } | 331 | } |
332 | return; | ||
213 | 333 | ||
334 | err: | ||
335 | ERR_print_errors_fp(stderr); | ||
214 | } | 336 | } |
215 | 337 | ||
338 | |||
339 | #ifdef C_PRIME | ||
340 | static 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 | ||