diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2017-12-10 12:41:22 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2017-12-10 12:41:22 +0800 |
commit | f5cb5cc1f3fa4711553674e82e77f433f5906832 (patch) | |
tree | 88ac59c71240c29e95c0d9d6e013c1e76476ab95 | |
parent | 6b6432f86311d22f8595cc44f32075cdff390fcf (diff) | |
download | tangerine-mcl-f5cb5cc1f3fa4711553674e82e77f433f5906832.tar.gz tangerine-mcl-f5cb5cc1f3fa4711553674e82e77f433f5906832.tar.zst tangerine-mcl-f5cb5cc1f3fa4711553674e82e77f433f5906832.zip |
[capi] new deserialize api
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | include/mcl/bn.h | 17 | ||||
-rw-r--r-- | src/bn_c_impl.hpp | 79 | ||||
-rw-r--r-- | test/bn_c_test.hpp | 36 |
4 files changed, 103 insertions, 33 deletions
@@ -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); |