diff options
author | Loic Poulain <loic.poulain@linaro.org> | 2022-06-01 20:26:27 +0200 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2022-06-27 13:36:27 -0400 |
commit | 8201b8066a898c1ae72af45dbda8950410ee4743 (patch) | |
tree | 64926b546369306859d32efd9f34c61eca085c0f /lib | |
parent | c316ee674f25b73285f241ce922307296616a92a (diff) | |
download | u-boot-8201b8066a898c1ae72af45dbda8950410ee4743.zip u-boot-8201b8066a898c1ae72af45dbda8950410ee4743.tar.gz u-boot-8201b8066a898c1ae72af45dbda8950410ee4743.tar.bz2 |
lib: sha1: Add support for hardware specific sha1_process
Mark sha1_process as weak to allow hardware specific implementation.
Add parameter to support for multiple blocks processing.
Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sha1.c | 26 |
1 files changed, 19 insertions, 7 deletions
@@ -25,6 +25,8 @@ #include <watchdog.h> #include <u-boot/sha1.h> +#include <linux/compiler_attributes.h> + const uint8_t sha1_der_prefix[SHA1_DER_LEN] = { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 @@ -65,7 +67,7 @@ void sha1_starts (sha1_context * ctx) ctx->state[4] = 0xC3D2E1F0; } -static void sha1_process(sha1_context *ctx, const unsigned char data[64]) +static void __maybe_unused sha1_process_one(sha1_context *ctx, const unsigned char data[64]) { unsigned long temp, W[16], A, B, C, D, E; @@ -219,6 +221,18 @@ static void sha1_process(sha1_context *ctx, const unsigned char data[64]) ctx->state[4] += E; } +__weak void sha1_process(sha1_context *ctx, const unsigned char *data, + unsigned int blocks) +{ + if (!blocks) + return; + + while (blocks--) { + sha1_process_one(ctx, data); + data += 64; + } +} + /* * SHA-1 process buffer */ @@ -242,17 +256,15 @@ void sha1_update(sha1_context *ctx, const unsigned char *input, if (left && ilen >= fill) { memcpy ((void *) (ctx->buffer + left), (void *) input, fill); - sha1_process (ctx, ctx->buffer); + sha1_process(ctx, ctx->buffer, 1); input += fill; ilen -= fill; left = 0; } - while (ilen >= 64) { - sha1_process (ctx, input); - input += 64; - ilen -= 64; - } + sha1_process(ctx, input, ilen / 64); + input += ilen / 64 * 64; + ilen = ilen % 64; if (ilen > 0) { memcpy ((void *) (ctx->buffer + left), (void *) input, ilen); |