code: func (rp *aclmgmtPolicyProviderImpl) CheckACL(polName string, idinfo interface{}) error {
  	aclLogger.Debugf("acl check(%s)", polName)
  
  	//we will implement other identifiers. In the end we just need a SignedData
  	var sd []*common.SignedData
  	var err error
  	switch idinfo.(type) {
  	case *pb.SignedProposal:
  		signedProp, _ := idinfo.(*pb.SignedProposal)
  		// Prepare SignedData
  		proposal, err := utils.GetProposal(signedProp.ProposalBytes)
  		if err != nil {
  			return fmt.Errorf("Failing extracting proposal during check policy with policy [%s]: [%s]", polName, err)
  		}
  
  		header, err := utils.GetHeader(proposal.Header)
  		if err != nil {
  			return fmt.Errorf("Failing extracting header during check policy [%s]: [%s]", polName, err)
  		}
  
  		shdr, err := utils.GetSignatureHeader(header.SignatureHeader)
  		if err != nil {
  			return fmt.Errorf("Invalid Proposal's SignatureHeader during check policy [%s]: [%s]", polName, err)
  		}
  
  		sd = []*common.SignedData{{
  			Data:      signedProp.ProposalBytes,
  			Identity:  shdr.Creator,
  			Signature: signedProp.Signature,
  		}}
  	case *common.Envelope:
  		sd, err = idinfo.(*common.Envelope).AsSignedData()
  		if err != nil {
  			return err
  		}
  	default:
  		return InvalidIdInfo(polName)
  	}
  
  	err = rp.pEvaluator.Evaluate(polName, sd)
  	if err != nil {
  		return fmt.Errorf("failed evaluating policy on signed data during check policy [%s]: [%s]", polName, err)
  	}
  
  	return nil
  }
docs: //CheckACL implements AClProvider's CheckACL interface so it can be registered
  //as a provider with aclmgmt