aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2019-08-13 15:41:36 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2019-08-13 15:41:36 +0800
commit21dedae745b5ce7f7072ffaebdf53eca3b0b4e45 (patch)
treeafe1e4f4c4953cce737d5501d58a5a69f128d26f
parent55a1de171b64b919a79dd7ce67447401d5e00805 (diff)
downloadtangerine-mcl-0.97.tar.gz
tangerine-mcl-0.97.tar.zst
tangerine-mcl-0.97.zip
add mclBnFp_* like as mclBnFp_*v0.97
-rw-r--r--include/mcl/bn.h14
-rw-r--r--include/mcl/impl/bn_c_impl.hpp56
-rw-r--r--test/bn_c_test.hpp99
3 files changed, 169 insertions, 0 deletions
diff --git a/include/mcl/bn.h b/include/mcl/bn.h
index da2fe2f..e241f6d 100644
--- a/include/mcl/bn.h
+++ b/include/mcl/bn.h
@@ -238,6 +238,8 @@ MCLBN_DLL_API void mclBnFp2_clear(mclBnFp2 *x);
// set x to y
MCLBN_DLL_API void mclBnFr_setInt(mclBnFr *y, mclInt x);
MCLBN_DLL_API void mclBnFr_setInt32(mclBnFr *y, int x);
+MCLBN_DLL_API void mclBnFp_setInt(mclBnFp *y, mclInt x);
+MCLBN_DLL_API void mclBnFp_setInt32(mclBnFp *y, int x);
// x = buf & (1 << bitLen(r)) - 1
// if (x >= r) x &= (1 << (bitLen(r) - 1)) - 1
@@ -266,12 +268,16 @@ MCLBN_DLL_API int mclBnFr_isEqual(const mclBnFr *x, const mclBnFr *y);
MCLBN_DLL_API int mclBnFr_isZero(const mclBnFr *x);
MCLBN_DLL_API int mclBnFr_isOne(const mclBnFr *x);
+MCLBN_DLL_API int mclBnFp_isValid(const mclBnFp *x);
MCLBN_DLL_API int mclBnFp_isEqual(const mclBnFp *x, const mclBnFp *y);
+MCLBN_DLL_API int mclBnFp_isZero(const mclBnFp *x);
+MCLBN_DLL_API int mclBnFp_isOne(const mclBnFp *x);
MCLBN_DLL_API int mclBnFp2_isEqual(const mclBnFp2 *x, const mclBnFp2 *y);
#ifndef MCL_DONT_USE_CSRPNG
// return 0 if success
MCLBN_DLL_API int mclBnFr_setByCSPRNG(mclBnFr *x);
+MCLBN_DLL_API int mclBnFp_setByCSPRNG(mclBnFp *x);
/*
set user-defined random function for setByCSPRNG
@@ -302,6 +308,14 @@ MCLBN_DLL_API void mclBnFr_sub(mclBnFr *z, const mclBnFr *x, const mclBnFr *y);
MCLBN_DLL_API void mclBnFr_mul(mclBnFr *z, const mclBnFr *x, const mclBnFr *y);
MCLBN_DLL_API void mclBnFr_div(mclBnFr *z, const mclBnFr *x, const mclBnFr *y);
+MCLBN_DLL_API void mclBnFp_neg(mclBnFp *y, const mclBnFp *x);
+MCLBN_DLL_API void mclBnFp_inv(mclBnFp *y, const mclBnFp *x);
+MCLBN_DLL_API void mclBnFp_sqr(mclBnFp *y, const mclBnFp *x);
+MCLBN_DLL_API void mclBnFp_add(mclBnFp *z, const mclBnFp *x, const mclBnFp *y);
+MCLBN_DLL_API void mclBnFp_sub(mclBnFp *z, const mclBnFp *x, const mclBnFp *y);
+MCLBN_DLL_API void mclBnFp_mul(mclBnFp *z, const mclBnFp *x, const mclBnFp *y);
+MCLBN_DLL_API void mclBnFp_div(mclBnFp *z, const mclBnFp *x, const mclBnFp *y);
+
////////////////////////////////////////////////
// set zero
MCLBN_DLL_API void mclBnG1_clear(mclBnG1 *x);
diff --git a/include/mcl/impl/bn_c_impl.hpp b/include/mcl/impl/bn_c_impl.hpp
index 2df034d..a081ba9 100644
--- a/include/mcl/impl/bn_c_impl.hpp
+++ b/include/mcl/impl/bn_c_impl.hpp
@@ -183,6 +183,12 @@ int mclBnFr_setByCSPRNG(mclBnFr *x)
cast(x)->setByCSPRNG(&b);
return b ? 0 : -1;
}
+int mclBnFp_setByCSPRNG(mclBnFp *x)
+{
+ bool b;
+ cast(x)->setByCSPRNG(&b);
+ return b ? 0 : -1;
+}
void mclBn_setRandFunc(void *self, unsigned int (*readFunc)(void *self, void *buf, unsigned int bufSize))
{
mcl::fp::RandGen::setRandFunc(self, readFunc);
@@ -234,6 +240,35 @@ void mclBnFr_div(mclBnFr *z, const mclBnFr *x, const mclBnFr *y)
Fr::div(*cast(z),*cast(x), *cast(y));
}
+void mclBnFp_neg(mclBnFp *y, const mclBnFp *x)
+{
+ Fp::neg(*cast(y), *cast(x));
+}
+void mclBnFp_inv(mclBnFp *y, const mclBnFp *x)
+{
+ Fp::inv(*cast(y), *cast(x));
+}
+void mclBnFp_sqr(mclBnFp *y, const mclBnFp *x)
+{
+ Fp::sqr(*cast(y), *cast(x));
+}
+void mclBnFp_add(mclBnFp *z, const mclBnFp *x, const mclBnFp *y)
+{
+ Fp::add(*cast(z),*cast(x), *cast(y));
+}
+void mclBnFp_sub(mclBnFp *z, const mclBnFp *x, const mclBnFp *y)
+{
+ Fp::sub(*cast(z),*cast(x), *cast(y));
+}
+void mclBnFp_mul(mclBnFp *z, const mclBnFp *x, const mclBnFp *y)
+{
+ Fp::mul(*cast(z),*cast(x), *cast(y));
+}
+void mclBnFp_div(mclBnFp *z, const mclBnFp *x, const mclBnFp *y)
+{
+ Fp::div(*cast(z),*cast(x), *cast(y));
+}
+
////////////////////////////////////////////////
// set zero
void mclBnG1_clear(mclBnG1 *x)
@@ -564,6 +599,15 @@ void mclBn_verifyOrderG2(int doVerify)
verifyOrderG2(doVerify != 0);
}
+void mclBnFp_setInt(mclBnFp *y, mclInt x)
+{
+ *cast(y) = x;
+}
+void mclBnFp_setInt32(mclBnFp *y, int x)
+{
+ *cast(y) = x;
+}
+
mclSize mclBnFp_getStr(char *buf, mclSize maxBufSize, const mclBnFp *x, int ioMode)
{
return cast(x)->getStr(buf, maxBufSize, ioMode);
@@ -604,10 +648,22 @@ mclSize mclBnFp_getLittleEndian(void *buf, mclSize maxBufSize, const mclBnFp *x)
{
return cast(x)->getLittleEndian(buf, maxBufSize);
}
+int mclBnFp_isValid(const mclBnFp *x)
+{
+ return cast(x)->isValid();
+}
int mclBnFp_isEqual(const mclBnFp *x, const mclBnFp *y)
{
return *cast(x) == *cast(y);
}
+int mclBnFp_isZero(const mclBnFp *x)
+{
+ return cast(x)->isZero();
+}
+int mclBnFp_isOne(const mclBnFp *x)
+{
+ return cast(x)->isOne();
+}
int mclBnFp_setHashOf(mclBnFp *x, const void *buf, mclSize bufSize)
{
diff --git a/test/bn_c_test.hpp b/test/bn_c_test.hpp
index cc8ceab..7aaf94a 100644
--- a/test/bn_c_test.hpp
+++ b/test/bn_c_test.hpp
@@ -568,6 +568,94 @@ CYBOZU_TEST_AUTO(setRandFunc)
}
}
+CYBOZU_TEST_AUTO(Fp_1)
+{
+ mclBnFp x, y;
+ memset(&x, 0xff, sizeof(x));
+ CYBOZU_TEST_ASSERT(!mclBnFp_isValid(&x));
+ CYBOZU_TEST_ASSERT(!mclBnFp_isZero(&x));
+
+ mclBnFp_clear(&x);
+ CYBOZU_TEST_ASSERT(mclBnFp_isZero(&x));
+
+ mclBnFp_setInt(&x, 1);
+ CYBOZU_TEST_ASSERT(mclBnFp_isOne(&x));
+
+ mclBnFp_setInt(&y, -1);
+ CYBOZU_TEST_ASSERT(!mclBnFp_isEqual(&x, &y));
+
+ y = x;
+ CYBOZU_TEST_ASSERT(mclBnFp_isEqual(&x, &y));
+
+ mclBnFp_setHashOf(&x, "", 0);
+ mclBnFp_setHashOf(&y, "abc", 3);
+ CYBOZU_TEST_ASSERT(!mclBnFp_isEqual(&x, &y));
+ mclBnFp_setHashOf(&x, "abc", 3);
+ CYBOZU_TEST_ASSERT(mclBnFp_isEqual(&x, &y));
+
+ char buf[1024];
+ mclBnFp_setInt(&x, 12345678);
+ size_t size;
+ size = mclBnFp_getStr(buf, sizeof(buf), &x, 10);
+ CYBOZU_TEST_EQUAL(size, 8);
+ CYBOZU_TEST_EQUAL(buf, "12345678");
+
+ mclBnFp_setInt(&x, -7654321);
+ mclBnFp_neg(&x, &x);
+ size = mclBnFp_getStr(buf, sizeof(buf), &x, 10);
+ CYBOZU_TEST_EQUAL(size, 7);
+ CYBOZU_TEST_EQUAL(buf, "7654321");
+
+ mclBnFp_setInt(&y, 123 - 7654321);
+ mclBnFp_add(&x, &x, &y);
+ size = mclBnFp_getStr(buf, sizeof(buf), &x, 10);
+ CYBOZU_TEST_EQUAL(size, 3);
+ CYBOZU_TEST_EQUAL(buf, "123");
+
+ mclBnFp_setInt(&y, 100);
+ mclBnFp_sub(&x, &x, &y);
+ size = mclBnFp_getStr(buf, sizeof(buf), &x, 10);
+ CYBOZU_TEST_EQUAL(size, 2);
+ CYBOZU_TEST_EQUAL(buf, "23");
+
+ mclBnFp_mul(&x, &x, &y);
+ size = mclBnFp_getStr(buf, sizeof(buf), &x, 10);
+ CYBOZU_TEST_EQUAL(size, 4);
+ CYBOZU_TEST_EQUAL(buf, "2300");
+
+ mclBnFp_div(&x, &x, &y);
+ size = mclBnFp_getStr(buf, sizeof(buf), &x, 10);
+ CYBOZU_TEST_EQUAL(size, 2);
+ CYBOZU_TEST_EQUAL(buf, "23");
+
+ mclBnFp_mul(&x, &y, &y);
+ mclBnFp_sqr(&y, &y);
+ CYBOZU_TEST_ASSERT(mclBnFp_isEqual(&x, &y));
+
+ const char *s = "12345678901234567";
+ CYBOZU_TEST_ASSERT(!mclBnFp_setStr(&x, s, strlen(s), 10));
+ s = "20000000000000000";
+ CYBOZU_TEST_ASSERT(!mclBnFp_setStr(&y, s, strlen(s), 10));
+ mclBnFp_add(&x, &x, &y);
+ size = mclBnFp_getStr(buf, sizeof(buf), &x, 10);
+ CYBOZU_TEST_EQUAL(size, 17);
+ CYBOZU_TEST_EQUAL(buf, "32345678901234567");
+
+ mclBnFp_setInt(&x, 1);
+ mclBnFp_neg(&x, &x);
+ size = mclBnFp_getStr(buf, sizeof(buf), &x, 10);
+ CYBOZU_TEST_ASSERT(size > 0);
+ CYBOZU_TEST_EQUAL(size, strlen(buf));
+ CYBOZU_TEST_ASSERT(!mclBnFp_setStr(&y, buf, size, 10));
+ CYBOZU_TEST_ASSERT(mclBnFp_isEqual(&x, &y));
+
+ for (int i = 0; i < 10; i++) {
+ mclBnFp_setByCSPRNG(&x);
+ mclBnFp_getStr(buf, sizeof(buf), &x, 16);
+ printf("%s\n", buf);
+ }
+}
+
CYBOZU_TEST_AUTO(Fp)
{
mclBnFp x1, x2;
@@ -593,6 +681,17 @@ CYBOZU_TEST_AUTO(Fp)
mclBnFp_clear(&x1);
memset(&x2, 0, sizeof(x2));
CYBOZU_TEST_ASSERT(mclBnFp_isEqual(&x1, &x2));
+
+ mclBnFp_clear(&x1);
+ CYBOZU_TEST_ASSERT(mclBnFp_isZero(&x1));
+
+ mclBnFp_setInt(&x1, 1);
+ CYBOZU_TEST_ASSERT(mclBnFp_isOne(&x1));
+
+ mclBnFp_setInt(&x1, -1);
+ CYBOZU_TEST_ASSERT(!mclBnFp_isOne(&x1));
+ mclBnFp_neg(&x1, &x1);
+ CYBOZU_TEST_ASSERT(mclBnFp_isOne(&x1));
}
CYBOZU_TEST_AUTO(mod)