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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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);
}
Beispiel #5
0
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;
}
Beispiel #6
0
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)
Beispiel #8
0
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);
}
Beispiel #9
0
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;            
}
Beispiel #10
0
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;
}
Beispiel #11
0
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;
} 
Beispiel #12
0
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()));
}
Beispiel #13
0
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;
}
Beispiel #14
0
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;            
}
Beispiel #15
0
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);*/
}
Beispiel #16
0
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;
}
Beispiel #17
0
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 );
}
Beispiel #19
0
void ZZn2::get(Big& x,Big& y)  const
{{redc(fn.a,x.getbig()); redc(fn.b,y.getbig()); }} 
Beispiel #20
0
int EC2::get(Big& x) const   
        {return epoint2_get(p,x.getbig(),x.getbig());}
Beispiel #21
0
void EC2::getx(Big& x) const
        {epoint2_getxyz(p,x.getbig(),NULL,NULL);}
Beispiel #22
0
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;}
Beispiel #23
0
ZZn pow( const ZZn& b1, const Big& b2)
{ZZn z; nres_powmod(b1.fn,b2.getbig(),z.fn);return z;}
Beispiel #24
0
void EC2::getxy(Big& x,Big &y) const
        {epoint2_getxyz(p,x.getbig(),y.getbig(),NULL);}
Beispiel #25
0
void EC2::getxyz(Big& x,Big &y,Big &z) const
        {epoint2_getxyz(p,x.getbig(),y.getbig(),z.getbig());}
Beispiel #26
0
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;
}
Beispiel #27
0
EC2 operator*(const Big& e,const EC2& b)
{
    EC2 t;
    ecurve2_mult(e.getbig(),b.p,t.p);
    return t;
}
Beispiel #28
0
int ECn::get(Big& x,Big& y) const 
        {return epoint_get(p,x.getbig(),y.getbig());}
Beispiel #29
0
void ZZn2::get(Big& x) const
{{redc(fn.a,x.getbig());} }
Beispiel #30
0
ECn operator*(const Big& e,const ECn& b)
{
    ECn t;
    ecurve_mult(e.getbig(),b.p,t.p);
    return t;
}