MCPcopy Create free account
hub / github.com/boostorg/filesystem / system_crypt_random

Function system_crypt_random

src/unique_path.cpp:210–278  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

208#endif // defined(BOOST_FILESYSTEM_POSIX_API) && !defined(BOOST_FILESYSTEM_HAS_ARC4RANDOM)
209
210void 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))

Callers 1

unique_pathFunction · 0.85

Calls 4

atomic_load_relaxedFunction · 0.85
emit_errorFunction · 0.85
fill_random_dev_randomFunction · 0.85
translate_ntstatusFunction · 0.85

Tested by

no test coverage detected