1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2 /* SPDX-License-Identifier: Unlicense */
4 /* ---- PRNG Stuff ---- */
8 unsigned char pool
[MAXBLOCKSIZE
];
19 #ifdef LTC_CHACHA20_PRNG
20 struct chacha20_prng
{
21 chacha_state s
; /* chacha state */
22 unsigned char ent
[40]; /* entropy buffer */
23 unsigned long idx
; /* entropy counter */
29 hash_state pool
[LTC_FORTUNA_POOLS
]; /* the pools */
33 unsigned char K
[32], /* the current key */
34 IV
[16]; /* IV for CTR mode */
36 unsigned long pool_idx
, /* current pool we will add to */
37 pool0_len
; /* length of 0'th pool */
39 ulong64 reset_cnt
; /* number of times we have reseeded */
44 struct sober128_prng
{
45 sober128_state s
; /* sober128 state */
46 unsigned char ent
[40]; /* entropy buffer */
47 unsigned long idx
; /* entropy counter */
55 struct yarrow_prng yarrow
;
60 #ifdef LTC_CHACHA20_PRNG
61 struct chacha20_prng chacha
;
64 struct fortuna_prng fortuna
;
67 struct sober128_prng sober128
;
70 short ready
; /* ready flag 0-1 */
71 LTC_MUTEX_TYPE(lock
) /* lock */
74 /** PRNG descriptor */
75 extern struct ltc_prng_descriptor
{
76 /** Name of the PRNG */
78 /** size in bytes of exported state */
80 /** Start a PRNG state
81 @param prng [out] The state to initialize
82 @return CRYPT_OK if successful
84 int (*start
)(prng_state
*prng
);
85 /** Add entropy to the PRNG
87 @param inlen Length of the entropy (octets)\
88 @param prng The PRNG state
89 @return CRYPT_OK if successful
91 int (*add_entropy
)(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
92 /** Ready a PRNG state to read from
93 @param prng The PRNG state to ready
94 @return CRYPT_OK if successful
96 int (*ready
)(prng_state
*prng
);
97 /** Read from the PRNG
98 @param out [out] Where to store the data
99 @param outlen Length of data desired (octets)
100 @param prng The PRNG state to read from
101 @return Number of octets read
103 unsigned long (*read
)(unsigned char *out
, unsigned long outlen
, prng_state
*prng
);
104 /** Terminate a PRNG state
105 @param prng The PRNG state to terminate
106 @return CRYPT_OK if successful
108 int (*done
)(prng_state
*prng
);
109 /** Export a PRNG state
110 @param out [out] The destination for the state
111 @param outlen [in/out] The max size and resulting size of the PRNG state
112 @param prng The PRNG to export
113 @return CRYPT_OK if successful
115 int (*pexport
)(unsigned char *out
, unsigned long *outlen
, prng_state
*prng
);
116 /** Import a PRNG state
117 @param in The data to import
118 @param inlen The length of the data to import (octets)
119 @param prng The PRNG to initialize/import
120 @return CRYPT_OK if successful
122 int (*pimport
)(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
123 /** Self-test the PRNG
124 @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled
130 int yarrow_start(prng_state
*prng
);
131 int yarrow_add_entropy(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
132 int yarrow_ready(prng_state
*prng
);
133 unsigned long yarrow_read(unsigned char *out
, unsigned long outlen
, prng_state
*prng
);
134 int yarrow_done(prng_state
*prng
);
135 int yarrow_export(unsigned char *out
, unsigned long *outlen
, prng_state
*prng
);
136 int yarrow_import(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
137 int yarrow_test(void);
138 extern const struct ltc_prng_descriptor yarrow_desc
;
142 int fortuna_start(prng_state
*prng
);
143 int fortuna_add_entropy(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
144 int fortuna_add_random_event(unsigned long source
, unsigned long pool
, const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
145 int fortuna_ready(prng_state
*prng
);
146 unsigned long fortuna_read(unsigned char *out
, unsigned long outlen
, prng_state
*prng
);
147 int fortuna_done(prng_state
*prng
);
148 int fortuna_export(unsigned char *out
, unsigned long *outlen
, prng_state
*prng
);
149 int fortuna_import(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
150 int fortuna_update_seed(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
151 int fortuna_test(void);
152 extern const struct ltc_prng_descriptor fortuna_desc
;
156 int rc4_start(prng_state
*prng
);
157 int rc4_add_entropy(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
158 int rc4_ready(prng_state
*prng
);
159 unsigned long rc4_read(unsigned char *out
, unsigned long outlen
, prng_state
*prng
);
160 int rc4_done(prng_state
*prng
);
161 int rc4_export(unsigned char *out
, unsigned long *outlen
, prng_state
*prng
);
162 int rc4_import(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
164 extern const struct ltc_prng_descriptor rc4_desc
;
167 #ifdef LTC_CHACHA20_PRNG
168 int chacha20_prng_start(prng_state
*prng
);
169 int chacha20_prng_add_entropy(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
170 int chacha20_prng_ready(prng_state
*prng
);
171 unsigned long chacha20_prng_read(unsigned char *out
, unsigned long outlen
, prng_state
*prng
);
172 int chacha20_prng_done(prng_state
*prng
);
173 int chacha20_prng_export(unsigned char *out
, unsigned long *outlen
, prng_state
*prng
);
174 int chacha20_prng_import(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
175 int chacha20_prng_test(void);
176 extern const struct ltc_prng_descriptor chacha20_prng_desc
;
180 int sprng_start(prng_state
*prng
);
181 int sprng_add_entropy(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
182 int sprng_ready(prng_state
*prng
);
183 unsigned long sprng_read(unsigned char *out
, unsigned long outlen
, prng_state
*prng
);
184 int sprng_done(prng_state
*prng
);
185 int sprng_export(unsigned char *out
, unsigned long *outlen
, prng_state
*prng
);
186 int sprng_import(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
187 int sprng_test(void);
188 extern const struct ltc_prng_descriptor sprng_desc
;
192 int sober128_start(prng_state
*prng
);
193 int sober128_add_entropy(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
194 int sober128_ready(prng_state
*prng
);
195 unsigned long sober128_read(unsigned char *out
, unsigned long outlen
, prng_state
*prng
);
196 int sober128_done(prng_state
*prng
);
197 int sober128_export(unsigned char *out
, unsigned long *outlen
, prng_state
*prng
);
198 int sober128_import(const unsigned char *in
, unsigned long inlen
, prng_state
*prng
);
199 int sober128_test(void);
200 extern const struct ltc_prng_descriptor sober128_desc
;
203 int find_prng(const char *name
);
204 int register_prng(const struct ltc_prng_descriptor
*prng
);
205 int unregister_prng(const struct ltc_prng_descriptor
*prng
);
206 int register_all_prngs(void);
207 int prng_is_valid(int idx
);
208 LTC_MUTEX_PROTO(ltc_prng_mutex
)
210 /* Slow RNG you **might** be able to use to seed a PRNG with. Be careful as this
211 * might not work on all platforms as planned
213 unsigned long rng_get_bytes(unsigned char *out
,
214 unsigned long outlen
,
215 void (*callback
)(void));
217 int rng_make_prng(int bits
, int wprng
, prng_state
*prng
, void (*callback
)(void));
219 #ifdef LTC_PRNG_ENABLE_LTC_RNG
220 extern unsigned long (*ltc_rng
)(unsigned char *out
, unsigned long outlen
,
221 void (*callback
)(void));