aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2019-03-07 17:00:31 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2019-03-07 17:00:31 +0800
commitb3889f3bd981ab0b2449fd09822634a9c365236e (patch)
treee6ea7e4d0827b7957d5d6d2cff8b4a2771cbd8a5
parent5cd3c9f9b48cb79a6bcb4104cd5646973d94e3db (diff)
downloadtangerine-mcl-b3889f3bd981ab0b2449fd09822634a9c365236e.tar.gz
tangerine-mcl-b3889f3bd981ab0b2449fd09822634a9c365236e.tar.zst
tangerine-mcl-b3889f3bd981ab0b2449fd09822634a9c365236e.zip
add mclBn{Fr,Fp}_setLittleEndianMod
-rw-r--r--include/mcl/bn.h7
-rw-r--r--include/mcl/impl/bn_c_impl.hpp12
-rw-r--r--test/bn_c_test.hpp29
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;