aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2018-09-13 04:23:28 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2018-09-13 04:23:28 +0800
commitbe54124ccf649ace15ef0f90dbf04f01fab8ac3c (patch)
tree2c483ec9d8e0c2d1b4ba00ffcf456d5dbb9d79b6
parent33bee1b86a6b28ec543c96faecfbbc194552c0d6 (diff)
downloaddexon-bls-be54124ccf649ace15ef0f90dbf04f01fab8ac3c.tar
dexon-bls-be54124ccf649ace15ef0f90dbf04f01fab8ac3c.tar.gz
dexon-bls-be54124ccf649ace15ef0f90dbf04f01fab8ac3c.tar.bz2
dexon-bls-be54124ccf649ace15ef0f90dbf04f01fab8ac3c.tar.lz
dexon-bls-be54124ccf649ace15ef0f90dbf04f01fab8ac3c.tar.xz
dexon-bls-be54124ccf649ace15ef0f90dbf04f01fab8ac3c.tar.zst
dexon-bls-be54124ccf649ace15ef0f90dbf04f01fab8ac3c.zip
add bls*Sub functions
-rw-r--r--include/bls/bls.h5
-rw-r--r--src/bls_c.cpp14
-rw-r--r--test/bls_c384_test.cpp39
3 files changed, 58 insertions, 0 deletions
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();
}
}