Commit 1c8c534885d3b2134332a8361250c0b9cc36f20f

Steffen Jaeckel 2019-01-15T18:20:24

Merge pull request #147 from czurnieden/moarvm_workarounds workaround for the MoarVM problem with MP_GEN_RAND et al. (cherry picked from commit 11d6e0391421bc996b2cf780f3f4c3fa634001d0)

diff --git a/bn_mp_rand.c b/bn_mp_rand.c
index b66d1b0..17aa5a2 100644
--- a/bn_mp_rand.c
+++ b/bn_mp_rand.c
@@ -172,7 +172,7 @@ static int s_rand_digit(mp_digit *p)
 }
 
 /* makes a pseudo-random int of a given size */
-static int s_gen_random(mp_digit *r)
+int mp_rand_digit(mp_digit *r)
 {
    int ret = s_rand_digit(r);
    *r &= MP_MASK;
@@ -191,7 +191,7 @@ int mp_rand(mp_int *a, int digits)
 
    /* first place a random non-zero digit */
    do {
-      if (s_gen_random(&d) != MP_OKAY) {
+      if (mp_rand_digit(&d) != MP_OKAY) {
          return MP_VAL;
       }
    } while (d == 0u);
@@ -205,7 +205,7 @@ int mp_rand(mp_int *a, int digits)
          return res;
       }
 
-      if (s_gen_random(&d) != MP_OKAY) {
+      if (mp_rand_digit(&d) != MP_OKAY) {
          return MP_VAL;
       }
       if ((res = mp_add_d(a, d, a)) != MP_OKAY) {
diff --git a/doc/bn.tex b/doc/bn.tex
index 79ae8a4..69e110d 100644
--- a/doc/bn.tex
+++ b/doc/bn.tex
@@ -2003,14 +2003,19 @@ mp\_prime\_random().
 
 \chapter{Random Number Generation}
 \section{PRNG}
+\index{mp\_rand\_digit}
+\begin{alltt}
+int mp_rand_digit(mp_digit *r)
+\end{alltt}
+This function generates a random number in \texttt{r} of the size given in \texttt{r} (that is, the variable is used for in- and output) but not more than \texttt{MP_MASK} bits.
+
 \index{mp\_rand}
 \begin{alltt}
 int mp_rand(mp_int *a, int digits)
 \end{alltt}
-The function generates a random number of \texttt{digits} bits.
+This function generates a random number of \texttt{digits} bits.
 
-This random number is cryptographically secure if the source of random numbers the operating systems offers is cryptographically secure.
-It will use \texttt{arc4random()} if the OS is a BSD flavor, Wincrypt on Windows, and \texttt{\\dev\\urandom} on all operating systems that have it.
+The random number generated with these two functions is cryptographically secure if the source of random numbers the operating systems offers is cryptographically secure. It will use \texttt{arc4random()} if the OS is a BSD flavor, Wincrypt on Windows, or \texttt{\dev\urandom} on all operating systems that have it.
 
 
 \chapter{Input and Output}
diff --git a/tommath.h b/tommath.h
index 78c4cbe..ee5da86 100644
--- a/tommath.h
+++ b/tommath.h
@@ -277,8 +277,10 @@ int mp_cnt_lsb(const mp_int *a);
 
 /* I Love Earth! */
 
-/* makes a pseudo-random int of a given size */
+/* makes a pseudo-random mp_int of a given size */
 int mp_rand(mp_int *a, int digits);
+/* makes a pseudo-random small int of a given size */
+int mp_rand_digit(mp_digit *r);
 
 #ifdef MP_PRNG_ENABLE_LTM_RNG
 /* A last resort to provide random data on systems without any of the other
diff --git a/tommath_class.h b/tommath_class.h
index ff398e5..6363042 100644
--- a/tommath_class.h
+++ b/tommath_class.h
@@ -9,7 +9,6 @@
  *
  * SPDX-License-Identifier: Unlicense
  */
-
 #if !(defined(LTM1) && defined(LTM2) && defined(LTM3))
 #if defined(LTM2)
 #   define LTM3
@@ -18,7 +17,6 @@
 #   define LTM2
 #endif
 #define LTM1
-
 #if defined(LTM_ALL)
 #   define BN_ERROR_C
 #   define BN_FAST_MP_INVMOD_C
@@ -160,7 +158,6 @@
 #   define BN_S_MP_SUB_C
 #   define BNCORE_C
 #endif
-
 #if defined(BN_ERROR_C)
 #   define BN_MP_ERROR_TO_STRING_C
 #endif
@@ -828,6 +825,7 @@
 #endif
 
 #if defined(BN_MP_RAND_C)
+#   define BN_MP_RAND_DIGIT_C
 #   define BN_MP_ZERO_C
 #   define BN_MP_ADD_D_C
 #   define BN_MP_LSHD_C