code: func (*SignatureScheme) Verify(ipk handlers.IssuerPublicKey, signature, digest []byte, attributes []bccsp.IdemixAttribute, rhIndex int, revocationPublicKey *ecdsa.PublicKey, epoch int) (err error) {
  	defer func() {
  		if r := recover(); r != nil {
  			err = errors.Errorf("failure [%s]", r)
  		}
  	}()
  
  	iipk, ok := ipk.(*IssuerPublicKey)
  	if !ok {
  		return errors.Errorf("invalid issuer public key, expected *IssuerPublicKey, got [%T]", ipk)
  	}
  
  	sig := &cryptolib.Signature{}
  	err = proto.Unmarshal(signature, sig)
  	if err != nil {
  		return err
  	}
  
  	disclosure := make([]byte, len(attributes))
  	attrValues := make([]*FP256BN.BIG, len(attributes))
  	for i := 0; i < len(attributes); i++ {
  		switch attributes[i].Type {
  		case bccsp.IdemixHiddenAttribute:
  			disclosure[i] = 0
  			attrValues[i] = nil
  		case bccsp.IdemixBytesAttribute:
  			disclosure[i] = 1
  			attrValues[i] = cryptolib.HashModOrder(attributes[i].Value.([]byte))
  		case bccsp.IdemixIntAttribute:
  			disclosure[i] = 1
  			attrValues[i] = FP256BN.NewBIGint(attributes[i].Value.(int))
  		default:
  			err = errors.Errorf("attribute type not allowed or supported [%v] at position [%d]", attributes[i].Type, i)
  		}
  	}
  	if err != nil {
  		return
  	}
  
  	return sig.Ver(
  		disclosure,
  		iipk.PK,
  		digest,
  		attrValues,
  		rhIndex,
  		revocationPublicKey,
  		epoch)
  }
docs: // Verify checks that an idemix signature is valid with the respect to the passed issuer public key, digest, attributes,
  // revocation index (rhIndex), revocation public key, and epoch.