Esempio n. 1
0
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;
    }
}
Esempio n. 2
0
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
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
    }
}