Ejemplo n.º 1
0
bn128_ate_G2_precomp bn128_ate_precompute_G2(const bn128_G2& Q)
{
    enter_block("Call to bn128_ate_precompute_G2");

    bn128_ate_G2_precomp result;
    bn::ecop::NormalizeJac(result.Q, Q.coord);

    Fp2 T[3];
    T[0] = result.Q[0];
    T[1] = result.Q[1];
    T[2] = Fp2(1);

    Fp6 d;
    doubling_step_for_flipped_miller_loop(T, d);
    result.coeffs.emplace_back(d);

    Fp6 e;
    assert(Param::siTbl[1] == 1);
    mixed_addition_step_for_flipped_miller_loop(result.Q, T, e);
    result.coeffs.emplace_back(e);

    bn::Fp6 l;
    // 844kclk
    for (size_t i = 2; i < Param::siTblNum; i++) {
        doubling_step_for_flipped_miller_loop(T, l);
        result.coeffs.emplace_back(l);

        if (Param::siTbl[i]) {
            mixed_addition_step_for_flipped_miller_loop(result.Q, T, l);
            result.coeffs.emplace_back(l);
        }
    }

    // addition step
    Fp2 Q1[2];
    bn::ecop::FrobEndOnTwist_1(Q1, result.Q);
    Fp2 Q2[2];
    bn::ecop::FrobEndOnTwist_2(Q2, result.Q);
    Fp2::neg(Q2[1], Q2[1]);
    // @memo z < 0
    if (0)
    {
        bn::Fp2::neg(T[1], T[1]);
    }

    mixed_addition_step_for_flipped_miller_loop(Q1, T, d);
    result.coeffs.emplace_back(d);

    mixed_addition_step_for_flipped_miller_loop(Q2, T, e);
    result.coeffs.emplace_back(e);

    leave_block("Call to bn128_ate_precompute_G2");
    return result;
}
Ejemplo n.º 2
0
void bench_graphe_grille(Pt2di sz,TGr41 & gr)
{
       TPtSubGr41 GrAll;
       TPart41    Part;

       all_face_trigo
       (
            gr,
            (TSubGr41 &) GrAll,
            Part
       );

       ElFifo <Pt2dr> Fp2(2,true);

       BENCH_ASSERT(Part.nb() ==  ((sz.x-1)*(sz.y-1) +1));
       INT nb4 =0;
       INT perim_th = (sz.x-1 + sz.y-1) * 2;

       for (INT f=0; f< Part.nb() ; f++)
       {
           INT nbf = Part[f].nb();
           BENCH_ASSERT((nbf == 4) || (nbf==perim_th));

           copy_on(Fp2,Part[f],PtArc41);
           REAL surf = surf_or_poly(Fp2);
           Pt2dr cdg =  barrycentre(Fp2);

           if (nbf == 4)
           {
               nb4 ++;
               BENCH_ASSERT (std::abs(std::abs(surf)-1.0) < epsilon);
               REAL x = cdg.x - round_down(cdg.x);
               REAL y = cdg.y - round_down(cdg.y);
               BENCH_ASSERT
               (
                       (std::abs(x-0.5) < epsilon)
                   &&  (std::abs(y-0.5) < epsilon)
               );
           }
           else
           {
                BENCH_ASSERT (std::abs(surf-(sz.x-1)*(sz.y-1))< epsilon);
                BENCH_ASSERT(euclid(cdg,(Pt2dr(sz)-Pt2dr(1,1))/2.0) < epsilon);
           }
       }
       BENCH_ASSERT(Part.nb() == nb4+1);

       TSubGr41_xy2 Gr_xy2;
       all_face_trigo
       (
            gr,
            (TSubGr41 &) Gr_xy2,
            Part
       );
       BENCH_ASSERT(Part.nb() ==  (((sz.x-1)/2)*((sz.y-1)/2) +1));


       TSubGr41_xeg    Gr_xeq;
       all_face_trigo
       (
            gr,
            (TSubGr41 &) Gr_xeq,
            Part
       );
       BENCH_ASSERT(Part.nb() ==  sz.x);


       TSubGr41_xeg_y0    Gr_xeq_y0;
       all_face_trigo
       (
            gr,
            (TSubGr41 &) Gr_xeq_y0,
            Part
       );
       BENCH_ASSERT(Part.nb() ==  1);

}
Ejemplo n.º 3
0
int main()
{
	SystemInit();
	const Ec1 g1(-1, 1);
	const Ec2 g2(
		Fp2(Fp(g2c.aa), Fp(g2c.ab)),
		Fp2(Fp(g2c.ba), Fp(g2c.bb))
	);
	// assertBool g2 and g1 on curve
	assertBool("g1 is on EC", g1.isValid());
	assertBool("g2 is on twist EC", g2.isValid());
	puts("order of group");
	const Mpz& r = GetParamR();
	PUT(r);
	{
		Ec1 t = g1;
		t.mul(r);
		assertBool("orgder of g1 == r", t.isZero());
	}
	{
		Ec2 t = g2;
		t.mul(r);
		assertBool("order of g2 == r", t.isZero());
	}
	const Mpz a("123456789012345");
	const Mpz b("998752342342342342424242421");

	// scalar-multiplication sample
	{
		Mpz c = a;
		c.add(b);
		Ec1 Pa = g1; Pa.mul(a);
		Ec1 Pb = g1; Pb.mul(b);
		Ec1 Pc = g1; Pc.mul(c);
		Ec1 out = Pa;
		out.add(Pb);

		assertEqual("check g1 * c = g1 * a + g1 * b", Pc, out);
	}

	Fp12 e;
	// calc e : G2 x G1 -> G3 pairing
	e.pairing(g2, g1); // e = e(g2, g1)
	PUT(e);
	{
		Fp12 t = e;
		t.power(r);
		assertEqual("order of e == r", t, Fp12(1));
	}
	Ec2 g2a = g2;
	g2a.mul(a);
	Fp12 ea1;
	ea1.pairing(g2a, g1);
	Fp12 ea2 = e;
	ea2.power(a); // ea2 = e^a
	assertEqual("e(g2 * a, g1) = e(g2, g1)^a", ea1, ea2);

	Ec1 g1b = g1;
	g1b.mul(b);
	Fp12 eb1;
	eb1.pairing(g2, g1b); // eb1 = e(g2, g1b)
	Fp12 eb2 = e;
	eb2.power(b); // eb2 = e^b
	assertEqual("e(g2a, g1 * b) = e(g2, g1)^b", eb1, eb2);

	Ec1 q1 = g1;
	q1.mul(12345);
	assertBool("q1 is on EC", q1.isValid());
	Fp12 e1, e2;
	e1.pairing(g2, g1); // e1 = e(g2, g1)
	e2.pairing(g2, q1); // e2 = e(g2, q1)
	Ec1 q2 = g1;
	q2.add(q1);
	e.pairing(g2, q2); // e = e(g2, q2)
	e1.mul(e2);
	assertEqual("e = e1 * e2", e, e1);
	/*
		reduce one copy as the following
	*/
	g2a = g2;
	g2a.mul(a);
	g1b = g1;
	g1b.mul(b);
	Ec2 g2at = g2; g2at.mul(a);
	Ec1 g1bt = g1; g1bt.mul(b);
	assertEqual("g2a == g2 * a", g2a, g2at);
	assertEqual("g1b == g1 * b", g1b, g1bt);
	printf("errNum = %d\n", errNum);
}