github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/auth/ibcsigning/verify.go (about)

     1  package signing
     2  
     3  import (
     4  	"fmt"
     5  
     6  	cryptotypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/crypto/types"
     7  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/crypto/types/multisig"
     8  	ibctx "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/ibc-adapter"
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/tx/signing"
    10  )
    11  
    12  // VerifySignature verifies a transaction signature contained in SignatureData abstracting over different signing modes
    13  // and single vs multi-signatures.
    14  func VerifySignature(pubKey cryptotypes.PubKey, signerData SignerData, sigData signing.SignatureData, handler SignModeHandler, tx ibctx.Tx) error {
    15  	switch data := sigData.(type) {
    16  	case *signing.SingleSignatureData:
    17  		signBytes, err := handler.GetSignBytes(data.SignMode, signerData, tx)
    18  		if err != nil {
    19  			return err
    20  		}
    21  		if !pubKey.VerifySignature(signBytes, data.Signature) {
    22  			return fmt.Errorf("unable to verify single signer signature")
    23  		}
    24  		return nil
    25  
    26  	case *signing.MultiSignatureData:
    27  		multiPK, ok := pubKey.(multisig.PubKey)
    28  		if !ok {
    29  			return fmt.Errorf("expected %T, got %T", (multisig.PubKey)(nil), pubKey)
    30  		}
    31  		err := multiPK.VerifyMultisignature(func(mode signing.SignMode) ([]byte, error) {
    32  			return handler.GetSignBytes(mode, signerData, tx)
    33  		}, data)
    34  		if err != nil {
    35  			return err
    36  		}
    37  		return nil
    38  	default:
    39  		return fmt.Errorf("unexpected SignatureData %T", sigData)
    40  	}
    41  }