diff options
author | lloyd <[email protected]> | 2008-09-29 17:43:36 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2008-09-29 17:43:36 +0000 |
commit | 26abd45c61294aacdd59fa4763ff1cd78aefbc7c (patch) | |
tree | 3ef4a44cd659d0b5442d2c6d8b3e9539fc23bb05 /src/hash/md4_ia32 | |
parent | ba722ad52627163f945fd9fa97ff98f0df8452d1 (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/md4_ia32')
-rw-r--r-- | src/hash/md4_ia32/info.txt | 14 | ||||
-rw-r--r-- | src/hash/md4_ia32/md4_ia32.cpp (renamed from src/hash/md4_ia32/md4.cpp) | 18 | ||||
-rw-r--r-- | src/hash/md4_ia32/md4_ia32.h | 33 | ||||
-rw-r--r-- | src/hash/md4_ia32/md4_ia32_imp.S (renamed from src/hash/md4_ia32/md4_ia32.S) | 4 |
4 files changed, 52 insertions, 17 deletions
diff --git a/src/hash/md4_ia32/info.txt b/src/hash/md4_ia32/info.txt index 4a192cbc2..afc150768 100644 --- a/src/hash/md4_ia32/info.txt +++ b/src/hash/md4_ia32/info.txt @@ -1,17 +1,19 @@ -realname "MD4 (x86)" +realname "MD4 (IA-32)" -define MD4 +define MD4_IA32 -load_on requested +load_on asm_ok <add> -md4_ia32.S -md4.cpp -md4.h +md4_ia32_imp.S +md4_ia32.cpp +md4_ia32.h </add> <requires> +asm_ia32 mdx_hash +utils </requires> <arch> diff --git a/src/hash/md4_ia32/md4.cpp b/src/hash/md4_ia32/md4_ia32.cpp index 12466e86e..a34cbb3a6 100644 --- a/src/hash/md4_ia32/md4.cpp +++ b/src/hash/md4_ia32/md4_ia32.cpp @@ -1,36 +1,36 @@ /************************************************* -* MD4 Source File * +* MD4 (IA-32) Source File * * (C) 1999-2007 Jack Lloyd * *************************************************/ -#include <botan/md4.h> +#include <botan/md4_ia32.h> #include <botan/loadstor.h> namespace Botan { -extern "C" void botan_md4_core_asm(u32bit[4], const byte[64], u32bit[16]); +extern "C" void botan_md4_ia32_compress(u32bit[4], const byte[64], u32bit[16]); /************************************************* * MD4 Compression Function * *************************************************/ -void MD4::hash(const byte input[]) +void MD4_IA32::hash(const byte input[]) { - md4_core(digest, input, M); + botan_md4_ia32_compress(digest, input, M); } /************************************************* * Copy out the digest * *************************************************/ -void MD4::copy_out(byte output[]) +void MD4_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 MD4::clear() throw() +void MD4_IA32::clear() throw() { MDx_HashFunction::clear(); M.clear(); diff --git a/src/hash/md4_ia32/md4_ia32.h b/src/hash/md4_ia32/md4_ia32.h new file mode 100644 index 000000000..c6640435e --- /dev/null +++ b/src/hash/md4_ia32/md4_ia32.h @@ -0,0 +1,33 @@ +/************************************************* +* MD4 (IA-32) Header File * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#ifndef BOTAN_MD4_IA32_H__ +#define BOTAN_MD4_IA32_H__ + +#include <botan/mdx_hash.h> + +namespace Botan { + +/************************************************* +* MD4 * +*************************************************/ +class BOTAN_DLL MD4_IA32 : public MDx_HashFunction + { + public: + void clear() throw(); + std::string name() const { return "MD4"; } + HashFunction* clone() const { return new MD4_IA32; } + MD4_IA32() : MDx_HashFunction(16, 64, false, true) { clear(); } + private: + void hash(const byte[]); + void copy_out(byte[]); + + SecureBuffer<u32bit, 48> M; + SecureBuffer<u32bit, 4> digest; + }; + +} + +#endif diff --git a/src/hash/md4_ia32/md4_ia32.S b/src/hash/md4_ia32/md4_ia32_imp.S index 410c540e9..9b728c73d 100644 --- a/src/hash/md4_ia32/md4_ia32.S +++ b/src/hash/md4_ia32/md4_ia32_imp.S @@ -7,7 +7,7 @@ START_LISTING(md4_ia32.S) -START_FUNCTION(botan_md4_core_asm) +START_FUNCTION(botan_md4_ia32_compress) SPILL_REGS() #define PUSHED 4 @@ -132,4 +132,4 @@ LOOP_UNTIL_EQ(ESI, 16, .LOAD_INPUT) ADD(ARRAY4(EBP, 3), EDX) RESTORE_REGS() -END_FUNCTION(botan_md4_core_asm) +END_FUNCTION(botan_md4_ia32_compress) |