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  }