aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2017-03-28 04:46:15 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2017-03-28 04:46:15 +0800
commit624259deea0c52c54626ac3821c2c47d3e74c599 (patch)
tree16970b9857fc38da6b193a94e8facdd556b215cd
parent682c294ffae563177daf2b18cfcc7c65ac558d94 (diff)
downloaddexon-mcl-624259deea0c52c54626ac3821c2c47d3e74c599.tar.gz
dexon-mcl-624259deea0c52c54626ac3821c2c47d3e74c599.tar.zst
dexon-mcl-624259deea0c52c54626ac3821c2c47d3e74c599.zip
constTime version of GLV for G1
-rw-r--r--include/mcl/bn.hpp28
-rw-r--r--include/mcl/ec.hpp2
2 files changed, 20 insertions, 10 deletions
diff --git a/include/mcl/bn.hpp b/include/mcl/bn.hpp
index aba9be4..25305b4 100644
--- a/include/mcl/bn.hpp
+++ b/include/mcl/bn.hpp
@@ -255,7 +255,7 @@ struct GLV {
a += b;
b = t - b;
}
- void mul(G1& Q, G1 P, mpz_class x) const
+ void mul(G1& Q, G1 P, mpz_class x, bool constTime = false) const
{
x %= r;
if (x == 0) {
@@ -324,14 +324,25 @@ struct GLV {
tbl[2] = P; tbl[2].normalize();
tbl[3] = A + P; tbl[3].normalize();
Q.clear();
- for (int i = (int)n - 1; i >= 0; i--) {
- G1::dbl(Q, Q);
- bool ai = mcl::gmp::testBit(a, i);
- bool bi = mcl::gmp::testBit(b, i);
- unsigned int c = bi * 2 + ai;
- if (c > 0) {
+ if (constTime) {
+ tbl[0] = tbl[1];
+ for (int i = (int)n - 1; i >= 0; i--) {
+ G1::dbl(Q, Q);
+ bool ai = mcl::gmp::testBit(a, i);
+ bool bi = mcl::gmp::testBit(b, i);
+ unsigned int c = bi * 2 + ai;
Q += tbl[c];
}
+ } else {
+ for (int i = (int)n - 1; i >= 0; i--) {
+ G1::dbl(Q, Q);
+ bool ai = mcl::gmp::testBit(a, i);
+ bool bi = mcl::gmp::testBit(b, i);
+ unsigned int c = bi * 2 + ai;
+ if (c > 0) {
+ Q += tbl[c];
+ }
+ }
}
#endif
#else
@@ -476,11 +487,10 @@ struct BNT {
static Param param;
static void mulArrayGLV(G1& z, const G1& x, const mcl::fp::Unit *y, size_t yn, bool isNegative, bool constTime)
{
- (void)constTime;
mpz_class s;
mcl::gmp::setArray(s, y, yn);
if (isNegative) s = -s;
- param.glv.mul(z, x, s);
+ param.glv.mul(z, x, s, constTime);
}
static void init(const mcl::bn::CurveParam& cp = CurveFp254BNb, fp::Mode mode = fp::FP_AUTO)
{
diff --git a/include/mcl/ec.hpp b/include/mcl/ec.hpp
index f1c2e90..40bbe61 100644
--- a/include/mcl/ec.hpp
+++ b/include/mcl/ec.hpp
@@ -770,7 +770,7 @@ public:
bool operator<=(const EcT& rhs) const { return !operator>(rhs); }
static inline void mulArray(EcT& z, const EcT& x, const fp::Unit *y, size_t yn, bool isNegative, bool constTime = false)
{
- if (!constTime && mulArrayGLV && yn * 2 > Fp::BaseFp::getOp().N) {
+ if (mulArrayGLV && yn * 2 > Fp::BaseFp::getOp().N) {
mulArrayGLV(z, x, y, yn, isNegative, constTime);
return;
}