github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/crypto/sr25519/batch.go (about) 1 package sr25519 2 3 import ( 4 "crypto/rand" 5 "fmt" 6 7 "github.com/oasisprotocol/curve25519-voi/primitives/sr25519" 8 9 "github.com/ari-anchor/sei-tendermint/crypto" 10 ) 11 12 var _ crypto.BatchVerifier = &BatchVerifier{} 13 14 // BatchVerifier implements batch verification for sr25519. 15 type BatchVerifier struct { 16 *sr25519.BatchVerifier 17 } 18 19 func NewBatchVerifier() crypto.BatchVerifier { 20 return &BatchVerifier{sr25519.NewBatchVerifier()} 21 } 22 23 func (b *BatchVerifier) Add(key crypto.PubKey, msg, signature []byte) error { 24 pk, ok := key.(PubKey) 25 if !ok { 26 return fmt.Errorf("sr25519: pubkey is not sr25519") 27 } 28 29 var srpk sr25519.PublicKey 30 if err := srpk.UnmarshalBinary(pk); err != nil { 31 return fmt.Errorf("sr25519: invalid public key: %w", err) 32 } 33 34 var sig sr25519.Signature 35 if err := sig.UnmarshalBinary(signature); err != nil { 36 return fmt.Errorf("sr25519: unable to decode signature: %w", err) 37 } 38 39 st := signingCtx.NewTranscriptBytes(msg) 40 b.BatchVerifier.Add(&srpk, st, &sig) 41 42 return nil 43 } 44 45 func (b *BatchVerifier) Verify() (bool, []bool) { 46 return b.BatchVerifier.Verify(rand.Reader) 47 }