From 728b084e9acfd968e03ef299b97a4f844a730cbd Mon Sep 17 00:00:00 2001
From: MITSUNARI Shigeo <herumi@nifty.com>
Date: Sun, 23 Apr 2017 17:34:18 +0900
Subject: add getCurveOrder/getFieldOrder

---
 src/bls.cpp    |  9 +++++++++
 src/bls_if.cpp | 37 +++++++++++++++++++++++++++++++------
 2 files changed, 40 insertions(+), 6 deletions(-)

(limited to 'src')

diff --git a/src/bls.cpp b/src/bls.cpp
index 312cf23..9f94723 100644
--- a/src/bls.cpp
+++ b/src/bls.cpp
@@ -211,6 +211,15 @@ size_t getOpUnitSize()
 	return Fp::getUnitSize() * sizeof(mcl::fp::Unit) / sizeof(uint64_t);
 }
 
+void getCurveOrder(std::string& str)
+{
+	Fr::getModulo(str);
+}
+void getFieldOrder(std::string& str)
+{
+	Fp::getModulo(str);
+}
+
 Id::Id(unsigned int id)
 {
 	getInner().v = id;
diff --git a/src/bls_if.cpp b/src/bls_if.cpp
index 3bab145..7d2d78a 100644
--- a/src/bls_if.cpp
+++ b/src/bls_if.cpp
@@ -26,6 +26,16 @@ int setStrT(Outer *p, const char *buf, size_t bufSize)
 	return 1;
 }
 
+size_t checkAndCopy(char *buf, size_t maxBufSize, const std::string& s)
+{
+	if (s.size() >= maxBufSize) {
+		return 0;
+	}
+	memcpy(buf, s.c_str(), s.size());
+	buf[s.size()] = '\0';
+	return s.size();
+}
+
 template<class Inner, class Outer>
 size_t getStrT(const Outer *p, char *buf, size_t maxBufSize)
 	try
@@ -33,12 +43,7 @@ size_t getStrT(const Outer *p, char *buf, size_t maxBufSize)
 	std::ostringstream oss;
 	oss << *(const Inner*)p;
 	std::string s = oss.str();
-	if (s.size() > maxBufSize) {
-		fprintf(stderr, "err getStrT size is small %d %d\n", (int)s.size(), (int)maxBufSize);
-		return 0;
-	}
-	memcpy(buf, s.c_str(), s.size());
-	return s.size();
+	return checkAndCopy(buf, maxBufSize, s);
 } catch (std::exception&) {
 	return 0;
 }
@@ -79,6 +84,26 @@ size_t blsGetOpUnitSize()
 	return bls::getOpUnitSize();
 }
 
+int blsGetCurveOrder(char *buf, size_t maxBufSize)
+	try
+{
+	std::string s;
+	bls::getCurveOrder(s);
+	return checkAndCopy(buf, maxBufSize, s);
+} catch (std::exception&) {
+	return 0;
+}
+
+int blsGetFieldOrder(char *buf, size_t maxBufSize)
+	try
+{
+	std::string s;
+	bls::getFieldOrder(s);
+	return checkAndCopy(buf, maxBufSize, s);
+} catch (std::exception&) {
+	return 0;
+}
+
 blsId *blsIdCreate()
 {
 	return createT<bls::Id, blsId>();
-- 
cgit v1.2.3