arnaucube
arnaucube/cryptofunPublic Self-hosted repository
bls signatures aggregation verification working
arnaucube arnaucube@gmail.com
Sat, 18 May 2019 14:08:23 +0200
commit

b14d5447a88156c8fefa46a421ffb078d0698265

parent

cccce548b3b04081f3bdc70ddc82e403ed611f45

3 files changed, 17 insertions(+), 18 deletions(-)

jump to
M bls/bls.go → bls/bls.go

@@ -3,7 +3,6 @@

import ( "crypto/rand" "crypto/sha256" - "fmt" "math/big" "github.com/arnaucube/go-snark/bn128"

@@ -81,34 +80,37 @@

return bls.Bn.Fq12.Equal(p1, p2) } +// AggregateSignatures +// s = s0 + s1 + s2 ... func (bls BLS) AggregateSignatures(signatures ...[3][2]*big.Int) [3][2]*big.Int { aggr := signatures[0] - for _, sig := range signatures { - aggr = bls.Bn.G2.Add(aggr, sig) + for i := 1; i < len(signatures); i++ { + aggr = bls.Bn.G2.Add(aggr, signatures[i]) } return aggr } -func (bls BLS) VerifyAggregatedSignatures(aggrsig [3][2]*big.Int, pubKArray [][3]*big.Int, mArray [][]byte) bool { - if len(pubKArray) != len(mArray) { - fmt.Println("pubK array and msg array not with the same number of elements") - return false - } + +// VerifyAggregatedSignatures +// ê(G,S) == ê(P, H(m)) +// ê(G, s0+s1+s2...) == ê(p0, H(m)) x ê(p1, H(m)) x ê(p2, H(m)) ... +func (bls BLS) VerifyAggregatedSignatures(aggrsig [3][2]*big.Int, pubKArray [][3]*big.Int, m []byte) bool { pairingGS, err := bls.Bn.Pairing(bls.Bn.G1.G, aggrsig) if err != nil { return false } - pairingsMul, err := bls.Bn.Pairing(pubKArray[0], bls.Hash(mArray[0])) + + pairingsMul, err := bls.Bn.Pairing(pubKArray[0], bls.Hash(m)) if err != nil { return false } - for i := 1; i < len(pubKArray); i++ { - e, err := bls.Bn.Pairing(pubKArray[i], bls.Hash(mArray[i])) + e, err := bls.Bn.Pairing(pubKArray[i], bls.Hash(m)) if err != nil { return false } pairingsMul = bls.Bn.Fq12.Mul(pairingsMul, e) } + if !bls.Bn.Fq12.Equal(pairingGS, pairingsMul) { return false }
M bls/bls_test.go → bls/bls_test.go

@@ -28,19 +28,17 @@

// signature aggregation keys1, err := bls.NewKeys() assert.Nil(t, err) - m1 := []byte("message1") - sig1 := bls.Sign(keys1.PrivK, m1) + sig1 := bls.Sign(keys1.PrivK, m0) + assert.True(t, bls.Verify(m0, sig1, keys1.PubK)) keys2, err := bls.NewKeys() assert.Nil(t, err) - m2 := []byte("message2") - sig2 := bls.Sign(keys2.PrivK, m2) + sig2 := bls.Sign(keys2.PrivK, m0) aggr := bls.AggregateSignatures(sig0, sig1, sig2) pubKArray := [][3]*big.Int{keys0.PubK, keys1.PubK, keys2.PubK} - mArray := [][]byte{m0, m1, m2} - verified = bls.VerifyAggregatedSignatures(aggr, pubKArray, mArray) + verified = bls.VerifyAggregatedSignatures(aggr, pubKArray, m0) fmt.Println("signature aggregation verified:", verified) assert.True(t, verified)
M go.mod → go.mod

@@ -1,7 +1,6 @@

module github.com/arnaucube/cryptofun require ( - github.com/arnaucube/bn128 v0.0.0-20181124004642-3bb6b68ddbe4 github.com/arnaucube/go-snark v0.0.0-20181207210027-19f7216d0e3d github.com/stretchr/testify v1.2.2 )