package sr25519 import ( "fmt" "github.com/oasisprotocol/curve25519-voi/primitives/sr25519" "github.com/tendermint/tendermint/crypto" ) var _ crypto.BatchVerifier = &BatchVerifier{} // BatchVerifier implements batch verification for sr25519. type BatchVerifier struct { *sr25519.BatchVerifier } func NewBatchVerifier() crypto.BatchVerifier { return &BatchVerifier{sr25519.NewBatchVerifier()} } func (b *BatchVerifier) Add(key crypto.PubKey, msg, signature []byte) error { pk, ok := key.(PubKey) if !ok { return fmt.Errorf("sr25519: pubkey is not sr25519") } var srpk sr25519.PublicKey if err := srpk.UnmarshalBinary(pk); err != nil { return fmt.Errorf("sr25519: invalid public key: %w", err) } var sig sr25519.Signature if err := sig.UnmarshalBinary(signature); err != nil { return fmt.Errorf("sr25519: unable to decode signature: %w", err) } st := signingCtx.NewTranscriptBytes(msg) b.BatchVerifier.Add(&srpk, st, &sig) return nil } func (b *BatchVerifier) Verify() (bool, []bool) { return b.BatchVerifier.Verify(crypto.CReader()) }