summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/rsa/rsa_eay.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/rsa/rsa_eay.c')
-rw-r--r--src/lib/libcrypto/rsa/rsa_eay.c97
1 files changed, 82 insertions, 15 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_eay.c b/src/lib/libcrypto/rsa/rsa_eay.c
index ccaa62b239..cde5ca27d5 100644
--- a/src/lib/libcrypto/rsa/rsa_eay.c
+++ b/src/lib/libcrypto/rsa/rsa_eay.c
@@ -141,9 +141,26 @@ static int RSA_eay_public_encrypt(int flen, unsigned char *from,
141 141
142 if ((rsa->_method_mod_n == NULL) && (rsa->flags & RSA_FLAG_CACHE_PUBLIC)) 142 if ((rsa->_method_mod_n == NULL) && (rsa->flags & RSA_FLAG_CACHE_PUBLIC))
143 { 143 {
144 if ((rsa->_method_mod_n=BN_MONT_CTX_new()) != NULL) 144 BN_MONT_CTX* bn_mont_ctx;
145 if (!BN_MONT_CTX_set(rsa->_method_mod_n,rsa->n,ctx)) 145 if ((bn_mont_ctx=BN_MONT_CTX_new()) == NULL)
146 goto err; 146 goto err;
147 if (!BN_MONT_CTX_set(bn_mont_ctx,rsa->n,ctx))
148 {
149 BN_MONT_CTX_free(bn_mont_ctx);
150 goto err;
151 }
152 if (rsa->_method_mod_n == NULL) /* other thread may have finished first */
153 {
154 CRYPTO_w_lock(CRYPTO_LOCK_RSA);
155 if (rsa->_method_mod_n == NULL)
156 {
157 rsa->_method_mod_n = bn_mont_ctx;
158 bn_mont_ctx = NULL;
159 }
160 CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
161 }
162 if (bn_mont_ctx)
163 BN_MONT_CTX_free(bn_mont_ctx);
147 } 164 }
148 165
149 if (!meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx, 166 if (!meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx,
@@ -378,9 +395,26 @@ static int RSA_eay_public_decrypt(int flen, unsigned char *from,
378 /* do the decrypt */ 395 /* do the decrypt */
379 if ((rsa->_method_mod_n == NULL) && (rsa->flags & RSA_FLAG_CACHE_PUBLIC)) 396 if ((rsa->_method_mod_n == NULL) && (rsa->flags & RSA_FLAG_CACHE_PUBLIC))
380 { 397 {
381 if ((rsa->_method_mod_n=BN_MONT_CTX_new()) != NULL) 398 BN_MONT_CTX* bn_mont_ctx;
382 if (!BN_MONT_CTX_set(rsa->_method_mod_n,rsa->n,ctx)) 399 if ((bn_mont_ctx=BN_MONT_CTX_new()) == NULL)
383 goto err; 400 goto err;
401 if (!BN_MONT_CTX_set(bn_mont_ctx,rsa->n,ctx))
402 {
403 BN_MONT_CTX_free(bn_mont_ctx);
404 goto err;
405 }
406 if (rsa->_method_mod_n == NULL) /* other thread may have finished first */
407 {
408 CRYPTO_w_lock(CRYPTO_LOCK_RSA);
409 if (rsa->_method_mod_n == NULL)
410 {
411 rsa->_method_mod_n = bn_mont_ctx;
412 bn_mont_ctx = NULL;
413 }
414 CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
415 }
416 if (bn_mont_ctx)
417 BN_MONT_CTX_free(bn_mont_ctx);
384 } 418 }
385 419
386 if (!meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx, 420 if (!meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx,
@@ -433,20 +467,53 @@ static int RSA_eay_mod_exp(BIGNUM *r0, BIGNUM *I, RSA *rsa)
433 { 467 {
434 if (rsa->_method_mod_p == NULL) 468 if (rsa->_method_mod_p == NULL)
435 { 469 {
436 if ((rsa->_method_mod_p=BN_MONT_CTX_new()) != NULL) 470 BN_MONT_CTX* bn_mont_ctx;
437 if (!BN_MONT_CTX_set(rsa->_method_mod_p,rsa->p, 471 if ((bn_mont_ctx=BN_MONT_CTX_new()) == NULL)
438 ctx)) 472 goto err;
439 goto err; 473 if (!BN_MONT_CTX_set(bn_mont_ctx,rsa->p,ctx))
474 {
475 BN_MONT_CTX_free(bn_mont_ctx);
476 goto err;
477 }
478 if (rsa->_method_mod_p == NULL) /* other thread may have finished first */
479 {
480 CRYPTO_w_lock(CRYPTO_LOCK_RSA);
481 if (rsa->_method_mod_p == NULL)
482 {
483 rsa->_method_mod_p = bn_mont_ctx;
484 bn_mont_ctx = NULL;
485 }
486 CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
487 }
488 if (bn_mont_ctx)
489 BN_MONT_CTX_free(bn_mont_ctx);
440 } 490 }
491
441 if (rsa->_method_mod_q == NULL) 492 if (rsa->_method_mod_q == NULL)
442 { 493 {
443 if ((rsa->_method_mod_q=BN_MONT_CTX_new()) != NULL) 494 BN_MONT_CTX* bn_mont_ctx;
444 if (!BN_MONT_CTX_set(rsa->_method_mod_q,rsa->q, 495 if ((bn_mont_ctx=BN_MONT_CTX_new()) == NULL)
445 ctx)) 496 goto err;
446 goto err; 497 if (!BN_MONT_CTX_set(bn_mont_ctx,rsa->q,ctx))
498 {
499 BN_MONT_CTX_free(bn_mont_ctx);
500 goto err;
501 }
502 if (rsa->_method_mod_q == NULL) /* other thread may have finished first */
503 {
504 CRYPTO_w_lock(CRYPTO_LOCK_RSA);
505 if (rsa->_method_mod_q == NULL)
506 {
507 rsa->_method_mod_q = bn_mont_ctx;
508 bn_mont_ctx = NULL;
509 }
510 CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
511 }
512 if (bn_mont_ctx)
513 BN_MONT_CTX_free(bn_mont_ctx);
447 } 514 }
448 } 515 }
449 516
450 if (!BN_mod(&r1,I,rsa->q,ctx)) goto err; 517 if (!BN_mod(&r1,I,rsa->q,ctx)) goto err;
451 if (!meth->bn_mod_exp(&m1,&r1,rsa->dmq1,rsa->q,ctx, 518 if (!meth->bn_mod_exp(&m1,&r1,rsa->dmq1,rsa->q,ctx,
452 rsa->_method_mod_q)) goto err; 519 rsa->_method_mod_q)) goto err;