aboutsummaryrefslogtreecommitdiffstats
path: root/src/hash/md5_ia32
diff options
context:
space:
mode:
authorlloyd <[email protected]>2008-09-29 17:43:36 +0000
committerlloyd <[email protected]>2008-09-29 17:43:36 +0000
commit26abd45c61294aacdd59fa4763ff1cd78aefbc7c (patch)
tree3ef4a44cd659d0b5442d2c6d8b3e9539fc23bb05 /src/hash/md5_ia32
parentba722ad52627163f945fd9fa97ff98f0df8452d1 (diff)
Make asm implementations distinctly named objects, for instance MD5_IA32,
rather than silently replacing the C++ versions. Instead they are silently replaced (currently, at least) at the lookup level: we switch off the set of feature macros set to choose the best implementation in the current build configuration. So you can have (and benchmark) MD5 and MD5_IA32 directly against each other in the same program with no hassles, but if you ask for "MD5", you'll get maybe an MD5 or maybe MD5_IA32. Also make the canonical asm names (which aren't guarded by C++ namespaces) of the form botan_<algo>_<arch>_<func> as in botan_sha160_ia32_compress, to avoid namespace collisions. This change has another bonus that it should in many cases be possible to derive the asm specializations directly from the original implementation, saving some code (and of course logically SHA_160_IA32 is a SHA_160, just one with a faster implementation of the compression function, so this seems reasonable anyway).
Diffstat (limited to 'src/hash/md5_ia32')
-rw-r--r--src/hash/md5_ia32/info.txt14
-rw-r--r--src/hash/md5_ia32/md5_ia32.cpp (renamed from src/hash/md5_ia32/md5.cpp)23
-rw-r--r--src/hash/md5_ia32/md5_ia32.h33
-rw-r--r--src/hash/md5_ia32/md5_ia32_imp.S (renamed from src/hash/md5_ia32/md5_ia32.S)4
4 files changed, 57 insertions, 17 deletions
diff --git a/src/hash/md5_ia32/info.txt b/src/hash/md5_ia32/info.txt
index 566b6a0d4..652b50a16 100644
--- a/src/hash/md5_ia32/info.txt
+++ b/src/hash/md5_ia32/info.txt
@@ -1,17 +1,19 @@
-realname "MD5 (x86)"
+realname "MD5 (IA-32)"
-define MD5
+define MD5_IA32
-load_on requested
+load_on asm_ok
<add>
-md5_ia32.S
-md5.cpp
-md5.h
+md5_ia32_imp.S
+md5_ia32.cpp
+md5_ia32.h
</add>
<requires>
+asm_ia32
mdx_hash
+utils
</requires>
<arch>
diff --git a/src/hash/md5_ia32/md5.cpp b/src/hash/md5_ia32/md5_ia32.cpp
index 04e7673c1..b95eb0c56 100644
--- a/src/hash/md5_ia32/md5.cpp
+++ b/src/hash/md5_ia32/md5_ia32.cpp
@@ -1,36 +1,41 @@
/*************************************************
-* MD5 Source File *
+* MD5 (IA-32) Source File *
* (C) 1999-2007 Jack Lloyd *
*************************************************/
-#include <botan/md5.h>
+#include <botan/md5_ia32.h>
#include <botan/loadstor.h>
namespace Botan {
-extern "C" void botan_md5_core_asm(u32bit[4], const byte[64], u32bit[16]);
+namespace {
+
+extern "C"
+void botan_md5_ia32_compress(u32bit[4], const byte[64], u32bit[16]);
+
+}
/*************************************************
* MD5 Compression Function *
*************************************************/
-void MD5::hash(const byte input[])
+void MD5_IA32::hash(const byte input[])
{
- md5_core(digest, input, M);
+ botan_md5_ia32_compress(digest, input, M);
}
/*************************************************
* Copy out the digest *
*************************************************/
-void MD5::copy_out(byte output[])
+void MD5_IA32::copy_out(byte output[])
{
- for(u32bit j = 0; j != OUTPUT_LENGTH; ++j)
- output[j] = get_byte(3 - (j % 4), digest[j/4]);
+ for(u32bit j = 0; j != OUTPUT_LENGTH; j += 4)
+ store_le(digest[j/4], output + j);
}
/*************************************************
* Clear memory of sensitive data *
*************************************************/
-void MD5::clear() throw()
+void MD5_IA32::clear() throw()
{
MDx_HashFunction::clear();
M.clear();
diff --git a/src/hash/md5_ia32/md5_ia32.h b/src/hash/md5_ia32/md5_ia32.h
new file mode 100644
index 000000000..cf5038c1c
--- /dev/null
+++ b/src/hash/md5_ia32/md5_ia32.h
@@ -0,0 +1,33 @@
+/*************************************************
+* MD5 (IA-32) Header File *
+* (C) 1999-2007 Jack Lloyd *
+*************************************************/
+
+#ifndef BOTAN_MD5_IA32_H__
+#define BOTAN_MD5_IA32_H__
+
+#include <botan/mdx_hash.h>
+
+namespace Botan {
+
+/*************************************************
+* MD5 *
+*************************************************/
+class BOTAN_DLL MD5_IA32 : public MDx_HashFunction
+ {
+ public:
+ void clear() throw();
+ std::string name() const { return "MD5"; }
+ HashFunction* clone() const { return new MD5_IA32; }
+ MD5_IA32() : MDx_HashFunction(16, 64, false, true) { clear(); }
+ private:
+ void hash(const byte[]);
+ void copy_out(byte[]);
+
+ SecureBuffer<u32bit, 16> M;
+ SecureBuffer<u32bit, 4> digest;
+ };
+
+}
+
+#endif
diff --git a/src/hash/md5_ia32/md5_ia32.S b/src/hash/md5_ia32/md5_ia32_imp.S
index 8e1ec2e79..7f9268a1e 100644
--- a/src/hash/md5_ia32/md5_ia32.S
+++ b/src/hash/md5_ia32/md5_ia32_imp.S
@@ -7,7 +7,7 @@
START_LISTING(md5_ia32.S)
-START_FUNCTION(botan_md5_core_asm)
+START_FUNCTION(botan_md5_ia32_compress)
SPILL_REGS()
#define PUSHED 4
@@ -161,4 +161,4 @@ LOOP_UNTIL_EQ(ESI, 16, .LOAD_INPUT)
ADD(ARRAY4(EBP, 3), EDX)
RESTORE_REGS()
-END_FUNCTION(botan_md5_core_asm)
+END_FUNCTION(botan_md5_ia32_compress)