aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/botan/src/lib/entropy/entropy_srcs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/3rdparty/botan/src/lib/entropy/entropy_srcs.cpp')
-rw-r--r--src/libs/3rdparty/botan/src/lib/entropy/entropy_srcs.cpp198
1 files changed, 198 insertions, 0 deletions
diff --git a/src/libs/3rdparty/botan/src/lib/entropy/entropy_srcs.cpp b/src/libs/3rdparty/botan/src/lib/entropy/entropy_srcs.cpp
new file mode 100644
index 0000000000..c04b3b5b26
--- /dev/null
+++ b/src/libs/3rdparty/botan/src/lib/entropy/entropy_srcs.cpp
@@ -0,0 +1,198 @@
+/*
+* Entropy Source Polling
+* (C) 2008-2010,2015 Jack Lloyd
+*
+* Botan is released under the Simplified BSD License (see license.txt)
+*/
+
+#include <botan/entropy_src.h>
+#include <botan/rng.h>
+
+#if defined(BOTAN_HAS_SYSTEM_RNG)
+ #include <botan/system_rng.h>
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_RDRAND)
+ #include <botan/internal/rdrand.h>
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_RDSEED)
+ #include <botan/internal/rdseed.h>
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM)
+ #include <botan/internal/dev_random.h>
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_WIN32)
+ #include <botan/internal/es_win32.h>
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_PROC_WALKER)
+ #include <botan/internal/proc_walk.h>
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_DARWIN_SECRANDOM)
+ #include <botan/internal/darwin_secrandom.h>
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_GETENTROPY)
+ #include <botan/internal/getentropy.h>
+#endif
+
+namespace Botan {
+
+#if defined(BOTAN_HAS_SYSTEM_RNG)
+
+namespace {
+
+class System_RNG_EntropySource final : public Entropy_Source
+ {
+ public:
+ size_t poll(RandomNumberGenerator& rng) override
+ {
+ const size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS;
+ rng.reseed_from_rng(system_rng(), poll_bits);
+ return poll_bits;
+ }
+
+ std::string name() const override { return "system_rng"; }
+ };
+
+}
+
+#endif
+
+std::unique_ptr<Entropy_Source> Entropy_Source::create(const std::string& name)
+ {
+#if defined(BOTAN_HAS_SYSTEM_RNG)
+ if(name == "system_rng" || name == "win32_cryptoapi")
+ {
+ return std::unique_ptr<Entropy_Source>(new System_RNG_EntropySource);
+ }
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_RDRAND)
+ if(name == "rdrand")
+ {
+ return std::unique_ptr<Entropy_Source>(new Intel_Rdrand);
+ }
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_RDSEED)
+ if(name == "rdseed")
+ {
+ return std::unique_ptr<Entropy_Source>(new Intel_Rdseed);
+ }
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_DARWIN_SECRANDOM)
+ if(name == "darwin_secrandom")
+ {
+ return std::unique_ptr<Entropy_Source>(new Darwin_SecRandom);
+ }
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_GETENTROPY)
+ if(name == "getentropy")
+ {
+ return std::unique_ptr<Entropy_Source>(new Getentropy);
+ }
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM)
+ if(name == "dev_random")
+ {
+ return std::unique_ptr<Entropy_Source>(new Device_EntropySource(BOTAN_SYSTEM_RNG_POLL_DEVICES));
+ }
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_PROC_WALKER)
+ if(name == "proc_walk")
+ {
+ const std::string root_dir = BOTAN_ENTROPY_PROC_FS_PATH;
+ if(!root_dir.empty())
+ return std::unique_ptr<Entropy_Source>(new ProcWalking_EntropySource(root_dir));
+ }
+#endif
+
+#if defined(BOTAN_HAS_ENTROPY_SRC_WIN32)
+ if(name == "system_stats")
+ {
+ return std::unique_ptr<Entropy_Source>(new Win32_EntropySource);
+ }
+#endif
+
+ BOTAN_UNUSED(name);
+ return std::unique_ptr<Entropy_Source>();
+ }
+
+void Entropy_Sources::add_source(std::unique_ptr<Entropy_Source> src)
+ {
+ if(src.get())
+ {
+ m_srcs.push_back(std::move(src));
+ }
+ }
+
+std::vector<std::string> Entropy_Sources::enabled_sources() const
+ {
+ std::vector<std::string> sources;
+ for(size_t i = 0; i != m_srcs.size(); ++i)
+ {
+ sources.push_back(m_srcs[i]->name());
+ }
+ return sources;
+ }
+
+size_t Entropy_Sources::poll(RandomNumberGenerator& rng,
+ size_t poll_bits,
+ std::chrono::milliseconds timeout)
+ {
+ typedef std::chrono::system_clock clock;
+
+ auto deadline = clock::now() + timeout;
+
+ size_t bits_collected = 0;
+
+ for(size_t i = 0; i != m_srcs.size(); ++i)
+ {
+ bits_collected += m_srcs[i]->poll(rng);
+
+ if (bits_collected >= poll_bits || clock::now() > deadline)
+ break;
+ }
+
+ return bits_collected;
+ }
+
+size_t Entropy_Sources::poll_just(RandomNumberGenerator& rng, const std::string& the_src)
+ {
+ for(size_t i = 0; i != m_srcs.size(); ++i)
+ {
+ if(m_srcs[i]->name() == the_src)
+ {
+ return m_srcs[i]->poll(rng);
+ }
+ }
+
+ return 0;
+ }
+
+Entropy_Sources::Entropy_Sources(const std::vector<std::string>& sources)
+ {
+ for(auto&& src_name : sources)
+ {
+ add_source(Entropy_Source::create(src_name));
+ }
+ }
+
+Entropy_Sources& Entropy_Sources::global_sources()
+ {
+ static Entropy_Sources global_entropy_sources(BOTAN_ENTROPY_DEFAULT_SOURCES);
+
+ return global_entropy_sources;
+ }
+
+}
+