package sr25519
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
schnorrkel "github.com/ChainSafe/go-schnorrkel"
|
|
|
|
"github.com/tendermint/tendermint/crypto"
|
|
)
|
|
|
|
var _ crypto.BatchVerifier = BatchVerifier{}
|
|
|
|
// BatchVerifier implements batch verification for sr25519.
|
|
// https://github.com/ChainSafe/go-schnorrkel is used for batch verification
|
|
type BatchVerifier struct {
|
|
*schnorrkel.BatchVerifier
|
|
}
|
|
|
|
func NewBatchVerifier() crypto.BatchVerifier {
|
|
return BatchVerifier{schnorrkel.NewBatchVerifier()}
|
|
}
|
|
|
|
func (b BatchVerifier) Add(key crypto.PubKey, msg, sig []byte) error {
|
|
var sig64 [SignatureSize]byte
|
|
copy(sig64[:], sig)
|
|
signature := new(schnorrkel.Signature)
|
|
err := signature.Decode(sig64)
|
|
if err != nil {
|
|
return fmt.Errorf("unable to decode signature: %w", err)
|
|
}
|
|
|
|
signingContext := schnorrkel.NewSigningContext([]byte{}, msg)
|
|
|
|
var pk [PubKeySize]byte
|
|
copy(pk[:], key.Bytes())
|
|
|
|
return b.BatchVerifier.Add(signingContext, signature, schnorrkel.NewPublicKey(pk))
|
|
}
|
|
|
|
func (b BatchVerifier) Verify() bool {
|
|
return b.BatchVerifier.Verify()
|
|
}
|