From f761cdeebd768be441ca1ba4a1c9107099b6aab4 Mon Sep 17 00:00:00 2001 From: John Sebastian Peterson Date: Tue, 10 Mar 2015 05:08:23 +0100 Subject: [PATCH 1/4] Port to Windows Runtime --- include/boost/random/detail/config.hpp | 10 +++++++++ src/random_device.cpp | 29 +++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/include/boost/random/detail/config.hpp b/include/boost/random/detail/config.hpp index 724ab19452..cdaf0c30f8 100644 --- a/include/boost/random/detail/config.hpp +++ b/include/boost/random/detail/config.hpp @@ -16,3 +16,13 @@ && !defined(BOOST_MSVC) #define BOOST_RANDOM_NO_STREAM_OPERATORS #endif + +// WinRT target. +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) +# if defined(__cplusplus_winrt) +# include +# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) +# define BOOST_RANDOM_WINDOWS_RUNTIME 1 +# endif +# endif +#endif diff --git a/src/random_device.cpp b/src/random_device.cpp index c1be9fed8d..10ccdaf7ed 100644 --- a/src/random_device.cpp +++ b/src/random_device.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -29,9 +30,15 @@ const bool boost::random::random_device::has_fixed_range; #if defined(BOOST_WINDOWS) +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) #include #include #include // std::invalid_argument +#else +#include +using namespace Windows::Security::Cryptography; +using namespace Windows::Storage::Streams; +#endif #define BOOST_AUTO_LINK_NOMANGLE #define BOOST_LIB_NAME "Advapi32" @@ -59,15 +66,18 @@ CryptEnumProvidersA( #endif namespace { - +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) const char * const default_token = MS_DEF_PROV_A; - +#else +const char * const default_token = ""; +#endif } class boost::random::random_device::impl { public: impl(const std::string & token) : provider(token) { +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) char buffer[80]; DWORD type; DWORD len; @@ -88,24 +98,36 @@ class boost::random::random_device::impl CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { error("Could not acquire CSP context"); } +#endif } +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) ~impl() { if(!CryptReleaseContext(hProv, 0)) error("Could not release CSP context"); } +#endif unsigned int next() { unsigned int result; +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) if(!CryptGenRandom(hProv, sizeof(result), static_cast(static_cast(&result)))) { error("error while reading"); } +#else + auto buffer = CryptographicBuffer::GenerateRandom(sizeof(result)); + auto reader = DataReader::FromBuffer(buffer); + std::vector data(reader->UnconsumedBufferLength); + reader->ReadBytes(Platform::ArrayReference(&data[0], data.size())); + memcpy(&result, data.data(), sizeof(result)); +#endif return result; } private: +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) void error(const char * msg) { DWORD error_code = GetLastError(); boost::throw_exception( @@ -114,8 +136,9 @@ class boost::random::random_device::impl std::string("boost::random_device: ") + msg + " Cryptographic Service Provider " + provider)); } - const std::string provider; HCRYPTPROV hProv; +#endif + const std::string provider; }; #else From e00f52bb24594d856e98a8e10957c9ff310bb222 Mon Sep 17 00:00:00 2001 From: John Sebastian Peterson Date: Tue, 10 Mar 2015 06:13:19 +0100 Subject: [PATCH 2/4] Change from vector to Array in WinRT random device --- src/random_device.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/random_device.cpp b/src/random_device.cpp index 10ccdaf7ed..7d4c59d223 100644 --- a/src/random_device.cpp +++ b/src/random_device.cpp @@ -35,9 +35,8 @@ const bool boost::random::random_device::has_fixed_range; #include #include // std::invalid_argument #else -#include +using namespace Platform; using namespace Windows::Security::Cryptography; -using namespace Windows::Storage::Streams; #endif #define BOOST_AUTO_LINK_NOMANGLE @@ -117,10 +116,9 @@ class boost::random::random_device::impl } #else auto buffer = CryptographicBuffer::GenerateRandom(sizeof(result)); - auto reader = DataReader::FromBuffer(buffer); - std::vector data(reader->UnconsumedBufferLength); - reader->ReadBytes(Platform::ArrayReference(&data[0], data.size())); - memcpy(&result, data.data(), sizeof(result)); + auto data = ref new Array(buffer->Length); + CryptographicBuffer::CopyToByteArray(buffer, &data); + memcpy(&result, data->begin(), data->end() - data->begin()); #endif return result; From b7e670782700618f796668a7e5dffa52a3161494 Mon Sep 17 00:00:00 2001 From: John Sebastian Peterson Date: Thu, 12 Mar 2015 00:08:49 +0100 Subject: [PATCH 3/4] Remove WinRT macro from config because it's rarely used --- include/boost/random/detail/config.hpp | 10 ---------- src/random_device.cpp | 13 ++++++------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/include/boost/random/detail/config.hpp b/include/boost/random/detail/config.hpp index cdaf0c30f8..724ab19452 100644 --- a/include/boost/random/detail/config.hpp +++ b/include/boost/random/detail/config.hpp @@ -16,13 +16,3 @@ && !defined(BOOST_MSVC) #define BOOST_RANDOM_NO_STREAM_OPERATORS #endif - -// WinRT target. -#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) -# if defined(__cplusplus_winrt) -# include -# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) -# define BOOST_RANDOM_WINDOWS_RUNTIME 1 -# endif -# endif -#endif diff --git a/src/random_device.cpp b/src/random_device.cpp index 7d4c59d223..8287550ef2 100644 --- a/src/random_device.cpp +++ b/src/random_device.cpp @@ -14,7 +14,6 @@ #include #include -#include #include #include #include @@ -30,7 +29,7 @@ const bool boost::random::random_device::has_fixed_range; #if defined(BOOST_WINDOWS) -#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) +#if !defined(WINAPI_FAMILY_APP) #include #include #include // std::invalid_argument @@ -65,7 +64,7 @@ CryptEnumProvidersA( #endif namespace { -#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) +#if !defined(WINAPI_FAMILY_APP) const char * const default_token = MS_DEF_PROV_A; #else const char * const default_token = ""; @@ -76,7 +75,7 @@ class boost::random::random_device::impl { public: impl(const std::string & token) : provider(token) { -#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) +#if !defined(WINAPI_FAMILY_APP) char buffer[80]; DWORD type; DWORD len; @@ -100,7 +99,7 @@ class boost::random::random_device::impl #endif } -#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) +#if !defined(WINAPI_FAMILY_APP) ~impl() { if(!CryptReleaseContext(hProv, 0)) error("Could not release CSP context"); } @@ -109,7 +108,7 @@ class boost::random::random_device::impl unsigned int next() { unsigned int result; -#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) +#if !defined(WINAPI_FAMILY_APP) if(!CryptGenRandom(hProv, sizeof(result), static_cast(static_cast(&result)))) { error("error while reading"); @@ -125,7 +124,7 @@ class boost::random::random_device::impl } private: -#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) +#if !defined(WINAPI_FAMILY_APP) void error(const char * msg) { DWORD error_code = GetLastError(); boost::throw_exception( From fea49e7d52f4603fe4cad4eeba79feebfd49e69f Mon Sep 17 00:00:00 2001 From: John Sebastian Peterson Date: Fri, 13 Mar 2015 23:18:33 +0100 Subject: [PATCH 4/4] Fix non-WinRT builds --- src/random_device.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/random_device.cpp b/src/random_device.cpp index 8287550ef2..e80c9fa01e 100644 --- a/src/random_device.cpp +++ b/src/random_device.cpp @@ -26,10 +26,19 @@ const bool boost::random::random_device::has_fixed_range; #endif +// WinRT target. +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) +# if defined(__cplusplus_winrt) +# include +# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) +# define BOOST_RANDOM_WINDOWS_RUNTIME 1 +# endif +# endif +#endif #if defined(BOOST_WINDOWS) -#if !defined(WINAPI_FAMILY_APP) +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) #include #include #include // std::invalid_argument @@ -64,7 +73,7 @@ CryptEnumProvidersA( #endif namespace { -#if !defined(WINAPI_FAMILY_APP) +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) const char * const default_token = MS_DEF_PROV_A; #else const char * const default_token = ""; @@ -75,7 +84,7 @@ class boost::random::random_device::impl { public: impl(const std::string & token) : provider(token) { -#if !defined(WINAPI_FAMILY_APP) +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) char buffer[80]; DWORD type; DWORD len; @@ -99,7 +108,7 @@ class boost::random::random_device::impl #endif } -#if !defined(WINAPI_FAMILY_APP) +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) ~impl() { if(!CryptReleaseContext(hProv, 0)) error("Could not release CSP context"); } @@ -108,7 +117,7 @@ class boost::random::random_device::impl unsigned int next() { unsigned int result; -#if !defined(WINAPI_FAMILY_APP) +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) if(!CryptGenRandom(hProv, sizeof(result), static_cast(static_cast(&result)))) { error("error while reading"); @@ -124,7 +133,7 @@ class boost::random::random_device::impl } private: -#if !defined(WINAPI_FAMILY_APP) +#if !defined(BOOST_RANDOM_WINDOWS_RUNTIME) void error(const char * msg) { DWORD error_code = GetLastError(); boost::throw_exception(