| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- /* LibTomCrypt, modular cryptographic library -- Tom St Denis
- *
- * LibTomCrypt is a library that provides various cryptographic
- * algorithms in a highly modular and flexible manner.
- *
- * The library is free for all purposes without any express
- * guarantee it works.
- *
- * Tom St Denis, [email protected], http://libtomcrypt.org
- */
- /* portable way to get secure random bits to feed a PRNG */
- #include "mycrypt.h"
- int rng_make_prng(int bits, int wprng, prng_state *prng,
- void (*callback)(void))
- {
- unsigned char buf[256];
- int err;
-
- _ARGCHK(prng != NULL);
- /* check parameter */
- if ((err = prng_is_valid(wprng)) != CRYPT_OK) {
- return err;
- }
- if (bits < 64 || bits > 1024) {
- return CRYPT_INVALID_PRNGSIZE;
- }
- if ((err = prng_descriptor[wprng].start(prng)) != CRYPT_OK) {
- return err;
- }
- bits = ((bits/8)+((bits&7)!=0?1:0)) * 2;
- if (rng_get_bytes(buf, (unsigned long)bits, callback) != (unsigned long)bits) {
- return CRYPT_ERROR_READPRNG;
- }
- if ((err = prng_descriptor[wprng].add_entropy(buf, (unsigned long)bits, prng)) != CRYPT_OK) {
- return err;
- }
- if ((err = prng_descriptor[wprng].ready(prng)) != CRYPT_OK) {
- return err;
- }
- #ifdef CLEAN_STACK
- zeromem(buf, sizeof(buf));
- #endif
- return CRYPT_OK;
- }
|