def _CheckSig(sig, pubkey, script, txTo, inIdx, flags, err_raiser, amount=0, sigversion=SIGVERSION_BASE): key = bitcointx.core.key.CPubKey(pubkey) if len(sig) == 0: return False hashtype = sig[-1] if flags & _STRICT_ENCODING_FLAGS: verify_fn = key.verify if not _IsValidSignatureEncoding(sig): raise VerifyScriptError( "signature DER encoding is not strictly valid") if SCRIPT_VERIFY_STRICTENC in flags: low_hashtype = hashtype & (~SIGHASH_ANYONECANPAY) if low_hashtype < SIGHASH_ALL or low_hashtype > SIGHASH_SINGLE: raise VerifyScriptError("unknown hashtype in signature") if not _IsCompressedOrUncompressedPubKey(pubkey): raise VerifyScriptError("unknown pubkey type") else: verify_fn = key.verify_nonstrict if SCRIPT_VERIFY_WITNESS_PUBKEYTYPE in flags and sigversion == SIGVERSION_WITNESS_V0: if not _IsCompressedPubKey(pubkey): raise VerifyScriptError("witness pubkey is not compressed") if SCRIPT_VERIFY_LOW_S in flags and not IsLowDERSignature(sig): raise VerifyScriptError("signature is not low-S") # Raw signature hash due to the SIGHASH_SINGLE bug # # Note that we never raise an exception if RawSignatureHash() returns an # error code. However the first error code case, where inIdx >= # len(txTo.vin), shouldn't ever happen during EvalScript() as that would # imply the scriptSig being checked doesn't correspond to a valid txout - # that should cause other validation machinery to fail long before we ever # got here. (h, err) = script.raw_sighash(txTo, inIdx, hashtype, amount=amount, sigversion=sigversion) return verify_fn(h, sig[:-1])
def test_sign(self) -> None: key = CBitcoinKey('5KJvsngHeMpm884wtkJNzQGaCErckhHJBGFsvd3VyK5qMZXj3hS') hash = b'\x00' * 32 sig = key.sign(hash) # Check a valid signature self.assertTrue(key.pub.verify(hash, sig)) self.assertTrue(IsLowDERSignature(sig)) # Check that invalid hash returns false self.assertFalse(key.pub.verify(b'\xFF'*32, sig)) # Check that invalid signature returns false. # # Note the one-in-four-billion chance of a false positive :) self.assertFalse(key.pub.verify(hash, sig[0:-4] + b'\x00\x00\x00\x00'))
def test_low_s_value(self): sig = x( '3045022100b135074e08cc93904a1712b2600d3cb01899a5b1cc7498caa4b8585bcf5f27e7022074ab544045285baef0a63f0fb4c95e577dcbf5c969c0bf47c7da8e478909d669' ) self.assertTrue(IsLowDERSignature(sig))
def test_high_s_value(self): sig = x( '3046022100820121109528efda8bb20ca28788639e5ba5b365e0a84f8bd85744321e7312c6022100a7c86a21446daa405306fe10d0a9906e37d1a2c6b6fdfaaf6700053058029bbe' ) self.assertFalse(IsLowDERSignature(sig))