/* */ #include "DHTTokenTracker.h" #include "DHTUtil.h" #include "PeerMessageUtil.h" #include "DlAbortEx.h" #include "DHTConstants.h" #include "MessageDigestHelper.h" #include "StringFormat.h" #include namespace aria2 { DHTTokenTracker::DHTTokenTracker() { DHTUtil::generateRandomData(_secret[0], SECRET_SIZE); memcpy(_secret[1], _secret[0], SECRET_SIZE); } DHTTokenTracker::DHTTokenTracker(const unsigned 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 unsigned char* secret) const { unsigned char src[DHT_ID_LENGTH+6+SECRET_SIZE]; if(!PeerMessageUtil::createcompact(src+DHT_ID_LENGTH, ipaddr, port)) { throw DlAbortEx (StringFormat("Token generation failed: ipaddr=%s, port=%u", ipaddr.c_str(), port).str()); } memcpy(src, infoHash, DHT_ID_LENGTH); memcpy(src+DHT_ID_LENGTH+6, secret, SECRET_SIZE); unsigned char md[20]; MessageDigestHelper::digest(md, sizeof(md), MessageDigestContext::SHA1, src, sizeof(src)); return std::string(&md[0], &md[sizeof(md)]); } 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