Add "dif" variable to clean up the loop implementations.
Submitted by: Nils Larsch
This commit is contained in:
parent
a9f2330f43
commit
380e145daf
@ -64,7 +64,7 @@
|
|||||||
int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
||||||
{
|
{
|
||||||
const BIGNUM *tmp;
|
const BIGNUM *tmp;
|
||||||
int a_neg = a->neg;
|
int a_neg = a->neg, ret;
|
||||||
|
|
||||||
bn_check_top(a);
|
bn_check_top(a);
|
||||||
bn_check_top(b);
|
bn_check_top(b);
|
||||||
@ -95,21 +95,17 @@ int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
|||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!BN_uadd(r,a,b)) return(0);
|
ret = BN_uadd(r,a,b);
|
||||||
if (a_neg) /* both are neg */
|
r->neg = a_neg;
|
||||||
r->neg=1;
|
|
||||||
else
|
|
||||||
r->neg=0;
|
|
||||||
bn_check_top(r);
|
bn_check_top(r);
|
||||||
return(1);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* unsigned add of b to a, r must be large enough */
|
/* unsigned add of b to a */
|
||||||
int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
||||||
{
|
{
|
||||||
register int i;
|
int max,min,dif;
|
||||||
int max,min;
|
BN_ULONG *ap,*bp,*rp,carry,t1,t2;
|
||||||
BN_ULONG *ap,*bp,*rp,carry,t1;
|
|
||||||
const BIGNUM *tmp;
|
const BIGNUM *tmp;
|
||||||
|
|
||||||
bn_check_top(a);
|
bn_check_top(a);
|
||||||
@ -117,11 +113,12 @@ int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
|||||||
|
|
||||||
if (a->top < b->top)
|
if (a->top < b->top)
|
||||||
{ tmp=a; a=b; b=tmp; }
|
{ tmp=a; a=b; b=tmp; }
|
||||||
max=a->top;
|
max = a->top;
|
||||||
min=b->top;
|
min = b->top;
|
||||||
|
dif = max - min;
|
||||||
|
|
||||||
if (bn_wexpand(r,max+1) == NULL)
|
if (bn_wexpand(r,max+1) == NULL)
|
||||||
return(0);
|
return 0;
|
||||||
|
|
||||||
r->top=max;
|
r->top=max;
|
||||||
|
|
||||||
@ -129,47 +126,46 @@ int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
|||||||
ap=a->d;
|
ap=a->d;
|
||||||
bp=b->d;
|
bp=b->d;
|
||||||
rp=r->d;
|
rp=r->d;
|
||||||
carry=0;
|
|
||||||
|
|
||||||
carry=bn_add_words(rp,ap,bp,min);
|
carry=bn_add_words(rp,ap,bp,min);
|
||||||
rp+=min;
|
rp+=min;
|
||||||
ap+=min;
|
ap+=min;
|
||||||
bp+=min;
|
bp+=min;
|
||||||
i=min;
|
|
||||||
|
|
||||||
if (carry)
|
if (carry)
|
||||||
{
|
{
|
||||||
while (i < max)
|
while (dif)
|
||||||
{
|
{
|
||||||
i++;
|
dif--;
|
||||||
t1= *(ap++);
|
t1 = *(ap++);
|
||||||
if ((*(rp++)=(t1+1)&BN_MASK2) >= t1)
|
t2 = (t1+1) & BN_MASK2;
|
||||||
|
*(rp++) = t2;
|
||||||
|
if (t2)
|
||||||
{
|
{
|
||||||
carry=0;
|
carry=0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((i >= max) && carry)
|
if (carry)
|
||||||
{
|
{
|
||||||
*(rp++)=1;
|
/* carry != 0 => dif == 0 */
|
||||||
|
*rp = 1;
|
||||||
r->top++;
|
r->top++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (rp != ap)
|
if (dif && rp != ap)
|
||||||
{
|
while (dif--)
|
||||||
for (; i<max; i++)
|
/* copy remaining words if ap != rp */
|
||||||
*(rp++)= *(ap++);
|
*(rp++) = *(ap++);
|
||||||
}
|
|
||||||
/* memcpy(rp,ap,sizeof(*ap)*(max-i));*/
|
|
||||||
r->neg = 0;
|
r->neg = 0;
|
||||||
bn_check_top(r);
|
bn_check_top(r);
|
||||||
return(1);
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* unsigned subtraction of b from a, a must be larger than b. */
|
/* unsigned subtraction of b from a, a must be larger than b. */
|
||||||
int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
||||||
{
|
{
|
||||||
int max,min;
|
int max,min,dif;
|
||||||
register BN_ULONG t1,t2,*ap,*bp,*rp;
|
register BN_ULONG t1,t2,*ap,*bp,*rp;
|
||||||
int i,carry;
|
int i,carry;
|
||||||
#if defined(IRIX_CC_BUG) && !defined(LINT)
|
#if defined(IRIX_CC_BUG) && !defined(LINT)
|
||||||
@ -179,14 +175,16 @@ int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
|||||||
bn_check_top(a);
|
bn_check_top(a);
|
||||||
bn_check_top(b);
|
bn_check_top(b);
|
||||||
|
|
||||||
if (a->top < b->top) /* hmm... should not be happening */
|
max = a->top;
|
||||||
|
min = b->top;
|
||||||
|
dif = max - min;
|
||||||
|
|
||||||
|
if (dif < 0) /* hmm... should not be happening */
|
||||||
{
|
{
|
||||||
BNerr(BN_F_BN_USUB,BN_R_ARG2_LT_ARG3);
|
BNerr(BN_F_BN_USUB,BN_R_ARG2_LT_ARG3);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
max=a->top;
|
|
||||||
min=b->top;
|
|
||||||
if (bn_wexpand(r,max) == NULL) return(0);
|
if (bn_wexpand(r,max) == NULL) return(0);
|
||||||
|
|
||||||
ap=a->d;
|
ap=a->d;
|
||||||
@ -195,7 +193,7 @@ int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
|||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
carry=0;
|
carry=0;
|
||||||
for (i=0; i<min; i++)
|
for (i = min; i != 0; i--)
|
||||||
{
|
{
|
||||||
t1= *(ap++);
|
t1= *(ap++);
|
||||||
t2= *(bp++);
|
t2= *(bp++);
|
||||||
@ -219,17 +217,20 @@ int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
|||||||
ap+=min;
|
ap+=min;
|
||||||
bp+=min;
|
bp+=min;
|
||||||
rp+=min;
|
rp+=min;
|
||||||
i=min;
|
|
||||||
#endif
|
#endif
|
||||||
if (carry) /* subtracted */
|
if (carry) /* subtracted */
|
||||||
{
|
{
|
||||||
while (i < max)
|
if (!dif)
|
||||||
|
/* error: a < b */
|
||||||
|
return 0;
|
||||||
|
while (dif)
|
||||||
{
|
{
|
||||||
i++;
|
dif--;
|
||||||
t1= *(ap++);
|
t1 = *(ap++);
|
||||||
t2=(t1-1)&BN_MASK2;
|
t2 = (t1-1)&BN_MASK2;
|
||||||
*(rp++)=t2;
|
*(rp++) = t2;
|
||||||
if (t1 > t2) break;
|
if (t1)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
@ -239,13 +240,13 @@ int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
|
|||||||
{
|
{
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (i++ >= max) break;
|
if (!dif--) break;
|
||||||
rp[0]=ap[0];
|
rp[0]=ap[0];
|
||||||
if (i++ >= max) break;
|
if (!dif--) break;
|
||||||
rp[1]=ap[1];
|
rp[1]=ap[1];
|
||||||
if (i++ >= max) break;
|
if (!dif--) break;
|
||||||
rp[2]=ap[2];
|
rp[2]=ap[2];
|
||||||
if (i++ >= max) break;
|
if (!dif--) break;
|
||||||
rp[3]=ap[3];
|
rp[3]=ap[3];
|
||||||
rp+=4;
|
rp+=4;
|
||||||
ap+=4;
|
ap+=4;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user