aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2017-05-01 14:49:07 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2017-05-01 14:49:07 +0800
commitcc38f9c51742eb02172fb53d8786b22ac5651ec2 (patch)
tree83a457cd2bdfdd94371a9969f9f5159cfeea4bc3
parent9d375d04ceadafefb5f6a7cb50b5f6b8e706c246 (diff)
downloaddexon-mcl-cc38f9c51742eb02172fb53d8786b22ac5651ec2.tar.gz
dexon-mcl-cc38f9c51742eb02172fb53d8786b22ac5651ec2.tar.zst
dexon-mcl-cc38f9c51742eb02172fb53d8786b22ac5651ec2.zip
all tests passed
-rw-r--r--include/mcl/ec.hpp26
-rw-r--r--include/mcl/fp.hpp10
-rw-r--r--include/mcl/fp_tower.hpp94
-rw-r--r--include/mcl/op.hpp15
-rw-r--r--test/bn_test.cpp20
-rw-r--r--test/ec_test.cpp6
-rw-r--r--test/fp_tower_test.cpp17
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()