summaryrefslogtreecommitdiff
path: root/src/DownloadEngine.cc
diff options
context:
space:
mode:
authorNils Maier <maierman@web.de>2014-07-15 08:15:46 +0200
committerNils Maier <maierman@web.de>2014-07-22 21:58:30 +0200
commit8f2af33b6dd33e7937480e37f06d325e812dee8f (patch)
treeb74350f9d538150246e22551ac65b20c92cf466c /src/DownloadEngine.cc
parent24ae459523e4a41c711990b04bd9ed6f1222f559 (diff)
Delay auth failures instead of PBKDF2
Closes GH-256
Diffstat (limited to 'src/DownloadEngine.cc')
-rw-r--r--src/DownloadEngine.cc78
1 files changed, 5 insertions, 73 deletions
diff --git a/src/DownloadEngine.cc b/src/DownloadEngine.cc
index 93a1c5d1..1b8029f3 100644
--- a/src/DownloadEngine.cc
+++ b/src/DownloadEngine.cc
@@ -76,13 +76,6 @@
#include "Option.h"
#include "util_security.h"
-// Lower time limit for PBKDF2 operations in validateToken.
-static const double kTokenTimeLower = 0.025;
-// Upper time limit for PBKDF2 operations in validateToken.
-static const double kTokenTimeUpper = 0.5;
-// Sweet spot time for PBKDF2 operations in validateToken.
-static const double kTokenTimeSweetspot = 0.035;
-
namespace aria2 {
namespace global {
@@ -111,9 +104,7 @@ DownloadEngine::DownloadEngine(std::unique_ptr<EventPoll> eventPoll)
asyncDNSServers_(nullptr),
#endif // HAVE_ARES_ADDR_NODE
dnsCache_(make_unique<DNSCache>()),
- option_(nullptr),
- tokenIterations_(5000),
- tokenAverageDuration_(0.0)
+ option_(nullptr)
{
unsigned char sessionId[20];
util::generateRandomKey(sessionId);
@@ -650,76 +641,17 @@ bool DownloadEngine::validateToken(const std::string& token)
return true;
}
- if (!tokenHMAC_ || tokenAverageDuration_ > kTokenTimeUpper ||
- tokenAverageDuration_ < kTokenTimeLower) {
-
- // Setup our stuff.
- if (tokenHMAC_) {
- A2_LOG_INFO(fmt("Recalculating iterations because avg. duration is %.4f",
- tokenAverageDuration_));
- }
-
+ if (!tokenHMAC_) {
tokenHMAC_ = HMAC::createRandom();
if (!tokenHMAC_) {
A2_LOG_ERROR("Failed to create HMAC");
return false;
}
-
- // This should still be pretty fast on a modern system... Well, too fast
- // with the initial 5000 iterations, and that is why we adjust it.
- // XXX We should run this setup high priorty, so that other processes on the
- // system don't mess up our results and let us underestimate the iterations.
- std::deque<double> mm;
- for (auto i = 0; i < 10; ++i) {
- auto c = std::clock();
- tokenExpected_ = make_unique<HMACResult>
- (PBKDF2(tokenHMAC_.get(), option_->get(PREF_RPC_SECRET),
- tokenIterations_));
- mm.push_back((std::clock() - c) / (double)CLOCKS_PER_SEC);
- }
- std::sort(mm.begin(), mm.end());
- // Pop outliers.
- mm.pop_front();
- mm.pop_back();
- mm.pop_back();
- auto duration = std::accumulate(mm.begin(), mm.end(), 0.0) / mm.size();
-
- A2_LOG_INFO(fmt("Took us %.4f secs on average to perform PBKDF2 with %zu "
- "iterations during setup",
- duration, tokenIterations_));
-
- // Adjust iterations so that an op takes about |kTokenTimeSpeetspot| sec,
- // which would allow for a couple attempts per second (instead of
- // potentially thousands without PBKDF2).
- // We might overestimate the performance a bit, but should not perform
- // worse than |kTokenTimeUpper| secs per attempt on a normally loaded system
- // and no better than |kTokenTimeLower|. If this does not hold true anymore,
- // the |tokenAverageDuration_| checks will force a re-calcuation.
- tokenIterations_ *= kTokenTimeSweetspot / duration;
-
- auto c = std::clock();
- tokenExpected_ = make_unique<HMACResult>
- (PBKDF2(tokenHMAC_.get(), option_->get(PREF_RPC_SECRET),
- tokenIterations_));
- duration = (std::clock() - c) / (double)CLOCKS_PER_SEC;
- A2_LOG_INFO(fmt("Took us %.4f secs to perform PBKDF2 with %zu iterations",
- duration, tokenIterations_));
-
- // Seed average duration.
- tokenAverageDuration_ = duration;
+ tokenExpected_ = make_unique<HMACResult>(tokenHMAC_->getResult(
+ option_->get(PREF_RPC_SECRET)));
}
- auto c = std::clock();
- bool rv = *tokenExpected_ == PBKDF2(tokenHMAC_.get(), token,
- tokenIterations_);
- auto duration = (std::clock() - c) / (double)CLOCKS_PER_SEC;
- A2_LOG_DEBUG(fmt("Took us %.4f secs to perform token compare with %zu "
- "iterations",
- duration, tokenIterations_));
-
- // Update rolling hash.
- tokenAverageDuration_ = tokenAverageDuration_ * 0.9 + duration * 0.1;
- return rv;
+ return *tokenExpected_ == tokenHMAC_->getResult(token);
}
} // namespace aria2