summaryrefslogtreecommitdiffstats
path: root/crypto/rsa/rsa_x931g.c
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2015-03-11 17:43:38 +0000
committerMatt Caswell <matt@openssl.org>2015-03-12 09:26:14 +0000
commit007fd1404fc7a2ed33f6108bc3859d3814b44224 (patch)
tree8a39f7f9fcabcc5232783b4fbd980e1642f42eb1 /crypto/rsa/rsa_x931g.c
parentd813f9eb383a93e472e69750cd1edbb170205ad2 (diff)
Fix RSA_X931_derive_ex
In the RSA_X931_derive_ex a call to BN_CTX_new is made. This can return NULL on error. However the return value is not tested until *after* it is derefed! Also at the top of the function a test is made to ensure that |rsa| is not NULL. If it is we go to the "err" label. Unfortunately the error handling code deref's rsa. Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto/rsa/rsa_x931g.c')
-rw-r--r--crypto/rsa/rsa_x931g.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/crypto/rsa/rsa_x931g.c b/crypto/rsa/rsa_x931g.c
index 74bf197e37..5991615784 100644
--- a/crypto/rsa/rsa_x931g.c
+++ b/crypto/rsa/rsa_x931g.c
@@ -72,14 +72,15 @@ int RSA_X931_derive_ex(RSA *rsa, BIGNUM *p1, BIGNUM *p2, BIGNUM *q1,
{
BIGNUM *r0 = NULL, *r1 = NULL, *r2 = NULL, *r3 = NULL;
BN_CTX *ctx = NULL, *ctx2 = NULL;
+ int ret = 0;
if (!rsa)
goto err;
ctx = BN_CTX_new();
- BN_CTX_start(ctx);
if (!ctx)
goto err;
+ BN_CTX_start(ctx);
r0 = BN_CTX_get(ctx);
r1 = BN_CTX_get(ctx);
@@ -176,6 +177,7 @@ int RSA_X931_derive_ex(RSA *rsa, BIGNUM *p1, BIGNUM *p2, BIGNUM *q1,
/* calculate inverse of q mod p */
rsa->iqmp = BN_mod_inverse(NULL, rsa->q, rsa->p, ctx2);
+ ret = 1;
err:
if (ctx) {
BN_CTX_end(ctx);
@@ -183,11 +185,8 @@ int RSA_X931_derive_ex(RSA *rsa, BIGNUM *p1, BIGNUM *p2, BIGNUM *q1,
}
if (ctx2)
BN_CTX_free(ctx2);
- /* If this is set all calls successful */
- if (rsa->iqmp != NULL)
- return 1;
- return 0;
+ return ret;
}