github.com/s7techlab/cckit@v0.10.5/extensions/encryption/invoke.go (about)

     1  package encryption
     2  
     3  import (
     4  	"github.com/hyperledger/fabric-chaincode-go/shim"
     5  	"github.com/pkg/errors"
     6  	"github.com/s7techlab/cckit/convert"
     7  	"github.com/s7techlab/cckit/state"
     8  )
     9  
    10  // InvokeChaincode decrypts received payload
    11  func InvokeChaincode(
    12  	stub shim.ChaincodeStubInterface, encKey []byte, chaincodeName string,
    13  	args []interface{}, channel string, target interface{}) (interface{}, error) {
    14  
    15  	// args are not encrypted cause we cannot pass encryption key in transient map while invoking cc from cc
    16  	// thus target cc cannot decrypt args
    17  	aa, err := convert.ArgsToBytes(args...)
    18  	if err != nil {
    19  		return nil, errors.Wrap(err, `encrypt args`)
    20  	}
    21  
    22  	response := stub.InvokeChaincode(chaincodeName, aa, channel)
    23  	if response.Status != shim.OK {
    24  		return nil, errors.New(response.Message)
    25  	}
    26  
    27  	if len(response.Payload) == 0 {
    28  		return nil, state.ErrEmptyChaincodeResponsePayload
    29  	}
    30  
    31  	decrypted, err := Decrypt(encKey, response.Payload)
    32  	if err != nil {
    33  		return nil, errors.Wrap(err, `decrypt payload`)
    34  	}
    35  	return convert.FromBytes(decrypted, target)
    36  }