Path: blob/master/libs/tomcrypt/src/headers/tomcrypt_prng.h
5971 views
/* LibTomCrypt, modular cryptographic library -- Tom St Denis1*2* LibTomCrypt is a library that provides various cryptographic3* algorithms in a highly modular and flexible manner.4*5* The library is free for all purposes without any express6* guarantee it works.7*/89/* ---- PRNG Stuff ---- */10#ifdef LTC_YARROW11struct yarrow_prng {12int cipher, hash;13unsigned char pool[MAXBLOCKSIZE];14symmetric_CTR ctr;15};16#endif1718#ifdef LTC_RC419struct rc4_prng {20rc4_state s;21};22#endif2324#ifdef LTC_CHACHA20_PRNG25struct chacha20_prng {26chacha_state s; /* chacha state */27unsigned char ent[40]; /* entropy buffer */28unsigned long idx; /* entropy counter */29};30#endif3132#ifdef LTC_FORTUNA33struct fortuna_prng {34hash_state pool[LTC_FORTUNA_POOLS]; /* the pools */3536symmetric_key skey;3738unsigned char K[32], /* the current key */39IV[16]; /* IV for CTR mode */4041unsigned long pool_idx, /* current pool we will add to */42pool0_len, /* length of 0'th pool */43wd;4445ulong64 reset_cnt; /* number of times we have reset */46};47#endif4849#ifdef LTC_SOBER12850struct sober128_prng {51sober128_state s; /* sober128 state */52unsigned char ent[40]; /* entropy buffer */53unsigned long idx; /* entropy counter */54};55#endif5657typedef struct {58union {59char dummy[1];60#ifdef LTC_YARROW61struct yarrow_prng yarrow;62#endif63#ifdef LTC_RC464struct rc4_prng rc4;65#endif66#ifdef LTC_CHACHA20_PRNG67struct chacha20_prng chacha;68#endif69#ifdef LTC_FORTUNA70struct fortuna_prng fortuna;71#endif72#ifdef LTC_SOBER12873struct sober128_prng sober128;74#endif75};76short ready; /* ready flag 0-1 */77LTC_MUTEX_TYPE(lock) /* lock */78} prng_state;7980/** PRNG descriptor */81extern struct ltc_prng_descriptor {82/** Name of the PRNG */83const char *name;84/** size in bytes of exported state */85int export_size;86/** Start a PRNG state87@param prng [out] The state to initialize88@return CRYPT_OK if successful89*/90int (*start)(prng_state *prng);91/** Add entropy to the PRNG92@param in The entropy93@param inlen Length of the entropy (octets)\94@param prng The PRNG state95@return CRYPT_OK if successful96*/97int (*add_entropy)(const unsigned char *in, unsigned long inlen, prng_state *prng);98/** Ready a PRNG state to read from99@param prng The PRNG state to ready100@return CRYPT_OK if successful101*/102int (*ready)(prng_state *prng);103/** Read from the PRNG104@param out [out] Where to store the data105@param outlen Length of data desired (octets)106@param prng The PRNG state to read from107@return Number of octets read108*/109unsigned long (*read)(unsigned char *out, unsigned long outlen, prng_state *prng);110/** Terminate a PRNG state111@param prng The PRNG state to terminate112@return CRYPT_OK if successful113*/114int (*done)(prng_state *prng);115/** Export a PRNG state116@param out [out] The destination for the state117@param outlen [in/out] The max size and resulting size of the PRNG state118@param prng The PRNG to export119@return CRYPT_OK if successful120*/121int (*pexport)(unsigned char *out, unsigned long *outlen, prng_state *prng);122/** Import a PRNG state123@param in The data to import124@param inlen The length of the data to import (octets)125@param prng The PRNG to initialize/import126@return CRYPT_OK if successful127*/128int (*pimport)(const unsigned char *in, unsigned long inlen, prng_state *prng);129/** Self-test the PRNG130@return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled131*/132int (*test)(void);133} prng_descriptor[];134135#ifdef LTC_YARROW136int yarrow_start(prng_state *prng);137int yarrow_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);138int yarrow_ready(prng_state *prng);139unsigned long yarrow_read(unsigned char *out, unsigned long outlen, prng_state *prng);140int yarrow_done(prng_state *prng);141int yarrow_export(unsigned char *out, unsigned long *outlen, prng_state *prng);142int yarrow_import(const unsigned char *in, unsigned long inlen, prng_state *prng);143int yarrow_test(void);144extern const struct ltc_prng_descriptor yarrow_desc;145#endif146147#ifdef LTC_FORTUNA148int fortuna_start(prng_state *prng);149int fortuna_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);150int fortuna_ready(prng_state *prng);151unsigned long fortuna_read(unsigned char *out, unsigned long outlen, prng_state *prng);152int fortuna_done(prng_state *prng);153int fortuna_export(unsigned char *out, unsigned long *outlen, prng_state *prng);154int fortuna_import(const unsigned char *in, unsigned long inlen, prng_state *prng);155int fortuna_test(void);156extern const struct ltc_prng_descriptor fortuna_desc;157#endif158159#ifdef LTC_RC4160int rc4_start(prng_state *prng);161int rc4_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);162int rc4_ready(prng_state *prng);163unsigned long rc4_read(unsigned char *out, unsigned long outlen, prng_state *prng);164int rc4_done(prng_state *prng);165int rc4_export(unsigned char *out, unsigned long *outlen, prng_state *prng);166int rc4_import(const unsigned char *in, unsigned long inlen, prng_state *prng);167int rc4_test(void);168extern const struct ltc_prng_descriptor rc4_desc;169#endif170171#ifdef LTC_CHACHA20_PRNG172int chacha20_prng_start(prng_state *prng);173int chacha20_prng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);174int chacha20_prng_ready(prng_state *prng);175unsigned long chacha20_prng_read(unsigned char *out, unsigned long outlen, prng_state *prng);176int chacha20_prng_done(prng_state *prng);177int chacha20_prng_export(unsigned char *out, unsigned long *outlen, prng_state *prng);178int chacha20_prng_import(const unsigned char *in, unsigned long inlen, prng_state *prng);179int chacha20_prng_test(void);180extern const struct ltc_prng_descriptor chacha20_prng_desc;181#endif182183#ifdef LTC_SPRNG184int sprng_start(prng_state *prng);185int sprng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);186int sprng_ready(prng_state *prng);187unsigned long sprng_read(unsigned char *out, unsigned long outlen, prng_state *prng);188int sprng_done(prng_state *prng);189int sprng_export(unsigned char *out, unsigned long *outlen, prng_state *prng);190int sprng_import(const unsigned char *in, unsigned long inlen, prng_state *prng);191int sprng_test(void);192extern const struct ltc_prng_descriptor sprng_desc;193#endif194195#ifdef LTC_SOBER128196int sober128_start(prng_state *prng);197int sober128_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);198int sober128_ready(prng_state *prng);199unsigned long sober128_read(unsigned char *out, unsigned long outlen, prng_state *prng);200int sober128_done(prng_state *prng);201int sober128_export(unsigned char *out, unsigned long *outlen, prng_state *prng);202int sober128_import(const unsigned char *in, unsigned long inlen, prng_state *prng);203int sober128_test(void);204extern const struct ltc_prng_descriptor sober128_desc;205#endif206207int find_prng(const char *name);208int register_prng(const struct ltc_prng_descriptor *prng);209int unregister_prng(const struct ltc_prng_descriptor *prng);210int register_all_prngs(void);211int prng_is_valid(int idx);212LTC_MUTEX_PROTO(ltc_prng_mutex)213214/* Slow RNG you **might** be able to use to seed a PRNG with. Be careful as this215* might not work on all platforms as planned216*/217unsigned long rng_get_bytes(unsigned char *out,218unsigned long outlen,219void (*callback)(void));220221int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void));222223#ifdef LTC_PRNG_ENABLE_LTC_RNG224extern unsigned long (*ltc_rng)(unsigned char *out, unsigned long outlen,225void (*callback)(void));226#endif227228229