github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/common/validation/msgvalidation_test.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package validation
     8  
     9  import (
    10  	"fmt"
    11  	"testing"
    12  
    13  	"github.com/hechain20/hechain/bccsp/sw"
    14  	"github.com/hechain20/hechain/protoutil"
    15  	"github.com/hyperledger/fabric-protos-go/common"
    16  	"github.com/hyperledger/fabric-protos-go/peer"
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  func createTestTransactionEnvelope(channel string, response *peer.Response, simRes []byte) (*common.Envelope, error) {
    21  	prop, err := createTestProposalAndSignedProposal(channel)
    22  	if err != nil {
    23  		return nil, fmt.Errorf("failed to create test proposal and signed proposal, err %s", err)
    24  	}
    25  
    26  	// endorse it to get a proposal response
    27  	presp, err := protoutil.CreateProposalResponse(prop.Header, prop.Payload, response, simRes, nil, getChaincodeID(), signer)
    28  	if err != nil {
    29  		return nil, fmt.Errorf("CreateProposalResponse failed, err %s", err)
    30  	}
    31  
    32  	// assemble a transaction from that proposal and endorsement
    33  	tx, err := protoutil.CreateSignedTx(prop, signer, presp)
    34  	if err != nil {
    35  		return nil, fmt.Errorf("CreateSignedTx failed, err %s", err)
    36  	}
    37  
    38  	return tx, nil
    39  }
    40  
    41  func createTestProposalAndSignedProposal(channel string) (*peer.Proposal, error) {
    42  	// get a toy proposal
    43  	prop, err := getProposal(channel)
    44  	if err != nil {
    45  		return nil, fmt.Errorf("getProposal failed, err %s", err)
    46  	}
    47  
    48  	return prop, nil
    49  }
    50  
    51  func TestCheckSignatureFromCreator(t *testing.T) {
    52  	response := &peer.Response{Status: 200}
    53  	simRes := []byte("simulation_result")
    54  
    55  	env, err := createTestTransactionEnvelope("testchannelid", response, simRes)
    56  	require.Nil(t, err, "failed to create test transaction: %s", err)
    57  	require.NotNil(t, env)
    58  
    59  	// get the payload from the envelope
    60  	payload, err := protoutil.UnmarshalPayload(env.Payload)
    61  	require.NoError(t, err, "GetPayload returns err %s", err)
    62  
    63  	// validate the header
    64  	chdr, shdr, err := validateCommonHeader(payload.Header)
    65  	require.NoError(t, err, "validateCommonHeader returns err %s", err)
    66  
    67  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
    68  	require.NoError(t, err)
    69  
    70  	// validate the signature in the envelope
    71  	err = checkSignatureFromCreator(shdr.Creator, env.Signature, env.Payload, chdr.ChannelId, cryptoProvider)
    72  	require.NoError(t, err, "checkSignatureFromCreator returns err %s", err)
    73  
    74  	// corrupt the creator
    75  	err = checkSignatureFromCreator([]byte("junk"), env.Signature, env.Payload, chdr.ChannelId, cryptoProvider)
    76  	require.Error(t, err)
    77  	require.Contains(t, err.Error(), "MSP error: could not deserialize")
    78  
    79  	// check nonexistent channel
    80  	err = checkSignatureFromCreator(shdr.Creator, env.Signature, env.Payload, "junkchannel", cryptoProvider)
    81  	require.Error(t, err)
    82  	require.Contains(t, err.Error(), "MSP error: channel doesn't exist")
    83  }