Commit 79ba545c authored by Andy Polyakov's avatar Andy Polyakov
Browse files

bn_shift.c: minimize reallocations, which allows BN_FLG_STATIC_DATA to

be shifted in specific cases.
parent 993adc05
Loading
Loading
Loading
Loading
+15 −12
Original line number Original line Diff line number Diff line
@@ -99,7 +99,7 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a)
int BN_rshift1(BIGNUM *r, const BIGNUM *a)
int BN_rshift1(BIGNUM *r, const BIGNUM *a)
	{
	{
	BN_ULONG *ap,*rp,t,c;
	BN_ULONG *ap,*rp,t,c;
	int i;
	int i,j;


	bn_check_top(r);
	bn_check_top(r);
	bn_check_top(a);
	bn_check_top(a);
@@ -109,22 +109,25 @@ int BN_rshift1(BIGNUM *r, const BIGNUM *a)
		BN_zero(r);
		BN_zero(r);
		return(1);
		return(1);
		}
		}
	i = a->top;
	ap= a->d;
	j = i-(ap[i-1]==1);
	if (a != r)
	if (a != r)
		{
		{
		if (bn_wexpand(r,a->top) == NULL) return(0);
		if (bn_wexpand(r,j) == NULL) return(0);
		r->top=a->top;
		r->neg=a->neg;
		r->neg=a->neg;
		}
		}
	ap=a->d;
	rp=r->d;
	rp=r->d;
	c=0;
	t=ap[--i];
	for (i=a->top-1; i>=0; 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;
		rp[i]=((t>>1)&BN_MASK2)|c;
		c=(t&1)?BN_TBIT:0;
		c=(t&1)?BN_TBIT:0;
		}
		}
	bn_correct_top(r);
	r->top=j;
	bn_check_top(r);
	bn_check_top(r);
	return(1);
	return(1);
	}
	}
@@ -182,10 +185,11 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
		BN_zero(r);
		BN_zero(r);
		return(1);
		return(1);
		}
		}
	i = (BN_num_bits(a)-n+(BN_BITS2-1))/BN_BITS2;
	if (r != a)
	if (r != a)
		{
		{
		r->neg=a->neg;
		r->neg=a->neg;
		if (bn_wexpand(r,a->top-nw+1) == NULL) return(0);
		if (bn_wexpand(r,i) == NULL) return(0);
		}
		}
	else
	else
		{
		{
@@ -196,7 +200,7 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
	f= &(a->d[nw]);
	f= &(a->d[nw]);
	t=r->d;
	t=r->d;
	j=a->top-nw;
	j=a->top-nw;
	r->top=j;
	r->top=i;


	if (rb == 0)
	if (rb == 0)
		{
		{
@@ -212,9 +216,8 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
			l= *(f++);
			l= *(f++);
			*(t++) =(tmp|(l<<lb))&BN_MASK2;
			*(t++) =(tmp|(l<<lb))&BN_MASK2;
			}
			}
		*(t++) =(l>>rb)&BN_MASK2;
		if ((l = (l>>rb)&BN_MASK2)) *(t) = l;
		}
		}
	bn_correct_top(r);
	bn_check_top(r);
	bn_check_top(r);
	return(1);
	return(1);
	}
	}