Seed randomSeed() { std::array <std::uint8_t, 16> buffer; beast::rngfill ( buffer.data(), buffer.size(), crypto_prng()); Seed seed (makeSlice (buffer)); beast::secure_erase(buffer.data(), buffer.size()); return seed; }
void testGetValues() { testcase ("Get Values"); try { auto& engine = crypto_prng(); auto rand_val = engine(); BEAST_EXPECT(rand_val >= engine.min()); BEAST_EXPECT(rand_val <= engine.max()); uint16_t twoByte {0}; engine(&twoByte, sizeof(uint16_t)); pass(); } catch(std::exception&) { fail(); } }
void testSaveLoad() { testcase ("Save/Load State"); try { // create a temporary path to write crypto state files beast::temp_dir td; auto stateFile = boost::filesystem::path {td.file("cryptostate")}; auto& engine = crypto_prng(); engine.save_state(stateFile.string()); size_t size_before_load; std::string data_before_load, data_after_load; { boost::system::error_code ec; size_before_load = file_size(stateFile, ec); if(! BEAST_EXPECTS(!ec, ec.message())) return; if(! BEAST_EXPECT(size_before_load > 0)) return; std::ifstream ifs( stateFile.string(), std::ios::in | std::ios::binary); data_before_load = std::string{std::istreambuf_iterator<char>{ifs}, {}}; BEAST_EXPECT(data_before_load.size() == size_before_load); } engine.load_state(stateFile.string()); // load_state actually causes a new state file to be written // ...verify it has changed { boost::system::error_code ec; size_t size_after_load = file_size(stateFile, ec); if(! BEAST_EXPECTS(!ec, ec.message())) return; BEAST_EXPECT(size_after_load == size_before_load); std::ifstream ifs( stateFile.string(), std::ios::in | std::ios::binary); data_after_load = std::string{std::istreambuf_iterator<char>{ifs}, {}}; BEAST_EXPECT(data_after_load.size() == size_after_load); BEAST_EXPECT(data_after_load != data_before_load); } // verify the loaded engine works engine(); pass(); } catch(std::exception&) { fail(); } }