summaryrefslogtreecommitdiffstats
path: root/crypto/openssl/crypto/bn/bn_recp.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/openssl/crypto/bn/bn_recp.c')
-rw-r--r--crypto/openssl/crypto/bn/bn_recp.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/crypto/openssl/crypto/bn/bn_recp.c b/crypto/openssl/crypto/bn/bn_recp.c
index ef5fdd4..2e8efb8 100644
--- a/crypto/openssl/crypto/bn/bn_recp.c
+++ b/crypto/openssl/crypto/bn/bn_recp.c
@@ -94,7 +94,7 @@ void BN_RECP_CTX_free(BN_RECP_CTX *recp)
int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *d, BN_CTX *ctx)
{
if (!BN_copy(&(recp->N),d)) return 0;
- if (!BN_zero(&(recp->Nr))) return 0;
+ BN_zero(&(recp->Nr));
recp->num_bits=BN_num_bits(d);
recp->shift=0;
return(1);
@@ -123,6 +123,7 @@ int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y,
ret = BN_div_recp(NULL,r,ca,recp,ctx);
err:
BN_CTX_end(ctx);
+ bn_check_top(r);
return(ret);
}
@@ -147,7 +148,7 @@ int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m,
if (BN_ucmp(m,&(recp->N)) < 0)
{
- if (!BN_zero(d)) return 0;
+ BN_zero(d);
if (!BN_copy(r,m)) return 0;
BN_CTX_end(ctx);
return(1);
@@ -190,7 +191,7 @@ int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m,
{
if (j++ > 2)
{
- BNerr(BN_F_BN_MOD_MUL_RECIPROCAL,BN_R_BAD_RECIPROCAL);
+ BNerr(BN_F_BN_DIV_RECP,BN_R_BAD_RECIPROCAL);
goto err;
}
if (!BN_usub(r,r,&(recp->N))) goto err;
@@ -203,6 +204,8 @@ int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m,
ret=1;
err:
BN_CTX_end(ctx);
+ bn_check_top(dv);
+ bn_check_top(rem);
return(ret);
}
@@ -214,17 +217,18 @@ err:
int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx)
{
int ret= -1;
- BIGNUM t;
+ BIGNUM *t;
- BN_init(&t);
+ BN_CTX_start(ctx);
+ if((t = BN_CTX_get(ctx)) == NULL) goto err;
- if (!BN_zero(&t)) goto err;
- if (!BN_set_bit(&t,len)) goto err;
+ if (!BN_set_bit(t,len)) goto err;
- if (!BN_div(r,NULL,&t,m,ctx)) goto err;
+ if (!BN_div(r,NULL,t,m,ctx)) goto err;
ret=len;
err:
- BN_free(&t);
+ bn_check_top(r);
+ BN_CTX_end(ctx);
return(ret);
}
OpenPOWER on IntegriCloud