Path: blob/master/libs/tomcrypt/src/prngs/rng_make_prng.c
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*/8#include "tomcrypt.h"910#ifdef LTC_RNG_MAKE_PRNG11/**12@file rng_make_prng.c13portable way to get secure random bits to feed a PRNG (Tom St Denis)14*/1516/**17Create a PRNG from a RNG18@param bits Number of bits of entropy desired (64 ... 1024)19@param wprng Index of which PRNG to setup20@param prng [out] PRNG state to initialize21@param callback A pointer to a void function for when the RNG is slow, this can be NULL22@return CRYPT_OK if successful23*/24int rng_make_prng(int bits, int wprng, prng_state *prng,25void (*callback)(void))26{27unsigned char buf[256];28int err;2930LTC_ARGCHK(prng != NULL);3132/* check parameter */33if ((err = prng_is_valid(wprng)) != CRYPT_OK) {34return err;35}3637if (bits < 64 || bits > 1024) {38return CRYPT_INVALID_PRNGSIZE;39}4041if ((err = prng_descriptor[wprng].start(prng)) != CRYPT_OK) {42return err;43}4445bits = ((bits/8)+((bits&7)!=0?1:0)) * 2;46if (rng_get_bytes(buf, (unsigned long)bits, callback) != (unsigned long)bits) {47return CRYPT_ERROR_READPRNG;48}4950if ((err = prng_descriptor[wprng].add_entropy(buf, (unsigned long)bits, prng)) != CRYPT_OK) {51return err;52}5354if ((err = prng_descriptor[wprng].ready(prng)) != CRYPT_OK) {55return err;56}5758#ifdef LTC_CLEAN_STACK59zeromem(buf, sizeof(buf));60#endif61return CRYPT_OK;62}63#endif /* #ifdef LTC_RNG_MAKE_PRNG */646566