/* * cifra - embedded cryptography library * Written in 2014 by Joseph Birr-Pixton * * To the extent possible under law, the author(s) have dedicated all * copyright and related and neighboring rights to this software to the * public domain worldwide. This software is distributed without any * warranty. * * You should have received a copy of the CC0 Public Domain Dedication * along with this software. If not, see * . */ #ifndef HMAC_H #define HMAC_H #include #include #include "chash.h" /** * HMAC * ==== * This is a one-shot and incremental interface to computing * HMAC with any hash function. * * (Note: HMAC with SHA3 is possible, but is probably not a * sensible thing to want.) */ /* .. c:type:: cf_hmac_ctx * HMAC incremental interface context. * * .. c:member:: cf_hmac_ctx.hash * Hash function description. * * .. c:member:: cf_hmac_ctx.inner * Inner hash computation. * * .. c:member:: cf_hmac_ctx.outer * Outer hash computation. */ typedef struct { const cf_chash *hash; cf_chash_ctx inner; cf_chash_ctx outer; } cf_hmac_ctx; /* .. c:function:: $DECL * Set up ctx for computing a HMAC using the given hash and key. */ void cf_hmac_init(cf_hmac_ctx *ctx, const cf_chash *hash, const uint8_t *key, size_t nkey); /* .. c:function:: $DECL * Input data. */ void cf_hmac_update(cf_hmac_ctx *ctx, const void *data, size_t ndata); /* .. c:function:: $DECL * Finish and compute HMAC. * `ctx->hash->hashsz` bytes are written to `out`. */ void cf_hmac_finish(cf_hmac_ctx *ctx, uint8_t *out); /* .. c:function:: $DECL * One shot interface: compute `HMAC_hash(key, msg)`, writing the * answer (which is `hash->hashsz` long) to `out`. * * This function does not fail. */ void cf_hmac(const uint8_t *key, size_t nkey, const uint8_t *msg, size_t nmsg, uint8_t *out, const cf_chash *hash); #endif