diff options
Diffstat (limited to 'crypto/openssl/crypto/bn/bn_recp.c')
-rw-r--r-- | crypto/openssl/crypto/bn/bn_recp.c | 43 |
1 files changed, 18 insertions, 25 deletions
diff --git a/crypto/openssl/crypto/bn/bn_recp.c b/crypto/openssl/crypto/bn/bn_recp.c index c1b0e23..a8796bd 100644 --- a/crypto/openssl/crypto/bn/bn_recp.c +++ b/crypto/openssl/crypto/bn/bn_recp.c @@ -106,7 +106,8 @@ int BN_mod_mul_reciprocal(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_RECP_CTX *recp, int ret=0; BIGNUM *a; - a= &(ctx->bn[ctx->tos++]); + BN_CTX_start(ctx); + if ((a = BN_CTX_get(ctx)) == NULL) goto err; if (y != NULL) { if (x == y) @@ -120,33 +121,34 @@ int BN_mod_mul_reciprocal(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_RECP_CTX *recp, BN_div_recp(NULL,r,a,recp,ctx); ret=1; err: - ctx->tos--; + BN_CTX_end(ctx); return(ret); } int BN_div_recp(BIGNUM *dv, BIGNUM *rem, BIGNUM *m, BN_RECP_CTX *recp, BN_CTX *ctx) { - int i,j,tos,ret=0,ex; + int i,j,ret=0; BIGNUM *a,*b,*d,*r; - tos=ctx->tos; - a= &(ctx->bn[ctx->tos++]); - b= &(ctx->bn[ctx->tos++]); + BN_CTX_start(ctx); + a=BN_CTX_get(ctx); + b=BN_CTX_get(ctx); if (dv != NULL) d=dv; else - d= &(ctx->bn[ctx->tos++]); + d=BN_CTX_get(ctx); if (rem != NULL) r=rem; else - r= &(ctx->bn[ctx->tos++]); + r=BN_CTX_get(ctx); + if (a == NULL || b == NULL || d == NULL || r == NULL) goto err; if (BN_ucmp(m,&(recp->N)) < 0) { BN_zero(d); BN_copy(r,m); - ctx->tos=tos; + BN_CTX_end(ctx); return(1); } @@ -157,33 +159,24 @@ int BN_div_recp(BIGNUM *dv, BIGNUM *rem, BIGNUM *m, BN_RECP_CTX *recp, */ i=BN_num_bits(m); - j=recp->num_bits*2; - if (j > i) - { - i=j; - ex=0; - } - else - { - ex=(i-j)/2; - } - - j=i/2; + j=recp->num_bits<<1; + if (j>i) i=j; + j>>=1; if (i != recp->shift) recp->shift=BN_reciprocal(&(recp->Nr),&(recp->N), i,ctx); - if (!BN_rshift(a,m,j-ex)) goto err; + if (!BN_rshift(a,m,j)) goto err; if (!BN_mul(b,a,&(recp->Nr),ctx)) goto err; - if (!BN_rshift(d,b,j+ex)) goto err; + if (!BN_rshift(d,b,i-j)) goto err; d->neg=0; if (!BN_mul(b,&(recp->N),d,ctx)) goto err; if (!BN_usub(r,m,b)) goto err; r->neg=0; - j=0; #if 1 + j=0; while (BN_ucmp(r,&(recp->N)) >= 0) { if (j++ > 2) @@ -200,7 +193,7 @@ int BN_div_recp(BIGNUM *dv, BIGNUM *rem, BIGNUM *m, BN_RECP_CTX *recp, d->neg=m->neg^recp->N.neg; ret=1; err: - ctx->tos=tos; + BN_CTX_end(ctx); return(ret); } |