| 1460 | template class GenericTransactionSignatureChecker<CMutableTransaction>; |
| 1461 | |
| 1462 | static bool VerifyWitnessProgram(const CScriptWitness& witness, int witversion, const std::vector<unsigned char>& program, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) |
| 1463 | { |
| 1464 | std::vector<std::vector<unsigned char> > stack; |
| 1465 | CScript scriptPubKey; |
| 1466 | |
| 1467 | if (witversion == 0) { |
| 1468 | if (program.size() == WITNESS_V0_SCRIPTHASH_SIZE) { |
| 1469 | // Version 0 segregated witness program: SHA256(CScript) inside the program, CScript + inputs in witness |
| 1470 | if (witness.stack.size() == 0) { |
| 1471 | return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY); |
| 1472 | } |
| 1473 | scriptPubKey = CScript(witness.stack.back().begin(), witness.stack.back().end()); |
| 1474 | stack = std::vector<std::vector<unsigned char> >(witness.stack.begin(), witness.stack.end() - 1); |
| 1475 | uint256 hashScriptPubKey; |
| 1476 | CSHA256().Write(&scriptPubKey[0], scriptPubKey.size()).Finalize(hashScriptPubKey.begin()); |
| 1477 | if (memcmp(hashScriptPubKey.begin(), program.data(), 32)) { |
| 1478 | return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH); |
| 1479 | } |
| 1480 | } else if (program.size() == WITNESS_V0_KEYHASH_SIZE) { |
| 1481 | // Special case for pay-to-pubkeyhash; signature + pubkey in witness |
| 1482 | if (witness.stack.size() != 2) { |
| 1483 | return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH); // 2 items in witness |
| 1484 | } |
| 1485 | scriptPubKey << OP_DUP << OP_HASH160 << program << OP_EQUALVERIFY << OP_CHECKSIG; |
| 1486 | stack = witness.stack; |
| 1487 | } else { |
| 1488 | return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH); |
| 1489 | } |
| 1490 | } else if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM) { |
| 1491 | return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM); |
| 1492 | } else { |
| 1493 | // Higher version witness scripts return true for future softfork compatibility |
| 1494 | return set_success(serror); |
| 1495 | } |
| 1496 | |
| 1497 | // Disallow stack item size > MAX_SCRIPT_ELEMENT_SIZE in witness stack |
| 1498 | for (unsigned int i = 0; i < stack.size(); i++) { |
| 1499 | if (stack.at(i).size() > MAX_SCRIPT_ELEMENT_SIZE) |
| 1500 | return set_error(serror, SCRIPT_ERR_PUSH_SIZE); |
| 1501 | } |
| 1502 | |
| 1503 | if (!EvalScript(stack, scriptPubKey, flags, checker, SigVersion::WITNESS_V0, serror)) { |
| 1504 | return false; |
| 1505 | } |
| 1506 | |
| 1507 | // Scripts inside witness implicitly require cleanstack behaviour |
| 1508 | if (stack.size() != 1) |
| 1509 | return set_error(serror, SCRIPT_ERR_CLEANSTACK); |
| 1510 | if (!CastToBool(stack.back())) |
| 1511 | return set_error(serror, SCRIPT_ERR_EVAL_FALSE); |
| 1512 | return true; |
| 1513 | } |
| 1514 | |
| 1515 | bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) |
| 1516 | { |
no test coverage detected