/* 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 }
/* 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); }