diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2013-01-16 01:19:24 +0400 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2013-01-16 01:19:24 +0400 |
commit | 970aa6b5bd95e435e537d123ec8be99c3077af1b (patch) | |
tree | 690f57187c58d130cda0c54179810a6bfd266cd2 /libbb | |
parent | 8fb3ab528e1a640342c04d996e54f7fa668fdce6 (diff) |
sha3: cache ctx->bytes_queued
function old new delta
sha3_hash 171 155 -16
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/hash_md5_sha.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/libbb/hash_md5_sha.c b/libbb/hash_md5_sha.c index 60f44cc3d..d143fc651 100644 --- a/libbb/hash_md5_sha.c +++ b/libbb/hash_md5_sha.c @@ -977,8 +977,6 @@ static const uint8_t KECCAK_PI_LANE[25] = { 14, 22, 9, 6, 1 }; -#define ARCH_IS_64BIT (sizeof(long) >= sizeof(uint64_t)) - static void KeccakF(uint64_t *state) { /*static const uint8_t MOD5[10] = { 0, 1, 2, 3, 4, 0, 1, 2, 3, 4 };*/ @@ -1074,8 +1072,6 @@ static void KeccakF(uint64_t *state) } } -#undef ARCH_IS_64BIT - void FAST_FUNC sha3_begin(sha3_ctx_t *ctx) { memset(ctx, 0, sizeof(*ctx)); @@ -1084,16 +1080,17 @@ void FAST_FUNC sha3_begin(sha3_ctx_t *ctx) void FAST_FUNC sha3_hash(sha3_ctx_t *ctx, const void *buf, size_t bytes) { const uint8_t *data = buf; + unsigned bytes_queued = ctx->bytes_queued; /* If already data in queue, continue queuing first */ - while (bytes != 0 && ctx->bytes_queued != 0) { + while (bytes != 0 && bytes_queued != 0) { uint8_t *buffer = (uint8_t*)ctx->state; - buffer[ctx->bytes_queued] ^= *data++; + buffer[bytes_queued] ^= *data++; bytes--; - ctx->bytes_queued++; - if (ctx->bytes_queued == KECCAK_IBLK_BYTES) { + bytes_queued++; + if (bytes_queued == KECCAK_IBLK_BYTES) { KeccakF(ctx->state); - ctx->bytes_queued = 0; + bytes_queued = 0; } } @@ -1113,16 +1110,19 @@ void FAST_FUNC sha3_hash(sha3_ctx_t *ctx, const void *buf, size_t bytes) } while (--count); KeccakF(ctx->state); + bytes -= KECCAK_IBLK_BYTES; } /* Queue remaining data bytes */ while (bytes != 0) { uint8_t *buffer = (uint8_t*)ctx->state; - buffer[ctx->bytes_queued] ^= *data++; - ctx->bytes_queued++; + buffer[bytes_queued] ^= *data++; + bytes_queued++; bytes--; } + + ctx->bytes_queued = bytes_queued; } void FAST_FUNC sha3_end(sha3_ctx_t *ctx, uint8_t *hashval) |