code: func (s *supportImpl) CheckInstantiationPolicy(signedProp *pb.SignedProposal, chainName string, instantiationPolicy []byte) error {
  	// create a policy object from the policy bytes
  	mgr := mgmt.GetManagerForChain(chainName)
  	if mgr == nil {
  		return errors.Errorf("error checking chaincode instantiation policy: MSP manager for channel %s not found", chainName)
  	}
  	npp := cauthdsl.NewPolicyProvider(mgr)
  	instPol, _, err := npp.NewPolicy(instantiationPolicy)
  	if err != nil {
  		return err
  	}
  	proposal, err := utils.GetProposal(signedProp.ProposalBytes)
  	if err != nil {
  		return err
  	}
  	// get the signature header of the proposal
  	header, err := utils.GetHeader(proposal.Header)
  	if err != nil {
  		return err
  	}
  	shdr, err := utils.GetSignatureHeader(header.SignatureHeader)
  	if err != nil {
  		return err
  	}
  	// construct signed data we can evaluate the instantiation policy against
  	sd := []*common.SignedData{{
  		Data:      signedProp.ProposalBytes,
  		Identity:  shdr.Creator,
  		Signature: signedProp.Signature,
  	}}
  	err = instPol.Evaluate(sd)
  	if err != nil {
  		return errors.WithMessage(err, "instantiation policy violation")
  	}
  	return nil
  }
docs: // CheckInstantiationPolicy checks whether the supplied signed proposal
  // complies with the supplied instantiation policy