| 329 | } |
| 330 | |
| 331 | static bool EvalChecksigPreTapscript(const valtype& vchSig, const valtype& vchPubKey, CScript::const_iterator pbegincodehash, CScript::const_iterator pend, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror, bool& fSuccess) |
| 332 | { |
| 333 | assert(sigversion == SigVersion::BASE || sigversion == SigVersion::WITNESS_V0); |
| 334 | |
| 335 | // Subset of script starting at the most recent codeseparator |
| 336 | CScript scriptCode(pbegincodehash, pend); |
| 337 | |
| 338 | // Drop the signature in pre-segwit scripts but not segwit scripts |
| 339 | if (sigversion == SigVersion::BASE) { |
| 340 | int found = FindAndDelete(scriptCode, CScript() << vchSig); |
| 341 | if (found > 0 && (flags & SCRIPT_VERIFY_CONST_SCRIPTCODE)) |
| 342 | return set_error(serror, SCRIPT_ERR_SIG_FINDANDDELETE); |
| 343 | } |
| 344 | |
| 345 | if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, sigversion, serror)) { |
| 346 | //serror is set |
| 347 | return false; |
| 348 | } |
| 349 | fSuccess = checker.CheckECDSASignature(vchSig, vchPubKey, scriptCode, sigversion); |
| 350 | |
| 351 | if (!fSuccess && (flags & SCRIPT_VERIFY_NULLFAIL) && vchSig.size()) |
| 352 | return set_error(serror, SCRIPT_ERR_SIG_NULLFAIL); |
| 353 | |
| 354 | return true; |
| 355 | } |
| 356 | |
| 357 | static bool EvalChecksigTapscript(const valtype& sig, const valtype& pubkey, ScriptExecutionData& execdata, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror, bool& success) |
| 358 | { |
no test coverage detected