Reject blocks with non-canonical signatures starting from protocol version 60016

This commit is contained in:
lateminer
2019-02-10 17:01:46 +03:00
parent d59608a469
commit 03ab4fee6d
4 changed files with 24 additions and 28 deletions

View File

@@ -3884,22 +3884,27 @@ static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned
return (nFound >= nRequired);
}
bool static IsCanonicalBlockSignature(const CBlock* pblock)
bool static IsCanonicalBlockSignature(const CBlock* pblock, bool checkLowS)
{
if (pblock->IsProofOfWork()) {
return pblock->vchBlockSig.empty();
}
return IsLowDERSignature(pblock->vchBlockSig, NULL, false);
return checkLowS ? IsLowDERSignature(pblock->vchBlockSig, NULL, false) : IsDERSignature(pblock->vchBlockSig, NULL, false);
}
bool ProcessNewBlock(CValidationState& state, const CChainParams& chainparams, CNode* pfrom, const CBlock* pblock, bool fForceProcessing, const CDiskBlockPos* dbp, bool fMayBanPeerIfInvalid)
{
if (!IsCanonicalBlockSignature(pblock)) {
if (pfrom && pfrom->nVersion >= CANONICAL_BLOCK_SIG_VERSION)
return state.DoS(100, error("ProcessNewBlock(): bad block signature encoding"),
REJECT_INVALID, "bad-block-signature-encoding");
return false;
if (!IsCanonicalBlockSignature(pblock, false)) {
if (pfrom && pfrom->nVersion >= CANONICAL_BLOCK_SIG_VERSION)
return state.DoS(100, error("ProcessNewBlock(): bad block signature encoding"),
REJECT_INVALID, "bad-block-signature-encoding");
}
if (!IsCanonicalBlockSignature(pblock, true)) {
if (pfrom && pfrom->nVersion >= CANONICAL_BLOCK_SIG_LOW_S_VERSION)
return state.DoS(100, error("ProcessNewBlock(): bad block signature encoding (low-s)"),
REJECT_INVALID, "bad-block-signature-encoding");
}
{