diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2016-04-29 21:12:23 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2016-04-29 21:12:23 +0800 |
commit | ab416e7310ffce54bdd48df3da6e3b04b9f8d368 (patch) | |
tree | 2b565db9c83ec46440d00012a3f4c09cc84376f1 | |
parent | 75ac15e6763d64b25e87b6234febce2cccf3536e (diff) | |
download | dexon-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.hpp | 66 | ||||
-rw-r--r-- | java/mcl_if.hpp | 2 | ||||
-rw-r--r-- | sample/bench.cpp | 2 | ||||
-rw-r--r-- | sample/ecdh.cpp | 2 | ||||
-rw-r--r-- | sample/vote.cpp | 2 | ||||
-rw-r--r-- | test/ec_test.cpp | 15 | ||||
-rw-r--r-- | test/elgamal_test.cpp | 2 | ||||
-rw-r--r-- | test/window_method_test.cpp | 2 |
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); |