summaryrefslogtreecommitdiff
path: root/hmac.c
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2002-01-14 15:39:04 +0100
committerNiels Möller <nisse@lysator.liu.se>2002-01-14 15:39:04 +0100
commit7964f11d9f9bd51a0f3bd0d7dfb1a66f112d61fb (patch)
tree5c8e48bf4d29ab445d81cb182d97609e491a3395 /hmac.c
parent2d0830f893bffcb981b54f2819b8a4829b682b2d (diff)
downloadnettle-7964f11d9f9bd51a0f3bd0d7dfb1a66f112d61fb.tar.gz
* hmac.c: Bug fixes.
* Makefile.am (libnettle_a_SOURCES): Added hmac.c and hmac-md5.c. (libnettleinclude_HEADERS): Added hmac.h. Rev: src/nettle/hmac.c:1.2
Diffstat (limited to 'hmac.c')
-rw-r--r--hmac.c61
1 files changed, 35 insertions, 26 deletions
diff --git a/hmac.c b/hmac.c
index 4ea273cd..2e0e84f6 100644
--- a/hmac.c
+++ b/hmac.c
@@ -28,63 +28,72 @@
#include "memxor.h"
#include <assert.h>
+#include <string.h>
#define IPAD 0x36
#define OPAD 0x5c
void
-hmac_init(void *outer, void *inner, void *state,
- struct hmac_info *info,
- unsigned key_length, const uint8_t *key)
+hmac_set_key(void *outer, void *inner, void *state,
+ const struct nettle_hash *hash,
+ unsigned key_length, const uint8_t *key)
{
- uint8_t pad = alloca(info->block_size);
+ uint8_t *pad = alloca(hash->block_size);
- info->init(outer);
- info->init(inner);
+ hash->init(outer);
+ hash->init(inner);
- if (length > info->block_size)
+ if (key_length > hash->block_size)
{
/* Reduce key to the algorithm's hash size. Use the area pointed
* to by state for the temporary state. */
- uint8_t *digest = alloca(info->digest_size);
+ uint8_t *digest = alloca(hash->digest_size);
- info->init(state);
- info->update(state, key_length, key);
- info->digest(state, info->digest_size, digest);
+ hash->init(state);
+ hash->update(state, key_length, key);
+ hash->digest(state, hash->digest_size, digest);
key = digest;
- key_length = info->digest_size;
+ key_length = hash->digest_size;
}
- assert(key_size <= info->block_size);
+ assert(key_length <= hash->block_size);
- memset(pad, OPAD, info->block_size);
+ memset(pad, OPAD, hash->block_size);
memxor(pad, key, key_length);
- info->update(outer, info->block_size, pad);
+ hash->update(outer, hash->block_size, pad);
- memset(pad, IPAD, info->block_size);
+ memset(pad, IPAD, hash->block_size);
memxor(pad, key, key_length);
- info->update(inner, info->block_size, pad);
+ hash->update(inner, hash->block_size, pad);
- memcpy(state, inner, info->ctx_size);
+ memcpy(state, inner, hash->context_size);
}
void
-hmac_digest(void *outer, void *inner, void *state
- struct hmac_info *info,
+hmac_update(void *state,
+ const struct nettle_hash *hash,
+ unsigned length, const uint8_t *data)
+{
+ hash->update(state, length, data);
+}
+
+void
+hmac_digest(const void *outer, const void *inner, void *state,
+ const struct nettle_hash *hash,
unsigned length, uint8_t *dst)
{
- uint8_t *digest = alloca(info->digest_size);
+ uint8_t *digest = alloca(hash->digest_size);
- info->digest(state, info->digest_size, digest);
+ hash->digest(state, hash->digest_size, digest);
- memcpy(outer, state, info->ctx_size);
+ memcpy(state, outer, hash->context_size);
- info->update(state, info->digest_size, digest);
- info->digest(state, length, dst);
+ hash->update(state, hash->digest_size, digest);
+ hash->digest(state, length, dst);
- memcpy(state, inner, info->ctx_size);
+ memcpy(state, inner, hash->context_size);
}