rewrite GLV2::mul

update-fork
MITSUNARI Shigeo 5 years ago
parent 38d97e0802
commit de44c1336d
  1. 74
      include/mcl/bn.hpp

@ -560,6 +560,19 @@ struct MapTo {
}
};
typedef mcl::FixedArray<int8_t, MCL_MAX_FR_BIT_SIZE / 2 + 2> NafArray;
template<class G>
void addTbl(G& Q, const G *tbl, const NafArray& naf, size_t i)
{
if (i >= naf.size()) return;
int n = naf[i];
if (n > 0) {
Q += tbl[(n - 1) >> 1];
} else if (n < 0) {
Q -= tbl[(-n - 1) >> 1];
}
}
/*
Software implementation of Attribute-Based Encryption: Appendixes
GLV for G1 on BN/BLS12
@ -570,7 +583,6 @@ struct GLV1 {
mpz_class v0, v1;
mpz_class B[2][2];
mpz_class r;
typedef mcl::FixedArray<int8_t, 512 / 2> NafArray;
private:
bool usePrecomputedTable(int curveType)
{
@ -699,16 +711,6 @@ public:
a = x - (t * B[0][0] + b * B[1][0]);
b = - (t * B[0][1] + b * B[1][1]);
}
void addTbl(G1& Q, const G1 *tbl, const NafArray& naf, size_t i) const
{
if (i >= naf.size()) return;
int n = naf[i];
if (n > 0) {
Q += tbl[(n - 1) >> 1];
} else if (n < 0) {
Q -= tbl[(-n - 1) >> 1];
}
}
void mul(G1& Q, const G1& P, mpz_class x, bool constTime = false) const
{
const int w = 5;
@ -857,6 +859,55 @@ struct GLV2 {
template<class T>
void mul(T& Q, const T& P, mpz_class x, bool constTime = false) const
{
#if 0
const int w = 5;
const size_t tblSize = 1 << (w - 2);
const size_t splitN = 4;
NafArray naf[splitN];
mpz_class u[splitN];
T tbl[splitN][tblSize];
bool b;
x %= r;
if (x == 0) {
Q.clear();
if (!constTime) return;
}
if (x < 0) {
x += r;
}
split(u, x);
for (size_t i = 0; i < splitN; i++) {
gmp::getNAFwidth(&b, naf[i], u[i], w);
assert(b); (void)b;
}
tbl[0][0] = P;
Frobenius(tbl[1][0], tbl[0][0]);
Frobenius(tbl[2][0], tbl[1][0]);
Frobenius(tbl[3][0], tbl[2][0]);
{
T P2;
T::dbl(P2, P);
for (size_t i = 1; i < tblSize; i++) {
T::add(tbl[0][i], tbl[0][i - 1], P2);
Frobenius(tbl[1][i], tbl[0][i]);
Frobenius(tbl[2][i], tbl[1][i]);
Frobenius(tbl[3][i], tbl[2][i]);
}
}
size_t maxBit = naf[0].size();
for (size_t i = 1; i < splitN; i++) {
if (naf[i].size() > maxBit) maxBit = naf[i].size();
}
Q.clear();
for (size_t i = 0; i < maxBit; i++) {
T::dbl(Q, Q);
addTbl(Q, tbl[0], naf[0], maxBit - 1 - i);
addTbl(Q, tbl[1], naf[1], maxBit - 1 - i);
addTbl(Q, tbl[2], naf[2], maxBit - 1 - i);
addTbl(Q, tbl[3], naf[3], maxBit - 1 - i);
}
#else
#if 0 // #ifndef NDEBUG
{
T R;
@ -964,6 +1015,7 @@ struct GLV2 {
T::dbl(D, D);
D += tbl[0];
}
#endif
}
void pow(Fp12& z, const Fp12& x, mpz_class y, bool constTime = false) const
{

Loading…
Cancel
Save