]> Dogcows Code - chaz/p5-File-KDBX-XS/blob - libtomcrypt/src/headers/tomcrypt_prng.h
initial commit
[chaz/p5-File-KDBX-XS] / libtomcrypt / src / headers / tomcrypt_prng.h
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2 /* SPDX-License-Identifier: Unlicense */
3
4 /* ---- PRNG Stuff ---- */
5 #ifdef LTC_YARROW
6 struct yarrow_prng {
7 int cipher, hash;
8 unsigned char pool[MAXBLOCKSIZE];
9 symmetric_CTR ctr;
10 };
11 #endif
12
13 #ifdef LTC_RC4
14 struct rc4_prng {
15 rc4_state s;
16 };
17 #endif
18
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 */
24 };
25 #endif
26
27 #ifdef LTC_FORTUNA
28 struct fortuna_prng {
29 hash_state pool[LTC_FORTUNA_POOLS]; /* the pools */
30
31 symmetric_key skey;
32
33 unsigned char K[32], /* the current key */
34 IV[16]; /* IV for CTR mode */
35
36 unsigned long pool_idx, /* current pool we will add to */
37 pool0_len; /* length of 0'th pool */
38 ulong64 wd;
39 ulong64 reset_cnt; /* number of times we have reseeded */
40 };
41 #endif
42
43 #ifdef LTC_SOBER128
44 struct sober128_prng {
45 sober128_state s; /* sober128 state */
46 unsigned char ent[40]; /* entropy buffer */
47 unsigned long idx; /* entropy counter */
48 };
49 #endif
50
51 typedef struct {
52 union {
53 char dummy[1];
54 #ifdef LTC_YARROW
55 struct yarrow_prng yarrow;
56 #endif
57 #ifdef LTC_RC4
58 struct rc4_prng rc4;
59 #endif
60 #ifdef LTC_CHACHA20_PRNG
61 struct chacha20_prng chacha;
62 #endif
63 #ifdef LTC_FORTUNA
64 struct fortuna_prng fortuna;
65 #endif
66 #ifdef LTC_SOBER128
67 struct sober128_prng sober128;
68 #endif
69 } u;
70 short ready; /* ready flag 0-1 */
71 LTC_MUTEX_TYPE(lock) /* lock */
72 } prng_state;
73
74 /** PRNG descriptor */
75 extern struct ltc_prng_descriptor {
76 /** Name of the PRNG */
77 const char *name;
78 /** size in bytes of exported state */
79 int export_size;
80 /** Start a PRNG state
81 @param prng [out] The state to initialize
82 @return CRYPT_OK if successful
83 */
84 int (*start)(prng_state *prng);
85 /** Add entropy to the PRNG
86 @param in The entropy
87 @param inlen Length of the entropy (octets)\
88 @param prng The PRNG state
89 @return CRYPT_OK if successful
90 */
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
95 */
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
102 */
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
107 */
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
114 */
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
121 */
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
125 */
126 int (*test)(void);
127 } prng_descriptor[];
128
129 #ifdef LTC_YARROW
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;
139 #endif
140
141 #ifdef LTC_FORTUNA
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;
153 #endif
154
155 #ifdef LTC_RC4
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);
163 int rc4_test(void);
164 extern const struct ltc_prng_descriptor rc4_desc;
165 #endif
166
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;
177 #endif
178
179 #ifdef LTC_SPRNG
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;
189 #endif
190
191 #ifdef LTC_SOBER128
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;
201 #endif
202
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)
209
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
212 */
213 unsigned long rng_get_bytes(unsigned char *out,
214 unsigned long outlen,
215 void (*callback)(void));
216
217 int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void));
218
219 #ifdef LTC_PRNG_ENABLE_LTC_RNG
220 extern unsigned long (*ltc_rng)(unsigned char *out, unsigned long outlen,
221 void (*callback)(void));
222 #endif
223
This page took 0.044739 seconds and 4 git commands to generate.