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_file.c 15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project HMAC support, process a file, 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/** 21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project HMAC a file 22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param hash The index of the hash you wish to use 23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param fname The name of the file you wish to HMAC 24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param key The secret key 25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param keylen The length of the secret key 26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param out [out] The HMAC authentication tag 27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param outlen [in/out] The max size and resulting size of the authentication tag 28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @return CRYPT_OK if successful, CRYPT_NOP if file support has been disabled 29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint hmac_file(int hash, const char *fname, 31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project const unsigned char *key, unsigned long keylen, 32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char *out, unsigned long *outlen) 33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_NO_FILE 35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_NOP; 36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else 37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project hmac_state hmac; 38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project FILE *in; 39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char buf[512]; 40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project size_t x; 41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int err; 42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(fname != NULL); 44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(key != NULL); 45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(out != NULL); 46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(outlen != NULL); 47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if((err = hash_is_valid(hash)) != CRYPT_OK) { 49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = hmac_init(&hmac, hash, key, keylen)) != CRYPT_OK) { 53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project in = fopen(fname, "rb"); 57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (in == NULL) { 58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_FILE_NOTFOUND; 59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* process the file contents */ 62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project do { 63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project x = fread(buf, 1, sizeof(buf), in); 64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = hmac_process(&hmac, buf, (unsigned long)x)) != CRYPT_OK) { 65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* we don't trap this error since we're already returning an error! */ 66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fclose(in); 67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } while (x == sizeof(buf)); 70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fclose(in) != 0) { 72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_ERROR; 73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* get final hmac */ 76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = hmac_done(&hmac, out, outlen)) != CRYPT_OK) { 77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK 81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* clear memory */ 82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zeromem(buf, sizeof(buf)); 83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_OK; 85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/mac/hmac/hmac_file.c,v $ */ 92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.5 $ */ 93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/11/03 00:39:49 $ */ 94