diff --git a/src/Makefile.am b/src/Makefile.am --- a/src/Makefile.am +++ b/src/Makefile.am @@ -390,8 +390,6 @@ seeder/db.h \ seeder/dns.cpp \ seeder/dns.h \ - seeder/messageheader.cpp \ - seeder/messageheader.h \ seeder/strlcpy.h \ seeder/util.cpp \ seeder/util.h diff --git a/src/seeder/bitcoin.h b/src/seeder/bitcoin.h --- a/src/seeder/bitcoin.h +++ b/src/seeder/bitcoin.h @@ -1,7 +1,6 @@ #ifndef BITCOIN_SEEDER_BITCOIN_H #define BITCOIN_SEEDER_BITCOIN_H -#include "messageheader.h" #include "protocol.h" #include @@ -18,7 +17,7 @@ } // The network magic to use. -extern CSeederMessageHeader::MessageMagic netMagic; +extern CMessageHeader::MessageMagic netMagic; bool TestNode(const CService &cip, int &ban, int &client, std::string &clientSV, int &blocks, std::vector *vAddr); diff --git a/src/seeder/bitcoin.cpp b/src/seeder/bitcoin.cpp --- a/src/seeder/bitcoin.cpp +++ b/src/seeder/bitcoin.cpp @@ -12,7 +12,7 @@ bool fTestNet; // The network magic to use. -CSeederMessageHeader::MessageMagic netMagic = {0xe3, 0xe1, 0xf3, 0xe8}; +CMessageHeader::MessageMagic netMagic = {0xe3, 0xe1, 0xf3, 0xe8}; #define BITCOIN_SEED_NONCE 0x0539a019ca550825ULL @@ -39,7 +39,7 @@ AbortMessage(); } nHeaderStart = vSend.size(); - vSend << CSeederMessageHeader(pszCommand, 0); + vSend << CMessageHeader(netMagic, pszCommand, 0); nMessageStart = vSend.size(); // printf("%s: SEND %s\n", ToString(you).c_str(), pszCommand); } @@ -59,17 +59,16 @@ } uint32_t nSize = vSend.size() - nMessageStart; memcpy((char *)&vSend[nHeaderStart] + - offsetof(CSeederMessageHeader, nMessageSize), + offsetof(CMessageHeader, nMessageSize), &nSize, sizeof(nSize)); if (vSend.GetVersion() >= 209) { uint256 hash = Hash(vSend.begin() + nMessageStart, vSend.end()); unsigned int nChecksum = 0; memcpy(&nChecksum, &hash, sizeof(nChecksum)); assert(nMessageStart - nHeaderStart >= - offsetof(CSeederMessageHeader, nChecksum) + - sizeof(nChecksum)); + offsetof(CMessageHeader, pchChecksum) + sizeof(nChecksum)); memcpy((char *)&vSend[nHeaderStart] + - offsetof(CSeederMessageHeader, nChecksum), + offsetof(CMessageHeader, pchChecksum), &nChecksum, sizeof(nChecksum)); } nHeaderStart = allones; @@ -192,7 +191,7 @@ CDataStream::iterator pstart = search( vRecv.begin(), vRecv.end(), BEGIN(netMagic), END(netMagic)); uint32_t nHeaderSize = GetSerializeSize( - CSeederMessageHeader(), vRecv.GetType(), vRecv.GetVersion()); + CMessageHeader(netMagic), vRecv.GetType(), vRecv.GetVersion()); if (vRecv.end() - pstart < nHeaderSize) { if (vRecv.size() > nHeaderSize) { vRecv.erase(vRecv.begin(), vRecv.end() - nHeaderSize); @@ -202,9 +201,9 @@ vRecv.erase(vRecv.begin(), pstart); std::vector vHeaderSave(vRecv.begin(), vRecv.begin() + nHeaderSize); - CSeederMessageHeader hdr; + CMessageHeader hdr(netMagic); vRecv >> hdr; - if (!hdr.IsValid()) { + if (!hdr.IsValid(netMagic)) { // printf("%s: BAD (invalid header)\n", ToString(you).c_str()); ban = 100000; return true; @@ -225,9 +224,10 @@ if (vRecv.GetVersion() >= 209) { uint256 hash = Hash(vRecv.begin(), vRecv.begin() + nMessageSize); - unsigned int nChecksum = 0; - memcpy(&nChecksum, &hash, sizeof(nChecksum)); - if (nChecksum != hdr.nChecksum) continue; + if (memcmp(hash.begin(), hdr.pchChecksum, + CMessageHeader::CHECKSUM_SIZE) != 0) { + continue; + } } CDataStream vMsg(vRecv.begin(), vRecv.begin() + nMessageSize, vRecv.GetType(), vRecv.GetVersion()); diff --git a/src/seeder/messageheader.h b/src/seeder/messageheader.h deleted file mode 100644 --- a/src/seeder/messageheader.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2017 The Bitcoin developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#ifndef BITCOIN_SEEDER_MESSAGEHEADER_H -#define BITCOIN_SEEDER_MESSAGEHEADER_H - -#include "netbase.h" -#include "serialize.h" -#include "uint256.h" - -#include -#include - -class CSeederMessageHeader { -public: - typedef uint8_t MessageMagic[4]; - - CSeederMessageHeader(); - CSeederMessageHeader(const char *pszCommand, unsigned int nMessageSizeIn); - - std::string GetCommand() const; - bool IsValid() const; - - ADD_SERIALIZE_METHODS; - - template - inline void SerializationOp(Stream &s, Operation ser_action) { - READWRITE(FLATDATA(pchMessageStart)); - READWRITE(FLATDATA(pchCommand)); - READWRITE(nMessageSize); - if (s.GetVersion() >= 209) { - READWRITE(nChecksum); - } - } - - // TODO: make private (improves encapsulation) -public: - enum { COMMAND_SIZE = 12 }; - MessageMagic pchMessageStart; - char pchCommand[COMMAND_SIZE]; - unsigned int nMessageSize; - unsigned int nChecksum; -}; - -#endif // BITCOIN_SEEDER_MESSAGEHEADER_H diff --git a/src/seeder/messageheader.cpp b/src/seeder/messageheader.cpp deleted file mode 100644 --- a/src/seeder/messageheader.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2017 The Bitcoin developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "messageheader.h" - -#include -#include -#include - -#ifndef WIN32 -#include -#endif - -uint8_t pchMessageStart[4] = {0xe3, 0xe1, 0xf3, 0xe8}; - -CSeederMessageHeader::CSeederMessageHeader() { - memcpy(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart)); - memset(pchCommand, 0, sizeof(pchCommand)); - pchCommand[1] = 1; - nMessageSize = -1; - nChecksum = 0; -} - -CSeederMessageHeader::CSeederMessageHeader(const char *pszCommand, - unsigned int nMessageSizeIn) { - memcpy(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart)); - strncpy(pchCommand, pszCommand, COMMAND_SIZE); - nMessageSize = nMessageSizeIn; - nChecksum = 0; -} - -std::string CSeederMessageHeader::GetCommand() const { - if (pchCommand[COMMAND_SIZE - 1] == 0) - return std::string(pchCommand, pchCommand + strlen(pchCommand)); - else - return std::string(pchCommand, pchCommand + COMMAND_SIZE); -} - -bool CSeederMessageHeader::IsValid() const { - // Check start string - if (memcmp(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart)) != - 0) - return false; - - // Check the command string for errors - for (const char *p1 = pchCommand; p1 < pchCommand + COMMAND_SIZE; p1++) { - if (*p1 == 0) { - // Must be all zeros after the first zero - for (; p1 < pchCommand + COMMAND_SIZE; p1++) - if (*p1 != 0) return false; - } else if (*p1 < ' ' || *p1 > 0x7E) - return false; - } - - // Message size - if (nMessageSize > MAX_SIZE) { - printf("CSeederMessageHeader::IsValid() : (%s, %u bytes) nMessageSize " - "> MAX_SIZE\n", - GetCommand().c_str(), nMessageSize); - return false; - } - - return true; -}