surtur
795b9ffe54
All checks were successful
continuous-integration/drone/push Build is passing
a couple of fixes/necessary additions were made along the way, namely: * add a default constructor for DoTask * rework of the mutex/lock_guard/unique_lock logic in generator/fortuna * add .fortuna.seed to the list of the ignored (.gitignore) * add helper function to util for convertin bytes to blocks (16b==block) * add a wrapper for around the SeedFileManager instance and a way to see if it's dead or alive (so that it can be restarted if needed) * the timeout for saving of the seed file has been decreased to a more reasonable value than 10 minutes (I wouldn't want to lose potentially up to 10 minutes worth of entropy)
64 lines
1.3 KiB
C++
64 lines
1.3 KiB
C++
#ifndef FORTUNA_GENERATOR_H
|
|
#define FORTUNA_GENERATOR_H
|
|
|
|
#include <cryptopp/cryptlib.h>
|
|
#include <cryptopp/secblock.h>
|
|
|
|
#include <chrono>
|
|
#include <mutex>
|
|
#include <string>
|
|
|
|
namespace fortuna {
|
|
namespace generator {
|
|
|
|
class Generator {
|
|
public:
|
|
std::chrono::milliseconds reseed_interval{100};
|
|
std::mutex mtx;
|
|
std::mutex crypt_mtx;
|
|
std::mutex reseed_mtx;
|
|
|
|
Generator(); // ad noexcept: perhaps _do_ throw*
|
|
Generator(const Generator& Gen) = delete; // no
|
|
Generator& operator=(const Generator& Gen) = delete; // copies
|
|
~Generator() noexcept;
|
|
|
|
/* n is the number of random bytes to generate */
|
|
auto generate_random_data(uint n) -> std::string;
|
|
|
|
auto reseed(const std::string& s) -> void;
|
|
|
|
auto time_to_reseed() const -> bool;
|
|
|
|
auto is_seeded() const -> bool {
|
|
return !(this->G.ctr == 0x00);
|
|
}
|
|
|
|
|
|
private:
|
|
struct G_state {
|
|
// 32*8
|
|
static constexpr const std::size_t k_length{32};
|
|
CryptoPP::FixedSizeSecBlock<CryptoPP::byte, k_length> k;
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic ignored "-Wpedantic"
|
|
unsigned __int128 ctr;
|
|
#pragma GCC diagnostic pop
|
|
};
|
|
G_state G;
|
|
|
|
void initialize_generator();
|
|
|
|
auto do_crypto() -> std::string;
|
|
|
|
auto generate_blocks(unsigned int k_blocks) -> std::string;
|
|
|
|
protected:
|
|
auto get_state() const -> Generator::G_state;
|
|
|
|
}; // class generator
|
|
|
|
} //namespace generator
|
|
} //namespace fortuna
|
|
#endif//FORTUNA_GENERATOR_H
|