diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2019-03-08 20:59:21 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2019-03-08 20:59:21 +0800 |
commit | b861a41edebe285168cbd2d06f41621d5ae36255 (patch) | |
tree | 93a0700ed19ba8436be26fd617ce18a7f631cc6f | |
parent | 5fcee19422f96902a5fdf9f29db427dd6fe9f16b (diff) | |
download | dexon-bls-b861a41edebe285168cbd2d06f41621d5ae36255.tar dexon-bls-b861a41edebe285168cbd2d06f41621d5ae36255.tar.gz dexon-bls-b861a41edebe285168cbd2d06f41621d5ae36255.tar.bz2 dexon-bls-b861a41edebe285168cbd2d06f41621d5ae36255.tar.lz dexon-bls-b861a41edebe285168cbd2d06f41621d5ae36255.tar.xz dexon-bls-b861a41edebe285168cbd2d06f41621d5ae36255.tar.zst dexon-bls-b861a41edebe285168cbd2d06f41621d5ae36255.zip |
add blsSecretKeySetLittleEndianMod
-rw-r--r-- | include/bls/bls.h | 3 | ||||
-rw-r--r-- | src/bls_c_impl.hpp | 6 | ||||
-rw-r--r-- | test/bls_c_test.hpp | 32 |
3 files changed, 38 insertions, 3 deletions
diff --git a/include/bls/bls.h b/include/bls/bls.h index 39cbf40..5e590ae 100644 --- a/include/bls/bls.h +++ b/include/bls/bls.h @@ -87,6 +87,9 @@ BLS_DLL_API void blsIdSetInt(blsId *id, int x); // return 0 if success // mask buf with (1 << (bitLen(r) - 1)) - 1 if buf >= r BLS_DLL_API int blsSecretKeySetLittleEndian(blsSecretKey *sec, const void *buf, mclSize bufSize); +// return 0 if success (bufSize <= 64) else -1 +// set (buf mod r) to sec +BLS_DLL_API int blsSecretKeySetLittleEndianMod(blsSecretKey *sec, const void *buf, mclSize bufSize); BLS_DLL_API void blsGetPublicKey(blsPublicKey *pub, const blsSecretKey *sec); diff --git a/src/bls_c_impl.hpp b/src/bls_c_impl.hpp index 197c146..b38c1ad 100644 --- a/src/bls_c_impl.hpp +++ b/src/bls_c_impl.hpp @@ -163,6 +163,12 @@ int blsSecretKeySetLittleEndian(blsSecretKey *sec, const void *buf, mclSize bufS cast(&sec->v)->setArrayMask((const char *)buf, bufSize); return 0; } +int blsSecretKeySetLittleEndianMod(blsSecretKey *sec, const void *buf, mclSize bufSize) +{ + bool b; + cast(&sec->v)->setArray(&b, (const char *)buf, bufSize, mcl::fp::Mod); + return b ? 0 : -1; +} void blsGetPublicKey(blsPublicKey *pub, const blsSecretKey *sec) { diff --git a/test/bls_c_test.hpp b/test/bls_c_test.hpp index cb5c912..b058e6c 100644 --- a/test/bls_c_test.hpp +++ b/test/bls_c_test.hpp @@ -3,6 +3,7 @@ #include <bls/bls.h> #include <string.h> #include <cybozu/benchmark.hpp> +#include <gmpxx.h> size_t pubSize(size_t FrSize) { @@ -78,7 +79,7 @@ void blsDataTest() CYBOZU_TEST_ASSERT(blsSignatureIsEqual(&sig1, &sig2)); } -void blsOrderTest(const char *curveOrder, const char *fieldOrder) +void blsOrderTest(const char *curveOrder/*Fr*/, const char *fieldOrder/*Fp*/) { char buf[1024]; size_t len; @@ -350,6 +351,30 @@ void blsTrivialShareTest() CYBOZU_TEST_ASSERT(blsPublicKeyIsEqual(&pub1, &pub2)); } +void modTest(const char *rStr) +{ + std::cout << std::hex; + unsigned char buf[1024] = {}; + int ret; + blsSecretKey sec; + const size_t pos = 63; + buf[pos] = 0xff; + mpz_class x = mpz_class(buf[pos]) << (pos * 8); + ret = blsSecretKeySetLittleEndianMod(&sec, buf, pos + 1); + CYBOZU_TEST_EQUAL(ret, 0); + mpz_class r(rStr); + x %= r; + size_t n = blsSecretKeySerialize(buf, sizeof(buf), &sec); + CYBOZU_TEST_ASSERT(n > 0); + // serialized data to mpz_class + mpz_class y = 0; + for (size_t i = 0; i < n; i++) { + y <<= 8; + y += buf[n - 1 - i]; + } + CYBOZU_TEST_EQUAL(x, y); +} + void blsBench() { blsSecretKey sec; @@ -370,8 +395,8 @@ CYBOZU_TEST_AUTO(all) { const struct { int curveType; - const char *p; const char *r; + const char *p; } tbl[] = { { MCL_BN254, @@ -403,11 +428,12 @@ CYBOZU_TEST_AUTO(all) } bls_use_stackTest(); blsDataTest(); - blsOrderTest(tbl[i].p, tbl[i].r); + blsOrderTest(tbl[i].r, tbl[i].p); blsSerializeTest(); if (tbl[i].curveType == MCL_BLS12_381) blsVerifyOrderTest(); blsAddSubTest(); blsTrivialShareTest(); + modTest(tbl[i].r); blsBench(); } } |