diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2013-01-15 17:47:05 +0400 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2013-01-15 17:47:05 +0400 |
commit | 07a54e21dd08bcd752a23095fdedc904eb7127fb (patch) | |
tree | fda649b9f6f1071827a8ccd4fcfdd95491459ef5 /libbb | |
parent | 6830ade6aa91dad5afe6abf9d1e4f696f5641bf1 (diff) |
sha3: another speedup for SHA3_SMALL=0 case
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/hash_md5_sha.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/libbb/hash_md5_sha.c b/libbb/hash_md5_sha.c index 643cf205f..3b1366762 100644 --- a/libbb/hash_md5_sha.c +++ b/libbb/hash_md5_sha.c @@ -1041,16 +1041,31 @@ static void KeccakF(uint64_t *state) /* Chi */ for (y = 0; y <= 20; y += 5) { - uint64_t BC[5]; - BC[0] = state[y + 0]; - BC[1] = state[y + 1]; - BC[2] = state[y + 2]; - BC[3] = state[y + 3]; - BC[4] = state[y + 4]; - for (x = 0; x < 5; ++x) { - state[y + x] = - BC[x] ^ ((~BC[KeccakF_Mod5[x + 1]]) & - BC[KeccakF_Mod5[x + 2]]); + if (SHA3_SMALL) { + uint64_t BC[5]; + BC[0] = state[y + 0]; + BC[1] = state[y + 1]; + BC[2] = state[y + 2]; + BC[3] = state[y + 3]; + BC[4] = state[y + 4]; + for (x = 0; x < 5; ++x) { + state[y + x] = + BC[x] ^ ((~BC[KeccakF_Mod5[x + 1]]) & + BC[KeccakF_Mod5[x + 2]]); + } + } else { + /* 32-bit x86: +50 bytes code, 10% faster */ + uint64_t BC0, BC1, BC2, BC3, BC4; + BC0 = state[y + 0]; + BC1 = state[y + 1]; + BC2 = state[y + 2]; + state[y + 0] = BC0 ^ ((~BC1) & BC2); + BC3 = state[y + 3]; + state[y + 1] = BC1 ^ ((~BC2) & BC3); + BC4 = state[y + 4]; + state[y + 2] = BC2 ^ ((~BC3) & BC4); + state[y + 3] = BC3 ^ ((~BC4) & BC0); + state[y + 4] = BC4 ^ ((~BC0) & BC1); } } |