]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
Rework hmac-sha256.
authorNiels Möller <nisse@lysator.liu.se>
Mon, 21 Oct 2024 18:11:21 +0000 (20:11 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Sun, 22 Jun 2025 19:11:04 +0000 (21:11 +0200)
ChangeLog
hmac-sha224.c
hmac-sha256.c
hmac.h

index 4cfe7966154214aa923371b078784f80af8a9807..d38352bbdd6f84fc1158bdcdb5606a7e3246f8a2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2024-10-21  Niels Möller  <nisse@lysator.liu.se>
+
+       * hmac.h (struct hmac_sha256_ctx): Change outer and inner members
+       to hold only the sha256 state, no block buffers.
+       * hmac-sha256.c (hmac_sha256_set_key): Rewrite, without hmac_set_key.
+       (hmac_sha256_digest): Rewrite, without hmac_digest.
+       * hmac-sha224.c (hmac_sha224_set_key): Analogous change.
+       (hmac_sha224_digest): Analogous change.
+
 2025-06-22  Niels Möller  <nisse@lysator.liu.se>
 
        * testsuite/testutils.c (test_mac): Print name of mac algorithm on
index b1d6e594fbf6527382b3d80cf235315477251003..1d9af7d702c20382a1f5748d0d77a1d838709ee8 100644 (file)
 # include "config.h"
 #endif
 
+#include <string.h>
+
 #include "hmac.h"
+#include "memxor.h"
+
+#define IPAD 0x36
+#define OPAD 0x5c
 
 void
 hmac_sha224_set_key(struct hmac_sha224_ctx *ctx,
                    size_t key_length, const uint8_t *key)
 {
-  HMAC_SET_KEY(ctx, &nettle_sha224, key_length, key);
+  uint8_t digest[SHA224_DIGEST_SIZE];
+
+  sha224_init (&ctx->state);
+  if (key_length > SHA224_BLOCK_SIZE)
+    {
+      sha224_update (&ctx->state, key_length, key);
+      sha224_digest (&ctx->state, digest);
+      key = digest;
+      key_length = SHA224_DIGEST_SIZE;
+    }
+
+  memset (ctx->state.block, OPAD, SHA224_BLOCK_SIZE);
+  memxor (ctx->state.block, key, key_length);
+  sha224_update (&ctx->state, SHA224_BLOCK_SIZE, ctx->state.block);
+  memcpy (ctx->outer, ctx->state.state, sizeof(ctx->outer));
+
+  sha224_init (&ctx->state);
+  memset (ctx->state.block, IPAD, SHA224_BLOCK_SIZE);
+  memxor (ctx->state.block, key, key_length);
+  sha224_update (&ctx->state, SHA224_BLOCK_SIZE, ctx->state.block);
+  memcpy (ctx->inner, ctx->state.state, sizeof(ctx->outer));
 }
 
 void
 hmac_sha224_digest(struct hmac_sha224_ctx *ctx,
                   uint8_t *digest)
 {
-  HMAC_DIGEST(ctx, &nettle_sha224, digest);
+  uint8_t inner_digest[SHA224_DIGEST_SIZE];
+  sha224_digest (&ctx->state, inner_digest);
+
+  memcpy (ctx->state.state, ctx->outer, sizeof (ctx->state.state));
+  ctx->state.count = 1;
+  sha224_update (&ctx->state, SHA224_DIGEST_SIZE, inner_digest);
+  sha224_digest (&ctx->state, digest);
+
+  memcpy (ctx->state.state, ctx->inner, sizeof (ctx->state.state));
+  ctx->state.count = 1;
 }
index caa55f4d80bff09b2c796f80624310a354148326..047dc8f574af3683fec7e81497b479a3d2cef670 100644 (file)
 # include "config.h"
 #endif
 
+#include <string.h>
+
 #include "hmac.h"
+#include "memxor.h"
+
+#define IPAD 0x36
+#define OPAD 0x5c
 
 void
 hmac_sha256_set_key(struct hmac_sha256_ctx *ctx,
                    size_t key_length, const uint8_t *key)
 {
-  HMAC_SET_KEY(ctx, &nettle_sha256, key_length, key);
+  uint8_t digest[SHA256_DIGEST_SIZE];
+
+  sha256_init (&ctx->state);
+  if (key_length > SHA256_BLOCK_SIZE)
+    {
+      sha256_update (&ctx->state, key_length, key);
+      sha256_digest (&ctx->state, digest);
+      key = digest;
+      key_length = SHA256_DIGEST_SIZE;
+    }
+
+  memset (ctx->state.block, OPAD, SHA256_BLOCK_SIZE);
+  memxor (ctx->state.block, key, key_length);
+  sha256_update (&ctx->state, SHA256_BLOCK_SIZE, ctx->state.block);
+  memcpy (ctx->outer, ctx->state.state, sizeof(ctx->outer));
+
+  sha256_init (&ctx->state);
+  memset (ctx->state.block, IPAD, SHA256_BLOCK_SIZE);
+  memxor (ctx->state.block, key, key_length);
+  sha256_update (&ctx->state, SHA256_BLOCK_SIZE, ctx->state.block);
+  memcpy (ctx->inner, ctx->state.state, sizeof(ctx->outer));
 }
 
 void
@@ -55,5 +81,14 @@ void
 hmac_sha256_digest(struct hmac_sha256_ctx *ctx,
                   uint8_t *digest)
 {
-  HMAC_DIGEST(ctx, &nettle_sha256, digest);
+  uint8_t inner_digest[SHA256_DIGEST_SIZE];
+  sha256_digest (&ctx->state, inner_digest);
+
+  memcpy (ctx->state.state, ctx->outer, sizeof (ctx->state.state));
+  ctx->state.count = 1;
+  sha256_update (&ctx->state, SHA256_DIGEST_SIZE, inner_digest);
+  sha256_digest (&ctx->state, digest);
+
+  memcpy (ctx->state.state, ctx->inner, sizeof (ctx->state.state));
+  ctx->state.count = 1;
 }
diff --git a/hmac.h b/hmac.h
index 7e41b5b4f54fe593d32cb6ac1d605471cdc80120..2abb3b20fe32143ad2b92b33d179088bc58bca1c 100644 (file)
--- a/hmac.h
+++ b/hmac.h
@@ -165,7 +165,11 @@ hmac_sha1_digest(struct hmac_sha1_ctx *ctx,
                 uint8_t *digest);
 
 /* hmac-sha256 */
-struct hmac_sha256_ctx HMAC_CTX(struct sha256_ctx);
+struct hmac_sha256_ctx {
+  uint32_t outer[_SHA256_DIGEST_LENGTH];
+  uint32_t inner[_SHA256_DIGEST_LENGTH];
+  struct sha256_ctx state;
+};
 
 void
 hmac_sha256_set_key(struct hmac_sha256_ctx *ctx,