···11+## Pending
22+33+* Use arc4random_buf instead of getrandom on Android before getrandom
44+ became available in API 28 (#259 @jonahbeckford)
55+* Define fill_bytes for MSVC (#259 @jonahbeckford)
66+17## v2.0.0 (2025-02-03)
2839* Remove now superfluous mirage-crypto-rng-{eio,lwt,async} packages
+8-1
rng/unix/mc_getrandom_stubs.c
···99#include <caml/unixsupport.h>
1010#include <caml/bigarray.h>
11111212-#if defined(__linux) || defined(__GNU__)
1212+#if defined(__ANDROID_API__) && __ANDROID_API__ < 28
1313+// on Android 27 and earlier, we use Google's <sys/random.h> recommended arc4random_buf
1414+# include <stdlib.h>
1515+1616+void raw_getrandom (uint8_t *data, size_t len) {
1717+ arc4random_buf(data, len);
1818+}
1919+#elif defined(__linux) || defined(__GNU__)
1320# include <errno.h>
1421// on Linux and GNU/Hurd, we use getrandom and loop
1522
+7-4
src/native/entropy_cpu_stubs.c
···1515#define random_t unsigned long long
1616#define _rdseed_step _rdseed64_step
1717#define _rdrand_step _rdrand64_step
1818-#define fill_bytes(buf, off, data) memcpy(_bp_uint8_off(buf, off), data, 8)
1818+#define fill_bytes(buf, bufsz, off, data) memcpy(_bp_uint8_off(buf, off), data, 8)
19192020#elif defined (__i386__)
2121#define random_t unsigned int
2222#define _rdseed_step _rdseed32_step
2323#define _rdrand_step _rdrand32_step
2424-#define fill_bytes(buf, off, data) memcpy(_bp_uint8_off(buf, off), data, 4)
2424+#define fill_bytes(buf, bufsz, off, data) memcpy(_bp_uint8_off(buf, off), data, 4)
25252626#endif
2727#endif /* __i386__ || __x86_64__ */
···44444545#if defined (_MSC_VER)
4646#include <immintrin.h>
4747+#include <memory.h>
47484849#if defined (_WIN64)
4950#define random_t unsigned long long
5051#define _rdseed_step _rdseed64_step
5152#define _rdrand_step _rdrand64_step
5353+#define fill_bytes(buf, bufsz, off, data) memcpy_s(_bp_uint8_off(buf, off), bufsz, data, 8)
52545355#elif defined (_WIN32)
5456#define random_t unsigned int
5557#define _rdseed_step _rdseed32_step
5658#define _rdrand_step _rdrand32_step
5959+#define fill_bytes(buf, bufsz, off, data) memcpy_s(_bp_uint8_off(buf, off), bufsz, data, 4)
5760#endif
58615962#endif /* _MSC_VER */
···235238 int ok = 0;
236239 int i = 100;
237240 do { ok = _rdseed_step (&r); _mm_pause (); } while ( !(ok | !--i) );
238238- fill_bytes(buf, off, &r);
241241+ fill_bytes(buf, sizeof(r), off, &r);
239242 return Val_bool (ok);
240243#else
241244 /* ARM: CPU-assisted randomness here. */
···251254 int ok = 0;
252255 int i = 10;
253256 do { ok = _rdrand_step (&r); } while ( !(ok | !--i) );
254254- fill_bytes(buf, off, &r);
257257+ fill_bytes(buf, sizeof(r), off, &r);
255258 return Val_bool (ok);
256259#else
257260 /* ARM: CPU-assisted randomness here. */