aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2016-04-29 21:12:23 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2016-04-29 21:12:23 +0800
commitab416e7310ffce54bdd48df3da6e3b04b9f8d368 (patch)
tree2b565db9c83ec46440d00012a3f4c09cc84376f1
parent75ac15e6763d64b25e87b6234febce2cccf3536e (diff)
downloaddexon-mcl-ab416e7310ffce54bdd48df3da6e3b04b9f8d368.tar.gz
dexon-mcl-ab416e7310ffce54bdd48df3da6e3b04b9f8d368.tar.zst
dexon-mcl-ab416e7310ffce54bdd48df3da6e3b04b9f8d368.zip
rename Ec::setParam to Ec::init
-rw-r--r--include/mcl/ec.hpp66
-rw-r--r--java/mcl_if.hpp2
-rw-r--r--sample/bench.cpp2
-rw-r--r--sample/ecdh.cpp2
-rw-r--r--sample/vote.cpp2
-rw-r--r--test/ec_test.cpp15
-rw-r--r--test/elgamal_test.cpp2
-rw-r--r--test/window_method_test.cpp2
8 files changed, 79 insertions, 14 deletions
diff --git a/include/mcl/ec.hpp b/include/mcl/ec.hpp
index a6f9003..3e6fb0e 100644
--- a/include/mcl/ec.hpp
+++ b/include/mcl/ec.hpp
@@ -76,6 +76,7 @@ public:
private:
void normalizeJacobi() const
{
+ assert(!z.isZero());
Fp rz2;
Fp::inv(z, z);
Fp::sqr(rz2, z);
@@ -86,11 +87,45 @@ private:
}
void normalizeProj() const
{
+ assert(!z.isZero());
Fp::inv(z, z);
x *= z;
y *= z;
z = 1;
}
+ // Y^2 == X(X^2 + aZ^4) + bZ^6
+ bool isValidJacobi() const
+ {
+puts("isValidJacobi");
+ Fp y2, x2, z2, z4, t;
+ Fp::sqr(x2, x);
+ Fp::sqr(y2, y);
+ Fp::sqr(z2, z);
+ Fp::sqr(z4, z2);
+ Fp::mul(t, z4, a_);
+ t += x2;
+ t *= x;
+ z4 *= z2;
+ z4 *= b_;
+ t += z4;
+ return y2 == t;
+ }
+ // (Y^2 - bZ^2)Z = X^2(X + aZ)
+ bool isValidProj() const
+ {
+puts("isValidProj");
+ Fp y2, x2, z2, t;
+ Fp::sqr(x2, x);
+ Fp::sqr(y2, y);
+ Fp::sqr(z2, z);
+ Fp::mul(t, a_, z);
+ t += x;
+ t *= x2;
+ z2 *= b_;
+ y2 -= z2;
+ y2 *= z;
+ return y2 == t;
+ }
public:
#endif
void normalize() const
@@ -107,7 +142,7 @@ public:
}
#endif
}
- static inline void setParam(const Fp& a, const Fp& b, int mode = ec::Jacobi)
+ static inline void init(const Fp& a, const Fp& b, int mode = ec::Jacobi)
{
a_ = a;
b_ = b;
@@ -127,22 +162,43 @@ public:
mode_ = mode;
break;
default:
- throw cybozu::Exception("ec:EcT:setParam:bad mode") << mode;
+ throw cybozu::Exception("ec:EcT:init:bad mode") << mode;
}
#endif
}
+ // backward compatilibity
static inline void setParam(const std::string& astr, const std::string& bstr, int mode = ec::Jacobi)
{
- setParam(Fp(astr), Fp(bstr), mode);
+ init(astr, bstr, mode);
+ }
+ static inline void init(const std::string& astr, const std::string& bstr, int mode = ec::Jacobi)
+ {
+ init(Fp(astr), Fp(bstr), mode);
}
+ // y^2 == (x^2 + a)x + b
static inline bool isValid(const Fp& _x, const Fp& _y)
{
- return _y * _y == (_x * _x + a_) * _x + b_;
+ Fp y2, t;
+ Fp::sqr(y2, _y);
+ Fp::sqr(t, _x);
+ t += a_;
+ t *= _x;
+ t += b_;
+ return y2 == t;
}
bool isValid() const
{
if (isZero()) return true;
- normalize();
+#ifndef MCL_EC_USE_AFFINE
+ if (!z.isOne()) {
+ switch (mode_) {
+ case ec::Jacobi:
+ return isValidJacobi();
+ case ec::Proj:
+ return isValidProj();
+ }
+ }
+#endif
return isValid(x, y);
}
void set(const Fp& _x, const Fp& _y, bool verify = true)
diff --git a/java/mcl_if.hpp b/java/mcl_if.hpp
index 54ed4bb..36d67e3 100644
--- a/java/mcl_if.hpp
+++ b/java/mcl_if.hpp
@@ -31,7 +31,7 @@ void SystemInit(const std::string& param) throw(std::exception)
p.ecParam = mcl::getEcParam(ecParamStr);
Zn::setModulo(p.ecParam->n);
Fp::setModulo(p.ecParam->p);
- Ec::setParam(p.ecParam->a, p.ecParam->b);
+ Ec::init(p.ecParam->a, p.ecParam->b);
p.hashName = cybozu::crypto::Hash::getName(hashNameStr);
return;
}
diff --git a/sample/bench.cpp b/sample/bench.cpp
index cd85c52..a0e790d 100644
--- a/sample/bench.cpp
+++ b/sample/bench.cpp
@@ -88,7 +88,7 @@ void benchEcSub(const mcl::EcParam& para, mcl::fp::Mode mode, mcl::ec::Mode ecMo
{
Fp::setModulo(para.p, 0, mode);
Zn::setModulo(para.n);
- Ec::setParam(para.a, para.b, ecMode);
+ Ec::init(para.a, para.b, ecMode);
Fp x(para.gx);
Fp y(para.gy);
Ec P(x, y);
diff --git a/sample/ecdh.cpp b/sample/ecdh.cpp
index e70303b..90104c0 100644
--- a/sample/ecdh.cpp
+++ b/sample/ecdh.cpp
@@ -22,7 +22,7 @@ int main()
const mcl::EcParam& para = mcl::ecparam::secp192k1;
Zn::setModulo(para.n);
Fp::setModulo(para.p);
- Ec::setParam(para.a, para.b);
+ Ec::init(para.a, para.b);
const Ec P(Fp(para.gx), Fp(para.gy));
/*
diff --git a/sample/vote.cpp b/sample/vote.cpp
index c2d27bc..7b877dc 100644
--- a/sample/vote.cpp
+++ b/sample/vote.cpp
@@ -63,7 +63,7 @@ void SysInit()
const mcl::EcParam& para = mcl::ecparam::secp192k1;
Zn::setModulo(para.n);
Fp::setModulo(para.p);
- Ec::setParam(para.a, para.b);
+ Ec::init(para.a, para.b);
}
template<class T>
diff --git a/test/ec_test.cpp b/test/ec_test.cpp
index 5b8181b..c4bee58 100644
--- a/test/ec_test.cpp
+++ b/test/ec_test.cpp
@@ -16,12 +16,12 @@ typedef mcl::EcT<Fp> Ec;
struct Test {
const mcl::EcParam& para;
- Test(const mcl::EcParam& para)
+ Test(const mcl::EcParam& para, mcl::ec::Mode mode)
: para(para)
{
Fp::setModulo(para.p);
Zn::setModulo(para.n);
- Ec::setParam(para.a, para.b);
+ Ec::init(para.a, para.b, mode);
}
void cstr() const
{
@@ -61,7 +61,9 @@ struct Test {
Fp y(para.gy);
Zn n = 0;
CYBOZU_TEST_ASSERT(Ec::isValid(x, y));
+ CYBOZU_TEST_ASSERT(!Ec::isValid(x, y + 1));
Ec P(x, y), Q, R, O;
+ CYBOZU_TEST_ASSERT(P.isNormalized());
{
Ec::neg(Q, P);
CYBOZU_TEST_EQUAL(Q.x, P.x);
@@ -69,6 +71,8 @@ struct Test {
R = P + Q;
CYBOZU_TEST_ASSERT(R.isZero());
+ CYBOZU_TEST_ASSERT(R.isNormalized());
+ CYBOZU_TEST_ASSERT(R.isValid());
R = P + O;
CYBOZU_TEST_EQUAL(R, P);
@@ -78,6 +82,8 @@ struct Test {
{
Ec::dbl(R, P);
+ CYBOZU_TEST_ASSERT(!R.isNormalized());
+ CYBOZU_TEST_ASSERT(R.isValid());
Ec R2 = P + P;
CYBOZU_TEST_EQUAL(R, R2);
{
@@ -314,7 +320,10 @@ void test_sub(const mcl::EcParam *para, size_t paraNum)
{
for (size_t i = 0; i < paraNum; i++) {
puts(para[i].name);
- Test(para[i]).run();
+ puts("Jacobi");
+ Test(para[i], mcl::ec::Jacobi).run();
+ puts("Proj");
+ Test(para[i], mcl::ec::Proj).run();
}
}
diff --git a/test/elgamal_test.cpp b/test/elgamal_test.cpp
index 0d8ccf8..92f9fb0 100644
--- a/test/elgamal_test.cpp
+++ b/test/elgamal_test.cpp
@@ -18,7 +18,7 @@ CYBOZU_TEST_AUTO(testEc)
{
Fp::setModulo(para.p);
Zn::setModulo(para.n);
- Ec::setParam(para.a, para.b);
+ Ec::init(para.a, para.b);
const Fp x0(para.gx);
const Fp y0(para.gy);
const size_t bitSize = Zn::getBitSize();
diff --git a/test/window_method_test.cpp b/test/window_method_test.cpp
index d761004..b56fa62 100644
--- a/test/window_method_test.cpp
+++ b/test/window_method_test.cpp
@@ -30,7 +30,7 @@ CYBOZU_TEST_AUTO(int)
typedef mcl::EcT<Fp> Ec;
const struct mcl::EcParam& para = mcl::ecparam::secp192k1;
Fp::setModulo(para.p);
- Ec::setParam(para.a, para.b);
+ Ec::init(para.a, para.b);
const Fp x(para.gx);
const Fp y(para.gy);
const Ec P(x, y);