15 #include "absl/random/internal/seed_material.h"
31 #include "absl/base/dynamic_annotations.h"
32 #include "absl/base/internal/raw_logging.h"
33 #include "absl/strings/ascii.h"
34 #include "absl/strings/escaping.h"
35 #include "absl/strings/string_view.h"
36 #include "absl/strings/strip.h"
38 #if defined(__native_client__)
40 #include <nacl/nacl_random.h>
41 #define ABSL_RANDOM_USE_NACL_SECURE_RANDOM 1
46 #define ABSL_RANDOM_USE_BCRYPT 1
47 #pragma comment(lib, "bcrypt.lib")
49 #elif defined(__Fuchsia__)
50 #include <zircon/syscalls.h>
54 #if defined(__GLIBC__) && \
55 (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 25))
57 #define ABSL_RANDOM_USE_GET_ENTROPY 1
60 #if defined(__EMSCRIPTEN__)
61 #include <sys/random.h>
63 #define ABSL_RANDOM_USE_GET_ENTROPY 1
66 #if defined(ABSL_RANDOM_USE_BCRYPT)
69 #ifndef BCRYPT_SUCCESS
70 #define BCRYPT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
78 namespace random_internal {
85 #if defined(ABSL_RANDOM_USE_BCRYPT)
89 BCRYPT_ALG_HANDLE hProvider;
91 ret = BCryptOpenAlgorithmProvider(&hProvider, BCRYPT_RNG_ALGORITHM,
92 MS_PRIMITIVE_PROVIDER, 0);
93 if (!(BCRYPT_SUCCESS(
ret))) {
97 ret = BCryptGenRandom(
99 reinterpret_cast<UCHAR*
>(
values.data()),
102 BCryptCloseAlgorithmProvider(hProvider, 0);
103 return BCRYPT_SUCCESS(
ret);
106 #elif defined(ABSL_RANDOM_USE_NACL_SECURE_RANDOM)
127 #elif defined(__Fuchsia__)
138 #if defined(ABSL_RANDOM_USE_GET_ENTROPY)
147 size_t to_read = std::min<size_t>(
buffer_size, 256);
160 #endif // defined(ABSL_RANDOM_GETENTROPY)
164 const char kEntropyFile[] =
"/dev/urandom";
169 int dev_urandom =
open(kEntropyFile, O_RDONLY);
170 bool success = (-1 != dev_urandom);
177 int read_error = errno;
182 }
else if (
bytes_read == -1 && read_error == EINTR) {
191 #if defined(ABSL_RANDOM_USE_GET_ENTROPY)
192 if (ReadSeedMaterialFromGetEntropy(
values)) {
198 return ReadSeedMaterialFromDevURandom(
values);
206 assert(
values.data() !=
nullptr);
207 if (
values.data() ==
nullptr) {
213 return ReadSeedMaterialFromOSEntropyImpl(
values);
220 constexpr
uint32_t kInitVal = 0x43b0d7e5;
221 constexpr
uint32_t kHashMul = 0x931e8875;
222 constexpr
uint32_t kMixMulL = 0xca01f9dd;
223 constexpr
uint32_t kMixMulR = 0x4973f715;
229 hash_const *= kHashMul;
241 for (
const auto& seq_val : sequence) {
242 for (
auto&
elem : seed_material) {
259 return absl::nullopt;
262 return salt_material;