Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/tomcrypt/src/headers/tomcrypt_prng.h
5971 views
1
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
2
*
3
* LibTomCrypt is a library that provides various cryptographic
4
* algorithms in a highly modular and flexible manner.
5
*
6
* The library is free for all purposes without any express
7
* guarantee it works.
8
*/
9
10
/* ---- PRNG Stuff ---- */
11
#ifdef LTC_YARROW
12
struct yarrow_prng {
13
int cipher, hash;
14
unsigned char pool[MAXBLOCKSIZE];
15
symmetric_CTR ctr;
16
};
17
#endif
18
19
#ifdef LTC_RC4
20
struct rc4_prng {
21
rc4_state s;
22
};
23
#endif
24
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 */
30
};
31
#endif
32
33
#ifdef LTC_FORTUNA
34
struct fortuna_prng {
35
hash_state pool[LTC_FORTUNA_POOLS]; /* the pools */
36
37
symmetric_key skey;
38
39
unsigned char K[32], /* the current key */
40
IV[16]; /* IV for CTR mode */
41
42
unsigned long pool_idx, /* current pool we will add to */
43
pool0_len, /* length of 0'th pool */
44
wd;
45
46
ulong64 reset_cnt; /* number of times we have reset */
47
};
48
#endif
49
50
#ifdef LTC_SOBER128
51
struct sober128_prng {
52
sober128_state s; /* sober128 state */
53
unsigned char ent[40]; /* entropy buffer */
54
unsigned long idx; /* entropy counter */
55
};
56
#endif
57
58
typedef struct {
59
union {
60
char dummy[1];
61
#ifdef LTC_YARROW
62
struct yarrow_prng yarrow;
63
#endif
64
#ifdef LTC_RC4
65
struct rc4_prng rc4;
66
#endif
67
#ifdef LTC_CHACHA20_PRNG
68
struct chacha20_prng chacha;
69
#endif
70
#ifdef LTC_FORTUNA
71
struct fortuna_prng fortuna;
72
#endif
73
#ifdef LTC_SOBER128
74
struct sober128_prng sober128;
75
#endif
76
};
77
short ready; /* ready flag 0-1 */
78
LTC_MUTEX_TYPE(lock) /* lock */
79
} prng_state;
80
81
/** PRNG descriptor */
82
extern struct ltc_prng_descriptor {
83
/** Name of the PRNG */
84
const char *name;
85
/** size in bytes of exported state */
86
int export_size;
87
/** Start a PRNG state
88
@param prng [out] The state to initialize
89
@return CRYPT_OK if successful
90
*/
91
int (*start)(prng_state *prng);
92
/** Add entropy to the PRNG
93
@param in The entropy
94
@param inlen Length of the entropy (octets)\
95
@param prng The PRNG state
96
@return CRYPT_OK if successful
97
*/
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
102
*/
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
109
*/
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
114
*/
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
121
*/
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
128
*/
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
132
*/
133
int (*test)(void);
134
} prng_descriptor[];
135
136
#ifdef LTC_YARROW
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;
146
#endif
147
148
#ifdef LTC_FORTUNA
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;
158
#endif
159
160
#ifdef LTC_RC4
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);
168
int rc4_test(void);
169
extern const struct ltc_prng_descriptor rc4_desc;
170
#endif
171
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;
182
#endif
183
184
#ifdef LTC_SPRNG
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;
194
#endif
195
196
#ifdef LTC_SOBER128
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;
206
#endif
207
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)
214
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
217
*/
218
unsigned long rng_get_bytes(unsigned char *out,
219
unsigned long outlen,
220
void (*callback)(void));
221
222
int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void));
223
224
#ifdef LTC_PRNG_ENABLE_LTC_RNG
225
extern unsigned long (*ltc_rng)(unsigned char *out, unsigned long outlen,
226
void (*callback)(void));
227
#endif
228
229