]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
Update hmac_gosthash94_digest.
authorNiels Möller <nisse@lysator.liu.se>
Sun, 22 Jun 2025 18:48:37 +0000 (20:48 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Sun, 22 Jun 2025 19:11:04 +0000 (21:11 +0200)
12 files changed:
ChangeLog
hmac-gosthash94.c
hmac-internal.h
hmac-md5.c
hmac-ripemd160.c
hmac-sha1.c
hmac-sha224.c
hmac-sha256.c
hmac-sha384.c
hmac-sha512.c
hmac-sm3.c
hmac-streebog.c

index 89e2bc1a62269cfdd1795f431248791e65f8285b..3c9e0297efa4746368417a11a6a4684def10b640 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2025-06-22  Niels Möller  <nisse@lysator.liu.se>
 
+       * hmac-internal.h (_NETTLE_HMAC_DIGEST): Do both inner and outer
+       digest. Update all callers.
+       (_NETTLE_HMAC_DIGEST_U): Variant for digest_size == block_size.
+
        HMAC context reductions: hmac_sha256_ctx reduced from 336 bytes to
        192, hmac_sha512_ctx from 648 to 376, hmac_sha1_ctx from 312 to 168.
 
index 71dd7108de71a2edf7d4d53f640572759ef01351..63f60541fd6412891e891b9e85c07d5f63b73448 100644 (file)
@@ -58,13 +58,10 @@ void
 hmac_gosthash94_digest(struct hmac_gosthash94_ctx *ctx,
                       uint8_t *digest)
 {
-  /* Using _NETTLE_HMAC_DIGEST doesn't work since
+  /* Needs a call to gosthash94_update, since
      GOSTHASH94_DIGEST_SIZE == GOSTHASH94_BLOCK_SIZE. */
-  gosthash94_digest (&ctx->state, ctx->state.block);
-  memcpy (&ctx->state, ctx->outer, sizeof (ctx->outer));
-  gosthash94_update (&ctx->state, GOSTHASH94_DIGEST_SIZE, ctx->state.block);
-  gosthash94_digest (&ctx->state, digest);
-  memcpy (&ctx->state, ctx->inner, sizeof (ctx->inner));
+  _NETTLE_HMAC_DIGEST_U (ctx->outer, ctx->inner, &ctx->state, gosthash94_digest,
+                        gosthash94_update, digest);
 }
 
 void
@@ -86,11 +83,8 @@ void
 hmac_gosthash94cp_digest(struct hmac_gosthash94cp_ctx *ctx,
                         uint8_t *digest)
 {
-  /* Using _NETTLE_HMAC_DIGEST doesn't work since
+  /* Needs a call to gosthash94cp_update, since
      GOSTHASH94CP_DIGEST_SIZE == GOSTHASH94CP_BLOCK_SIZE. */
-  gosthash94cp_digest (&ctx->state, ctx->state.block);
-  memcpy (&ctx->state, ctx->outer, sizeof (ctx->outer));
-  gosthash94cp_update (&ctx->state, GOSTHASH94CP_DIGEST_SIZE, ctx->state.block);
-  gosthash94cp_digest (&ctx->state, digest);
-  memcpy (&ctx->state, ctx->inner, sizeof (ctx->inner));
+  _NETTLE_HMAC_DIGEST_U (ctx->outer, ctx->inner, &ctx->state, gosthash94cp_digest,
+                        gosthash94cp_update, digest);
 }
index 9f67ed8dbdd844a55932b211596622e3384430c9..3dbb4f7f3544f496e6b023620410a69c6dd29cf9 100644 (file)
@@ -46,10 +46,23 @@ _nettle_hmac_set_key (size_t state_size, void *outer, void *inner,
                      const struct nettle_hash *hash,
                      size_t key_size, const uint8_t *key);
 
-#define _NETTLE_HMAC_DIGEST(outer, inner, ctx, f, digest) do { \
-    memcpy ((ctx), (outer), sizeof (outer));                   \
-    f ((ctx), (digest));                                       \
-    memcpy ((ctx), (inner), sizeof ((inner)));                 \
+/* Digest operation for the common case that digest_size < block_size. */
+#define _NETTLE_HMAC_DIGEST(outer, inner, ctx, digest, digest_size, out) do { \
+    digest((ctx), (ctx)->block);                                       \
+    memcpy ((ctx), (outer), sizeof (outer));                           \
+    (ctx)->index = (digest_size);                                      \
+    digest ((ctx), (out));                                             \
+    memcpy ((ctx), (inner), sizeof (inner));                           \
+  } while (0)
+
+/* Digest operation for the corner case that digest_size == block_size (e.g,
+   ghosthash and streebog512). */
+#define _NETTLE_HMAC_DIGEST_U(outer, inner, ctx, digest, update, out) do { \
+    digest((ctx), (ctx)->block);                                       \
+    memcpy ((ctx), (outer), sizeof (outer));                           \
+    update ((ctx), sizeof( (ctx)->block), (ctx)->block);               \
+    digest ((ctx), (out));                                             \
+    memcpy ((ctx), (inner), sizeof (inner));                           \
   } while (0)
 
 #endif /* NETTLE_HMAC_INTERNAL_H_INCLUDED */
