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