• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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