Ejemplo n.º 1
0
/* Multiply P by e in group G2 */
void PAIR_G2mul(ECP2 *P,BIG e)
{
#ifdef USE_GS_G2   /* Well I didn't patent it :) */
    int i,np,nn;
    ECP2 Q[4];
    FP2 X;
    BIG x,y;
    BIG u[4];

    BIG_rcopy(x,CURVE_Fra);
    BIG_rcopy(y,CURVE_Frb);
    FP2_from_BIGs(&X,x,y);

    BIG_rcopy(y,CURVE_Order);
    gs(u,e);


    ECP2_affine(P);

    ECP2_copy(&Q[0],P);
    for (i=1; i<4; i++)
    {
        ECP2_copy(&Q[i],&Q[i-1]);
        ECP2_frob(&Q[i],&X);
    }

    for (i=0; i<4; i++)
    {
        np=BIG_nbits(u[i]);
        BIG_modneg(x,u[i],y);
        nn=BIG_nbits(x);
        if (nn<np)
        {
            BIG_copy(u[i],x);
            ECP2_neg(&Q[i]);
        }
    }

    ECP2_mul4(P,Q,u);

#else
    ECP2_mul(P,e);
#endif
}
Ejemplo n.º 2
0
/* needed for SOK */
static void mapit2(octet *h,ECP2 *Q)
{
	BIG q,one,Fx,Fy,x,hv;
	FP2 X;
	ECP2 T,K;
	BIG_fromBytes(hv,h->val);
	BIG_rcopy(q,Modulus);
	BIG_one(one);
	BIG_mod(hv,q);

	for (;;)
	{
		FP2_from_BIGs(&X,one,hv);
		if (ECP2_setx(Q,&X)) break;
		BIG_inc(hv,1);
	}

/* Fast Hashing to G2 - Fuentes-Castaneda, Knapp and Rodriguez-Henriquez */
	BIG_rcopy(Fx,CURVE_Fra);
	BIG_rcopy(Fy,CURVE_Frb);
	FP2_from_BIGs(&X,Fx,Fy);
	BIG_rcopy(x,CURVE_Bnx);

	ECP2_copy(&T,Q);
	ECP2_mul(&T,x);
	ECP2_neg(&T);  /* our x is negative */
	ECP2_copy(&K,&T);
	ECP2_dbl(&K);
	ECP2_add(&K,&T);
	ECP2_affine(&K);

	ECP2_frob(&K,&X);
	ECP2_frob(Q,&X); ECP2_frob(Q,&X); ECP2_frob(Q,&X);
	ECP2_add(Q,&T);
	ECP2_add(Q,&K);
	ECP2_frob(&T,&X); ECP2_frob(&T,&X);
	ECP2_add(Q,&T);
	ECP2_affine(Q);
}