| 208 | #endif // defined(BOOST_FILESYSTEM_POSIX_API) && !defined(BOOST_FILESYSTEM_HAS_ARC4RANDOM) |
| 209 | |
| 210 | void system_crypt_random(void* buf, std::size_t len, boost::system::error_code* ec) |
| 211 | { |
| 212 | #if defined(BOOST_FILESYSTEM_POSIX_API) |
| 213 | |
| 214 | #if defined(BOOST_FILESYSTEM_HAS_GETRANDOM) || defined(BOOST_FILESYSTEM_HAS_GETRANDOM_SYSCALL) |
| 215 | |
| 216 | int err = filesystem::detail::atomic_load_relaxed(fill_random)(buf, len); |
| 217 | if (BOOST_UNLIKELY(err != 0)) |
| 218 | emit_error(err, ec, "boost::filesystem::unique_path"); |
| 219 | |
| 220 | #elif defined(BOOST_FILESYSTEM_HAS_ARC4RANDOM) |
| 221 | |
| 222 | arc4random_buf(buf, len); |
| 223 | |
| 224 | #else |
| 225 | |
| 226 | int err = fill_random_dev_random(buf, len); |
| 227 | if (BOOST_UNLIKELY(err != 0)) |
| 228 | emit_error(err, ec, "boost::filesystem::unique_path"); |
| 229 | |
| 230 | #endif |
| 231 | |
| 232 | #else // defined(BOOST_FILESYSTEM_POSIX_API) |
| 233 | |
| 234 | #if defined(BOOST_FILESYSTEM_HAS_BCRYPT) |
| 235 | |
| 236 | boost::winapi::BCRYPT_ALG_HANDLE_ handle; |
| 237 | boost::winapi::NTSTATUS_ status = boost::winapi::BCryptOpenAlgorithmProvider(&handle, boost::winapi::BCRYPT_RNG_ALGORITHM_, nullptr, 0); |
| 238 | if (BOOST_UNLIKELY(status != 0)) |
| 239 | { |
| 240 | fail: |
| 241 | emit_error(translate_ntstatus(status), ec, "boost::filesystem::unique_path"); |
| 242 | return; |
| 243 | } |
| 244 | |
| 245 | status = boost::winapi::BCryptGenRandom(handle, static_cast< boost::winapi::PUCHAR_ >(buf), static_cast< boost::winapi::ULONG_ >(len), 0); |
| 246 | |
| 247 | boost::winapi::BCryptCloseAlgorithmProvider(handle, 0); |
| 248 | |
| 249 | if (BOOST_UNLIKELY(status != 0)) |
| 250 | goto fail; |
| 251 | |
| 252 | #else // defined(BOOST_FILESYSTEM_HAS_BCRYPT) |
| 253 | |
| 254 | boost::winapi::HCRYPTPROV_ handle; |
| 255 | boost::winapi::DWORD_ err = 0u; |
| 256 | if (BOOST_UNLIKELY(!boost::winapi::CryptAcquireContextW(&handle, nullptr, nullptr, boost::winapi::PROV_RSA_FULL_, boost::winapi::CRYPT_VERIFYCONTEXT_ | boost::winapi::CRYPT_SILENT_))) |
| 257 | { |
| 258 | err = boost::winapi::GetLastError(); |
| 259 | |
| 260 | fail: |
| 261 | emit_error(err, ec, "boost::filesystem::unique_path"); |
| 262 | return; |
| 263 | } |
| 264 | |
| 265 | boost::winapi::BOOL_ gen_ok = boost::winapi::CryptGenRandom(handle, static_cast< boost::winapi::DWORD_ >(len), static_cast< boost::winapi::BYTE_* >(buf)); |
| 266 | |
| 267 | if (BOOST_UNLIKELY(!gen_ok)) |
no test coverage detected