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