1 // SPDX-License-Identifier: BSD-2-Clause
2 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
3  *
4  * LibTomCrypt is a library that provides various cryptographic
5  * algorithms in a highly modular and flexible manner.
6  *
7  * The library is free for all purposes without any express
8  * guarantee it works.
9  */
10 #include "tomcrypt_private.h"
11 
12 #ifdef LTC_HASH_HELPERS
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 */
hash_memory(int hash,const unsigned char * in,unsigned long inlen,unsigned char * out,unsigned long * outlen)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 #endif /* #ifdef LTC_HASH_HELPERS */
67 
68 /* ref:         $Format:%D$ */
69 /* git commit:  $Format:%H$ */
70 /* commit time: $Format:%ai$ */
71