def METHOD_NAME(self, pk, message, sig):
    if debug: print("\nVERIFY\n\n")
    sigma1, r, s, e = sig['sigma1'], sig['r'], sig['s'], sig['e']
    K, L, c, keyLength, u, h, N = pk['K'], pk['L'], pk['c'], pk['length'], pk['u'], pk['h'], pk['N']
    # Make sure that 0 < s < 2^{keylength/2}, else reject the signature
    if not (0 < s and s < (2 ** (keyLength/2))):
        return False
    # Compute e = H_k(s) and reject the signature if it's not prime
    ei = self.HW_hash(K, c, s, keyLength) % N
    if not isPrime(ei):
        if debug: print("ei not prime")
        return False
    # Compute Y = sigma1^{2*ceil(log2(s))}
    s1 = integer(2 ** (math.ceil(log[2](s))))
    Y = (sigma1 ** s1) % N
    # Hash the mesage using the chameleon hash with fixed randomness r
    (x, r2) = self.ChameleonHash.hash(L, message, r)
    lhs = (Y ** ei) % N
    rhs = ((u ** x) * h) % N
    if debug:
        print("lhs =>", lhs)
        print("rhs =>", rhs)
    # Verify that Y^e = (u^x h) mod N.  If so, accept the signature
    if lhs == rhs:
        return True
    # Default: reject the signature
    return False