1 /*
2 * Copyright 2014 Antony Polukhin
3 * Copyright 2015 Andrey Semashev
4 *
5 * Distributed under the Boost Software License, Version 1.0.
6 * See http://www.boost.org/LICENSE_1_0.txt
7 */
8
9 #ifndef BOOST_WINAPI_CRYPT_HPP_INCLUDED_
10 #define BOOST_WINAPI_CRYPT_HPP_INCLUDED_
11
12 #include <boost/winapi/basic_types.hpp>
13 #if defined( BOOST_USE_WINDOWS_H )
14 // This header is not always included as part of windows.h
15 #include <wincrypt.h>
16 #endif
17 #include <boost/winapi/detail/header.hpp>
18
19 #ifdef BOOST_HAS_PRAGMA_ONCE
20 #pragma once
21 #endif
22
23 #if !defined( BOOST_USE_WINDOWS_H )
24 namespace boost { namespace winapi {
25 typedef ULONG_PTR_ HCRYPTPROV_;
26 }}
27
28 extern "C" {
29 #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
30 #if !defined( BOOST_NO_ANSI_APIS )
31 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
32 CryptEnumProvidersA(
33 boost::winapi::DWORD_ dwIndex,
34 boost::winapi::DWORD_ *pdwReserved,
35 boost::winapi::DWORD_ dwFlags,
36 boost::winapi::DWORD_ *pdwProvType,
37 boost::winapi::LPSTR_ szProvName,
38 boost::winapi::DWORD_ *pcbProvName);
39
40 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
41 CryptAcquireContextA(
42 boost::winapi::HCRYPTPROV_ *phProv,
43 boost::winapi::LPCSTR_ pszContainer,
44 boost::winapi::LPCSTR_ pszProvider,
45 boost::winapi::DWORD_ dwProvType,
46 boost::winapi::DWORD_ dwFlags);
47 #endif // !defined( BOOST_NO_ANSI_APIS )
48
49 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
50 CryptEnumProvidersW(
51 boost::winapi::DWORD_ dwIndex,
52 boost::winapi::DWORD_ *pdwReserved,
53 boost::winapi::DWORD_ dwFlags,
54 boost::winapi::DWORD_ *pdwProvType,
55 boost::winapi::LPWSTR_ szProvName,
56 boost::winapi::DWORD_ *pcbProvName);
57
58 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
59 CryptAcquireContextW(
60 boost::winapi::HCRYPTPROV_ *phProv,
61 boost::winapi::LPCWSTR_ szContainer,
62 boost::winapi::LPCWSTR_ szProvider,
63 boost::winapi::DWORD_ dwProvType,
64 boost::winapi::DWORD_ dwFlags);
65
66 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
67 CryptGenRandom(
68 boost::winapi::HCRYPTPROV_ hProv,
69 boost::winapi::DWORD_ dwLen,
70 boost::winapi::BYTE_ *pbBuffer);
71 #endif // BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
72
73 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
74 #if defined(_MSC_VER) && (_MSC_VER+0) >= 1500 && (_MSC_VER+0) < 1900 && BOOST_USE_NTDDI_VERSION < BOOST_WINAPI_NTDDI_WINXP
75 // Standalone MS Windows SDK 6.0A and later until 10.0 provide a different declaration of CryptReleaseContext for Windows 2000 and older.
76 // 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,
77 // and (c) MSVC 14.0 and later, which are used with Windows SDK 10.
78 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
79 CryptReleaseContext(
80 boost::winapi::HCRYPTPROV_ hProv,
81 boost::winapi::ULONG_PTR_ dwFlags);
82 #else
83 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
84 CryptReleaseContext(
85 boost::winapi::HCRYPTPROV_ hProv,
86 boost::winapi::DWORD_ dwFlags);
87 #endif
88 #endif // BOOST_WINAPI_PARTITION_APP_SYSTEM
89 }
90 #endif // !defined( BOOST_USE_WINDOWS_H )
91
92 namespace boost {
93 namespace winapi {
94
95 #if defined( BOOST_USE_WINDOWS_H )
96
97 typedef ::HCRYPTPROV HCRYPTPROV_;
98
99 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
100 BOOST_CONSTEXPR_OR_CONST DWORD_ PROV_RSA_FULL_ = PROV_RSA_FULL;
101
102 BOOST_CONSTEXPR_OR_CONST DWORD_ CRYPT_VERIFYCONTEXT_ = CRYPT_VERIFYCONTEXT;
103 BOOST_CONSTEXPR_OR_CONST DWORD_ CRYPT_NEWKEYSET_ = CRYPT_NEWKEYSET;
104 BOOST_CONSTEXPR_OR_CONST DWORD_ CRYPT_DELETEKEYSET_ = CRYPT_DELETEKEYSET;
105 BOOST_CONSTEXPR_OR_CONST DWORD_ CRYPT_MACHINE_KEYSET_ = CRYPT_MACHINE_KEYSET;
106 BOOST_CONSTEXPR_OR_CONST DWORD_ CRYPT_SILENT_ = CRYPT_SILENT;
107 #endif
108
109 #else
110
111 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
112 BOOST_CONSTEXPR_OR_CONST DWORD_ PROV_RSA_FULL_ = 1;
113
114 BOOST_CONSTEXPR_OR_CONST DWORD_ CRYPT_VERIFYCONTEXT_ = 0xF0000000;
115 BOOST_CONSTEXPR_OR_CONST DWORD_ CRYPT_NEWKEYSET_ = 8;
116 BOOST_CONSTEXPR_OR_CONST DWORD_ CRYPT_DELETEKEYSET_ = 16;
117 BOOST_CONSTEXPR_OR_CONST DWORD_ CRYPT_MACHINE_KEYSET_ = 32;
118 BOOST_CONSTEXPR_OR_CONST DWORD_ CRYPT_SILENT_ = 64;
119 #endif
120
121 #endif
122
123 #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
124
125 #if !defined( BOOST_NO_ANSI_APIS )
126 using ::CryptEnumProvidersA;
127 using ::CryptAcquireContextA;
128 #endif
129 using ::CryptEnumProvidersW;
130 using ::CryptAcquireContextW;
131 using ::CryptGenRandom;
132
133 #if !defined( BOOST_NO_ANSI_APIS )
crypt_enum_providers(DWORD_ dwIndex,DWORD_ * pdwReserved,DWORD_ dwFlags,DWORD_ * pdwProvType,LPSTR_ szProvName,DWORD_ * pcbProvName)134 BOOST_FORCEINLINE BOOL_ crypt_enum_providers(
135 DWORD_ dwIndex,
136 DWORD_ *pdwReserved,
137 DWORD_ dwFlags,
138 DWORD_ *pdwProvType,
139 LPSTR_ szProvName,
140 DWORD_ *pcbProvName)
141 {
142 return ::CryptEnumProvidersA(dwIndex, pdwReserved, dwFlags, pdwProvType, szProvName, pcbProvName);
143 }
144
crypt_acquire_context(HCRYPTPROV_ * phProv,LPCSTR_ pszContainer,LPCSTR_ pszProvider,DWORD_ dwProvType,DWORD_ dwFlags)145 BOOST_FORCEINLINE BOOL_ crypt_acquire_context(
146 HCRYPTPROV_ *phProv,
147 LPCSTR_ pszContainer,
148 LPCSTR_ pszProvider,
149 DWORD_ dwProvType,
150 DWORD_ dwFlags)
151 {
152 return ::CryptAcquireContextA(phProv, pszContainer, pszProvider, dwProvType, dwFlags);
153 }
154 #endif
155
crypt_enum_providers(DWORD_ dwIndex,DWORD_ * pdwReserved,DWORD_ dwFlags,DWORD_ * pdwProvType,LPWSTR_ szProvName,DWORD_ * pcbProvName)156 BOOST_FORCEINLINE BOOL_ crypt_enum_providers(
157 DWORD_ dwIndex,
158 DWORD_ *pdwReserved,
159 DWORD_ dwFlags,
160 DWORD_ *pdwProvType,
161 LPWSTR_ szProvName,
162 DWORD_ *pcbProvName)
163 {
164 return ::CryptEnumProvidersW(dwIndex, pdwReserved, dwFlags, pdwProvType, szProvName, pcbProvName);
165 }
166
crypt_acquire_context(HCRYPTPROV_ * phProv,LPCWSTR_ szContainer,LPCWSTR_ szProvider,DWORD_ dwProvType,DWORD_ dwFlags)167 BOOST_FORCEINLINE BOOL_ crypt_acquire_context(
168 HCRYPTPROV_ *phProv,
169 LPCWSTR_ szContainer,
170 LPCWSTR_ szProvider,
171 DWORD_ dwProvType,
172 DWORD_ dwFlags)
173 {
174 return ::CryptAcquireContextW(phProv, szContainer, szProvider, dwProvType, dwFlags);
175 }
176
177 #endif // BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
178
179 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
CryptReleaseContext(HCRYPTPROV_ hProv,DWORD_ dwFlags)180 BOOST_FORCEINLINE BOOL_ CryptReleaseContext(HCRYPTPROV_ hProv, DWORD_ dwFlags)
181 {
182 return ::CryptReleaseContext(hProv, dwFlags);
183 }
184 #endif
185
186 }
187 }
188
189 #include <boost/winapi/detail/footer.hpp>
190
191 #endif // BOOST_WINAPI_CRYPT_HPP_INCLUDED_
192