diff options
author | Andy Polyakov <appro@openssl.org> | 2011-10-17 23:35:00 +0000 |
---|---|---|
committer | Andy Polyakov <appro@openssl.org> | 2011-10-17 23:35:00 +0000 |
commit | 78f288d5c9cf06b6fb648cb770b9058aaaba9d8c (patch) | |
tree | b5a3547f73930576a3fe868b902dd12cdade39e4 /crypto | |
parent | 8329e2e776176ce6ff9d7c48c7182943875065bd (diff) |
bn_mont.c: get corner cases right in updated BN_from_montgomery_word.
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/bn/bn_mont.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/crypto/bn/bn_mont.c b/crypto/bn/bn_mont.c index 5bf1f0213c..e6f6e3f0f8 100644 --- a/crypto/bn/bn_mont.c +++ b/crypto/bn/bn_mont.c @@ -196,9 +196,9 @@ static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont) /* clear the top words of T */ #if 1 for (i=r->top; i<max; i++) /* memset? XXX */ - r->d[i]=0; + rp[i]=0; #else - memset(&(r->d[r->top]),0,(max-r->top)*sizeof(BN_ULONG)); + memset(&(rp[r->top]),0,(max-r->top)*sizeof(BN_ULONG)); #endif r->top=max; @@ -225,10 +225,10 @@ static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont) #else v=bn_mul_add_words(rp,np,nl,(rp[0]*n0)&BN_MASK2); #endif - if ((rp[nl] = (rp[nl]+v+carry)&BN_MASK2) < v) - carry = 1; - else - carry = 0; + v = (v+carry+rp[nl])&BN_MASK2; + carry |= (v != rp[nl]); + carry &= (v <= rp[nl]); + rp[nl]=v; } if (bn_wexpand(ret,nl) == NULL) return(0); |