Fix modes.h so that indent doesn't complain
[openssl.git] / crypto / bn / bn_shift.c
index 70f785ea185b8841e415d33b385bf96de95535be..a6fca2c424f0c7e77110d66fe740500ce4563af1 100644 (file)
@@ -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,35 +92,43 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a)
                *rp=1;
                r->top++;
                }
+       bn_check_top(r);
        return(1);
        }
 
 int BN_rshift1(BIGNUM *r, const BIGNUM *a)
        {
        BN_ULONG *ap,*rp,t,c;
-       int i;
+       int i,j;
+
+       bn_check_top(r);
+       bn_check_top(a);
 
        if (BN_is_zero(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,a->top) == NULL) return(0);
-               r->top=a->top;
+               if (bn_wexpand(r,j) == NULL) return(0);
                r->neg=a->neg;
                }
-       ap=a->d;
        rp=r->d;
-       c=0;
-       for (i=a->top-1; i>=0; i--)
+       t=ap[--i];
+       c=(t&1)?BN_TBIT:0;
+       if (t>>=1) rp[i]=t;
+       while (i>0)
                {
-               t=ap[i];
+               t=ap[--i];
                rp[i]=((t>>1)&BN_MASK2)|c;
                c=(t&1)?BN_TBIT:0;
                }
-       bn_fix_top(r);
+       r->top=j;
+       bn_check_top(r);
        return(1);
        }
 
@@ -127,6 +138,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 +163,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,18 +174,22 @@ 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;
-       if (nw > a->top || a->top == 0)
+       if (nw >= a->top || a->top == 0)
                {
                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,a->top-nw+1) == NULL) return(0);
+               if (bn_wexpand(r,i) == NULL) return(0);
                }
        else
                {
@@ -181,25 +200,24 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
        f= &(a->d[nw]);
        t=r->d;
        j=a->top-nw;
-       r->top=j;
+       r->top=i;
 
        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++);
                        *(t++) =(tmp|(l<<lb))&BN_MASK2;
                        }
-               *(t++) =(l>>rb)&BN_MASK2;
+               if ((l = (l>>rb)&BN_MASK2)) *(t) = l;
                }
-       *t=0;
-       bn_fix_top(r);
+       bn_check_top(r);
        return(1);
        }