code: func GetConfigSignatureData(creator identitySerializer, config []byte) (signatureHeaderData ConfigSignatureData, e error) {
  	creatorBytes, err := creator.Serialize()
  	if err != nil {
  		e = errors.WithMessage(err, "failed to get user context's identity")
  		return
  	}
  
  	// generate a random nonce
  	nonce, err := crypto.GetRandomNonce()
  	if err != nil {
  		e = errors.WithMessage(err, "nonce creation failed")
  		return
  	}
  
  	signatureHeaderData = ConfigSignatureData{}
  	// signature is across a signature header and the config update
  	signatureHeaderData.SignatureHeader = common.SignatureHeader{
  		Creator: creatorBytes,
  		Nonce:   nonce,
  	}
  
  	signatureHeaderData.SignatureHeaderBytes, err = proto.Marshal(&signatureHeaderData.SignatureHeader)
  	if err != nil {
  		e = errors.Wrap(err, "marshal signatureHeader failed")
  		return
  	}
  
  	// get all the bytes to be signed together, then sign
  	signatureHeaderData.SigningBytes = fcutils.ConcatenateBytes(signatureHeaderData.SignatureHeaderBytes, config)
  
  	return
  }
docs: // GetConfigSignatureData will prepare a ConfigSignatureData comprising:
  // SignatureHeader, its marshaled []byte and the full signing []byte to be used for signing (by an external tool) a Channel Config