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 }