HMAC-GOSTHASH94 message authentication code.
Copyright (C) 2016 Dmitry Eremin-Solenikov
+ Copyright (C) 2024 Niels Möller
This file is part of GNU Nettle.
#endif
#include "hmac.h"
+#include "hmac-internal.h"
void
hmac_gosthash94_set_key(struct hmac_gosthash94_ctx *ctx,
- size_t key_length, const uint8_t *key)
+ size_t key_length, const uint8_t *key)
{
- HMAC_SET_KEY(ctx, &nettle_gosthash94, key_length, key);
+ _nettle_hmac_set_key (sizeof(ctx->outer), ctx->outer, ctx->inner, &ctx->state,
+ ctx->state.block, &nettle_gosthash94, key_length, key);
}
void
hmac_gosthash94_digest(struct hmac_gosthash94_ctx *ctx,
uint8_t *digest)
{
- HMAC_DIGEST(ctx, &nettle_gosthash94, digest);
+ /* Using _NETTLE_HMAC_DIGEST doesn't work 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));
}
void
hmac_gosthash94cp_set_key(struct hmac_gosthash94cp_ctx *ctx,
size_t key_length, const uint8_t *key)
{
- HMAC_SET_KEY(ctx, &nettle_gosthash94cp, key_length, key);
+ _nettle_hmac_set_key (sizeof(ctx->outer), ctx->outer, ctx->inner, &ctx->state,
+ ctx->state.block, &nettle_gosthash94cp, key_length, key);
}
void
{
gosthash94cp_update(&ctx->state, length, data);
}
+
void
hmac_gosthash94cp_digest(struct hmac_gosthash94cp_ctx *ctx,
uint8_t *digest)
{
- HMAC_DIGEST(ctx, &nettle_gosthash94cp, digest);
+ /* Using _NETTLE_HMAC_DIGEST doesn't work 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));
}
const struct nettle_hash *hash,
size_t key_size, const uint8_t *key);
-#define _NETTLE_HMAC_DIGEST(outer, inner, ctx, f, digest) do { \
+#define _NETTLE_HMAC_DIGEST(outer, inner, ctx, f, digest) do { \
memcpy ((ctx), (outer), sizeof (outer)); \
f ((ctx), (digest)); \
memcpy ((ctx), (inner), sizeof ((inner))); \