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