rng_make_prng.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /* LibTomCrypt, modular cryptographic library -- Tom St Denis
  2. *
  3. * LibTomCrypt is a library that provides various cryptographic
  4. * algorithms in a highly modular and flexible manner.
  5. *
  6. * The library is free for all purposes without any express
  7. * guarantee it works.
  8. *
  9. * Tom St Denis, [email protected], http://libtomcrypt.org
  10. */
  11. /* portable way to get secure random bits to feed a PRNG */
  12. #include "mycrypt.h"
  13. int rng_make_prng(int bits, int wprng, prng_state *prng,
  14. void (*callback)(void))
  15. {
  16. unsigned char buf[256];
  17. int err;
  18. _ARGCHK(prng != NULL);
  19. /* check parameter */
  20. if ((err = prng_is_valid(wprng)) != CRYPT_OK) {
  21. return err;
  22. }
  23. if (bits < 64 || bits > 1024) {
  24. return CRYPT_INVALID_PRNGSIZE;
  25. }
  26. if ((err = prng_descriptor[wprng].start(prng)) != CRYPT_OK) {
  27. return err;
  28. }
  29. bits = ((bits/8)+((bits&7)!=0?1:0)) * 2;
  30. if (rng_get_bytes(buf, (unsigned long)bits, callback) != (unsigned long)bits) {
  31. return CRYPT_ERROR_READPRNG;
  32. }
  33. if ((err = prng_descriptor[wprng].add_entropy(buf, (unsigned long)bits, prng)) != CRYPT_OK) {
  34. return err;
  35. }
  36. if ((err = prng_descriptor[wprng].ready(prng)) != CRYPT_OK) {
  37. return err;
  38. }
  39. #ifdef CLEAN_STACK
  40. zeromem(buf, sizeof(buf));
  41. #endif
  42. return CRYPT_OK;
  43. }