2 * Copyright 2014 Antony Polukhin
3 * Copyright 2015 Andrey Semashev
5 * Distributed under the Boost Software License, Version 1.0.
6 * See http://www.boost.org/LICENSE_1_0.txt
9 #ifndef BOOST_WINAPI_CRYPT_HPP_INCLUDED_
10 #define BOOST_WINAPI_CRYPT_HPP_INCLUDED_
12 #include <boost/winapi/basic_types.hpp>
13 #include <boost/winapi/detail/cast_ptr.hpp>
14 #if defined( BOOST_USE_WINDOWS_H )
15 // This header is not always included as part of windows.h
19 #ifdef BOOST_HAS_PRAGMA_ONCE
23 #if !defined( BOOST_USE_WINDOWS_H )
24 namespace boost { namespace winapi {
25 typedef ULONG_PTR_ HCRYPTPROV_;
28 // Some versions of MinGW contain buggy declarations of CryptEnumProvidersA and CryptEnumProvidersW.
29 // We cannot detect those broken versions, and we can't include the system header because it's incomplete.
30 // So below we duplicate the broken declarations here and work around the problem with cast_ptr. These declarations
31 // will have to be removed when MinGW is fixed.
33 // @@@ Looks like mingw 5.0-dev has this fixed and possibly in a 3.2x late release as well
34 // See: https://sourceforge.net/p/mingw/bugs/2263/
37 #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
38 #if !defined( BOOST_NO_ANSI_APIS )
39 #if !defined( BOOST_WINAPI_IS_MINGW ) || !defined( UNICODE )
40 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ WINAPI
42 boost::winapi::DWORD_ dwIndex,
43 boost::winapi::DWORD_ *pdwReserved,
44 boost::winapi::DWORD_ dwFlags,
45 boost::winapi::DWORD_ *pdwProvType,
46 boost::winapi::LPSTR_ szProvName,
47 boost::winapi::DWORD_ *pcbProvName);
49 // Broken declaration in MinGW
50 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ WINAPI
52 boost::winapi::DWORD_ dwIndex,
53 boost::winapi::DWORD_ *pdwReserved,
54 boost::winapi::DWORD_ dwFlags,
55 boost::winapi::DWORD_ *pdwProvType,
56 boost::winapi::LPWSTR_ szProvName,
57 boost::winapi::DWORD_ *pcbProvName);
60 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ WINAPI
62 boost::winapi::HCRYPTPROV_ *phProv,
63 boost::winapi::LPCSTR_ pszContainer,
64 boost::winapi::LPCSTR_ pszProvider,
65 boost::winapi::DWORD_ dwProvType,
66 boost::winapi::DWORD_ dwFlags);
67 #endif // !defined( BOOST_NO_ANSI_APIS )
69 #if !defined( BOOST_WINAPI_IS_MINGW ) || defined( UNICODE )
70 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ WINAPI
72 boost::winapi::DWORD_ dwIndex,
73 boost::winapi::DWORD_ *pdwReserved,
74 boost::winapi::DWORD_ dwFlags,
75 boost::winapi::DWORD_ *pdwProvType,
76 boost::winapi::LPWSTR_ szProvName,
77 boost::winapi::DWORD_ *pcbProvName);
79 // Broken declaration in MinGW
80 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ WINAPI
82 boost::winapi::DWORD_ dwIndex,
83 boost::winapi::DWORD_ *pdwReserved,
84 boost::winapi::DWORD_ dwFlags,
85 boost::winapi::DWORD_ *pdwProvType,
86 boost::winapi::LPSTR_ szProvName,
87 boost::winapi::DWORD_ *pcbProvName);
90 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ WINAPI
92 boost::winapi::HCRYPTPROV_ *phProv,
93 boost::winapi::LPCWSTR_ szContainer,
94 boost::winapi::LPCWSTR_ szProvider,
95 boost::winapi::DWORD_ dwProvType,
96 boost::winapi::DWORD_ dwFlags);
98 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ WINAPI
100 boost::winapi::HCRYPTPROV_ hProv,
101 boost::winapi::DWORD_ dwLen,
102 boost::winapi::BYTE_ *pbBuffer);
103 #endif // BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
105 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
106 #if defined(_MSC_VER) && (_MSC_VER+0) >= 1500 && (_MSC_VER+0) < 1900 && BOOST_USE_NTDDI_VERSION < BOOST_WINAPI_NTDDI_WINXP
107 // Standalone MS Windows SDK 6.0A and later until 10.0 provide a different declaration of CryptReleaseContext for Windows 2000 and older.
108 // This is not the case for (a) MinGW and MinGW-w64, (b) MSVC 7.1 and 8, which are shipped with their own Windows SDK,
109 // and (c) MSVC 14.0 and later, which are used with Windows SDK 10.
110 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ WINAPI
112 boost::winapi::HCRYPTPROV_ hProv,
113 boost::winapi::ULONG_PTR_ dwFlags);
115 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ WINAPI
117 boost::winapi::HCRYPTPROV_ hProv,
118 boost::winapi::DWORD_ dwFlags);
120 #endif // BOOST_WINAPI_PARTITION_APP_SYSTEM
122 #endif // !defined( BOOST_USE_WINDOWS_H )
127 #if defined( BOOST_USE_WINDOWS_H )
129 typedef ::HCRYPTPROV HCRYPTPROV_;
131 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
132 const DWORD_ PROV_RSA_FULL_ = PROV_RSA_FULL;
134 const DWORD_ CRYPT_VERIFYCONTEXT_ = CRYPT_VERIFYCONTEXT;
135 const DWORD_ CRYPT_NEWKEYSET_ = CRYPT_NEWKEYSET;
136 const DWORD_ CRYPT_DELETEKEYSET_ = CRYPT_DELETEKEYSET;
137 const DWORD_ CRYPT_MACHINE_KEYSET_ = CRYPT_MACHINE_KEYSET;
138 const DWORD_ CRYPT_SILENT_ = CRYPT_SILENT;
143 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
144 const DWORD_ PROV_RSA_FULL_ = 1;
146 const DWORD_ CRYPT_VERIFYCONTEXT_ = 0xF0000000;
147 const DWORD_ CRYPT_NEWKEYSET_ = 8;
148 const DWORD_ CRYPT_DELETEKEYSET_ = 16;
149 const DWORD_ CRYPT_MACHINE_KEYSET_ = 32;
150 const DWORD_ CRYPT_SILENT_ = 64;
155 #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
157 #if !defined( BOOST_NO_ANSI_APIS )
158 using ::CryptAcquireContextA;
160 using ::CryptAcquireContextW;
161 using ::CryptGenRandom;
163 #if !defined( BOOST_NO_ANSI_APIS )
164 BOOST_FORCEINLINE BOOL_ CryptEnumProvidersA(
172 return ::CryptEnumProvidersA(dwIndex, pdwReserved, dwFlags, pdwProvType, winapi::detail::cast_ptr(szProvName), pcbProvName);
175 BOOST_FORCEINLINE BOOL_ crypt_enum_providers(
183 return ::CryptEnumProvidersA(dwIndex, pdwReserved, dwFlags, pdwProvType, winapi::detail::cast_ptr(szProvName), pcbProvName);
186 BOOST_FORCEINLINE BOOL_ crypt_acquire_context(
188 LPCSTR_ pszContainer,
193 return ::CryptAcquireContextA(phProv, pszContainer, pszProvider, dwProvType, dwFlags);
197 BOOST_FORCEINLINE BOOL_ CryptEnumProvidersW(
205 return ::CryptEnumProvidersW(dwIndex, pdwReserved, dwFlags, pdwProvType, winapi::detail::cast_ptr(szProvName), pcbProvName);
208 BOOST_FORCEINLINE BOOL_ crypt_enum_providers(
216 return ::CryptEnumProvidersW(dwIndex, pdwReserved, dwFlags, pdwProvType, winapi::detail::cast_ptr(szProvName), pcbProvName);
219 BOOST_FORCEINLINE BOOL_ crypt_acquire_context(
221 LPCWSTR_ szContainer,
226 return ::CryptAcquireContextW(phProv, szContainer, szProvider, dwProvType, dwFlags);
229 #endif // BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
231 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
232 BOOST_FORCEINLINE BOOL_ CryptReleaseContext(HCRYPTPROV_ hProv, DWORD_ dwFlags)
234 return ::CryptReleaseContext(hProv, dwFlags);
241 #endif // BOOST_WINAPI_CRYPT_HPP_INCLUDED_