aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2017-12-10 12:41:22 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2017-12-10 12:41:22 +0800
commitf5cb5cc1f3fa4711553674e82e77f433f5906832 (patch)
tree88ac59c71240c29e95c0d9d6e013c1e76476ab95
parent6b6432f86311d22f8595cc44f32075cdff390fcf (diff)
downloadtangerine-mcl-f5cb5cc1f3fa4711553674e82e77f433f5906832.tar.gz
tangerine-mcl-f5cb5cc1f3fa4711553674e82e77f433f5906832.tar.zst
tangerine-mcl-f5cb5cc1f3fa4711553674e82e77f433f5906832.zip
[capi] new deserialize api
-rw-r--r--Makefile4
-rw-r--r--include/mcl/bn.h17
-rw-r--r--src/bn_c_impl.hpp79
-rw-r--r--test/bn_c_test.hpp36
4 files changed, 103 insertions, 33 deletions
diff --git a/Makefile b/Makefile
index aefbe51..da8c6d1 100644
--- a/Makefile
+++ b/Makefile
@@ -220,8 +220,8 @@ endif
../she-wasm/she_c.js: $(JS_DEP)
emcc -o $@ src/fp.cpp src/she_c256.cpp $(EMCC_OPT)
-../mcl-wasm/mcl_c.js: src/fp.cpp src/bn_c256.cpp
- emcc -o $@ src/fp.cpp src/bn_c256.cpp $(EMCC_OPT)
+../mcl-wasm/mcl_c.js: src/fp.cpp src/bn_c256.cpp include/mcl/bn.h Makefile
+ emcc -o $@ src/fp.cpp src/bn_c256.cpp $(EMCC_OPT)# -DMCLBN_USE_NEW_DESERIALIZE_API
clean:
$(RM) $(MCL_LIB) $(MCL_SLIB) $(BN256_LIB) $(BN256_SLIB) $(BN384_LIB) $(BN384_SLIB) $(OBJ_DIR)/*.o $(OBJ_DIR)/*.d $(EXE_DIR)/*.exe $(GEN_EXE) $(ASM_OBJ) $(LIB_OBJ) $(BN256_OBJ) $(BN384_OBJ) $(LLVM_SRC) $(FUNC_LIST) src/*.ll
diff --git a/include/mcl/bn.h b/include/mcl/bn.h
index 1b92e9f..90ed5de 100644
--- a/include/mcl/bn.h
+++ b/include/mcl/bn.h
@@ -40,6 +40,14 @@
#endif
#endif
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ // return read size if sucess else 0
+ typedef mclSize mclRetType;
+#else
+ // return 0 if success else -1
+ typedef int mclRetType;
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -144,8 +152,7 @@ MCLBN_DLL_API void mclBnFr_setInt32(mclBnFr *y, int x);
*/
// return 0 if success
MCLBN_DLL_API int mclBnFr_setStr(mclBnFr *x, const char *buf, mclSize bufSize, int ioMode);
-// return error if buf >= r
-MCLBN_DLL_API int mclBnFr_deserialize(mclBnFr *x, const void *buf, mclSize bufSize);
+MCLBN_DLL_API mclRetType mclBnFr_deserialize(mclBnFr *x, const void *buf, mclSize bufSize);
// mask buf with (1 << (bitLen(r) - 1)) - 1 if buf >= r
MCLBN_DLL_API int mclBnFr_setLittleEndian(mclBnFr *x, const void *buf, mclSize bufSize);
@@ -180,7 +187,7 @@ MCLBN_DLL_API void mclBnG1_clear(mclBnG1 *x);
// return 0 if success
MCLBN_DLL_API int mclBnG1_setStr(mclBnG1 *x, const char *buf, mclSize bufSize, int ioMode);
-MCLBN_DLL_API int mclBnG1_deserialize(mclBnG1 *x, const void *buf, mclSize bufSize);
+MCLBN_DLL_API mclRetType mclBnG1_deserialize(mclBnG1 *x, const void *buf, mclSize bufSize);
// return 1 if true and 0 otherwise
MCLBN_DLL_API int mclBnG1_isValid(const mclBnG1 *x);
@@ -211,7 +218,7 @@ MCLBN_DLL_API void mclBnG2_clear(mclBnG2 *x);
// return 0 if success
MCLBN_DLL_API int mclBnG2_setStr(mclBnG2 *x, const char *buf, mclSize bufSize, int ioMode);
-MCLBN_DLL_API int mclBnG2_deserialize(mclBnG2 *x, const void *buf, mclSize bufSize);
+MCLBN_DLL_API mclRetType mclBnG2_deserialize(mclBnG2 *x, const void *buf, mclSize bufSize);
// return 1 if true and 0 otherwise
MCLBN_DLL_API int mclBnG2_isValid(const mclBnG2 *x);
@@ -244,7 +251,7 @@ MCLBN_DLL_API void mclBnGT_setInt32(mclBnGT *y, int x);
// return 0 if success
MCLBN_DLL_API int mclBnGT_setStr(mclBnGT *x, const char *buf, mclSize bufSize, int ioMode);
-MCLBN_DLL_API int mclBnGT_deserialize(mclBnGT *x, const void *buf, mclSize bufSize);
+MCLBN_DLL_API mclRetType mclBnGT_deserialize(mclBnGT *x, const void *buf, mclSize bufSize);
// return 1 if true and 0 otherwise
MCLBN_DLL_API int mclBnGT_isEqual(const mclBnGT *x, const mclBnGT *y);
diff --git a/src/bn_c_impl.hpp b/src/bn_c_impl.hpp
index d4703b8..ff8adea 100644
--- a/src/bn_c_impl.hpp
+++ b/src/bn_c_impl.hpp
@@ -48,14 +48,14 @@ static int closeErrFile()
}
template<class T>
-mclSize serialize(void *buf, mclSize maxBufSize, const T *x, int ioMode, const char *msg)
+mclSize getStr(void *buf, mclSize maxBufSize, const T *x, int ioMode, const char *msg)
try
{
std::string str;
cast(x)->getStr(str, ioMode);
mclSize terminate = (ioMode == 10 || ioMode == 16) ? 1 : 0;
if (str.size() + terminate > maxBufSize) {
- if (g_fp) fprintf(g_fp, "%s:serialize:small maxBufSize %d %d %d\n", msg, (int)maxBufSize, (int)str.size(), (int)terminate);
+ if (g_fp) fprintf(g_fp, "%s:getStr:small maxBufSize %d %d %d\n", msg, (int)maxBufSize, (int)str.size(), (int)terminate);
return 0;
}
memcpy(buf, str.c_str(), str.size());
@@ -69,16 +69,43 @@ mclSize serialize(void *buf, mclSize maxBufSize, const T *x, int ioMode, const c
}
template<class T>
-int deserialize(T *x, const void *buf, mclSize bufSize, int ioMode, const char *msg)
+mclSize serialize(void *buf, mclSize maxBufSize, const T *x, const char *msg)
try
{
- std::string str;
- str.assign((const char *)buf, bufSize);
- cast(x)->setStr(str, ioMode);
+ return (mclSize)cast(x)->serialize(buf, maxBufSize);
+} catch (std::exception& e) {
+ if (g_fp) fprintf(g_fp, "%s %s\n", msg, e.what());
return 0;
+}
+
+template<class T>
+int setStr(T *x, const char *buf, mclSize bufSize, int ioMode, const char *msg)
+ try
+{
+ cast(x)->setStr(std::string(buf, bufSize), ioMode);
+ return 0;
+} catch (std::exception& e) {
+ if (g_fp) fprintf(g_fp, "%s %s\n", msg, e.what());
+ return -1;
+}
+
+template<class T>
+mclRetType deserialize(T *x, const void *buf, mclSize bufSize, const char *msg)
+ try
+{
+ const size_t n = cast(x)->deserialize(buf, bufSize);
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ return mclSize(n);
+#else
+ return n == 0 ? -1 : 0;
+#endif
} catch (std::exception& e) {
if (g_fp) fprintf(g_fp, "%s %s\n", msg, e.what());
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ return 0;
+#else
return -1;
+#endif
}
int mclBn_setErrFile(const char *name)
@@ -181,7 +208,7 @@ void mclBnFr_setInt32(mclBnFr *y, int x)
int mclBnFr_setStr(mclBnFr *x, const char *buf, mclSize bufSize, int ioMode)
{
- return deserialize(x, buf, bufSize, ioMode, "mclBnFr_setStr");
+ return setStr(x, buf, bufSize, ioMode, "mclBnFr_setStr");
}
int mclBnFr_setLittleEndian(mclBnFr *x, const void *buf, mclSize bufSize)
try
@@ -192,9 +219,9 @@ int mclBnFr_setLittleEndian(mclBnFr *x, const void *buf, mclSize bufSize)
if (g_fp) fprintf(g_fp, "setArrayMask %s\n", e.what());
return -1;
}
-int mclBnFr_deserialize(mclBnFr *x, const void *buf, mclSize bufSize)
+mclRetType mclBnFr_deserialize(mclBnFr *x, const void *buf, mclSize bufSize)
{
- return deserialize(x, buf, bufSize, mcl::IoFixedSizeByteSeq, "mclBnFr_deserialize");
+ return deserialize(x, buf, bufSize, "mclBnFr_deserialize");
}
// return 1 if true
int mclBnFr_isValid(const mclBnFr *x)
@@ -237,11 +264,11 @@ int mclBnFr_setHashOf(mclBnFr *x, const void *buf, mclSize bufSize)
mclSize mclBnFr_getStr(char *buf, mclSize maxBufSize, const mclBnFr *x, int ioMode)
{
- return serialize(buf, maxBufSize, x, ioMode, "mclBnFr_getStr");
+ return getStr(buf, maxBufSize, x, ioMode, "mclBnFr_getStr");
}
mclSize mclBnFr_serialize(void *buf, mclSize maxBufSize, const mclBnFr *x)
{
- return serialize(buf, maxBufSize, x, mcl::IoFixedSizeByteSeq, "mclBnFr_serialize");
+ return serialize(buf, maxBufSize, x, "mclBnFr_serialize");
}
void mclBnFr_neg(mclBnFr *y, const mclBnFr *x)
@@ -278,11 +305,11 @@ void mclBnG1_clear(mclBnG1 *x)
int mclBnG1_setStr(mclBnG1 *x, const char *buf, mclSize bufSize, int ioMode)
{
- return deserialize(x, buf, bufSize, ioMode, "mclBnG1_setStr");
+ return setStr(x, buf, bufSize, ioMode, "mclBnG1_setStr");
}
-int mclBnG1_deserialize(mclBnG1 *x, const void *buf, mclSize bufSize)
+mclRetType mclBnG1_deserialize(mclBnG1 *x, const void *buf, mclSize bufSize)
{
- return deserialize(x, buf, bufSize, mcl::IoFixedSizeByteSeq, "mclBnG1_deserialize");
+ return deserialize(x, buf, bufSize, "mclBnG1_deserialize");
}
// return 1 if true
@@ -311,12 +338,12 @@ int mclBnG1_hashAndMapTo(mclBnG1 *x, const void *buf, mclSize bufSize)
mclSize mclBnG1_getStr(char *buf, mclSize maxBufSize, const mclBnG1 *x, int ioMode)
{
- return serialize(buf, maxBufSize, x, ioMode, "mclBnG1_getStr");
+ return getStr(buf, maxBufSize, x, ioMode, "mclBnG1_getStr");
}
mclSize mclBnG1_serialize(void *buf, mclSize maxBufSize, const mclBnG1 *x)
{
- return serialize(buf, maxBufSize, x, mcl::IoFixedSizeByteSeq, "mclBnG1_serialize");
+ return serialize(buf, maxBufSize, x, "mclBnG1_serialize");
}
void mclBnG1_neg(mclBnG1 *y, const mclBnG1 *x)
@@ -353,11 +380,11 @@ void mclBnG2_clear(mclBnG2 *x)
int mclBnG2_setStr(mclBnG2 *x, const char *buf, mclSize bufSize, int ioMode)
{
- return deserialize(x, buf, bufSize, ioMode, "mclBnG2_setStr");
+ return setStr(x, buf, bufSize, ioMode, "mclBnG2_setStr");
}
-int mclBnG2_deserialize(mclBnG2 *x, const void *buf, mclSize bufSize)
+mclRetType mclBnG2_deserialize(mclBnG2 *x, const void *buf, mclSize bufSize)
{
- return deserialize(x, buf, bufSize, mcl::IoFixedSizeByteSeq, "mclBnG2_deserialize");
+ return deserialize(x, buf, bufSize, "mclBnG2_deserialize");
}
// return 1 if true
@@ -386,11 +413,11 @@ int mclBnG2_hashAndMapTo(mclBnG2 *x, const void *buf, mclSize bufSize)
mclSize mclBnG2_getStr(char *buf, mclSize maxBufSize, const mclBnG2 *x, int ioMode)
{
- return serialize(buf, maxBufSize, x, ioMode, "mclBnG2_getStr");
+ return getStr(buf, maxBufSize, x, ioMode, "mclBnG2_getStr");
}
mclSize mclBnG2_serialize(void *buf, mclSize maxBufSize, const mclBnG2 *x)
{
- return serialize(buf, maxBufSize, x, mcl::IoFixedSizeByteSeq, "mclBnG2_serialize");
+ return serialize(buf, maxBufSize, x, "mclBnG2_serialize");
}
void mclBnG2_neg(mclBnG2 *y, const mclBnG2 *x)
@@ -437,11 +464,11 @@ void mclBnGT_setInt32(mclBnGT *y, int x)
int mclBnGT_setStr(mclBnGT *x, const char *buf, mclSize bufSize, int ioMode)
{
- return deserialize(x, buf, bufSize, ioMode, "mclBnGT_setStr");
+ return setStr(x, buf, bufSize, ioMode, "mclBnGT_setStr");
}
-int mclBnGT_deserialize(mclBnGT *x, const void *buf, mclSize bufSize)
+mclRetType mclBnGT_deserialize(mclBnGT *x, const void *buf, mclSize bufSize)
{
- return deserialize(x, buf, bufSize, mcl::IoFixedSizeByteSeq, "mclBnGT_deserialize");
+ return deserialize(x, buf, bufSize, "mclBnGT_deserialize");
}
// return 1 if true
@@ -460,12 +487,12 @@ int mclBnGT_isOne(const mclBnGT *x)
mclSize mclBnGT_getStr(char *buf, mclSize maxBufSize, const mclBnGT *x, int ioMode)
{
- return serialize(buf, maxBufSize, x, ioMode, "mclBnGT_getStr");
+ return getStr(buf, maxBufSize, x, ioMode, "mclBnGT_getStr");
}
mclSize mclBnGT_serialize(void *buf, mclSize maxBufSize, const mclBnGT *x)
{
- return serialize(buf, maxBufSize, x, mcl::IoFixedSizeByteSeq, "mclBnGT_serialize");
+ return serialize(buf, maxBufSize, x, "mclBnGT_serialize");
}
void mclBnGT_neg(mclBnGT *y, const mclBnGT *x)
diff --git a/test/bn_c_test.hpp b/test/bn_c_test.hpp
index 71f7974..1840cb5 100644
--- a/test/bn_c_test.hpp
+++ b/test/bn_c_test.hpp
@@ -344,15 +344,27 @@ CYBOZU_TEST_AUTO(serialize)
CYBOZU_TEST_EQUAL(n, expectSize);
ret = mclBnFr_deserialize(&x2, buf, n);
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ CYBOZU_TEST_EQUAL(ret, n);
+#else
CYBOZU_TEST_EQUAL(ret, 0);
+#endif
CYBOZU_TEST_ASSERT(mclBnFr_isEqual(&x1, &x2));
ret = mclBnFr_deserialize(&x2, buf, n - 1);
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ CYBOZU_TEST_EQUAL(ret, 0);
+#else
CYBOZU_TEST_ASSERT(ret != 0);
+#endif
memset(&x2, 0, sizeof(x2));
ret = mclBnFr_deserialize(&x2, buf, n + 1);
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ CYBOZU_TEST_EQUAL(ret, n);
+#else
CYBOZU_TEST_EQUAL(ret, 0);
+#endif
CYBOZU_TEST_ASSERT(mclBnFr_isEqual(&x1, &x2));
n = mclBnFr_serialize(buf, expectSize, &x1);
@@ -365,15 +377,27 @@ CYBOZU_TEST_AUTO(serialize)
CYBOZU_TEST_EQUAL(n, expectSize);
ret = mclBnG1_deserialize(&P2, buf, n);
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ CYBOZU_TEST_EQUAL(ret, n);
+#else
CYBOZU_TEST_EQUAL(ret, 0);
+#endif
CYBOZU_TEST_ASSERT(mclBnG1_isEqual(&P1, &P2));
ret = mclBnG1_deserialize(&P2, buf, n - 1);
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ CYBOZU_TEST_EQUAL(ret, 0);
+#else
CYBOZU_TEST_ASSERT(ret != 0);
+#endif
memset(&P2, 0, sizeof(P2));
ret = mclBnG1_deserialize(&P2, buf, n + 1);
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ CYBOZU_TEST_EQUAL(ret, n);
+#else
CYBOZU_TEST_EQUAL(ret, 0);
+#endif
CYBOZU_TEST_ASSERT(mclBnG1_isEqual(&P1, &P2));
n = mclBnG1_serialize(buf, expectSize, &P1);
@@ -386,15 +410,27 @@ CYBOZU_TEST_AUTO(serialize)
CYBOZU_TEST_EQUAL(n, expectSize);
ret = mclBnG2_deserialize(&Q2, buf, n);
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ CYBOZU_TEST_EQUAL(ret, n);
+#else
CYBOZU_TEST_EQUAL(ret, 0);
+#endif
CYBOZU_TEST_ASSERT(mclBnG2_isEqual(&Q1, &Q2));
ret = mclBnG2_deserialize(&Q2, buf, n - 1);
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ CYBOZU_TEST_EQUAL(ret, 0);
+#else
CYBOZU_TEST_ASSERT(ret != 0);
+#endif
memset(&Q2, 0, sizeof(Q2));
ret = mclBnG2_deserialize(&Q2, buf, n + 1);
+#ifdef MCLBN_USE_NEW_DESERIALIZE_API
+ CYBOZU_TEST_EQUAL(ret, n);
+#else
CYBOZU_TEST_EQUAL(ret, 0);
+#endif
CYBOZU_TEST_ASSERT(mclBnG2_isEqual(&Q1, &Q2));
n = mclBnG2_serialize(buf, expectSize, &Q1);