#define PUT(x) std::cout << #x "=" << x << std::endl; #include #include #include #include typedef mcl::FpT Fp; typedef mcl::bn::BNT BN; typedef BN::Fp2 Fp2; typedef BN::Fp6 Fp6; typedef BN::Fp12 Fp12; typedef BN::G1 G1; typedef BN::G2 G2; typedef mcl::bn::ParamT Param; const struct TestSet { mcl::bn::CurveParam cp; struct G2 { const char *aa; const char *ab; const char *ba; const char *bb; } g2; struct G1 { int a; int b; } g1; const char *e; } g_testSetTbl[] = { { mcl::bn::CurveFp254BNb, { "12723517038133731887338407189719511622662176727675373276651903807414909099441", "4168783608814932154536427934509895782246573715297911553964171371032945126671", "13891744915211034074451795021214165905772212241412891944830863846330766296736", "7937318970632701341203597196594272556916396164729705624521405069090520231616", }, { -1, 1 }, "8118772341496577043438385328606447626730215814727396173233264007541007797690 " "6742571767760762192519140673058087976840103832045324348366170860928670686713 " "9727912590495366720378364920530546614235713408261568635512172059018197267630 " "10180700148605185348549931182990442059136187839792856455707820203302941578832 " "5054507763444412917986776641611331046146804026682679569910978464879371792565 " "6917005519826733659554708445125877487590687705432214234949972860245110398023 " "10448556317747236258066222816126375978842661908560317699736569642190930635294 " "1516980358051268127904344653343215863076753141133525905743113718749531324025 " "9794836735385959178744195210089532061310424844916928682580569566332541022353 " "9375574834170998962484906689780052970915033987453510324648351251071086068423 " "710778048594563655498360873129325895716179849942646859397874562033386335205 " "10688745994254573144943003027511098295097561129365638275727908595677791826005" }, }; CYBOZU_TEST_AUTO(size) { CYBOZU_TEST_EQUAL(sizeof(Fp), 32u); CYBOZU_TEST_EQUAL(sizeof(Fp2), sizeof(Fp) * 2); CYBOZU_TEST_EQUAL(sizeof(Fp6), sizeof(Fp) * 6); CYBOZU_TEST_EQUAL(sizeof(Fp12), sizeof(Fp) * 12); CYBOZU_TEST_EQUAL(sizeof(G1), sizeof(Fp) * 3); CYBOZU_TEST_EQUAL(sizeof(G2), sizeof(Fp2) * 3); } CYBOZU_TEST_AUTO(naive) { const TestSet& ts = g_testSetTbl[0]; BN::init(ts.cp); G1 P(ts.g1.a, ts.g1.b); G2 Q(Fp2(ts.g2.aa, ts.g2.ab), Fp2(ts.g2.ba, ts.g2.bb)); Fp12 e1; BN::optimalAtePairing(e1, Q, P); Fp12 e2; { std::stringstream ss(ts.e); ss >> e2; } CYBOZU_TEST_EQUAL(e1, e2); }