index 240cd92ac1671dbe65211a73107273d219c183d5..448fd83bdc66738b3f83e6e1cf7ea09e3541c4aa 100644 (file)
@@ -57,7 +57,6 @@ void
 hmac_md5_digest(struct hmac_md5_ctx *ctx,
                uint8_t *digest)
 {
-  md5_digest (&ctx->state, ctx->state.block);
-  ctx->state.index = MD5_DIGEST_SIZE;
-  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, md5_digest, digest);
+  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, md5_digest,
+                      MD5_DIGEST_SIZE, digest);
 }
index ee5e802f10bbb3bbf9ab6d9263486cb9d1a5ec50..e65a141050fc7e9a1016c66b2d7189ae27b7417c 100644 (file)
@@ -57,7 +57,6 @@ void
 hmac_ripemd160_digest(struct hmac_ripemd160_ctx *ctx,
                      uint8_t *digest)
 {
-  ripemd160_digest (&ctx->state, ctx->state.block);
-  ctx->state.index = RIPEMD160_DIGEST_SIZE;
-  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, ripemd160_digest, digest);
+  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, ripemd160_digest,
+                      RIPEMD160_DIGEST_SIZE, digest);
 }
index a04fc3248a75a99bb6bc88579898cfad63b21966..ce890e0509a9af60ffc8d272f93ebc8ccbf96bf3 100644 (file)
@@ -57,7 +57,6 @@ void
 hmac_sha1_digest(struct hmac_sha1_ctx *ctx,
                 uint8_t *digest)
 {
-  sha1_digest (&ctx->state, ctx->state.block);
-  ctx->state.index = SHA1_DIGEST_SIZE;
-  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sha1_digest, digest);
+  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sha1_digest,
+                      SHA1_DIGEST_SIZE, digest);
 }
index dc588a0eb139ef8d43d3532c8a237bbc316487d3..e98bab97d431deaf70b9d7274c22fbb51e09addc 100644 (file)
@@ -52,7 +52,6 @@ void
 hmac_sha224_digest(struct hmac_sha224_ctx *ctx,
                   uint8_t *digest)
 {
-  sha224_digest (&ctx->state, ctx->state.block);
-  ctx->state.index = SHA224_DIGEST_SIZE;
-  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sha224_digest, digest);
+  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sha224_digest,
+                      SHA224_DIGEST_SIZE, digest);
 }
