]> pd.if.org Git - zpackage/blob - libtomcrypt/src/mac/hmac/hmac_file.c
commit files needed for zpm-fetchurl
[zpackage] / libtomcrypt / src / mac / hmac / hmac_file.c
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
2  *
3  * LibTomCrypt is a library that provides various cryptographic
4  * algorithms in a highly modular and flexible manner.
5  *
6  * The library is free for all purposes without any express
7  * guarantee it works.
8  */
9 #include "tomcrypt.h"
10
11 /**
12   @file hmac_file.c
13   HMAC support, process a file, Tom St Denis/Dobes Vandermeer
14 */
15
16 #ifdef LTC_HMAC
17
18 /**
19   HMAC a file
20   @param hash     The index of the hash you wish to use
21   @param fname    The name of the file you wish to HMAC
22   @param key      The secret key
23   @param keylen   The length of the secret key
24   @param out      [out] The HMAC authentication tag
25   @param outlen   [in/out]  The max size and resulting size of the authentication tag
26   @return CRYPT_OK if successful, CRYPT_NOP if file support has been disabled
27 */
28 int hmac_file(int hash, const char *fname,
29               const unsigned char *key, unsigned long keylen,
30                     unsigned char *out, unsigned long *outlen)
31 {
32 #ifdef LTC_NO_FILE
33    LTC_UNUSED_PARAM(hash);
34    LTC_UNUSED_PARAM(fname);
35    LTC_UNUSED_PARAM(key);
36    LTC_UNUSED_PARAM(keylen);
37    LTC_UNUSED_PARAM(out);
38    LTC_UNUSED_PARAM(outlen);
39     return CRYPT_NOP;
40 #else
41    hmac_state hmac;
42    FILE *in;
43    unsigned char *buf;
44    size_t x;
45    int err;
46
47    LTC_ARGCHK(fname  != NULL);
48    LTC_ARGCHK(key    != NULL);
49    LTC_ARGCHK(out    != NULL);
50    LTC_ARGCHK(outlen != NULL);
51
52    if ((buf = XMALLOC(LTC_FILE_READ_BUFSIZE)) == NULL) {
53       return CRYPT_MEM;
54    }
55
56    if ((err = hash_is_valid(hash)) != CRYPT_OK) {
57       goto LBL_ERR;
58    }
59
60    if ((err = hmac_init(&hmac, hash, key, keylen)) != CRYPT_OK) {
61       goto LBL_ERR;
62    }
63
64    in = fopen(fname, "rb");
65    if (in == NULL) {
66       err = CRYPT_FILE_NOTFOUND;
67       goto LBL_ERR;
68    }
69
70    do {
71       x = fread(buf, 1, LTC_FILE_READ_BUFSIZE, in);
72       if ((err = hmac_process(&hmac, buf, (unsigned long)x)) != CRYPT_OK) {
73          fclose(in); /* we don't trap this error since we're already returning an error! */
74          goto LBL_CLEANBUF;
75       }
76    } while (x == LTC_FILE_READ_BUFSIZE);
77
78    if (fclose(in) != 0) {
79       err = CRYPT_ERROR;
80       goto LBL_CLEANBUF;
81    }
82
83    err = hmac_done(&hmac, out, outlen);
84
85 LBL_CLEANBUF:
86    zeromem(buf, LTC_FILE_READ_BUFSIZE);
87 LBL_ERR:
88 #ifdef LTC_CLEAN_STACK
89    zeromem(&hmac, sizeof(hmac_state));
90 #endif
91    XFREE(buf);
92    return err;
93 #endif
94 }
95
96 #endif
97
98 /* ref:         $Format:%D$ */
99 /* git commit:  $Format:%H$ */
100 /* commit time: $Format:%ai$ */