/* */ #include "DHTTokenTracker.h" #include #include "util.h" #include "bittorrent_helper.h" #include "DlAbortEx.h" #include "DHTConstants.h" #include "MessageDigest.h" #include "message_digest_helper.h" #include "fmt.h" namespace aria2 { DHTTokenTracker::DHTTokenTracker() { util::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+COMPACT_LEN_IPV6+SECRET_SIZE]; memset(src, 0, sizeof(src)); int compactlen = bittorrent::packcompact(src+DHT_ID_LENGTH, ipaddr, port); if(compactlen == 0) { throw DL_ABORT_EX (fmt("Token generation failed: ipaddr=%s, port=%u", ipaddr.c_str(), port)); } memcpy(src, infoHash, DHT_ID_LENGTH); memcpy(src+DHT_ID_LENGTH+COMPACT_LEN_IPV6, secret, SECRET_SIZE); unsigned char md[20]; message_digest::digest(md, sizeof(md), MessageDigest::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); util::generateRandomData(secret_[0], SECRET_SIZE); } } // namespace aria2