aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/hash/sha1
diff options
context:
space:
mode:
authorJack Lloyd <[email protected]>2016-09-17 14:20:03 -0400
committerJack Lloyd <[email protected]>2016-09-17 14:20:03 -0400
commitd734198074d0290631e27d1fb27dce45f0676d58 (patch)
treefaed46aaae836e44e972a4e6d5bdea06b0729034 /src/lib/hash/sha1
parent272fcf00572432f64085b10132e364740d7eb093 (diff)
parent2b7f2d52d032ad56526d38e7f65bd966ac59325a (diff)
Merge GH #623 Merge algorithm impl types
If CPU specific optimizations are available they are always used, without requiring the application to use the application registry to ensure they get the optimal type. See also GH #477
Diffstat (limited to 'src/lib/hash/sha1')
-rw-r--r--src/lib/hash/sha1/sha160.cpp11
-rw-r--r--src/lib/hash/sha1/sha160.h33
2 files changed, 27 insertions, 17 deletions
diff --git a/src/lib/hash/sha1/sha160.cpp b/src/lib/hash/sha1/sha160.cpp
index 21e87465a..87738fb00 100644
--- a/src/lib/hash/sha1/sha160.cpp
+++ b/src/lib/hash/sha1/sha160.cpp
@@ -6,6 +6,7 @@
*/
#include <botan/sha160.h>
+#include <botan/cpuid.h>
namespace Botan {
@@ -60,9 +61,19 @@ void SHA_160::compress_n(const byte input[], size_t blocks)
{
using namespace SHA1_F;
+#if defined(BOTAN_HAS_SHA1_SSE2)
+ if(CPUID::has_sse2())
+ {
+ return sse2_compress_n(m_digest, input, blocks);
+ }
+
+#endif
+
u32bit A = m_digest[0], B = m_digest[1], C = m_digest[2],
D = m_digest[3], E = m_digest[4];
+ m_W.resize(80);
+
for(size_t i = 0; i != blocks; ++i)
{
load_be(m_W.data(), input, 16);
diff --git a/src/lib/hash/sha1/sha160.h b/src/lib/hash/sha1/sha160.h
index b4a161c14..d7860834f 100644
--- a/src/lib/hash/sha1/sha160.h
+++ b/src/lib/hash/sha1/sha160.h
@@ -1,6 +1,6 @@
/*
* SHA-160
-* (C) 1999-2007 Jack Lloyd
+* (C) 1999-2007,2016 Jack Lloyd
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -15,7 +15,7 @@ namespace Botan {
/**
* NIST's SHA-160
*/
-class BOTAN_DLL SHA_160 : public MDx_HashFunction
+class BOTAN_DLL SHA_160 final : public MDx_HashFunction
{
public:
std::string name() const override { return "SHA-160"; }
@@ -24,37 +24,36 @@ class BOTAN_DLL SHA_160 : public MDx_HashFunction
void clear() override;
- SHA_160() : MDx_HashFunction(64, true, true), m_digest(5), m_W(80)
- {
- clear();
- }
- protected:
- /**
- * Set a custom size for the W array. Normally 80, but some
- * subclasses need slightly more for best performance/internal
- * constraints
- * @param W_size how big to make W
- */
- explicit SHA_160(size_t W_size) :
- MDx_HashFunction(64, true, true), m_digest(5), m_W(W_size)
+ SHA_160() : MDx_HashFunction(64, true, true), m_digest(5)
{
clear();
}
+ private:
void compress_n(const byte[], size_t blocks) override;
+
+#if defined(BOTAN_HAS_SHA1_SSE2)
+ static void sse2_compress_n(secure_vector<u32bit>& digest,
+ const byte blocks[],
+ size_t block_count);
+#endif
+
+
void copy_out(byte[]) override;
/**
- * The digest value, exposed for use by subclasses (asm, SSE2)
+ * The digest value
*/
secure_vector<u32bit> m_digest;
/**
- * The message buffer, exposed for use by subclasses (asm, SSE2)
+ * The message buffer
*/
secure_vector<u32bit> m_W;
};
+typedef SHA_160 SHA_1;
+
}
#endif