view src/lib/hmac.h @ 21266:b861c0860dd2

lib: Add hmac helpers These run hmac for given data with given parameters and returns stack allocated buffer. They are helpful when doing lots of HMACs, such as the AWS4 signing protocol.
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Tue, 29 Nov 2016 23:18:56 +0200
parents 92a54bb2ee00
children
line wrap: on
line source

#ifndef HMAC_H
#define HMAC_H

#include "hash-method.h"
#include "sha1.h"

#define HMAC_MAX_CONTEXT_SIZE 256

struct hmac_context_priv {
	char ctx[HMAC_MAX_CONTEXT_SIZE];
	char ctxo[HMAC_MAX_CONTEXT_SIZE];
	const struct hash_method *hash;
};

struct hmac_context {
	union {
		struct hmac_context_priv priv;
		uint64_t padding_requirement;
	} u;
};

void hmac_init(struct hmac_context *ctx, const unsigned char *key,
		size_t key_len, const struct hash_method *meth);
void hmac_final(struct hmac_context *ctx, unsigned char *digest);


static inline void
hmac_update(struct hmac_context *_ctx, const void *data, size_t size)
{
	struct hmac_context_priv *ctx = &_ctx->u.priv;

	ctx->hash->loop(ctx->ctx, data, size);
}

buffer_t *t_hmac_data(const struct hash_method *meth,
		      const unsigned char *key, size_t key_len,
		      const void *data, size_t data_len);
buffer_t *t_hmac_buffer(const struct hash_method *meth,
			const unsigned char *key, size_t key_len,
			const buffer_t *data);
buffer_t *t_hmac_str(const struct hash_method *meth,
		     const unsigned char *key, size_t key_len,
		     const char *data);

#endif