Add "dif" variable to clean up the loop implementations.

Submitted by: Nils Larsch
This commit is contained in:
Ulf Möller 2003-12-06 11:55:46 +00:00
parent a9f2330f43
commit 380e145daf

View File

@ -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;