Skip to content

Commit f97070b

Browse files
authored
[crypto] add aggregation for BLS public keys (#679)
* [crypto] remove agg function for BLS signatures * [crypto] fix lint * [crypto] support aggregation for public and sig * [crypto] add aggregation pk and sig test
1 parent f1e018e commit f97070b

File tree

2 files changed

+53
-4
lines changed

2 files changed

+53
-4
lines changed

crypto/bls/public.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ import (
1111

1212
const PublicKeyLen = bls.PublicKeyLen
1313

14-
var (
15-
ErrNoPublicKeys = errors.New("no public keys")
16-
ErrFailedPublicKeyDecompress = errors.New("couldn't decompress public key")
17-
)
14+
var ErrFailedPublicKeyDecompress = errors.New("couldn't decompress public key")
1815

1916
type (
2017
PublicKey = bls.PublicKey
@@ -29,6 +26,10 @@ func PublicKeyFromBytes(pkBytes []byte) (*PublicKey, error) {
2926
return bls.PublicKeyFromBytes(pkBytes)
3027
}
3128

29+
func AggregatePublicKeys(pks []*PublicKey) (*PublicKey, error) {
30+
return bls.AggregatePublicKeys(pks)
31+
}
32+
3233
func Verify(msg []byte, pk *PublicKey, sig *Signature) bool {
3334
return bls.Verify(pk, sig, msg)
3435
}

crypto/bls/public_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,51 @@ func TestPublicKeyBytes(t *testing.T) {
3636
require.Equal(pk, pk2)
3737
require.Equal(pkBytes, pk2Bytes)
3838
}
39+
40+
func TestAggregatePublicKeysNoop(t *testing.T) {
41+
require := require.New(t)
42+
43+
sk, err := GeneratePrivateKey()
44+
require.NoError(err)
45+
46+
pk := PublicFromPrivateKey(sk)
47+
pkBytes := PublicKeyToBytes(pk)
48+
49+
aggPK, err := AggregatePublicKeys([]*PublicKey{pk})
50+
require.NoError(err)
51+
52+
aggPKBytes := PublicKeyToBytes(aggPK)
53+
require.NoError(err)
54+
55+
require.Equal(pk, aggPK)
56+
require.Equal(pkBytes, aggPKBytes)
57+
}
58+
59+
func TestAggregatePublicKeys(t *testing.T) {
60+
require := require.New(t)
61+
62+
msg := utils.RandomBytes(1234)
63+
64+
// Public Key 1
65+
sk1, err := GeneratePrivateKey()
66+
require.NoError(err)
67+
pk1 := PublicFromPrivateKey(sk1)
68+
69+
// Public Key 2
70+
sk2, err := GeneratePrivateKey()
71+
require.NoError(err)
72+
pk2 := PublicFromPrivateKey(sk2)
73+
74+
// Aggregates 2 public keys
75+
aggPks, err := AggregatePublicKeys([]*PublicKey{pk1, pk2})
76+
require.NoError(err)
77+
78+
// Aggregates 2 signatures
79+
sig1 := Sign(msg, sk1)
80+
sig2 := Sign(msg, sk2)
81+
aggSigs, err := AggregateSignatures([]*Signature{sig1, sig2})
82+
require.NoError(err)
83+
84+
// Verifies aggregate signature with aggregate public key
85+
require.True(Verify(msg, aggPks, aggSigs))
86+
}

0 commit comments

Comments
 (0)