| 3012 | |
| 3013 | template <class T> |
| 3014 | bool GenericTransactionSignatureChecker<T>::CheckSchnorrSignature(Span<const unsigned char> sig, Span<const unsigned char> pubkey_in, SigVersion sigversion, ScriptExecutionData& execdata, ScriptError* serror) const |
| 3015 | { |
| 3016 | assert(sigversion == SigVersion::TAPROOT || sigversion == SigVersion::TAPSCRIPT); |
| 3017 | // Schnorr signatures have 32-byte public keys. The caller is responsible for enforcing this. |
| 3018 | assert(pubkey_in.size() == 32); |
| 3019 | // Note that in Tapscript evaluation, empty signatures are treated specially (invalid signature that does not |
| 3020 | // abort script execution). This is implemented in EvalChecksigTapscript, which won't invoke |
| 3021 | // CheckSchnorrSignature in that case. In other contexts, they are invalid like every other signature with |
| 3022 | // size different from 64 or 65. |
| 3023 | if (sig.size() != 64 && sig.size() != 65) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_SIZE); |
| 3024 | |
| 3025 | XOnlyPubKey pubkey{pubkey_in}; |
| 3026 | |
| 3027 | uint8_t hashtype = SIGHASH_DEFAULT; |
| 3028 | if (sig.size() == 65) { |
| 3029 | hashtype = SpanPopBack(sig); |
| 3030 | if (hashtype == SIGHASH_DEFAULT) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_HASHTYPE); |
| 3031 | } |
| 3032 | uint256 sighash; |
| 3033 | if (!this->txdata) return HandleMissingData(m_mdb); |
| 3034 | if (!SignatureHashSchnorr(sighash, execdata, *txTo, nIn, hashtype, sigversion, *this->txdata, m_mdb)) { |
| 3035 | return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_HASHTYPE); |
| 3036 | } |
| 3037 | if (!VerifySchnorrSignature(sig, pubkey, sighash)) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG); |
| 3038 | return true; |
| 3039 | } |
| 3040 | |
| 3041 | template <class T> |
| 3042 | bool GenericTransactionSignatureChecker<T>::CheckLockTime(const CScriptNum& nLockTime) const |
no test coverage detected