index aa9ce206b9b5a1e4ce013d2ee6e6e24117a8aeb7..c67cae700fcd86e046aaa326faa739e0ec0e2921 100644 (file)
@@ -59,7 +59,6 @@ void
 hmac_sha256_digest(struct hmac_sha256_ctx *ctx,
                   uint8_t *digest)
 {
-  sha256_digest (&ctx->state, ctx->state.block);
-  ctx->state.index = SHA256_DIGEST_SIZE;
-  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sha256_digest, digest);
+  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sha256_digest,
+                      SHA256_DIGEST_SIZE, digest);
 }
index 8c0b2cc559d4ead2099f0ad279c20c55eea99323..96b77f852224bc4cf4235cf0bb16cf8058720aa0 100644 (file)
@@ -50,7 +50,6 @@ void
 hmac_sha384_digest(struct hmac_sha512_ctx *ctx,
                   uint8_t *digest)
 {
-  sha384_digest (&ctx->state, ctx->state.block);
-  ctx->state.index = SHA384_DIGEST_SIZE;
-  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sha384_digest, digest);
+  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sha384_digest,
+                      SHA384_DIGEST_SIZE, digest);
 }
index 59b157211f92bf9abca78bbdbcc9eb3be1ebeab2..1bc0c69b03cb61606ccb46e8b5a30046e250547e 100644 (file)
@@ -57,7 +57,6 @@ void
 hmac_sha512_digest(struct hmac_sha512_ctx *ctx,
                   uint8_t *digest)
 {
-  sha512_digest (&ctx->state, ctx->state.block);
-  ctx->state.index = SHA512_DIGEST_SIZE;
-  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sha512_digest, digest);
+  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sha512_digest,
+                      SHA512_DIGEST_SIZE, digest);
 }
index bba2afe736d9bed2cec4b1faaf2a035cc877327b..49f22a04fa87218745bc70fad08c3f8a9d95871b 100644 (file)
@@ -58,7 +58,6 @@ void
 hmac_sm3_digest(struct hmac_sm3_ctx *ctx,
                uint8_t *digest)
 {
-  sm3_digest (&ctx->state, ctx->state.block);
-  ctx->state.index = SM3_DIGEST_SIZE;
-  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sm3_digest, digest);
+  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, sm3_digest,
+                      SM3_DIGEST_SIZE, digest);
 }
index 1791cb4405f6d322b1cc44b36caac73e5084f085..83b571406d681d01175431b33ddbe8f23ce1d011 100644 (file)
@@ -58,13 +58,10 @@ void
 hmac_streebog512_digest(struct hmac_streebog512_ctx *ctx,
                        uint8_t *digest)
 {
-  /* Using _NETTLE_HMAC_DIGEST doesn't work since
-     STREEBOG512_DIGEST_SIZE == STREEBOG512_BLOCK_SIZE. */
-  streebog512_digest (&ctx->state, ctx->state.block);
-  memcpy (&ctx->state, ctx->outer, sizeof (ctx->outer));
-  streebog512_update (&ctx->state, STREEBOG512_DIGEST_SIZE, ctx->state.block);
-  streebog512_digest (&ctx->state, digest);
-  memcpy (&ctx->state, ctx->inner, sizeof (ctx->inner));
+  /* Needs a call to streebog512_update, since STREEBOG512_DIGEST_SIZE
+     == STREEBOG512_BLOCK_SIZE. */
+  _NETTLE_HMAC_DIGEST_U (ctx->outer, ctx->inner, &ctx->state, streebog512_digest,
+                        streebog512_update, digest);
 }
 
 void
@@ -79,7 +76,6 @@ void
 hmac_streebog256_digest(struct hmac_streebog256_ctx *ctx,
                        uint8_t *digest)
 {
-  streebog256_digest (&ctx->state, ctx->state.block);
-  ctx->state.index = STREEBOG256_DIGEST_SIZE;
-  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, streebog256_digest, digest);
+  _NETTLE_HMAC_DIGEST (ctx->outer, ctx->inner, &ctx->state, streebog256_digest,
+                      STREEBOG256_DIGEST_SIZE, digest);
 }