Example #1
0
/* Galbraith & Scott Method */
static void gs(BIG u[4],BIG e)
{
	int i,j;
	BIG v[4],t,q;
	DBIG d;
	BIG_rcopy(q,CURVE_Order);
	for (i=0;i<4;i++)
	{
		BIG_rcopy(t,CURVE_WB[i]);
		BIG_mul(d,t,e);
		BIG_ddiv(v[i],d,q);
		BIG_zero(u[i]);
	}

	BIG_copy(u[0],e);
	for (i=0;i<4;i++)
		for (j=0;j<4;j++)
		{
			BIG_rcopy(t,CURVE_BB[j][i]);
			BIG_modmul(t,v[j],t,q);
			BIG_add(u[i],u[i],q);
			BIG_sub(u[i],u[i],t);
			BIG_mod(u[i],q);
		}
	return;
}
Example #2
0
/* GLV method */
static void glv(BIG u[2],BIG e)
{
#if CHOICE<BLS_CURVES
    int i,j;
    BIG v[2],t,q;
    DBIG d;
    BIG_rcopy(q,CURVE_Order);
    for (i=0; i<2; i++)
    {
        BIG_rcopy(t,CURVE_W[i]);
//BIG_norm(t); BIG_norm(e);
        BIG_mul(d,t,e);
        BIG_ddiv(v[i],d,q);
        BIG_zero(u[i]);
    }
    BIG_copy(u[0],e);
    for (i=0; i<2; i++)
        for (j=0; j<2; j++)
        {
            BIG_rcopy(t,CURVE_SB[j][i]);
            BIG_modmul(t,v[j],t,q);
            BIG_add(u[i],u[i],q);
            BIG_sub(u[i],u[i],t);
            BIG_mod(u[i],q);
        }

#else
// -(x^2).P = (Beta.x,y)

    BIG x,x2,q;
    BIG_rcopy(x,CURVE_Bnx);
    BIG_smul(x2,x,x);
    BIG_copy(u[0],e);
    BIG_mod(u[0],x2);
    BIG_copy(u[1],e);
    BIG_sdiv(u[1],x2);

    BIG_rcopy(q,CURVE_Order);
    BIG_sub(u[1],q,u[1]);

#endif

    return;
}
Example #3
0
/* Galbraith & Scott Method */
static void gs(BIG u[4],BIG e)
{
    int i;
#if CHOICE<BLS_CURVES
    int j;
    BIG v[4],t,q;
    DBIG d;
    BIG_rcopy(q,CURVE_Order);
    for (i=0; i<4; i++)
    {
        BIG_rcopy(t,CURVE_WB[i]);
//BIG_norm(t); BIG_norm(e);
        BIG_mul(d,t,e);
        BIG_ddiv(v[i],d,q);
        BIG_zero(u[i]);
    }

    BIG_copy(u[0],e);
    for (i=0; i<4; i++)
        for (j=0; j<4; j++)
        {
            BIG_rcopy(t,CURVE_BB[j][i]);
            BIG_modmul(t,v[j],t,q);
            BIG_add(u[i],u[i],q);
            BIG_sub(u[i],u[i],t);
            BIG_mod(u[i],q);
        }

#else

    BIG x,w;
    BIG_rcopy(x,CURVE_Bnx);
    BIG_copy(w,e);

    for (i=0; i<4; i++)
    {
        BIG_copy(u[i],w);
        BIG_mod(u[i],x);
        BIG_sdiv(w,x);
    }

#endif
    return;
}
/* r=ck^a.cl^n using XTR double exponentiation method on traces of FP12s. See Stam thesis. */
void FP4_xtr_pow2(FP4 *r,FP4 *ck,FP4 *cl,FP4 *ckml,FP4 *ckm2l,BIG a,BIG b)
{
	int i,f2,nb;
	BIG d,e,w;
	FP4 t,cu,cv,cumv,cum2v;

	BIG_norm(a);
	BIG_norm(b);
	BIG_copy(e,a);
	BIG_copy(d,b);
	FP4_copy(&cu,ck);
	FP4_copy(&cv,cl);
	FP4_copy(&cumv,ckml);
	FP4_copy(&cum2v,ckm2l);

	f2=0;
	while (BIG_parity(d)==0 && BIG_parity(e)==0)
	{
		BIG_shr(d,1);
		BIG_shr(e,1);
		f2++;
	}
	while (BIG_comp(d,e)!=0)
	{
		if (BIG_comp(d,e)>0)
		{
			BIG_imul(w,e,4); BIG_norm(w);
			if (BIG_comp(d,w)<=0)
			{
				BIG_copy(w,d);
				BIG_copy(d,e);
				BIG_sub(e,w,e); BIG_norm(e);
				FP4_xtr_A(&t,&cu,&cv,&cumv,&cum2v);
				FP4_conj(&cum2v,&cumv);
				FP4_copy(&cumv,&cv);
				FP4_copy(&cv,&cu);
				FP4_copy(&cu,&t);
			}
			else if (BIG_parity(d)==0)
			{
				BIG_shr(d,1);  
				FP4_conj(r,&cum2v); 
				FP4_xtr_A(&t,&cu,&cumv,&cv,r);
				FP4_xtr_D(&cum2v,&cumv);
				FP4_copy(&cumv,&t);
				FP4_xtr_D(&cu,&cu);
			}
			else if (BIG_parity(e)==1)
			{
				BIG_sub(d,d,e); BIG_norm(d);
				BIG_shr(d,1);
				FP4_xtr_A(&t,&cu,&cv,&cumv,&cum2v);
				FP4_xtr_D(&cu,&cu);
				FP4_xtr_D(&cum2v,&cv);
				FP4_conj(&cum2v,&cum2v);
				FP4_copy(&cv,&t);
			}
			else
			{
				BIG_copy(w,d);
				BIG_copy(d,e); BIG_shr(d,1);
				BIG_copy(e,w);
				FP4_xtr_D(&t,&cumv);
				FP4_conj(&cumv,&cum2v);
				FP4_conj(&cum2v,&t);
				FP4_xtr_D(&t,&cv);
				FP4_copy(&cv,&cu);
				FP4_copy(&cu,&t);
			}
		}
		if (BIG_comp(d,e)<0)
		{
			BIG_imul(w,d,4); BIG_norm(w);
			if (BIG_comp(e,w)<=0)
			{
				BIG_sub(e,e,d); BIG_norm(e);
				FP4_xtr_A(&t,&cu,&cv,&cumv,&cum2v);
				FP4_copy(&cum2v,&cumv);
				FP4_copy(&cumv,&cu);
				FP4_copy(&cu,&t);
			}
			else if (BIG_parity(e)==0)
			{
				BIG_copy(w,d);
				BIG_copy(d,e); BIG_shr(d,1);
				BIG_copy(e,w);
				FP4_xtr_D(&t,&cumv);
				FP4_conj(&cumv,&cum2v);
				FP4_conj(&cum2v,&t);
				FP4_xtr_D(&t,&cv);
				FP4_copy(&cv,&cu);
				FP4_copy(&cu,&t);
			}
			else if (BIG_parity(d)==1)
			{
				BIG_copy(w,e);
				BIG_copy(e,d);
				BIG_sub(w,w,d); BIG_norm(w);
				BIG_copy(d,w); BIG_shr(d,1);
				FP4_xtr_A(&t,&cu,&cv,&cumv,&cum2v);
				FP4_conj(&cumv,&cumv);
				FP4_xtr_D(&cum2v,&cu);
				FP4_conj(&cum2v,&cum2v);
				FP4_xtr_D(&cu,&cv);
				FP4_copy(&cv,&t);
			}
			else
			{
				BIG_shr(d,1);
				FP4_conj(r,&cum2v);
				FP4_xtr_A(&t,&cu,&cumv,&cv,r);
				FP4_xtr_D(&cum2v,&cumv);
				FP4_copy(&cumv,&t);
				FP4_xtr_D(&cu,&cu);
			}
		}
	}
	FP4_xtr_A(r,&cu,&cv,&cumv,&cum2v);
	for (i=0;i<f2;i++)	FP4_xtr_D(r,r);
	FP4_xtr_pow(r,r,d);
}