summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/riscv/crypto/Kconfig1
-rw-r--r--arch/riscv/crypto/sha512-riscv64-glue.c8
2 files changed, 8 insertions, 1 deletions
diff --git a/arch/riscv/crypto/Kconfig b/arch/riscv/crypto/Kconfig
index cd9b776602f8..53e4e1eacf55 100644
--- a/arch/riscv/crypto/Kconfig
+++ b/arch/riscv/crypto/Kconfig
@@ -31,6 +31,7 @@ config CRYPTO_GHASH_RISCV64
config CRYPTO_SHA512_RISCV64
tristate "Hash functions: SHA-384 and SHA-512"
depends on 64BIT && RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
+ select CRYPTO_LIB_SHA512
select CRYPTO_SHA512
help
SHA-384 and SHA-512 secure hash algorithm (FIPS 180)
diff --git a/arch/riscv/crypto/sha512-riscv64-glue.c b/arch/riscv/crypto/sha512-riscv64-glue.c
index 4634fca78ae2..b3dbc71de07b 100644
--- a/arch/riscv/crypto/sha512-riscv64-glue.c
+++ b/arch/riscv/crypto/sha512-riscv64-glue.c
@@ -38,7 +38,13 @@ static void sha512_block(struct sha512_state *state, const u8 *data,
sha512_transform_zvknhb_zvkb(state, data, num_blocks);
kernel_vector_end();
} else {
- sha512_generic_block_fn(state, data, num_blocks);
+ struct __sha512_ctx ctx = {};
+
+ static_assert(sizeof(ctx.state) == sizeof(state->state));
+ memcpy(&ctx.state, state->state, sizeof(ctx.state));
+ __sha512_update(&ctx, data,
+ (size_t)num_blocks * SHA512_BLOCK_SIZE);
+ memcpy(state->state, &ctx.state, sizeof(state->state));
}
}