GF2m4x pow(const GF2m4x& a,const Big& k) { int i,j,nb,n,nbw,nzs; GF2m4x u,u2,t[16]; if (k.iszero()) return (GF2m4x)1; u=a; if (k.isone()) return u; // // Prepare table for windowing // u2=(u*u); t[0]=u; for (i=1;i<16;i++) t[i]=u2*t[i-1]; // Left to right method - with windows nb=bits(k); if (nb>1) for (i=nb-2;i>=0;) { n=window(k,i,&nbw,&nzs,5); for (j=0;j<nbw;j++) u*=u; if (n>0) u*=t[n/2]; i-=nbw; if (nzs) { for (j=0;j<nzs;j++) u*=u; i-=nzs; } } return u; }
BOOL irreducible(int m,int a,int b,int c) { GF2m w4,w5,modulo; Big modulus; get_mip()->M=m; get_mip()->AA=a; get_mip()->BB=b; get_mip()->CC=c; if (b==0) modulus=pow((Big)2,m)+pow((Big)2,a)+1; else modulus=pow((Big)2,m)+pow((Big)2,a)+pow((Big)2,b)+pow((Big)2,c)+1; copy(modulus.getbig(),get_mip()->modulus); copy(modulus.getbig(),getbig(modulo)); w4=2; for (int i=1;i<=m/2;i++) { w4*=w4; w5=w4+2; if (gcd(w5,modulo)!=1) return FALSE; } return TRUE; }
ECn2 mul(Big& a,ECn2& P,Big& b,ECn2& Q) { ECn2 R; ecn2_mul2_jsf(a.getbig(),&(P.fn),b.getbig(),&(Q.fn),&(R.fn)); R.norm(); return R; }
void BaseOT::ByteArrayToPoint(EC2 *point, int field_size, BYTE* pBufIdx) { int itmp; Big bigtmp; itmp = (int) (pBufIdx[0]); bytes_to_big(field_size, (const char*) pBufIdx + 1, bigtmp.getbig()); *point = EC2(bigtmp, itmp); }
Big Crt::eval(Big *u) { Big x; big *b=(big *)mr_alloc(bc.NP,sizeof(big)); for (int i=0;i<bc.NP;i++) b[i]=u[i].getbig(); crt(&bc,b,x.getbig()); mr_free(b); return x; }
Big Big::operator-(const Big& b)const { Big te; for(int i=0;i<6;i++) { te.num[i] = num[i] - b.num[i]; } te.check(); return te; }
Big operator+(const Big & lhs, const int & rhs) { std::cout << "*****在operator+里*****" << std::endl; Big b(lhs); b.setX(lhs.getX() + rhs); b.setY(lhs.getY() + rhs); std::cout << "*****operator+完成*****" << std::endl; return b; }//operator+(Big, int)
void BaseOT::PointToByteArray(BYTE* pBufIdx, int field_size, ECn &point) { int itmp; Big bigtmp; //compress to x-point and y-bit and convert to byte array itmp = point.get(bigtmp); //first store the y-bit pBufIdx[0] = (BYTE) (itmp & 0x01); //then store the x-coordinate (sec-param/8 + 4 byte size) big_to_bytes(field_size, bigtmp.getbig(), (char*) pBufIdx+1, true); }
BOOL power_tate(ECn& P,ECn4 Q,Big& q,Big *cf,ZZn2 &Fr,Big &e,ZZn4& r) { int i,nb; ECn A; ZZn8 w,res,a[4]; ZZn4 Qx,Qy; ZZn2 x,y; Big carry,ex[4]; Big p=get_modulus(); Q.get(Qx,Qy); Qx=txd(Qx); Qy=txd(txd(Qy)); res=1; /* Left to right method */ A=P; nb=bits(q); for (i=nb-2;i>=0;i--) { res*=res; res*=g(A,A,Qx,Qy); if (bit(q,i)) res*=g(A,P,Qx,Qy); } if (!A.iszero() || res.iszero()) return FALSE; w=res; w.powq(Fr); w.powq(Fr); // ^(p^4-1) w.powq(Fr); w.powq(Fr); res=w/res; res.mark_as_unitary(); a[3]=res; a[2]=a[3]; a[2].powq(Fr); a[1]=a[2]; a[1].powq(Fr); a[0]=a[1]; a[0].powq(Fr); if (e.isone()) for (i=0;i<4;i++) ex[i]=cf[i]; else { // cf *= e carry=0; for (i=3;i>=0;i--) carry=mad(cf[i],e,carry,p,ex[i]); } res=pow(4,a,ex); r=real(res); // compression // r=powl(real(res),cf); // ^(p*p*p*p+1)/q if (r.isunity()) return FALSE; return TRUE; }
int BigTochar (Big &x, char *c, int s) { int len = 0; int totlen = sizeof (int); // format: 4 bytes length, followed by the big if (s <= sizeof (int)) return -1; // Code assumes epoint contains either nulls or bigs > 0 s -= sizeof (int); c += sizeof (int); if (x.iszero()) { len = 0; } else { len = to_binary (x, s, c, FALSE); } if (len < 0) return -1; memcpy ((char *)(c - sizeof(int)), (void *)&len, sizeof (int)); totlen += len; s -= len; c += len; // cout << "Len1 " << len << " x " << x; return totlen; }
ostream& operator<<(ostream& s,const Ps_Big& p) { BOOL first=TRUE; Big a; term_ps_big *ptr=p.start; int pw; if (ptr==NULL) { s << "0"; return s; } while (ptr!=NULL) { a=ptr->an; if (a.iszero()) { ptr=ptr->next; continue; } if (a < (Big)0) { a=(-a); s << " - "; } else if (!first) s << " + "; first=FALSE; pw=ptr->n*p.pwr-p.offset; if (pw==0) { s << a; ptr=ptr->next; continue; } if (a==1) s << "x"; else s << a << "*x"; if (pw!=1) s << "^" << pw; ptr=ptr->next; } return s; }
void Widget::on_pushButton_2_clicked() { QByteArray ba=ui->textEdit_5->toPlainText().toLatin1(); char *text=ba.data(); //miracl *mip=&precision; mip->IOBASE=256; c=pow((Big)text,e,n); // c=m^e mod n mip->IOBASE=16; //cout << c << endl; ui->textEdit_6->setText(bs(c,c.len())); }
BOOL rever(Big &x,Big &y) { /* reverse digits of x into y * * returns TRUE if x is palindromic */ int m,n; int i,k,swaps; BOOL palin; y=x; palin=TRUE; k=y.len()+1; swaps=k/2; for (i=1;i<=swaps;i++) { k--; m=y.get(k); n=y.get(i); if (m!=n) palin=FALSE; y.set(i,m); y.set(k,n); } return palin; }
BOOL power_tate(ECn2& P,ECn Q,Big& T,Big *cf,ZZn2 &Fr,Big &e,ZZn2& r) { int i,nb; ECn2 A; ZZn4 w,res,a[2]; ZZn Qx,Qy; Big carry,ex[2],p=get_modulus(); extract(Q,Qx,Qy); res=1; /* Left to right method */ A=P; nb=bits(T); for (i=nb-2;i>=0;i--) { res*=res; res*=g(A,A,Qx,Qy); if (bit(T,i)) res*=g(A,P,Qx,Qy); } // if (!A.iszero() || res.iszero()) return FALSE; w=res; w.powq(Fr); w.powq(Fr); // ^(p^2-1) res=w/res; res.mark_as_unitary(); if (e.isone()) { ex[0]=cf[0]; ex[1]=cf[1]; } else { // cf *= e carry=mad(cf[1],e,(Big)0,p,ex[1]); mad(cf[0],e,carry,p,ex[0]); } a[0]=a[1]=res; a[0].powq(Fr); res=pow(2,a,ex); r=real(res); // compression if (r.isunity()) return FALSE; return TRUE; }
void Widget::on_pushButton_clicked() { //miracl *mip=&precision; mip->IOBASE=16; mip->IOBSIZ=3000; //set max size of iobuffer Big phi=0; int bits=ui->lineEdit->text().toInt(); e=65537; n=0; for(;;) { p=rand(bits,2); // random 512 bit number if (p%2==0) p+=1; while (!prime(p)) p+=2; q=rand(bits,2); if (q%2==0) q+=1; while (!prime(q)) q+=2; n=p*q; phi=(p-1)*(q-1); if (gcd(e,phi)!=1) continue; d=inverse(e,phi); break; } inv=inverse(p,q); ui->textEdit_2->setText(bs(p,p.len())); ui->textEdit_3->setText(bs(q,q.len())); ui->textEdit->setText(bs(n,n.len())); ui->textEdit_4->setText(bs(d,d.len())); /*QString s=QString::number(q.len(),10); QTextStream cout(stdout,QIODevice::WriteOnly); cout<<s<<endl; ui->textEdit->setText(s);*/ }
ZZn2 powu(const ZZn2& x,const Big& e) { int i,j,nb,n,nbw,nzs; ZZn2 u,u2,t[11]; Big k,k3; if (e.iszero()) return (ZZn2)one(); k=e; if (e<0) k=-k; u=x; if (k.isone()) { if (e<0) u=conj(u); return u; } // // Prepare table for windowing // k3=3*k; u2=(u*u); t[0]=u; for (i=1;i<=10;i++) t[i]=u2*t[i-1]; nb=bits(k3); for (i=nb-2;i>=1;) { n=naf_window(k,k3,i,&nbw,&nzs,11); for (j=0;j<nbw;j++) u*=u; if (n>0) u*=t[n/2]; if (n<0) u*=conj(t[(-n)/2]); i-=nbw; if (nzs) { for (j=0;j<nzs;j++) u*=u; i-=nzs; } } if (e<0) u=conj(u); return u; }
void SamplePointFromBytes(EC2 *point, BYTE* input, int inbytelen) { Big bigtmp; bytes_to_big (inbytelen, (const char*) input, bigtmp.getbig());//(bigtmp, inbytelen, input); premult(bigtmp.getbig(), MAXMSGSAMPLE, bigtmp.getbig()); for(int i = 0; i < MAXMSGSAMPLE; i++) { *point = EC2(bigtmp, 0); if(!point_at_infinity(point->get_point())) return; *point = EC2(bigtmp, 1); if(!point_at_infinity(point->get_point())) return; incr(bigtmp.getbig(), 1, bigtmp.getbig()); } cerr << "Error while sampling point, exiting!" << endl; exit(0); }
CvSakke::CMiracl::CMiracl( sak_domain& aSakkeDomain ) //about to be deprecated { #ifdef MR_GENERIC_AND_STATIC m_pMip = mirsys( &m_instance, aSakkeDomain.nibbles, 16 ); #else m_pMip = mirsys( aSakkeDomain.nibbles, 16 ); #endif Big a = from_binary( FS, aSakkeDomain.A ); Big b = from_binary( FS, aSakkeDomain.B ); Big q = from_binary( FS, aSakkeDomain.Q ); m_pMip->ERCON=TRUE; m_pMip->TWIST = MR_SEXTIC_D; if ( ( aSakkeDomain.flags & 1 ) == 1 ) m_pMip->TWIST = MR_SEXTIC_M; ecurve_init( _MIPP_ a.getbig(), b.getbig(), q.getbig(), MR_PROJECTIVE ); }
void ZZn2::get(Big& x,Big& y) const {{redc(fn.a,x.getbig()); redc(fn.b,y.getbig()); }}
int EC2::get(Big& x) const {return epoint2_get(p,x.getbig(),x.getbig());}
void EC2::getx(Big& x) const {epoint2_getxyz(p,x.getbig(),NULL,NULL);}
ZZn pow( const ZZn& b1, const Big& b2, const ZZn& b3,const Big& b4) {ZZn z; nres_powmod2(b1.fn,b2.getbig(),b3.fn,b4.getbig(),z.fn); return z;}
ZZn pow( const ZZn& b1, const Big& b2) {ZZn z; nres_powmod(b1.fn,b2.getbig(),z.fn);return z;}
void EC2::getxy(Big& x,Big &y) const {epoint2_getxyz(p,x.getbig(),y.getbig(),NULL);}
void EC2::getxyz(Big& x,Big &y,Big &z) const {epoint2_getxyz(p,x.getbig(),y.getbig(),z.getbig());}
EC2 mul(const Big& e1,const EC2& p1,const Big& e2,const EC2& p2) { EC2 t; ecurve2_mult2(e1.getbig(),p1.get_point(),e2.getbig(),p2.get_point(),t.get_point()); return t; }
EC2 operator*(const Big& e,const EC2& b) { EC2 t; ecurve2_mult(e.getbig(),b.p,t.p); return t; }
int ECn::get(Big& x,Big& y) const {return epoint_get(p,x.getbig(),y.getbig());}
void ZZn2::get(Big& x) const {{redc(fn.a,x.getbig());} }
ECn operator*(const Big& e,const ECn& b) { ECn t; ecurve_mult(e.getbig(),b.p,t.p); return t; }