diff --git a/src/bench/bench_bitcoin.cpp b/src/bench/bench_bitcoin.cpp index 226861aa7..37fd77243 100644 --- a/src/bench/bench_bitcoin.cpp +++ b/src/bench/bench_bitcoin.cpp @@ -4,6 +4,7 @@ #include "bench.h" +#include "crypto/sha256.h" #include "key.h" #include "validation.h" #include "util.h" @@ -12,6 +13,7 @@ int main(int argc, char** argv) { + SHA256AutoDetect(); RandomInit(); ECC_Start(); SetupEnvironment(); diff --git a/src/crypto/sha256.cpp b/src/crypto/sha256.cpp index 45ee93d47..3649dc4be 100644 --- a/src/crypto/sha256.cpp +++ b/src/crypto/sha256.cpp @@ -8,6 +8,8 @@ #include +#include + // Internal implementation code. namespace { @@ -131,8 +133,15 @@ void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks) } } // namespace sha256 + +void (*Transform)(uint32_t*, const unsigned char*, size_t) = sha256::Transform; + } // namespace +std::string SHA256AutoDetect() +{ + return "standard"; +} ////// SHA-256 @@ -150,12 +159,12 @@ CSHA256& CSHA256::Write(const unsigned char* data, size_t len) memcpy(buf + bufsize, data, 64 - bufsize); bytes += 64 - bufsize; data += 64 - bufsize; - sha256::Transform(s, buf, 1); + Transform(s, buf, 1); bufsize = 0; } if (end - data >= 64) { size_t blocks = (end - data) / 64; - sha256::Transform(s, data, blocks); + Transform(s, data, blocks); data += 64 * blocks; bytes += 64 * blocks; } diff --git a/src/crypto/sha256.h b/src/crypto/sha256.h index 127e62a22..aa4f3972c 100644 --- a/src/crypto/sha256.h +++ b/src/crypto/sha256.h @@ -7,6 +7,7 @@ #include #include +#include /** A hasher class for SHA-256. */ class CSHA256 @@ -25,4 +26,9 @@ public: CSHA256& Reset(); }; +/** Autodetect the best available SHA256 implementation. + * Returns the name of the implementation. + */ +std::string SHA256AutoDetect(); + #endif // BITCOIN_CRYPTO_SHA256_H diff --git a/src/init.cpp b/src/init.cpp index 1e8564201..b16653624 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1161,6 +1161,8 @@ bool AppInitSanityChecks() // ********************************************************* Step 4: sanity checks // Initialize elliptic curve code + std::string sha256_algo = SHA256AutoDetect(); + LogPrintf("Using the '%s' SHA256 implementation\n", sha256_algo); RandomInit(); ECC_Start(); globalVerifyHandle.reset(new ECCVerifyHandle()); diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp index 3ba81ed17..0dd51a490 100644 --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -7,6 +7,7 @@ #include "chainparams.h" #include "consensus/consensus.h" #include "consensus/validation.h" +#include "crypto/sha256.h" #include "fs.h" #include "key.h" #include "validation.h" @@ -33,6 +34,7 @@ extern void noui_connect(); BasicTestingSetup::BasicTestingSetup(const std::string& chainName) { + SHA256AutoDetect(); RandomInit(); ECC_Start(); SetupEnvironment();