/* LibTomCrypt, modular cryptographic library -- Tom St Denis * * LibTomCrypt is a library that provides various cryptographic * algorithms in a highly modular and flexible manner. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ #include "tomcrypt.h" /** @file hmac_done.c LTC_HMAC support, terminate stream, Tom St Denis/Dobes Vandermeer */ #ifdef LTC_HMAC #define LTC_HMAC_BLOCKSIZE hash->blocksize /** Terminate an LTC_HMAC session @param hmac The LTC_HMAC state @param out [out] The destination of the LTC_HMAC authentication tag @param outlen [in/out] The max size and resulting size of the LTC_HMAC authentication tag @return CRYPT_OK if successful */ int hmac_done(hmac_state *hmac,const struct ltc_hash_descriptor *hash,unsigned char *out,unsigned long *outlen) { unsigned char *buf, *isha; unsigned long hashsize, i; int err; LTC_ARGCHK(hmac != NULL); LTC_ARGCHK(out != NULL); /* get the hash message digest size */ hashsize = hash->hashsize; /* allocate buffers */ buf = XMALLOC(LTC_HMAC_BLOCKSIZE); isha = XMALLOC(hashsize); if (buf == NULL || isha == NULL) { if (buf != NULL) { XFREE(buf); } if (isha != NULL) { XFREE(isha); } return CRYPT_MEM; } /* Get the hash of the first LTC_HMAC vector plus the data */ if ((err = hash->done(&hmac->md, isha)) != CRYPT_OK) { goto LBL_ERR; } /* Create the second LTC_HMAC vector vector for step (3) */ for(i=0; i < LTC_HMAC_BLOCKSIZE; i++) { buf[i] = hmac->key[i] ^ 0x5C; } /* Now calculate the "outer" hash for step (5), (6), and (7) */ if ((err = hash->init(&hmac->md)) != CRYPT_OK) { goto LBL_ERR; } if ((err = hash->process(&hmac->md, buf, LTC_HMAC_BLOCKSIZE)) != CRYPT_OK) { goto LBL_ERR; } if ((err = hash->process(&hmac->md, isha, hashsize)) != CRYPT_OK) { goto LBL_ERR; } if ((err = hash->done(&hmac->md, buf)) != CRYPT_OK) { goto LBL_ERR; } /* copy to output */ for (i = 0; i < hashsize && i < *outlen; i++) { out[i] = buf[i]; } *outlen = i; err = CRYPT_OK; LBL_ERR: XFREE(hmac->key); #ifdef LTC_CLEAN_STACK zeromem(isha, hashsize); zeromem(buf, hashsize); zeromem(hmac, sizeof(*hmac)); #endif XFREE(isha); XFREE(buf); return err; } #endif /* $Source: /cvs/libtom/libtomcrypt/src/mac/hmac/hmac_done.c,v $ */ /* $Revision: 1.7 $ */ /* $Date: 2007/05/12 14:37:41 $ */