aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2018-08-26 10:32:13 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2018-08-26 10:32:13 +0800
commit1fea3145f1a595de561527888ffc961bdf7907af (patch)
treed358f462341d42cdca38db35ae8ee2b0577d8737
parent06a8ffae438a61552555ffff930bb92e80398f2b (diff)
downloaddexon-bls-1fea3145f1a595de561527888ffc961bdf7907af.tar
dexon-bls-1fea3145f1a595de561527888ffc961bdf7907af.tar.gz
dexon-bls-1fea3145f1a595de561527888ffc961bdf7907af.tar.bz2
dexon-bls-1fea3145f1a595de561527888ffc961bdf7907af.tar.lz
dexon-bls-1fea3145f1a595de561527888ffc961bdf7907af.tar.xz
dexon-bls-1fea3145f1a595de561527888ffc961bdf7907af.tar.zst
dexon-bls-1fea3145f1a595de561527888ffc961bdf7907af.zip
add verifyOrder
-rw-r--r--include/bls/bls.h12
-rw-r--r--src/bls_c.cpp17
-rw-r--r--test/bls_c384_test.cpp32
3 files changed, 61 insertions, 0 deletions
diff --git a/include/bls/bls.h b/include/bls/bls.h
index 0592b95..7188097 100644
--- a/include/bls/bls.h
+++ b/include/bls/bls.h
@@ -108,6 +108,18 @@ BLS_DLL_API void blsSecretKeyAdd(blsSecretKey *sec, const blsSecretKey *rhs);
BLS_DLL_API void blsPublicKeyAdd(blsPublicKey *pub, const blsPublicKey *rhs);
BLS_DLL_API void blsSignatureAdd(blsSignature *sig, const blsSignature *rhs);
+/*
+ verify whether a point of an elliptic curve has order r
+ This api affetcs setStr(), deserialize() for G2 on BN or G1/G2 on BLS12
+ @param doVerify [in] does not verify if zero(default 1)
+ Signature = G1, PublicKey = G2
+*/
+BLS_DLL_API void blsSignatureVerifyOrder(int doVerify);
+BLS_DLL_API void blsPublicKeyVerifyOrder(int doVerify);
+// deserialize under VerifyOrder(true) = deserialize under VerifyOrder(false) + IsValidOrder
+BLS_DLL_API int blsSignatureIsValidOrder(const blsSignature *sig);
+BLS_DLL_API int blsPublicKeyIsValidOrder(const blsPublicKey *pub);
+
#ifndef BLS_MINIMUM_API
// not thread safe version (old blsInit)
diff --git a/src/bls_c.cpp b/src/bls_c.cpp
index 5ea665c..a03850a 100644
--- a/src/bls_c.cpp
+++ b/src/bls_c.cpp
@@ -224,6 +224,23 @@ void blsSignatureAdd(blsSignature *sig, const blsSignature *rhs)
mclBnG1_add(&sig->v, &sig->v, &rhs->v);
}
+void blsSignatureVerifyOrder(int doVerify)
+{
+ mclBn_verifyOrderG1(doVerify);
+}
+void blsPublicKeyVerifyOrder(int doVerify)
+{
+ mclBn_verifyOrderG2(doVerify);
+}
+int blsSignatureIsValidOrder(const blsSignature *sig)
+{
+ return mclBnG1_isValidOrder(&sig->v);
+}
+int blsPublicKeyIsValidOrder(const blsPublicKey *pub)
+{
+ return mclBnG2_isValidOrder(&pub->v);
+}
+
#ifndef BLS_MINIMUM_API
mclSize blsGetOpUnitSize() // FpUint64Size
{
diff --git a/test/bls_c384_test.cpp b/test/bls_c384_test.cpp
index 6202697..984c9c3 100644
--- a/test/bls_c384_test.cpp
+++ b/test/bls_c384_test.cpp
@@ -179,6 +179,7 @@ void blsSerializeTest()
blsGetPublicKey(&pub1, &sec1);
n = blsPublicKeySerialize(buf, sizeof(buf), &pub1);
CYBOZU_TEST_EQUAL(n, expectSize);
+ CYBOZU_TEST_ASSERT(blsPublicKeyIsValidOrder(&pub1));
ret = blsPublicKeyDeserialize(&pub2, buf, n);
CYBOZU_TEST_EQUAL(ret, n);
@@ -201,6 +202,7 @@ void blsSerializeTest()
blsSign(&sig1, &sec1, "abc", 3);
n = blsSignatureSerialize(buf, sizeof(buf), &sig1);
CYBOZU_TEST_EQUAL(n, expectSize);
+ CYBOZU_TEST_ASSERT(blsSignatureIsValidOrder(&sig1));
ret = blsSignatureDeserialize(&sig2, buf, n);
CYBOZU_TEST_EQUAL(ret, n);
@@ -219,6 +221,35 @@ void blsSerializeTest()
CYBOZU_TEST_EQUAL(n, expectSize);
}
+void blsVerifyOrderTest()
+{
+ puts("blsVerifyOrderTest");
+ const uint8_t Ps[] = {
+0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+ };
+ const uint8_t Qs[] = {
+0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+ };
+ size_t n;
+ blsPublicKey pub;
+ n = blsPublicKeyDeserialize(&pub, Ps, sizeof(Ps));
+ CYBOZU_TEST_EQUAL(n, 0);
+ blsPublicKeyVerifyOrder(0);
+ n = blsPublicKeyDeserialize(&pub, Ps, sizeof(Ps));
+ CYBOZU_TEST_ASSERT(n > 0);
+ CYBOZU_TEST_ASSERT(!blsPublicKeyIsValidOrder(&pub));
+ blsPublicKeyVerifyOrder(1);
+
+ blsSignature sig;
+ n = blsSignatureDeserialize(&sig, Qs, sizeof(Ps));
+ CYBOZU_TEST_EQUAL(n, 0);
+ blsSignatureVerifyOrder(0);
+ n = blsSignatureDeserialize(&sig, Qs, sizeof(Ps));
+ CYBOZU_TEST_ASSERT(n > 0);
+ CYBOZU_TEST_ASSERT(!blsSignatureIsValidOrder(&sig));
+ blsSignatureVerifyOrder(1);
+}
+
CYBOZU_TEST_AUTO(all)
{
const int tbl[] = {
@@ -245,5 +276,6 @@ CYBOZU_TEST_AUTO(all)
blsDataTest();
blsOrderTest(curveOrderTbl[i], fieldOrderTbl[i]);
blsSerializeTest();
+ if (tbl[i] == MCL_BLS12_381) blsVerifyOrderTest();
}
}