diff options
author | Loic Poulain <loic.poulain@linaro.org> | 2022-06-01 20:26:30 +0200 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2022-06-27 13:36:28 -0400 |
commit | 915047048f0acd3dbfe8605b854f151815f9be96 (patch) | |
tree | 46f7d85b9c852c0f6847164c0c9231e6ade45a43 /lib/sha256.c | |
parent | 084d8e6bf9ea6673e94f798c5c3793893eb783ab (diff) | |
download | u-boot-915047048f0acd3dbfe8605b854f151815f9be96.zip u-boot-915047048f0acd3dbfe8605b854f151815f9be96.tar.gz u-boot-915047048f0acd3dbfe8605b854f151815f9be96.tar.bz2 |
lib: sha256: Add support for hardware specific sha256_process
Mark sha256_process as weak to allow hardware specific implementation.
Add parameter for supporting multiple blocks processing.
Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
Diffstat (limited to 'lib/sha256.c')
-rw-r--r-- | lib/sha256.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/lib/sha256.c b/lib/sha256.c index c1fe93d..50b0b51 100644 --- a/lib/sha256.c +++ b/lib/sha256.c @@ -14,6 +14,8 @@ #include <watchdog.h> #include <u-boot/sha256.h> +#include <linux/compiler_attributes.h> + const uint8_t sha256_der_prefix[SHA256_DER_LEN] = { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, @@ -55,7 +57,7 @@ void sha256_starts(sha256_context * ctx) ctx->state[7] = 0x5BE0CD19; } -static void sha256_process(sha256_context *ctx, const uint8_t data[64]) +static void sha256_process_one(sha256_context *ctx, const uint8_t data[64]) { uint32_t temp1, temp2; uint32_t W[64]; @@ -186,6 +188,18 @@ static void sha256_process(sha256_context *ctx, const uint8_t data[64]) ctx->state[7] += H; } +__weak void sha256_process(sha256_context *ctx, const unsigned char *data, + unsigned int blocks) +{ + if (!blocks) + return; + + while (blocks--) { + sha256_process_one(ctx, data); + data += 64; + } +} + void sha256_update(sha256_context *ctx, const uint8_t *input, uint32_t length) { uint32_t left, fill; @@ -204,17 +218,15 @@ void sha256_update(sha256_context *ctx, const uint8_t *input, uint32_t length) if (left && length >= fill) { memcpy((void *) (ctx->buffer + left), (void *) input, fill); - sha256_process(ctx, ctx->buffer); + sha256_process(ctx, ctx->buffer, 1); length -= fill; input += fill; left = 0; } - while (length >= 64) { - sha256_process(ctx, input); - length -= 64; - input += 64; - } + sha256_process(ctx, input, length / 64); + input += length / 64 * 64; + length = length % 64; if (length) memcpy((void *) (ctx->buffer + left), (void *) input, length); |