diff --git a/Builds/VisualStudio2015/RippleD.vcxproj b/Builds/VisualStudio2015/RippleD.vcxproj
index 43674ff01..42a7675f4 100644
--- a/Builds/VisualStudio2015/RippleD.vcxproj
+++ b/Builds/VisualStudio2015/RippleD.vcxproj
@@ -4415,6 +4415,10 @@
True
True
+
+ True
+ True
+
True
True
diff --git a/Builds/VisualStudio2015/RippleD.vcxproj.filters b/Builds/VisualStudio2015/RippleD.vcxproj.filters
index 4d8af37ae..05a39cca8 100644
--- a/Builds/VisualStudio2015/RippleD.vcxproj.filters
+++ b/Builds/VisualStudio2015/RippleD.vcxproj.filters
@@ -5160,6 +5160,9 @@
test\core
+
+ test\core
+
test\core
diff --git a/src/test/core/CryptoPRNG_test.cpp b/src/test/core/CryptoPRNG_test.cpp
new file mode 100644
index 000000000..3f5d22e53
--- /dev/null
+++ b/src/test/core/CryptoPRNG_test.cpp
@@ -0,0 +1,125 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of rippled: https://github.com/ripple/rippled
+ Copyright (c) 2012-2017 Ripple Labs Inc.
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+//==============================================================================
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace ripple {
+
+class CryptoPRNG_test : public beast::unit_test::suite
+{
+ 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{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{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();
+ }
+ }
+
+public:
+ void run ()
+ {
+ testGetValues();
+ testSaveLoad();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE (CryptoPRNG, core, ripple);
+
+} // ripple
diff --git a/src/test/unity/core_test_unity.cpp b/src/test/unity/core_test_unity.cpp
index b7f77069b..c6fea7810 100644
--- a/src/test/unity/core_test_unity.cpp
+++ b/src/test/unity/core_test_unity.cpp
@@ -20,9 +20,10 @@
#include
#include
+#include
#include
#include
#include
#include
#include
-#include
\ No newline at end of file
+#include