Skip to content

Commit de87ea6

Browse files
laanwjFuzzbawls
authored andcommitted
net: Consistent checksum handling
In principle, the checksums of P2P packets are simply 4-byte blobs which are the first four bytes of SHA256(SHA256(payload)). Currently they are handled as little-endian 32-bit integers half of the time, as blobs the other half, sometimes copying the one to the other, resulting in somewhat confused code. This PR changes the handling to be consistent both at packet creation and receiving, making it (I think) easier to understand.
1 parent d4bcd25 commit de87ea6

File tree

3 files changed

+15
-13
lines changed

3 files changed

+15
-13
lines changed

src/main.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6159,15 +6159,17 @@ bool ProcessMessages(CNode* pfrom, CConnman& connman, std::atomic<bool>& interru
61596159
// Message size
61606160
unsigned int nMessageSize = hdr.nMessageSize;
61616161

6162-
// Checksum
6163-
CDataStream& vRecv = msg.vRecv;
6164-
uint256 hash = Hash(vRecv.begin(), vRecv.begin() + nMessageSize);
6165-
unsigned int nChecksum = ReadLE32((unsigned char*)&hash);
6166-
if (nChecksum != hdr.nChecksum) {
6167-
LogPrintf("ProcessMessages(%s, %u bytes): CHECKSUM ERROR nChecksum=%08x hdr.nChecksum=%08x\n",
6168-
SanitizeString(strCommand), nMessageSize, nChecksum, hdr.nChecksum);
6169-
return fMoreWork;
6170-
}
6162+
// Checksum
6163+
CDataStream& vRecv = msg.vRecv;
6164+
uint256 hash = Hash(vRecv.begin(), vRecv.begin() + nMessageSize);
6165+
if (memcmp(hash.begin(), hdr.pchChecksum, CMessageHeader::CHECKSUM_SIZE) != 0)
6166+
{
6167+
LogPrintf("%s(%s, %u bytes): CHECKSUM ERROR expected %s was %s\n", __func__,
6168+
SanitizeString(strCommand), nMessageSize,
6169+
HexStr(hash.begin(), hash.begin()+CMessageHeader::CHECKSUM_SIZE),
6170+
HexStr(hdr.pchChecksum, hdr.pchChecksum+CMessageHeader::CHECKSUM_SIZE));
6171+
return fMoreWork;
6172+
}
61716173

61726174
// Process message
61736175
bool fRet = false;

src/protocol.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ CMessageHeader::CMessageHeader(const MessageStartChars& pchMessageStartIn)
124124
memcpy(pchMessageStart, pchMessageStartIn, MESSAGE_START_SIZE);
125125
memset(pchCommand, 0, sizeof(pchCommand));
126126
nMessageSize = -1;
127-
nChecksum = 0;
127+
memset(pchChecksum, 0, CHECKSUM_SIZE);
128128
}
129129

130130
CMessageHeader::CMessageHeader(const MessageStartChars& pchMessageStartIn, const char* pszCommand, unsigned int nMessageSizeIn)
@@ -133,7 +133,7 @@ CMessageHeader::CMessageHeader(const MessageStartChars& pchMessageStartIn, const
133133
memset(pchCommand, 0, sizeof(pchCommand));
134134
strncpy(pchCommand, pszCommand, COMMAND_SIZE);
135135
nMessageSize = nMessageSizeIn;
136-
nChecksum = 0;
136+
memset(pchChecksum, 0, CHECKSUM_SIZE);
137137
}
138138

139139
std::string CMessageHeader::GetCommand() const

src/protocol.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class CMessageHeader
4747
READWRITE(FLATDATA(pchMessageStart));
4848
READWRITE(FLATDATA(pchCommand));
4949
READWRITE(nMessageSize);
50-
READWRITE(nChecksum);
50+
READWRITE(FLATDATA(pchChecksum));
5151
}
5252

5353
// TODO: make private (improves encapsulation)
@@ -64,7 +64,7 @@ class CMessageHeader
6464
char pchMessageStart[MESSAGE_START_SIZE];
6565
char pchCommand[COMMAND_SIZE];
6666
unsigned int nMessageSize;
67-
unsigned int nChecksum;
67+
uint8_t pchChecksum[CHECKSUM_SIZE];
6868
};
6969

7070
/**

0 commit comments

Comments
 (0)