bn_mp_rand.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "tommath_private.h"
  2. #ifdef BN_MP_RAND_C
  3. /* LibTomMath, multiple-precision integer library -- Tom St Denis */
  4. /* SPDX-License-Identifier: Unlicense */
  5. /* Dropbear sets this separately, avoid platform code */
  6. mp_err(*s_mp_rand_source)(void *out, size_t size) = NULL;
  7. void mp_rand_source(mp_err(*source)(void *out, size_t size))
  8. {
  9. /* Dropbear, don't reset to platform if source==NULL */
  10. s_mp_rand_source = source;
  11. }
  12. mp_err mp_rand(mp_int *a, int digits)
  13. {
  14. int i;
  15. mp_err err;
  16. mp_zero(a);
  17. if (digits <= 0) {
  18. return MP_OKAY;
  19. }
  20. if ((err = mp_grow(a, digits)) != MP_OKAY) {
  21. return err;
  22. }
  23. if ((err = s_mp_rand_source(a->dp, (size_t)digits * sizeof(mp_digit))) != MP_OKAY) {
  24. return err;
  25. }
  26. /* TODO: We ensure that the highest digit is nonzero. Should this be removed? */
  27. while ((a->dp[digits - 1] & MP_MASK) == 0u) {
  28. if ((err = s_mp_rand_source(a->dp + digits - 1, sizeof(mp_digit))) != MP_OKAY) {
  29. return err;
  30. }
  31. }
  32. a->used = digits;
  33. for (i = 0; i < digits; ++i) {
  34. a->dp[i] &= MP_MASK;
  35. }
  36. return MP_OKAY;
  37. }
  38. #endif