/* Multiply P by e in group G1 */ void PAIR_G1mul(ECP *P,BIG e) { #ifdef USE_GLV /* Note this method is patented */ int i,np,nn; ECP Q; BIG cru,t,q; BIG u[2]; BIG_rcopy(q,CURVE_Order); glv(u,e); ECP_affine(P); ECP_copy(&Q,P); BIG_rcopy(cru,CURVE_Cru); FP_nres(cru); FP_mul(Q.x,Q.x,cru); /* note that -a.B = a.(-B). Use a or -a depending on which is smaller */ np=BIG_nbits(u[0]); BIG_modneg(t,u[0],q); nn=BIG_nbits(t); if (nn<np) { BIG_copy(u[0],t); ECP_neg(P); } np=BIG_nbits(u[1]); BIG_modneg(t,u[1],q); nn=BIG_nbits(t); if (nn<np) { BIG_copy(u[1],t); ECP_neg(&Q); } ECP_mul2(P,&Q,u[0],u[1]); #else ECP_mul(P,e); #endif }
int main() { csprng RNG; BIG s,r,x,y; ECP P,G; FP12 g; int i,iterations; clock_t start; double elapsed; char pr[10]; unsigned long ran; rsa_public_key pub; rsa_private_key priv; char m[RFS],d[RFS],c[RFS]; octet M= {0,sizeof(m),m}; octet D= {0,sizeof(d),d}; octet C= {0,sizeof(c),c}; #if CHOICE==NIST256 printf("NIST256 Curve\n"); #endif #if CHOICE==C25519 printf("C25519 Curve\n"); #endif #if CHOICE==BRAINPOOL printf("BRAINPOOL Curve\n"); #endif #if CHOICE==ANSSI printf("ANSSI Curve\n"); #endif #if CHOICE==MF254 printf("MF254 Curve\n"); #endif #if CHOICE==MS255 printf("MS255 Curve\n"); #endif #if CHOICE==MF256 printf("MF256 Curve\n"); #endif #if CHOICE==MS256 printf("MS256 Curve\n"); #endif #if CHOICE==HIFIVE printf("HIFIVE Curve\n"); #endif #if CHOICE==GOLDILOCKS printf("GOLDILOCKS Curve\n"); #endif #if CHOICE==NIST384 printf("NIST384 Curve\n"); #endif #if CHOICE==C41417 printf("C41417 Curve\n"); #endif #if CHOICE==NIST521 printf("NIST521 Curve\n"); #endif #if CHOICE==BN254 printf("BN254 Curve\n"); #endif #if CHOICE==BN454 printf("BN454 Curve\n"); #endif #if CHOICE==BN646 printf("BN646 Curve\n"); #endif #if CHOICE==BN254_CX printf("BN254_CX Curve\n"); #endif #if CHOICE==BN254_T printf("BN254_T Curve\n"); #endif #if CHOICE==BN254_T2 printf("BN254_T2 Curve\n"); #endif #if CHOICE==BLS455 printf("BLS455 Curve\n"); #endif #if CHOICE==BLS383 printf("BLS383 Curve\n"); #endif #if CURVETYPE==WEIERSTRASS printf("Weierstrass parameterization\n"); #endif #if CURVETYPE==EDWARDS printf("Edwards parameterization\n"); #endif #if CURVETYPE==MONTGOMERY printf("Montgomery parameterization\n"); #endif #if CHUNK==16 printf("16-bit Build\n"); #endif #if CHUNK==32 printf("32-bit Build\n"); #endif #if CHUNK==64 printf("64-bit Build\n"); #endif time((time_t *)&ran); pr[0]=ran; pr[1]=ran>>8; pr[2]=ran>>16; pr[3]=ran>>24; for (i=4;i<10;i++) pr[i]=i; RAND_seed(&RNG,10,pr); BIG_rcopy(x,CURVE_Gx); #if CURVETYPE!=MONTGOMERY BIG_rcopy(y,CURVE_Gy); ECP_set(&G,x,y); #else ECP_set(&G,x); #endif BIG_rcopy(r,CURVE_Order); BIG_randomnum(s,r,&RNG); ECP_copy(&P,&G); ECP_mul(&P,r); if (!ECP_isinf(&P)) { printf("FAILURE - rG!=O\n"); return 0; } iterations=0; start=clock(); do { ECP_copy(&P,&G); ECP_mul(&P,s); iterations++; elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; } while (elapsed<MIN_TIME || iterations<MIN_ITERS); elapsed=1000.0*elapsed/iterations; printf("EC mul - %8d iterations ",iterations); printf(" %8.2lf ms per iteration\n",elapsed); printf("Generating %d-bit RSA public/private key pair\n",FFLEN*BIGBITS); iterations=0; start=clock(); do { RSA_KEY_PAIR(&RNG,65537,&priv,&pub,NULL,NULL); iterations++; elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; } while (elapsed<MIN_TIME || iterations<MIN_ITERS); elapsed=1000.0*elapsed/iterations; printf("RSA gen - %8d iterations ",iterations); printf(" %8.2lf ms per iteration\n",elapsed); //FF_randomnum(plain,pub.n,&RNG,FFLEN); M.len=RFS; for (i=0;i<RFS;i++) M.val[i]=i%128; iterations=0; start=clock(); do { RSA_ENCRYPT(&pub,&M,&C); iterations++; elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; } while (elapsed<MIN_TIME || iterations<MIN_ITERS); elapsed=1000.0*elapsed/iterations; printf("RSA enc - %8d iterations ",iterations); printf(" %8.2lf ms per iteration\n",elapsed); iterations=0; start=clock(); do { RSA_DECRYPT(&priv,&C,&D); iterations++; elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; } while (elapsed<MIN_TIME || iterations<MIN_ITERS); elapsed=1000.0*elapsed/iterations; printf("RSA dec - %8d iterations ",iterations); printf(" %8.2lf ms per iteration\n",elapsed); for (i=0;i<RFS;i++) { if (M.val[i]!=D.val[i]) { printf("FAILURE - RSA decryption\n"); return 0; } } printf("All tests pass\n"); return 0; }