xref: /reactos/sdk/include/psdk/sspi.h (revision 845faec4)
1 /*
2  * Copyright (C) 2004 Juan Lang
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 #ifndef __WINE_SSPI_H__
19 #define __WINE_SSPI_H__
20 
21 #include <wtypes.h>
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #define SEC_ENTRY WINAPI
28 
29 typedef WCHAR SEC_WCHAR;
30 typedef CHAR  SEC_CHAR;
31 
32 #ifndef __SECSTATUS_DEFINED__
33 #define __SECSTATUS_DEFINED__
34 typedef LONG SECURITY_STATUS;
35 #endif
36 
37 #define UNISP_NAME_A "Microsoft Unified Security Protocol Provider"
38 #define UNISP_NAME_W L"Microsoft Unified Security Protocol Provider"
39 #define UNISP_NAME WINELIB_NAME_AW(UNISP_NAME_)
40 
41 #ifdef UNICODE
42 typedef SEC_WCHAR * SECURITY_PSTR;
43 typedef CONST SEC_WCHAR *  SECURITY_PCSTR;
44 #else
45 typedef SEC_CHAR * SECURITY_PSTR;
46 typedef CONST SEC_CHAR *  SECURITY_PCSTR;
47 #endif
48 
49 #ifndef __SECHANDLE_DEFINED__
50 #define __SECHANDLE_DEFINED__
51 typedef struct _SecHandle
52 {
53     ULONG_PTR dwLower;
54     ULONG_PTR dwUpper;
55 } SecHandle, *PSecHandle;
56 #endif
57 
58 #define SecInvalidateHandle(x) do { \
59  ((PSecHandle)(x))->dwLower = ((ULONG_PTR)((INT_PTR)-1)); \
60  ((PSecHandle)(x))->dwUpper = ((ULONG_PTR)((INT_PTR)-1)); \
61  } while (0)
62 
63 #define SecIsValidHandle(x) \
64  ((((PSecHandle)(x))->dwLower != ((ULONG_PTR)(INT_PTR)-1)) && \
65  (((PSecHandle)(x))->dwUpper != ((ULONG_PTR)(INT_PTR)-1)))
66 
67 typedef SecHandle CredHandle;
68 typedef PSecHandle PCredHandle;
69 
70 typedef SecHandle CtxtHandle;
71 typedef PSecHandle PCtxtHandle;
72 
73 typedef struct _SECURITY_INTEGER
74 {
75     ULONG LowPart;
76     LONG HighPart;
77 } SECURITY_INTEGER, *PSECURITY_INTEGER;
78 typedef SECURITY_INTEGER TimeStamp, *PTimeStamp;
79 
80 #define SSPIPFC_CREDPROV_DO_NOT_SAVE 0x00000001
81 #define SSPIPFC_NO_CHECKBOX 0x00000002
82 
83 typedef void *PSEC_WINNT_AUTH_IDENTITY_OPAQUE;
84 
85 ULONG SEC_ENTRY SspiPromptForCredentialsW(_In_ PCWSTR, _In_opt_ void *,
86     _In_ ULONG, _In_ PCWSTR, _In_opt_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE,
87     _Outptr_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE *, _Inout_opt_ int *, _In_ ULONG);
88 
89 typedef struct _SecPkgInfoA
90 {
91     ULONG  fCapabilities;
92     unsigned short wVersion;
93     unsigned short wRPCID;
94     ULONG  cbMaxToken;
95     SEC_CHAR      *Name;
96     SEC_CHAR      *Comment;
97 } SecPkgInfoA, *PSecPkgInfoA;
98 
99 typedef struct _SecPkgInfoW
100 {
101     ULONG  fCapabilities;
102     unsigned short wVersion;
103     unsigned short wRPCID;
104     ULONG  cbMaxToken;
105     SEC_WCHAR     *Name;
106     SEC_WCHAR     *Comment;
107 } SecPkgInfoW, *PSecPkgInfoW;
108 
109 #define SecPkgInfo WINELIB_NAME_AW(SecPkgInfo)
110 #define PSecPkgInfo WINELIB_NAME_AW(PSecPkgInfo)
111 
112 /* fCapabilities field of SecPkgInfo */
113 #define SECPKG_FLAG_INTEGRITY                0x00000001
114 #define SECPKG_FLAG_PRIVACY                  0x00000002
115 #define SECPKG_FLAG_TOKEN_ONLY               0x00000004
116 #define SECPKG_FLAG_DATAGRAM                 0x00000008
117 #define SECPKG_FLAG_CONNECTION               0x00000010
118 #define SECPKG_FLAG_MULTI_REQUIRED           0x00000020
119 #define SECPKG_FLAG_CLIENT_ONLY              0x00000040
120 #define SECPKG_FLAG_EXTENDED_ERROR           0x00000080
121 #define SECPKG_FLAG_IMPERSONATION            0x00000100
122 #define SECPKG_FLAG_ACCEPT_WIN32_NAME        0x00000200
123 #define SECPKG_FLAG_STREAM                   0x00000400
124 #define SECPKG_FLAG_NEGOTIABLE               0x00000800
125 #define SECPKG_FLAG_GSS_COMPATIBLE           0x00001000
126 #define SECPKG_FLAG_LOGON                    0x00002000
127 #define SECPKG_FLAG_ASCII_BUFFERS            0x00004000
128 #define SECPKG_FLAG_FRAGMENT                 0x00008000
129 #define SECPKG_FLAG_MUTUAL_AUTH              0x00010000
130 #define SECPKG_FLAG_DELEGATION               0x00020000
131 #define SECPKG_FLAG_READONLY_WITH_CHECKSUM   0x00040000
132 #define SECPKG_FLAG_RESTRICTED_TOKENS        0x00080000
133 #define SECPKG_FLAG_NEGO_EXTENDER            0x00100000
134 #define SECPKG_FLAG_NEGOTIABLE2              0x00200000
135 #define SECPKG_FLAG_APPCONTAINER_PASSTHROUGH 0x00400000
136 #define SECPKG_FLAG_APPCONTAINER_CHECKS      0x00800000
137 
138 typedef struct _SecBuffer {
139   ULONG cbBuffer;
140   ULONG BufferType;
141   _Field_size_bytes_(cbBuffer) void *pvBuffer;
142 } SecBuffer, *PSecBuffer;
143 
144 /* values for BufferType */
145 #define SECBUFFER_EMPTY               0
146 #define SECBUFFER_DATA                1
147 #define SECBUFFER_TOKEN               2
148 #define SECBUFFER_PKG_PARAMS          3
149 #define SECBUFFER_MISSING             4
150 #define SECBUFFER_EXTRA               5
151 #define SECBUFFER_STREAM_TRAILER      6
152 #define SECBUFFER_STREAM_HEADER       7
153 #define SECBUFFER_NEGOTIATION_INFO    8
154 #define SECBUFFER_PADDING             9
155 #define SECBUFFER_STREAM             10
156 #define SECBUFFER_MECHLIST           11
157 #define SECBUFFER_MECHLIST_SIGNATURE 12
158 #define SECBUFFER_TARGET             13
159 #define SECBUFFER_CHANNEL_BINDINGS   14
160 
161 #define SECBUFFER_ATTRMASK               0xf0000000
162 #define SECBUFFER_READONLY               0x80000000
163 #define SECBUFFER_READONLY_WITH_CHECKSUM 0x10000000
164 #define SECBUFFER_RESERVED               0x60000000
165 
166 typedef struct _SecBufferDesc {
167   ULONG ulVersion;
168   ULONG cBuffers;
169   _Field_size_(cBuffers) PSecBuffer pBuffers;
170 } SecBufferDesc, *PSecBufferDesc;
171 
172 /* values for ulVersion */
173 #define SECBUFFER_VERSION 0
174 
175 typedef void (SEC_ENTRY *SEC_GET_KEY_FN)(void *Arg, void *Principal,
176  ULONG KeyVer, void **Key, SECURITY_STATUS *Status);
177 
178 SECURITY_STATUS
179 SEC_ENTRY
180 EnumerateSecurityPackagesA(
181   _Out_ PULONG pcPackages,
182   _Outptr_ PSecPkgInfoA *ppPackageInfo);
183 
184 SECURITY_STATUS
185 SEC_ENTRY
186 EnumerateSecurityPackagesW(
187   _Out_ PULONG pcPackages,
188   _Outptr_ PSecPkgInfoW *ppPackageInfo);
189 
190 #define EnumerateSecurityPackages WINELIB_NAME_AW(EnumerateSecurityPackages)
191 
192 typedef SECURITY_STATUS (SEC_ENTRY *ENUMERATE_SECURITY_PACKAGES_FN_A)(PULONG,
193  PSecPkgInfoA *);
194 typedef SECURITY_STATUS (SEC_ENTRY *ENUMERATE_SECURITY_PACKAGES_FN_W)(PULONG,
195  PSecPkgInfoW *);
196 #define ENUMERATE_SECURITY_PACKAGES_FN WINELIB_NAME_AW(ENUMERATE_SECURITY_PACKAGES_FN_)
197 
198 SECURITY_STATUS
199 SEC_ENTRY
200 QueryCredentialsAttributesA(
201   _In_ PCredHandle phCredential,
202   _In_ ULONG ulAttribute,
203   _Inout_ void *pBuffer);
204 
205 SECURITY_STATUS
206 SEC_ENTRY
207 QueryCredentialsAttributesW(
208   _In_ PCredHandle phCredential,
209   _In_ ULONG ulAttribute,
210   _Inout_ void *pBuffer);
211 
212 #define QueryCredentialsAttributes WINELIB_NAME_AW(QueryCredentialsAttributes)
213 
214 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CREDENTIALS_ATTRIBUTES_FN_A)
215  (PCredHandle, ULONG, PVOID);
216 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CREDENTIALS_ATTRIBUTES_FN_W)
217  (PCredHandle, ULONG, PVOID);
218 #define QUERY_CREDENTIALS_ATTRIBUTES_FN WINELIB_NAME_AW(QUERY_CREDENTIALS_ATTRIBUTES_FN_)
219 
220 typedef struct _SEC_CHANNEL_BINDINGS {
221     ULONG dwInitiatorAddrType;
222     ULONG cbInitiatorLength;
223     ULONG dwInitiatorOffset;
224     ULONG dwAcceptorAddrType;
225     ULONG cbAcceptorLength;
226     ULONG dwAcceptorOffset;
227     ULONG cbApplicationDataLength;
228     ULONG dwApplicationDataOffset;
229 } SEC_CHANNEL_BINDINGS, *PSEC_CHANNEL_BINDINGS;
230 
231 /* values for QueryCredentialsAttributes ulAttribute */
232 #define SECPKG_CRED_ATTR_NAMES 1
233 
234 /* types for QueryCredentialsAttributes */
235 typedef struct _SecPkgCredentials_NamesA
236 {
237     SEC_CHAR *sUserName;
238 } SecPkgCredentials_NamesA, *PSecPkgCredentials_NamesA;
239 
240 typedef struct _SecPkgCredentials_NamesW
241 {
242     SEC_WCHAR *sUserName;
243 } SecPkgCredentials_NamesW, *PSecPkgCredentials_NamesW;
244 
245 #define SecPkgCredentials_Names WINELIB_NAME_AW(SecPkgCredentials_Names)
246 
247 SECURITY_STATUS
248 SEC_ENTRY
249 AcquireCredentialsHandleA(
250   _In_opt_ SEC_CHAR *pszPrincipal,
251   _In_ SEC_CHAR *pszPackage,
252   _In_ ULONG fCredentialsUse,
253   _In_opt_ PLUID pvLogonID,
254   _In_opt_ PVOID pAuthData,
255   _In_opt_ SEC_GET_KEY_FN pGetKeyFn,
256   _In_opt_ PVOID pvGetKeyArgument,
257   _Out_ PCredHandle phCredential,
258   _Out_opt_ PTimeStamp ptsExpiry);
259 
260 SECURITY_STATUS
261 SEC_ENTRY
262 AcquireCredentialsHandleW(
263   _In_opt_ SEC_WCHAR *pszPrincipal,
264   _In_ SEC_WCHAR *pszPackage,
265   _In_ ULONG fCredentialsUse,
266   _In_opt_ PLUID pvLogonID,
267   _In_opt_ PVOID pAuthData,
268   _In_opt_ SEC_GET_KEY_FN pGetKeyFn,
269   _In_opt_ PVOID pvGetKeyArgument,
270   _Out_ PCredHandle phCredential,
271   _Out_opt_ PTimeStamp ptsExpiry);
272 
273 #define AcquireCredentialsHandle WINELIB_NAME_AW(AcquireCredentialsHandle)
274 
275 /* flags for fCredentialsUse */
276 #define SECPKG_CRED_INBOUND  0x00000001
277 #define SECPKG_CRED_OUTBOUND 0x00000002
278 #define SECPKG_CRED_BOTH     (SECPKG_CRED_INBOUND | SECPKG_CRED_OUTBOUND)
279 #define SECPKG_CRED_DEFAULT  0x00000004
280 #define SECPKG_CRED_RESERVED 0xf0000000
281 
282 typedef SECURITY_STATUS (SEC_ENTRY *ACQUIRE_CREDENTIALS_HANDLE_FN_A)(
283  SEC_CHAR *, SEC_CHAR *, ULONG, PLUID, PVOID, SEC_GET_KEY_FN, PVOID,
284  PCredHandle, PTimeStamp);
285 typedef SECURITY_STATUS (SEC_ENTRY *ACQUIRE_CREDENTIALS_HANDLE_FN_W)(
286  SEC_WCHAR *, SEC_WCHAR *, ULONG, PLUID, PVOID, SEC_GET_KEY_FN, PVOID,
287  PCredHandle, PTimeStamp);
288 #define ACQUIRE_CREDENTIALS_HANDLE_FN WINELIB_NAME_AW(ACQUIRE_CREDENTIALS_HANDLE_FN_)
289 
290 SECURITY_STATUS SEC_ENTRY FreeContextBuffer(_Inout_ PVOID pv);
291 
292 typedef SECURITY_STATUS (SEC_ENTRY *FREE_CONTEXT_BUFFER_FN)(_Inout_ PVOID);
293 
294 SECURITY_STATUS
295 SEC_ENTRY
296 FreeCredentialsHandle(
297   _In_ PCredHandle phCredential);
298 
299 #define FreeCredentialHandle FreeCredentialsHandle
300 
301 typedef SECURITY_STATUS (SEC_ENTRY *FREE_CREDENTIALS_HANDLE_FN)(PCredHandle);
302 
303 SECURITY_STATUS
304 SEC_ENTRY
305 InitializeSecurityContextA(
306   _In_opt_ PCredHandle phCredential,
307   _In_opt_ PCtxtHandle phContext,
308   _In_opt_ SEC_CHAR *pszTargetName,
309   _In_ ULONG fContextReq,
310   _In_ ULONG Reserved1,
311   _In_ ULONG TargetDataRep,
312   _In_opt_ PSecBufferDesc pInput,
313   _In_ ULONG Reserved2,
314   _Inout_opt_ PCtxtHandle phNewContext,
315   _Inout_opt_ PSecBufferDesc pOutput,
316   _Out_ ULONG *pfContextAttr,
317   _Out_opt_ PTimeStamp ptsExpiry);
318 
319 SECURITY_STATUS
320 SEC_ENTRY
321 InitializeSecurityContextW(
322   _In_opt_ PCredHandle phCredential,
323   _In_opt_ PCtxtHandle phContext,
324   _In_opt_ SEC_WCHAR *pszTargetName,
325   _In_ ULONG fContextReq,
326   _In_ ULONG Reserved1,
327   _In_ ULONG TargetDataRep,
328   _In_opt_ PSecBufferDesc pInput,
329   _In_ ULONG Reserved2,
330   _Inout_opt_ PCtxtHandle phNewContext,
331   _Inout_opt_ PSecBufferDesc pOutput,
332   _Out_ ULONG *pfContextAttr,
333   _Out_opt_ PTimeStamp ptsExpiry);
334 
335 #define InitializeSecurityContext WINELIB_NAME_AW(InitializeSecurityContext)
336 
337 typedef SECURITY_STATUS (SEC_ENTRY *INITIALIZE_SECURITY_CONTEXT_FN_A)
338  (PCredHandle, PCtxtHandle, SEC_CHAR *, ULONG, ULONG,
339  ULONG, PSecBufferDesc, ULONG, PCtxtHandle, PSecBufferDesc,
340  ULONG *, PTimeStamp);
341 typedef SECURITY_STATUS (SEC_ENTRY *INITIALIZE_SECURITY_CONTEXT_FN_W)
342  (PCredHandle, PCtxtHandle, SEC_WCHAR *, ULONG, ULONG,
343  ULONG, PSecBufferDesc, ULONG, PCtxtHandle, PSecBufferDesc,
344  ULONG *, PTimeStamp);
345 #define INITIALIZE_SECURITY_CONTEXT_FN WINELIB_NAME_AW(INITIALIZE_SECURITY_CONTEXT_FN_)
346 
347 /* flags for InitializeSecurityContext fContextReq and pfContextAttr */
348 #define ISC_REQ_DELEGATE               0x00000001
349 #define ISC_REQ_MUTUAL_AUTH            0x00000002
350 #define ISC_REQ_REPLAY_DETECT          0x00000004
351 #define ISC_REQ_SEQUENCE_DETECT        0x00000008
352 #define ISC_REQ_CONFIDENTIALITY        0x00000010
353 #define ISC_REQ_USE_SESSION_KEY        0x00000020
354 #define ISC_REQ_PROMPT_FOR_CREDS       0x00000040
355 #define ISC_REQ_USE_SUPPLIED_CREDS     0x00000080
356 #define ISC_REQ_ALLOCATE_MEMORY        0x00000100
357 #define ISC_REQ_USE_DCE_STYLE          0x00000200
358 #define ISC_REQ_DATAGRAM               0x00000400
359 #define ISC_REQ_CONNECTION             0x00000800
360 #define ISC_REQ_CALL_LEVEL             0x00001000
361 #define ISC_REQ_FRAGMENT_SUPPLIED      0x00002000
362 #define ISC_REQ_EXTENDED_ERROR         0x00004000
363 #define ISC_REQ_STREAM                 0x00008000
364 #define ISC_REQ_INTEGRITY              0x00010000
365 #define ISC_REQ_IDENTIFY               0x00020000
366 #define ISC_REQ_NULL_SESSION           0x00040000
367 #define ISC_REQ_MANUAL_CRED_VALIDATION 0x00080000
368 #define ISC_REQ_RESERVED1              0x00100000
369 #define ISC_REQ_FRAGMENT_TO_FIT        0x00200000
370 
371 #define ISC_RET_DELEGATE               0x00000001
372 #define ISC_RET_MUTUAL_AUTH            0x00000002
373 #define ISC_RET_REPLAY_DETECT          0x00000004
374 #define ISC_RET_SEQUENCE_DETECT        0x00000008
375 #define ISC_RET_CONFIDENTIALITY        0x00000010
376 #define ISC_RET_USE_SESSION_KEY        0x00000020
377 #define ISC_RET_USED_COLLECTED_CREDS   0x00000040
378 #define ISC_RET_USED_SUPPLIED_CREDS    0x00000080
379 #define ISC_RET_ALLOCATED_MEMORY       0x00000100
380 #define ISC_RET_USED_DCE_STYLE         0x00000200
381 #define ISC_RET_DATAGRAM               0x00000400
382 #define ISC_RET_CONNECTION             0x00000800
383 #define ISC_RET_INTERMEDIATE_RETURN    0x00001000
384 #define ISC_RET_CALL_LEVEL             0x00002000
385 #define ISC_RET_EXTENDED_ERROR         0x00004000
386 #define ISC_RET_STREAM                 0x00008000
387 #define ISC_RET_INTEGRITY              0x00010000
388 #define ISC_RET_IDENTIFY               0x00020000
389 #define ISC_RET_NULL_SESSION           0x00040000
390 #define ISC_RET_MANUAL_CRED_VALIDATION 0x00080000
391 #define ISC_RET_RESERVED1              0x00100000
392 #define ISC_RET_FRAGMENT_ONLY          0x00200000
393 
394 SECURITY_STATUS
395 SEC_ENTRY
396 AcceptSecurityContext(
397   _In_opt_ PCredHandle phCredential,
398   _In_opt_ PCtxtHandle phContext,
399   _In_opt_ PSecBufferDesc pInput,
400   _In_ ULONG fContextReq,
401   _In_ ULONG TargetDataRep,
402   _Inout_opt_ PCtxtHandle phNewContext,
403   _Inout_opt_ PSecBufferDesc pOutput,
404   _Out_ ULONG *pfContextAttr,
405   _Out_opt_ PTimeStamp ptsExpiry);
406 
407 typedef SECURITY_STATUS (SEC_ENTRY *ACCEPT_SECURITY_CONTEXT_FN)(PCredHandle,
408  PCtxtHandle, PSecBufferDesc, ULONG, ULONG, PCtxtHandle,
409  PSecBufferDesc, ULONG *, PTimeStamp);
410 
411 /* flags for AcceptSecurityContext fContextReq and pfContextAttr */
412 #define ASC_REQ_DELEGATE               0x00000001
413 #define ASC_REQ_MUTUAL_AUTH            0x00000002
414 #define ASC_REQ_REPLAY_DETECT          0x00000004
415 #define ASC_REQ_SEQUENCE_DETECT        0x00000008
416 #define ASC_REQ_CONFIDENTIALITY        0x00000010
417 #define ASC_REQ_USE_SESSION_KEY        0x00000020
418 #define ASC_REQ_ALLOCATE_MEMORY        0x00000100
419 #define ASC_REQ_USE_DCE_STYLE          0x00000200
420 #define ASC_REQ_DATAGRAM               0x00000400
421 #define ASC_REQ_CONNECTION             0x00000800
422 #define ASC_REQ_CALL_LEVEL             0x00001000
423 #define ASC_REQ_FRAGMENT_SUPPLIED      0x00002000
424 #define ASC_REQ_EXTENDED_ERROR         0x00008000
425 #define ASC_REQ_STREAM                 0x00010000
426 #define ASC_REQ_INTEGRITY              0x00020000
427 #define ASC_REQ_LICENSING              0x00040000
428 #define ASC_REQ_IDENTIFY               0x00080000
429 #define ASC_REQ_ALLOW_NULL_SESSION     0x00100000
430 #define ASC_REQ_ALLOW_NON_USER_LOGONS  0x00200000
431 #define ASC_REQ_ALLOW_CONTEXT_REPLAY   0x00400000
432 #define ASC_REQ_FRAGMENT_TO_FIT        0x00800000
433 #define ASC_REQ_FRAGMENT_NO_TOKEN      0x01000000
434 
435 #define ASC_RET_DELEGATE               0x00000001
436 #define ASC_RET_MUTUAL_AUTH            0x00000002
437 #define ASC_RET_REPLAY_DETECT          0x00000004
438 #define ASC_RET_SEQUENCE_DETECT        0x00000008
439 #define ASC_RET_CONFIDENTIALITY        0x00000010
440 #define ASC_RET_USE_SESSION_KEY        0x00000020
441 #define ASC_RET_ALLOCATED_MEMORY       0x00000100
442 #define ASC_RET_USED_DCE_STYLE         0x00000200
443 #define ASC_RET_DATAGRAM               0x00000400
444 #define ASC_RET_CONNECTION             0x00000800
445 #define ASC_RET_CALL_LEVEL             0x00002000
446 #define ASC_RET_THIRD_LEG_FAILED       0x00004000
447 #define ASC_RET_EXTENDED_ERROR         0x00008000
448 #define ASC_RET_STREAM                 0x00010000
449 #define ASC_RET_INTEGRITY              0x00020000
450 #define ASC_RET_LICENSING              0x00040000
451 #define ASC_RET_IDENTIFY               0x00080000
452 #define ASC_RET_NULL_SESSION           0x00100000
453 #define ASC_RET_ALLOW_NON_USER_LOGONS  0x00200000
454 #define ASC_RET_ALLOW_CONTEXT_REPLAY   0x00400000
455 #define ASC_RET_FRAGMENT_ONLY          0x00800000
456 #define ASC_RET_NO_TOKEN               0x01000000
457 
458 /*Vvalues for TargetDataRep */
459 #define SECURITY_NATIVE_DREP           0x00000010
460 #define SECURITY_NETWORK_DREP          0x00000000
461 
462 SECURITY_STATUS
463 SEC_ENTRY
464 CompleteAuthToken(
465   _In_ PCtxtHandle phContext,
466   _In_ PSecBufferDesc pToken);
467 
468 typedef SECURITY_STATUS (SEC_ENTRY *COMPLETE_AUTH_TOKEN_FN)(PCtxtHandle,
469  PSecBufferDesc);
470 
471 SECURITY_STATUS SEC_ENTRY DeleteSecurityContext(_In_ PCtxtHandle phContext);
472 
473 typedef SECURITY_STATUS (SEC_ENTRY *DELETE_SECURITY_CONTEXT_FN)(PCtxtHandle);
474 
475 SECURITY_STATUS
476 SEC_ENTRY
477 ApplyControlToken(
478   _In_ PCtxtHandle phContext,
479   _In_ PSecBufferDesc pInput);
480 
481 typedef SECURITY_STATUS (SEC_ENTRY *APPLY_CONTROL_TOKEN_FN)(PCtxtHandle,
482  PSecBufferDesc);
483 
484 SECURITY_STATUS
485 SEC_ENTRY
486 QueryContextAttributesA(
487   _In_ PCtxtHandle phContext,
488   _In_ ULONG ulAttribute,
489   _Out_ void *pBuffer);
490 
491 SECURITY_STATUS
492 SEC_ENTRY
493 QueryContextAttributesW(
494   _In_ PCtxtHandle phContext,
495   _In_ ULONG ulAttribute,
496   _Out_ void *pBuffer);
497 
498 #define QueryContextAttributes WINELIB_NAME_AW(QueryContextAttributes)
499 
500 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle,
501  ULONG, void *);
502 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle,
503  ULONG, void *);
504 #define QUERY_CONTEXT_ATTRIBUTES_FN WINELIB_NAME_AW(QUERY_CONTEXT_ATTRIBUTES_FN_)
505 
506 /* values for QueryContextAttributes/SetContextAttributes ulAttribute */
507 #define SECPKG_ATTR_SIZES               0
508 #define SECPKG_ATTR_NAMES               1
509 #define SECPKG_ATTR_LIFESPAN            2
510 #define SECPKG_ATTR_DCE_INFO            3
511 #define SECPKG_ATTR_STREAM_SIZES        4
512 #define SECPKG_ATTR_KEY_INFO            5
513 #define SECPKG_ATTR_AUTHORITY           6
514 #define SECPKG_ATTR_PROTO_INFO          7
515 #define SECPKG_ATTR_PASSWORD_EXPIRY     8
516 #define SECPKG_ATTR_SESSION_KEY         9
517 #define SECPKG_ATTR_PACKAGE_INFO       10
518 #define SECPKG_ATTR_USER_FLAGS         11
519 #define SECPKG_ATTR_NEGOTIATION_INFO   12
520 #define SECPKG_ATTR_NATIVE_NAMES       13
521 #define SECPKG_ATTR_FLAGS              14
522 #define SECPKG_ATTR_USE_VALIDATED      15
523 #define SECPKG_ATTR_CREDENTIAL_NAME    16
524 #define SECPKG_ATTR_TARGET_INFORMATION 17
525 #define SECPKG_ATTR_ACCESS_TOKEN       18
526 #define SECPKG_ATTR_TARGET             19
527 #define SECPKG_ATTR_AUTHENTICATION_ID  20
528 #define SECPKG_ATTR_LOGOFF_TIME        21
529 #define SECPKG_ATTR_NEGO_KEYS          22
530 #define SECPKG_ATTR_PROMPTING_NEEDED   24
531 #define SECPKG_ATTR_UNIQUE_BINDINGS    25
532 #define SECPKG_ATTR_ENDPOINT_BINDINGS  26
533 #define SECPKG_ATTR_CLIENT_SPECIFIED_TARGET  27
534 #define SECPKG_ATTR_LAST_CLIENT_TOKEN_STATUS 30
535 #define SECPKG_ATTR_NEGO_PKG_INFO      31
536 #define SECPKG_ATTR_NEGO_STATUS        32
537 #define SECPKG_ATTR_CONTEXT_DELETED    33
538 
539 #define SECPKG_ATTR_SUBJECT_SECURITY_ATTRIBUTES 128
540 #define SECPKG_ATTR_NEGO_INFO_FLAG_NO_KERBEROS 0x1
541 #define SECPKG_ATTR_NEGO_INFO_FLAG_NO_NTLM     0x2
542 
543 /* types for QueryContextAttributes/SetContextAttributes */
544 
545 typedef struct _SecPkgContext_Sizes
546 {
547     ULONG cbMaxToken;
548     ULONG cbMaxSignature;
549     ULONG cbBlockSize;
550     ULONG cbSecurityTrailer;
551 } SecPkgContext_Sizes, *PSecPkgContext_Sizes;
552 
553 typedef struct _SecPkgContext_StreamSizes
554 {
555     ULONG cbHeader;
556     ULONG cbTrailer;
557     ULONG cbMaximumMessage;
558     ULONG cbBuffers;
559     ULONG cbBlockSize;
560 } SecPkgContext_StreamSizes, *PSecPkgContext_StreamSizes;
561 
562 typedef struct _SecPkgContext_NamesA
563 {
564     SEC_CHAR *sUserName;
565 } SecPkgContext_NamesA, *PSecPkgContext_NamesA;
566 
567 typedef struct _SecPkgContext_NamesW
568 {
569     SEC_WCHAR *sUserName;
570 } SecPkgContext_NamesW, *PSecPkgContext_NamesW;
571 
572 #define SecPkgContext_Names WINELIB_NAME_AW(SecPkgContext_Names)
573 #define PSecPkgContext_Names WINELIB_NAME_AW(PSecPkgContext_Names)
574 
575 typedef struct _SecPkgContext_Lifespan
576 {
577     TimeStamp tsStart;
578     TimeStamp tsExpiry;
579 } SecPkgContext_Lifespan, *PSecPkgContext_Lifespan;
580 
581 typedef struct _SecPkgContext_DceInfo
582 {
583     ULONG AuthzSvc;
584     void *pPac;
585 } SecPkgContext_DceInfo, *PSecPkgContext_DceInfo;
586 
587 typedef struct _SecPkgContext_KeyInfoA
588 {
589     SEC_CHAR      *sSignatureAlgorithmName;
590     SEC_CHAR      *sEncryptAlgorithmName;
591     ULONG  KeySize;
592     ULONG  SignatureAlgorithm;
593     ULONG  EncryptAlgorithm;
594 } SecPkgContext_KeyInfoA, *PSecPkgContext_KeyInfoA;
595 
596 typedef struct _SecPkgContext_KeyInfoW
597 {
598     SEC_WCHAR     *sSignatureAlgorithmName;
599     SEC_WCHAR     *sEncryptAlgorithmName;
600     ULONG  KeySize;
601     ULONG  SignatureAlgorithm;
602     ULONG  EncryptAlgorithm;
603 } SecPkgContext_KeyInfoW, *PSecPkgContext_KeyInfoW;
604 
605 #define SecPkgContext_KeyInfo WINELIB_NAME_AW(SecPkgContext_KeyInfo)
606 #define PSecPkgContext_KeyInfo WINELIB_NAME_AW(PSecPkgContext_KeyInfo)
607 
608 typedef struct _SecPkgContext_AuthorityA
609 {
610     SEC_CHAR *sAuthorityName;
611 } SecPkgContext_AuthorityA, *PSecPkgContext_AuthorityA;
612 
613 typedef struct _SecPkgContext_AuthorityW
614 {
615     SEC_WCHAR *sAuthorityName;
616 } SecPkgContext_AuthorityW, *PSecPkgContext_AuthorityW;
617 
618 #define SecPkgContext_Authority WINELIB_NAME_AW(SecPkgContext_Authority)
619 #define PSecPkgContext_Authority WINELIB_NAME_AW(PSecPkgContext_Authority)
620 
621 typedef struct _SecPkgContext_ProtoInfoA
622 {
623     SEC_CHAR     *sProtocolName;
624     ULONG majorVersion;
625     ULONG minorVersion;
626 } SecPkgContext_ProtoInfoA, *PSecPkgContext_ProtoInfoA;
627 
628 typedef struct _SecPkgContext_ProtoInfoW
629 {
630     SEC_WCHAR    *sProtocolName;
631     ULONG majorVersion;
632     ULONG minorVersion;
633 } SecPkgContext_ProtoInfoW, *PSecPkgContext_ProtoInfoW;
634 
635 #define SecPkgContext_ProtoInfo WINELIB_NAME_AW(SecPkgContext_ProtoInfo)
636 #define PSecPkgContext_ProtoInfo WINELIB_NAME_AW(PSecPkgContext_ProtoInfo)
637 
638 typedef struct _SecPkgContext_PasswordExpiry
639 {
640     TimeStamp tsPasswordExpires;
641 } SecPkgContext_PasswordExpiry, *PSecPkgContext_PasswordExpiry;
642 
643 typedef struct _SecPkgContext_SessionKey {
644   ULONG SessionKeyLength;
645   _Field_size_bytes_(SessionKeyLength) unsigned char *SessionKey;
646 } SecPkgContext_SessionKey, *PSecPkgContext_SessionKey;
647 
648 typedef struct _SecPkgContext_PackageInfoA
649 {
650     PSecPkgInfoA PackageInfo;
651 } SecPkgContext_PackageInfoA, *PSecPkgContext_PackageInfoA;
652 
653 typedef struct _SecPkgContext_PackageInfoW
654 {
655     PSecPkgInfoW PackageInfo;
656 } SecPkgContext_PackageInfoW, *PSecPkgContext_PackageInfoW;
657 
658 #define SecPkgContext_PackageInfo WINELIB_NAME_AW(SecPkgContext_PackageInfo)
659 #define PSecPkgContext_PackageInfo WINELIB_NAME_AW(PSecPkgContext_PackageInfo)
660 
661 typedef struct _SecPkgContext_Flags
662 {
663     ULONG Flags;
664 } SecPkgContext_Flags, *PSecPkgContext_Flags;
665 
666 typedef struct _SecPkgContext_UserFlags
667 {
668     ULONG UserFlags;
669 } SecPkgContext_UserFlags, *PSecPkgContext_UserFlags;
670 
671 typedef struct _SecPkgContext_NegotiationInfoA
672 {
673     PSecPkgInfoA  PackageInfo;
674     ULONG NegotiationState;
675 } SecPkgContext_NegotiationInfoA, *PSecPkgContext_NegotiationInfoA;
676 
677 typedef struct _SecPkgContext_NegotiationInfoW
678 {
679     PSecPkgInfoW  PackageInfo;
680     ULONG NegotiationState;
681 } SecPkgContext_NegotiationInfoW, *PSecPkgContext_NegotiationInfoW;
682 
683 #define SecPkgContext_NegotiationInfo WINELIB_NAME_AW(SecPkgContext_NegotiationInfo)
684 #define PSecPkgContext_NegotiationInfo WINELIB_NAME_AW(PSecPkgContext_NegotiationInfo)
685 
686 /* values for NegotiationState */
687 #define SECPKG_NEGOTIATION_COMPLETE      0
688 #define SECPKG_NEGOTIATION_OPTIMISTIC    1
689 #define SECPKG_NEGOTIATION_IN_PROGRESS   2
690 #define SECPKG_NEGOTIATION_DIRECT        3
691 #define SECPKG_NEGOTIATION_TRY_MULTICRED 4
692 
693 typedef struct _SecPkgContext_NativeNamesA
694 {
695     SEC_CHAR *sClientName;
696     SEC_CHAR *sServerName;
697 } SecPkgContext_NativeNamesA, *PSecPkgContext_NativeNamesA;
698 
699 typedef struct _SecPkgContext_NativeNamesW
700 {
701     SEC_WCHAR *sClientName;
702     SEC_WCHAR *sServerName;
703 } SecPkgContext_NativeNamesW, *PSecPkgContext_NativeNamesW;
704 
705 #define SecPkgContext_NativeNames WINELIB_NAME_AW(SecPkgContext_NativeNames)
706 #define PSecPkgContext_NativeNames WINELIB_NAME_AW(PSecPkgContext_NativeNames)
707 
708 typedef struct _SecPkgContext_CredentialNameA
709 {
710     ULONG  CredentialType;
711     SEC_CHAR      *sCredentialName;
712 } SecPkgContext_CredentialNameA, *PSecPkgContext_CredentialNameA;
713 
714 typedef struct _SecPkgContext_CredentialNameW
715 {
716     ULONG  CredentialType;
717     SEC_WCHAR     *sCredentialName;
718 } SecPkgContext_CredentialNameW, *PSecPkgContext_CredentialNameW;
719 
720 #define SecPkgContext_CredentialName WINELIB_NAME_AW(SecPkgContext_CredentialName)
721 #define PSecPkgContext_CredentialName WINELIB_NAME_AW(PSecPkgContext_CredentialName)
722 
723 typedef struct _SecPkgContext_AccessToken
724 {
725     void *AccessToken;
726 } SecPkgContext_AccessToken, *PSecPkgContext_AccessToken;
727 
728 typedef struct _SecPkgContext_TargetInformation
729 {
730     ULONG  MarshalledTargetInfoLength;
731     unsigned char *MarshalledTargetInfo;
732 } SecPkgContext_TargetInformation, *PSecPkgContext_TargetInformation;
733 
734 typedef struct _SecPkgContext_AuthzID
735 {
736     ULONG  AuthzIDLength;
737     char          *AuthzID;
738 } SecPkgContext_AuthzID, *PSecPkgContext_AuthzID;
739 
740 typedef struct _SecPkgContext_Target
741 {
742     ULONG  TargetLength;
743     char          *Target;
744 } SecPkgContext_Target, *PSecPkgContext_Target;
745 
746 typedef struct _SecPkgContext_Bindings
747 {
748     ULONG BindingsLength;
749     SEC_CHANNEL_BINDINGS *Bindings;
750 } SecPkgContext_Bindings, *PSecPkgContext_Bindings;
751 
752 _Check_return_
753 SECURITY_STATUS
754 SEC_ENTRY
755 ImpersonateSecurityContext(
756   _In_ PCtxtHandle phContext);
757 
758 typedef SECURITY_STATUS (SEC_ENTRY *IMPERSONATE_SECURITY_CONTEXT_FN)
759  (PCtxtHandle);
760 
761 SECURITY_STATUS SEC_ENTRY RevertSecurityContext(_In_ PCtxtHandle phContext);
762 
763 typedef SECURITY_STATUS (SEC_ENTRY *REVERT_SECURITY_CONTEXT_FN)(PCtxtHandle);
764 
765 SECURITY_STATUS
766 SEC_ENTRY
767 MakeSignature(
768   _In_ PCtxtHandle phContext,
769   _In_ ULONG fQOP,
770   _In_ PSecBufferDesc pMessage,
771   _In_ ULONG MessageSeqNo);
772 
773 typedef SECURITY_STATUS (SEC_ENTRY *MAKE_SIGNATURE_FN)(PCtxtHandle,
774  ULONG, PSecBufferDesc, ULONG);
775 
776 SECURITY_STATUS
777 SEC_ENTRY
778 VerifySignature(
779   _In_ PCtxtHandle phContext,
780   _In_ PSecBufferDesc pMessage,
781   _In_ ULONG MessageSeqNo,
782   _Out_ PULONG pfQOP);
783 
784 typedef SECURITY_STATUS (SEC_ENTRY *VERIFY_SIGNATURE_FN)(PCtxtHandle,
785  PSecBufferDesc, ULONG, PULONG);
786 
787 SECURITY_STATUS
788 SEC_ENTRY
789 QuerySecurityPackageInfoA(
790   _In_ SEC_CHAR *pszPackageName,
791   _Outptr_ PSecPkgInfoA *ppPackageInfo);
792 
793 SECURITY_STATUS
794 SEC_ENTRY
795 QuerySecurityPackageInfoW(
796   _In_ SEC_WCHAR *pszPackageName,
797   _Outptr_ PSecPkgInfoW *ppPackageInfo);
798 
799 #define QuerySecurityPackageInfo WINELIB_NAME_AW(QuerySecurityPackageInfo)
800 
801 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_SECURITY_PACKAGE_INFO_FN_A)
802  (SEC_CHAR *, PSecPkgInfoA *);
803 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_SECURITY_PACKAGE_INFO_FN_W)
804  (SEC_WCHAR *, PSecPkgInfoW *);
805 #define QUERY_SECURITY_PACKAGE_INFO_FN WINELIB_NAME_AW(QUERY_SECURITY_PACKAGE_INFO_FN_)
806 
807 SECURITY_STATUS
808 SEC_ENTRY
809 ExportSecurityContext(
810   _In_ PCtxtHandle phContext,
811   _In_ ULONG fFlags,
812   _Out_ PSecBuffer pPackedContext,
813   _Out_ void **pToken);
814 
815 typedef SECURITY_STATUS (SEC_ENTRY *EXPORT_SECURITY_CONTEXT_FN)(PCtxtHandle,
816  ULONG, PSecBuffer, void **);
817 
818 /* values for ExportSecurityContext fFlags */
819 #define SECPKG_CONTEXT_EXPORT_RESET_NEW  0x00000001
820 #define SECPKG_CONTEXT_EXPORT_DELETE_OLD 0x00000002
821 
822 SECURITY_STATUS
823 SEC_ENTRY
824 ImportSecurityContextA(
825   _In_ SEC_CHAR *pszPackage,
826   _In_ PSecBuffer pPackedContext,
827   _In_ void *Token,
828   _Out_ PCtxtHandle phContext);
829 
830 SECURITY_STATUS
831 SEC_ENTRY
832 ImportSecurityContextW(
833   _In_ SEC_WCHAR *pszPackage,
834   _In_ PSecBuffer pPackedContext,
835   _In_ void *Token,
836   _Out_ PCtxtHandle phContext);
837 
838 #define ImportSecurityContext WINELIB_NAME_AW(ImportSecurityContext)
839 
840 typedef SECURITY_STATUS (SEC_ENTRY *IMPORT_SECURITY_CONTEXT_FN_A)(SEC_CHAR *,
841  PSecBuffer, void *, PCtxtHandle);
842 typedef SECURITY_STATUS (SEC_ENTRY *IMPORT_SECURITY_CONTEXT_FN_W)(SEC_WCHAR *,
843  PSecBuffer, void *, PCtxtHandle);
844 #define IMPORT_SECURITY_CONTEXT_FN WINELIB_NAME_AW(IMPORT_SECURITY_CONTEXT_FN_)
845 
846 SECURITY_STATUS
847 SEC_ENTRY
848 AddCredentialsA(
849   _In_ PCredHandle hCredentials,
850   _In_opt_ SEC_CHAR *pszPrincipal,
851   _In_ SEC_CHAR *pszPackage,
852   _In_ ULONG fCredentialUse,
853   _In_opt_ void *pAuthData,
854   _In_opt_ SEC_GET_KEY_FN pGetKeyFn,
855   _In_opt_ void *pvGetKeyArgument,
856   _Out_opt_ PTimeStamp ptsExpiry);
857 
858 SECURITY_STATUS
859 SEC_ENTRY
860 AddCredentialsW(
861   _In_ PCredHandle hCredentials,
862   _In_opt_ SEC_WCHAR *pszPrincipal,
863   _In_ SEC_WCHAR *pszPackage,
864   _In_ ULONG fCredentialUse,
865   _In_opt_ void *pAuthData,
866   _In_opt_ SEC_GET_KEY_FN pGetKeyFn,
867   _In_opt_ void *pvGetKeyArgument,
868   _Out_opt_ PTimeStamp ptsExpiry);
869 
870 #define AddCredentials WINELIB_NAME_AW(AddCredentials)
871 
872 typedef SECURITY_STATUS (SEC_ENTRY *ADD_CREDENTIALS_FN_A)(PCredHandle,
873  SEC_CHAR *, SEC_CHAR *, ULONG, void *, SEC_GET_KEY_FN, void *,
874  PTimeStamp);
875 typedef SECURITY_STATUS (SEC_ENTRY *ADD_CREDENTIALS_FN_W)(PCredHandle,
876  SEC_WCHAR *, SEC_WCHAR *, ULONG, void *, SEC_GET_KEY_FN, void *,
877  PTimeStamp);
878 
879 SECURITY_STATUS
880 SEC_ENTRY
881 QuerySecurityContextToken(
882   _In_ PCtxtHandle phContext,
883   _Out_ HANDLE *phToken);
884 
885 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_SECURITY_CONTEXT_TOKEN_FN)
886  (PCtxtHandle, HANDLE *);
887 
888 SECURITY_STATUS
889 SEC_ENTRY
890 EncryptMessage(
891   _In_ PCtxtHandle phContext,
892   _In_ ULONG fQOP,
893   _In_ PSecBufferDesc pMessage,
894   _In_ ULONG MessageSeqNo);
895 
896 SECURITY_STATUS
897 SEC_ENTRY
898 DecryptMessage(
899   _In_ PCtxtHandle phContext,
900   _In_ PSecBufferDesc pMessage,
901   _In_ ULONG MessageSeqNo,
902   _Out_opt_ PULONG pfQOP);
903 
904 /* values for EncryptMessage fQOP */
905 #define SECQOP_WRAP_NO_ENCRYPT 0x80000001
906 
907 typedef SECURITY_STATUS (SEC_ENTRY *ENCRYPT_MESSAGE_FN)(PCtxtHandle, ULONG,
908  PSecBufferDesc, ULONG);
909 typedef SECURITY_STATUS (SEC_ENTRY *DECRYPT_MESSAGE_FN)(PCtxtHandle,
910  PSecBufferDesc, ULONG, PULONG);
911 
912 SECURITY_STATUS
913 SEC_ENTRY
914 SetContextAttributesA(
915   _In_ PCtxtHandle phContext,
916   _In_ ULONG ulAttribute,
917   _In_reads_bytes_(cbBuffer) void *pBuffer,
918   _In_ ULONG cbBuffer);
919 
920 SECURITY_STATUS
921 SEC_ENTRY
922 SetContextAttributesW(
923   _In_ PCtxtHandle phContext,
924   _In_ ULONG ulAttribute,
925   _In_reads_bytes_(cbBuffer) void *pBuffer,
926   _In_ ULONG cbBuffer);
927 
928 #define SetContextAttributes WINELIB_NAME_AW(SetContextAttributes)
929 
930 typedef SECURITY_STATUS (SEC_ENTRY *SET_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle,
931  ULONG, void *, ULONG);
932 typedef SECURITY_STATUS (SEC_ENTRY *SET_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle,
933  ULONG, void *, ULONG);
934 
935 #define SECURITY_ENTRYPOINT_ANSIA "InitSecurityInterfaceA"
936 #define SECURITY_ENTRYPOINT_ANSIW "InitSecurityInterfaceW"
937 #define SECURITY_ENTRYPOINT_ANSI WINELIB_NAME_AW(SECURITY_ENTRYPOINT_ANSI)
938 
939 typedef struct _SECURITY_FUNCTION_TABLE_A
940 {
941     ULONG                     dwVersion;
942     ENUMERATE_SECURITY_PACKAGES_FN_A  EnumerateSecurityPackagesA;
943     QUERY_CREDENTIALS_ATTRIBUTES_FN_A QueryCredentialsAttributesA;
944     ACQUIRE_CREDENTIALS_HANDLE_FN_A   AcquireCredentialsHandleA;
945     FREE_CREDENTIALS_HANDLE_FN        FreeCredentialsHandle;
946     void                             *Reserved2;
947     INITIALIZE_SECURITY_CONTEXT_FN_A  InitializeSecurityContextA;
948     ACCEPT_SECURITY_CONTEXT_FN        AcceptSecurityContext;
949     COMPLETE_AUTH_TOKEN_FN            CompleteAuthToken;
950     DELETE_SECURITY_CONTEXT_FN        DeleteSecurityContext;
951     APPLY_CONTROL_TOKEN_FN            ApplyControlToken;
952     QUERY_CONTEXT_ATTRIBUTES_FN_A     QueryContextAttributesA;
953     IMPERSONATE_SECURITY_CONTEXT_FN   ImpersonateSecurityContext;
954     REVERT_SECURITY_CONTEXT_FN        RevertSecurityContext;
955     MAKE_SIGNATURE_FN                 MakeSignature;
956     VERIFY_SIGNATURE_FN               VerifySignature;
957     FREE_CONTEXT_BUFFER_FN            FreeContextBuffer;
958     QUERY_SECURITY_PACKAGE_INFO_FN_A  QuerySecurityPackageInfoA;
959     void                             *Reserved3;
960     void                             *Reserved4;
961     EXPORT_SECURITY_CONTEXT_FN        ExportSecurityContext;
962     IMPORT_SECURITY_CONTEXT_FN_A      ImportSecurityContextA;
963     ADD_CREDENTIALS_FN_A              AddCredentialsA;
964     void                             *Reserved8;
965     QUERY_SECURITY_CONTEXT_TOKEN_FN   QuerySecurityContextToken;
966     ENCRYPT_MESSAGE_FN                EncryptMessage;
967     DECRYPT_MESSAGE_FN                DecryptMessage;
968     SET_CONTEXT_ATTRIBUTES_FN_A       SetContextAttributesA;
969 } SecurityFunctionTableA, *PSecurityFunctionTableA;
970 
971 /* No, it really is FreeCredentialsHandle, see the thread beginning
972  * http://sourceforge.net/mailarchive/message.php?msg_id=4321080 for a
973  * discovery discussion. */
974 typedef struct _SECURITY_FUNCTION_TABLE_W
975 {
976     ULONG                     dwVersion;
977     ENUMERATE_SECURITY_PACKAGES_FN_W  EnumerateSecurityPackagesW;
978     QUERY_CREDENTIALS_ATTRIBUTES_FN_W QueryCredentialsAttributesW;
979     ACQUIRE_CREDENTIALS_HANDLE_FN_W   AcquireCredentialsHandleW;
980     FREE_CREDENTIALS_HANDLE_FN        FreeCredentialsHandle;
981     void                             *Reserved2;
982     INITIALIZE_SECURITY_CONTEXT_FN_W  InitializeSecurityContextW;
983     ACCEPT_SECURITY_CONTEXT_FN        AcceptSecurityContext;
984     COMPLETE_AUTH_TOKEN_FN            CompleteAuthToken;
985     DELETE_SECURITY_CONTEXT_FN        DeleteSecurityContext;
986     APPLY_CONTROL_TOKEN_FN            ApplyControlToken;
987     QUERY_CONTEXT_ATTRIBUTES_FN_W     QueryContextAttributesW;
988     IMPERSONATE_SECURITY_CONTEXT_FN   ImpersonateSecurityContext;
989     REVERT_SECURITY_CONTEXT_FN        RevertSecurityContext;
990     MAKE_SIGNATURE_FN                 MakeSignature;
991     VERIFY_SIGNATURE_FN               VerifySignature;
992     FREE_CONTEXT_BUFFER_FN            FreeContextBuffer;
993     QUERY_SECURITY_PACKAGE_INFO_FN_W  QuerySecurityPackageInfoW;
994     void                             *Reserved3;
995     void                             *Reserved4;
996     EXPORT_SECURITY_CONTEXT_FN        ExportSecurityContext;
997     IMPORT_SECURITY_CONTEXT_FN_W      ImportSecurityContextW;
998     ADD_CREDENTIALS_FN_W              AddCredentialsW;
999     void                             *Reserved8;
1000     QUERY_SECURITY_CONTEXT_TOKEN_FN   QuerySecurityContextToken;
1001     ENCRYPT_MESSAGE_FN                EncryptMessage;
1002     DECRYPT_MESSAGE_FN                DecryptMessage;
1003     SET_CONTEXT_ATTRIBUTES_FN_W       SetContextAttributesW;
1004 } SecurityFunctionTableW, *PSecurityFunctionTableW;
1005 
1006 #define SecurityFunctionTable WINELIB_NAME_AW(SecurityFunctionTable)
1007 #define PSecurityFunctionTable WINELIB_NAME_AW(PSecurityFunctionTable)
1008 
1009 #define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION   1
1010 #define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_2 2
1011 
1012 PSecurityFunctionTableA SEC_ENTRY InitSecurityInterfaceA(void);
1013 PSecurityFunctionTableW SEC_ENTRY InitSecurityInterfaceW(void);
1014 #define InitSecurityInterface WINELIB_NAME_AW(InitSecurityInterface)
1015 
1016 typedef PSecurityFunctionTableA (SEC_ENTRY *INIT_SECURITY_INTERFACE_A)(void);
1017 typedef PSecurityFunctionTableW (SEC_ENTRY *INIT_SECURITY_INTERFACE_W)(void);
1018 #define INIT_SECURITY_INTERFACE WINELIB_NAME_AW(INIT_SECURITY_INTERFACE_)
1019 
1020 #ifdef __cplusplus
1021 }
1022 #endif
1023 
1024 #endif /* ndef __WINE_SSPI_H__ */
1025