if(data) data[0]=b;
if(b) BN_mask_bits(B,wordsize<<6);
cycles=501+(8*wordsize+3)/5*5-6;
- }
break;
+ }
+ case 0x2a:
+ {
+ bool b=ModSub(B,B,D);
+ if(data) data[0]=b;
+ BN_zero(C);
+ break;
+ }
case 0x30:
BN_sqr(D,B,ctx);
BN_rshift(C,D,wordsize<<6);
AddCycles(MapCycles());
break;
case 0x29:
- GetMem(HILO(0x44),tmp,dl,0);
+ case 0x2a:
DoMap(f,tmp);
Set(0x4b,tmp[0]);
AddCycles(MapCycles());
wordsize=DEF_WORDSIZE;
}
-void cMapMath::ModAdd(BIGNUM *r, BIGNUM *a, BIGNUM *b, BIGNUM *d)
+bool cMapMath::ModAdd(BIGNUM *r, BIGNUM *a, BIGNUM *b, BIGNUM *d)
{
BN_add(r,a,b);
- if(BN_cmp(r,d)>=0) BN_sub(r,r,d);
+ bool ret=false;
+ if(BN_cmp(r,d)>=0) {
+ BN_sub(r,r,d);
+ ret=true;
+ }
BN_mask_bits(r,wordsize<<6);
+ return ret;
}
-void cMapMath::ModSub(BIGNUM *r, BIGNUM *d, BIGNUM *b)
+bool cMapMath::ModSub(BIGNUM *r, BIGNUM *d, BIGNUM *b)
{
cBN p;
+ bool ret=BN_cmp(d,b)<0;
BN_set_bit(p,wordsize<<6);
BN_mod_sub(r,d,b,p,ctx);
BN_mask_bits(r,wordsize<<6);
+ return ret;
}
void cMapMath::MakeJ0(BIGNUM *j, BIGNUM *d, int bits)
SHA_CTX sctx;
// stateless
void MakeJ0(BIGNUM *j, BIGNUM *d, int bits=64);
- void ModAdd(BIGNUM *r, BIGNUM *a, BIGNUM *b, BIGNUM *d);
- void ModSub(BIGNUM *r, BIGNUM *d, BIGNUM *b);
+ bool ModAdd(BIGNUM *r, BIGNUM *a, BIGNUM *b, BIGNUM *d);
+ bool ModSub(BIGNUM *r, BIGNUM *d, BIGNUM *b);
void MonMul(BIGNUM *o, BIGNUM *a, BIGNUM *b, BIGNUM *c, BIGNUM *d, BIGNUM *j, int w);
void MonStart(int w);
void MonLoop(BIGNUM *o, BIGNUM *a, BIGNUM *b, BIGNUM *c, BIGNUM *d, BIGNUM *j);