/* */ #include "DHTTokenTracker.h" #include "DHTUtil.h" #include "PeerMessageUtil.h" #include "DlAbortEx.h" #include "DHTConstants.h" #include "MessageDigestHelper.h" #include namespace aria2 { DHTTokenTracker::DHTTokenTracker() { DHTUtil::generateRandomData(_secret[0], SECRET_SIZE); memcpy(_secret[1], _secret[0], SECRET_SIZE); } DHTTokenTracker::DHTTokenTracker(const char* initialSecret) { memcpy(_secret[0], initialSecret, SECRET_SIZE); memcpy(_secret[1], initialSecret, SECRET_SIZE); } DHTTokenTracker::~DHTTokenTracker() {} std::string DHTTokenTracker::generateToken(const unsigned char* infoHash, const std::string& ipaddr, uint16_t port, const char* secret) const { char src[DHT_ID_LENGTH+6+SECRET_SIZE]; if(!PeerMessageUtil::createcompact(src+DHT_ID_LENGTH, ipaddr, port)) { throw new DlAbortEx("Token generation failed: ipaddr=%s, port=%u", ipaddr.c_str(), port); } memcpy(src, infoHash, DHT_ID_LENGTH); memcpy(src+DHT_ID_LENGTH+6, secret, SECRET_SIZE); return MessageDigestHelper::digest("sha1", src, sizeof(src)); } std::string DHTTokenTracker::generateToken(const unsigned char* infoHash, const std::string& ipaddr, uint16_t port) const { return generateToken(infoHash, ipaddr, port, _secret[0]); } bool DHTTokenTracker::validateToken(const std::string& token, const unsigned char* infoHash, const std::string& ipaddr, uint16_t port) const { for(int i = 0; i < 2; ++i) { if(generateToken(infoHash, ipaddr, port, _secret[i]) == token) { return true; } } return false; } void DHTTokenTracker::updateTokenSecret() { memcpy(_secret[1], _secret[0], SECRET_SIZE); DHTUtil::generateRandomData(_secret[0], SECRET_SIZE); } } // namespace aria2