Changeset View
Changeset View
Standalone View
Standalone View
src/script/interpreter.cpp
Show First 20 Lines • Show All 197 Lines • ▼ Show 20 Lines | static void CleanupScriptCode(CScript &scriptCode, | ||||
uint32_t flags) { | uint32_t flags) { | ||||
// Drop the signature in scripts when SIGHASH_FORKID is not used. | // Drop the signature in scripts when SIGHASH_FORKID is not used. | ||||
SigHashType sigHashType = GetHashType(vchSig); | SigHashType sigHashType = GetHashType(vchSig); | ||||
if (!(flags & SCRIPT_ENABLE_SIGHASH_FORKID) || !sigHashType.hasForkId()) { | if (!(flags & SCRIPT_ENABLE_SIGHASH_FORKID) || !sigHashType.hasForkId()) { | ||||
scriptCode.FindAndDelete(CScript(vchSig)); | scriptCode.FindAndDelete(CScript(vchSig)); | ||||
} | } | ||||
} | } | ||||
static bool IsDefinedHashtypeSignature(const valtype &vchSig) { | |||||
if (vchSig.size() == 0) { | |||||
return false; | |||||
} | |||||
if (!GetHashType(vchSig).hasSupportedBaseType()) { | |||||
return false; | |||||
} | |||||
return true; | |||||
} | |||||
bool CheckSignatureEncoding(const std::vector<uint8_t> &vchSig, uint32_t flags, | bool CheckSignatureEncoding(const std::vector<uint8_t> &vchSig, uint32_t flags, | ||||
ScriptError *serror) { | ScriptError *serror) { | ||||
// Empty signature. Not strictly DER encoded, but allowed to provide a | // Empty signature. Not strictly DER encoded, but allowed to provide a | ||||
// compact way to provide an invalid signature for use with CHECK(MULTI)SIG | // compact way to provide an invalid signature for use with CHECK(MULTI)SIG | ||||
if (vchSig.size() == 0) { | if (vchSig.size() == 0) { | ||||
return true; | return true; | ||||
} | } | ||||
if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | | if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | | ||||
SCRIPT_VERIFY_STRICTENC)) != 0 && | SCRIPT_VERIFY_STRICTENC)) != 0 && | ||||
!IsValidSignatureEncoding(vchSig)) { | !IsValidSignatureEncoding(vchSig)) { | ||||
return set_error(serror, SCRIPT_ERR_SIG_DER); | return set_error(serror, SCRIPT_ERR_SIG_DER); | ||||
} | } | ||||
if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && | if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && | ||||
!IsLowDERSignature(vchSig, serror)) { | !IsLowDERSignature(vchSig, serror)) { | ||||
// serror is set | // serror is set | ||||
return false; | return false; | ||||
} | } | ||||
if ((flags & SCRIPT_VERIFY_STRICTENC) != 0) { | if ((flags & SCRIPT_VERIFY_STRICTENC) != 0) { | ||||
if (!IsDefinedHashtypeSignature(vchSig)) { | if (!GetHashType(vchSig).isDefined()) { | ||||
return set_error(serror, SCRIPT_ERR_SIG_HASHTYPE); | return set_error(serror, SCRIPT_ERR_SIG_HASHTYPE); | ||||
} | } | ||||
bool usesForkId = GetHashType(vchSig).hasForkId(); | bool usesForkId = GetHashType(vchSig).hasForkId(); | ||||
bool forkIdEnabled = flags & SCRIPT_ENABLE_SIGHASH_FORKID; | bool forkIdEnabled = flags & SCRIPT_ENABLE_SIGHASH_FORKID; | ||||
if (!forkIdEnabled && usesForkId) { | if (!forkIdEnabled && usesForkId) { | ||||
return set_error(serror, SCRIPT_ERR_ILLEGAL_FORKID); | return set_error(serror, SCRIPT_ERR_ILLEGAL_FORKID); | ||||
} | } | ||||
if (forkIdEnabled && !usesForkId) { | if (forkIdEnabled && !usesForkId) { | ||||
▲ Show 20 Lines • Show All 1,591 Lines • Show Last 20 Lines |