/* ---- PRNG Stuff ---- */ struct yarrow_prng { int cipher, hash; unsigned char pool[MAXBLOCKSIZE]; symmetric_CTR ctr; }; struct rc4_prng { int x, y; unsigned char buf[256]; }; typedef union Prng_state { struct yarrow_prng yarrow; struct rc4_prng rc4; } prng_state; extern struct _prng_descriptor { char *name; int (*start)(prng_state *); int (*add_entropy)(const unsigned char *, unsigned long, prng_state *); int (*ready)(prng_state *); unsigned long (*read)(unsigned char *, unsigned long len, prng_state *); } prng_descriptor[]; #ifdef YARROW int yarrow_start(prng_state *prng); int yarrow_add_entropy(const unsigned char *buf, unsigned long len, prng_state *prng); int yarrow_ready(prng_state *prng); unsigned long yarrow_read(unsigned char *buf, unsigned long len, prng_state *prng); extern const struct _prng_descriptor yarrow_desc; #endif #ifdef RC4 int rc4_start(prng_state *prng); int rc4_add_entropy(const unsigned char *buf, unsigned long len, prng_state *prng); int rc4_ready(prng_state *prng); unsigned long rc4_read(unsigned char *buf, unsigned long len, prng_state *prng); extern const struct _prng_descriptor rc4_desc; #endif #ifdef SPRNG int sprng_start(prng_state *prng); int sprng_add_entropy(const unsigned char *buf, unsigned long len, prng_state *prng); int sprng_ready(prng_state *prng); unsigned long sprng_read(unsigned char *buf, unsigned long len, prng_state *prng); extern const struct _prng_descriptor sprng_desc; #endif int find_prng(const char *name); int register_prng(const struct _prng_descriptor *prng); int unregister_prng(const struct _prng_descriptor *prng); int prng_is_valid(int idx); /* Slow RNG you **might** be able to use to seed a PRNG with. Be careful as this * might not work on all platforms as planned */ /* ch2-02-1 */ unsigned long rng_get_bytes(unsigned char *buf, unsigned long len, void (*callback)(void)); /* ch2-02-1 */ int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void));