@@ -223,12 +223,19 @@ bool CheckSignatureEncoding(const vector<unsigned char> &vchSig, unsigned int fl
223223 if (vchSig.size () == 0 ) {
224224 return true ;
225225 }
226- if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC)) != 0 && !IsValidSignatureEncoding (vchSig)) {
226+ bool no_hash_byte = (flags & SCRIPT_NO_SIGHASH_BYTE) == SCRIPT_NO_SIGHASH_BYTE;
227+ std::vector<unsigned char > vchSigCopy (vchSig.begin (), vchSig.begin () + vchSig.size ());
228+ // Push a dummy sighash byte to pass checks
229+ if (no_hash_byte) {
230+ vchSigCopy.push_back (SIGHASH_ALL);
231+ }
232+
233+ if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC)) != 0 && !IsValidSignatureEncoding (vchSigCopy)) {
227234 return set_error (serror, SCRIPT_ERR_SIG_DER);
228- } else if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && !IsLowDERSignature (vchSig , serror)) {
235+ } else if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && !IsLowDERSignature (vchSigCopy , serror)) {
229236 // serror is set
230237 return false ;
231- } else if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsDefinedHashtypeSignature (vchSig )) {
238+ } else if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsDefinedHashtypeSignature (vchSigCopy )) {
232239 return set_error (serror, SCRIPT_ERR_SIG_HASHTYPE);
233240 }
234241 return true ;
@@ -1313,8 +1320,8 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
13131320 valtype& vchData = stacktop (-2 );
13141321 valtype& vchPubKey = stacktop (-1 );
13151322
1316- // Sigs from stack have no hash type, so we disable strictenc check
1317- if (!CheckSignatureEncoding (vchSig, (flags & ~SCRIPT_VERIFY_STRICTENC ), serror) || !CheckPubKeyEncoding (vchPubKey, flags, sigversion, serror)) {
1323+ // Sigs from stack have no hash byte ever
1324+ if (!CheckSignatureEncoding (vchSig, (flags | SCRIPT_NO_SIGHASH_BYTE ), serror) || !CheckPubKeyEncoding (vchPubKey, flags, sigversion, serror)) {
13181325 // serror is set
13191326 return false ;
13201327 }
0 commit comments