From 6dcfda2dc48bee2148acd571dce7d3f09608d7a2 Mon Sep 17 00:00:00 2001 From: jtimon Date: Fri, 18 Jul 2014 18:47:10 +0200 Subject: [PATCH] Don't pass nHashType to EvalScript nor CheckSig --- src/main.cpp | 2 +- src/script/interpreter.cpp | 19 ++++++++----------- src/script/interpreter.h | 4 ++-- src/script/sign.cpp | 6 +++--- src/test/script_tests.cpp | 8 ++++---- 5 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c59bc40c69..134e87fc99 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -697,7 +697,7 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs) // IsStandard() will have already returned false // and this method isn't called. vector > stack; - if (!EvalScript(stack, tx.vin[i].scriptSig, tx, i, false, 0)) + if (!EvalScript(stack, tx.vin[i].scriptSig, tx, i, false)) return false; if (whichType == TX_SCRIPTHASH) diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 0b3d63e5d3..c745564599 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -132,7 +132,7 @@ bool IsCanonicalSignature(const valtype &vchSig, unsigned int flags) { return true; } -bool EvalScript(vector >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, unsigned int flags, int nHashType) +bool EvalScript(vector >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, unsigned int flags) { CScript::const_iterator pc = script.begin(); CScript::const_iterator pend = script.end(); @@ -675,7 +675,7 @@ bool EvalScript(vector >& stack, const CScript& script, co scriptCode.FindAndDelete(CScript(vchSig)); bool fSuccess = IsCanonicalSignature(vchSig, flags) && IsCanonicalPubKey(vchPubKey, flags) && - CheckSig(vchSig, vchPubKey, scriptCode, txTo, nIn, nHashType, flags); + CheckSig(vchSig, vchPubKey, scriptCode, txTo, nIn, flags); popstack(stack); popstack(stack); @@ -736,7 +736,7 @@ bool EvalScript(vector >& stack, const CScript& script, co // Check signature bool fOk = IsCanonicalSignature(vchSig, flags) && IsCanonicalPubKey(vchPubKey, flags) && - CheckSig(vchSig, vchPubKey, scriptCode, txTo, nIn, nHashType, flags); + CheckSig(vchSig, vchPubKey, scriptCode, txTo, nIn, flags); if (fOk) { isig++; @@ -975,7 +975,7 @@ public: } }; -bool CheckSig(vector vchSig, const vector &vchPubKey, const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, int flags) +bool CheckSig(vector vchSig, const vector& vchPubKey, const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int flags) { static CSignatureCache signatureCache; @@ -986,10 +986,7 @@ bool CheckSig(vector vchSig, const vector &vchPubK // Hash type is one byte tacked on to the end of the signature if (vchSig.empty()) return false; - if (nHashType == 0) - nHashType = vchSig.back(); - else if (nHashType != vchSig.back()) - return false; + int nHashType = vchSig.back(); vchSig.pop_back(); uint256 sighash = SignatureHash(scriptCode, txTo, nIn, nHashType); @@ -1009,11 +1006,11 @@ bool CheckSig(vector vchSig, const vector &vchPubK bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, unsigned int flags) { vector > stack, stackCopy; - if (!EvalScript(stack, scriptSig, txTo, nIn, flags, 0)) + if (!EvalScript(stack, scriptSig, txTo, nIn, flags)) return false; if (flags & SCRIPT_VERIFY_P2SH) stackCopy = stack; - if (!EvalScript(stack, scriptPubKey, txTo, nIn, flags, 0)) + if (!EvalScript(stack, scriptPubKey, txTo, nIn, flags)) return false; if (stack.empty()) return false; @@ -1036,7 +1033,7 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const C CScript pubKey2(pubKeySerialized.begin(), pubKeySerialized.end()); popstack(stackCopy); - if (!EvalScript(stackCopy, pubKey2, txTo, nIn, flags, 0)) + if (!EvalScript(stackCopy, pubKey2, txTo, nIn, flags)) return false; if (stackCopy.empty()) return false; diff --git a/src/script/interpreter.h b/src/script/interpreter.h index ca57387a13..0c00eefe7d 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -38,8 +38,8 @@ bool IsCanonicalPubKey(const std::vector &vchPubKey, unsigned int bool IsCanonicalSignature(const std::vector &vchSig, unsigned int flags); uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType); -bool CheckSig(std::vector vchSig, const std::vector &vchPubKey, const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, int flags); -bool EvalScript(std::vector >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, unsigned int flags, int nHashType); +bool CheckSig(std::vector vchSig, const std::vector &vchPubKey, const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int flags); +bool EvalScript(std::vector >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, unsigned int flags); bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, unsigned int flags); #endif diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 7037193b9c..cbddc1b72a 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -174,7 +174,7 @@ static CScript CombineMultisig(CScript scriptPubKey, const CMutableTransaction& if (sigs.count(pubkey)) continue; // Already got a sig for this pubkey - if (CheckSig(sig, pubkey, scriptPubKey, txTo, nIn, 0, 0)) + if (CheckSig(sig, pubkey, scriptPubKey, txTo, nIn, 0)) { sigs[pubkey] = sig; break; @@ -252,9 +252,9 @@ CScript CombineSignatures(CScript scriptPubKey, const CTransaction& txTo, unsign Solver(scriptPubKey, txType, vSolutions); vector stack1; - EvalScript(stack1, scriptSig1, CTransaction(), 0, SCRIPT_VERIFY_STRICTENC, 0); + EvalScript(stack1, scriptSig1, CTransaction(), 0, SCRIPT_VERIFY_STRICTENC); vector stack2; - EvalScript(stack2, scriptSig2, CTransaction(), 0, SCRIPT_VERIFY_STRICTENC, 0); + EvalScript(stack2, scriptSig2, CTransaction(), 0, SCRIPT_VERIFY_STRICTENC); return CombineSignatures(scriptPubKey, txTo, nIn, txType, vSolutions, stack1, stack2); } diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index 0b4035f8d7..fc4cf05ebd 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -116,18 +116,18 @@ BOOST_AUTO_TEST_CASE(script_PushData) static const unsigned char pushdata4[] = { OP_PUSHDATA4, 1, 0, 0, 0, 0x5a }; vector > directStack; - BOOST_CHECK(EvalScript(directStack, CScript(&direct[0], &direct[sizeof(direct)]), CTransaction(), 0, true, 0)); + BOOST_CHECK(EvalScript(directStack, CScript(&direct[0], &direct[sizeof(direct)]), CTransaction(), 0, true)); vector > pushdata1Stack; - BOOST_CHECK(EvalScript(pushdata1Stack, CScript(&pushdata1[0], &pushdata1[sizeof(pushdata1)]), CTransaction(), 0, true, 0)); + BOOST_CHECK(EvalScript(pushdata1Stack, CScript(&pushdata1[0], &pushdata1[sizeof(pushdata1)]), CTransaction(), 0, true)); BOOST_CHECK(pushdata1Stack == directStack); vector > pushdata2Stack; - BOOST_CHECK(EvalScript(pushdata2Stack, CScript(&pushdata2[0], &pushdata2[sizeof(pushdata2)]), CTransaction(), 0, true, 0)); + BOOST_CHECK(EvalScript(pushdata2Stack, CScript(&pushdata2[0], &pushdata2[sizeof(pushdata2)]), CTransaction(), 0, true)); BOOST_CHECK(pushdata2Stack == directStack); vector > pushdata4Stack; - BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), CTransaction(), 0, true, 0)); + BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), CTransaction(), 0, true)); BOOST_CHECK(pushdata4Stack == directStack); }