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 (at) 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 */ 27 int 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; 58 LBL_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