diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/bn/expspeed.c | 229 |
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 | ||
| 84 | static 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. |
| 86 | struct 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) |
| 124 | int run=0; | 148 | int run=0; |
| 125 | 149 | ||
| 126 | #ifndef NOPROTO | ||
| 127 | static double Time_F(int s); | 150 | static double Time_F(int s); |
| 128 | #else | ||
| 129 | static double Time_F(); | ||
| 130 | #endif | ||
| 131 | |||
| 132 | #define START 0 | 151 | #define START 0 |
| 133 | #define STOP 1 | 152 | #define STOP 1 |
| 134 | 153 | ||
| 135 | static double Time_F(s) | 154 | static double Time_F(int s) |
| 136 | int 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 |
| 173 | static int sizes[NUM_SIZES]={256,512,1024,2048,4096,8192}; | 191 | #if NUM_START > NUM_SIZES |
| 174 | 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}; | ||
| 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 | |||
| 177 | 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); |
| 178 | 201 | ||
| 179 | int main(argc,argv) | 202 | int main(int argc, char **argv) |
| 180 | int argc; | ||
| 181 | char **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 | ||
| 195 | void do_mul_exp(r,a,b,c,ctx) | 226 | void do_mul_exp(BIGNUM *r, BIGNUM *a, BIGNUM *b, BIGNUM *c, BN_CTX *ctx) |
| 196 | BIGNUM *r; | ||
| 197 | BIGNUM *a; | ||
| 198 | BIGNUM *b; | ||
| 199 | BIGNUM *c; | ||
| 200 | BN_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 | ||
| 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 | ||
