1 /**
2  * FreeRDP: A Remote Desktop Protocol Implementation
3  * Security Support Provider Interface (SSPI)
4  *
5  * Copyright 2012-2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23 
24 #ifdef _WIN32
25 #define SEC_ENTRY __stdcall
26 #define SSPI_EXPORT __declspec(dllexport)
27 #else
28 #include <winpr/winpr.h>
29 #define SEC_ENTRY
30 #define SSPI_EXPORT WINPR_API
31 #endif
32 
33 #ifdef _WIN32
34 typedef long LONG;
35 typedef unsigned long ULONG;
36 #endif
37 typedef LONG SECURITY_STATUS;
38 
39 /**
40  * Standard SSPI API
41  */
42 
43 /* Package Management */
44 
45 extern SECURITY_STATUS SEC_ENTRY sspi_EnumerateSecurityPackagesW(void*, void*);
46 
EnumerateSecurityPackagesW(void * pcPackages,void * ppPackageInfo)47 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY EnumerateSecurityPackagesW(void* pcPackages,
48                                                                  void* ppPackageInfo)
49 {
50 	return sspi_EnumerateSecurityPackagesW(pcPackages, ppPackageInfo);
51 }
52 
53 extern SECURITY_STATUS SEC_ENTRY sspi_EnumerateSecurityPackagesA(void*, void*);
54 
EnumerateSecurityPackagesA(void * pcPackages,void * ppPackageInfo)55 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY EnumerateSecurityPackagesA(void* pcPackages,
56                                                                  void* ppPackageInfo)
57 {
58 	return sspi_EnumerateSecurityPackagesA(pcPackages, ppPackageInfo);
59 }
60 
61 extern void* SEC_ENTRY sspi_InitSecurityInterfaceW(void);
62 
InitSecurityInterfaceW(void)63 SSPI_EXPORT void* SEC_ENTRY InitSecurityInterfaceW(void)
64 {
65 	return sspi_InitSecurityInterfaceW();
66 }
67 
68 extern void* SEC_ENTRY sspi_InitSecurityInterfaceA(void);
69 
InitSecurityInterfaceA(void)70 SSPI_EXPORT void* SEC_ENTRY InitSecurityInterfaceA(void)
71 {
72 	return sspi_InitSecurityInterfaceA();
73 }
74 
75 extern SECURITY_STATUS SEC_ENTRY sspi_QuerySecurityPackageInfoW(void*, void*);
76 
QuerySecurityPackageInfoW(void * pszPackageName,void * ppPackageInfo)77 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY QuerySecurityPackageInfoW(void* pszPackageName,
78                                                                 void* ppPackageInfo)
79 {
80 	return sspi_QuerySecurityPackageInfoW(pszPackageName, ppPackageInfo);
81 }
82 
83 extern SECURITY_STATUS SEC_ENTRY sspi_QuerySecurityPackageInfoA(void*, void*);
84 
QuerySecurityPackageInfoA(void * pszPackageName,void * ppPackageInfo)85 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY QuerySecurityPackageInfoA(void* pszPackageName,
86                                                                 void* ppPackageInfo)
87 {
88 	return sspi_QuerySecurityPackageInfoA(pszPackageName, ppPackageInfo);
89 }
90 
91 /* Credential Management */
92 
93 extern SECURITY_STATUS SEC_ENTRY sspi_AcquireCredentialsHandleW(void*, void*, ULONG, void*, void*,
94                                                                 void*, void*, void*, void*);
95 
AcquireCredentialsHandleW(void * pszPrincipal,void * pszPackage,ULONG fCredentialUse,void * pvLogonID,void * pAuthData,void * pGetKeyFn,void * pvGetKeyArgument,void * phCredential,void * ptsExpiry)96 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY AcquireCredentialsHandleW(
97     void* pszPrincipal, void* pszPackage, ULONG fCredentialUse, void* pvLogonID, void* pAuthData,
98     void* pGetKeyFn, void* pvGetKeyArgument, void* phCredential, void* ptsExpiry)
99 {
100 	return sspi_AcquireCredentialsHandleW(pszPrincipal, pszPackage, fCredentialUse, pvLogonID,
101 	                                      pAuthData, pGetKeyFn, pvGetKeyArgument, phCredential,
102 	                                      ptsExpiry);
103 }
104 
105 extern SECURITY_STATUS SEC_ENTRY sspi_AcquireCredentialsHandleA(void*, void*, ULONG, void*, void*,
106                                                                 void*, void*, void*, void*);
107 
AcquireCredentialsHandleA(void * pszPrincipal,void * pszPackage,ULONG fCredentialUse,void * pvLogonID,void * pAuthData,void * pGetKeyFn,void * pvGetKeyArgument,void * phCredential,void * ptsExpiry)108 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY AcquireCredentialsHandleA(
109     void* pszPrincipal, void* pszPackage, ULONG fCredentialUse, void* pvLogonID, void* pAuthData,
110     void* pGetKeyFn, void* pvGetKeyArgument, void* phCredential, void* ptsExpiry)
111 {
112 	return sspi_AcquireCredentialsHandleA(pszPrincipal, pszPackage, fCredentialUse, pvLogonID,
113 	                                      pAuthData, pGetKeyFn, pvGetKeyArgument, phCredential,
114 	                                      ptsExpiry);
115 }
116 
117 extern SECURITY_STATUS SEC_ENTRY sspi_ExportSecurityContext(void*, ULONG, void*, void**);
118 
ExportSecurityContext(void * phContext,ULONG fFlags,void * pPackedContext,void ** pToken)119 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY ExportSecurityContext(void* phContext, ULONG fFlags,
120                                                             void* pPackedContext, void** pToken)
121 {
122 	return sspi_ExportSecurityContext(phContext, fFlags, pPackedContext, pToken);
123 }
124 
125 extern SECURITY_STATUS SEC_ENTRY sspi_FreeCredentialsHandle(void*);
126 
FreeCredentialsHandle(void * phCredential)127 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY FreeCredentialsHandle(void* phCredential)
128 {
129 	return sspi_FreeCredentialsHandle(phCredential);
130 }
131 
132 extern SECURITY_STATUS SEC_ENTRY sspi_ImportSecurityContextW(void*, void*, void*, void*);
133 
ImportSecurityContextW(void * pszPackage,void * pPackedContext,void * pToken,void * phContext)134 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY ImportSecurityContextW(void* pszPackage, void* pPackedContext,
135                                                              void* pToken, void* phContext)
136 {
137 	return sspi_ImportSecurityContextW(pszPackage, pPackedContext, pToken, phContext);
138 }
139 
140 extern SECURITY_STATUS SEC_ENTRY sspi_ImportSecurityContextA(void*, void*, void*, void*);
141 
ImportSecurityContextA(void * pszPackage,void * pPackedContext,void * pToken,void * phContext)142 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY ImportSecurityContextA(void* pszPackage, void* pPackedContext,
143                                                              void* pToken, void* phContext)
144 {
145 	return sspi_ImportSecurityContextA(pszPackage, pPackedContext, pToken, phContext);
146 }
147 
148 extern SECURITY_STATUS SEC_ENTRY sspi_QueryCredentialsAttributesW(void*, ULONG, void*);
149 
QueryCredentialsAttributesW(void * phCredential,ULONG ulAttribute,void * pBuffer)150 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY QueryCredentialsAttributesW(void* phCredential,
151                                                                   ULONG ulAttribute, void* pBuffer)
152 {
153 	return sspi_QueryCredentialsAttributesW(phCredential, ulAttribute, pBuffer);
154 }
155 
156 extern SECURITY_STATUS SEC_ENTRY sspi_QueryCredentialsAttributesA(void*, ULONG, void*);
157 
QueryCredentialsAttributesA(void * phCredential,ULONG ulAttribute,void * pBuffer)158 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY QueryCredentialsAttributesA(void* phCredential,
159                                                                   ULONG ulAttribute, void* pBuffer)
160 {
161 	return sspi_QueryCredentialsAttributesA(phCredential, ulAttribute, pBuffer);
162 }
163 
164 /* Context Management */
165 
166 extern SECURITY_STATUS SEC_ENTRY sspi_AcceptSecurityContext(void*, void*, void*, ULONG, ULONG,
167                                                             void*, void*, void*, void*);
168 
AcceptSecurityContext(void * phCredential,void * phContext,void * pInput,ULONG fContextReq,ULONG TargetDataRep,void * phNewContext,void * pOutput,void * pfContextAttr,void * ptsTimeStamp)169 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY AcceptSecurityContext(void* phCredential, void* phContext,
170                                                             void* pInput, ULONG fContextReq,
171                                                             ULONG TargetDataRep, void* phNewContext,
172                                                             void* pOutput, void* pfContextAttr,
173                                                             void* ptsTimeStamp)
174 {
175 	return sspi_AcceptSecurityContext(phCredential, phContext, pInput, fContextReq, TargetDataRep,
176 	                                  phNewContext, pOutput, pfContextAttr, ptsTimeStamp);
177 }
178 
179 extern SECURITY_STATUS SEC_ENTRY sspi_ApplyControlToken(void*, void*);
180 
ApplyControlToken(void * phContext,void * pInput)181 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY ApplyControlToken(void* phContext, void* pInput)
182 {
183 	return sspi_ApplyControlToken(phContext, pInput);
184 }
185 
186 extern SECURITY_STATUS SEC_ENTRY sspi_CompleteAuthToken(void*, void*);
187 
CompleteAuthToken(void * phContext,void * pToken)188 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY CompleteAuthToken(void* phContext, void* pToken)
189 {
190 	return sspi_CompleteAuthToken(phContext, pToken);
191 }
192 
193 extern SECURITY_STATUS SEC_ENTRY sspi_DeleteSecurityContext(void*);
194 
DeleteSecurityContext(void * phContext)195 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY DeleteSecurityContext(void* phContext)
196 {
197 	return sspi_DeleteSecurityContext(phContext);
198 }
199 
200 extern SECURITY_STATUS SEC_ENTRY sspi_FreeContextBuffer(void*);
201 
FreeContextBuffer(void * pvContextBuffer)202 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY FreeContextBuffer(void* pvContextBuffer)
203 {
204 	return sspi_FreeContextBuffer(pvContextBuffer);
205 }
206 
207 extern SECURITY_STATUS SEC_ENTRY sspi_ImpersonateSecurityContext(void*);
208 
ImpersonateSecurityContext(void * phContext)209 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY ImpersonateSecurityContext(void* phContext)
210 {
211 	return sspi_ImpersonateSecurityContext(phContext);
212 }
213 
214 extern SECURITY_STATUS SEC_ENTRY sspi_InitializeSecurityContextW(void*, void*, void*, ULONG, ULONG,
215                                                                  ULONG, void*, ULONG, void*, void*,
216                                                                  void*, void*);
217 
InitializeSecurityContextW(void * phCredential,void * phContext,void * pszTargetName,ULONG fContextReq,ULONG Reserved1,ULONG TargetDataRep,void * pInput,ULONG Reserved2,void * phNewContext,void * pOutput,void * pfContextAttr,void * ptsExpiry)218 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY InitializeSecurityContextW(
219     void* phCredential, void* phContext, void* pszTargetName, ULONG fContextReq, ULONG Reserved1,
220     ULONG TargetDataRep, void* pInput, ULONG Reserved2, void* phNewContext, void* pOutput,
221     void* pfContextAttr, void* ptsExpiry)
222 {
223 	return sspi_InitializeSecurityContextW(phCredential, phContext, pszTargetName, fContextReq,
224 	                                       Reserved1, TargetDataRep, pInput, Reserved2,
225 	                                       phNewContext, pOutput, pfContextAttr, ptsExpiry);
226 }
227 
228 extern SECURITY_STATUS SEC_ENTRY sspi_InitializeSecurityContextA(void*, void*, void*, ULONG, ULONG,
229                                                                  ULONG, void*, ULONG, void*, void*,
230                                                                  void*, void*);
231 
InitializeSecurityContextA(void * phCredential,void * phContext,void * pszTargetName,ULONG fContextReq,ULONG Reserved1,ULONG TargetDataRep,void * pInput,ULONG Reserved2,void * phNewContext,void * pOutput,void * pfContextAttr,void * ptsExpiry)232 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY InitializeSecurityContextA(
233     void* phCredential, void* phContext, void* pszTargetName, ULONG fContextReq, ULONG Reserved1,
234     ULONG TargetDataRep, void* pInput, ULONG Reserved2, void* phNewContext, void* pOutput,
235     void* pfContextAttr, void* ptsExpiry)
236 {
237 	return sspi_InitializeSecurityContextA(phCredential, phContext, pszTargetName, fContextReq,
238 	                                       Reserved1, TargetDataRep, pInput, Reserved2,
239 	                                       phNewContext, pOutput, pfContextAttr, ptsExpiry);
240 }
241 
242 extern SECURITY_STATUS SEC_ENTRY sspi_QueryContextAttributesW(void*, ULONG, void*);
243 
QueryContextAttributesW(void * phContext,ULONG ulAttribute,void * pBuffer)244 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY QueryContextAttributesW(void* phContext, ULONG ulAttribute,
245                                                               void* pBuffer)
246 {
247 	return sspi_QueryContextAttributesW(phContext, ulAttribute, pBuffer);
248 }
249 
250 extern SECURITY_STATUS SEC_ENTRY sspi_QueryContextAttributesA(void*, ULONG, void*);
251 
QueryContextAttributesA(void * phContext,ULONG ulAttribute,void * pBuffer)252 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY QueryContextAttributesA(void* phContext, ULONG ulAttribute,
253                                                               void* pBuffer)
254 {
255 	return sspi_QueryContextAttributesA(phContext, ulAttribute, pBuffer);
256 }
257 
258 extern SECURITY_STATUS SEC_ENTRY sspi_QuerySecurityContextToken(void*, void**);
259 
QuerySecurityContextToken(void * phContext,void ** phToken)260 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY QuerySecurityContextToken(void* phContext, void** phToken)
261 {
262 	return sspi_QuerySecurityContextToken(phContext, phToken);
263 }
264 
265 extern SECURITY_STATUS SEC_ENTRY sspi_SetContextAttributesW(void*, ULONG, void*, ULONG);
266 
SetContextAttributesW(void * phContext,ULONG ulAttribute,void * pBuffer,ULONG cbBuffer)267 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY SetContextAttributesW(void* phContext, ULONG ulAttribute,
268                                                             void* pBuffer, ULONG cbBuffer)
269 {
270 	return sspi_SetContextAttributesW(phContext, ulAttribute, pBuffer, cbBuffer);
271 }
272 
273 extern SECURITY_STATUS SEC_ENTRY sspi_SetContextAttributesA(void*, ULONG, void*, ULONG);
274 
SetContextAttributesA(void * phContext,ULONG ulAttribute,void * pBuffer,ULONG cbBuffer)275 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY SetContextAttributesA(void* phContext, ULONG ulAttribute,
276                                                             void* pBuffer, ULONG cbBuffer)
277 {
278 	return sspi_SetContextAttributesA(phContext, ulAttribute, pBuffer, cbBuffer);
279 }
280 
281 extern SECURITY_STATUS SEC_ENTRY sspi_RevertSecurityContext(void*);
282 
RevertSecurityContext(void * phContext)283 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY RevertSecurityContext(void* phContext)
284 {
285 	return sspi_RevertSecurityContext(phContext);
286 }
287 
288 /* Message Support */
289 
290 extern SECURITY_STATUS SEC_ENTRY sspi_DecryptMessage(void*, void*, ULONG, void*);
291 
DecryptMessage(void * phContext,void * pMessage,ULONG MessageSeqNo,void * pfQOP)292 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY DecryptMessage(void* phContext, void* pMessage,
293                                                      ULONG MessageSeqNo, void* pfQOP)
294 {
295 	return sspi_DecryptMessage(phContext, pMessage, MessageSeqNo, pfQOP);
296 }
297 
298 extern SECURITY_STATUS SEC_ENTRY sspi_EncryptMessage(void*, ULONG, void*, ULONG);
299 
EncryptMessage(void * phContext,ULONG fQOP,void * pMessage,ULONG MessageSeqNo)300 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY EncryptMessage(void* phContext, ULONG fQOP, void* pMessage,
301                                                      ULONG MessageSeqNo)
302 {
303 	return sspi_EncryptMessage(phContext, fQOP, pMessage, MessageSeqNo);
304 }
305 
306 extern SECURITY_STATUS SEC_ENTRY sspi_MakeSignature(void*, ULONG, void*, ULONG);
307 
MakeSignature(void * phContext,ULONG fQOP,void * pMessage,ULONG MessageSeqNo)308 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY MakeSignature(void* phContext, ULONG fQOP, void* pMessage,
309                                                     ULONG MessageSeqNo)
310 {
311 	return sspi_MakeSignature(phContext, fQOP, pMessage, MessageSeqNo);
312 }
313 
314 extern SECURITY_STATUS SEC_ENTRY sspi_VerifySignature(void*, void*, ULONG, void*);
315 
VerifySignature(void * phContext,void * pMessage,ULONG MessageSeqNo,void * pfQOP)316 SSPI_EXPORT SECURITY_STATUS SEC_ENTRY VerifySignature(void* phContext, void* pMessage,
317                                                       ULONG MessageSeqNo, void* pfQOP)
318 {
319 	return sspi_VerifySignature(phContext, pMessage, MessageSeqNo, pfQOP);
320 }
321