diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2019-03-07 17:00:31 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2019-03-07 17:00:31 +0800 |
commit | b3889f3bd981ab0b2449fd09822634a9c365236e (patch) | |
tree | e6ea7e4d0827b7957d5d6d2cff8b4a2771cbd8a5 | |
parent | 5cd3c9f9b48cb79a6bcb4104cd5646973d94e3db (diff) | |
download | tangerine-mcl-b3889f3bd981ab0b2449fd09822634a9c365236e.tar.gz tangerine-mcl-b3889f3bd981ab0b2449fd09822634a9c365236e.tar.zst tangerine-mcl-b3889f3bd981ab0b2449fd09822634a9c365236e.zip |
add mclBn{Fr,Fp}_setLittleEndianMod
-rw-r--r-- | include/mcl/bn.h | 7 | ||||
-rw-r--r-- | include/mcl/impl/bn_c_impl.hpp | 12 | ||||
-rw-r--r-- | test/bn_c_test.hpp | 29 |
3 files changed, 48 insertions, 0 deletions
diff --git a/include/mcl/bn.h b/include/mcl/bn.h index 2ea72ac..ca26000 100644 --- a/include/mcl/bn.h +++ b/include/mcl/bn.h @@ -233,6 +233,13 @@ MCLBN_DLL_API void mclBnFr_setInt32(mclBnFr *y, int x); MCLBN_DLL_API int mclBnFr_setLittleEndian(mclBnFr *x, const void *buf, mclSize bufSize); MCLBN_DLL_API int mclBnFp_setLittleEndian(mclBnFp *x, const void *buf, mclSize bufSize); +// set (buf mod r) to x +// return 0 if bufSize <= (byte size of Fr * 2) else -1 +MCLBN_DLL_API int mclBnFr_setLittleEndianMod(mclBnFr *x, const void *buf, mclSize bufSize); +// set (buf mod p) to x +// return 0 if bufSize <= (byte size of Fp * 2) else -1 +MCLBN_DLL_API int mclBnFp_setLittleEndianMod(mclBnFp *x, const void *buf, mclSize bufSize); + // return 1 if true and 0 otherwise MCLBN_DLL_API int mclBnFr_isValid(const mclBnFr *x); MCLBN_DLL_API int mclBnFr_isEqual(const mclBnFr *x, const mclBnFr *y); diff --git a/include/mcl/impl/bn_c_impl.hpp b/include/mcl/impl/bn_c_impl.hpp index ab63ec9..1852668 100644 --- a/include/mcl/impl/bn_c_impl.hpp +++ b/include/mcl/impl/bn_c_impl.hpp @@ -134,6 +134,12 @@ int mclBnFr_setLittleEndian(mclBnFr *x, const void *buf, mclSize bufSize) cast(x)->setArrayMask((const char *)buf, bufSize); return 0; } +int mclBnFr_setLittleEndianMod(mclBnFr *x, const void *buf, mclSize bufSize) +{ + bool b; + cast(x)->setArray(&b, (const char *)buf, bufSize, mcl::fp::Mod); + return b ? 0 : -1; +} mclSize mclBnFr_deserialize(mclBnFr *x, const void *buf, mclSize bufSize) { return (mclSize)cast(x)->deserialize(buf, bufSize); @@ -573,6 +579,12 @@ int mclBnFp_setLittleEndian(mclBnFp *x, const void *buf, mclSize bufSize) return 0; } +int mclBnFp_setLittleEndianMod(mclBnFp *x, const void *buf, mclSize bufSize) +{ + bool b; + cast(x)->setArray(&b, (const char *)buf, bufSize, mcl::fp::Mod); + return b ? 0 : -1; +} int mclBnFp_isEqual(const mclBnFp *x, const mclBnFp *y) { return *cast(x) == *cast(y); diff --git a/test/bn_c_test.hpp b/test/bn_c_test.hpp index 8631ef1..e9dc593 100644 --- a/test/bn_c_test.hpp +++ b/test/bn_c_test.hpp @@ -5,6 +5,7 @@ #include <mcl/ecparam.hpp> #include <cybozu/test.hpp> #include <iostream> +#include <gmpxx.h> template<size_t N> std::ostream& dump(std::ostream& os, const uint64_t (&x)[N]) @@ -594,6 +595,34 @@ CYBOZU_TEST_AUTO(Fp) CYBOZU_TEST_ASSERT(mclBnFp_isEqual(&x1, &x2)); } +CYBOZU_TEST_AUTO(mod) +{ + { + // Fp + char buf[1024]; + mclBn_getFieldOrder(buf, sizeof(buf)); + mpz_class p(buf); + mpz_class x = mpz_class(1) << (mclBn_getFpByteSize() * 2); + mclBnFp y; + int ret = mclBnFp_setLittleEndianMod(&y, x.get_mpz_t()->_mp_d, x.get_mpz_t()->_mp_size * sizeof(void*)); + CYBOZU_TEST_EQUAL(ret, 0); + mclBnFp_getStr(buf, sizeof(buf), &y, 10); + CYBOZU_TEST_EQUAL(mpz_class(buf), x % p); + } + { + // Fr + char buf[1024]; + mclBn_getCurveOrder(buf, sizeof(buf)); + mpz_class p(buf); + mpz_class x = mpz_class(1) << (mclBn_getFrByteSize() * 2); + mclBnFr y; + int ret = mclBnFr_setLittleEndianMod(&y, x.get_mpz_t()->_mp_d, x.get_mpz_t()->_mp_size * sizeof(void*)); + CYBOZU_TEST_EQUAL(ret, 0); + mclBnFr_getStr(buf, sizeof(buf), &y, 10); + CYBOZU_TEST_EQUAL(mpz_class(buf), x % p); + } +} + CYBOZU_TEST_AUTO(Fp2) { mclBnFp2 x1, x2; |