From be54124ccf649ace15ef0f90dbf04f01fab8ac3c Mon Sep 17 00:00:00 2001 From: MITSUNARI Shigeo Date: Thu, 13 Sep 2018 05:23:28 +0900 Subject: add bls*Sub functions --- include/bls/bls.h | 5 +++++ src/bls_c.cpp | 14 ++++++++++++++ test/bls_c384_test.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/include/bls/bls.h b/include/bls/bls.h index 7188097..21cd5b0 100644 --- a/include/bls/bls.h +++ b/include/bls/bls.h @@ -122,6 +122,11 @@ BLS_DLL_API int blsPublicKeyIsValidOrder(const blsPublicKey *pub); #ifndef BLS_MINIMUM_API +// sub +BLS_DLL_API void blsSecretKeySub(blsSecretKey *sec, const blsSecretKey *rhs); +BLS_DLL_API void blsPublicKeySub(blsPublicKey *pub, const blsPublicKey *rhs); +BLS_DLL_API void blsSignatureSub(blsSignature *sig, const blsSignature *rhs); + // not thread safe version (old blsInit) BLS_DLL_API int blsInitNotThreadSafe(int curve, int maxUnitSize); diff --git a/src/bls_c.cpp b/src/bls_c.cpp index 06a5b0a..75e5a44 100644 --- a/src/bls_c.cpp +++ b/src/bls_c.cpp @@ -267,6 +267,20 @@ int blsPublicKeyIsValidOrder(const blsPublicKey *pub) } #ifndef BLS_MINIMUM_API +void blsSecretKeySub(blsSecretKey *sec, const blsSecretKey *rhs) +{ + mclBnFr_sub(&sec->v, &sec->v, &rhs->v); +} + +void blsPublicKeySub(blsPublicKey *pub, const blsPublicKey *rhs) +{ + mclBnG2_sub(&pub->v, &pub->v, &rhs->v); +} + +void blsSignatureSub(blsSignature *sig, const blsSignature *rhs) +{ + mclBnG1_sub(&sig->v, &sig->v, &rhs->v); +} mclSize blsGetOpUnitSize() // FpUint64Size { return Fp::getUnitSize() * sizeof(mcl::fp::Unit) / sizeof(uint64_t); diff --git a/test/bls_c384_test.cpp b/test/bls_c384_test.cpp index 984c9c3..ede3596 100644 --- a/test/bls_c384_test.cpp +++ b/test/bls_c384_test.cpp @@ -250,6 +250,44 @@ void blsVerifyOrderTest() blsSignatureVerifyOrder(1); } +void blsAddSubTest() +{ + blsSecretKey sec[3]; + blsPublicKey pub[3]; + blsSignature sig[3]; + const char *msg = "this is a pen"; + const size_t msgSize = strlen(msg); + + const char *secHexStr[8] = { "12", "34" }; + for (int i = 0; i < 2; i++) { + blsSecretKeySetHexStr(&sec[i], secHexStr[i], strlen(secHexStr[i])); + blsGetPublicKey(&pub[i], &sec[i]); + blsSign(&sig[i], &sec[i], msg, msgSize); + } + sec[2] = sec[0]; + blsSecretKeyAdd(&sec[2], &sec[1]); + char buf[1024]; + size_t n = blsSecretKeyGetHexStr(buf, sizeof(buf), &sec[2]); + CYBOZU_TEST_EQUAL(n, 2); + CYBOZU_TEST_EQUAL(buf, "46"); // "12" + "34" + + pub[2] = pub[0]; + blsPublicKeyAdd(&pub[2], &pub[1]); + sig[2] = sig[0]; + blsSignatureAdd(&sig[2], &sig[1]); // sig[2] = sig[0] + sig[1] + blsSignature sig2; + blsSign(&sig2, &sec[2], msg, msgSize); // sig2 = signature by sec[2] + CYBOZU_TEST_ASSERT(blsSignatureIsEqual(&sig2, &sig[2])); + CYBOZU_TEST_ASSERT(blsVerify(&sig[2], &pub[2], msg, msgSize)); // verify by pub[2] + + blsSecretKeySub(&sec[2], &sec[1]); + CYBOZU_TEST_ASSERT(blsSecretKeyIsEqual(&sec[2], &sec[0])); + blsPublicKeySub(&pub[2], &pub[1]); + CYBOZU_TEST_ASSERT(blsPublicKeyIsEqual(&pub[2], &pub[0])); + blsSignatureSub(&sig[2], &sig[1]); + CYBOZU_TEST_ASSERT(blsSignatureIsEqual(&sig[2], &sig[0])); +} + CYBOZU_TEST_AUTO(all) { const int tbl[] = { @@ -277,5 +315,6 @@ CYBOZU_TEST_AUTO(all) blsOrderTest(curveOrderTbl[i], fieldOrderTbl[i]); blsSerializeTest(); if (tbl[i] == MCL_BLS12_381) blsVerifyOrderTest(); + blsAddSubTest(); } } -- cgit v1.2.3