]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
lib/crypto: sha256: Sync sha256_update() with sha512_update()
authorEric Biggers <ebiggers@kernel.org>
Mon, 30 Jun 2025 16:06:44 +0000 (09:06 -0700)
committerEric Biggers <ebiggers@kernel.org>
Fri, 4 Jul 2025 17:23:11 +0000 (10:23 -0700)
The BLOCK_HASH_UPDATE_BLOCKS macro is difficult to read.  For now, let's
just write the update explicitly in the straightforward way, mirroring
sha512_update().  It's possible that we'll bring back a macro for this
later, but it needs to be properly justified and hopefully a bit more
readable.

Acked-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20250630160645.3198-14-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
lib/crypto/sha256.c

index 68936d5cd7745b473688af374ac1895328c2e794..808438d4f42787ae0152d1dd65e47cbca5df0361 100644 (file)
@@ -10,7 +10,6 @@
  */
 
 #include <crypto/hmac.h>
-#include <crypto/internal/blockhash.h>
 #include <crypto/sha2.h>
 #include <linux/export.h>
 #include <linux/kernel.h>
@@ -180,8 +179,31 @@ void __sha256_update(struct __sha256_ctx *ctx, const u8 *data, size_t len)
        size_t partial = ctx->bytecount % SHA256_BLOCK_SIZE;
 
        ctx->bytecount += len;
-       BLOCK_HASH_UPDATE_BLOCKS(sha256_blocks, &ctx->state, data, len,
-                                SHA256_BLOCK_SIZE, ctx->buf, partial);
+
+       if (partial + len >= SHA256_BLOCK_SIZE) {
+               size_t nblocks;
+
+               if (partial) {
+                       size_t l = SHA256_BLOCK_SIZE - partial;
+
+                       memcpy(&ctx->buf[partial], data, l);
+                       data += l;
+                       len -= l;
+
+                       sha256_blocks(&ctx->state, ctx->buf, 1);
+               }
+
+               nblocks = len / SHA256_BLOCK_SIZE;
+               len %= SHA256_BLOCK_SIZE;
+
+               if (nblocks) {
+                       sha256_blocks(&ctx->state, data, nblocks);
+                       data += nblocks * SHA256_BLOCK_SIZE;
+               }
+               partial = 0;
+       }
+       if (len)
+               memcpy(&ctx->buf[partial], data, len);
 }
 EXPORT_SYMBOL(__sha256_update);