/
githubmirror
/
aria2
Обзор
Документация
Войти
/
githubmirror
/
aria2
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/DHTTokenTracker.cc
109 строк
4 KB
Nils Maier
Use default where possible
29 авг 2016, 17:52
29 авг 2016, 17:52
366e2e8
Код
Авторство
О чём код?
/* <!-- copyright */ /* * aria2 - The high speed download utility * * Copyright (C) 2006 Tatsuhiro Tsujikawa * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ /* copyright --> */ #include "DHTTokenTracker.h" #include <cstring> #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() = default; 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().get(), 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 (auto& elem : secret_) { if (generateToken(infoHash, ipaddr, port, elem) == token) { return true; } } return false; } void DHTTokenTracker::updateTokenSecret() { memcpy(secret_[1], secret_[0], SECRET_SIZE); util::generateRandomData(secret_[0], SECRET_SIZE); } } // namespace aria2