void zzn2_times_irp(_MIPD_ zzn2 *u) { zzn2 t; switch (mr_mip->pmod8) { case 5: /* times sqrt(n) */ zzn2_timesi(_MIPP_ u); break; case 3: /* times 1+sqrt(n) */ case 7: t.a=mr_mip->w5; t.b=mr_mip->w6; zzn2_copy(u,&t); zzn2_timesi(_MIPP_ &t); zzn2_add(_MIPP_ u,&t,u); break; default: break; } }
void zzn2_txx(_MIPD_ zzn2 *u) { /* multiply w by t^2 where x^2-t is irreducible polynomial for ZZn4 for p=5 mod 8 t=sqrt(sqrt(-2)), qnr=-2 for p=3 mod 8 t=sqrt(1+sqrt(-1)), qnr=-1 for p=7 mod 8 and p=2,3 mod 5 t=sqrt(2+sqrt(-1)), qnr=-1 */ zzn2 t; #ifdef MR_OS_THREADS miracl *mr_mip=get_mip(); #endif if (mr_mip->ERNUM) return; MR_IN(196) switch (mr_mip->pmod8) { case 5: zzn2_timesi(_MIPP_ u); break; case 3: t.a=mr_mip->w3; t.b=mr_mip->w4; zzn2_copy(u,&t); zzn2_timesi(_MIPP_ u); zzn2_add(_MIPP_ u,&t,u); break; case 7: t.a=mr_mip->w3; t.b=mr_mip->w4; zzn2_copy(u,&t); zzn2_timesi(_MIPP_ u); zzn2_add(_MIPP_ u,&t,u); zzn2_add(_MIPP_ u,&t,u); break; default: break; } 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; }
void zzn4_mul(_MIPD_ zzn4 *u,zzn4 *v,zzn4 *w) { zzn2 t1,t2,t3; t1.a=mr_mip->w3; t1.b=mr_mip->w4; t2.a=mr_mip->w8; t2.b=mr_mip->w9; if (u==v) { if (u->unitary) { /* this is faster.. - see Lenstra & Stam */ zzn4_copy(u,w); zzn2_mul(_MIPP_ &(w->y),&(w->y),&t1); zzn2_add(_MIPP_ &(w->y),&(w->x),&(w->y)); zzn2_mul(_MIPP_ &(w->y),&(w->y),&(w->y)); zzn2_sub(_MIPP_ &(w->y),&t1,&(w->y)); zzn2_timesi(_MIPP_ &t1); zzn2_copy(&t1,&(w->x)); zzn2_sub(_MIPP_ &(w->y),&(w->x),&(w->y)); zzn2_add(_MIPP_ &(w->x),&(w->x),&(w->x)); zzn2_sadd(_MIPP_ &(w->x),mr_mip->one,&(w->x)); zzn2_ssub(_MIPP_ &(w->y),mr_mip->one,&(w->y)); } else { zzn4_copy(u,w); zzn2_copy(&(w->y),&t2); // t2=b; zzn2_add(_MIPP_ &(w->x),&t2,&t1); // t1=a+b zzn2_times_irp(_MIPP_ &t2); // t2=txx(b); zzn2_add(_MIPP_ &t2,&(w->x),&t2); // t2=a+txx(b) zzn2_mul(_MIPP_ &(w->y),&(w->x),&(w->y)); // b*=a zzn2_mul(_MIPP_ &t1,&t2,&(w->x)); // a=t1*t2 zzn2_copy(&(w->y),&t2); //t2=b zzn2_sub(_MIPP_ &(w->x),&t2,&(w->x)); //a-=b zzn2_times_irp(_MIPP_ &t2); // t2=txx(b) zzn2_sub(_MIPP_ &(w->x),&t2,&(w->x)); // a-=txx(b); zzn2_add(_MIPP_ &(w->y),&(w->y),&(w->y)); // b+=b; } } else { t3.a=mr_mip->w10; t3.b=mr_mip->w11; zzn2_copy(&(u->x),&t1); zzn2_copy(&(u->y),&t2); zzn2_mul(_MIPP_ &t1,&(v->x),&t1); zzn2_mul(_MIPP_ &t2,&(v->y),&t2); zzn2_copy(&(v->x),&t3); zzn2_add(_MIPP_ &t3,&(v->y),&t3); zzn2_add(_MIPP_ &(u->y),&(u->x),&(w->y)); zzn2_mul(_MIPP_ &(w->y),&t3,&(w->y)); zzn2_sub(_MIPP_ &(w->y),&t1,&(w->y)); zzn2_sub(_MIPP_ &(w->y),&t2,&(w->y)); zzn2_copy(&t1,&(w->x)); zzn2_times_irp(_MIPP_ &t2); zzn2_add(_MIPP_ &(w->x),&t2,&(w->x)); if (u->unitary && v->unitary) w->unitary=TRUE; else w->unitary=FALSE; } }