| 202 | } |
| 203 | |
| 204 | bool CheckSignatureEncoding(const vector<unsigned char> &vchSig, unsigned int flags, ScriptError* serror) { |
| 205 | // Empty signature. Not strictly DER encoded, but allowed to provide a |
| 206 | // compact way to provide an invalid signature for use with CHECK(MULTI)SIG |
| 207 | if (vchSig.size() == 0) { |
| 208 | return true; |
| 209 | } |
| 210 | if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC)) != 0 && !IsValidSignatureEncoding(vchSig)) { |
| 211 | return set_error(serror, SCRIPT_ERR_SIG_DER); |
| 212 | } |
| 213 | if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && !IsLowDERSignature(vchSig, serror)) { |
| 214 | // serror is set |
| 215 | return false; |
| 216 | } |
| 217 | if ((flags & SCRIPT_VERIFY_STRICTENC) != 0) { |
| 218 | if (!IsDefinedHashtypeSignature(vchSig)) { |
| 219 | return set_error(serror, SCRIPT_ERR_SIG_HASHTYPE); |
| 220 | } |
| 221 | bool usesForkId = GetHashType(vchSig) & SIGHASH_FORKID; |
| 222 | bool forkIdEnabled = flags & SCRIPT_ENABLE_SIGHASH_FORKID; |
| 223 | if (!forkIdEnabled && usesForkId) { |
| 224 | return set_error(serror, SCRIPT_ERR_ILLEGAL_FORKID); |
| 225 | } |
| 226 | if (forkIdEnabled && !usesForkId) { |
| 227 | return set_error(serror, SCRIPT_ERR_MUST_USE_FORKID); |
| 228 | } |
| 229 | } |
| 230 | return true; |
| 231 | } |
| 232 | |
| 233 | bool static CheckPubKeyEncoding(const valtype &vchSig, unsigned int flags, ScriptError* serror) { |
| 234 | if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsCompressedOrUncompressedPubKey(vchSig)) { |
no test coverage detected