aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bench/bench_bitcoin.cpp2
-rw-r--r--src/crypto/sha256.cpp13
-rw-r--r--src/crypto/sha256.h6
-rw-r--r--src/init.cpp2
-rw-r--r--src/test/test_bitcoin.cpp2
5 files changed, 23 insertions, 2 deletions
diff --git a/src/bench/bench_bitcoin.cpp b/src/bench/bench_bitcoin.cpp
index 226861aa7f..37fd772435 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 45ee93d471..3649dc4be0 100644
--- a/src/crypto/sha256.cpp
+++ b/src/crypto/sha256.cpp
@@ -8,6 +8,8 @@
#include <string.h>
+#include <atomic>
+
// 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 127e62a228..aa4f3972cc 100644
--- a/src/crypto/sha256.h
+++ b/src/crypto/sha256.h
@@ -7,6 +7,7 @@
#include <stdint.h>
#include <stdlib.h>
+#include <string>
/** 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 1e85642019..b16653624c 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 3ba81ed17b..0dd51a4908 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();