aboutsummaryrefslogtreecommitdiffstats
path: root/src/hash
diff options
context:
space:
mode:
Diffstat (limited to 'src/hash')
-rw-r--r--src/hash/bmw/bmw_512.cpp203
-rw-r--r--src/hash/bmw/bmw_512.h32
-rw-r--r--src/hash/bmw/info.txt7
-rw-r--r--src/hash/fork256/info.txt7
-rw-r--r--src/hash/gost_3411/gost_3411.cpp2
-rw-r--r--src/hash/gost_3411/gost_3411.h2
-rw-r--r--src/hash/gost_3411/info.txt7
-rw-r--r--src/hash/has160/info.txt7
-rw-r--r--src/hash/md2/info.txt7
-rw-r--r--src/hash/md4/info.txt7
-rw-r--r--src/hash/md4_ia32/info.txt6
-rw-r--r--src/hash/md5/info.txt7
-rw-r--r--src/hash/md5_ia32/info.txt6
-rw-r--r--src/hash/mdx_hash/info.txt5
-rw-r--r--src/hash/par_hash/info.txt7
-rw-r--r--src/hash/rmd128/info.txt7
-rw-r--r--src/hash/rmd160/info.txt7
-rw-r--r--src/hash/sha1/info.txt7
-rw-r--r--src/hash/sha1_amd64/info.txt6
-rw-r--r--src/hash/sha1_ia32/info.txt6
-rw-r--r--src/hash/sha1_sse2/info.txt20
-rw-r--r--src/hash/sha1_sse2/sha1_sse2_imp.cpp135
-rw-r--r--src/hash/sha2/info.txt9
-rw-r--r--src/hash/skein/info.txt7
-rw-r--r--src/hash/tiger/info.txt8
-rw-r--r--src/hash/whirlpool/info.txt8
26 files changed, 300 insertions, 232 deletions
diff --git a/src/hash/bmw/bmw_512.cpp b/src/hash/bmw/bmw_512.cpp
new file mode 100644
index 000000000..ad3826351
--- /dev/null
+++ b/src/hash/bmw/bmw_512.cpp
@@ -0,0 +1,203 @@
+/*
+* Blue Midnight Wish 512 (Round 2 tweaked)
+* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#include <botan/bmw_512.h>
+#include <botan/loadstor.h>
+#include <botan/rotate.h>
+
+namespace Botan {
+
+namespace {
+
+inline u64bit S0(u64bit X)
+ {
+ return (X >> 1) ^ (X << 3) ^ rotate_left(X, 4) ^ rotate_left(X, 37);
+ }
+
+inline u64bit S1(u64bit X)
+ {
+ return (X >> 1) ^ (X << 2) ^ rotate_left(X, 13) ^ rotate_left(X, 43);
+ }
+
+inline u64bit S2(u64bit X)
+ {
+ return (X >> 2) ^ (X << 1) ^ rotate_left(X, 19) ^ rotate_left(X, 53);
+ }
+
+inline u64bit S3(u64bit X)
+ {
+ return (X >> 2) ^ (X << 2) ^ rotate_left(X, 28) ^ rotate_left(X, 59);
+ }
+
+inline u64bit S4(u64bit X)
+ {
+ return (X >> 1) ^ X;
+ }
+
+/**
+* Blue Midnight Wish 512 compression function
+*/
+void BMW_512_compress(u64bit H[16], const u64bit M[16], u64bit Q[32])
+ {
+ const u32bit EXPAND_1_ROUNDS = 2;
+
+ for(u32bit i = 0; i != 16; ++i)
+ Q[i] = H[i] ^ M[i];
+
+ Q[16] = Q[ 5] - Q[ 7] + Q[10] + Q[13] + Q[14];
+ Q[17] = Q[ 6] - Q[ 8] + Q[11] + Q[14] - Q[15];
+ Q[18] = Q[ 0] + Q[ 7] + Q[ 9] - Q[12] + Q[15];
+ Q[19] = Q[ 0] - Q[ 1] + Q[ 8] - Q[10] + Q[13];
+ Q[20] = Q[ 1] + Q[ 2] + Q[ 9] - Q[11] - Q[14];
+ Q[21] = Q[ 3] - Q[ 2] + Q[10] - Q[12] + Q[15];
+ Q[22] = Q[ 4] - Q[ 0] - Q[ 3] - Q[11] + Q[13];
+ Q[23] = Q[ 1] - Q[ 4] - Q[ 5] - Q[12] - Q[14];
+ Q[24] = Q[ 2] - Q[ 5] - Q[ 6] + Q[13] - Q[15];
+ Q[25] = Q[ 0] - Q[ 3] + Q[ 6] - Q[ 7] + Q[14];
+ Q[26] = Q[ 8] - Q[ 1] - Q[ 4] - Q[ 7] + Q[15];
+ Q[27] = Q[ 8] - Q[ 0] - Q[ 2] - Q[ 5] + Q[ 9];
+ Q[28] = Q[ 1] + Q[ 3] - Q[ 6] - Q[ 9] + Q[10];
+ Q[29] = Q[ 2] + Q[ 4] + Q[ 7] + Q[10] + Q[11];
+ Q[30] = Q[ 3] - Q[ 5] + Q[ 8] - Q[11] - Q[12];
+ Q[31] = Q[12] - Q[ 4] - Q[ 6] - Q[ 9] + Q[13];
+
+ Q[ 0] = S0(Q[16]) + H[ 1];
+ Q[ 1] = S1(Q[17]) + H[ 2];
+ Q[ 2] = S2(Q[18]) + H[ 3];
+ Q[ 3] = S3(Q[19]) + H[ 4];
+ Q[ 4] = S4(Q[20]) + H[ 5];
+ Q[ 5] = S0(Q[21]) + H[ 6];
+ Q[ 6] = S1(Q[22]) + H[ 7];
+ Q[ 7] = S2(Q[23]) + H[ 8];
+ Q[ 8] = S3(Q[24]) + H[ 9];
+ Q[ 9] = S4(Q[25]) + H[10];
+ Q[10] = S0(Q[26]) + H[11];
+ Q[11] = S1(Q[27]) + H[12];
+ Q[12] = S2(Q[28]) + H[13];
+ Q[13] = S3(Q[29]) + H[14];
+ Q[14] = S4(Q[30]) + H[15];
+ Q[15] = S0(Q[31]) + H[ 0];
+
+ for(u32bit i = 16; i != 16 + EXPAND_1_ROUNDS; ++i)
+ {
+ Q[i] = S1(Q[i-16]) + S2(Q[i-15]) + S3(Q[i-14]) + S0(Q[i-13]) +
+ S1(Q[i-12]) + S2(Q[i-11]) + S3(Q[i-10]) + S0(Q[i- 9]) +
+ S1(Q[i- 8]) + S2(Q[i- 7]) + S3(Q[i- 6]) + S0(Q[i- 5]) +
+ S1(Q[i- 4]) + S2(Q[i- 3]) + S3(Q[i- 2]) + S0(Q[i- 1]) +
+ ((rotate_left(M[(i-16) % 16], ((i-16)%16) + 1) +
+ rotate_left(M[(i-13) % 16], ((i-13)%16) + 1) -
+ rotate_left(M[(i- 6) % 16], ((i-6)%16) + 1) +
+ (0x0555555555555555 * i)) ^ H[(i-16+7)%16]);
+ }
+
+ for(u32bit i = 16 + EXPAND_1_ROUNDS; i != 32; ++i)
+ {
+ Q[i] = Q[i-16] + rotate_left(Q[i-15], 5) +
+ Q[i-14] + rotate_left(Q[i-13], 11) +
+ Q[i-12] + rotate_left(Q[i-11], 27) +
+ Q[i-10] + rotate_left(Q[i- 9], 32) +
+ Q[i- 8] + rotate_left(Q[i- 7], 37) +
+ Q[i- 6] + rotate_left(Q[i- 5], 43) +
+ Q[i- 4] + rotate_left(Q[i- 3], 53) +
+ S4(Q[i - 2]) + ((Q[i-1] >> 2) ^ Q[i-1]) +
+ ((rotate_left(M[(i-16) % 16], ((i-16)%16 + 1)) +
+ rotate_left(M[(i-13) % 16], ((i-13)%16 + 1)) -
+ rotate_left(M[(i- 6) % 16], ((i-6)%16 + 1)) +
+ (0x0555555555555555 * i)) ^ H[(i-16+7)%16]);
+ }
+
+ u64bit XL = Q[16] ^ Q[17] ^ Q[18] ^ Q[19] ^
+ Q[20] ^ Q[21] ^ Q[22] ^ Q[23];
+
+ u64bit XH = Q[24] ^ Q[25] ^ Q[26] ^ Q[27] ^
+ Q[28] ^ Q[29] ^ Q[30] ^ Q[31];
+
+ XH ^= XL;
+
+ H[ 0] = ((XH << 5) ^ (Q[16] >> 5) ^ M[0]) + (XL ^ Q[24] ^ Q[0]);
+ H[ 1] = ((XH >> 7) ^ (Q[17] << 8) ^ M[1]) + (XL ^ Q[25] ^ Q[1]);
+ H[ 2] = ((XH >> 5) ^ (Q[18] << 5) ^ M[2]) + (XL ^ Q[26] ^ Q[2]);
+ H[ 3] = ((XH >> 1) ^ (Q[19] << 5) ^ M[3]) + (XL ^ Q[27] ^ Q[3]);
+ H[ 4] = ((XH >> 3) ^ (Q[20] ) ^ M[4]) + (XL ^ Q[28] ^ Q[4]);
+ H[ 5] = ((XH << 6) ^ (Q[21] >> 6) ^ M[5]) + (XL ^ Q[29] ^ Q[5]);
+ H[ 6] = ((XH >> 4) ^ (Q[22] << 6) ^ M[6]) + (XL ^ Q[30] ^ Q[6]);
+ H[ 7] = ((XH >> 11) ^ (Q[23] << 2) ^ M[7]) + (XL ^ Q[31] ^ Q[7]);
+
+ H[ 8] = rotate_left(H[4], 9) + (XH ^ Q[24] ^ M[ 8]) + ((XL << 8) ^ Q[23] ^ Q[ 8]);
+ H[ 9] = rotate_left(H[5], 10) + (XH ^ Q[25] ^ M[ 9]) + ((XL >> 6) ^ Q[16] ^ Q[ 9]);
+ H[10] = rotate_left(H[6], 11) + (XH ^ Q[26] ^ M[10]) + ((XL << 6) ^ Q[17] ^ Q[10]);
+ H[11] = rotate_left(H[7], 12) + (XH ^ Q[27] ^ M[11]) + ((XL << 4) ^ Q[18] ^ Q[11]);
+ H[12] = rotate_left(H[0], 13) + (XH ^ Q[28] ^ M[12]) + ((XL >> 3) ^ Q[19] ^ Q[12]);
+ H[13] = rotate_left(H[1], 14) + (XH ^ Q[29] ^ M[13]) + ((XL >> 4) ^ Q[20] ^ Q[13]);
+ H[14] = rotate_left(H[2], 15) + (XH ^ Q[30] ^ M[14]) + ((XL >> 7) ^ Q[21] ^ Q[14]);
+ H[15] = rotate_left(H[3], 16) + (XH ^ Q[31] ^ M[15]) + ((XL >> 2) ^ Q[22] ^ Q[15]);
+ }
+
+}
+
+void BMW_512::compress_n(const byte input[], u32bit blocks)
+ {
+ for(u32bit i = 0; i != blocks; ++i)
+ {
+ for(u32bit j = 0; j != 16; ++j)
+ M[j] = load_le<u64bit>(input, j);
+
+ BMW_512_compress(H, M, Q);
+
+ input += HASH_BLOCK_SIZE;
+ }
+ }
+
+/*
+* Copy out the digest
+*/
+void BMW_512::copy_out(byte output[])
+ {
+ u64bit final[16] = {
+ 0xAAAAAAAAAAAAAAA0, 0xAAAAAAAAAAAAAAA1,
+ 0xAAAAAAAAAAAAAAA2, 0xAAAAAAAAAAAAAAA3,
+ 0xAAAAAAAAAAAAAAA4, 0xAAAAAAAAAAAAAAA5,
+ 0xAAAAAAAAAAAAAAA6, 0xAAAAAAAAAAAAAAA7,
+ 0xAAAAAAAAAAAAAAA8, 0xAAAAAAAAAAAAAAA9,
+ 0xAAAAAAAAAAAAAAAA, 0xAAAAAAAAAAAAAAAB,
+ 0xAAAAAAAAAAAAAAAC, 0xAAAAAAAAAAAAAAAD,
+ 0xAAAAAAAAAAAAAAAE, 0xAAAAAAAAAAAAAAAF };
+
+ BMW_512_compress(final, H, Q);
+
+ for(u32bit i = 0; i != OUTPUT_LENGTH; i += 8)
+ store_le(final[8 + i/8], output + i);
+ }
+
+/*
+* Clear memory of sensitive data
+*/
+void BMW_512::clear() throw()
+ {
+ MDx_HashFunction::clear();
+ M.clear();
+ Q.clear();
+
+ H[ 0] = 0x8081828384858687;
+ H[ 1] = 0x88898A8B8C8D8E8F;
+ H[ 2] = 0x9091929394959697;
+ H[ 3] = 0x98999A9B9C9D9E9F;
+ H[ 4] = 0xA0A1A2A3A4A5A6A7;
+ H[ 5] = 0xA8A9AAABACADAEAF;
+ H[ 6] = 0xB0B1B2B3B4B5B6B7;
+ H[ 7] = 0xB8B9BABBBCBDBEBF;
+ H[ 8] = 0xC0C1C2C3C4C5C6C7;
+ H[ 9] = 0xC8C9CACBCCCDCECF;
+ H[10] = 0xD0D1D2D3D4D5D6D7;
+ H[11] = 0xD8D9DADBDCDDDEDF;
+ H[12] = 0xE0E1E2E3E4E5E6E7;
+ H[13] = 0xE8E9EAEBECEDEEEF;
+ H[14] = 0xF0F1F2F3F4F5F6F7;
+ H[15] = 0xF8F9FAFBFCFDFEFF;
+ }
+
+}
diff --git a/src/hash/bmw/bmw_512.h b/src/hash/bmw/bmw_512.h
new file mode 100644
index 000000000..d1f2539e9
--- /dev/null
+++ b/src/hash/bmw/bmw_512.h
@@ -0,0 +1,32 @@
+/*
+* Blue Midnight Wish 512 (Round 2 tweaked)
+* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_BMW_512_H__
+#define BOTAN_BMW_512_H__
+
+#include <botan/mdx_hash.h>
+
+namespace Botan {
+
+class BMW_512 : public MDx_HashFunction
+ {
+ public:
+ void clear() throw();
+ std::string name() const { return "BMW512"; }
+ HashFunction* clone() const { return new BMW_512; }
+ BMW_512() : MDx_HashFunction(64, 128, false, true) { clear(); }
+ private:
+ void compress_n(const byte input[], u32bit blocks);
+ void copy_out(byte output[]);
+
+ SecureBuffer<u64bit, 16> H, M;
+ SecureBuffer<u64bit, 32> Q;
+ };
+
+}
+
+#endif
diff --git a/src/hash/bmw/info.txt b/src/hash/bmw/info.txt
new file mode 100644
index 000000000..27e069c0a
--- /dev/null
+++ b/src/hash/bmw/info.txt
@@ -0,0 +1,7 @@
+realname "Blue Midnight Wish"
+
+define BMW_512
+
+<requires>
+mdx_hash
+</requires>
diff --git a/src/hash/fork256/info.txt b/src/hash/fork256/info.txt
index ae0c9f1a4..7c3c5bb94 100644
--- a/src/hash/fork256/info.txt
+++ b/src/hash/fork256/info.txt
@@ -2,13 +2,6 @@ realname "FORK-256"
define FORK_256
-load_on auto
-
-<add>
-fork256.cpp
-fork256.h
-</add>
-
<requires>
mdx_hash
</requires>
diff --git a/src/hash/gost_3411/gost_3411.cpp b/src/hash/gost_3411/gost_3411.cpp
index 3c7f5f92b..8f3982fca 100644
--- a/src/hash/gost_3411/gost_3411.cpp
+++ b/src/hash/gost_3411/gost_3411.cpp
@@ -1,6 +1,8 @@
/*
* GOST 34.11
* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
*/
#include <botan/gost_3411.h>
diff --git a/src/hash/gost_3411/gost_3411.h b/src/hash/gost_3411/gost_3411.h
index c69555052..960adaa44 100644
--- a/src/hash/gost_3411/gost_3411.h
+++ b/src/hash/gost_3411/gost_3411.h
@@ -1,6 +1,8 @@
/**
* GOST 34.11
* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
*/
#ifndef BOTAN_GOST_3411_H__
diff --git a/src/hash/gost_3411/info.txt b/src/hash/gost_3411/info.txt
index 65b9475e1..353ceb3e5 100644
--- a/src/hash/gost_3411/info.txt
+++ b/src/hash/gost_3411/info.txt
@@ -2,13 +2,6 @@ realname "GOST 34.11"
define GOST_34_11
-load_on auto
-
-<add>
-gost_3411.cpp
-gost_3411.h
-</add>
-
<requires>
gost_28147
</requires>
diff --git a/src/hash/has160/info.txt b/src/hash/has160/info.txt
index a945f3225..98cbc5155 100644
--- a/src/hash/has160/info.txt
+++ b/src/hash/has160/info.txt
@@ -2,13 +2,6 @@ realname "HAS-160"
define HAS_160
-load_on auto
-
-<add>
-has160.cpp
-has160.h
-</add>
-
<requires>
mdx_hash
</requires>
diff --git a/src/hash/md2/info.txt b/src/hash/md2/info.txt
index ff33e1eb3..4428584fd 100644
--- a/src/hash/md2/info.txt
+++ b/src/hash/md2/info.txt
@@ -1,10 +1,3 @@
realname "MD2"
define MD2
-
-load_on auto
-
-<add>
-md2.cpp
-md2.h
-</add>
diff --git a/src/hash/md4/info.txt b/src/hash/md4/info.txt
index fc9cbe116..6aa4a5d59 100644
--- a/src/hash/md4/info.txt
+++ b/src/hash/md4/info.txt
@@ -2,13 +2,6 @@ realname "MD4"
define MD4
-load_on auto
-
-<add>
-md4.cpp
-md4.h
-</add>
-
<requires>
mdx_hash
</requires>
diff --git a/src/hash/md4_ia32/info.txt b/src/hash/md4_ia32/info.txt
index fee7dd1a8..217c3fc21 100644
--- a/src/hash/md4_ia32/info.txt
+++ b/src/hash/md4_ia32/info.txt
@@ -4,12 +4,6 @@ define MD4_IA32
load_on asm_ok
-<add>
-md4_ia32_imp.S
-md4_ia32.cpp
-md4_ia32.h
-</add>
-
<arch>
ia32
</arch>
diff --git a/src/hash/md5/info.txt b/src/hash/md5/info.txt
index 525a45ab5..14861d635 100644
--- a/src/hash/md5/info.txt
+++ b/src/hash/md5/info.txt
@@ -2,13 +2,6 @@ realname "MD5"
define MD5
-load_on auto
-
-<add>
-md5.cpp
-md5.h
-</add>
-
<requires>
mdx_hash
</requires>
diff --git a/src/hash/md5_ia32/info.txt b/src/hash/md5_ia32/info.txt
index ad9923b26..d298f2005 100644
--- a/src/hash/md5_ia32/info.txt
+++ b/src/hash/md5_ia32/info.txt
@@ -4,12 +4,6 @@ define MD5_IA32
load_on asm_ok
-<add>
-md5_ia32_imp.S
-md5_ia32.cpp
-md5_ia32.h
-</add>
-
<arch>
ia32
</arch>
diff --git a/src/hash/mdx_hash/info.txt b/src/hash/mdx_hash/info.txt
index 412c93350..ee4ccd6da 100644
--- a/src/hash/mdx_hash/info.txt
+++ b/src/hash/mdx_hash/info.txt
@@ -3,8 +3,3 @@ realname "MDx Hash Base"
define MDX_HASH_FUNCTION
load_on dep
-
-<add>
-mdx_hash.cpp
-mdx_hash.h
-</add>
diff --git a/src/hash/par_hash/info.txt b/src/hash/par_hash/info.txt
index 45716aac8..029939cb5 100644
--- a/src/hash/par_hash/info.txt
+++ b/src/hash/par_hash/info.txt
@@ -1,10 +1,3 @@
realname "Parallel Hash"
define PARALLEL_HASH
-
-load_on auto
-
-<add>
-par_hash.cpp
-par_hash.h
-</add>
diff --git a/src/hash/rmd128/info.txt b/src/hash/rmd128/info.txt
index 402271da5..0a1ef2c74 100644
--- a/src/hash/rmd128/info.txt
+++ b/src/hash/rmd128/info.txt
@@ -2,13 +2,6 @@ realname "RIPEMD-128"
define RIPEMD_128
-load_on auto
-
-<add>
-rmd128.cpp
-rmd128.h
-</add>
-
<requires>
mdx_hash
</requires>
diff --git a/src/hash/rmd160/info.txt b/src/hash/rmd160/info.txt
index af4b5c230..225106afc 100644
--- a/src/hash/rmd160/info.txt
+++ b/src/hash/rmd160/info.txt
@@ -2,13 +2,6 @@ realname "RIPEMD-160"
define RIPEMD_160
-load_on auto
-
-<add>
-rmd160.cpp
-rmd160.h
-</add>
-
<requires>
mdx_hash
</requires>
diff --git a/src/hash/sha1/info.txt b/src/hash/sha1/info.txt
index a0ae30b4b..8915f9ebd 100644
--- a/src/hash/sha1/info.txt
+++ b/src/hash/sha1/info.txt
@@ -2,13 +2,6 @@ realname "SHA-1"
define SHA1
-load_on auto
-
-<add>
-sha160.cpp
-sha160.h
-</add>
-
<requires>
mdx_hash
</requires>
diff --git a/src/hash/sha1_amd64/info.txt b/src/hash/sha1_amd64/info.txt
index ddbc7d380..183658ac7 100644
--- a/src/hash/sha1_amd64/info.txt
+++ b/src/hash/sha1_amd64/info.txt
@@ -4,12 +4,6 @@ define SHA1_AMD64
load_on asm_ok
-<add>
-sha1_amd64_imp.S
-sha1_amd64.cpp
-sha1_amd64.h
-</add>
-
<arch>
amd64
</arch>
diff --git a/src/hash/sha1_ia32/info.txt b/src/hash/sha1_ia32/info.txt
index bfb321145..e7709454f 100644
--- a/src/hash/sha1_ia32/info.txt
+++ b/src/hash/sha1_ia32/info.txt
@@ -4,12 +4,6 @@ define SHA1_IA32
load_on asm_ok
-<add>
-sha1_ia32_imp.S
-sha1_ia32.cpp
-sha1_ia32.h
-</add>
-
<arch>
ia32
</arch>
diff --git a/src/hash/sha1_sse2/info.txt b/src/hash/sha1_sse2/info.txt
index b8d693b70..4a7a1b5e9 100644
--- a/src/hash/sha1_sse2/info.txt
+++ b/src/hash/sha1_sse2/info.txt
@@ -2,26 +2,6 @@ realname "SHA-1 (SSE2)"
define SHA1_SSE2
-load_on auto
-
-<add>
-sha1_sse2_imp.cpp
-sha1_sse2.cpp
-sha1_sse2.h
-</add>
-
-<arch>
-pentium-m
-pentium4
-prescott
-amd64
-</arch>
-
-<cc>
-gcc
-icc
-</cc>
-
<requires>
sha1
sse2_eng
diff --git a/src/hash/sha1_sse2/sha1_sse2_imp.cpp b/src/hash/sha1_sse2/sha1_sse2_imp.cpp
index 90a8dccd5..5ee222cca 100644
--- a/src/hash/sha1_sse2/sha1_sse2_imp.cpp
+++ b/src/hash/sha1_sse2/sha1_sse2_imp.cpp
@@ -1,27 +1,18 @@
-/* this code is public domain.
-
- * dean gaudet <[email protected]>
-
- * this code was inspired by this paper:
-
- * SHA: A Design for Parallel Architectures?
- * Antoon Bosselaers, Ren�e Govaerts and Joos Vandewalle
- * <http://www.esat.kuleuven.ac.be/~cosicart/pdf/AB-9700.pdf>
-
- * more information available on this implementation here:
-
- * http://arctic.org/~dean/crypto/sha1.html
-
- * version: 2
- */
+/*
+* SHA-1 using SSE2
+* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
/*
- * Lightly modified for Botan, tested under GCC 4.1.1 and ICC 9.1
- * on a Linux/Core2 system.
+* Based on public domain code by Dean Gaudet <[email protected]>
+* http://arctic.org/~dean/crypto/sha1.html
+*/
- */
#include <botan/sha1_sse2.h>
-#include <xmmintrin.h>
+#include <botan/rotate.h>
+#include <emmintrin.h>
namespace Botan {
@@ -30,21 +21,13 @@ namespace {
typedef union {
u32bit u32[4];
__m128i u128;
- } v4si __attribute__((aligned(16)));
+ } v4si;
static const v4si K00_19 = { { 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999 } };
static const v4si K20_39 = { { 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1 } };
static const v4si K40_59 = { { 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc } };
static const v4si K60_79 = { { 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6 } };
-#define UNALIGNED 1
-#if UNALIGNED
-#define load(p) _mm_loadu_si128(p)
-#else
-#define load(p) (*p)
-#endif
-
-
/*
the first 16 bytes only need byte swapping
@@ -57,19 +40,15 @@ and is overwritten with the swapped bytes
__m128i r1, r2; \
\
r1 = (W); \
- if (1) { \
r1 = _mm_shufflehi_epi16(r1, _MM_SHUFFLE(2, 3, 0, 1)); \
r1 = _mm_shufflelo_epi16(r1, _MM_SHUFFLE(2, 3, 0, 1)); \
r2 = _mm_slli_epi16(r1, 8); \
r1 = _mm_srli_epi16(r1, 8); \
r1 = _mm_or_si128(r1, r2); \
(W) = r1; \
- } \
(prep).u128 = _mm_add_epi32(K00_19.u128, r1); \
} while(0)
-
-
/*
for each multiple of 4, t, we want to calculate this:
@@ -115,45 +94,38 @@ W0 = W[t]..W[t+3]
* efficeon, pentium-m, and opteron but shifts are available in
* only one unit.
*/
-#define prep(prep, XW0, XW1, XW2, XW3, K) do { \
- __m128i r0, r1, r2, r3; \
- \
- /* load W[t-4] 16-byte aligned, and shift */ \
- r3 = _mm_srli_si128((XW3), 4); \
- r0 = (XW0); \
- /* get high 64-bits of XW0 into low 64-bits */ \
- r1 = _mm_shuffle_epi32((XW0), _MM_SHUFFLE(1,0,3,2)); \
- /* load high 64-bits of r1 */ \
- r1 = _mm_unpacklo_epi64(r1, (XW1)); \
- r2 = (XW2); \
- \
- r0 = _mm_xor_si128(r1, r0); \
- r2 = _mm_xor_si128(r3, r2); \
- r0 = _mm_xor_si128(r2, r0); \
- /* unrotated W[t]..W[t+2] in r0 ... still need W[t+3] */ \
- \
- r2 = _mm_slli_si128(r0, 12); \
- r1 = _mm_cmplt_epi32(r0, _mm_setzero_si128()); \
- r0 = _mm_add_epi32(r0, r0); /* shift left by 1 */ \
- r0 = _mm_sub_epi32(r0, r1); /* r0 has W[t]..W[t+2] */ \
- \
- r3 = _mm_srli_epi32(r2, 30); \
- r2 = _mm_slli_epi32(r2, 2); \
- \
- r0 = _mm_xor_si128(r0, r3); \
- r0 = _mm_xor_si128(r0, r2); /* r0 now has W[t+3] */ \
- \
- (XW0) = r0; \
- (prep).u128 = _mm_add_epi32(r0, (K).u128); \
- } while(0)
-
-
-static inline u32bit rol(u32bit src, u32bit amt)
- {
- /* gcc and icc appear to turn this into a rotate */
- return (src << amt) | (src >> (32 - amt));
- }
-
+#define prep(prep, XW0, XW1, XW2, XW3, K) \
+ do { \
+ __m128i r0, r1, r2, r3; \
+ \
+ /* load W[t-4] 16-byte aligned, and shift */ \
+ r3 = _mm_srli_si128((XW3), 4); \
+ r0 = (XW0); \
+ /* get high 64-bits of XW0 into low 64-bits */ \
+ r1 = _mm_shuffle_epi32((XW0), _MM_SHUFFLE(1,0,3,2)); \
+ /* load high 64-bits of r1 */ \
+ r1 = _mm_unpacklo_epi64(r1, (XW1)); \
+ r2 = (XW2); \
+ \
+ r0 = _mm_xor_si128(r1, r0); \
+ r2 = _mm_xor_si128(r3, r2); \
+ r0 = _mm_xor_si128(r2, r0); \
+ /* unrotated W[t]..W[t+2] in r0 ... still need W[t+3] */ \
+ \
+ r2 = _mm_slli_si128(r0, 12); \
+ r1 = _mm_cmplt_epi32(r0, _mm_setzero_si128()); \
+ r0 = _mm_add_epi32(r0, r0); /* shift left by 1 */ \
+ r0 = _mm_sub_epi32(r0, r1); /* r0 has W[t]..W[t+2] */ \
+ \
+ r3 = _mm_srli_epi32(r2, 30); \
+ r2 = _mm_slli_epi32(r2, 2); \
+ \
+ r0 = _mm_xor_si128(r0, r3); \
+ r0 = _mm_xor_si128(r0, r2); /* r0 now has W[t+3] */ \
+ \
+ (XW0) = r0; \
+ (prep).u128 = _mm_add_epi32(r0, (K).u128); \
+ } while(0)
static inline u32bit f00_19(u32bit x, u32bit y, u32bit z)
{
@@ -184,11 +156,12 @@ static inline u32bit f60_79(u32bit x, u32bit y, u32bit z)
return f20_39(x, y, z);
}
-#define step(nn_mm, xa, xb, xc, xd, xe, xt, input) do { \
- (xt) = (input) + f##nn_mm((xb), (xc), (xd)); \
- (xb) = rol((xb), 30); \
- (xt) += ((xe) + rol((xa), 5)); \
- } while(0)
+#define step(nn_mm, xa, xb, xc, xd, xe, xt, input) \
+ do { \
+ (xt) = (input) + f##nn_mm((xb), (xc), (xd)); \
+ (xb) = rotate_left((xb), 30); \
+ (xt) += ((xe) + rotate_left((xa), 5)); \
+ } while(0)
}
@@ -210,14 +183,14 @@ extern "C" void botan_sha1_sse2_compress(u32bit H[5],
* steps ahead of the integer code. 12 steps ahead seems
* to produce the best performance. -dean
*/
- W0 = load(&input[0]);
+ W0 = _mm_loadu_si128(&input[0]);
prep00_15(prep0, W0); /* prepare for 00 through 03 */
- W1 = load(&input[1]);
+ W1 = _mm_loadu_si128(&input[1]);
prep00_15(prep1, W1); /* prepare for 04 through 07 */
- W2 = load(&input[2]);
+ W2 = _mm_loadu_si128(&input[2]);
prep00_15(prep2, W2); /* prepare for 08 through 11 */
- W3 = load(&input[3]);
+ W3 = _mm_loadu_si128(&input[3]);
step(00_19, a, b, c, d, e, t, prep0.u32[0]); /* 00 */
step(00_19, t, a, b, c, d, e, prep0.u32[1]); /* 01 */
step(00_19, e, t, a, b, c, d, prep0.u32[2]); /* 02 */
diff --git a/src/hash/sha2/info.txt b/src/hash/sha2/info.txt
index 9b92ff385..8cc50fa41 100644
--- a/src/hash/sha2/info.txt
+++ b/src/hash/sha2/info.txt
@@ -2,15 +2,6 @@ realname "SHA-2 (224, 256, 384, 512)"
define SHA2
-load_on auto
-
-<add>
-sha2_32.cpp
-sha2_32.h
-sha2_64.cpp
-sha2_64.h
-</add>
-
<requires>
mdx_hash
</requires>
diff --git a/src/hash/skein/info.txt b/src/hash/skein/info.txt
index bab8497c5..908033852 100644
--- a/src/hash/skein/info.txt
+++ b/src/hash/skein/info.txt
@@ -2,13 +2,6 @@ realname "Skein"
define SKEIN_512
-load_on auto
-
-<add>
-skein_512.cpp
-skein_512.h
-</add>
-
<requires>
alloc
</requires>
diff --git a/src/hash/tiger/info.txt b/src/hash/tiger/info.txt
index 7d4cd7177..92b5519c0 100644
--- a/src/hash/tiger/info.txt
+++ b/src/hash/tiger/info.txt
@@ -2,14 +2,6 @@ realname "Tiger"
define TIGER
-load_on auto
-
-<add>
-tig_tab.cpp
-tiger.cpp
-tiger.h
-</add>
-
<requires>
mdx_hash
</requires>
diff --git a/src/hash/whirlpool/info.txt b/src/hash/whirlpool/info.txt
index be55b5c3b..4fe4b2b25 100644
--- a/src/hash/whirlpool/info.txt
+++ b/src/hash/whirlpool/info.txt
@@ -2,14 +2,6 @@ realname "Whirlpool"
define WHIRLPOOL
-load_on auto
-
-<add>
-whrl_tab.cpp
-whrlpool.cpp
-whrlpool.h
-</add>
-
<requires>
mdx_hash
</requires>