/* Galbraith & Scott Method */ static void gs(BIG u[4],BIG e) { int i,j; BIG v[4],t,q; DBIG d; BIG_rcopy(q,CURVE_Order); for (i=0;i<4;i++) { BIG_rcopy(t,CURVE_WB[i]); BIG_mul(d,t,e); BIG_ddiv(v[i],d,q); BIG_zero(u[i]); } BIG_copy(u[0],e); for (i=0;i<4;i++) for (j=0;j<4;j++) { BIG_rcopy(t,CURVE_BB[j][i]); BIG_modmul(t,v[j],t,q); BIG_add(u[i],u[i],q); BIG_sub(u[i],u[i],t); BIG_mod(u[i],q); } return; }
/* Galbraith & Scott Method */ static void gs(BIG u[4],BIG e) { int i; #if CHOICE<BLS_CURVES int j; BIG v[4],t,q; DBIG d; BIG_rcopy(q,CURVE_Order); for (i=0; i<4; i++) { BIG_rcopy(t,CURVE_WB[i]); //BIG_norm(t); BIG_norm(e); BIG_mul(d,t,e); BIG_ddiv(v[i],d,q); BIG_zero(u[i]); } BIG_copy(u[0],e); for (i=0; i<4; i++) for (j=0; j<4; j++) { BIG_rcopy(t,CURVE_BB[j][i]); BIG_modmul(t,v[j],t,q); BIG_add(u[i],u[i],q); BIG_sub(u[i],u[i],t); BIG_mod(u[i],q); } #else BIG x,w; BIG_rcopy(x,CURVE_Bnx); BIG_copy(w,e); for (i=0; i<4; i++) { BIG_copy(u[i],w); BIG_mod(u[i],x); BIG_sdiv(w,x); } #endif return; }
/* GLV method */ static void glv(BIG u[2],BIG e) { #if CHOICE<BLS_CURVES int i,j; BIG v[2],t,q; DBIG d; BIG_rcopy(q,CURVE_Order); for (i=0; i<2; i++) { BIG_rcopy(t,CURVE_W[i]); //BIG_norm(t); BIG_norm(e); BIG_mul(d,t,e); BIG_ddiv(v[i],d,q); BIG_zero(u[i]); } BIG_copy(u[0],e); for (i=0; i<2; i++) for (j=0; j<2; j++) { BIG_rcopy(t,CURVE_SB[j][i]); BIG_modmul(t,v[j],t,q); BIG_add(u[i],u[i],q); BIG_sub(u[i],u[i],t); BIG_mod(u[i],q); } #else // -(x^2).P = (Beta.x,y) BIG x,x2,q; BIG_rcopy(x,CURVE_Bnx); BIG_smul(x2,x,x); BIG_copy(u[0],e); BIG_mod(u[0],x2); BIG_copy(u[1],e); BIG_sdiv(u[1],x2); BIG_rcopy(q,CURVE_Order); BIG_sub(u[1],q,u[1]); #endif return; }
/* map octet string to point on curve */ static void mapit(octet *h,ECP *P) { BIG q,px; BIG_fromBytes(px,h->val); BIG_rcopy(q,Modulus); BIG_mod(px,q); while (!ECP_setx(P,px,0)) BIG_inc(px,1); }
/* maps a random u to a point on the curve */ static void map(ECP *P,BIG u,int cb) { BIG x,q; BIG_rcopy(q,Modulus); BIG_copy(x,u); BIG_mod(x,q); while (!ECP_setx(P,x,cb)) BIG_inc(x,1); }
/* 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); }