diff --git a/libtommath_VS2008.vcproj b/libtommath_VS2008.vcproj
index 71dd3807..080b7e0d 100644
--- a/libtommath_VS2008.vcproj
+++ b/libtommath_VS2008.vcproj
@@ -912,6 +912,10 @@
RelativePath="s_mp_rand_platform.c"
>
+
+
diff --git a/makefile b/makefile
index 8f211f5f..6daa522b 100644
--- a/makefile
+++ b/makefile
@@ -48,9 +48,9 @@ s_mp_div_recursive.o s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_expt
s_mp_fp_log_d.o s_mp_get_bit.o s_mp_invmod.o s_mp_invmod_odd.o s_mp_log_2expt.o \
s_mp_montgomery_reduce_comba.o s_mp_mul.o s_mp_mul_balance.o s_mp_mul_comba.o s_mp_mul_high.o \
s_mp_mul_high_comba.o s_mp_mul_karatsuba.o s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o \
-s_mp_radix_map.o s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_sqr.o s_mp_sqr_comba.o \
-s_mp_sqr_karatsuba.o s_mp_sqr_toom.o s_mp_sub.o s_mp_warray.o s_mp_warray_get.o s_mp_warray_put.o \
-s_mp_zero_buf.o s_mp_zero_digs.o
+s_mp_radix_map.o s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_rand_source.o s_mp_sqr.o \
+s_mp_sqr_comba.o s_mp_sqr_karatsuba.o s_mp_sqr_toom.o s_mp_sub.o s_mp_warray.o s_mp_warray_get.o \
+s_mp_warray_put.o s_mp_zero_buf.o s_mp_zero_digs.o
#END_INS
diff --git a/makefile.mingw b/makefile.mingw
index e2445e8a..10f2bd59 100644
--- a/makefile.mingw
+++ b/makefile.mingw
@@ -50,9 +50,9 @@ s_mp_div_recursive.o s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_expt
s_mp_fp_log_d.o s_mp_get_bit.o s_mp_invmod.o s_mp_invmod_odd.o s_mp_log_2expt.o \
s_mp_montgomery_reduce_comba.o s_mp_mul.o s_mp_mul_balance.o s_mp_mul_comba.o s_mp_mul_high.o \
s_mp_mul_high_comba.o s_mp_mul_karatsuba.o s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o \
-s_mp_radix_map.o s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_sqr.o s_mp_sqr_comba.o \
-s_mp_sqr_karatsuba.o s_mp_sqr_toom.o s_mp_sub.o s_mp_warray.o s_mp_warray_get.o s_mp_warray_put.o \
-s_mp_zero_buf.o s_mp_zero_digs.o
+s_mp_radix_map.o s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_rand_source.o s_mp_sqr.o \
+s_mp_sqr_comba.o s_mp_sqr_karatsuba.o s_mp_sqr_toom.o s_mp_sub.o s_mp_warray.o s_mp_warray_get.o \
+s_mp_warray_put.o s_mp_zero_buf.o s_mp_zero_digs.o
HEADERS_PUB=tommath.h
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h tommath_cutoffs.h $(HEADERS_PUB)
diff --git a/makefile.msvc b/makefile.msvc
index 8feb425c..f160f2cc 100644
--- a/makefile.msvc
+++ b/makefile.msvc
@@ -46,9 +46,9 @@ s_mp_div_recursive.obj s_mp_div_school.obj s_mp_div_small.obj s_mp_exptmod.obj s
s_mp_fp_log_d.obj s_mp_get_bit.obj s_mp_invmod.obj s_mp_invmod_odd.obj s_mp_log_2expt.obj \
s_mp_montgomery_reduce_comba.obj s_mp_mul.obj s_mp_mul_balance.obj s_mp_mul_comba.obj s_mp_mul_high.obj \
s_mp_mul_high_comba.obj s_mp_mul_karatsuba.obj s_mp_mul_toom.obj s_mp_prime_is_divisible.obj s_mp_prime_tab.obj \
-s_mp_radix_map.obj s_mp_radix_size_overestimate.obj s_mp_rand_platform.obj s_mp_sqr.obj s_mp_sqr_comba.obj \
-s_mp_sqr_karatsuba.obj s_mp_sqr_toom.obj s_mp_sub.obj s_mp_warray.obj s_mp_warray_get.obj s_mp_warray_put.obj \
-s_mp_zero_buf.obj s_mp_zero_digs.obj
+s_mp_radix_map.obj s_mp_radix_size_overestimate.obj s_mp_rand_platform.obj s_mp_rand_source.obj s_mp_sqr.obj \
+s_mp_sqr_comba.obj s_mp_sqr_karatsuba.obj s_mp_sqr_toom.obj s_mp_sub.obj s_mp_warray.obj s_mp_warray_get.obj \
+s_mp_warray_put.obj s_mp_zero_buf.obj s_mp_zero_digs.obj
HEADERS_PUB=tommath.h
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h tommath_cutoffs.h $(HEADERS_PUB)
diff --git a/makefile.shared b/makefile.shared
index 50c33526..20bd8e03 100644
--- a/makefile.shared
+++ b/makefile.shared
@@ -45,9 +45,9 @@ s_mp_div_recursive.o s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_expt
s_mp_fp_log_d.o s_mp_get_bit.o s_mp_invmod.o s_mp_invmod_odd.o s_mp_log_2expt.o \
s_mp_montgomery_reduce_comba.o s_mp_mul.o s_mp_mul_balance.o s_mp_mul_comba.o s_mp_mul_high.o \
s_mp_mul_high_comba.o s_mp_mul_karatsuba.o s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o \
-s_mp_radix_map.o s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_sqr.o s_mp_sqr_comba.o \
-s_mp_sqr_karatsuba.o s_mp_sqr_toom.o s_mp_sub.o s_mp_warray.o s_mp_warray_get.o s_mp_warray_put.o \
-s_mp_zero_buf.o s_mp_zero_digs.o
+s_mp_radix_map.o s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_rand_source.o s_mp_sqr.o \
+s_mp_sqr_comba.o s_mp_sqr_karatsuba.o s_mp_sqr_toom.o s_mp_sub.o s_mp_warray.o s_mp_warray_get.o \
+s_mp_warray_put.o s_mp_zero_buf.o s_mp_zero_digs.o
#END_INS
diff --git a/makefile.unix b/makefile.unix
index 58642098..06dadddb 100644
--- a/makefile.unix
+++ b/makefile.unix
@@ -51,9 +51,9 @@ s_mp_div_recursive.o s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_expt
s_mp_fp_log_d.o s_mp_get_bit.o s_mp_invmod.o s_mp_invmod_odd.o s_mp_log_2expt.o \
s_mp_montgomery_reduce_comba.o s_mp_mul.o s_mp_mul_balance.o s_mp_mul_comba.o s_mp_mul_high.o \
s_mp_mul_high_comba.o s_mp_mul_karatsuba.o s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o \
-s_mp_radix_map.o s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_sqr.o s_mp_sqr_comba.o \
-s_mp_sqr_karatsuba.o s_mp_sqr_toom.o s_mp_sub.o s_mp_warray.o s_mp_warray_get.o s_mp_warray_put.o \
-s_mp_zero_buf.o s_mp_zero_digs.o
+s_mp_radix_map.o s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_rand_source.o s_mp_sqr.o \
+s_mp_sqr_comba.o s_mp_sqr_karatsuba.o s_mp_sqr_toom.o s_mp_sub.o s_mp_warray.o s_mp_warray_get.o \
+s_mp_warray_put.o s_mp_zero_buf.o s_mp_zero_digs.o
HEADERS_PUB=tommath.h
diff --git a/mp_rand_source.c b/mp_rand_source.c
index e9e87694..25600c27 100644
--- a/mp_rand_source.c
+++ b/mp_rand_source.c
@@ -1,12 +1,12 @@
#include "tommath_private.h"
-#ifdef MP_RAND_C
+#ifdef MP_RAND_SOURCE_C
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
/* SPDX-License-Identifier: Unlicense */
-
-mp_err(*s_mp_rand_source)(void *out, size_t size) = s_mp_rand_platform;
-
void mp_rand_source(mp_err(*source)(void *out, size_t size))
{
- s_mp_rand_source = (source == NULL) ? s_mp_rand_platform : source;
+ if (source == NULL)
+ s_mp_rand_source = s_mp_rand_platform;
+ else
+ s_mp_rand_source = source;
}
#endif
diff --git a/s_mp_rand_source.c b/s_mp_rand_source.c
new file mode 100644
index 00000000..1e35f07b
--- /dev/null
+++ b/s_mp_rand_source.c
@@ -0,0 +1,7 @@
+#include "tommath_private.h"
+#ifdef S_MP_RAND_SOURCE_C
+/* LibTomMath, multiple-precision integer library -- Tom St Denis */
+/* SPDX-License-Identifier: Unlicense */
+
+mp_err(*s_mp_rand_source)(void *out, size_t size) = s_mp_rand_platform;
+#endif
diff --git a/sources.cmake b/sources.cmake
index 103e9c09..e3c12433 100644
--- a/sources.cmake
+++ b/sources.cmake
@@ -152,6 +152,7 @@ s_mp_prime_tab.c
s_mp_radix_map.c
s_mp_radix_size_overestimate.c
s_mp_rand_platform.c
+s_mp_rand_source.c
s_mp_sqr.c
s_mp_sqr_comba.c
s_mp_sqr_karatsuba.c
diff --git a/tommath_class.h b/tommath_class.h
index 09bb3ea6..40ddfd4b 100644
--- a/tommath_class.h
+++ b/tommath_class.h
@@ -161,6 +161,7 @@
# define S_MP_RADIX_MAP_C
# define S_MP_RADIX_SIZE_OVERESTIMATE_C
# define S_MP_RAND_PLATFORM_C
+# define S_MP_RAND_SOURCE_C
# define S_MP_SQR_C
# define S_MP_SQR_COMBA_C
# define S_MP_SQR_KARATSUBA_C
@@ -1248,6 +1249,10 @@
#if defined(S_MP_RAND_PLATFORM_C)
#endif
+#if defined(S_MP_RAND_SOURCE_C)
+# define S_MP_RAND_PLATFORM_C
+#endif
+
#if defined(S_MP_SQR_C)
# define MP_CLAMP_C
# define MP_CLEAR_C
diff --git a/tommath_superclass.h b/tommath_superclass.h
index 10c7f12a..432055a9 100644
--- a/tommath_superclass.h
+++ b/tommath_superclass.h
@@ -31,6 +31,7 @@
# define MP_RADIX_SIZE_OVERESTIMATE_C
# define MP_LOG_N_C
# define MP_RAND_C
+# define MP_RAND_SOURCE_C
# define MP_REDUCE_C
# define MP_REDUCE_2K_L_C
# define MP_FROM_SBIN_C