FreeRDP
Loading...
Searching...
No Matches
include/winpr/sspi.h
1
20#ifndef WINPR_SSPI_H
21#define WINPR_SSPI_H
22
23#include <winpr/platform.h>
24#include <winpr/winpr.h>
25#include <winpr/cast.h>
26#include <winpr/wtypes.h>
27#include <winpr/windows.h>
28#include <winpr/security.h>
29
30#ifdef _WIN32
31
32#include <tchar.h>
33#include <winerror.h>
34
35#define SECURITY_WIN32
36#include <sspi.h>
37#include <security.h>
38
39#endif /* _WIN32 */
40
41#if !defined(_WIN32) || defined(_UWP)
42
43#ifndef SEC_ENTRY
44#define SEC_ENTRY
45#endif /* SEC_ENTRY */
46
47typedef CHAR SEC_CHAR;
48typedef WCHAR SEC_WCHAR;
49
50typedef struct
51{
52 UINT32 LowPart;
53 INT32 HighPart;
55
58
59WINPR_PRAGMA_DIAG_PUSH
60WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
61
62#ifndef __SECSTATUS_DEFINED__
63typedef LONG SECURITY_STATUS;
64// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
65#define __SECSTATUS_DEFINED__
66#endif /* __SECSTATUS_DEFINED__ */
67
68WINPR_PRAGMA_DIAG_POP
69
70typedef struct
71{
72 UINT32 fCapabilities;
73 UINT16 wVersion;
74 UINT16 wRPCID;
75 UINT32 cbMaxToken;
76 SEC_CHAR* Name;
77 SEC_CHAR* Comment;
80
81typedef struct
82{
83 UINT32 fCapabilities;
84 UINT16 wVersion;
85 UINT16 wRPCID;
86 UINT32 cbMaxToken;
87 SEC_WCHAR* Name;
88 SEC_WCHAR* Comment;
91
92#ifdef UNICODE
93#define SecPkgInfo SecPkgInfoW
94#define PSecPkgInfo PSecPkgInfoW
95#else
96#define SecPkgInfo SecPkgInfoA
97#define PSecPkgInfo PSecPkgInfoA
98#endif /* UNICODE */
99
100#endif /* !defined(_WIN32) || defined(_UWP) */
101
102#define NTLM_SSP_NAME _T("NTLM")
103#define KERBEROS_SSP_NAME _T("Kerberos")
104#define NEGO_SSP_NAME _T("Negotiate")
105
106#define SECPKG_ID_NONE 0xFFFF
107
108#define SECPKG_FLAG_INTEGRITY 0x00000001
109#define SECPKG_FLAG_PRIVACY 0x00000002
110#define SECPKG_FLAG_TOKEN_ONLY 0x00000004
111#define SECPKG_FLAG_DATAGRAM 0x00000008
112#define SECPKG_FLAG_CONNECTION 0x00000010
113#define SECPKG_FLAG_MULTI_REQUIRED 0x00000020
114#define SECPKG_FLAG_CLIENT_ONLY 0x00000040
115#define SECPKG_FLAG_EXTENDED_ERROR 0x00000080
116#define SECPKG_FLAG_IMPERSONATION 0x00000100
117#define SECPKG_FLAG_ACCEPT_WIN32_NAME 0x00000200
118#define SECPKG_FLAG_STREAM 0x00000400
119#define SECPKG_FLAG_NEGOTIABLE 0x00000800
120#define SECPKG_FLAG_GSS_COMPATIBLE 0x00001000
121#define SECPKG_FLAG_LOGON 0x00002000
122#define SECPKG_FLAG_ASCII_BUFFERS 0x00004000
123#define SECPKG_FLAG_FRAGMENT 0x00008000
124#define SECPKG_FLAG_MUTUAL_AUTH 0x00010000
125#define SECPKG_FLAG_DELEGATION 0x00020000
126#define SECPKG_FLAG_READONLY_WITH_CHECKSUM 0x00040000
127#define SECPKG_FLAG_RESTRICTED_TOKENS 0x00080000
128#define SECPKG_FLAG_NEGO_EXTENDER 0x00100000
129#define SECPKG_FLAG_NEGOTIABLE2 0x00200000
130
131#ifndef _WINERROR_
132
133#define SEC_E_OK WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x00000000)
134#define SEC_E_INSUFFICIENT_MEMORY WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090300)
135#define SEC_E_INVALID_HANDLE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090301)
136#define SEC_E_UNSUPPORTED_FUNCTION WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090302)
137#define SEC_E_TARGET_UNKNOWN WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090303)
138#define SEC_E_INTERNAL_ERROR WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090304)
139#define SEC_E_SECPKG_NOT_FOUND WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090305)
140#define SEC_E_NOT_OWNER WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090306)
141#define SEC_E_CANNOT_INSTALL WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090307)
142#define SEC_E_INVALID_TOKEN WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090308)
143#define SEC_E_CANNOT_PACK WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090309)
144#define SEC_E_QOP_NOT_SUPPORTED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009030A)
145#define SEC_E_NO_IMPERSONATION WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009030B)
146#define SEC_E_LOGON_DENIED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009030C)
147#define SEC_E_UNKNOWN_CREDENTIALS WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009030D)
148#define SEC_E_NO_CREDENTIALS WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009030E)
149#define SEC_E_MESSAGE_ALTERED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009030F)
150#define SEC_E_OUT_OF_SEQUENCE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090310)
151#define SEC_E_NO_AUTHENTICATING_AUTHORITY WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090311)
152#define SEC_E_BAD_PKGID WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090316)
153#define SEC_E_CONTEXT_EXPIRED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090317)
154#define SEC_E_INCOMPLETE_MESSAGE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090318)
155#define SEC_E_INCOMPLETE_CREDENTIALS WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090320)
156#define SEC_E_BUFFER_TOO_SMALL WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090321)
157#define SEC_E_WRONG_PRINCIPAL WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090322)
158#define SEC_E_TIME_SKEW WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090324)
159#define SEC_E_UNTRUSTED_ROOT WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090325)
160#define SEC_E_ILLEGAL_MESSAGE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090326)
161#define SEC_E_CERT_UNKNOWN WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090327)
162#define SEC_E_CERT_EXPIRED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090328)
163#define SEC_E_ENCRYPT_FAILURE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090329)
164#define SEC_E_DECRYPT_FAILURE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090330)
165#define SEC_E_ALGORITHM_MISMATCH WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090331)
166#define SEC_E_SECURITY_QOS_FAILED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090332)
167#define SEC_E_UNFINISHED_CONTEXT_DELETED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090333)
168#define SEC_E_NO_TGT_REPLY WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090334)
169#define SEC_E_NO_IP_ADDRESSES WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090335)
170#define SEC_E_WRONG_CREDENTIAL_HANDLE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090336)
171#define SEC_E_CRYPTO_SYSTEM_INVALID WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090337)
172#define SEC_E_MAX_REFERRALS_EXCEEDED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090338)
173#define SEC_E_MUST_BE_KDC WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090339)
174#define SEC_E_STRONG_CRYPTO_NOT_SUPPORTED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009033A)
175#define SEC_E_TOO_MANY_PRINCIPALS WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009033B)
176#define SEC_E_NO_PA_DATA WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009033C)
177#define SEC_E_PKINIT_NAME_MISMATCH WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009033D)
178#define SEC_E_SMARTCARD_LOGON_REQUIRED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009033E)
179#define SEC_E_SHUTDOWN_IN_PROGRESS WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009033F)
180#define SEC_E_KDC_INVALID_REQUEST WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090340)
181#define SEC_E_KDC_UNABLE_TO_REFER WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090341)
182#define SEC_E_KDC_UNKNOWN_ETYPE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090342)
183#define SEC_E_UNSUPPORTED_PREAUTH WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090343)
184#define SEC_E_DELEGATION_REQUIRED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090345)
185#define SEC_E_BAD_BINDINGS WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090346)
186#define SEC_E_MULTIPLE_ACCOUNTS WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090347)
187#define SEC_E_NO_KERB_KEY WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090348)
188#define SEC_E_CERT_WRONG_USAGE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090349)
189#define SEC_E_DOWNGRADE_DETECTED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090350)
190#define SEC_E_SMARTCARD_CERT_REVOKED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090351)
191#define SEC_E_ISSUING_CA_UNTRUSTED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090352)
192#define SEC_E_REVOCATION_OFFLINE_C WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090353)
193#define SEC_E_PKINIT_CLIENT_FAILURE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090354)
194#define SEC_E_SMARTCARD_CERT_EXPIRED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090355)
195#define SEC_E_NO_S4U_PROT_SUPPORT WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090356)
196#define SEC_E_CROSSREALM_DELEGATION_FAILURE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090357)
197#define SEC_E_REVOCATION_OFFLINE_KDC WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090358)
198#define SEC_E_ISSUING_CA_UNTRUSTED_KDC WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090359)
199#define SEC_E_KDC_CERT_EXPIRED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009035A)
200#define SEC_E_KDC_CERT_REVOKED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009035B)
201#define SEC_E_INVALID_PARAMETER WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009035D)
202#define SEC_E_DELEGATION_POLICY WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009035E)
203#define SEC_E_POLICY_NLTM_ONLY WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009035F)
204#define SEC_E_NO_CONTEXT WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090361)
205#define SEC_E_PKU2U_CERT_FAILURE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090362)
206#define SEC_E_MUTUAL_AUTH_FAILED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090363)
207
208#define SEC_I_CONTINUE_NEEDED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x00090312)
209#define SEC_I_COMPLETE_NEEDED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x00090313)
210#define SEC_I_COMPLETE_AND_CONTINUE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x00090314)
211#define SEC_I_LOCAL_LOGON WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x00090315)
212#define SEC_I_CONTEXT_EXPIRED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x00090317)
213#define SEC_I_INCOMPLETE_CREDENTIALS WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x00090320)
214#define SEC_I_RENEGOTIATE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x00090321)
215#define SEC_I_NO_LSA_CONTEXT WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x00090323)
216#define SEC_I_SIGNATURE_NEEDED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x0009035C)
217#define SEC_I_NO_RENEGOTIATION WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x00090360)
218
219#endif /* _WINERROR_ */
220
221/* ============== some definitions missing in mingw ========================*/
222#ifndef SEC_E_INVALID_PARAMETER
223#define SEC_E_INVALID_PARAMETER WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009035D)
224#endif
225
226#ifndef SEC_E_DELEGATION_POLICY
227#define SEC_E_DELEGATION_POLICY WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009035E)
228#endif
229
230#ifndef SEC_E_POLICY_NLTM_ONLY
231#define SEC_E_POLICY_NLTM_ONLY WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x8009035F)
232#endif
233
234#ifndef SEC_E_NO_CONTEXT
235#define SEC_E_NO_CONTEXT WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090361)
236#endif
237
238#ifndef SEC_E_PKU2U_CERT_FAILURE
239#define SEC_E_PKU2U_CERT_FAILURE WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090362)
240#endif
241
242#ifndef SEC_E_MUTUAL_AUTH_FAILED
243#define SEC_E_MUTUAL_AUTH_FAILED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x80090363)
244#endif
245
246#ifndef SEC_I_SIGNATURE_NEEDED
247#define SEC_I_SIGNATURE_NEEDED WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x0009035C)
248#endif
249
250#ifndef SEC_I_NO_RENEGOTIATION
251#define SEC_I_NO_RENEGOTIATION WINPR_CXX_COMPAT_CAST(SECURITY_STATUS, 0x00090360)
252#endif
253
254/* ==================================================================================== */
255
256#define SECURITY_NATIVE_DREP 0x00000010
257#define SECURITY_NETWORK_DREP 0x00000000
258
259#define SECPKG_CRED_INBOUND 0x00000001
260#define SECPKG_CRED_OUTBOUND 0x00000002
261#define SECPKG_CRED_BOTH 0x00000003
262#define SECPKG_CRED_AUTOLOGON_RESTRICTED 0x00000010
263#define SECPKG_CRED_PROCESS_POLICY_ONLY 0x00000020
264
265/* Security Context Attributes */
266
267#define SECPKG_ATTR_SIZES 0
268#define SECPKG_ATTR_NAMES 1
269#define SECPKG_ATTR_LIFESPAN 2
270#define SECPKG_ATTR_DCE_INFO 3
271#define SECPKG_ATTR_STREAM_SIZES 4
272#define SECPKG_ATTR_KEY_INFO 5
273#define SECPKG_ATTR_AUTHORITY 6
274#define SECPKG_ATTR_PROTO_INFO 7
275#define SECPKG_ATTR_PASSWORD_EXPIRY 8
276#define SECPKG_ATTR_SESSION_KEY 9
277#define SECPKG_ATTR_PACKAGE_INFO 10
278#define SECPKG_ATTR_USER_FLAGS 11
279#define SECPKG_ATTR_NEGOTIATION_INFO 12
280#define SECPKG_ATTR_NATIVE_NAMES 13
281#define SECPKG_ATTR_FLAGS 14
282#define SECPKG_ATTR_USE_VALIDATED 15
283#define SECPKG_ATTR_CREDENTIAL_NAME 16
284#define SECPKG_ATTR_TARGET_INFORMATION 17
285#define SECPKG_ATTR_ACCESS_TOKEN 18
286#define SECPKG_ATTR_TARGET 19
287#define SECPKG_ATTR_AUTHENTICATION_ID 20
288#define SECPKG_ATTR_LOGOFF_TIME 21
289#define SECPKG_ATTR_NEGO_KEYS 22
290#define SECPKG_ATTR_PROMPTING_NEEDED 24
291#define SECPKG_ATTR_UNIQUE_BINDINGS 25
292#define SECPKG_ATTR_ENDPOINT_BINDINGS 26
293#define SECPKG_ATTR_CLIENT_SPECIFIED_TARGET 27
294#define SECPKG_ATTR_LAST_CLIENT_TOKEN_STATUS 30
295#define SECPKG_ATTR_NEGO_PKG_INFO 31
296#define SECPKG_ATTR_NEGO_STATUS 32
297#define SECPKG_ATTR_CONTEXT_DELETED 33
298
299#if !defined(_WIN32) || defined(_UWP)
300
301typedef struct
302{
303 void* AccessToken;
305
306typedef struct
307{
308 UINT32 dwFlags;
309 UINT32 cbAppData;
310 BYTE* pbAppData;
312
313typedef struct
314{
315 char* sAuthorityName;
317
318typedef struct
319{
320 char* sTargetName;
322
323typedef UINT32 ALG_ID;
324
325typedef struct
326{
327 UINT32 dwProtocol;
328 ALG_ID aiCipher;
329 UINT32 dwCipherStrength;
330 ALG_ID aiHash;
331 UINT32 dwHashStrength;
332 ALG_ID aiExch;
333 UINT32 dwExchStrength;
335
336typedef struct
337{
338 UINT32 AuthBufferLen;
339 BYTE* AuthBuffer;
341
342typedef struct
343{
344 UINT32 AuthzSvc;
345 void* pPac;
347
348typedef struct
349{
350 UINT32 dwInitiatorAddrType;
351 UINT32 cbInitiatorLength;
352 UINT32 dwInitiatorOffset;
353 UINT32 dwAcceptorAddrType;
354 UINT32 cbAcceptorLength;
355 UINT32 dwAcceptorOffset;
356 UINT32 cbApplicationDataLength;
357 UINT32 dwApplicationDataOffset;
359
360typedef struct
361{
362 BYTE rgbKeys[128];
363 BYTE rgbIVs[64];
365
366typedef struct
367{
368 UINT32 Flags;
370
371typedef struct
372{
373 char* sSignatureAlgorithmName;
374 char* sEncryptAlgorithmName;
375 UINT32 KeySize;
376 UINT32 SignatureAlgorithm;
377 UINT32 EncryptAlgorithm;
379
380typedef struct
381{
382 TimeStamp tsStart;
383 TimeStamp tsExpiry;
385
386typedef struct
387{
388 char* sUserName;
390
391typedef struct
392{
393 char* sClientName;
394 char* sServerName;
396
397typedef struct
398{
399 SecPkgInfo* PackageInfo;
400 UINT32 NegotiationState;
402
403typedef struct
404{
405 SecPkgInfo* PackageInfo;
407
408typedef struct
409{
410 TimeStamp tsPasswordExpires;
412
413typedef struct
414{
415 UINT32 SessionKeyLength;
416 BYTE* SessionKey;
418
419typedef struct
420{
421 UINT32 dwFlags;
422 UINT32 cbSessionId;
423 BYTE rgbSessionId[32];
425
426typedef struct
427{
428 UINT32 cbMaxToken;
429 UINT32 cbMaxSignature;
430 UINT32 cbBlockSize;
431 UINT32 cbSecurityTrailer;
433
434typedef struct
435{
436 UINT32 cbHeader;
437 UINT32 cbTrailer;
438 UINT32 cbMaximumMessage;
439 UINT32 cBuffers;
440 UINT32 cbBlockSize;
442
443typedef struct
444{
445 void* AttributeInfo;
447
448typedef struct
449{
450 UINT16 cSignatureAndHashAlgorithms;
451 UINT16* pSignatureAndHashAlgorithms;
453
454typedef struct
455{
456 UINT32 MarshalledTargetInfoLength;
457 BYTE* MarshalledTargetInfo;
459
460/* Security Credentials Attributes */
461
462#define SECPKG_CRED_ATTR_NAMES 1
463#define SECPKG_CRED_ATTR_SSI_PROVIDER 2
464#define SECPKG_CRED_ATTR_CERT 4
465#define SECPKG_CRED_ATTR_PAC_BYPASS 5
466
467typedef struct
468{
469 SEC_CHAR* sUserName;
472
473typedef struct
474{
475 SEC_WCHAR* sUserName;
478
479#ifdef UNICODE
480#define SecPkgCredentials_Names SecPkgCredentials_NamesW
481#define PSecPkgCredentials_Names PSecPkgCredentials_NamesW
482#else
483#define SecPkgCredentials_Names SecPkgCredentials_NamesA
484#define PSecPkgCredentials_Names PSecPkgCredentials_NamesA
485#endif
486
487typedef struct
488{
489 SEC_WCHAR* sProviderName;
490 unsigned long ProviderInfoLength;
491 char* ProviderInfo;
493
494typedef struct
495{
496 SEC_CHAR* sProviderName;
497 unsigned long ProviderInfoLength;
498 char* ProviderInfo;
500
501#ifdef UNICODE
502#define SecPkgCredentials_SSIProvider SecPkgCredentials_SSIProviderW
503#define PSecPkgCredentials_SSIProvider PSecPkgCredentials_SSIProviderW
504#else
505#define SecPkgCredentials_SSIProvider SecPkgCredentials_SSIProviderA
506#define PSecPkgCredentials_SSIProvider PSecPkgCredentials_SSIProviderA
507#endif
508
509typedef struct
510{
511 unsigned long EncodedCertSize;
512 unsigned char* EncodedCert;
514
515#endif /* !defined(_WIN32) || defined(_UWP) */
516
517#if !defined(_WIN32) || defined(_UWP) || (defined(__MINGW32__) && (__MINGW64_VERSION_MAJOR <= 8))
518
519#define SECPKG_CRED_ATTR_KDC_PROXY_SETTINGS 3
520
521#define KDC_PROXY_SETTINGS_V1 1
522#define KDC_PROXY_SETTINGS_FLAGS_FORCEPROXY 0x1
523
524typedef struct
525{
526 ULONG Version;
527 ULONG Flags;
528 USHORT ProxyServerOffset;
529 USHORT ProxyServerLength;
530 USHORT ClientTlsCredOffset;
531 USHORT ClientTlsCredLength;
533
534typedef struct
535{
536 ULONG Version;
537 ULONG Flags;
538 USHORT ProxyServerOffset;
539 USHORT ProxyServerLength;
540 USHORT ClientTlsCredOffset;
541 USHORT ClientTlsCredLength;
543
544#ifdef UNICODE
545#define SecPkgCredentials_KdcProxySettings SecPkgCredentials_KdcProxySettingsW
546#define PSecPkgCredentials_KdcProxySettings PSecPkgCredentials_KdcProxySettingsW
547#else
548#define SecPkgCredentials_KdcProxySettings SecPkgCredentials_KdcProxySettingsA
549#define PSecPkgCredentials_KdcProxySettings SecPkgCredentials_KdcProxySettingsA
550#endif
551
552typedef struct
553{
554 UINT32 BindingsLength;
555 SEC_CHANNEL_BINDINGS* Bindings;
557#endif
558
559/* InitializeSecurityContext Flags */
560
561#define ISC_REQ_DELEGATE 0x00000001
562#define ISC_REQ_MUTUAL_AUTH 0x00000002
563#define ISC_REQ_REPLAY_DETECT 0x00000004
564#define ISC_REQ_SEQUENCE_DETECT 0x00000008
565#define ISC_REQ_CONFIDENTIALITY 0x00000010
566#define ISC_REQ_USE_SESSION_KEY 0x00000020
567#define ISC_REQ_PROMPT_FOR_CREDS 0x00000040
568#define ISC_REQ_USE_SUPPLIED_CREDS 0x00000080
569#define ISC_REQ_ALLOCATE_MEMORY 0x00000100
570#define ISC_REQ_USE_DCE_STYLE 0x00000200
571#define ISC_REQ_DATAGRAM 0x00000400
572#define ISC_REQ_CONNECTION 0x00000800
573#define ISC_REQ_CALL_LEVEL 0x00001000
574#define ISC_REQ_FRAGMENT_SUPPLIED 0x00002000
575#define ISC_REQ_EXTENDED_ERROR 0x00004000
576#define ISC_REQ_STREAM 0x00008000
577#define ISC_REQ_INTEGRITY 0x00010000
578#define ISC_REQ_IDENTIFY 0x00020000
579#define ISC_REQ_NULL_SESSION 0x00040000
580#define ISC_REQ_MANUAL_CRED_VALIDATION 0x00080000
581#define ISC_REQ_RESERVED1 0x00100000
582#define ISC_REQ_FRAGMENT_TO_FIT 0x00200000
583#define ISC_REQ_FORWARD_CREDENTIALS 0x00400000
584#define ISC_REQ_NO_INTEGRITY 0x00800000
585#define ISC_REQ_USE_HTTP_STYLE 0x01000000
586
587#define ISC_RET_DELEGATE 0x00000001
588#define ISC_RET_MUTUAL_AUTH 0x00000002
589#define ISC_RET_REPLAY_DETECT 0x00000004
590#define ISC_RET_SEQUENCE_DETECT 0x00000008
591#define ISC_RET_CONFIDENTIALITY 0x00000010
592#define ISC_RET_USE_SESSION_KEY 0x00000020
593#define ISC_RET_USED_COLLECTED_CREDS 0x00000040
594#define ISC_RET_USED_SUPPLIED_CREDS 0x00000080
595#define ISC_RET_ALLOCATED_MEMORY 0x00000100
596#define ISC_RET_USED_DCE_STYLE 0x00000200
597#define ISC_RET_DATAGRAM 0x00000400
598#define ISC_RET_CONNECTION 0x00000800
599#define ISC_RET_INTERMEDIATE_RETURN 0x00001000
600#define ISC_RET_CALL_LEVEL 0x00002000
601#define ISC_RET_EXTENDED_ERROR 0x00004000
602#define ISC_RET_STREAM 0x00008000
603#define ISC_RET_INTEGRITY 0x00010000
604#define ISC_RET_IDENTIFY 0x00020000
605#define ISC_RET_NULL_SESSION 0x00040000
606#define ISC_RET_MANUAL_CRED_VALIDATION 0x00080000
607#define ISC_RET_RESERVED1 0x00100000
608#define ISC_RET_FRAGMENT_ONLY 0x00200000
609#define ISC_RET_FORWARD_CREDENTIALS 0x00400000
610#define ISC_RET_USED_HTTP_STYLE 0x01000000
611
612/* AcceptSecurityContext Flags */
613
614#define ASC_REQ_DELEGATE 0x00000001
615#define ASC_REQ_MUTUAL_AUTH 0x00000002
616#define ASC_REQ_REPLAY_DETECT 0x00000004
617#define ASC_REQ_SEQUENCE_DETECT 0x00000008
618#define ASC_REQ_CONFIDENTIALITY 0x00000010
619#define ASC_REQ_USE_SESSION_KEY 0x00000020
620#define ASC_REQ_ALLOCATE_MEMORY 0x00000100
621#define ASC_REQ_USE_DCE_STYLE 0x00000200
622#define ASC_REQ_DATAGRAM 0x00000400
623#define ASC_REQ_CONNECTION 0x00000800
624#define ASC_REQ_CALL_LEVEL 0x00001000
625#define ASC_REQ_EXTENDED_ERROR 0x00008000
626#define ASC_REQ_STREAM 0x00010000
627#define ASC_REQ_INTEGRITY 0x00020000
628#define ASC_REQ_LICENSING 0x00040000
629#define ASC_REQ_IDENTIFY 0x00080000
630#define ASC_REQ_ALLOW_NULL_SESSION 0x00100000
631#define ASC_REQ_ALLOW_NON_USER_LOGONS 0x00200000
632#define ASC_REQ_ALLOW_CONTEXT_REPLAY 0x00400000
633#define ASC_REQ_FRAGMENT_TO_FIT 0x00800000
634#define ASC_REQ_FRAGMENT_SUPPLIED 0x00002000
635#define ASC_REQ_NO_TOKEN 0x01000000
636#define ASC_REQ_PROXY_BINDINGS 0x04000000
637#define ASC_REQ_ALLOW_MISSING_BINDINGS 0x10000000
638
639#define ASC_RET_DELEGATE 0x00000001
640#define ASC_RET_MUTUAL_AUTH 0x00000002
641#define ASC_RET_REPLAY_DETECT 0x00000004
642#define ASC_RET_SEQUENCE_DETECT 0x00000008
643#define ASC_RET_CONFIDENTIALITY 0x00000010
644#define ASC_RET_USE_SESSION_KEY 0x00000020
645#define ASC_RET_ALLOCATED_MEMORY 0x00000100
646#define ASC_RET_USED_DCE_STYLE 0x00000200
647#define ASC_RET_DATAGRAM 0x00000400
648#define ASC_RET_CONNECTION 0x00000800
649#define ASC_RET_CALL_LEVEL 0x00002000
650#define ASC_RET_THIRD_LEG_FAILED 0x00004000
651#define ASC_RET_EXTENDED_ERROR 0x00008000
652#define ASC_RET_STREAM 0x00010000
653#define ASC_RET_INTEGRITY 0x00020000
654#define ASC_RET_LICENSING 0x00040000
655#define ASC_RET_IDENTIFY 0x00080000
656#define ASC_RET_NULL_SESSION 0x00100000
657#define ASC_RET_ALLOW_NON_USER_LOGONS 0x00200000
658#define ASC_RET_FRAGMENT_ONLY 0x00800000
659#define ASC_RET_NO_TOKEN 0x01000000
660#define ASC_RET_NO_PROXY_BINDINGS 0x04000000
661#define ASC_RET_MISSING_BINDINGS 0x10000000
662
663#define SEC_WINNT_AUTH_IDENTITY_ANSI 0x1
664#define SEC_WINNT_AUTH_IDENTITY_UNICODE 0x2
665#define SEC_WINNT_AUTH_IDENTITY_MARSHALLED 0x4
666#define SEC_WINNT_AUTH_IDENTITY_ONLY 0x8
667#define SEC_WINNT_AUTH_IDENTITY_EXTENDED 0x100
668
669#if !defined(_WIN32) || defined(_UWP) || defined(__MINGW32__)
670
671WINPR_PRAGMA_DIAG_PUSH
672WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
673
674#ifndef _AUTH_IDENTITY_DEFINED
675// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
676#define _AUTH_IDENTITY_DEFINED
677
678typedef struct
679{
680 UINT16* User;
681 ULONG UserLength;
682 UINT16* Domain;
683 ULONG DomainLength;
684 UINT16* Password;
685 ULONG PasswordLength;
686 UINT32 Flags;
688
689typedef struct
690{
691 BYTE* User;
692 ULONG UserLength;
693 BYTE* Domain;
694 ULONG DomainLength;
695 BYTE* Password;
696 ULONG PasswordLength;
697 UINT32 Flags;
699
700// Always define SEC_WINNT_AUTH_IDENTITY to SEC_WINNT_AUTH_IDENTITY_W
701
702#ifdef UNICODE
703#define SEC_WINNT_AUTH_IDENTITY SEC_WINNT_AUTH_IDENTITY_W
704#define PSEC_WINNT_AUTH_IDENTITY PSEC_WINNT_AUTH_IDENTITY_W
705#else
706#define SEC_WINNT_AUTH_IDENTITY SEC_WINNT_AUTH_IDENTITY_W
707#define PSEC_WINNT_AUTH_IDENTITY PSEC_WINNT_AUTH_IDENTITY_W
708#endif
709
710#endif /* _AUTH_IDENTITY_DEFINED */
711
712#ifndef SEC_WINNT_AUTH_IDENTITY_VERSION
713#define SEC_WINNT_AUTH_IDENTITY_VERSION 0x200
714
715typedef struct
716{
717 UINT32 Version;
718 UINT32 Length;
719 UINT16* User;
720 UINT32 UserLength;
721 UINT16* Domain;
722 UINT32 DomainLength;
723 UINT16* Password;
724 UINT32 PasswordLength;
725 UINT32 Flags;
726 UINT16* PackageList;
727 UINT32 PackageListLength;
729
730typedef struct
731{
732 UINT32 Version;
733 UINT32 Length;
734 BYTE* User;
735 UINT32 UserLength;
736 BYTE* Domain;
737 UINT32 DomainLength;
738 BYTE* Password;
739 UINT32 PasswordLength;
740 UINT32 Flags;
741 BYTE* PackageList;
742 UINT32 PackageListLength;
744
745#ifdef UNICODE
746#define SEC_WINNT_AUTH_IDENTITY_EX SEC_WINNT_AUTH_IDENTITY_EXW
747#define PSEC_WINNT_AUTH_IDENTITY_EX PSEC_WINNT_AUTH_IDENTITY_EXW
748#else
749#define SEC_WINNT_AUTH_IDENTITY_EX SEC_WINNT_AUTH_IDENTITY_EXA
750#define PSEC_WINNT_AUTH_IDENTITY_EX PSEC_WINNT_AUTH_IDENTITY_EXA
751#endif
752
753#endif /* SEC_WINNT_AUTH_IDENTITY_VERSION */
754
755#ifndef SEC_WINNT_AUTH_IDENTITY_VERSION_2
756#define SEC_WINNT_AUTH_IDENTITY_VERSION_2 0x201
757
758typedef struct
759{
760 UINT32 Version;
761 UINT16 cbHeaderLength;
762 UINT32 cbStructureLength;
763 UINT32 UserOffset;
764 UINT16 UserLength;
765 UINT32 DomainOffset;
766 UINT16 DomainLength;
767 UINT32 PackedCredentialsOffset;
768 UINT16 PackedCredentialsLength;
769 UINT32 Flags;
770 UINT32 PackageListOffset;
771 UINT16 PackageListLength;
773
774#endif /* SEC_WINNT_AUTH_IDENTITY_VERSION_2 */
775
776#ifndef _AUTH_IDENTITY_INFO_DEFINED
777// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
778#define _AUTH_IDENTITY_INFO_DEFINED
779
780// https://docs.microsoft.com/en-us/windows/win32/api/sspi/ns-sspi-sec_winnt_auth_identity_info
781
790
791#define SEC_WINNT_AUTH_IDENTITY_FLAGS_PROCESS_ENCRYPTED 0x10
792#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SYSTEM_PROTECTED 0x20
793#define SEC_WINNT_AUTH_IDENTITY_FLAGS_USER_PROTECTED 0x40
794#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SYSTEM_ENCRYPTED 0x80
795#define SEC_WINNT_AUTH_IDENTITY_FLAGS_RESERVED 0x10000
796#define SEC_WINNT_AUTH_IDENTITY_FLAGS_NULL_USER 0x20000
797#define SEC_WINNT_AUTH_IDENTITY_FLAGS_NULL_DOMAIN 0x40000
798#define SEC_WINNT_AUTH_IDENTITY_FLAGS_ID_PROVIDER 0x80000
799
800#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_USE_MASK 0xFF000000
801#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_CREDPROV_DO_NOT_SAVE 0x80000000
802#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_SAVE_CRED_CHECKED 0x40000000
803#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_NO_CHECKBOX 0x20000000
804#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_CREDPROV_DO_NOT_LOAD 0x10000000
805
806#define SEC_WINNT_AUTH_IDENTITY_FLAGS_VALID_SSPIPFC_FLAGS \
807 (SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_CREDPROV_DO_NOT_SAVE | \
808 SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_SAVE_CRED_CHECKED | \
809 SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_NO_CHECKBOX | \
810 SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_CREDPROV_DO_NOT_LOAD)
811
812#endif /* _AUTH_IDENTITY_INFO_DEFINED */
813
814WINPR_PRAGMA_DIAG_POP
815
816#if !defined(__MINGW32__)
817typedef struct
818{
819 ULONG_PTR dwLower;
820 ULONG_PTR dwUpper;
821} SecHandle;
822typedef SecHandle* PSecHandle;
823
824typedef SecHandle CredHandle;
825typedef CredHandle* PCredHandle;
826typedef SecHandle CtxtHandle;
827typedef CtxtHandle* PCtxtHandle;
828
829#define SecInvalidateHandle(x) \
830 ((PSecHandle)(x))->dwLower = ((PSecHandle)(x))->dwUpper = ((ULONG_PTR)((INT_PTR)-1))
831
832#define SecIsValidHandle(x) \
833 ((((PSecHandle)(x))->dwLower != ((ULONG_PTR)((INT_PTR)-1))) && \
834 (((PSecHandle)(x))->dwUpper != ((ULONG_PTR)((INT_PTR)-1))))
835
836typedef struct
837{
838 ULONG cbBuffer;
839 ULONG BufferType;
840 void* pvBuffer;
841} SecBuffer;
842typedef SecBuffer* PSecBuffer;
843
844typedef struct
845{
846 ULONG ulVersion;
847 ULONG cBuffers;
848 PSecBuffer pBuffers;
851
852#endif /* __MINGW32__ */
853
854#endif /* !defined(_WIN32) || defined(_UWP) || defined(__MINGW32__) */
855
875typedef SECURITY_STATUS (*psSspiNtlmHashCallback)(void* client,
876 const SEC_WINNT_AUTH_IDENTITY* authIdentity,
877 const SecBuffer* ntproofvalue,
878 const BYTE* randkey, const BYTE* mic,
879 const SecBuffer* micvalue, BYTE* ntlmhash);
880
881typedef struct
882{
883 char* samFile;
884 WINPR_ATTR_NODISCARD psSspiNtlmHashCallback
888
889typedef struct
890{
891 char* kdcUrl;
892 char* keytab;
893 char* cache;
894 char* armorCache;
895 char* pkinitX509Anchors;
896 char* pkinitX509Identity;
897 BOOL withPac;
898 INT32 startTime;
899 INT32 renewLifeTime;
900 INT32 lifeTime;
901 BYTE certSha1[20];
903
904typedef struct
905{
907 SEC_WINPR_NTLM_SETTINGS* ntlmSettings;
908 SEC_WINPR_KERBEROS_SETTINGS* kerberosSettings;
910
911#define SECBUFFER_VERSION 0
912
913/* Buffer Types */
914#define SECBUFFER_EMPTY 0
915#define SECBUFFER_DATA 1
916#define SECBUFFER_TOKEN 2
917#define SECBUFFER_PKG_PARAMS 3
918#define SECBUFFER_MISSING 4
919#define SECBUFFER_EXTRA 5
920#define SECBUFFER_STREAM_TRAILER 6
921#define SECBUFFER_STREAM_HEADER 7
922#define SECBUFFER_NEGOTIATION_INFO 8
923#define SECBUFFER_PADDING 9
924#define SECBUFFER_STREAM 10
925#define SECBUFFER_MECHLIST 11
926#define SECBUFFER_MECHLIST_SIGNATURE 12
927#define SECBUFFER_TARGET 13
928#define SECBUFFER_CHANNEL_BINDINGS 14
929#define SECBUFFER_CHANGE_PASS_RESPONSE 15
930#define SECBUFFER_TARGET_HOST 16
931#define SECBUFFER_ALERT 17
932
933/* Security Buffer Flags */
934#define SECBUFFER_ATTRMASK 0xF0000000
935#define SECBUFFER_READONLY 0x80000000
936#define SECBUFFER_READONLY_WITH_CHECKSUM 0x10000000
937#define SECBUFFER_RESERVED 0x60000000
938
939#if !defined(_WIN32) || defined(_UWP)
940
941typedef void(SEC_ENTRY* SEC_GET_KEY_FN)(void* Arg, void* Principal, UINT32 KeyVer, void** Key,
942 SECURITY_STATUS* pStatus);
943
944typedef SECURITY_STATUS(SEC_ENTRY* ENUMERATE_SECURITY_PACKAGES_FN_A)(ULONG* pcPackages,
945 PSecPkgInfoA* ppPackageInfo);
946typedef SECURITY_STATUS(SEC_ENTRY* ENUMERATE_SECURITY_PACKAGES_FN_W)(ULONG* pcPackages,
947 PSecPkgInfoW* ppPackageInfo);
948
949#ifdef UNICODE
950#define EnumerateSecurityPackages EnumerateSecurityPackagesW
951#define ENUMERATE_SECURITY_PACKAGES_FN ENUMERATE_SECURITY_PACKAGES_FN_W
952#else
953#define EnumerateSecurityPackages EnumerateSecurityPackagesA
954#define ENUMERATE_SECURITY_PACKAGES_FN ENUMERATE_SECURITY_PACKAGES_FN_A
955#endif
956
957typedef SECURITY_STATUS(SEC_ENTRY* QUERY_CREDENTIALS_ATTRIBUTES_FN_A)(PCredHandle phCredential,
958 ULONG ulAttribute,
959 void* pBuffer);
960typedef SECURITY_STATUS(SEC_ENTRY* QUERY_CREDENTIALS_ATTRIBUTES_FN_W)(PCredHandle phCredential,
961 ULONG ulAttribute,
962 void* pBuffer);
963
964#ifdef UNICODE
965#define QueryCredentialsAttributes QueryCredentialsAttributesW
966#define QUERY_CREDENTIALS_ATTRIBUTES_FN QUERY_CREDENTIALS_ATTRIBUTES_FN_W
967#else
968#define QueryCredentialsAttributes QueryCredentialsAttributesA
969#define QUERY_CREDENTIALS_ATTRIBUTES_FN QUERY_CREDENTIALS_ATTRIBUTES_FN_A
970#endif
971
972typedef SECURITY_STATUS(SEC_ENTRY* ACQUIRE_CREDENTIALS_HANDLE_FN_A)(
973 LPSTR pszPrincipal, LPSTR pszPackage, ULONG fCredentialUse, void* pvLogonID, void* pAuthData,
974 SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PCredHandle phCredential,
975 PTimeStamp ptsExpiry);
976typedef SECURITY_STATUS(SEC_ENTRY* ACQUIRE_CREDENTIALS_HANDLE_FN_W)(
977 LPWSTR pszPrincipal, LPWSTR pszPackage, ULONG fCredentialUse, void* pvLogonID, void* pAuthData,
978 SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PCredHandle phCredential,
979 PTimeStamp ptsExpiry);
980
981#ifdef UNICODE
982#define AcquireCredentialsHandle AcquireCredentialsHandleW
983#define ACQUIRE_CREDENTIALS_HANDLE_FN ACQUIRE_CREDENTIALS_HANDLE_FN_W
984#else
985#define AcquireCredentialsHandle AcquireCredentialsHandleA
986#define ACQUIRE_CREDENTIALS_HANDLE_FN ACQUIRE_CREDENTIALS_HANDLE_FN_A
987#endif
988
989typedef SECURITY_STATUS(SEC_ENTRY* FREE_CREDENTIALS_HANDLE_FN)(PCredHandle phCredential);
990
991typedef SECURITY_STATUS(SEC_ENTRY* INITIALIZE_SECURITY_CONTEXT_FN_A)(
992 PCredHandle phCredential, PCtxtHandle phContext, SEC_CHAR* pszTargetName, ULONG fContextReq,
993 ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput, ULONG Reserved2,
994 PCtxtHandle phNewContext, PSecBufferDesc pOutput, PULONG pfContextAttr, PTimeStamp ptsExpiry);
995typedef SECURITY_STATUS(SEC_ENTRY* INITIALIZE_SECURITY_CONTEXT_FN_W)(
996 PCredHandle phCredential, PCtxtHandle phContext, SEC_WCHAR* pszTargetName, ULONG fContextReq,
997 ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput, ULONG Reserved2,
998 PCtxtHandle phNewContext, PSecBufferDesc pOutput, PULONG pfContextAttr, PTimeStamp ptsExpiry);
999
1000#ifdef UNICODE
1001#define InitializeSecurityContext InitializeSecurityContextW
1002#define INITIALIZE_SECURITY_CONTEXT_FN INITIALIZE_SECURITY_CONTEXT_FN_W
1003#else
1004#define InitializeSecurityContext InitializeSecurityContextA
1005#define INITIALIZE_SECURITY_CONTEXT_FN INITIALIZE_SECURITY_CONTEXT_FN_A
1006#endif
1007
1008typedef SECURITY_STATUS(SEC_ENTRY* ACCEPT_SECURITY_CONTEXT_FN)(
1009 PCredHandle phCredential, PCtxtHandle phContext, PSecBufferDesc pInput, ULONG fContextReq,
1010 ULONG TargetDataRep, PCtxtHandle phNewContext, PSecBufferDesc pOutput, PULONG pfContextAttr,
1011 PTimeStamp ptsTimeStamp);
1012
1013typedef SECURITY_STATUS(SEC_ENTRY* COMPLETE_AUTH_TOKEN_FN)(PCtxtHandle phContext,
1014 PSecBufferDesc pToken);
1015
1016typedef SECURITY_STATUS(SEC_ENTRY* DELETE_SECURITY_CONTEXT_FN)(PCtxtHandle phContext);
1017
1018typedef SECURITY_STATUS(SEC_ENTRY* APPLY_CONTROL_TOKEN_FN)(PCtxtHandle phContext,
1019 PSecBufferDesc pInput);
1020
1021typedef SECURITY_STATUS(SEC_ENTRY* QUERY_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle phContext,
1022 ULONG ulAttribute, void* pBuffer);
1023typedef SECURITY_STATUS(SEC_ENTRY* QUERY_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle phContext,
1024 ULONG ulAttribute, void* pBuffer);
1025
1026#ifdef UNICODE
1027#define QueryContextAttributes QueryContextAttributesW
1028#define QUERY_CONTEXT_ATTRIBUTES_FN QUERY_CONTEXT_ATTRIBUTES_FN_W
1029#else
1030#define QueryContextAttributes QueryContextAttributesA
1031#define QUERY_CONTEXT_ATTRIBUTES_FN QUERY_CONTEXT_ATTRIBUTES_FN_A
1032#endif
1033
1034typedef SECURITY_STATUS(SEC_ENTRY* IMPERSONATE_SECURITY_CONTEXT_FN)(PCtxtHandle phContext);
1035
1036typedef SECURITY_STATUS(SEC_ENTRY* REVERT_SECURITY_CONTEXT_FN)(PCtxtHandle phContext);
1037
1038typedef SECURITY_STATUS(SEC_ENTRY* MAKE_SIGNATURE_FN)(PCtxtHandle phContext, ULONG fQOP,
1039 PSecBufferDesc pMessage, ULONG MessageSeqNo);
1040
1041typedef SECURITY_STATUS(SEC_ENTRY* VERIFY_SIGNATURE_FN)(PCtxtHandle phContext,
1042 PSecBufferDesc pMessage, ULONG MessageSeqNo,
1043 PULONG pfQOP);
1044
1045typedef SECURITY_STATUS(SEC_ENTRY* FREE_CONTEXT_BUFFER_FN)(void* pvContextBuffer);
1046
1047typedef SECURITY_STATUS(SEC_ENTRY* QUERY_SECURITY_PACKAGE_INFO_FN_A)(SEC_CHAR* pszPackageName,
1048 PSecPkgInfoA* ppPackageInfo);
1049typedef SECURITY_STATUS(SEC_ENTRY* QUERY_SECURITY_PACKAGE_INFO_FN_W)(SEC_WCHAR* pszPackageName,
1050 PSecPkgInfoW* ppPackageInfo);
1051
1052#ifdef UNICODE
1053#define QuerySecurityPackageInfo QuerySecurityPackageInfoW
1054#define QUERY_SECURITY_PACKAGE_INFO_FN QUERY_SECURITY_PACKAGE_INFO_FN_W
1055#else
1056#define QuerySecurityPackageInfo QuerySecurityPackageInfoA
1057#define QUERY_SECURITY_PACKAGE_INFO_FN QUERY_SECURITY_PACKAGE_INFO_FN_A
1058#endif
1059
1060typedef SECURITY_STATUS(SEC_ENTRY* EXPORT_SECURITY_CONTEXT_FN)(PCtxtHandle phContext, ULONG fFlags,
1061 PSecBuffer pPackedContext,
1062 HANDLE* pToken);
1063
1064typedef SECURITY_STATUS(SEC_ENTRY* IMPORT_SECURITY_CONTEXT_FN_A)(SEC_CHAR* pszPackage,
1065 PSecBuffer pPackedContext,
1066 HANDLE pToken,
1067 PCtxtHandle phContext);
1068typedef SECURITY_STATUS(SEC_ENTRY* IMPORT_SECURITY_CONTEXT_FN_W)(SEC_WCHAR* pszPackage,
1069 PSecBuffer pPackedContext,
1070 HANDLE pToken,
1071 PCtxtHandle phContext);
1072
1073#ifdef UNICODE
1074#define ImportSecurityContext ImportSecurityContextW
1075#define IMPORT_SECURITY_CONTEXT_FN IMPORT_SECURITY_CONTEXT_FN_W
1076#else
1077#define ImportSecurityContext ImportSecurityContextA
1078#define IMPORT_SECURITY_CONTEXT_FN IMPORT_SECURITY_CONTEXT_FN_A
1079#endif
1080
1081typedef SECURITY_STATUS(SEC_ENTRY* ADD_CREDENTIALS_FN_A)(
1082 PCredHandle hCredentials, SEC_CHAR* pszPrincipal, SEC_CHAR* pszPackage, UINT32 fCredentialUse,
1083 void* pAuthData, SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PTimeStamp ptsExpiry);
1084typedef SECURITY_STATUS(SEC_ENTRY* ADD_CREDENTIALS_FN_W)(
1085 PCredHandle hCredentials, SEC_WCHAR* pszPrincipal, SEC_WCHAR* pszPackage, UINT32 fCredentialUse,
1086 void* pAuthData, SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PTimeStamp ptsExpiry);
1087
1088#ifdef UNICODE
1089#define AddCredentials AddCredentialsW
1090#define ADD_CREDENTIALS_FN ADD_CREDENTIALS_FN_W
1091#else
1092#define AddCredentials AddCredentialsA
1093#define ADD_CREDENTIALS_FN ADD_CREDENTIALS_FN_A
1094#endif
1095
1096typedef SECURITY_STATUS(SEC_ENTRY* QUERY_SECURITY_CONTEXT_TOKEN_FN)(PCtxtHandle phContext,
1097 HANDLE* phToken);
1098
1099typedef SECURITY_STATUS(SEC_ENTRY* ENCRYPT_MESSAGE_FN)(PCtxtHandle phContext, ULONG fQOP,
1100 PSecBufferDesc pMessage, ULONG MessageSeqNo);
1101
1102typedef SECURITY_STATUS(SEC_ENTRY* DECRYPT_MESSAGE_FN)(PCtxtHandle phContext,
1103 PSecBufferDesc pMessage, ULONG MessageSeqNo,
1104 PULONG pfQOP);
1105
1106typedef SECURITY_STATUS(SEC_ENTRY* SET_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle phContext,
1107 ULONG ulAttribute, void* pBuffer,
1108 ULONG cbBuffer);
1109typedef SECURITY_STATUS(SEC_ENTRY* SET_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle phContext,
1110 ULONG ulAttribute, void* pBuffer,
1111 ULONG cbBuffer);
1112
1113#ifdef UNICODE
1114#define SetContextAttributes SetContextAttributesW
1115#define SET_CONTEXT_ATTRIBUTES_FN SET_CONTEXT_ATTRIBUTES_FN_W
1116#else
1117#define SetContextAttributes SetContextAttributesA
1118#define SET_CONTEXT_ATTRIBUTES_FN SET_CONTEXT_ATTRIBUTES_FN_A
1119#endif
1120
1121typedef SECURITY_STATUS(SEC_ENTRY* SET_CREDENTIALS_ATTRIBUTES_FN_A)(PCredHandle phCredential,
1122 ULONG ulAttribute,
1123 void* pBuffer, ULONG cbBuffer);
1124
1125typedef SECURITY_STATUS(SEC_ENTRY* SET_CREDENTIALS_ATTRIBUTES_FN_W)(PCredHandle phCredential,
1126 ULONG ulAttribute,
1127 void* pBuffer, ULONG cbBuffer);
1128
1129#ifdef UNICODE
1130#define SetCredentialsAttributes SetCredentialsAttributesW
1131#define SET_CREDENTIALS_ATTRIBUTES_FN SET_CREDENTIALS_ATTRIBUTES_FN_W
1132#else
1133#define SetCredentialsAttributes SetCredentialsAttributesA
1134#define SET_CREDENTIALS_ATTRIBUTES_FN SET_CREDENTIALS_ATTRIBUTES_FN_A
1135#endif
1136
1137#define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION \
1138 1 /* Interface has all routines through DecryptMessage */
1139#define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_2 \
1140 2 /* Interface has all routines through SetContextAttributes */
1141#define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_3 \
1142 3 /* Interface has all routines through SetCredentialsAttributes */
1143#define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_4 \
1144 4 /* Interface has all routines through ChangeAccountPassword */
1145
1146typedef struct
1147{
1148 UINT32 dwVersion;
1149 WINPR_ATTR_NODISCARD ENUMERATE_SECURITY_PACKAGES_FN_A EnumerateSecurityPackagesA;
1150 WINPR_ATTR_NODISCARD QUERY_CREDENTIALS_ATTRIBUTES_FN_A QueryCredentialsAttributesA;
1151 WINPR_ATTR_NODISCARD ACQUIRE_CREDENTIALS_HANDLE_FN_A AcquireCredentialsHandleA;
1152 FREE_CREDENTIALS_HANDLE_FN FreeCredentialsHandle;
1153 void* Reserved2;
1154 WINPR_ATTR_NODISCARD INITIALIZE_SECURITY_CONTEXT_FN_A InitializeSecurityContextA;
1155 WINPR_ATTR_NODISCARD ACCEPT_SECURITY_CONTEXT_FN AcceptSecurityContext;
1156 WINPR_ATTR_NODISCARD COMPLETE_AUTH_TOKEN_FN CompleteAuthToken;
1157 DELETE_SECURITY_CONTEXT_FN DeleteSecurityContext;
1158 WINPR_ATTR_NODISCARD APPLY_CONTROL_TOKEN_FN ApplyControlToken;
1159 WINPR_ATTR_NODISCARD QUERY_CONTEXT_ATTRIBUTES_FN_A QueryContextAttributesA;
1160 WINPR_ATTR_NODISCARD IMPERSONATE_SECURITY_CONTEXT_FN ImpersonateSecurityContext;
1161 WINPR_ATTR_NODISCARD REVERT_SECURITY_CONTEXT_FN RevertSecurityContext;
1162 WINPR_ATTR_NODISCARD MAKE_SIGNATURE_FN MakeSignature;
1163 WINPR_ATTR_NODISCARD VERIFY_SIGNATURE_FN VerifySignature;
1164 FREE_CONTEXT_BUFFER_FN FreeContextBuffer;
1165 WINPR_ATTR_NODISCARD QUERY_SECURITY_PACKAGE_INFO_FN_A QuerySecurityPackageInfoA;
1166 void* Reserved3;
1167 void* Reserved4;
1168 WINPR_ATTR_NODISCARD EXPORT_SECURITY_CONTEXT_FN ExportSecurityContext;
1169 WINPR_ATTR_NODISCARD IMPORT_SECURITY_CONTEXT_FN_A ImportSecurityContextA;
1170 WINPR_ATTR_NODISCARD ADD_CREDENTIALS_FN_A AddCredentialsA;
1171 void* Reserved8;
1172 WINPR_ATTR_NODISCARD QUERY_SECURITY_CONTEXT_TOKEN_FN QuerySecurityContextToken;
1173 WINPR_ATTR_NODISCARD ENCRYPT_MESSAGE_FN EncryptMessage;
1174 WINPR_ATTR_NODISCARD DECRYPT_MESSAGE_FN DecryptMessage;
1175 WINPR_ATTR_NODISCARD SET_CONTEXT_ATTRIBUTES_FN_A SetContextAttributesA;
1176 WINPR_ATTR_NODISCARD SET_CREDENTIALS_ATTRIBUTES_FN_A SetCredentialsAttributesA;
1179
1180typedef struct
1181{
1182 UINT32 dwVersion;
1183 WINPR_ATTR_NODISCARD ENUMERATE_SECURITY_PACKAGES_FN_W EnumerateSecurityPackagesW;
1184 WINPR_ATTR_NODISCARD QUERY_CREDENTIALS_ATTRIBUTES_FN_W QueryCredentialsAttributesW;
1185 WINPR_ATTR_NODISCARD ACQUIRE_CREDENTIALS_HANDLE_FN_W AcquireCredentialsHandleW;
1186 FREE_CREDENTIALS_HANDLE_FN FreeCredentialsHandle;
1187 void* Reserved2;
1188 WINPR_ATTR_NODISCARD INITIALIZE_SECURITY_CONTEXT_FN_W InitializeSecurityContextW;
1189 WINPR_ATTR_NODISCARD ACCEPT_SECURITY_CONTEXT_FN AcceptSecurityContext;
1190 WINPR_ATTR_NODISCARD COMPLETE_AUTH_TOKEN_FN CompleteAuthToken;
1191 DELETE_SECURITY_CONTEXT_FN DeleteSecurityContext;
1192 WINPR_ATTR_NODISCARD APPLY_CONTROL_TOKEN_FN ApplyControlToken;
1193 WINPR_ATTR_NODISCARD QUERY_CONTEXT_ATTRIBUTES_FN_W QueryContextAttributesW;
1194 WINPR_ATTR_NODISCARD IMPERSONATE_SECURITY_CONTEXT_FN ImpersonateSecurityContext;
1195 WINPR_ATTR_NODISCARD REVERT_SECURITY_CONTEXT_FN RevertSecurityContext;
1196 WINPR_ATTR_NODISCARD MAKE_SIGNATURE_FN MakeSignature;
1197 WINPR_ATTR_NODISCARD VERIFY_SIGNATURE_FN VerifySignature;
1198 FREE_CONTEXT_BUFFER_FN FreeContextBuffer;
1199 WINPR_ATTR_NODISCARD QUERY_SECURITY_PACKAGE_INFO_FN_W QuerySecurityPackageInfoW;
1200 void* Reserved3;
1201 void* Reserved4;
1202 WINPR_ATTR_NODISCARD EXPORT_SECURITY_CONTEXT_FN ExportSecurityContext;
1203 WINPR_ATTR_NODISCARD IMPORT_SECURITY_CONTEXT_FN_W ImportSecurityContextW;
1204 WINPR_ATTR_NODISCARD ADD_CREDENTIALS_FN_W AddCredentialsW;
1205 void* Reserved8;
1206 WINPR_ATTR_NODISCARD QUERY_SECURITY_CONTEXT_TOKEN_FN QuerySecurityContextToken;
1207 WINPR_ATTR_NODISCARD ENCRYPT_MESSAGE_FN EncryptMessage;
1208 WINPR_ATTR_NODISCARD DECRYPT_MESSAGE_FN DecryptMessage;
1209 WINPR_ATTR_NODISCARD SET_CONTEXT_ATTRIBUTES_FN_W SetContextAttributesW;
1210 WINPR_ATTR_NODISCARD SET_CREDENTIALS_ATTRIBUTES_FN_W SetCredentialsAttributesW;
1213
1214typedef PSecurityFunctionTableA(SEC_ENTRY* INIT_SECURITY_INTERFACE_A)(void);
1215typedef PSecurityFunctionTableW(SEC_ENTRY* INIT_SECURITY_INTERFACE_W)(void);
1216
1217#ifdef UNICODE
1218#define InitSecurityInterface InitSecurityInterfaceW
1219#define SecurityFunctionTable SecurityFunctionTableW
1220#define PSecurityFunctionTable PSecurityFunctionTableW
1221#define INIT_SECURITY_INTERFACE INIT_SECURITY_INTERFACE_W
1222#else
1223#define InitSecurityInterface InitSecurityInterfaceA
1224#define SecurityFunctionTable SecurityFunctionTableA
1225#define PSecurityFunctionTable PSecurityFunctionTableA
1226#define INIT_SECURITY_INTERFACE INIT_SECURITY_INTERFACE_A
1227#endif
1228
1229#ifdef __cplusplus
1230extern "C"
1231{
1232#endif
1233
1234#ifdef SSPI_DLL
1235
1236 /* Package Management */
1237
1238 WINPR_ATTR_NODISCARD
1239 WINPR_API SECURITY_STATUS SEC_ENTRY EnumerateSecurityPackagesA(ULONG* pcPackages,
1240 PSecPkgInfoA* ppPackageInfo);
1241
1242 WINPR_ATTR_NODISCARD
1243 WINPR_API SECURITY_STATUS SEC_ENTRY EnumerateSecurityPackagesW(ULONG* pcPackages,
1244 PSecPkgInfoW* ppPackageInfo);
1245
1246 WINPR_ATTR_NODISCARD
1247 WINPR_API PSecurityFunctionTableA SEC_ENTRY InitSecurityInterfaceA(void);
1248
1249 WINPR_ATTR_NODISCARD
1250 WINPR_API PSecurityFunctionTableW SEC_ENTRY InitSecurityInterfaceW(void);
1251
1252 WINPR_ATTR_NODISCARD
1253 WINPR_API SECURITY_STATUS SEC_ENTRY QuerySecurityPackageInfoA(SEC_CHAR* pszPackageName,
1254 PSecPkgInfoA* ppPackageInfo);
1255
1256 WINPR_ATTR_NODISCARD
1257 WINPR_API SECURITY_STATUS SEC_ENTRY QuerySecurityPackageInfoW(SEC_WCHAR* pszPackageName,
1258 PSecPkgInfoW* ppPackageInfo);
1259
1260 /* Credential Management */
1261
1262 WINPR_ATTR_NODISCARD
1263 WINPR_API SECURITY_STATUS SEC_ENTRY AcquireCredentialsHandleA(
1264 SEC_CHAR* pszPrincipal, SEC_CHAR* pszPackage, ULONG fCredentialUse, void* pvLogonID,
1265 void* pAuthData, SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PCredHandle phCredential,
1266 PTimeStamp ptsExpiry);
1267
1268 WINPR_ATTR_NODISCARD
1269 WINPR_API SECURITY_STATUS SEC_ENTRY AcquireCredentialsHandleW(
1270 SEC_WCHAR* pszPrincipal, SEC_WCHAR* pszPackage, ULONG fCredentialUse, void* pvLogonID,
1271 void* pAuthData, SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PCredHandle phCredential,
1272 PTimeStamp ptsExpiry);
1273
1274 WINPR_ATTR_NODISCARD
1275 WINPR_API SECURITY_STATUS SEC_ENTRY ExportSecurityContext(PCtxtHandle phContext, ULONG fFlags,
1276 PSecBuffer pPackedContext,
1277 HANDLE* pToken);
1278
1279 WINPR_ATTR_NODISCARD
1280 WINPR_API SECURITY_STATUS SEC_ENTRY FreeCredentialsHandle(PCredHandle phCredential);
1281
1282 WINPR_ATTR_NODISCARD
1283 WINPR_API SECURITY_STATUS SEC_ENTRY ImportSecurityContextA(SEC_CHAR* pszPackage,
1284 PSecBuffer pPackedContext,
1285 HANDLE pToken,
1286 PCtxtHandle phContext);
1287
1288 WINPR_ATTR_NODISCARD
1289 WINPR_API SECURITY_STATUS SEC_ENTRY ImportSecurityContextW(SEC_WCHAR* pszPackage,
1290 PSecBuffer pPackedContext,
1291 HANDLE pToken,
1292 PCtxtHandle phContext);
1293
1294 WINPR_ATTR_NODISCARD
1295 WINPR_API SECURITY_STATUS SEC_ENTRY QueryCredentialsAttributesA(PCredHandle phCredential,
1296 ULONG ulAttribute,
1297 void* pBuffer);
1298
1299 WINPR_ATTR_NODISCARD
1300 WINPR_API SECURITY_STATUS SEC_ENTRY QueryCredentialsAttributesW(PCredHandle phCredential,
1301 ULONG ulAttribute,
1302 void* pBuffer);
1303
1304 /* Context Management */
1305
1306 WINPR_ATTR_NODISCARD
1307 WINPR_API SECURITY_STATUS SEC_ENTRY
1308 AcceptSecurityContext(PCredHandle phCredential, PCtxtHandle phContext, PSecBufferDesc pInput,
1309 ULONG fContextReq, ULONG TargetDataRep, PCtxtHandle phNewContext,
1310 PSecBufferDesc pOutput, PULONG pfContextAttr, PTimeStamp ptsTimeStamp);
1311
1312 WINPR_ATTR_NODISCARD
1313 WINPR_API SECURITY_STATUS SEC_ENTRY ApplyControlToken(PCtxtHandle phContext,
1314 PSecBufferDesc pInput);
1315
1316 WINPR_ATTR_NODISCARD
1317 WINPR_API SECURITY_STATUS SEC_ENTRY CompleteAuthToken(PCtxtHandle phContext,
1318 PSecBufferDesc pToken);
1319
1320 WINPR_ATTR_NODISCARD
1321 WINPR_API SECURITY_STATUS SEC_ENTRY DeleteSecurityContext(PCtxtHandle phContext);
1322
1323 WINPR_ATTR_NODISCARD
1324 WINPR_API SECURITY_STATUS SEC_ENTRY FreeContextBuffer(void* pvContextBuffer);
1325
1326 WINPR_ATTR_NODISCARD
1327 WINPR_API SECURITY_STATUS SEC_ENTRY ImpersonateSecurityContext(PCtxtHandle phContext);
1328
1329 WINPR_ATTR_NODISCARD
1330 WINPR_API SECURITY_STATUS SEC_ENTRY InitializeSecurityContextA(
1331 PCredHandle phCredential, PCtxtHandle phContext, SEC_CHAR* pszTargetName, ULONG fContextReq,
1332 ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput, ULONG Reserved2,
1333 PCtxtHandle phNewContext, PSecBufferDesc pOutput, PULONG pfContextAttr,
1334 PTimeStamp ptsExpiry);
1335
1336 WINPR_ATTR_NODISCARD
1337 WINPR_API SECURITY_STATUS SEC_ENTRY InitializeSecurityContextW(
1338 PCredHandle phCredential, PCtxtHandle phContext, SEC_WCHAR* pszTargetName,
1339 ULONG fContextReq, ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput,
1340 ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput, PULONG pfContextAttr,
1341 PTimeStamp ptsExpiry);
1342
1343 WINPR_ATTR_NODISCARD
1344 WINPR_API SECURITY_STATUS SEC_ENTRY QueryContextAttributes(PCtxtHandle phContext,
1345 ULONG ulAttribute, void* pBuffer);
1346
1347 WINPR_ATTR_NODISCARD
1348 WINPR_API SECURITY_STATUS SEC_ENTRY QuerySecurityContextToken(PCtxtHandle phContext,
1349 HANDLE* phToken);
1350
1351 WINPR_ATTR_NODISCARD
1352 WINPR_API SECURITY_STATUS SEC_ENTRY SetContextAttributes(PCtxtHandle phContext,
1353 ULONG ulAttribute, void* pBuffer,
1354 ULONG cbBuffer);
1355
1356 WINPR_ATTR_NODISCARD
1357 WINPR_API SECURITY_STATUS SEC_ENTRY RevertSecurityContext(PCtxtHandle phContext);
1358
1359 /* Message Support */
1360
1361 WINPR_ATTR_NODISCARD
1362 WINPR_API SECURITY_STATUS SEC_ENTRY DecryptMessage(PCtxtHandle phContext,
1363 PSecBufferDesc pMessage, ULONG MessageSeqNo,
1364 PULONG pfQOP);
1365
1366 WINPR_ATTR_NODISCARD
1367 WINPR_API SECURITY_STATUS SEC_ENTRY EncryptMessage(PCtxtHandle phContext, ULONG fQOP,
1368 PSecBufferDesc pMessage, ULONG MessageSeqNo);
1369
1370 WINPR_ATTR_NODISCARD
1371 WINPR_API SECURITY_STATUS SEC_ENTRY MakeSignature(PCtxtHandle phContext, ULONG fQOP,
1372 PSecBufferDesc pMessage, ULONG MessageSeqNo);
1373
1374 WINPR_ATTR_NODISCARD
1375 WINPR_API SECURITY_STATUS SEC_ENTRY VerifySignature(PCtxtHandle phContext,
1376 PSecBufferDesc pMessage, ULONG MessageSeqNo,
1377 PULONG pfQOP);
1378
1379#endif /* SSPI_DLL */
1380
1381#ifdef __cplusplus
1382}
1383#endif
1384
1385#endif
1386
1387#ifdef __cplusplus
1388extern "C"
1389{
1390#endif
1391
1392 /* Custom API */
1393
1394/* Extended SECPKG_ATTR IDs begin at 1000 */
1395#define SECPKG_ATTR_AUTH_IDENTITY 1001
1396#define SECPKG_ATTR_AUTH_PASSWORD 1002
1397#define SECPKG_ATTR_AUTH_NTLM_HASH 1003
1398#define SECPKG_ATTR_AUTH_NTLM_MESSAGE 1100
1399#define SECPKG_ATTR_AUTH_NTLM_TIMESTAMP 1101
1400#define SECPKG_ATTR_AUTH_NTLM_CLIENT_CHALLENGE 1102
1401#define SECPKG_ATTR_AUTH_NTLM_SERVER_CHALLENGE 1103
1402#define SECPKG_ATTR_AUTH_NTLM_NTPROOF_VALUE 1104
1403#define SECPKG_ATTR_AUTH_NTLM_RANDKEY 1105
1404#define SECPKG_ATTR_AUTH_NTLM_MIC 1106
1405#define SECPKG_ATTR_AUTH_NTLM_MIC_VALUE 1107
1406
1407#define SECPKG_CRED_ATTR_TICKET_LOGON 1200
1408
1409 typedef struct
1410 {
1411 char User[256 + 1];
1412 char Domain[256 + 1];
1414
1415 typedef struct
1416 {
1417 char Password[256 + 1];
1419
1420 typedef struct
1421 {
1422 int Version;
1423 BYTE NtlmHash[16];
1425
1426 typedef struct
1427 {
1428 BYTE Timestamp[8];
1429 BOOL ChallengeOrResponse;
1431
1432 typedef struct
1433 {
1434 BYTE ClientChallenge[8];
1436
1437 typedef struct
1438 {
1439 BYTE ServerChallenge[8];
1441
1442 typedef struct
1443 {
1444 UINT32 type;
1445 UINT32 length;
1446 BYTE* buffer;
1448
1449#define SSPI_INTERFACE_WINPR 0x00000001
1450#define SSPI_INTERFACE_NATIVE 0x00000002
1451
1452 typedef PSecurityFunctionTableA(SEC_ENTRY* INIT_SECURITY_INTERFACE_EX_A)(DWORD flags);
1453 typedef PSecurityFunctionTableW(SEC_ENTRY* INIT_SECURITY_INTERFACE_EX_W)(DWORD flags);
1454
1455 WINPR_API void sspi_GlobalInit(void);
1456 WINPR_API void sspi_GlobalFinish(void);
1457
1458 WINPR_ATTR_NODISCARD
1459 WINPR_API void* sspi_SecBufferAlloc(PSecBuffer SecBuffer, ULONG size);
1460 WINPR_API void sspi_SecBufferFree(PSecBuffer SecBuffer);
1461
1462#define sspi_SetAuthIdentity sspi_SetAuthIdentityA
1463 WINPR_ATTR_NODISCARD
1464 WINPR_API int sspi_SetAuthIdentityA(SEC_WINNT_AUTH_IDENTITY* identity, const char* user,
1465 const char* domain, const char* password);
1466
1467 WINPR_ATTR_NODISCARD
1468 WINPR_API int sspi_SetAuthIdentityW(SEC_WINNT_AUTH_IDENTITY* identity, const WCHAR* user,
1469 const WCHAR* domain, const WCHAR* password);
1470
1471 WINPR_ATTR_NODISCARD
1472 WINPR_API int sspi_SetAuthIdentityWithLengthW(SEC_WINNT_AUTH_IDENTITY* identity,
1473 const WCHAR* user, size_t userLen,
1474 const WCHAR* domain, size_t domainLen,
1475 const WCHAR* password, size_t passwordLen);
1476
1477 WINPR_ATTR_NODISCARD
1478 WINPR_API UINT32 sspi_GetAuthIdentityVersion(const void* identity);
1479
1480 WINPR_ATTR_NODISCARD
1481 WINPR_API UINT32 sspi_GetAuthIdentityFlags(const void* identity);
1482
1483 WINPR_ATTR_NODISCARD
1484 WINPR_API BOOL sspi_GetAuthIdentityUserDomainW(const void* identity, const WCHAR** pUser,
1485 UINT32* pUserLength, const WCHAR** pDomain,
1486 UINT32* pDomainLength);
1487
1488 WINPR_ATTR_NODISCARD
1489 WINPR_API BOOL sspi_GetAuthIdentityUserDomainA(const void* identity, const char** pUser,
1490 UINT32* pUserLength, const char** pDomain,
1491 UINT32* pDomainLength);
1492
1493 WINPR_ATTR_NODISCARD
1494 WINPR_API BOOL sspi_GetAuthIdentityPasswordW(const void* identity, const WCHAR** pPassword,
1495 UINT32* pPasswordLength);
1496
1497 WINPR_ATTR_NODISCARD
1498 WINPR_API BOOL sspi_GetAuthIdentityPasswordA(const void* identity, const char** pPassword,
1499 UINT32* pPasswordLength);
1500
1501 WINPR_ATTR_NODISCARD
1502 WINPR_API BOOL sspi_CopyAuthIdentityFieldsA(const SEC_WINNT_AUTH_IDENTITY_INFO* identity,
1503 char** pUser, char** pDomain, char** pPassword);
1504
1505 WINPR_ATTR_NODISCARD
1506 WINPR_API BOOL sspi_CopyAuthIdentityFieldsW(const SEC_WINNT_AUTH_IDENTITY_INFO* identity,
1507 WCHAR** pUser, WCHAR** pDomain, WCHAR** pPassword);
1508
1509 WINPR_ATTR_NODISCARD
1510 WINPR_API BOOL sspi_CopyAuthPackageListA(const SEC_WINNT_AUTH_IDENTITY_INFO* identity,
1511 char** pPackageList);
1512
1513 WINPR_ATTR_NODISCARD
1514 WINPR_API int sspi_CopyAuthIdentity(SEC_WINNT_AUTH_IDENTITY* identity,
1515 const SEC_WINNT_AUTH_IDENTITY_INFO* srcIdentity);
1516
1517 WINPR_API void sspi_FreeAuthIdentity(SEC_WINNT_AUTH_IDENTITY* identity);
1518
1519 WINPR_ATTR_NODISCARD
1520 WINPR_API const char* GetSecurityStatusString(SECURITY_STATUS status);
1521
1522 WINPR_ATTR_NODISCARD
1523 WINPR_API SecurityFunctionTableW* SEC_ENTRY InitSecurityInterfaceExW(DWORD flags);
1524
1525 WINPR_ATTR_NODISCARD
1526 WINPR_API SecurityFunctionTableA* SEC_ENTRY InitSecurityInterfaceExA(DWORD flags);
1527
1528#ifdef UNICODE
1529#define InitSecurityInterfaceEx InitSecurityInterfaceExW
1530#define INIT_SECURITY_INTERFACE_EX INIT_SECURITY_INTERFACE_EX_W
1531#else
1532#define InitSecurityInterfaceEx InitSecurityInterfaceExA
1533#define INIT_SECURITY_INTERFACE_EX INIT_SECURITY_INTERFACE_EX_A
1534#endif
1535
1536#ifdef __cplusplus
1537}
1538#endif
1539
1540#endif /* WINPR_SSPI_H */
WINPR_ATTR_NODISCARD psSspiNtlmHashCallback hashCallback