1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2 /* SPDX-License-Identifier: Unlicense */
3 #include "tomcrypt_private.h"
4 
5 /**
6   @file crypt_register_hash.c
7   Register a HASH, Tom St Denis
8 */
9 
10 /**
11    Register a hash with the descriptor table
12    @param hash   The hash you wish to register
13    @return value >= 0 if successfully added (or already present), -1 if unsuccessful
14 */
register_hash(const struct ltc_hash_descriptor * hash)15 int register_hash(const struct ltc_hash_descriptor *hash)
16 {
17    int x;
18 
19    LTC_ARGCHK(hash != NULL);
20 
21    /* is it already registered? */
22    LTC_MUTEX_LOCK(&ltc_hash_mutex);
23    for (x = 0; x < TAB_SIZE; x++) {
24        if (XMEMCMP(&hash_descriptor[x], hash, sizeof(struct ltc_hash_descriptor)) == 0) {
25           LTC_MUTEX_UNLOCK(&ltc_hash_mutex);
26           return x;
27        }
28    }
29 
30    /* find a blank spot */
31    for (x = 0; x < TAB_SIZE; x++) {
32        if (hash_descriptor[x].name == NULL) {
33           XMEMCPY(&hash_descriptor[x], hash, sizeof(struct ltc_hash_descriptor));
34           LTC_MUTEX_UNLOCK(&ltc_hash_mutex);
35           return x;
36        }
37    }
38 
39    /* no spot */
40    LTC_MUTEX_UNLOCK(&ltc_hash_mutex);
41    return -1;
42 }
43