From 0693d342069b100cf53867c39c7d4e837bcdc366 Mon Sep 17 00:00:00 2001
From: MITSUNARI Shigeo <herumi@nifty.com>
Date: Wed, 9 Jan 2019 14:06:14 +0900
Subject: add VerifyAggregateHashes for cgo

---
 ffi/go/bls/bls.go      | 19 +++++++++++++++++++
 ffi/go/bls/bls_test.go | 50 +++++++++++++++++++++++++++++++++++++++-----------
 2 files changed, 58 insertions(+), 11 deletions(-)

diff --git a/ffi/go/bls/bls.go b/ffi/go/bls/bls.go
index ff4f951..a5c657c 100644
--- a/ffi/go/bls/bls.go
+++ b/ffi/go/bls/bls.go
@@ -365,3 +365,22 @@ func (sign *Sign) VerifyHash(pub *PublicKey, hash []byte) bool {
 	// #nosec
 	return C.blsVerifyHash(sign.getPointer(), pub.getPointer(), unsafe.Pointer(&hash[0]), C.size_t(len(hash))) == 1
 }
+
+func Min(x, y int) int {
+	if x < y {
+		return x
+	}
+	return y
+}
+
+// VerifyAggregateHashes --
+func (sign *Sign) VerifyAggregateHashes(pubVec []PublicKey, hash [][]byte) bool {
+	hashByte := GetOpUnitSize() * 8
+	n := len(hash)
+	h := make([]byte, n*hashByte)
+	for i := 0; i < n; i++ {
+		hn := len(hash[i])
+		copy(h[i*hashByte:(i+1)*hashByte], hash[i][0:Min(hn, hashByte)])
+	}
+	return C.blsVerifyAggregatedHashes(sign.getPointer(), pubVec[0].getPointer(), unsafe.Pointer(&h[0]), C.size_t(hashByte), C.size_t(n)) == 1
+}
diff --git a/ffi/go/bls/bls_test.go b/ffi/go/bls/bls_test.go
index 72f1838..84c8be2 100644
--- a/ffi/go/bls/bls_test.go
+++ b/ffi/go/bls/bls_test.go
@@ -4,6 +4,7 @@ import "testing"
 import "strconv"
 import "crypto/sha256"
 import "crypto/sha512"
+import "fmt"
 
 var unitN = 0
 
@@ -370,7 +371,7 @@ func testPairing(t *testing.T) {
 	}
 }
 
-func testAggregate2(t *testing.T) {
+func testAggregate(t *testing.T) {
 	var sec SecretKey
 	sec.SetByCSPRNG()
 	pub := sec.GetPublicKey()
@@ -394,20 +395,23 @@ func testAggregate2(t *testing.T) {
 	}
 }
 
+func Hash(buf []byte) []byte {
+	if GetOpUnitSize() == 4 {
+		d := sha256.Sum256([]byte(buf))
+		return d[:]
+	} else {
+		// use SHA512 if bitSize > 256
+		d := sha512.Sum512([]byte(buf))
+		return d[:]
+	}
+}
+
 func testHash(t *testing.T) {
 	var sec SecretKey
 	sec.SetByCSPRNG()
 	pub := sec.GetPublicKey()
 	m := "abc"
-	var h []byte
-	if GetOpUnitSize() == 4 {
-		d := sha256.Sum256([]byte(m))
-		h = d[:]
-	} else {
-		// use SHA512 if bitSize > 256
-		d := sha512.Sum512([]byte(m))
-		h = d[:]
-	}
+	h := Hash([]byte(m))
 	sig1 := sec.Sign(m)
 	sig2 := sec.SignHash(h)
 	if !sig1.IsEqual(sig2) {
@@ -421,6 +425,29 @@ func testHash(t *testing.T) {
 	}
 }
 
+func testAggregateHashes(t *testing.T) {
+	n := 1000
+	pubVec := make([]PublicKey, n)
+	sigVec := make([]*Sign, n)
+	h := make([][]byte, n)
+	for i := 0; i < n; i++ {
+		sec := new(SecretKey)
+		sec.SetByCSPRNG()
+		pubVec[i] = *sec.GetPublicKey()
+		m := fmt.Sprintf("abc-%d", i)
+		h[i] = Hash([]byte(m))
+		sigVec[i] = sec.SignHash(h[i])
+	}
+	// aggregate sig
+	sig := sigVec[0]
+	for i := 1; i < n; i++ {
+		sig.Add(sigVec[i])
+	}
+	if !sig.VerifyAggregateHashes(pubVec, h) {
+		t.Errorf("sig.VerifyAggregateHashes")
+	}
+}
+
 func test(t *testing.T, c int) {
 	err := Init(c)
 	if err != nil {
@@ -439,8 +466,9 @@ func test(t *testing.T, c int) {
 	testDHKeyExchange(t)
 	testSerializeToHexStr(t)
 	testPairing(t)
-	testAggregate2(t)
+	testAggregate(t)
 	testHash(t)
+	testAggregateHashes(t)
 }
 
 func TestMain(t *testing.T) {
-- 
cgit v1.2.3