commit 9b592418ccb31c6299973689031c5f40e5cc1a34
parent bb9fdf70159b23a9335e93fc7ee3717e53e58c1e
Author: MikoĊaj Lenczewski <mikolaj@lenczewski.org>
Date: Wed, 16 Sep 2026 16:35:46 +0100
Improve sha function interface
Diffstat:
| M | sha.c | | | 70 | ++++++++++++++++++++++++++++++++++++---------------------------------- |
| M | sha.h | | | 12 | ++++++------ |
2 files changed, 42 insertions(+), 40 deletions(-)
diff --git a/sha.c b/sha.c
@@ -140,14 +140,15 @@ sha256_push(struct sha256_ctx *ctx, void const *buf, size_t len)
}
static inline void
-_sha256_digest_bswap(struct sha256_ctx *ctx, size_t words)
+_sha256_digest_bswap(struct sha256_ctx *ctx, void *digest, size_t words)
{
+ sha256_word_t *out = digest;
for (size_t i = 0; i < words; i++)
- ctx->digest[i] = htobe32(ctx->digest[i]);
+ out[i] = htobe32(ctx->digest[i]);
}
void
-sha256_dgst(struct sha256_ctx *ctx)
+sha256_dgst(struct sha256_ctx *ctx, unsigned char digest[static SHA256_DIGEST_SIZE])
{
unsigned char *block = ((unsigned char *) ctx->schedule);
unsigned char *cur = block + (ctx->ctr & SHA256_BLOCK_MASK);
@@ -179,7 +180,7 @@ sha256_dgst(struct sha256_ctx *ctx)
_sha256_block(ctx);
// write out internally host-endian hash as big-endian hash
- _sha256_digest_bswap(ctx, SHA256_DIGEST_WORDS);
+ _sha256_digest_bswap(ctx, digest, SHA256_DIGEST_WORDS);
}
void
@@ -188,9 +189,7 @@ sha256(void const *buf, size_t len, unsigned char digest[static SHA256_DIGEST_SI
struct sha256_ctx ctx;
sha256_init(&ctx);
sha256_push(&ctx, buf, len);
- sha256_dgst(&ctx);
-
- memcpy(digest, ctx.digest, SHA256_DIGEST_SIZE);
+ sha256_dgst(&ctx, digest);
}
// sha224
@@ -218,9 +217,12 @@ sha224_push(struct sha256_ctx *ctx, void const *buf, size_t len)
}
void
-sha224_dgst(struct sha256_ctx *ctx)
+sha224_dgst(struct sha256_ctx *ctx, unsigned char digest[static SHA224_DIGEST_SIZE])
{
- sha256_dgst(ctx);
+ unsigned char tmp[SHA256_DIGEST_SIZE];
+ sha256_dgst(ctx, tmp);
+
+ memcpy(digest, tmp, SHA224_DIGEST_SIZE);
}
void
@@ -229,9 +231,7 @@ sha224(void const *buf, size_t len, unsigned char digest[static SHA224_DIGEST_SI
struct sha256_ctx ctx;
sha224_init(&ctx);
sha224_push(&ctx, buf, len);
- sha224_dgst(&ctx);
-
- memcpy(digest, ctx.digest, SHA224_DIGEST_SIZE);
+ sha224_dgst(&ctx, digest);
}
// sha512
@@ -329,14 +329,15 @@ sha512_push(struct sha512_ctx *ctx, void const *buf, size_t len)
}
static inline void
-_sha512_digest_bswap(struct sha512_ctx *ctx, size_t words)
+_sha512_digest_bswap(struct sha512_ctx *ctx, void *digest, size_t words)
{
+ sha512_word_t *out = digest;
for (size_t i = 0; i < words; i++)
- ctx->digest[i] = htobe64(ctx->digest[i]);
+ out[i] = htobe64(ctx->digest[i]);
}
void
-sha512_dgst(struct sha512_ctx *ctx)
+sha512_dgst(struct sha512_ctx *ctx, unsigned char digest[static SHA512_DIGEST_SIZE])
{
unsigned char *block = ((unsigned char *) ctx->schedule);
unsigned char *cur = block + (ctx->ctr & SHA512_BLOCK_MASK);
@@ -370,7 +371,7 @@ sha512_dgst(struct sha512_ctx *ctx)
_sha512_block(ctx);
// write out internally host-endian hash as big-endian hash
- _sha512_digest_bswap(ctx, SHA512_DIGEST_WORDS);
+ _sha512_digest_bswap(ctx, digest, SHA512_DIGEST_WORDS);
}
void
@@ -379,9 +380,7 @@ sha512(void const *buf, size_t len, unsigned char digest[static SHA512_DIGEST_SI
struct sha512_ctx ctx;
sha512_init(&ctx);
sha512_push(&ctx, buf, len);
- sha512_dgst(&ctx);
-
- memcpy(digest, ctx.digest, SHA512_DIGEST_SIZE);
+ sha512_dgst(&ctx, digest);
}
// sha384
@@ -409,9 +408,12 @@ sha384_push(struct sha512_ctx *ctx, void const *buf, size_t len)
}
void
-sha384_dgst(struct sha512_ctx *ctx)
+sha384_dgst(struct sha512_ctx *ctx, unsigned char digest[static SHA384_DIGEST_SIZE])
{
- sha512_dgst(ctx);
+ unsigned char tmp[SHA512_DIGEST_SIZE];
+ sha512_dgst(ctx, tmp);
+
+ memcpy(digest, tmp, SHA384_DIGEST_SIZE);
}
void
@@ -420,9 +422,7 @@ sha384(void const *buf, size_t len, unsigned char digest[static SHA384_DIGEST_SI
struct sha512_ctx ctx;
sha384_init(&ctx);
sha384_push(&ctx, buf, len);
- sha384_dgst(&ctx);
-
- memcpy(digest, ctx.digest, SHA384_DIGEST_SIZE);
+ sha384_dgst(&ctx, digest);
}
// sha512/224
@@ -450,9 +450,12 @@ sha512_224_push(struct sha512_ctx *ctx, void const *buf, size_t len)
}
void
-sha512_224_dgst(struct sha512_ctx *ctx)
+sha512_224_dgst(struct sha512_ctx *ctx, unsigned char digest[static SHA512_224_DIGEST_SIZE])
{
- sha512_dgst(ctx);
+ unsigned char tmp[SHA512_DIGEST_SIZE];
+ sha512_dgst(ctx, tmp);
+
+ memcpy(digest, tmp, SHA512_224_DIGEST_SIZE);
}
void
@@ -461,9 +464,7 @@ sha512_224(void const *buf, size_t len, unsigned char digest[static SHA512_224_D
struct sha512_ctx ctx;
sha512_224_init(&ctx);
sha512_224_push(&ctx, buf, len);
- sha512_224_dgst(&ctx);
-
- memcpy(digest, ctx.digest, SHA512_224_DIGEST_SIZE);
+ sha512_224_dgst(&ctx, digest);
}
// sha512/256
@@ -491,9 +492,12 @@ sha512_256_push(struct sha512_ctx *ctx, void const *buf, size_t len)
}
void
-sha512_256_dgst(struct sha512_ctx *ctx)
+sha512_256_dgst(struct sha512_ctx *ctx, unsigned char digest[static SHA512_256_DIGEST_SIZE])
{
- sha512_dgst(ctx);
+ unsigned char tmp[SHA512_DIGEST_SIZE];
+ sha512_dgst(ctx, tmp);
+
+ memcpy(digest, tmp, SHA512_256_DIGEST_SIZE);
}
void
@@ -502,7 +506,5 @@ sha512_256(void const *buf, size_t len, unsigned char digest[static SHA512_256_D
struct sha512_ctx ctx;
sha512_256_init(&ctx);
sha512_256_push(&ctx, buf, len);
- sha512_256_dgst(&ctx);
-
- memcpy(digest, ctx.digest, SHA512_256_DIGEST_SIZE);
+ sha512_256_dgst(&ctx, digest);
}
diff --git a/sha.h b/sha.h
@@ -121,7 +121,7 @@ void
sha256_push(struct sha256_ctx *ctx, void const *buf, size_t len);
void
-sha256_dgst(struct sha256_ctx *ctx);
+sha256_dgst(struct sha256_ctx *ctx, unsigned char digest[static SHA256_DIGEST_SIZE]);
void
sha256(void const *buf, size_t len, unsigned char digest[static SHA256_DIGEST_SIZE]);
@@ -136,7 +136,7 @@ void
sha224_push(struct sha256_ctx *ctx, void const *buf, size_t len);
void
-sha224_dgst(struct sha256_ctx *ctx);
+sha224_dgst(struct sha256_ctx *ctx, unsigned char digest[static SHA224_DIGEST_SIZE]);
void
sha224(void const *buf, size_t len, unsigned char digest[static SHA224_DIGEST_SIZE]);
@@ -151,7 +151,7 @@ void
sha512_push(struct sha512_ctx *ctx, void const *buf, size_t len);
void
-sha512_dgst(struct sha512_ctx *ctx);
+sha512_dgst(struct sha512_ctx *ctx, unsigned char digest[static SHA512_DIGEST_SIZE]);
void
sha512(void const *buf, size_t len, unsigned char digest[static SHA512_DIGEST_SIZE]);
@@ -166,7 +166,7 @@ void
sha384_push(struct sha512_ctx *ctx, void const *buf, size_t len);
void
-sha384_dgst(struct sha512_ctx *ctx);
+sha384_dgst(struct sha512_ctx *ctx, unsigned char digest[static SHA384_DIGEST_SIZE]);
void
sha384(void const *buf, size_t len, unsigned char digest[static SHA384_DIGEST_SIZE]);
@@ -181,7 +181,7 @@ void
sha512_224_push(struct sha512_ctx *ctx, void const *buf, size_t len);
void
-sha512_224_dgst(struct sha512_ctx *ctx);
+sha512_224_dgst(struct sha512_ctx *ctx, unsigned char digest[static SHA512_224_DIGEST_SIZE]);
void
sha512_224(void const *buf, size_t len, unsigned char digest[static SHA512_224_DIGEST_SIZE]);
@@ -196,7 +196,7 @@ void
sha512_256_push(struct sha512_ctx *ctx, void const *buf, size_t len);
void
-sha512_256_dgst(struct sha512_ctx *ctx);
+sha512_256_dgst(struct sha512_ctx *ctx, unsigned char digest[static SHA512_256_DIGEST_SIZE]);
void
sha512_256(void const *buf, size_t len, unsigned char digest[static SHA512_256_DIGEST_SIZE]);