void zzn4_powq(_MIPD_ big fr,zzn4 *w) { zzn2_conj(_MIPP_ &(w->x),&(w->x)); zzn2_conj(_MIPP_ &(w->y),&(w->y)); nres(_MIPP_ fr,mr_mip->w1); zzn2_smul(_MIPP_ &(w->y),mr_mip->w1,&(w->y)); }
void zzn4_lmul(_MIPD_ zzn4 *x,big y,zzn4 *w) { #ifdef MR_OS_THREADS miracl *mr_mip=get_mip(); #endif if (mr_mip->ERNUM) return; MR_IN(FUNC_BASE+15) if (!zzn2_iszero(&(x->a))) zzn2_smul(_MIPP_ &(x->a),y,&(w->a)); else zzn2_zero(&(w->a)); if (!zzn2_iszero(&(x->b))) zzn2_smul(_MIPP_ &(x->b),y,&(w->b)); else zzn2_zero(&(w->b)); w->unitary=FALSE; MR_OUT }
void g(_MIPD_ zzn2 *Ax,zzn2 *Ay,zzn2 *Az,zzn2 *Bx,zzn2 *By,zzn2 *Bz,big Px,big Py,zzn4 *w) { BOOL Doubling; zzn2 lam,extra1,extra2,Kx,nn,dd; #ifndef MR_STATIC char *mem = memalloc(_MIPP_ 12); #else char mem[MR_BIG_RESERVE(12)]; memset(mem, 0, MR_BIG_RESERVE(12)); #endif lam.a=mirvar_mem(_MIPP_ mem,0); lam.b=mirvar_mem(_MIPP_ mem,1); extra1.a=mirvar_mem(_MIPP_ mem,2); extra1.b=mirvar_mem(_MIPP_ mem,3); extra2.a=mirvar_mem(_MIPP_ mem,4); extra2.b=mirvar_mem(_MIPP_ mem,5); Kx.a=mirvar_mem(_MIPP_ mem,6); Kx.b=mirvar_mem(_MIPP_ mem,7); nn.a=mirvar_mem(_MIPP_ mem,8); nn.b=mirvar_mem(_MIPP_ mem,9); dd.a=mirvar_mem(_MIPP_ mem,10); dd.b=mirvar_mem(_MIPP_ mem,11); zzn2_copy(Ax,&Kx); Doubling=ecurve_fp2_add(_MIPP_ Bx,By,Bz,Ax,Ay,Az,&lam,&extra1,&extra2); /* Get extra information from the point addition, for use in the line functions */ if (!Doubling) { zzn2_smul(_MIPP_ Az,Py,&nn); zzn2_timesi(_MIPP_ &nn); zzn2_copy(Bx,&dd); zzn2_timesi(_MIPP_ &dd); zzn2_sadd(_MIPP_ &dd,Px,&dd); zzn2_mul(_MIPP_ &lam,&dd,&lam); zzn2_copy(By,&dd); zzn2_timesi(_MIPP_ &dd); zzn2_mul(_MIPP_ &dd,Az,&dd); zzn2_sub(_MIPP_ &lam,&dd,&dd); } else { zzn2_smul(_MIPP_ &extra2,Py,&nn); zzn2_mul(_MIPP_ &nn,Az,&nn); zzn2_timesi(_MIPP_ &nn); zzn2_timesi(_MIPP_ &Kx); zzn2_smul(_MIPP_ &extra2,Px,&dd); zzn2_add(_MIPP_ &dd,&Kx,&dd); zzn2_mul(_MIPP_ &lam,&dd,&lam); zzn2_timesi(_MIPP_ &extra1); zzn2_sub(_MIPP_ &lam,&extra1,&dd); } zzn2_copy(&nn,&(w->x)); zzn2_copy(&dd,&(w->y)); #ifndef MR_STATIC memkill(_MIPP_ mem,12); #else memset(mem,0,MR_BIG_RESERVE(12)); #endif return; }