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