BOOL ecap(ECn& P,ECn3& Q,Big& x,ZZn2 &X,ZZn6& res) { BOOL Ok; ECn PP=P; ZZn3 Qx,Qy; int qnr=get_mip()->cnr; normalise(PP); Q.get(Qx,Qy); // untwist Qx=Qx/qnr; Qy=tx(Qy); Qy=Qy/(qnr*qnr); #ifdef MR_COUNT_OPS fpc=fpa=fpx=0; #endif Ok=fast_tate_pairing(PP,Qx,Qy,x,X,res); #ifdef MR_COUNT_OPS printf("After pairing fpc= %d fpa= %d fpx= %d\n",fpc,fpa,fpx); fpa=fpc=fpx=0; #endif if (Ok) return TRUE; return FALSE; }
void ecap(_MIPD_ zzn2 *Qx,zzn2 *Qy,epoint *P,big T,big fr,big delta,zzn2* r) { zzn4 res,w; #ifndef MR_STATIC char *mem=memalloc(_MIPP_ 8); #else char mem[MR_BIG_RESERVE(8)]; memset(mem,0,MR_BIG_RESERVE(8)); #endif res.x.a=mirvar_mem(_MIPP_ mem,0); res.x.b=mirvar_mem(_MIPP_ mem,1); res.y.a=mirvar_mem(_MIPP_ mem,2); res.y.b=mirvar_mem(_MIPP_ mem,3); w.x.a=mirvar_mem(_MIPP_ mem,4); w.x.b=mirvar_mem(_MIPP_ mem,5); w.y.a=mirvar_mem(_MIPP_ mem,6); w.y.b=mirvar_mem(_MIPP_ mem,7); res.unitary=FALSE; w.unitary=FALSE; epoint_norm(_MIPP_ P); fast_tate_pairing(_MIPP_ Qx,Qy,P,T,fr,delta,&w,&res); zzn4_copy(&res,&w); zzn4_powq(_MIPP_ fr,&res); zzn4_powu(_MIPP_ &w,delta,&w); zzn4_mul(_MIPP_ &res,&w,&res); zzn2_copy(&(res.x),r); #ifdef MR_COUNT_OPS printf("Final Exponentiation cost\n"); printf("fpc= %d\n",fpc); printf("fpa= %d\n",fpa); printf("fpx= %d\n",fpx); fpa=fpc=fpx=0; #endif #ifndef MR_STATIC memkill(_MIPP_ mem,8); #else memset(mem,0,MR_BIG_RESERVE(8)); #endif }
void ecap(_MIPD_ epoint *P,zzn3 *Qx,zzn3 *Qy,big q,big cf,zzn3* r) { zzn6 res,w; #ifndef MR_STATIC char *mem=memalloc(_MIPP_ 12); #else char mem[MR_BIG_RESERVE(12)]; memset(mem,0,MR_BIG_RESERVE(12)); #endif res.x.a=mirvar_mem(_MIPP_ mem,0); res.x.b=mirvar_mem(_MIPP_ mem,1); res.x.c=mirvar_mem(_MIPP_ mem,2); res.y.a=mirvar_mem(_MIPP_ mem,3); res.y.b=mirvar_mem(_MIPP_ mem,4); res.y.c=mirvar_mem(_MIPP_ mem,5); w.x.a=mirvar_mem(_MIPP_ mem,6); w.x.b=mirvar_mem(_MIPP_ mem,7); w.x.c=mirvar_mem(_MIPP_ mem,8); w.y.a=mirvar_mem(_MIPP_ mem,9); w.y.b=mirvar_mem(_MIPP_ mem,10); w.y.c=mirvar_mem(_MIPP_ mem,11); res.unitary=FALSE; w.unitary=FALSE; epoint_norm(_MIPP_ P); fast_tate_pairing(_MIPP_ P,Qx,Qy,q,cf,&w,&res); zzn6_copy(&res,&w); zzn6_powq(_MIPP_ &res); zzn6_mul(_MIPP_ &res,&res,&res); zzn6_powu(_MIPP_ &w,cf,&w); zzn6_mul(_MIPP_ &res,&w,&res); zzn3_copy(&(res.x),r); #ifndef MR_STATIC memkill(_MIPP_ mem,12); #else memset(mem,0,MR_BIG_RESERVE(12)); #endif }