a portable and fast pairing-based cryptography library
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mcl/test/common_test.hpp

118 lines
2.3 KiB

5 years ago
template<class G>
void naiveMulVec(G& out, const G *xVec, const Fr *yVec, size_t n)
{
5 years ago
if (n == 1) {
G::mul(out, xVec[0], yVec[0]);
return;
}
5 years ago
G r, t;
r.clear();
for (size_t i = 0; i < n; i++) {
5 years ago
G::mul(t, xVec[i], yVec[i]);
r += t;
}
out = r;
}
template<class G>
void testMulVec(const G& P)
{
using namespace mcl::bn;
const int N = 33;
G xVec[N];
Fr yVec[N];
5 years ago
for (size_t i = 0; i < N; i++) {
G::mul(xVec[i], P, i + 3);
yVec[i].setByCSPRNG();
}
5 years ago
const size_t nTbl[] = { 1, 2, 3, 5, 7, 8, 9, 14, 15, 16, 30, 31, 32, 33 };
5 years ago
for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(nTbl); i++) {
const size_t n = nTbl[i];
G Q1, Q2;
CYBOZU_TEST_ASSERT(n <= N);
naiveMulVec(Q1, xVec, yVec, n);
G::mulVec(Q2, xVec, yVec, n);
CYBOZU_TEST_EQUAL(Q1, Q2);
5 years ago
#if 0//#ifdef NDEBUG
5 years ago
printf("n=%zd\n", n);
5 years ago
const int C = 400;
5 years ago
CYBOZU_BENCH_C("naive ", C, naiveMulVec, Q1, xVec, yVec, n);
CYBOZU_BENCH_C("mulVec", C, G::mulVec, Q1, xVec, yVec, n);
5 years ago
#endif
}
}
template<class G>
void naivePowVec(G& out, const G *xVec, const Fr *yVec, size_t n)
5 years ago
{
if (n == 1) {
G::pow(out, xVec[0], yVec[0]);
return;
}
G r, t;
r.setOne();
for (size_t i = 0; i < n; i++) {
G::pow(t, xVec[i], yVec[i]);
r *= t;
}
out = r;
}
template<class G>
inline void testPowVec(const G& e)
{
using namespace mcl::bn;
const int N = 33;
G xVec[N];
Fr yVec[N];
5 years ago
xVec[0] = e;
for (size_t i = 0; i < N; i++) {
if (i > 0) G::mul(xVec[i], xVec[i - 1], e);
yVec[i].setByCSPRNG();
5 years ago
}
const size_t nTbl[] = { 1, 2, 3, 5, 7, 8, 9, 14, 15, 16, 30, 31, 32, 33 };
for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(nTbl); i++) {
const size_t n = nTbl[i];
G Q1, Q2;
CYBOZU_TEST_ASSERT(n <= N);
naivePowVec(Q1, xVec, yVec, n);
G::powVec(Q2, xVec, yVec, n);
CYBOZU_TEST_EQUAL(Q1, Q2);
#if 0//#ifdef NDEBUG
printf("n=%zd\n", n);
const int C = 400;
CYBOZU_BENCH_C("naive ", C, naivePowVec, Q1, xVec, yVec, n);
CYBOZU_BENCH_C("mulVec", C, G::powVec, Q1, xVec, yVec, n);
#endif
5 years ago
}
}
5 years ago
template<class G>
void testMulCT(const G& P)
{
cybozu::XorShift rg;
G Q1, Q2;
for (int i = 0; i < 100; i++) {
Fr x;
x.setByCSPRNG(rg);
G::mul(Q1, P, x);
G::mulCT(Q2, P, x);
CYBOZU_TEST_EQUAL(Q1, Q2);
}
}
5 years ago
void testCommon(const G1& P, const G2& Q)
{
5 years ago
puts("G1");
5 years ago
testMulVec(P);
5 years ago
puts("G2");
testMulVec(Q);
5 years ago
testMulCT(Q);
5 years ago
GT e;
mcl::bn::pairing(e, P, Q);
puts("GT");
testPowVec(e);
}