diff options
Diffstat (limited to 'src/libs/3rdparty/botan/src/lib/entropy/proc_walk/proc_walk.cpp')
-rw-r--r-- | src/libs/3rdparty/botan/src/lib/entropy/proc_walk/proc_walk.cpp | 154 |
1 files changed, 0 insertions, 154 deletions
diff --git a/src/libs/3rdparty/botan/src/lib/entropy/proc_walk/proc_walk.cpp b/src/libs/3rdparty/botan/src/lib/entropy/proc_walk/proc_walk.cpp deleted file mode 100644 index d780cbf739..0000000000 --- a/src/libs/3rdparty/botan/src/lib/entropy/proc_walk/proc_walk.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* -* Entropy source based on reading files in /proc on the assumption -* that a remote attacker will have difficulty guessing some of them. -* -* (C) 1999-2008,2012 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/internal/proc_walk.h> -#include <deque> - -#ifndef _POSIX_C_SOURCE - #define _POSIX_C_SOURCE 199309 -#endif - -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <dirent.h> -#include <fcntl.h> - -namespace Botan { - -namespace { - -class Directory_Walker final : public File_Descriptor_Source - { - public: - explicit Directory_Walker(const std::string& root) : - m_cur_dir(std::make_pair<DIR*, std::string>(nullptr, "")) - { - if(DIR* root_dir = ::opendir(root.c_str())) - m_cur_dir = std::make_pair(root_dir, root); - } - - ~Directory_Walker() - { - if(m_cur_dir.first) - ::closedir(m_cur_dir.first); - } - - int next_fd() override; - private: - std::pair<struct dirent*, std::string> get_next_dirent(); - - std::pair<DIR*, std::string> m_cur_dir; - std::deque<std::string> m_dirlist; - }; - -std::pair<struct dirent*, std::string> Directory_Walker::get_next_dirent() - { - while(m_cur_dir.first) - { - if(struct dirent* dir = ::readdir(m_cur_dir.first)) - return std::make_pair(dir, m_cur_dir.second); - - ::closedir(m_cur_dir.first); - m_cur_dir = std::make_pair<DIR*, std::string>(nullptr, ""); - - while(!m_dirlist.empty() && !m_cur_dir.first) - { - const std::string next_dir_name = m_dirlist[0]; - m_dirlist.pop_front(); - - if(DIR* next_dir = ::opendir(next_dir_name.c_str())) - m_cur_dir = std::make_pair(next_dir, next_dir_name); - } - } - - return std::make_pair<struct dirent*, std::string>(nullptr, ""); // nothing left - } - -int Directory_Walker::next_fd() - { - while(true) - { - std::pair<struct dirent*, std::string> entry = get_next_dirent(); - - if(!entry.first) - break; // no more dirs - - const std::string filename = entry.first->d_name; - - if(filename == "." || filename == "..") - continue; - - const std::string full_path = entry.second + "/" + filename; - - struct stat stat_buf; - if(::lstat(full_path.c_str(), &stat_buf) == -1) - continue; - - if(S_ISDIR(stat_buf.st_mode)) - { - m_dirlist.push_back(full_path); - } - else if(S_ISREG(stat_buf.st_mode) && (stat_buf.st_mode & S_IROTH)) - { - int fd = ::open(full_path.c_str(), O_RDONLY | O_NOCTTY); - - if(fd >= 0) - return fd; - } - } - - return -1; - } - -} - -size_t ProcWalking_EntropySource::poll(RandomNumberGenerator& rng) - { - const size_t MAX_FILES_READ_PER_POLL = 2048; - - lock_guard_type<mutex_type> lock(m_mutex); - - if(!m_dir) - m_dir.reset(new Directory_Walker(m_path)); - - m_buf.resize(4096); - - size_t bits = 0; - - for(size_t i = 0; i != MAX_FILES_READ_PER_POLL; ++i) - { - int fd = m_dir->next_fd(); - - // If we've exhaused this walk of the directory, halt the poll - if(fd == -1) - { - m_dir.reset(); - break; - } - - ssize_t got = ::read(fd, m_buf.data(), m_buf.size()); - ::close(fd); - - if(got > 0) - { - rng.add_entropy(m_buf.data(), static_cast<size_t>(got)); - - // Conservative estimate of 4 bits per file - bits += 4; - } - - if(bits > 128) - break; - } - - return bits; - } - -} |