mirror of
https://github.com/arnaucube/cryptofun.git
synced 2026-02-28 05:16:46 +01:00
bls signatures aggregation verification working
This commit is contained in:
24
bls/bls.go
24
bls/bls.go
@@ -3,7 +3,6 @@ package bls
|
|||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"fmt"
|
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/arnaucube/go-snark/bn128"
|
"github.com/arnaucube/go-snark/bn128"
|
||||||
@@ -81,34 +80,37 @@ func (bls BLS) Verify(m []byte, sig [3][2]*big.Int, pubK [3]*big.Int) bool {
|
|||||||
return bls.Bn.Fq12.Equal(p1, p2)
|
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 {
|
func (bls BLS) AggregateSignatures(signatures ...[3][2]*big.Int) [3][2]*big.Int {
|
||||||
aggr := signatures[0]
|
aggr := signatures[0]
|
||||||
for _, sig := range signatures {
|
for i := 1; i < len(signatures); i++ {
|
||||||
aggr = bls.Bn.G2.Add(aggr, sig)
|
aggr = bls.Bn.G2.Add(aggr, signatures[i])
|
||||||
}
|
}
|
||||||
return aggr
|
return aggr
|
||||||
}
|
}
|
||||||
func (bls BLS) VerifyAggregatedSignatures(aggrsig [3][2]*big.Int, pubKArray [][3]*big.Int, mArray [][]byte) bool {
|
|
||||||
if len(pubKArray) != len(mArray) {
|
// VerifyAggregatedSignatures
|
||||||
fmt.Println("pubK array and msg array not with the same number of elements")
|
// ê(G,S) == ê(P, H(m))
|
||||||
return false
|
// ê(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)
|
pairingGS, err := bls.Bn.Pairing(bls.Bn.G1.G, aggrsig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
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 {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 1; i < len(pubKArray); i++ {
|
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 {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
pairingsMul = bls.Bn.Fq12.Mul(pairingsMul, e)
|
pairingsMul = bls.Bn.Fq12.Mul(pairingsMul, e)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !bls.Bn.Fq12.Equal(pairingGS, pairingsMul) {
|
if !bls.Bn.Fq12.Equal(pairingGS, pairingsMul) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,19 +28,17 @@ func TestBls(t *testing.T) {
|
|||||||
// signature aggregation
|
// signature aggregation
|
||||||
keys1, err := bls.NewKeys()
|
keys1, err := bls.NewKeys()
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
m1 := []byte("message1")
|
sig1 := bls.Sign(keys1.PrivK, m0)
|
||||||
sig1 := bls.Sign(keys1.PrivK, m1)
|
assert.True(t, bls.Verify(m0, sig1, keys1.PubK))
|
||||||
|
|
||||||
keys2, err := bls.NewKeys()
|
keys2, err := bls.NewKeys()
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
m2 := []byte("message2")
|
sig2 := bls.Sign(keys2.PrivK, m0)
|
||||||
sig2 := bls.Sign(keys2.PrivK, m2)
|
|
||||||
|
|
||||||
aggr := bls.AggregateSignatures(sig0, sig1, sig2)
|
aggr := bls.AggregateSignatures(sig0, sig1, sig2)
|
||||||
|
|
||||||
pubKArray := [][3]*big.Int{keys0.PubK, keys1.PubK, keys2.PubK}
|
pubKArray := [][3]*big.Int{keys0.PubK, keys1.PubK, keys2.PubK}
|
||||||
mArray := [][]byte{m0, m1, m2}
|
verified = bls.VerifyAggregatedSignatures(aggr, pubKArray, m0)
|
||||||
verified = bls.VerifyAggregatedSignatures(aggr, pubKArray, mArray)
|
|
||||||
fmt.Println("signature aggregation verified:", verified)
|
fmt.Println("signature aggregation verified:", verified)
|
||||||
assert.True(t, verified)
|
assert.True(t, verified)
|
||||||
|
|
||||||
|
|||||||
1
go.mod
1
go.mod
@@ -1,7 +1,6 @@
|
|||||||
module github.com/arnaucube/cryptofun
|
module github.com/arnaucube/cryptofun
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/arnaucube/bn128 v0.0.0-20181124004642-3bb6b68ddbe4
|
|
||||||
github.com/arnaucube/go-snark v0.0.0-20181207210027-19f7216d0e3d
|
github.com/arnaucube/go-snark v0.0.0-20181207210027-19f7216d0e3d
|
||||||
github.com/stretchr/testify v1.2.2
|
github.com/stretchr/testify v1.2.2
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user