1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
3 * LibTomCrypt is a library that provides various cryptographic
4 * algorithms in a highly modular and flexible manner.
6 * The library is free for all purposes without any express
10 /* ---- PRNG Stuff ---- */
14 unsigned char pool[MAXBLOCKSIZE];
25 #ifdef LTC_CHACHA20_PRNG
26 struct chacha20_prng {
27 chacha_state s; /* chacha state */
28 unsigned char ent[40]; /* entropy buffer */
29 unsigned long idx; /* entropy counter */
35 hash_state pool[LTC_FORTUNA_POOLS]; /* the pools */
39 unsigned char K[32], /* the current key */
40 IV[16]; /* IV for CTR mode */
42 unsigned long pool_idx, /* current pool we will add to */
43 pool0_len, /* length of 0'th pool */
46 ulong64 reset_cnt; /* number of times we have reset */
51 struct sober128_prng {
52 sober128_state s; /* sober128 state */
53 unsigned char ent[40]; /* entropy buffer */
54 unsigned long idx; /* entropy counter */
62 struct yarrow_prng yarrow;
67 #ifdef LTC_CHACHA20_PRNG
68 struct chacha20_prng chacha;
71 struct fortuna_prng fortuna;
74 struct sober128_prng sober128;
77 short ready; /* ready flag 0-1 */
78 LTC_MUTEX_TYPE(lock) /* lock */
81 /** PRNG descriptor */
82 extern struct ltc_prng_descriptor {
83 /** Name of the PRNG */
85 /** size in bytes of exported state */
87 /** Start a PRNG state
88 @param prng [out] The state to initialize
89 @return CRYPT_OK if successful
91 int (*start)(prng_state *prng);
92 /** Add entropy to the PRNG
94 @param inlen Length of the entropy (octets)\
95 @param prng The PRNG state
96 @return CRYPT_OK if successful
98 int (*add_entropy)(const unsigned char *in, unsigned long inlen, prng_state *prng);
99 /** Ready a PRNG state to read from
100 @param prng The PRNG state to ready
101 @return CRYPT_OK if successful
103 int (*ready)(prng_state *prng);
104 /** Read from the PRNG
105 @param out [out] Where to store the data
106 @param outlen Length of data desired (octets)
107 @param prng The PRNG state to read from
108 @return Number of octets read
110 unsigned long (*read)(unsigned char *out, unsigned long outlen, prng_state *prng);
111 /** Terminate a PRNG state
112 @param prng The PRNG state to terminate
113 @return CRYPT_OK if successful
115 int (*done)(prng_state *prng);
116 /** Export a PRNG state
117 @param out [out] The destination for the state
118 @param outlen [in/out] The max size and resulting size of the PRNG state
119 @param prng The PRNG to export
120 @return CRYPT_OK if successful
122 int (*pexport)(unsigned char *out, unsigned long *outlen, prng_state *prng);
123 /** Import a PRNG state
124 @param in The data to import
125 @param inlen The length of the data to import (octets)
126 @param prng The PRNG to initialize/import
127 @return CRYPT_OK if successful
129 int (*pimport)(const unsigned char *in, unsigned long inlen, prng_state *prng);
130 /** Self-test the PRNG
131 @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled
137 int yarrow_start(prng_state *prng);
138 int yarrow_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
139 int yarrow_ready(prng_state *prng);
140 unsigned long yarrow_read(unsigned char *out, unsigned long outlen, prng_state *prng);
141 int yarrow_done(prng_state *prng);
142 int yarrow_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
143 int yarrow_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
144 int yarrow_test(void);
145 extern const struct ltc_prng_descriptor yarrow_desc;
149 int fortuna_start(prng_state *prng);
150 int fortuna_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
151 int fortuna_ready(prng_state *prng);
152 unsigned long fortuna_read(unsigned char *out, unsigned long outlen, prng_state *prng);
153 int fortuna_done(prng_state *prng);
154 int fortuna_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
155 int fortuna_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
156 int fortuna_test(void);
157 extern const struct ltc_prng_descriptor fortuna_desc;
161 int rc4_start(prng_state *prng);
162 int rc4_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
163 int rc4_ready(prng_state *prng);
164 unsigned long rc4_read(unsigned char *out, unsigned long outlen, prng_state *prng);
165 int rc4_done(prng_state *prng);
166 int rc4_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
167 int rc4_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
169 extern const struct ltc_prng_descriptor rc4_desc;
172 #ifdef LTC_CHACHA20_PRNG
173 int chacha20_prng_start(prng_state *prng);
174 int chacha20_prng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
175 int chacha20_prng_ready(prng_state *prng);
176 unsigned long chacha20_prng_read(unsigned char *out, unsigned long outlen, prng_state *prng);
177 int chacha20_prng_done(prng_state *prng);
178 int chacha20_prng_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
179 int chacha20_prng_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
180 int chacha20_prng_test(void);
181 extern const struct ltc_prng_descriptor chacha20_prng_desc;
185 int sprng_start(prng_state *prng);
186 int sprng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
187 int sprng_ready(prng_state *prng);
188 unsigned long sprng_read(unsigned char *out, unsigned long outlen, prng_state *prng);
189 int sprng_done(prng_state *prng);
190 int sprng_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
191 int sprng_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
192 int sprng_test(void);
193 extern const struct ltc_prng_descriptor sprng_desc;
197 int sober128_start(prng_state *prng);
198 int sober128_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
199 int sober128_ready(prng_state *prng);
200 unsigned long sober128_read(unsigned char *out, unsigned long outlen, prng_state *prng);
201 int sober128_done(prng_state *prng);
202 int sober128_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
203 int sober128_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
204 int sober128_test(void);
205 extern const struct ltc_prng_descriptor sober128_desc;
208 int find_prng(const char *name);
209 int register_prng(const struct ltc_prng_descriptor *prng);
210 int unregister_prng(const struct ltc_prng_descriptor *prng);
211 int register_all_prngs(void);
212 int prng_is_valid(int idx);
213 LTC_MUTEX_PROTO(ltc_prng_mutex)
215 /* Slow RNG you **might** be able to use to seed a PRNG with. Be careful as this
216 * might not work on all platforms as planned
218 unsigned long rng_get_bytes(unsigned char *out,
219 unsigned long outlen,
220 void (*callback)(void));
222 int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void));
224 #ifdef LTC_PRNG_ENABLE_LTC_RNG
225 extern unsigned long (*ltc_rng)(unsigned char *out, unsigned long outlen,
226 void (*callback)(void));
230 /* ref: $Format:%D$ */
231 /* git commit: $Format:%H$ */
232 /* commit time: $Format:%ai$ */