From 447444ae7a3ed4e13bfb09e0c15d458070e9b904 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 1 Jun 2016 23:15:04 +1200 Subject: [PATCH] Fix nits after review --- src/crypto/equihash.cpp | 22 ++++++++++------- src/crypto/equihash.h | 52 ++++++++++++++++++++--------------------- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/crypto/equihash.cpp b/src/crypto/equihash.cpp index 4694d2240..b31cf0461 100644 --- a/src/crypto/equihash.cpp +++ b/src/crypto/equihash.cpp @@ -120,10 +120,12 @@ FullStepRow& FullStepRow::operator=(const FullStepRow& a) template bool StepRow::IsZero(size_t len) { - char res = 0; - for (int i = 0; i < len; i++) - res |= hash[i]; - return res == 0; + // This doesn't need to be constant time. + for (int i = 0; i < len; i++) { + if (hash[i] != 0) + return false; + } + return true; } template @@ -139,10 +141,12 @@ std::vector FullStepRow::GetIndices(size_t len, size_t lenIndic template bool HasCollision(StepRow& a, StepRow& b, int l) { - bool res = true; - for (int j = 0; j < l; j++) - res &= a.hash[j] == b.hash[j]; - return res; + // This doesn't need to be constant time. + for (int j = 0; j < l; j++) { + if (a.hash[j] != b.hash[j]) + return false; + } + return true; } template @@ -334,6 +338,8 @@ std::set> Equihash::OptimisedSolve(const eh_HashState // First run the algorithm with truncated indices eh_index soln_size { 1 << K }; + // Each element of partialSolns is dynamically allocated in a call to + // GetTruncatedIndices(), and freed at the end of this function. std::vector partialSolns; { diff --git a/src/crypto/equihash.h b/src/crypto/equihash.h index 20952cb6a..373daf46a 100644 --- a/src/crypto/equihash.h +++ b/src/crypto/equihash.h @@ -135,42 +135,42 @@ public: #include "equihash.tcc" -static Equihash<96,5> Eh965; -static Equihash<48,5> Eh485; +static Equihash<96,5> Eh96_5; +static Equihash<48,5> Eh48_5; -#define EhInitialiseState(n, k, base_state) \ - if (n == 96 && k == 5) { \ - Eh965.InitialiseState(base_state); \ - } else if (n == 48 && k == 5) { \ - Eh485.InitialiseState(base_state); \ - } else { \ +#define EhInitialiseState(n, k, base_state) \ + if (n == 96 && k == 5) { \ + Eh96_5.InitialiseState(base_state); \ + } else if (n == 48 && k == 5) { \ + Eh48_5.InitialiseState(base_state); \ + } else { \ throw std::invalid_argument("Unsupported Equihash parameters"); \ } -#define EhBasicSolve(n, k, base_state, solns) \ - if (n == 96 && k == 5) { \ - solns = Eh965.BasicSolve(base_state); \ - } else if (n == 48 && k == 5) { \ - solns = Eh485.BasicSolve(base_state); \ - } else { \ +#define EhBasicSolve(n, k, base_state, solns) \ + if (n == 96 && k == 5) { \ + solns = Eh96_5.BasicSolve(base_state); \ + } else if (n == 48 && k == 5) { \ + solns = Eh48_5.BasicSolve(base_state); \ + } else { \ throw std::invalid_argument("Unsupported Equihash parameters"); \ } -#define EhOptimisedSolve(n, k, base_state, solns) \ - if (n == 96 && k == 5) { \ - solns = Eh965.OptimisedSolve(base_state); \ - } else if (n == 48 && k == 5) { \ - solns = Eh485.OptimisedSolve(base_state); \ - } else { \ +#define EhOptimisedSolve(n, k, base_state, solns) \ + if (n == 96 && k == 5) { \ + solns = Eh96_5.OptimisedSolve(base_state); \ + } else if (n == 48 && k == 5) { \ + solns = Eh48_5.OptimisedSolve(base_state); \ + } else { \ throw std::invalid_argument("Unsupported Equihash parameters"); \ } -#define EhIsValidSolution(n, k, base_state, soln, ret) \ - if (n == 96 && k == 5) { \ - ret = Eh965.IsValidSolution(base_state, soln); \ - } else if (n == 48 && k == 5) { \ - ret = Eh485.IsValidSolution(base_state, soln); \ - } else { \ +#define EhIsValidSolution(n, k, base_state, soln, ret) \ + if (n == 96 && k == 5) { \ + ret = Eh96_5.IsValidSolution(base_state, soln); \ + } else if (n == 48 && k == 5) { \ + ret = Eh48_5.IsValidSolution(base_state, soln); \ + } else { \ throw std::invalid_argument("Unsupported Equihash parameters"); \ }