diff options
author | Pieter Wuille <pieter@wuille.net> | 2021-03-01 18:10:13 -0800 |
---|---|---|
committer | Pieter Wuille <pieter@wuille.net> | 2021-03-15 17:29:39 -0700 |
commit | 497718b467330b2c6bb0d44786020c55f1aa75f9 (patch) | |
tree | e69fdfc0e4302474c62be3873f6b56c07cdf9961 | |
parent | 3820090bd619ac85ab35eff376c03136fe4a9f04 (diff) |
Treat amount<0 also as missing data for P2WPKH/P2WSH
Historically lack of amount data has been treated as amount==-1. Change
this and treat it as missing data, as introduced in the previous commits.
To be minimally invasive, do this at SignatureHash() call sites rather
than inside SignatureHash() (which currently has no means or returning
a failure code).
-rw-r--r-- | src/script/interpreter.cpp | 3 | ||||
-rw-r--r-- | src/script/sign.cpp | 3 |
2 files changed, 6 insertions, 0 deletions
diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 2b10f5b0df..abc0625bb1 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1681,6 +1681,9 @@ bool GenericTransactionSignatureChecker<T>::CheckECDSASignature(const std::vecto int nHashType = vchSig.back(); vchSig.pop_back(); + // Witness sighashes need the amount. + if (sigversion == SigVersion::WITNESS_V0 && amount < 0) return HandleMissingData(m_mdb); + uint256 sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, this->txdata); if (!VerifyECDSASignature(vchSig, pubkey, sighash)) diff --git a/src/script/sign.cpp b/src/script/sign.cpp index fb3466f320..6426c8de59 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -26,6 +26,9 @@ bool MutableTransactionSignatureCreator::CreateSig(const SigningProvider& provid if (sigversion == SigVersion::WITNESS_V0 && !key.IsCompressed()) return false; + // Signing for witness scripts needs the amount. + if (sigversion == SigVersion::WITNESS_V0 && amount < 0) return false; + uint256 hash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion); if (!key.Sign(hash, vchSig)) return false; |