1 #include "includes.h"
2 #include "dbutil.h"
3 #include "crypto_desc.h"
4 #include "ltc_prng.h"
5 #include "ecc.h"
6 #include "dbrandom.h"
7 
8 #if DROPBEAR_LTC_PRNG
9 	int dropbear_ltc_prng = -1;
10 #endif
11 
12 /* Wrapper for libtommath */
dropbear_rand_source(void * out,size_t size)13 static mp_err dropbear_rand_source(void* out, size_t size) {
14 	genrandom((unsigned char*)out, (unsigned int)size);
15 	return MP_OKAY;
16 }
17 
18 
19 /* Register the compiled in ciphers.
20  * This should be run before using any of the ciphers/hashes */
crypto_init()21 void crypto_init() {
22 
23 	const struct ltc_cipher_descriptor *regciphers[] = {
24 #if DROPBEAR_AES
25 		&aes_desc,
26 #endif
27 #if DROPBEAR_BLOWFISH
28 		&blowfish_desc,
29 #endif
30 #if DROPBEAR_TWOFISH
31 		&twofish_desc,
32 #endif
33 #if DROPBEAR_3DES
34 		&des3_desc,
35 #endif
36 		NULL
37 	};
38 
39 	const struct ltc_hash_descriptor *reghashes[] = {
40 		/* we need sha1 for hostkey stuff regardless */
41 		&sha1_desc,
42 #if DROPBEAR_MD5_HMAC
43 		&md5_desc,
44 #endif
45 #if DROPBEAR_SHA256
46 		&sha256_desc,
47 #endif
48 #if DROPBEAR_SHA384
49 		&sha384_desc,
50 #endif
51 #if DROPBEAR_SHA512
52 		&sha512_desc,
53 #endif
54 		NULL
55 	};
56 	int i;
57 
58 	for (i = 0; regciphers[i] != NULL; i++) {
59 		if (register_cipher(regciphers[i]) == -1) {
60 			dropbear_exit("Error registering crypto");
61 		}
62 	}
63 
64 	for (i = 0; reghashes[i] != NULL; i++) {
65 		if (register_hash(reghashes[i]) == -1) {
66 			dropbear_exit("Error registering crypto");
67 		}
68 	}
69 
70 #if DROPBEAR_LTC_PRNG
71 	dropbear_ltc_prng = register_prng(&dropbear_prng_desc);
72 	if (dropbear_ltc_prng == -1) {
73 		dropbear_exit("Error registering crypto");
74 	}
75 #endif
76 
77 	mp_rand_source(dropbear_rand_source);
78 
79 #if DROPBEAR_ECC
80 	ltc_mp = ltm_desc;
81 	dropbear_ecc_fill_dp();
82 #endif
83 }
84 
85