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 #include <stdarg.h> 13 /** 14 @file hash_memory_multi.c 15 Hash (multiple buffers) memory helper, Tom St Denis 16 */ 17 18 /** 19 Hash multiple (non-adjacent) blocks of memory at once. 20 @param hash The index of the hash you wish to use 21 @param out [out] Where to store the digest 22 @param outlen [in/out] Max size and resulting size of the digest 23 @param in The data you wish to hash 24 @param inlen The length of the data to hash (octets) 25 @param ... tuples of (data,len) pairs to hash, terminated with a (NULL,x) (x=don't care) 26 @return CRYPT_OK if successful 27 */ 28 int hash_memory_multi(int hash, unsigned char *out, unsigned long *outlen, 29 const unsigned char *in, unsigned long inlen, ...) 30 { 31 hash_state *md; 32 int err; 33 va_list args; 34 const unsigned char *curptr; 35 unsigned long curlen; 36 37 LTC_ARGCHK(in != NULL); 38 LTC_ARGCHK(out != NULL); 39 LTC_ARGCHK(outlen != NULL); 40 41 if ((err = hash_is_valid(hash)) != CRYPT_OK) { 42 return err; 43 } 44 45 if (*outlen < hash_descriptor[hash].hashsize) { 46 *outlen = hash_descriptor[hash].hashsize; 47 return CRYPT_BUFFER_OVERFLOW; 48 } 49 50 md = XMALLOC(sizeof(hash_state)); 51 if (md == NULL) { 52 return CRYPT_MEM; 53 } 54 55 if ((err = hash_descriptor[hash].init(md)) != CRYPT_OK) { 56 goto LBL_ERR; 57 } 58 59 va_start(args, inlen); 60 curptr = in; 61 curlen = inlen; 62 for (;;) { 63 /* process buf */ 64 if ((err = hash_descriptor[hash].process(md, curptr, curlen)) != CRYPT_OK) { 65 goto LBL_ERR; 66 } 67 /* step to next */ 68 curptr = va_arg(args, const unsigned char*); 69 if (curptr == NULL) { 70 break; 71 } 72 curlen = va_arg(args, unsigned long); 73 } 74 err = hash_descriptor[hash].done(md, out); 75 *outlen = hash_descriptor[hash].hashsize; 76 LBL_ERR: 77 #ifdef LTC_CLEAN_STACK 78 zeromem(md, sizeof(hash_state)); 79 #endif 80 XFREE(md); 81 va_end(args); 82 return err; 83 } 84 85 /* $Source: /cvs/libtom/libtomcrypt/src/hashes/helper/hash_memory_multi.c,v $ */ 86 /* $Revision: 1.5 $ */ 87 /* $Date: 2006/06/16 21:53:41 $ */ 88