Changeset View
Changeset View
Standalone View
Standalone View
src/script/sigencoding.cpp
Show First 20 Lines • Show All 150 Lines • ▼ Show 20 Lines | static bool IsValidDERSignatureEncoding(const slicedvaltype &sig) { | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
static bool CheckRawECDSASignatureEncoding(const slicedvaltype &sig, | static bool CheckRawECDSASignatureEncoding(const slicedvaltype &sig, | ||||
uint32_t flags, | uint32_t flags, | ||||
ScriptError *serror) { | ScriptError *serror) { | ||||
if ((flags & SCRIPT_ENABLE_SCHNORR) && (sig.size() == 64)) { | |||||
// In an ECDSA-only context, 64-byte signatures are banned when | |||||
// Schnorr flag set. | |||||
return set_error(serror, SCRIPT_ERR_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, SCRIPT_ERR_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, SCRIPT_ERR_SIG_HIGH_S); | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
static bool CheckRawSignatureEncoding(const slicedvaltype &sig, uint32_t flags, | static bool CheckRawSignatureEncoding(const slicedvaltype &sig, uint32_t flags, | ||||
ScriptError *serror) { | ScriptError *serror) { | ||||
if ((flags & SCRIPT_ENABLE_SCHNORR) && (sig.size() == 64)) { | |||||
// In a generic-signature context, 64-byte signatures are interpreted | |||||
// as Schnorr signatures (always correctly encoded) when flag set. | |||||
return true; | |||||
} | |||||
return CheckRawECDSASignatureEncoding(sig, flags, serror); | return CheckRawECDSASignatureEncoding(sig, flags, serror); | ||||
} | } | ||||
bool CheckDataSignatureEncoding(const valtype &vchSig, uint32_t flags, | bool CheckDataSignatureEncoding(const valtype &vchSig, uint32_t flags, | ||||
ScriptError *serror) { | ScriptError *serror) { | ||||
// Empty signature. Not strictly DER encoded, but allowed to provide a | // Empty signature. Not strictly DER encoded, but allowed to provide a | ||||
// compact way to provide an invalid signature for use with CHECK(MULTI)SIG | // compact way to provide an invalid signature for use with CHECK(MULTI)SIG | ||||
if (vchSig.size() == 0) { | if (vchSig.size() == 0) { | ||||
▲ Show 20 Lines • Show All 112 Lines • Show Last 20 Lines |