Changeset View
Changeset View
Standalone View
Standalone View
src/script/sigencoding.cpp
Show First 20 Lines • Show All 156 Lines • ▼ Show 20 Lines | static bool IsSchnorrSig(const slicedvaltype &sig) { | ||||
return sig.size() == 64; | return sig.size() == 64; | ||||
} | } | ||||
static bool CheckRawECDSASignatureEncoding(const slicedvaltype &sig, | static bool CheckRawECDSASignatureEncoding(const slicedvaltype &sig, | ||||
uint32_t flags, | uint32_t flags, | ||||
ScriptError *serror) { | ScriptError *serror) { | ||||
if (IsSchnorrSig(sig)) { | if (IsSchnorrSig(sig)) { | ||||
// In an ECDSA-only context, 64-byte signatures are forbidden. | // In an ECDSA-only context, 64-byte signatures are forbidden. | ||||
return set_error(serror, SCRIPT_ERR_SIG_BADLENGTH); | return set_error(serror, ScriptError::SIG_BADLENGTH); | ||||
} | } | ||||
if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | | if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | | ||||
SCRIPT_VERIFY_STRICTENC)) && | SCRIPT_VERIFY_STRICTENC)) && | ||||
!IsValidDERSignatureEncoding(sig)) { | !IsValidDERSignatureEncoding(sig)) { | ||||
return set_error(serror, SCRIPT_ERR_SIG_DER); | return set_error(serror, ScriptError::SIG_DER); | ||||
} | } | ||||
if ((flags & SCRIPT_VERIFY_LOW_S) && !CPubKey::CheckLowS(sig)) { | if ((flags & SCRIPT_VERIFY_LOW_S) && !CPubKey::CheckLowS(sig)) { | ||||
return set_error(serror, SCRIPT_ERR_SIG_HIGH_S); | return set_error(serror, ScriptError::SIG_HIGH_S); | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
static bool CheckRawSchnorrSignatureEncoding(const slicedvaltype &sig, | static bool CheckRawSchnorrSignatureEncoding(const slicedvaltype &sig, | ||||
uint32_t flags, | uint32_t flags, | ||||
ScriptError *serror) { | ScriptError *serror) { | ||||
if (IsSchnorrSig(sig)) { | if (IsSchnorrSig(sig)) { | ||||
return true; | return true; | ||||
} | } | ||||
return set_error(serror, SCRIPT_ERR_SIG_NONSCHNORR); | return set_error(serror, ScriptError::SIG_NONSCHNORR); | ||||
} | } | ||||
static bool CheckRawSignatureEncoding(const slicedvaltype &sig, uint32_t flags, | static bool CheckRawSignatureEncoding(const slicedvaltype &sig, uint32_t flags, | ||||
ScriptError *serror) { | ScriptError *serror) { | ||||
if (IsSchnorrSig(sig)) { | if (IsSchnorrSig(sig)) { | ||||
// In a generic-signature context, 64-byte signatures are interpreted | // In a generic-signature context, 64-byte signatures are interpreted | ||||
// as Schnorr signatures (always correctly encoded). | // as Schnorr signatures (always correctly encoded). | ||||
return true; | return true; | ||||
Show All 12 Lines | bool CheckDataSignatureEncoding(const valtype &vchSig, uint32_t flags, | ||||
return CheckRawSignatureEncoding( | return CheckRawSignatureEncoding( | ||||
vchSig | boost::adaptors::sliced(0, vchSig.size()), flags, serror); | vchSig | boost::adaptors::sliced(0, vchSig.size()), flags, serror); | ||||
} | } | ||||
static bool CheckSighashEncoding(const valtype &vchSig, uint32_t flags, | static bool CheckSighashEncoding(const valtype &vchSig, uint32_t flags, | ||||
ScriptError *serror) { | ScriptError *serror) { | ||||
if (flags & SCRIPT_VERIFY_STRICTENC) { | if (flags & SCRIPT_VERIFY_STRICTENC) { | ||||
if (!GetHashType(vchSig).isDefined()) { | if (!GetHashType(vchSig).isDefined()) { | ||||
return set_error(serror, SCRIPT_ERR_SIG_HASHTYPE); | return set_error(serror, ScriptError::SIG_HASHTYPE); | ||||
} | } | ||||
bool usesForkId = GetHashType(vchSig).hasForkId(); | bool usesForkId = GetHashType(vchSig).hasForkId(); | ||||
bool forkIdEnabled = flags & SCRIPT_ENABLE_SIGHASH_FORKID; | bool forkIdEnabled = flags & SCRIPT_ENABLE_SIGHASH_FORKID; | ||||
if (!forkIdEnabled && usesForkId) { | if (!forkIdEnabled && usesForkId) { | ||||
return set_error(serror, SCRIPT_ERR_ILLEGAL_FORKID); | return set_error(serror, ScriptError::ILLEGAL_FORKID); | ||||
} | } | ||||
if (forkIdEnabled && !usesForkId) { | if (forkIdEnabled && !usesForkId) { | ||||
return set_error(serror, SCRIPT_ERR_MUST_USE_FORKID); | return set_error(serror, ScriptError::MUST_USE_FORKID); | ||||
} | } | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
template <typename F> | template <typename F> | ||||
static bool CheckTransactionSignatureEncodingImpl(const valtype &vchSig, | static bool CheckTransactionSignatureEncodingImpl(const valtype &vchSig, | ||||
▲ Show 20 Lines • Show All 76 Lines • ▼ Show 20 Lines | static bool IsCompressedPubKey(const valtype &vchPubKey) { | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
bool CheckPubKeyEncoding(const valtype &vchPubKey, uint32_t flags, | bool CheckPubKeyEncoding(const valtype &vchPubKey, uint32_t flags, | ||||
ScriptError *serror) { | ScriptError *serror) { | ||||
if ((flags & SCRIPT_VERIFY_STRICTENC) && | if ((flags & SCRIPT_VERIFY_STRICTENC) && | ||||
!IsCompressedOrUncompressedPubKey(vchPubKey)) { | !IsCompressedOrUncompressedPubKey(vchPubKey)) { | ||||
return set_error(serror, SCRIPT_ERR_PUBKEYTYPE); | return set_error(serror, ScriptError::PUBKEYTYPE); | ||||
} | } | ||||
// Only compressed keys are accepted when | // Only compressed keys are accepted when | ||||
// SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE is enabled. | // SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE is enabled. | ||||
if ((flags & SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) && | if ((flags & SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) && | ||||
!IsCompressedPubKey(vchPubKey)) { | !IsCompressedPubKey(vchPubKey)) { | ||||
return set_error(serror, SCRIPT_ERR_NONCOMPRESSED_PUBKEY); | return set_error(serror, ScriptError::NONCOMPRESSED_PUBKEY); | ||||
} | } | ||||
return true; | return true; | ||||
} | } |