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 * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
10 */
11#include "tomcrypt.h"
12
13/**
14  @file hash_memory.c
15  Hash memory helper, Tom St Denis
16*/
17
18/**
19  Hash a block of memory and store the digest.
20  @param hash   The index of the hash you wish to use
21  @param in     The data you wish to hash
22  @param inlen  The length of the data to hash (octets)
23  @param out    [out] Where to store the digest
24  @param outlen [in/out] Max size and resulting size of the digest
25  @return CRYPT_OK if successful
26*/
27int hash_memory(int hash, const unsigned char *in, unsigned long inlen, unsigned char *out, unsigned long *outlen)
28{
29    hash_state *md;
30    int err;
31
32    LTC_ARGCHK(in     != NULL);
33    LTC_ARGCHK(out    != NULL);
34    LTC_ARGCHK(outlen != NULL);
35
36    if ((err = hash_is_valid(hash)) != CRYPT_OK) {
37        return err;
38    }
39
40    if (*outlen < hash_descriptor[hash].hashsize) {
41       *outlen = hash_descriptor[hash].hashsize;
42       return CRYPT_BUFFER_OVERFLOW;
43    }
44
45    md = XMALLOC(sizeof(hash_state));
46    if (md == NULL) {
47       return CRYPT_MEM;
48    }
49
50    if ((err = hash_descriptor[hash].init(md)) != CRYPT_OK) {
51       goto LBL_ERR;
52    }
53    if ((err = hash_descriptor[hash].process(md, in, inlen)) != CRYPT_OK) {
54       goto LBL_ERR;
55    }
56    err = hash_descriptor[hash].done(md, out);
57    *outlen = hash_descriptor[hash].hashsize;
58LBL_ERR:
59#ifdef LTC_CLEAN_STACK
60    zeromem(md, sizeof(hash_state));
61#endif
62    XFREE(md);
63
64    return err;
65}
66
67/* $Source: /cvs/libtom/libtomcrypt/src/hashes/helper/hash_memory.c,v $ */
68/* $Revision: 1.5 $ */
69/* $Date: 2006/06/16 21:53:41 $ */
70