tls

tls.git
git clone git://git.lenczewski.org/tls.git
Log | Files | Refs

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:
Msha.c | 70++++++++++++++++++++++++++++++++++++----------------------------------
Msha.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]);