Name Description Size
apple_other.rs Implementation for iOS, tvOS, and watchOS where `getentropy` is unavailable. 636
custom.rs An implementation which calls out to an externally defined function. 434
efi_rng.rs Implementation for UEFI using EFI_RNG_PROTOCOL 3478
esp_idf.rs Implementation for ESP-IDF 829
fuchsia.rs Implementation for Fuchsia Zircon 393
getentropy.rs Implementation using getentropy(2) Available since: - macOS 10.12 - OpenBSD 5.6 - Emscripten 2.0.5 - vita newlib since Dec 2021 For these targets, we use getentropy(2) because getrandom(2) doesn't exist. 721
getrandom.rs Implementation using getrandom(2). Available since: - Linux Kernel 3.17, Glibc 2.25, Musl 1.1.20 - Android API level 23 (Marshmallow) - NetBSD 10.0 - FreeBSD 12.0 - illumos since Dec 2018 - DragonFly 5.7 - Hurd Glibc 2.31 - shim-3ds since Feb 2022 For these platforms, we always use the default pool and never set the GRND_RANDOM flag to use the /dev/random pool. On Linux/Android/Hurd, using GRND_RANDOM is not recommended. On NetBSD/FreeBSD/Dragonfly/3ds, it does nothing. On illumos, the default pool is used to implement getentropy(2), so we assume it is acceptable here. 1001
hermit.rs Implementation for Hermit 1807
linux_android_with_fallback.rs Implementation for Linux / Android with `/dev/urandom` fallback 3947
linux_raw.rs Implementation for Linux / Android using `asm!`-based syscalls. 5092
netbsd.rs Implementation for NetBSD `getrandom(2)` was introduced in NetBSD 10. To support older versions we implement our own weak linkage to it, and provide a fallback based on the KERN_ARND sysctl. 2741
rdrand.rs RDRAND backend for x86(-64) targets 5761
rndr.rs RNDR register backend for aarch64 targets Arm Architecture Reference Manual for A-profile architecture: ARM DDI 0487K.a, ID032224, D23.2.147 RNDR, Random Number 4745
solaris.rs Solaris implementation using getrandom(2). While getrandom(2) has been available since Solaris 11.3, it has a few quirks not present on other OSes. First, on Solaris 11.3, calls will always fail if bufsz > 1024. Second, it will always either fail or completely fill the buffer (returning bufsz). Third, error is indicated by returning 0, rather than by returning -1. Finally, "if GRND_RANDOM is not specified then getrandom(2) is always a non blocking call". This _might_ imply that in early-boot scenarios with low entropy, getrandom(2) will not properly block. To be safe, we set GRND_RANDOM, mirroring the man page examples. For more information, see the man page linked in lib.rs and this blog post: https://blogs.oracle.com/solaris/post/solaris-new-system-calls-getentropy2-and-getrandom2 which also explains why this crate should not use getentropy(2). 1861
solid.rs Implementation for SOLID 495
use_file.rs Implementations that just need to read from a file 8669
vxworks.rs Implementation for VxWorks 1505
wasi_p1.rs Implementation for WASI Preview 1 1400
wasi_p2.rs Implementation for WASI Preview 2. 1410
wasm_js.rs Implementation for WASM based on Web and Node.js 2591
windows.rs Implementation for Windows 10 and later On Windows 10 and later, ProcessPrng "is the primary interface to the user-mode per-processor PRNGs" and only requires bcryptprimitives.dll, making it a better option than the other Windows RNG APIs: - BCryptGenRandom: https://learn.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgenrandom - Requires bcrypt.dll (which loads bcryptprimitives.dll anyway) - Can cause crashes/hangs as BCrypt accesses the Windows Registry: https://github.com/rust-lang/rust/issues/99341 - Causes issues inside sandboxed code: https://issues.chromium.org/issues/40277768 - CryptGenRandom: https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptgenrandom - Deprecated and not available on UWP targets - Requires advapi32.lib/advapi32.dll (in addition to bcryptprimitives.dll) - Thin wrapper around ProcessPrng - RtlGenRandom: https://learn.microsoft.com/en-us/windows/win32/api/ntsecapi/nf-ntsecapi-rtlgenrandom - Deprecated and not available on UWP targets - Requires advapi32.dll (in addition to bcryptprimitives.dll) - Requires using name "SystemFunction036" - Thin wrapper around ProcessPrng For more information see the Windows RNG Whitepaper: https://aka.ms/win10rng 2770
windows7.rs Legacy implementation for Windows XP and later For targets where we cannot use ProcessPrng (added in Windows 10), we use RtlGenRandom. See windows.rs for a more detailed discussion of the Windows RNG APIs (and why we don't use BCryptGenRandom). On versions prior to Windows 10, this implementation is secure. On Windows 10 and later, this implementation behaves identically to the windows.rs implementation, except that it forces the loading of an additonal DLL (advapi32.dll). This implementation will not work on UWP targets (which lack advapi32.dll), but such targets require Windows 10, so can use the standard implementation. 1972