| 1725 | |
| 1726 | template <class T> |
| 1727 | bool GenericTransactionSignatureChecker<T>::CheckSchnorrSignature(std::span<const unsigned char> sig, std::span<const unsigned char> pubkey_in, SigVersion sigversion, ScriptExecutionData& execdata, ScriptError* serror) const |
| 1728 | { |
| 1729 | assert(sigversion == SigVersion::TAPROOT || sigversion == SigVersion::TAPSCRIPT); |
| 1730 | // Schnorr signatures have 32-byte public keys. The caller is responsible for enforcing this. |
| 1731 | assert(pubkey_in.size() == 32); |
| 1732 | // Note that in Tapscript evaluation, empty signatures are treated specially (invalid signature that does not |
| 1733 | // abort script execution). This is implemented in EvalChecksigTapscript, which won't invoke |
| 1734 | // CheckSchnorrSignature in that case. In other contexts, they are invalid like every other signature with |
| 1735 | // size different from 64 or 65. |
| 1736 | if (sig.size() != 64 && sig.size() != 65) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_SIZE); |
| 1737 | |
| 1738 | XOnlyPubKey pubkey{pubkey_in}; |
| 1739 | |
| 1740 | uint8_t hashtype = SIGHASH_DEFAULT; |
| 1741 | if (sig.size() == 65) { |
| 1742 | hashtype = SpanPopBack(sig); |
| 1743 | if (hashtype == SIGHASH_DEFAULT) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_HASHTYPE); |
| 1744 | } |
| 1745 | uint256 sighash; |
| 1746 | if (!this->txdata) return HandleMissingData(m_mdb); |
| 1747 | if (!SignatureHashSchnorr(sighash, execdata, *txTo, nIn, hashtype, sigversion, *this->txdata, m_mdb)) { |
| 1748 | return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_HASHTYPE); |
| 1749 | } |
| 1750 | if (!VerifySchnorrSignature(sig, pubkey, sighash)) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG); |
| 1751 | return true; |
| 1752 | } |
| 1753 | |
| 1754 | template <class T> |
| 1755 | bool GenericTransactionSignatureChecker<T>::CheckLockTime(const CScriptNum& nLockTime) const |
no test coverage detected