diff options
| -rw-r--r-- | lib/crypto/sha256.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/lib/crypto/sha256.c b/lib/crypto/sha256.c index 68936d5cd774..808438d4f427 100644 --- a/lib/crypto/sha256.c +++ b/lib/crypto/sha256.c @@ -10,7 +10,6 @@ */ #include <crypto/hmac.h> -#include <crypto/internal/blockhash.h> #include <crypto/sha2.h> #include <linux/export.h> #include <linux/kernel.h> @@ -180,8 +179,31 @@ void __sha256_update(struct __sha256_ctx *ctx, const u8 *data, size_t len) size_t partial = ctx->bytecount % SHA256_BLOCK_SIZE; ctx->bytecount += len; - BLOCK_HASH_UPDATE_BLOCKS(sha256_blocks, &ctx->state, data, len, - SHA256_BLOCK_SIZE, ctx->buf, partial); + + if (partial + len >= SHA256_BLOCK_SIZE) { + size_t nblocks; + + if (partial) { + size_t l = SHA256_BLOCK_SIZE - partial; + + memcpy(&ctx->buf[partial], data, l); + data += l; + len -= l; + + sha256_blocks(&ctx->state, ctx->buf, 1); + } + + nblocks = len / SHA256_BLOCK_SIZE; + len %= SHA256_BLOCK_SIZE; + + if (nblocks) { + sha256_blocks(&ctx->state, data, nblocks); + data += nblocks * SHA256_BLOCK_SIZE; + } + partial = 0; + } + if (len) + memcpy(&ctx->buf[partial], data, len); } EXPORT_SYMBOL(__sha256_update); |
