]> pd.if.org Git - zpackage/blob - libtomcrypt/src/headers/tomcrypt_prng.h
commit files needed for zpm-fetchurl
[zpackage] / libtomcrypt / src / headers / tomcrypt_prng.h
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
230 /* ref:         $Format:%D$ */
231 /* git commit:  $Format:%H$ */
232 /* commit time: $Format:%ai$ */