This repository has been archived on 2022-02-10. You can view files and clone it, but cannot push or open issues or pull requests.
fortuna/generator.h

70 lines
1.7 KiB
C
Raw Normal View History

2021-10-19 15:05:18 +02:00
#ifndef FORTUNA_GENERATOR_H
#define FORTUNA_GENERATOR_H
#include <cryptopp/cryptlib.h>
#include <cryptopp/secblock.h>
#include <chrono>
#include <cstdint>
#include <mutex>
#include <string>
2021-10-19 15:05:18 +02:00
namespace fortuna {
namespace generator {
class Generator {
public:
std::chrono::milliseconds reseed_interval{100};
mutable std::recursive_mutex mtx;
std::mutex crypt_mtx;
std::mutex reseed_mtx;
Generator(); // ad noexcept: perhaps _do_ throw*
2022-01-03 01:02:53 +01:00
Generator(const Generator& Gen) = delete; // no
Generator& operator=(const Generator& Gen) = delete; // copies
2021-12-11 20:43:48 +01:00
~Generator() noexcept;
/* n is the number of random bytes to generate */
2022-01-17 07:22:19 +01:00
auto generate_random_data(const unsigned int& n) -> std::string;
2021-10-19 15:05:18 +02:00
auto reseed(const std::string& s) -> void;
[[optimize_for_synchronized]] auto time_to_reseed(
const uint64_t& pool0_len,
const unsigned int& min_p_size,
const std::chrono::duration<int64_t, std::ratio<1, 1000>>& time_elapsed,
const std::chrono::milliseconds& reseed_interval) const -> bool;
2021-12-12 18:40:29 +01:00
auto is_seeded() const -> bool {
std::lock_guard<std::recursive_mutex> lg(mtx);
2021-12-12 18:40:29 +01:00
return !(this->G.ctr == 0x00);
}
2021-12-12 18:40:29 +01:00
private:
struct G_state {
// 32*8
static constexpr const std::size_t k_length{32};
CryptoPP::FixedSizeSecBlock<CryptoPP::byte, k_length> k;
2022-01-10 04:25:03 +01:00
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
unsigned __int128 ctr;
2022-01-10 04:25:03 +01:00
#pragma GCC diagnostic pop
};
G_state G;
void initialize_generator();
2021-10-24 22:11:29 +02:00
auto do_crypto() -> std::string;
2021-10-19 15:05:18 +02:00
auto generate_blocks(unsigned int k_blocks) -> std::string;
protected:
2022-01-06 16:47:46 +01:00
auto get_state() const -> Generator::G_state;
}; // class generator
2021-10-19 15:05:18 +02:00
2022-01-10 04:25:03 +01:00
} // namespace generator
} // namespace fortuna
#endif // FORTUNA_GENERATOR_H