Add a one-shot SHA-224 computation function sha224(), for consistency with sha256(), sha384(), and sha512() which all already exist.
Similarly, add sha224_update(). While for now it's identical to sha256_update(), omitting it makes the API harder to use since users have to "know" which functions are the same between SHA-224 and SHA-256. Also, this is a prerequisite for using different context types for each. Signed-off-by: Eric Biggers <ebigg...@kernel.org> --- include/crypto/sha2.h | 10 ++++++++-- lib/crypto/sha256.c | 10 ++++++++++ lib/crypto/tests/sha224_kunit.c | 13 +------------ 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/include/crypto/sha2.h b/include/crypto/sha2.h index bb181b7996cdc..e31da0743a522 100644 --- a/include/crypto/sha2.h +++ b/include/crypto/sha2.h @@ -112,22 +112,28 @@ struct sha512_state { u64 state[SHA512_DIGEST_SIZE / 8]; u64 count[2]; u8 buf[SHA512_BLOCK_SIZE]; }; +void sha256_update(struct sha256_state *sctx, const u8 *data, size_t len); + static inline void sha224_init(struct sha256_state *sctx) { sha224_block_init(&sctx->ctx); } -/* Simply use sha256_update as it is equivalent to sha224_update. */ +static inline void sha224_update(struct sha256_state *sctx, + const u8 *data, size_t len) +{ + sha256_update(sctx, data, len); +} void sha224_final(struct sha256_state *sctx, u8 out[SHA224_DIGEST_SIZE]); +void sha224(const u8 *data, size_t len, u8 out[SHA224_DIGEST_SIZE]); static inline void sha256_init(struct sha256_state *sctx) { sha256_block_init(&sctx->ctx); } -void sha256_update(struct sha256_state *sctx, const u8 *data, size_t len); void sha256_final(struct sha256_state *sctx, u8 out[SHA256_DIGEST_SIZE]); void sha256(const u8 *data, size_t len, u8 out[SHA256_DIGEST_SIZE]); /* State for the SHA-512 (and SHA-384) compression function */ struct sha512_block_state { diff --git a/lib/crypto/sha256.c b/lib/crypto/sha256.c index 573ccecbf48bf..ccaae70880166 100644 --- a/lib/crypto/sha256.c +++ b/lib/crypto/sha256.c @@ -68,10 +68,20 @@ void sha256_final(struct sha256_state *sctx, u8 out[SHA256_DIGEST_SIZE]) { __sha256_final(sctx, out, SHA256_DIGEST_SIZE); } EXPORT_SYMBOL(sha256_final); +void sha224(const u8 *data, size_t len, u8 out[SHA224_DIGEST_SIZE]) +{ + struct sha256_state sctx; + + sha224_init(&sctx); + sha224_update(&sctx, data, len); + sha224_final(&sctx, out); +} +EXPORT_SYMBOL(sha224); + void sha256(const u8 *data, size_t len, u8 out[SHA256_DIGEST_SIZE]) { struct sha256_state sctx; sha256_init(&sctx); diff --git a/lib/crypto/tests/sha224_kunit.c b/lib/crypto/tests/sha224_kunit.c index 5015861a55112..c484c1d4a2a5e 100644 --- a/lib/crypto/tests/sha224_kunit.c +++ b/lib/crypto/tests/sha224_kunit.c @@ -3,26 +3,15 @@ * Copyright 2025 Google LLC */ #include <crypto/sha2.h> #include "sha224-testvecs.h" -/* TODO: add sha224() to the library itself */ -static inline void sha224(const u8 *data, size_t len, - u8 out[SHA224_DIGEST_SIZE]) -{ - struct sha256_state state; - - sha224_init(&state); - sha256_update(&state, data, len); - sha224_final(&state, out); -} - #define HASH sha224 #define HASH_CTX sha256_state #define HASH_SIZE SHA224_DIGEST_SIZE #define HASH_INIT sha224_init -#define HASH_UPDATE sha256_update +#define HASH_UPDATE sha224_update #define HASH_FINAL sha224_final #define HASH_TESTVECS sha224_testvecs /* TODO: add HMAC-SHA224 support to the library, then enable the tests for it */ #include "hash-test-template.h" -- 2.50.0