1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#include <cybozu/test.hpp>
#include <mcl/power_window.hpp>
#include <mcl/ec.hpp>
#include <mcl/fp.hpp>
#include <mcl/ecparam.hpp>
#if 0
CYBOZU_TEST_AUTO(ArrayIterator)
{
const uint32_t in[2] = { 0x12345678, 0xabcdef89 };
const size_t bitLen = 64;
for (size_t w = 1; w <= 32; w++) {
const uint32_t mask = uint32_t((uint64_t(1) << w) - 1);
mpz_class x;
mcl::Gmp::setArray(x, in, 2);
mcl::fp::ArrayIterator<uint32_t> ai(in, bitLen, w);
size_t n = (bitLen + w - 1) / w;
for (size_t j = 0; j < n; j++) {
CYBOZU_TEST_ASSERT(ai.hasNext());
uint32_t v = ai.getNext();
CYBOZU_TEST_EQUAL(v, x & mask);
x >>= w;
}
CYBOZU_TEST_ASSERT(!ai.hasNext());
}
}
#endif
CYBOZU_TEST_AUTO(int)
{
typedef mcl::FpT<> Fp;
typedef mcl::EcT<Fp> Ec;
const struct mcl::EcParam& para = mcl::ecparam::secp192k1;
Fp::setModulo(para.p);
Ec::setParam(para.a, para.b);
const Fp x(para.gx);
const Fp y(para.gy);
const Ec P(x, y);
typedef mcl::fp::PowerWindow<Ec> PW;
const size_t bitLen = 16;
Ec Q, R;
for (size_t winSize = 2; winSize <= 12; winSize += 3) {
PW pw(P, bitLen, winSize);
for (int i = 0; i < (1 << bitLen); i++) {
pw.power(Q, i);
Ec::power(R, P, i);
CYBOZU_TEST_EQUAL(Q, R);
}
}
PW pw(P, para.bitLen, 10);
pw.power(Q, -12345);
Ec::power(R, P, -12345);
CYBOZU_TEST_EQUAL(Q, R);
mpz_class t(para.gx);
pw.power(Q, t);
Ec::power(R, P, t);
CYBOZU_TEST_EQUAL(Q, R);
t = -t;
pw.power(Q, t);
Ec::power(R, P, t);
CYBOZU_TEST_EQUAL(Q, R);
pw.power(Q, x);
Ec::power(R, P, x);
CYBOZU_TEST_EQUAL(Q, R);
pw.power(Q, y);
Ec::power(R, P, y);
CYBOZU_TEST_EQUAL(Q, R);
}
|