1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* LibTomCrypt, modular cryptographic library -- Tom St Denis 2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LibTomCrypt is a library that provides various cryptographic 4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * algorithms in a highly modular and flexible manner. 5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library is free for all purposes without any express 7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * guarantee it works. 8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com 10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "tomcrypt.h" 12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** 14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @file hmac_done.c 15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project HMAC support, terminate stream, Tom St Denis/Dobes Vandermeer 16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_HMAC 19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define HMAC_BLOCKSIZE hash_descriptor[hash].blocksize 21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** 23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project Terminate an HMAC session 24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param hmac The HMAC state 25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param out [out] The destination of the HMAC authentication tag 26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param outlen [in/out] The max size and resulting size of the HMAC authentication tag 27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @return CRYPT_OK if successful 28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint hmac_done(hmac_state *hmac, unsigned char *out, unsigned long *outlen) 30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char *buf, *isha; 32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned long hashsize, i; 33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int hash, err; 34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(hmac != NULL); 36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(out != NULL); 37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* test hash */ 39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project hash = hmac->hash; 40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if((err = hash_is_valid(hash)) != CRYPT_OK) { 41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* get the hash message digest size */ 45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project hashsize = hash_descriptor[hash].hashsize; 46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* allocate buffers */ 48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf = XMALLOC(HMAC_BLOCKSIZE); 49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project isha = XMALLOC(hashsize); 50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (buf == NULL || isha == NULL) { 51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (buf != NULL) { 52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project XFREE(buf); 53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (isha != NULL) { 55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project XFREE(isha); 56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_MEM; 58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* Get the hash of the first HMAC vector plus the data */ 61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = hash_descriptor[hash].done(&hmac->md, isha)) != CRYPT_OK) { 62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* Create the second HMAC vector vector for step (3) */ 66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for(i=0; i < HMAC_BLOCKSIZE; i++) { 67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf[i] = hmac->key[i] ^ 0x5C; 68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* Now calculate the "outer" hash for step (5), (6), and (7) */ 71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = hash_descriptor[hash].init(&hmac->md)) != CRYPT_OK) { 72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = hash_descriptor[hash].process(&hmac->md, buf, HMAC_BLOCKSIZE)) != CRYPT_OK) { 75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = hash_descriptor[hash].process(&hmac->md, isha, hashsize)) != CRYPT_OK) { 78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = hash_descriptor[hash].done(&hmac->md, buf)) != CRYPT_OK) { 81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* copy to output */ 85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (i = 0; i < hashsize && i < *outlen; i++) { 86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project out[i] = buf[i]; 87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *outlen = i; 89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = CRYPT_OK; 91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectLBL_ERR: 92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project XFREE(hmac->key); 93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK 94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zeromem(isha, hashsize); 95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zeromem(buf, hashsize); 96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zeromem(hmac, sizeof(*hmac)); 97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project XFREE(isha); 100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project XFREE(buf); 101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/mac/hmac/hmac_done.c,v $ */ 108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.5 $ */ 109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/11/03 00:39:49 $ */ 110