summaryrefslogtreecommitdiff
path: root/deps/openssl/openssl/crypto/bn/bn_shift.c
diff options
context:
space:
mode:
Diffstat (limited to 'deps/openssl/openssl/crypto/bn/bn_shift.c')
-rw-r--r--deps/openssl/openssl/crypto/bn/bn_shift.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/deps/openssl/openssl/crypto/bn/bn_shift.c b/deps/openssl/openssl/crypto/bn/bn_shift.c
index a6fca2c424..c4d301afc4 100644
--- a/deps/openssl/openssl/crypto/bn/bn_shift.c
+++ b/deps/openssl/openssl/crypto/bn/bn_shift.c
@@ -99,7 +99,7 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a)
int BN_rshift1(BIGNUM *r, const BIGNUM *a)
{
BN_ULONG *ap,*rp,t,c;
- int i,j;
+ int i;
bn_check_top(r);
bn_check_top(a);
@@ -109,25 +109,22 @@ int BN_rshift1(BIGNUM *r, const BIGNUM *a)
BN_zero(r);
return(1);
}
- i = a->top;
- ap= a->d;
- j = i-(ap[i-1]==1);
if (a != r)
{
- if (bn_wexpand(r,j) == NULL) return(0);
+ if (bn_wexpand(r,a->top) == NULL) return(0);
+ r->top=a->top;
r->neg=a->neg;
}
+ ap=a->d;
rp=r->d;
- t=ap[--i];
- c=(t&1)?BN_TBIT:0;
- if (t>>=1) rp[i]=t;
- while (i>0)
+ c=0;
+ for (i=a->top-1; i>=0; i--)
{
- t=ap[--i];
+ t=ap[i];
rp[i]=((t>>1)&BN_MASK2)|c;
c=(t&1)?BN_TBIT:0;
}
- r->top=j;
+ bn_correct_top(r);
bn_check_top(r);
return(1);
}
@@ -185,11 +182,10 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
BN_zero(r);
return(1);
}
- i = (BN_num_bits(a)-n+(BN_BITS2-1))/BN_BITS2;
if (r != a)
{
r->neg=a->neg;
- if (bn_wexpand(r,i) == NULL) return(0);
+ if (bn_wexpand(r,a->top-nw+1) == NULL) return(0);
}
else
{
@@ -200,7 +196,7 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
f= &(a->d[nw]);
t=r->d;
j=a->top-nw;
- r->top=i;
+ r->top=j;
if (rb == 0)
{
@@ -216,8 +212,9 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
l= *(f++);
*(t++) =(tmp|(l<<lb))&BN_MASK2;
}
- if ((l = (l>>rb)&BN_MASK2)) *(t) = l;
+ *(t++) =(l>>rb)&BN_MASK2;
}
+ bn_correct_top(r);
bn_check_top(r);
return(1);
}