comparison libtomcrypt/src/headers/tomcrypt_prng.h @ 389:5ff8218bcee9

propagate from branch 'au.asn.ucc.matt.ltm.dropbear' (head 2af95f00ebd5bb7a28b3817db1218442c935388e) to branch 'au.asn.ucc.matt.dropbear' (head ecd779509ef23a8cdf64888904fc9b31d78aa933)
author Matt Johnston <matt@ucc.asn.au>
date Thu, 11 Jan 2007 03:14:55 +0000
parents 0cbe8f6dbf9e
children f849a5ca2efc
comparison
equal deleted inserted replaced
388:fb54020f78e1 389:5ff8218bcee9
1 /* ---- PRNG Stuff ---- */
2 #ifdef YARROW
3 struct yarrow_prng {
4 int cipher, hash;
5 unsigned char pool[MAXBLOCKSIZE];
6 symmetric_CTR ctr;
7 LTC_MUTEX_TYPE(prng_lock)
8 };
9 #endif
10
11 #ifdef RC4
12 struct rc4_prng {
13 int x, y;
14 unsigned char buf[256];
15 };
16 #endif
17
18 #ifdef FORTUNA
19 struct fortuna_prng {
20 hash_state pool[FORTUNA_POOLS]; /* the pools */
21
22 symmetric_key skey;
23
24 unsigned char K[32], /* the current key */
25 IV[16]; /* IV for CTR mode */
26
27 unsigned long pool_idx, /* current pool we will add to */
28 pool0_len, /* length of 0'th pool */
29 wd;
30
31 ulong64 reset_cnt; /* number of times we have reset */
32 LTC_MUTEX_TYPE(prng_lock)
33 };
34 #endif
35
36 #ifdef SOBER128
37 struct sober128_prng {
38 ulong32 R[17], /* Working storage for the shift register */
39 initR[17], /* saved register contents */
40 konst, /* key dependent constant */
41 sbuf; /* partial word encryption buffer */
42
43 int nbuf, /* number of part-word stream bits buffered */
44 flag, /* first add_entropy call or not? */
45 set; /* did we call add_entropy to set key? */
46
47 };
48 #endif
49
50 typedef union Prng_state {
51 char dummy[1];
52 #ifdef YARROW
53 struct yarrow_prng yarrow;
54 #endif
55 #ifdef RC4
56 struct rc4_prng rc4;
57 #endif
58 #ifdef FORTUNA
59 struct fortuna_prng fortuna;
60 #endif
61 #ifdef SOBER128
62 struct sober128_prng sober128;
63 #endif
64 } prng_state;
65
66 /** PRNG descriptor */
67 extern struct ltc_prng_descriptor {
68 /** Name of the PRNG */
69 char *name;
70 /** size in bytes of exported state */
71 int export_size;
72 /** Start a PRNG state
73 @param prng [out] The state to initialize
74 @return CRYPT_OK if successful
75 */
76 int (*start)(prng_state *prng);
77 /** Add entropy to the PRNG
78 @param in The entropy
79 @param inlen Length of the entropy (octets)\
80 @param prng The PRNG state
81 @return CRYPT_OK if successful
82 */
83 int (*add_entropy)(const unsigned char *in, unsigned long inlen, prng_state *prng);
84 /** Ready a PRNG state to read from
85 @param prng The PRNG state to ready
86 @return CRYPT_OK if successful
87 */
88 int (*ready)(prng_state *prng);
89 /** Read from the PRNG
90 @param out [out] Where to store the data
91 @param outlen Length of data desired (octets)
92 @param prng The PRNG state to read from
93 @return Number of octets read
94 */
95 unsigned long (*read)(unsigned char *out, unsigned long outlen, prng_state *prng);
96 /** Terminate a PRNG state
97 @param prng The PRNG state to terminate
98 @return CRYPT_OK if successful
99 */
100 int (*done)(prng_state *prng);
101 /** Export a PRNG state
102 @param out [out] The destination for the state
103 @param outlen [in/out] The max size and resulting size of the PRNG state
104 @param prng The PRNG to export
105 @return CRYPT_OK if successful
106 */
107 int (*pexport)(unsigned char *out, unsigned long *outlen, prng_state *prng);
108 /** Import a PRNG state
109 @param in The data to import
110 @param inlen The length of the data to import (octets)
111 @param prng The PRNG to initialize/import
112 @return CRYPT_OK if successful
113 */
114 int (*pimport)(const unsigned char *in, unsigned long inlen, prng_state *prng);
115 /** Self-test the PRNG
116 @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled
117 */
118 int (*test)(void);
119 } prng_descriptor[];
120
121 #ifdef YARROW
122 int yarrow_start(prng_state *prng);
123 int yarrow_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
124 int yarrow_ready(prng_state *prng);
125 unsigned long yarrow_read(unsigned char *out, unsigned long outlen, prng_state *prng);
126 int yarrow_done(prng_state *prng);
127 int yarrow_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
128 int yarrow_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
129 int yarrow_test(void);
130 extern const struct ltc_prng_descriptor yarrow_desc;
131 #endif
132
133 #ifdef FORTUNA
134 int fortuna_start(prng_state *prng);
135 int fortuna_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
136 int fortuna_ready(prng_state *prng);
137 unsigned long fortuna_read(unsigned char *out, unsigned long outlen, prng_state *prng);
138 int fortuna_done(prng_state *prng);
139 int fortuna_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
140 int fortuna_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
141 int fortuna_test(void);
142 extern const struct ltc_prng_descriptor fortuna_desc;
143 #endif
144
145 #ifdef RC4
146 int rc4_start(prng_state *prng);
147 int rc4_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
148 int rc4_ready(prng_state *prng);
149 unsigned long rc4_read(unsigned char *out, unsigned long outlen, prng_state *prng);
150 int rc4_done(prng_state *prng);
151 int rc4_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
152 int rc4_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
153 int rc4_test(void);
154 extern const struct ltc_prng_descriptor rc4_desc;
155 #endif
156
157 #ifdef SPRNG
158 int sprng_start(prng_state *prng);
159 int sprng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
160 int sprng_ready(prng_state *prng);
161 unsigned long sprng_read(unsigned char *out, unsigned long outlen, prng_state *prng);
162 int sprng_done(prng_state *prng);
163 int sprng_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
164 int sprng_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
165 int sprng_test(void);
166 extern const struct ltc_prng_descriptor sprng_desc;
167 #endif
168
169 #ifdef SOBER128
170 int sober128_start(prng_state *prng);
171 int sober128_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
172 int sober128_ready(prng_state *prng);
173 unsigned long sober128_read(unsigned char *out, unsigned long outlen, prng_state *prng);
174 int sober128_done(prng_state *prng);
175 int sober128_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
176 int sober128_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
177 int sober128_test(void);
178 extern const struct ltc_prng_descriptor sober128_desc;
179 #endif
180
181 int find_prng(const char *name);
182 int register_prng(const struct ltc_prng_descriptor *prng);
183 int unregister_prng(const struct ltc_prng_descriptor *prng);
184 int prng_is_valid(int idx);
185 LTC_MUTEX_PROTO(ltc_prng_mutex)
186
187 /* Slow RNG you **might** be able to use to seed a PRNG with. Be careful as this
188 * might not work on all platforms as planned
189 */
190 unsigned long rng_get_bytes(unsigned char *out,
191 unsigned long outlen,
192 void (*callback)(void));
193
194 int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void));
195
196
197 /* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_prng.h,v $ */
198 /* $Revision: 1.8 $ */
199 /* $Date: 2006/11/05 01:36:43 $ */