Dmitry Eremin-Solenikov <[email protected]> writes:
> --- a/md5.c
> +++ b/md5.c
> @@ -56,19 +56,19 @@ md5_init(struct md5_ctx *ctx)
> 0x98badcfe,
> 0x10325476,
> };
> - memcpy(ctx->state, iv, sizeof(ctx->state));
> - ctx->count = 0;
> + memcpy(ctx->state.state, iv, sizeof(ctx->state.state));
> + ctx->state.count = 0;
> ctx->index = 0;
> }
Could have the same memcpy handle all of state.
> --- a/md5.h
> +++ b/md5.h
> @@ -53,10 +53,15 @@ extern "C" {
> /* Digest is kept internally as 4 32-bit words. */
> #define _MD5_DIGEST_LENGTH 4
>
> -struct md5_ctx
> +struct md5_state
> {
> uint32_t state[_MD5_DIGEST_LENGTH];
> uint64_t count; /* Block count */
> +};
> +
> +struct md5_ctx
> +{
> + struct md5_state state;
> uint8_t block[MD5_BLOCK_SIZE]; /* Block buffer */
> unsigned index; /* Into buffer */
> };
When reworking these structs, I think we should generally have index
before block, since index has a larger required alignment. Even if it
doesn't matter in this particular case, with MD5_BLOCK_SIZE == 64.
I wonder if we can find some better naming. "state.state" isn't so
pretty, and I think the conventional terminology would be to refer to
the 4 32-bit words as the md5 "state", not including the block count.
What we're trying to capture actually is somewhat hmac-specific.
It's the part that needs to be copied to the start at an md5_ctx to
reset it to some block boundary, and the reason we need a named type
(rather than offsetof(struct md5_ctx, block), is that code needs to
allocate it. Perhaps
struct md5_init_state
{
uint32_t state[_MD5_DIGEST_LENGTH];
uint64_t count; /* Block count */
unsigned index;
};
or struct md5_internal_ctx_no_buffer or so.
Then both plain md5 reset and md5-hmac could use a single memcpy. And we
could use some internal variant of md5_digest to avoid the redundant
memcpy done by md5_digest (in your patch set, the hmac code depends on
md5_digest resetting the index field, while it overwrites the rest of
the state).
I'm starting to think that it probably was a mistake to advertise and
document the internal hmac_set_key, hmac_update and hmac_digest methods.
Maybe we can deprecate them (without immediately breaking them); I find
no usage on codesearch.debian.net. We'de get more flexibility if we
could implement hmac_md5_* without going via struct nettle_hash
nettle_md5.
I think it would make sense to start with reordering fields in the
current context structs.
Regards,
/Niels
--
Niels Möller. PGP-encrypted email is preferred. Keyid 368C6677.
Internet email is subject to wholesale government surveillance.
_______________________________________________
nettle-bugs mailing list
[email protected]
http://lists.lysator.liu.se/mailman/listinfo/nettle-bugs