add EcT::normalize(EcT&, const EcT&)

dev
MITSUNARI Shigeo 8 years ago
parent 46393928fd
commit dd69b60975
  1. 7
      include/mcl/ec.hpp
  2. 1
      include/mcl/fp.hpp
  3. 3
      include/mcl/fp_tower.hpp
  4. 2
      include/mcl/operator.hpp
  5. 17
      include/mcl/util.hpp

@ -155,6 +155,11 @@ public:
}
#endif
}
static void normalize(EcT& y, const EcT& x)
{
y = x;
y.normalize();
}
static inline void init(const Fp& a, const Fp& b, int mode = ec::Jacobi)
{
a_ = a;
@ -835,7 +840,7 @@ public:
px = &tmp;
}
z.clear();
fp::powGeneric(z, *px, y, yn, EcT::add, EcT::dbl, constTime);
fp::powGeneric(z, *px, y, yn, EcT::add, EcT::dbl, EcT::normalize, constTime);
if (isNegative) {
neg(z, z);
}

@ -455,7 +455,6 @@ public:
{
return fp::isLessArray(v_, rhs.v_, op_.N);
}
void normalize() const {} // dummy method
/*
set IoMode for operator<<(), or operator>>()
*/

@ -180,7 +180,6 @@ public:
bool isOne() const { return a.isOne() && b.isZero(); }
bool operator==(const Fp2T& rhs) const { return a == rhs.a && b == rhs.b; }
bool operator!=(const Fp2T& rhs) const { return !operator==(rhs); }
void normalize() const {} // dummy method
/*
return true is a is odd (do not consider b)
this function is for only compressed reprezentation of EC
@ -782,7 +781,6 @@ struct Fp6T : public fp::Operator<Fp6T<Fp> > {
Fp2::mul(y.b, p.b, q);
Fp2::mul(y.c, p.c, q);
}
void normalize() const {} // dummy
};
/*
@ -926,7 +924,6 @@ struct Fp12T : public fp::Operator<Fp12T<Fp> > {
{
return a.getStr(ioMode) + fp::getIoSeparator(ioMode) + b.getStr(ioMode);
}
void normalize() const {} // dummy
};
} // mcl

@ -66,7 +66,7 @@ private:
px = &tmp;
}
z = 1;
fp::powGeneric(z, *px, y, yn, T::mul, T::sqr);
fp::powGeneric(z, *px, y, yn, T::mul, T::sqr, (void (*)(T&, const T&))0);
if (isNegative) {
T::inv(z, z);
}

@ -196,7 +196,7 @@ void getRandVal(T *out, RG& rg, const T *in, size_t bitSize)
@note &out != x and out = the unit element of G
*/
template<class G, class T>
void powGeneric(G& out, const G& x, const T *y, size_t n, void mul(G&, const G&, const G&) , void sqr(G&, const G&), bool constTime = false)
void powGeneric(G& out, const G& x, const T *y, size_t n, void mul(G&, const G&, const G&) , void sqr(G&, const G&), void normalize(G&, const G&), bool constTime = false)
{
assert(&out != &x);
while (n > 0) {
@ -223,11 +223,16 @@ void powGeneric(G& out, const G& x, const T *y, size_t n, void mul(G&, const G&,
}
}
G tbl[4]; // tbl = { discard, x, x^2, x^3 }
x.normalize();
tbl[0] = x;
tbl[1] = x;
sqr(tbl[2], tbl[1]); tbl[2].normalize();
mul(tbl[3], tbl[2], x); tbl[3].normalize();
if (normalize) {
normalize(tbl[0], x);
} else {
tbl[0] = x;
}
tbl[1] = tbl[0];
sqr(tbl[2], tbl[1]);
if (normalize) { normalize(tbl[2], tbl[2]); }
mul(tbl[3], tbl[2], x);
if (normalize) { normalize(tbl[3], tbl[3]); }
T v = y[n - 1];
int m = cybozu::bsr<T>(v);
if (m & 1) {

Loading…
Cancel
Save