Commit 7d2f5b0c authored by Hans de Goede's avatar Hans de Goede Committed by Herbert Xu

crypto: sha256 - Add sha224 support to sha256 library code

Add sha224 support to the lib/crypto/sha256 library code. This will allow
us to replace both the sha256 and sha224 parts of crypto/sha256_generic.c
when we remove the code duplication in further patches in this series.
Suggested-by: default avatarEric Biggers <ebiggers@kernel.org>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 01d3aee8
...@@ -26,4 +26,9 @@ extern int sha256_update(struct sha256_state *sctx, const u8 *input, ...@@ -26,4 +26,9 @@ extern int sha256_update(struct sha256_state *sctx, const u8 *input,
unsigned int length); unsigned int length);
extern int sha256_final(struct sha256_state *sctx, u8 *hash); extern int sha256_final(struct sha256_state *sctx, u8 *hash);
extern int sha224_init(struct sha256_state *sctx);
extern int sha224_update(struct sha256_state *sctx, const u8 *input,
unsigned int length);
extern int sha224_final(struct sha256_state *sctx, u8 *hash);
#endif /* SHA256_H */ #endif /* SHA256_H */
...@@ -221,6 +221,22 @@ int sha256_init(struct sha256_state *sctx) ...@@ -221,6 +221,22 @@ int sha256_init(struct sha256_state *sctx)
} }
EXPORT_SYMBOL(sha256_init); EXPORT_SYMBOL(sha256_init);
int sha224_init(struct sha256_state *sctx)
{
sctx->state[0] = SHA224_H0;
sctx->state[1] = SHA224_H1;
sctx->state[2] = SHA224_H2;
sctx->state[3] = SHA224_H3;
sctx->state[4] = SHA224_H4;
sctx->state[5] = SHA224_H5;
sctx->state[6] = SHA224_H6;
sctx->state[7] = SHA224_H7;
sctx->count = 0;
return 0;
}
EXPORT_SYMBOL(sha224_init);
int sha256_update(struct sha256_state *sctx, const u8 *data, unsigned int len) int sha256_update(struct sha256_state *sctx, const u8 *data, unsigned int len)
{ {
unsigned int partial, done; unsigned int partial, done;
...@@ -252,7 +268,13 @@ int sha256_update(struct sha256_state *sctx, const u8 *data, unsigned int len) ...@@ -252,7 +268,13 @@ int sha256_update(struct sha256_state *sctx, const u8 *data, unsigned int len)
} }
EXPORT_SYMBOL(sha256_update); EXPORT_SYMBOL(sha256_update);
int sha256_final(struct sha256_state *sctx, u8 *out) int sha224_update(struct sha256_state *sctx, const u8 *data, unsigned int len)
{
return sha256_update(sctx, data, len);
}
EXPORT_SYMBOL(sha224_update);
static int __sha256_final(struct sha256_state *sctx, u8 *out, int digest_words)
{ {
__be32 *dst = (__be32 *)out; __be32 *dst = (__be32 *)out;
__be64 bits; __be64 bits;
...@@ -272,7 +294,7 @@ int sha256_final(struct sha256_state *sctx, u8 *out) ...@@ -272,7 +294,7 @@ int sha256_final(struct sha256_state *sctx, u8 *out)
sha256_update(sctx, (const u8 *)&bits, sizeof(bits)); sha256_update(sctx, (const u8 *)&bits, sizeof(bits));
/* Store state in digest */ /* Store state in digest */
for (i = 0; i < 8; i++) for (i = 0; i < digest_words; i++)
put_unaligned_be32(sctx->state[i], &dst[i]); put_unaligned_be32(sctx->state[i], &dst[i]);
/* Zeroize sensitive information. */ /* Zeroize sensitive information. */
...@@ -280,4 +302,15 @@ int sha256_final(struct sha256_state *sctx, u8 *out) ...@@ -280,4 +302,15 @@ int sha256_final(struct sha256_state *sctx, u8 *out)
return 0; return 0;
} }
int sha256_final(struct sha256_state *sctx, u8 *out)
{
return __sha256_final(sctx, out, 8);
}
EXPORT_SYMBOL(sha256_final); EXPORT_SYMBOL(sha256_final);
int sha224_final(struct sha256_state *sctx, u8 *out)
{
return __sha256_final(sctx, out, 7);
}
EXPORT_SYMBOL(sha224_final);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment