2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // Official repository: https://github.com/boostorg/beast
10 #ifndef BOOST_BEAST_WEBSOCKET_DETAIL_PRNG_IPP
11 #define BOOST_BEAST_WEBSOCKET_DETAIL_PRNG_IPP
13 #include <boost/beast/websocket/detail/prng.hpp>
14 #include <boost/beast/core/detail/chacha.hpp>
15 #include <boost/beast/core/detail/pcg.hpp>
26 //------------------------------------------------------------------------------
29 prng_seed(std::seed_seq* ss)
36 data(std::seed_seq* pss)
48 pss->generate(v, v+8);
52 static data const d(ss);
56 //------------------------------------------------------------------------------
62 static std::atomic<std::uint32_t> nonce{0};
67 beast::detail::pcg make_pcg()
69 auto const pv = prng_seed();
70 return beast::detail::pcg{
71 ((static_cast<std::uint64_t>(pv[0])<<32)+pv[1]) ^
72 ((static_cast<std::uint64_t>(pv[2])<<32)+pv[3]) ^
73 ((static_cast<std::uint64_t>(pv[4])<<32)+pv[5]) ^
74 ((static_cast<std::uint64_t>(pv[6])<<32)+pv[7]), make_nonce()};
77 #ifdef BOOST_NO_CXX11_THREAD_LOCAL
85 std::uint32_t operator()()
87 std::lock_guard<std::mutex> guard{mtx};
91 beast::detail::chacha<20> gen;
94 static generator gen{beast::detail::chacha<20>{prng_seed(), make_nonce()}};
104 std::uint32_t operator()()
106 std::lock_guard<std::mutex> guard{mtx};
110 beast::detail::pcg gen;
113 static generator gen{make_pcg()};
123 thread_local static beast::detail::chacha<20> gen{prng_seed(), make_nonce()};
131 thread_local static beast::detail::pcg gen{make_pcg()};
138 make_prng(bool secure)
141 return &secure_generate;
143 return &fast_generate;