123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- //
- // Copyright (c) 2017 James E. King III
- //
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt or copy at
- // https://www.boost.org/LICENSE_1_0.txt)
- //
- // The contents of this file are compiled into a loadable
- // library that is used for mocking purposes so that the error
- // paths in the random_provider implementations are exercised.
- //
- #include <boost/config.hpp>
- #include <boost/core/ignore_unused.hpp>
- #if defined(BOOST_WINDOWS)
- #include <boost/winapi/basic_types.hpp>
- // WinAPI is not currently set up well for building mocks, as
- // the definitions of wincrypt APIs all use BOOST_SYMBOL_IMPORT
- // therefore we cannot include it, but we need some of the types
- // so they are defined here...
- namespace boost {
- namespace winapi {
- typedef ULONG_PTR_ HCRYPTPROV_;
- }
- }
- // wincrypt has to be mocked through a DLL pretending to be
- // the real thing as the official APIs use __declspec(dllimport)
- #include <deque>
- std::deque<boost::winapi::BOOL_> wincrypt_next_result;
- BOOST_SYMBOL_EXPORT bool expectations_capable()
- {
- return true;
- }
- BOOST_SYMBOL_EXPORT bool expectations_met()
- {
- return wincrypt_next_result.empty();
- }
- BOOST_SYMBOL_EXPORT void expect_next_call_success(bool success)
- {
- wincrypt_next_result.push_back(success ? 1 : 0);
- }
- BOOST_SYMBOL_EXPORT bool provider_acquires_context()
- {
- return true;
- }
- extern "C" {
- BOOST_SYMBOL_EXPORT
- boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
- CryptAcquireContextW(
- boost::winapi::HCRYPTPROV_ *phProv,
- boost::winapi::LPCWSTR_ szContainer,
- boost::winapi::LPCWSTR_ szProvider,
- boost::winapi::DWORD_ dwProvType,
- boost::winapi::DWORD_ dwFlags)
- {
- boost::ignore_unused(phProv);
- boost::ignore_unused(szContainer);
- boost::ignore_unused(szProvider);
- boost::ignore_unused(dwProvType);
- boost::ignore_unused(dwFlags);
- boost::winapi::BOOL_ result = wincrypt_next_result.front();
- wincrypt_next_result.pop_front();
- return result;
- }
- BOOST_SYMBOL_EXPORT
- boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
- CryptGenRandom(
- boost::winapi::HCRYPTPROV_ hProv,
- boost::winapi::DWORD_ dwLen,
- boost::winapi::BYTE_ *pbBuffer)
- {
- boost::ignore_unused(hProv);
- boost::ignore_unused(dwLen);
- boost::ignore_unused(pbBuffer);
- boost::winapi::BOOL_ result = wincrypt_next_result.front();
- wincrypt_next_result.pop_front();
- return result;
- }
- // the implementation ignores the result of close because it
- // happens in a destructor
- BOOST_SYMBOL_EXPORT
- boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
- CryptReleaseContext(
- boost::winapi::HCRYPTPROV_ hProv,
- #if defined(_MSC_VER) && (_MSC_VER+0) >= 1500 && (_MSC_VER+0) < 1900 && BOOST_USE_NTDDI_VERSION < BOOST_WINAPI_NTDDI_WINXP
- // see winapi crypt.hpp for more details on why these differ...
- boost::winapi::ULONG_PTR_ dwFlags
- #else
- boost::winapi::DWORD_ dwFlags
- #endif
- )
- {
- boost::ignore_unused(hProv);
- boost::ignore_unused(dwFlags);
- return true;
- }
- } // end extern "C"
- #endif
|