bn_mp_rand.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include <tommath.h>
  2. #ifdef BN_MP_RAND_C
  3. /* LibTomMath, multiple-precision integer library -- Tom St Denis
  4. *
  5. * LibTomMath is a library that provides multiple-precision
  6. * integer arithmetic as well as number theoretic functionality.
  7. *
  8. * The library was designed directly after the MPI library by
  9. * Michael Fromberger but has been written from scratch with
  10. * additional optimizations in place.
  11. *
  12. * The library is free for all purposes without any express
  13. * guarantee it works.
  14. *
  15. * Tom St Denis, tomstdenis@gmail.com, http://math.libtomcrypt.com
  16. */
  17. /* makes a pseudo-random int of a given size */
  18. int
  19. mp_rand (mp_int * a, int digits)
  20. {
  21. int res;
  22. mp_digit d;
  23. mp_zero (a);
  24. if (digits <= 0) {
  25. return MP_OKAY;
  26. }
  27. /* first place a random non-zero digit */
  28. do {
  29. d = ((mp_digit) abs (rand ())) & MP_MASK;
  30. } while (d == 0);
  31. if ((res = mp_add_d (a, d, a)) != MP_OKAY) {
  32. return res;
  33. }
  34. while (--digits > 0) {
  35. if ((res = mp_lshd (a, 1)) != MP_OKAY) {
  36. return res;
  37. }
  38. if ((res = mp_add_d (a, ((mp_digit) abs (rand ())), a)) != MP_OKAY) {
  39. return res;
  40. }
  41. }
  42. return MP_OKAY;
  43. }
  44. #endif
  45. /* $Source: /cvs/libtom/libtommath/bn_mp_rand.c,v $ */
  46. /* $Revision: 1.3 $ */
  47. /* $Date: 2006/03/31 14:18:44 $ */