aboutsummaryrefslogtreecommitdiff
path: root/crypto/openssl/crypto/bn/bn_shift.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/openssl/crypto/bn/bn_shift.c')
-rw-r--r--crypto/openssl/crypto/bn/bn_shift.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/crypto/openssl/crypto/bn/bn_shift.c b/crypto/openssl/crypto/bn/bn_shift.c
index 70f785ea185b..de9312dce231 100644
--- a/crypto/openssl/crypto/bn/bn_shift.c
+++ b/crypto/openssl/crypto/bn/bn_shift.c
@@ -65,6 +65,9 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a)
register BN_ULONG *ap,*rp,t,c;
int i;
+ bn_check_top(r);
+ bn_check_top(a);
+
if (r != a)
{
r->neg=a->neg;
@@ -89,6 +92,7 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a)
*rp=1;
r->top++;
}
+ bn_check_top(r);
return(1);
}
@@ -97,6 +101,9 @@ int BN_rshift1(BIGNUM *r, const BIGNUM *a)
BN_ULONG *ap,*rp,t,c;
int i;
+ bn_check_top(r);
+ bn_check_top(a);
+
if (BN_is_zero(a))
{
BN_zero(r);
@@ -117,7 +124,8 @@ int BN_rshift1(BIGNUM *r, const BIGNUM *a)
rp[i]=((t>>1)&BN_MASK2)|c;
c=(t&1)?BN_TBIT:0;
}
- bn_fix_top(r);
+ bn_correct_top(r);
+ bn_check_top(r);
return(1);
}
@@ -127,6 +135,9 @@ int BN_lshift(BIGNUM *r, const BIGNUM *a, int n)
BN_ULONG *t,*f;
BN_ULONG l;
+ bn_check_top(r);
+ bn_check_top(a);
+
r->neg=a->neg;
nw=n/BN_BITS2;
if (bn_wexpand(r,a->top+nw+1) == NULL) return(0);
@@ -149,7 +160,8 @@ int BN_lshift(BIGNUM *r, const BIGNUM *a, int n)
/* for (i=0; i<nw; i++)
t[i]=0;*/
r->top=a->top+nw+1;
- bn_fix_top(r);
+ bn_correct_top(r);
+ bn_check_top(r);
return(1);
}
@@ -159,6 +171,9 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
BN_ULONG *t,*f;
BN_ULONG l,tmp;
+ bn_check_top(r);
+ bn_check_top(a);
+
nw=n/BN_BITS2;
rb=n%BN_BITS2;
lb=BN_BITS2-rb;
@@ -185,13 +200,13 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
if (rb == 0)
{
- for (i=j+1; i > 0; i--)
+ for (i=j; i != 0; i--)
*(t++)= *(f++);
}
else
{
l= *(f++);
- for (i=1; i<j; i++)
+ for (i=j-1; i != 0; i--)
{
tmp =(l>>rb)&BN_MASK2;
l= *(f++);
@@ -199,7 +214,7 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
}
*(t++) =(l>>rb)&BN_MASK2;
}
- *t=0;
- bn_fix_top(r);
+ bn_correct_top(r);
+ bn_check_top(r);
return(1);
}