diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2017-05-01 14:49:07 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2017-05-01 14:49:07 +0800 |
commit | cc38f9c51742eb02172fb53d8786b22ac5651ec2 (patch) | |
tree | 83a457cd2bdfdd94371a9969f9f5159cfeea4bc3 | |
parent | 9d375d04ceadafefb5f6a7cb50b5f6b8e706c246 (diff) | |
download | dexon-mcl-cc38f9c51742eb02172fb53d8786b22ac5651ec2.tar.gz dexon-mcl-cc38f9c51742eb02172fb53d8786b22ac5651ec2.tar.zst dexon-mcl-cc38f9c51742eb02172fb53d8786b22ac5651ec2.zip |
all tests passed
-rw-r--r-- | include/mcl/ec.hpp | 26 | ||||
-rw-r--r-- | include/mcl/fp.hpp | 10 | ||||
-rw-r--r-- | include/mcl/fp_tower.hpp | 94 | ||||
-rw-r--r-- | include/mcl/op.hpp | 15 | ||||
-rw-r--r-- | test/bn_test.cpp | 20 | ||||
-rw-r--r-- | test/ec_test.cpp | 6 | ||||
-rw-r--r-- | test/fp_tower_test.cpp | 17 |
7 files changed, 129 insertions, 59 deletions
diff --git a/include/mcl/ec.hpp b/include/mcl/ec.hpp index 3fa361a..8a393fc 100644 --- a/include/mcl/ec.hpp +++ b/include/mcl/ec.hpp @@ -652,7 +652,7 @@ public: */ void getStr(std::string& str, int ioMode = 0) const { - const char *sep = Fp::BaseFp::getIoSeparator(); + const char *sep = fp::getIoSeparator(ioMode); if (ioMode & IoEcProj) { str = '4'; str += sep; @@ -669,7 +669,8 @@ public: if (!isIoEcCompSupported()) throw cybozu::Exception("EcT:getStr:not supported ioMode") << ioMode; const size_t n = Fp::getByteSize(); if (isZero()) { - str.resize(n, 0); + str.clear(); + str.resize(n); return; } P.x.getStr(str, ioMode); @@ -707,14 +708,14 @@ public: ioMode |= ioMode_; return os << self.getStr(ioMode); } - void readStream(std::istream& is, int ioMode) + std::istream& readStream(std::istream& is, int ioMode) { #ifdef MCL_EC_USE_AFFINE inf_ = false; #else z = 1; #endif - if (ioMode & IoTight) { + if (ioMode & IoEcComp) { if (!isIoEcCompSupported()) throw cybozu::Exception("EcT:readStream:not supported ioMode") << ioMode; std::string str; const size_t n = Fp::getByteSize(); @@ -722,18 +723,20 @@ public: is.read(&str[0], n); if (fp::isZeroArray(&str[0], n)) { clear(); - return; + return is; } bool isYodd = (str[n - 1] >> 7) != 0; str[n - 1] &= 0x7f; - x.setArray(&str[0], n); + x.setStr(str, ioMode); getYfromX(y, x, isYodd); } else { char c = 0; - is >> c; + if (!(is >> c)) { + throw cybozu::Exception("EcT:readStream:no header"); + } if (c == '0') { clear(); - return; + return is; } x.readStream(is, ioMode); if (c == '1') { @@ -748,18 +751,17 @@ public: y.readStream(is, ioMode); z.readStream(is, ioMode); } else { - throw cybozu::Exception("EcT:readStream:bad format") << c; + throw cybozu::Exception("EcT:readStream:bad format") << (int)c; } } if (verifyOrder_ && !isValidOrder()) { throw cybozu::Exception("EcT:readStream:bad order") << *this; } + return is; } friend inline std::istream& operator>>(std::istream& is, EcT& self) { - int ioMode = fp::detectIoMode(Fp::BaseFp::getIoMode(), is); - self.readStream(is, ioMode); - return is; + return self.readStream(is, fp::detectIoMode(Fp::BaseFp::getIoMode(), is)); } void setStr(const std::string& str, int ioMode = 0) { diff --git a/include/mcl/fp.hpp b/include/mcl/fp.hpp index b1706a4..6ec11fa 100644 --- a/include/mcl/fp.hpp +++ b/include/mcl/fp.hpp @@ -196,7 +196,7 @@ public: { if (isMont()) op_.fromMont(v_, v_); } - void readStream(std::istream& is, int ioMode) + std::istream& readStream(std::istream& is, int ioMode) { bool isMinus; fp::streamToArray(&isMinus, v_, FpT::getByteSize(), is, ioMode); @@ -207,6 +207,7 @@ public: } toMont(); } + return is; } void setStr(const std::string& str, int ioMode = 0) { @@ -268,7 +269,7 @@ public: getBlock(b); p = b.p; } - if (ioMode & (IoArray | IoArrayRaw | IoTight)) { + if (ioMode & (IoArray | IoArrayRaw | IoEcComp)) { str.resize(n); fp::copyUnitToByteAsLE(reinterpret_cast<uint8_t*>(&str[0]), p, str.size()); return; @@ -367,9 +368,7 @@ public: } friend inline std::istream& operator>>(std::istream& is, FpT& self) { - int ioMode = fp::detectIoMode(getIoMode(), is); - self.readStream(is, ioMode); - return is; + return self.readStream(is, fp::detectIoMode(getIoMode(), is)); } /* @note @@ -414,7 +413,6 @@ public: ioMode_ = ioMode; } static inline IoMode getIoMode() { return ioMode_; } - static inline const char* getIoSeparator() { return fp::getIoSeparator(ioMode_); } // backward compatibility static inline void setModulo(const std::string& mstr, fp::Mode mode = fp::FP_AUTO) { diff --git a/include/mcl/fp_tower.hpp b/include/mcl/fp_tower.hpp index 631551c..d84ca45 100644 --- a/include/mcl/fp_tower.hpp +++ b/include/mcl/fp_tower.hpp @@ -106,6 +106,11 @@ public: // not Fp::getBitSize() * 2 static inline size_t getBitSize() { return Fp::getByteSize() * 8 + Fp::getBitSize(); } static inline size_t getByteSize() { return Fp::getByteSize() * 2; } + void dump() const + { + a.dump(); + b.dump(); + } Fp a, b; Fp2T() { } Fp2T(int64_t a) : a(a), b(0) { } @@ -155,10 +160,26 @@ public: a.setArray(buf, n); b.setArray(buf + n, n); } - void readStream(std::istream& is, int ioMode) + std::istream& readStream(std::istream& is, int ioMode) { a.readStream(is, ioMode); b.readStream(is, ioMode); + return is; + } + void setStr(const std::string& str, int ioMode = 0) + { + std::istringstream is(str); + readStream(is, ioMode); + } + /* + Fp2T = <a> + ' ' + <b> + */ + void getStr(std::string& str, int ioMode = 0) const + { + const char *sep = fp::getIoSeparator(ioMode); + str = a.getStr(ioMode); + str += sep; + str += b.getStr(ioMode); } std::string getStr(int ioMode = 0) const { @@ -168,20 +189,11 @@ public: } friend std::istream& operator>>(std::istream& is, Fp2T& self) { - int ioMode = fp::detectIoMode(Fp::BaseFp::getIoMode(), is); - self.readStream(is, ioMode); - return is; + return self.readStream(is, fp::detectIoMode(Fp::BaseFp::getIoMode(), is)); } - /* - Fp2T = <a> + ' ' + <b> - */ friend std::ostream& operator<<(std::ostream& os, const Fp2T& self) { - return os << self.a << Fp::getIoSeparator() << self.b; - } - void getStr(std::string& str, int ioMode = 0) const - { - str = a.getStr(ioMode) + fp::getIoSeparator(ioMode) + b.getStr(ioMode); + return os << self.getStr(fp::detectIoMode(Fp::BaseFp::getIoMode(), os)); } bool isZero() const { return a.isZero() && b.isZero(); } bool isOne() const { return a.isOne() && b.isZero(); } @@ -605,32 +617,40 @@ struct Fp6T : public fp::Operator<Fp6T<Fp> > { return a == rhs.a && b == rhs.b && c == rhs.c; } bool operator!=(const Fp6T& rhs) const { return !operator==(rhs); } - friend std::ostream& operator<<(std::ostream& os, const Fp6T& x) - { - const char *sep = Fp::getIoSeparator(); - return os << x.a << sep << x.b << sep << x.c; - } - void readStream(std::istream& is, int ioMode) + std::istream& readStream(std::istream& is, int ioMode) { a.readStream(is, ioMode); b.readStream(is, ioMode); c.readStream(is, ioMode); + return is; } void setStr(const std::string& str, int ioMode = 0) { std::istringstream is(str); readStream(is, ioMode); } - friend std::istream& operator>>(std::istream& is, Fp6T& self) + void getStr(std::string& str, int ioMode = 0) const { - int ioMode = fp::detectIoMode(Fp::getIoMode(), is); - self.readStream(is, ioMode); - return is; + const char *sep = fp::getIoSeparator(ioMode); + str = a.getStr(ioMode); + str += sep; + str += b.getStr(ioMode); + str += sep; + str += c.getStr(ioMode); } std::string getStr(int ioMode = 0) const { - const char *sep = fp::getIoSeparator(ioMode); - return a.getStr(ioMode) + sep + b.getStr(ioMode) + sep + c.getStr(ioMode); + std::string str; + getStr(str, ioMode); + return str; + } + friend std::istream& operator>>(std::istream& is, Fp6T& self) + { + return self.readStream(is, fp::detectIoMode(Fp::BaseFp::getIoMode(), is)); + } + friend std::ostream& operator<<(std::ostream& os, const Fp6T& self) + { + return os << self.getStr(fp::detectIoMode(Fp::BaseFp::getIoMode(), os)); } static void add(Fp6T& z, const Fp6T& x, const Fp6T& y) { @@ -932,29 +952,37 @@ struct Fp12T : public fp::Operator<Fp12T<Fp> > { Fp6::mul(y.b, x.b, t0); Fp6::neg(y.b, y.b); } - void readStream(std::istream& is, int ioMode) + std::istream& readStream(std::istream& is, int ioMode) { a.readStream(is, ioMode); b.readStream(is, ioMode); + return is; } void setStr(const std::string& str, int ioMode = 0) { std::istringstream is(str); readStream(is, ioMode); } - friend std::istream& operator>>(std::istream& is, Fp12T& self) + void getStr(std::string& str, int ioMode = 0) const { - int ioMode = fp::detectIoMode(Fp::getIoMode(), is); - self.readStream(is, ioMode); - return is; + const char *sep = fp::getIoSeparator(ioMode); + str = a.getStr(ioMode); + str += sep; + str += b.getStr(ioMode); } - friend std::ostream& operator<<(std::ostream& os, const Fp12T& self) + std::string getStr(int ioMode = 0) const { - return os << self.a << Fp::getIoSeparator() << self.b; + std::string str; + getStr(str, ioMode); + return str; } - std::string getStr(int ioMode = 0) const + friend std::istream& operator>>(std::istream& is, Fp12T& self) + { + return self.readStream(is, fp::detectIoMode(Fp::getIoMode(), is)); + } + friend std::ostream& operator<<(std::ostream& os, const Fp12T& self) { - return a.getStr(ioMode) + fp::getIoSeparator(ioMode) + b.getStr(ioMode); + return os << self.getStr(fp::detectIoMode(Fp::BaseFp::getIoMode(), os)); } }; diff --git a/include/mcl/op.hpp b/include/mcl/op.hpp index de64b75..b91bedc 100644 --- a/include/mcl/op.hpp +++ b/include/mcl/op.hpp @@ -305,9 +305,22 @@ void arrayToStr(std::string& str, const Unit *x, size_t n, int ioMode); inline const char* getIoSeparator(int ioMode) { - return (ioMode & (IoArray | IoArrayRaw | IoTight)) ? "" : " "; + return (ioMode & (IoArray | IoArrayRaw | IoEcComp)) ? "" : " "; } int detectIoMode(int ioMode, const std::ios_base& ios); +inline void dump(const char *s, size_t n) +{ + for (size_t i = 0; i < n; i++) { + printf("%02x ", (uint8_t)s[i]); + } + printf("\n"); +} + +inline void dump(const std::string& s) +{ + dump(s.c_str(), s.size()); +} + } } // mcl::fp diff --git a/test/bn_test.cpp b/test/bn_test.cpp index 4943083..6e9e2c6 100644 --- a/test/bn_test.cpp +++ b/test/bn_test.cpp @@ -274,7 +274,7 @@ void testTrivial(const G1& P, const G2& Q) CYBOZU_TEST_EQUAL(e, 1); } -void testIo(const G1& P, const G2& Q) +void testIoAll(const G1& P, const G2& Q) { int FpTbl[] = { 0, 2, 2|mcl::IoPrefix, 10, 16, 16|mcl::IoPrefix, mcl::IoArray, mcl::IoArrayRaw }; int EcTbl[] = { mcl::IoEcAffine, mcl::IoEcProj, mcl::IoEcCompY, mcl::IoEcComp }; @@ -282,15 +282,27 @@ void testIo(const G1& P, const G2& Q) for (size_t j = 0; j < CYBOZU_NUM_OF_ARRAY(EcTbl); j++) { G1 P2 = P, P3; G2 Q2 = Q, Q3; - int ioMode = FpTbl[i] | FpTbl[j]; - P3.setStr(P2.getStr(ioMode)); + int ioMode = FpTbl[i] | EcTbl[j]; + std::string s = P2.getStr(ioMode); + P3.setStr(s, ioMode); CYBOZU_TEST_EQUAL(P2, P3); - Q3.setStr(Q2.getStr(ioMode)); + s = Q2.getStr(ioMode); + Q3.setStr(s, ioMode); CYBOZU_TEST_EQUAL(Q2, Q3); } } } +void testIo(const G1& P, const G2& Q) +{ + testIoAll(P, Q); + G1 Z1; + G2 Z2; + Z1.clear(); + Z2.clear(); + testIoAll(Z1, Z2); +} + CYBOZU_TEST_AUTO(naive) { for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(g_testSetTbl); i++) { diff --git a/test/ec_test.cpp b/test/ec_test.cpp index 421979b..d29ed9e 100644 --- a/test/ec_test.cpp +++ b/test/ec_test.cpp @@ -286,14 +286,14 @@ struct Test { { std::string s = P.getStr(mcl::IoEcComp); CYBOZU_TEST_EQUAL(s.size(), Fp::getByteSize()); - Q.setStr(s, mcl::IoTight); + Q.setStr(s, mcl::IoEcComp); CYBOZU_TEST_EQUAL(P, Q); } { P = -P; std::string s = P.getStr(mcl::IoEcComp); CYBOZU_TEST_EQUAL(s.size(), Fp::getByteSize()); - Q.setStr(s, mcl::IoTight); + Q.setStr(s, mcl::IoEcComp); CYBOZU_TEST_EQUAL(P, Q); } P.clear(); @@ -301,7 +301,7 @@ struct Test { std::string s = P.getStr(mcl::IoEcComp); CYBOZU_TEST_EQUAL(s.size(), Fp::getByteSize()); CYBOZU_TEST_ASSERT(mcl::fp::isZeroArray(s.c_str(), s.size())); - Q.setStr(s, mcl::IoTight); + Q.setStr(s, mcl::IoEcComp); CYBOZU_TEST_EQUAL(P, Q); } } diff --git a/test/fp_tower_test.cpp b/test/fp_tower_test.cpp index ab62235..9859bf9 100644 --- a/test/fp_tower_test.cpp +++ b/test/fp_tower_test.cpp @@ -342,6 +342,22 @@ void testFpDbl() } } +void testIo() +{ + int modeTbl[] = { 0, 2, 2 | mcl::IoPrefix, 10, 16, 16 | mcl::IoPrefix, mcl::IoArray, mcl::IoArrayRaw }; + for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(modeTbl); i++) { + int ioMode = modeTbl[i]; + Fp12 x; + for (int j = 0; j < 12; j++) { + x.getFp0()[j] = j * j; + } + std::string s = x.getStr(ioMode); + Fp12 y; + y.setStr(s, ioMode); + CYBOZU_TEST_EQUAL(x, y); + } +} + void benchFp2() { puts(__FUNCTION__); @@ -383,6 +399,7 @@ void test(const char *p, mcl::fp::Mode mode) testFpDbl(); testFp6(); testFp12(); + testIo(); } void testAll() |