Merge pull request #147 from czurnieden/moarvm_workarounds workaround for the MoarVM problem with MP_GEN_RAND et al. (cherry picked from commit 11d6e0391421bc996b2cf780f3f4c3fa634001d0)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
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