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 SecPkgInfoA* PackageInfo;
400 UINT32 NegotiationState;
402
403typedef struct
404{
405 SecPkgInfoW* PackageInfo;
406 UINT32 NegotiationState;
408
409#ifdef UNICODE
410#define SecPkgContext_NegotiationInfo SecPkgContext_NegotiationInfoW
411#else
412#define SecPkgContext_NegotiationInfo SecPkgContext_NegotiationInfoA
413#endif /* UNICODE */
414
415typedef struct
416{
417 SecPkgInfoA* PackageInfo;
419
420typedef struct
421{
422 SecPkgInfoW* PackageInfo;
424
425#ifdef UNICODE
426#define SecPkgContext_PackageInfo SecPkgContext_PackageInfoW
427#else
428#define SecPkgContext_PackageInfo SecPkgContext_PackageInfoA
429#endif /* UNICODE */
430
431typedef struct
432{
433 TimeStamp tsPasswordExpires;
435
436typedef struct
437{
438 UINT32 SessionKeyLength;
439 BYTE* SessionKey;
441
442typedef struct
443{
444 UINT32 dwFlags;
445 UINT32 cbSessionId;
446 BYTE rgbSessionId[32];
448
449typedef struct
450{
451 UINT32 cbMaxToken;
452 UINT32 cbMaxSignature;
453 UINT32 cbBlockSize;
454 UINT32 cbSecurityTrailer;
456
457typedef struct
458{
459 UINT32 cbHeader;
460 UINT32 cbTrailer;
461 UINT32 cbMaximumMessage;
462 UINT32 cBuffers;
463 UINT32 cbBlockSize;
465
466typedef struct
467{
468 void* AttributeInfo;
470
471typedef struct
472{
473 UINT16 cSignatureAndHashAlgorithms;
474 UINT16* pSignatureAndHashAlgorithms;
476
477typedef struct
478{
479 UINT32 MarshalledTargetInfoLength;
480 BYTE* MarshalledTargetInfo;
482
483/* Security Credentials Attributes */
484
485#define SECPKG_CRED_ATTR_NAMES 1
486#define SECPKG_CRED_ATTR_SSI_PROVIDER 2
487#define SECPKG_CRED_ATTR_CERT 4
488#define SECPKG_CRED_ATTR_PAC_BYPASS 5
489
490typedef struct
491{
492 SEC_CHAR* sUserName;
495
496typedef struct
497{
498 SEC_WCHAR* sUserName;
501
502#ifdef UNICODE
503#define SecPkgCredentials_Names SecPkgCredentials_NamesW
504#define PSecPkgCredentials_Names PSecPkgCredentials_NamesW
505#else
506#define SecPkgCredentials_Names SecPkgCredentials_NamesA
507#define PSecPkgCredentials_Names PSecPkgCredentials_NamesA
508#endif
509
510typedef struct
511{
512 SEC_WCHAR* sProviderName;
513 unsigned long ProviderInfoLength;
514 char* ProviderInfo;
516
517typedef struct
518{
519 SEC_CHAR* sProviderName;
520 unsigned long ProviderInfoLength;
521 char* ProviderInfo;
523
524#ifdef UNICODE
525#define SecPkgCredentials_SSIProvider SecPkgCredentials_SSIProviderW
526#define PSecPkgCredentials_SSIProvider PSecPkgCredentials_SSIProviderW
527#else
528#define SecPkgCredentials_SSIProvider SecPkgCredentials_SSIProviderA
529#define PSecPkgCredentials_SSIProvider PSecPkgCredentials_SSIProviderA
530#endif
531
532typedef struct
533{
534 unsigned long EncodedCertSize;
535 unsigned char* EncodedCert;
537
538#endif /* !defined(_WIN32) || defined(_UWP) */
539
540#if !defined(_WIN32) || defined(_UWP) || (defined(__MINGW32__) && (__MINGW64_VERSION_MAJOR <= 8))
541
542#define SECPKG_CRED_ATTR_KDC_PROXY_SETTINGS 3
543
544#define KDC_PROXY_SETTINGS_V1 1
545#define KDC_PROXY_SETTINGS_FLAGS_FORCEPROXY 0x1
546
547typedef struct
548{
549 ULONG Version;
550 ULONG Flags;
551 USHORT ProxyServerOffset;
552 USHORT ProxyServerLength;
553 USHORT ClientTlsCredOffset;
554 USHORT ClientTlsCredLength;
556
557typedef struct
558{
559 ULONG Version;
560 ULONG Flags;
561 USHORT ProxyServerOffset;
562 USHORT ProxyServerLength;
563 USHORT ClientTlsCredOffset;
564 USHORT ClientTlsCredLength;
566
567#ifdef UNICODE
568#define SecPkgCredentials_KdcProxySettings SecPkgCredentials_KdcProxySettingsW
569#define PSecPkgCredentials_KdcProxySettings PSecPkgCredentials_KdcProxySettingsW
570#else
571#define SecPkgCredentials_KdcProxySettings SecPkgCredentials_KdcProxySettingsA
572#define PSecPkgCredentials_KdcProxySettings SecPkgCredentials_KdcProxySettingsA
573#endif
574
575typedef struct
576{
577 UINT32 BindingsLength;
578 SEC_CHANNEL_BINDINGS* Bindings;
580#endif
581
582/* InitializeSecurityContext Flags */
583
584#define ISC_REQ_DELEGATE 0x00000001
585#define ISC_REQ_MUTUAL_AUTH 0x00000002
586#define ISC_REQ_REPLAY_DETECT 0x00000004
587#define ISC_REQ_SEQUENCE_DETECT 0x00000008
588#define ISC_REQ_CONFIDENTIALITY 0x00000010
589#define ISC_REQ_USE_SESSION_KEY 0x00000020
590#define ISC_REQ_PROMPT_FOR_CREDS 0x00000040
591#define ISC_REQ_USE_SUPPLIED_CREDS 0x00000080
592#define ISC_REQ_ALLOCATE_MEMORY 0x00000100
593#define ISC_REQ_USE_DCE_STYLE 0x00000200
594#define ISC_REQ_DATAGRAM 0x00000400
595#define ISC_REQ_CONNECTION 0x00000800
596#define ISC_REQ_CALL_LEVEL 0x00001000
597#define ISC_REQ_FRAGMENT_SUPPLIED 0x00002000
598#define ISC_REQ_EXTENDED_ERROR 0x00004000
599#define ISC_REQ_STREAM 0x00008000
600#define ISC_REQ_INTEGRITY 0x00010000
601#define ISC_REQ_IDENTIFY 0x00020000
602#define ISC_REQ_NULL_SESSION 0x00040000
603#define ISC_REQ_MANUAL_CRED_VALIDATION 0x00080000
604#define ISC_REQ_RESERVED1 0x00100000
605#define ISC_REQ_FRAGMENT_TO_FIT 0x00200000
606#define ISC_REQ_FORWARD_CREDENTIALS 0x00400000
607#define ISC_REQ_NO_INTEGRITY 0x00800000
608#define ISC_REQ_USE_HTTP_STYLE 0x01000000
609
610#define ISC_RET_DELEGATE 0x00000001
611#define ISC_RET_MUTUAL_AUTH 0x00000002
612#define ISC_RET_REPLAY_DETECT 0x00000004
613#define ISC_RET_SEQUENCE_DETECT 0x00000008
614#define ISC_RET_CONFIDENTIALITY 0x00000010
615#define ISC_RET_USE_SESSION_KEY 0x00000020
616#define ISC_RET_USED_COLLECTED_CREDS 0x00000040
617#define ISC_RET_USED_SUPPLIED_CREDS 0x00000080
618#define ISC_RET_ALLOCATED_MEMORY 0x00000100
619#define ISC_RET_USED_DCE_STYLE 0x00000200
620#define ISC_RET_DATAGRAM 0x00000400
621#define ISC_RET_CONNECTION 0x00000800
622#define ISC_RET_INTERMEDIATE_RETURN 0x00001000
623#define ISC_RET_CALL_LEVEL 0x00002000
624#define ISC_RET_EXTENDED_ERROR 0x00004000
625#define ISC_RET_STREAM 0x00008000
626#define ISC_RET_INTEGRITY 0x00010000
627#define ISC_RET_IDENTIFY 0x00020000
628#define ISC_RET_NULL_SESSION 0x00040000
629#define ISC_RET_MANUAL_CRED_VALIDATION 0x00080000
630#define ISC_RET_RESERVED1 0x00100000
631#define ISC_RET_FRAGMENT_ONLY 0x00200000
632#define ISC_RET_FORWARD_CREDENTIALS 0x00400000
633#define ISC_RET_USED_HTTP_STYLE 0x01000000
634
635/* AcceptSecurityContext Flags */
636
637#define ASC_REQ_DELEGATE 0x00000001
638#define ASC_REQ_MUTUAL_AUTH 0x00000002
639#define ASC_REQ_REPLAY_DETECT 0x00000004
640#define ASC_REQ_SEQUENCE_DETECT 0x00000008
641#define ASC_REQ_CONFIDENTIALITY 0x00000010
642#define ASC_REQ_USE_SESSION_KEY 0x00000020
643#define ASC_REQ_ALLOCATE_MEMORY 0x00000100
644#define ASC_REQ_USE_DCE_STYLE 0x00000200
645#define ASC_REQ_DATAGRAM 0x00000400
646#define ASC_REQ_CONNECTION 0x00000800
647#define ASC_REQ_CALL_LEVEL 0x00001000
648#define ASC_REQ_EXTENDED_ERROR 0x00008000
649#define ASC_REQ_STREAM 0x00010000
650#define ASC_REQ_INTEGRITY 0x00020000
651#define ASC_REQ_LICENSING 0x00040000
652#define ASC_REQ_IDENTIFY 0x00080000
653#define ASC_REQ_ALLOW_NULL_SESSION 0x00100000
654#define ASC_REQ_ALLOW_NON_USER_LOGONS 0x00200000
655#define ASC_REQ_ALLOW_CONTEXT_REPLAY 0x00400000
656#define ASC_REQ_FRAGMENT_TO_FIT 0x00800000
657#define ASC_REQ_FRAGMENT_SUPPLIED 0x00002000
658#define ASC_REQ_NO_TOKEN 0x01000000
659#define ASC_REQ_PROXY_BINDINGS 0x04000000
660#define ASC_REQ_ALLOW_MISSING_BINDINGS 0x10000000
661
662#define ASC_RET_DELEGATE 0x00000001
663#define ASC_RET_MUTUAL_AUTH 0x00000002
664#define ASC_RET_REPLAY_DETECT 0x00000004
665#define ASC_RET_SEQUENCE_DETECT 0x00000008
666#define ASC_RET_CONFIDENTIALITY 0x00000010
667#define ASC_RET_USE_SESSION_KEY 0x00000020
668#define ASC_RET_ALLOCATED_MEMORY 0x00000100
669#define ASC_RET_USED_DCE_STYLE 0x00000200
670#define ASC_RET_DATAGRAM 0x00000400
671#define ASC_RET_CONNECTION 0x00000800
672#define ASC_RET_CALL_LEVEL 0x00002000
673#define ASC_RET_THIRD_LEG_FAILED 0x00004000
674#define ASC_RET_EXTENDED_ERROR 0x00008000
675#define ASC_RET_STREAM 0x00010000
676#define ASC_RET_INTEGRITY 0x00020000
677#define ASC_RET_LICENSING 0x00040000
678#define ASC_RET_IDENTIFY 0x00080000
679#define ASC_RET_NULL_SESSION 0x00100000
680#define ASC_RET_ALLOW_NON_USER_LOGONS 0x00200000
681#define ASC_RET_FRAGMENT_ONLY 0x00800000
682#define ASC_RET_NO_TOKEN 0x01000000
683#define ASC_RET_NO_PROXY_BINDINGS 0x04000000
684#define ASC_RET_MISSING_BINDINGS 0x10000000
685
686#define SEC_WINNT_AUTH_IDENTITY_ANSI 0x1
687#define SEC_WINNT_AUTH_IDENTITY_UNICODE 0x2
688#define SEC_WINNT_AUTH_IDENTITY_MARSHALLED 0x4
689#define SEC_WINNT_AUTH_IDENTITY_ONLY 0x8
690
691#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
695#define SEC_WINNT_AUTH_IDENTITY_EXTENDED 0x100
696#endif
697
698#define SEC_WINNT_AUTH_IDENTITY_EXTENDED_v2 0x200
700#define SEC_WINPR_AUTH_IDENTITY_PASSWORD_HASH 0x00800000
701
702#if !defined(_WIN32) || defined(_UWP) || defined(__MINGW32__)
703
704WINPR_PRAGMA_DIAG_PUSH
705WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
706
707#ifndef _AUTH_IDENTITY_DEFINED
708// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
709#define _AUTH_IDENTITY_DEFINED
710
711typedef struct
712{
713 UINT16* User;
714 ULONG UserLength;
715 UINT16* Domain;
716 ULONG DomainLength;
717 UINT16* Password;
718 ULONG PasswordLength;
719 UINT32 Flags;
721
722typedef struct
723{
724 BYTE* User;
725 ULONG UserLength;
726 BYTE* Domain;
727 ULONG DomainLength;
728 BYTE* Password;
729 ULONG PasswordLength;
730 UINT32 Flags;
732
733// Always define SEC_WINNT_AUTH_IDENTITY to SEC_WINNT_AUTH_IDENTITY_W
734
735#ifdef UNICODE
736#define SEC_WINNT_AUTH_IDENTITY SEC_WINNT_AUTH_IDENTITY_W
737#define PSEC_WINNT_AUTH_IDENTITY PSEC_WINNT_AUTH_IDENTITY_W
738#else
739#define SEC_WINNT_AUTH_IDENTITY SEC_WINNT_AUTH_IDENTITY_W
740#define PSEC_WINNT_AUTH_IDENTITY PSEC_WINNT_AUTH_IDENTITY_W
741#endif
742
743#endif /* _AUTH_IDENTITY_DEFINED */
744
745#ifndef SEC_WINNT_AUTH_IDENTITY_VERSION
746#define SEC_WINNT_AUTH_IDENTITY_VERSION 0x200
747
748typedef struct
749{
750 UINT32 Version;
751 UINT32 Length;
752 UINT16* User;
753 UINT32 UserLength;
754 UINT16* Domain;
755 UINT32 DomainLength;
756 UINT16* Password;
757 UINT32 PasswordLength;
758 UINT32 Flags;
759 UINT16* PackageList;
760 UINT32 PackageListLength;
762
763typedef struct
764{
765 UINT32 Version;
766 UINT32 Length;
767 BYTE* User;
768 UINT32 UserLength;
769 BYTE* Domain;
770 UINT32 DomainLength;
771 BYTE* Password;
772 UINT32 PasswordLength;
773 UINT32 Flags;
774 BYTE* PackageList;
775 UINT32 PackageListLength;
777
778#ifdef UNICODE
779#define SEC_WINNT_AUTH_IDENTITY_EX SEC_WINNT_AUTH_IDENTITY_EXW
780#define PSEC_WINNT_AUTH_IDENTITY_EX PSEC_WINNT_AUTH_IDENTITY_EXW
781#else
782#define SEC_WINNT_AUTH_IDENTITY_EX SEC_WINNT_AUTH_IDENTITY_EXA
783#define PSEC_WINNT_AUTH_IDENTITY_EX PSEC_WINNT_AUTH_IDENTITY_EXA
784#endif
785
786#endif /* SEC_WINNT_AUTH_IDENTITY_VERSION */
787
788#ifndef SEC_WINNT_AUTH_IDENTITY_VERSION_2
789#define SEC_WINNT_AUTH_IDENTITY_VERSION_2 0x201
790
791typedef struct
792{
793 UINT32 Version;
794 UINT16 cbHeaderLength;
795 UINT32 cbStructureLength;
796 UINT32 UserOffset;
797 UINT16 UserLength;
798 UINT32 DomainOffset;
799 UINT16 DomainLength;
800 UINT32 PackedCredentialsOffset;
801 UINT16 PackedCredentialsLength;
802 UINT32 Flags;
803 UINT32 PackageListOffset;
804 UINT16 PackageListLength;
806
807#endif /* SEC_WINNT_AUTH_IDENTITY_VERSION_2 */
808
809#ifndef _AUTH_IDENTITY_INFO_DEFINED
810// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
811#define _AUTH_IDENTITY_INFO_DEFINED
812
813// https://docs.microsoft.com/en-us/windows/win32/api/sspi/ns-sspi-sec_winnt_auth_identity_info
814
823
824#define SEC_WINNT_AUTH_IDENTITY_FLAGS_PROCESS_ENCRYPTED 0x10
825#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SYSTEM_PROTECTED 0x20
826#define SEC_WINNT_AUTH_IDENTITY_FLAGS_USER_PROTECTED 0x40
827#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SYSTEM_ENCRYPTED 0x80
828#define SEC_WINNT_AUTH_IDENTITY_FLAGS_RESERVED 0x10000
829#define SEC_WINNT_AUTH_IDENTITY_FLAGS_NULL_USER 0x20000
830#define SEC_WINNT_AUTH_IDENTITY_FLAGS_NULL_DOMAIN 0x40000
831#define SEC_WINNT_AUTH_IDENTITY_FLAGS_ID_PROVIDER 0x80000
832
833#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_USE_MASK 0xFF000000
834#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_CREDPROV_DO_NOT_SAVE 0x80000000
835#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_SAVE_CRED_CHECKED 0x40000000
836#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_NO_CHECKBOX 0x20000000
837#define SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_CREDPROV_DO_NOT_LOAD 0x10000000
838
839#define SEC_WINNT_AUTH_IDENTITY_FLAGS_VALID_SSPIPFC_FLAGS \
840 (SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_CREDPROV_DO_NOT_SAVE | \
841 SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_SAVE_CRED_CHECKED | \
842 SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_NO_CHECKBOX | \
843 SEC_WINNT_AUTH_IDENTITY_FLAGS_SSPIPFC_CREDPROV_DO_NOT_LOAD)
844
845#endif /* _AUTH_IDENTITY_INFO_DEFINED */
846
847WINPR_PRAGMA_DIAG_POP
848
849#if !defined(__MINGW32__)
850typedef struct
851{
852 ULONG_PTR dwLower;
853 ULONG_PTR dwUpper;
854} SecHandle;
855typedef SecHandle* PSecHandle;
856
857typedef SecHandle CredHandle;
858typedef CredHandle* PCredHandle;
859typedef SecHandle CtxtHandle;
860typedef CtxtHandle* PCtxtHandle;
861
862#define SecInvalidateHandle(x) \
863 ((PSecHandle)(x))->dwLower = ((PSecHandle)(x))->dwUpper = ((ULONG_PTR)((INT_PTR)-1))
864
865#define SecIsValidHandle(x) \
866 ((((PSecHandle)(x))->dwLower != ((ULONG_PTR)((INT_PTR)-1))) && \
867 (((PSecHandle)(x))->dwUpper != ((ULONG_PTR)((INT_PTR)-1))))
868
869typedef struct
870{
871 ULONG cbBuffer;
872 ULONG BufferType;
873 void* pvBuffer;
874} SecBuffer;
875typedef SecBuffer* PSecBuffer;
876
877typedef struct
878{
879 ULONG ulVersion;
880 ULONG cBuffers;
881 PSecBuffer pBuffers;
884
885#endif /* __MINGW32__ */
886
887#endif /* !defined(_WIN32) || defined(_UWP) || defined(__MINGW32__) */
888
908typedef SECURITY_STATUS (*psSspiNtlmHashCallback)(void* client,
909 const SEC_WINNT_AUTH_IDENTITY* authIdentity,
910 const SecBuffer* ntproofvalue,
911 const BYTE* randkey, const BYTE* mic,
912 const SecBuffer* micvalue, BYTE* ntlmhash);
913
914#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
915
916WINPR_DEPRECATED_VAR(
917 "[since 3.31.0] use SEC_WINPR_NTLM_SETTINGS_V2", typedef struct {
918 char* samFile;
919 WINPR_ATTR_NODISCARD psSspiNtlmHashCallback
920 hashCallback;
921 void* hashCallbackArg;
922 } SEC_WINPR_NTLM_SETTINGS);
923
924WINPR_DEPRECATED_VAR(
925 "[since 3.31.0] use SEC_WINPR_KERBEROS_SETTINGS_V2", typedef struct {
926 char* kdcUrl;
927 char* keytab;
928 char* cache;
929 char* armorCache;
930 char* pkinitX509Anchors;
931 char* pkinitX509Identity;
932 BOOL withPac;
933 INT32 startTime;
934 INT32 renewLifeTime;
935 INT32 lifeTime;
936 BYTE certSha1[20];
937 } SEC_WINPR_KERBEROS_SETTINGS);
938
939WINPR_DEPRECATED_VAR(
940 "[since 3.31.0] use SEC_WINNT_AUTH_IDENTITY_WINPR_V2", typedef struct {
942 SEC_WINPR_NTLM_SETTINGS* ntlmSettings;
943 SEC_WINPR_KERBEROS_SETTINGS* kerberosSettings;
944 } SEC_WINNT_AUTH_IDENTITY_WINPR);
945
946#endif
947
948typedef struct DECLSPEC_ALIGN(8)
949{
950 DECLSPEC_ALIGN(8)
951 UINT32 size;
952 DECLSPEC_ALIGN(8) char* samFile;
953 DECLSPEC_ALIGN(8)
954 WINPR_ATTR_NODISCARD psSspiNtlmHashCallback
955 hashCallback;
956 DECLSPEC_ALIGN(8) void* hashCallbackArg;
957 DECLSPEC_ALIGN(8) char* targetName;
958 DECLSPEC_ALIGN(8) char* netBiosComputerName;
959 DECLSPEC_ALIGN(8) char* netBiosDomainName;
960 DECLSPEC_ALIGN(8) char* dnsComputerName;
961 DECLSPEC_ALIGN(8) char* dnsDomainName;
962} SEC_WINPR_NTLM_SETTINGS_V2;
963
964typedef struct DECLSPEC_ALIGN(8)
965{
966 DECLSPEC_ALIGN(8) UINT32 size;
967 DECLSPEC_ALIGN(8) char* kdcUrl;
968 DECLSPEC_ALIGN(8) char* keytab;
969 DECLSPEC_ALIGN(8) char* cache;
970 DECLSPEC_ALIGN(8) char* armorCache;
971 DECLSPEC_ALIGN(8) char* pkinitX509Anchors;
972 DECLSPEC_ALIGN(8) char* pkinitX509Identity;
973 DECLSPEC_ALIGN(8) BOOL withPac;
974 DECLSPEC_ALIGN(8) INT32 startTime;
975 DECLSPEC_ALIGN(8) INT32 renewLifeTime;
976 DECLSPEC_ALIGN(8) INT32 lifeTime;
977 DECLSPEC_ALIGN(8) BYTE certSha1[20];
978} SEC_WINPR_KERBEROS_SETTINGS_V2;
979
980typedef enum WINPR_C23_ENUM_TYPE(uint32_t)
981{
982 SEC_WINNT_AUTH_IDENTITY_WINPR_V2_REVISION_1 = 1
983} SEC_WINNT_AUTH_IDENTITY_WINPR_V2_VERSION;
985typedef struct DECLSPEC_ALIGN(8)
986{
987 DECLSPEC_ALIGN(8) SEC_WINNT_AUTH_IDENTITY_EXW identity;
988 DECLSPEC_ALIGN(8) UINT32 version;
989 DECLSPEC_ALIGN(8) SEC_WINPR_NTLM_SETTINGS_V2* ntlmSettingsV2;
990 DECLSPEC_ALIGN(8) SEC_WINPR_KERBEROS_SETTINGS_V2* kerberosSettingsV2;
991} SEC_WINNT_AUTH_IDENTITY_WINPR_V2;
992
993#define SECBUFFER_VERSION 0
994
995/* Buffer Types */
996#define SECBUFFER_EMPTY 0
997#define SECBUFFER_DATA 1
998#define SECBUFFER_TOKEN 2
999#define SECBUFFER_PKG_PARAMS 3
1000#define SECBUFFER_MISSING 4
1001#define SECBUFFER_EXTRA 5
1002#define SECBUFFER_STREAM_TRAILER 6
1003#define SECBUFFER_STREAM_HEADER 7
1004#define SECBUFFER_NEGOTIATION_INFO 8
1005#define SECBUFFER_PADDING 9
1006#define SECBUFFER_STREAM 10
1007#define SECBUFFER_MECHLIST 11
1008#define SECBUFFER_MECHLIST_SIGNATURE 12
1009#define SECBUFFER_TARGET 13
1010#define SECBUFFER_CHANNEL_BINDINGS 14
1011#define SECBUFFER_CHANGE_PASS_RESPONSE 15
1012#define SECBUFFER_TARGET_HOST 16
1013#define SECBUFFER_ALERT 17
1014
1015/* Security Buffer Flags */
1016#define SECBUFFER_ATTRMASK 0xF0000000
1017#define SECBUFFER_READONLY 0x80000000
1018#define SECBUFFER_READONLY_WITH_CHECKSUM 0x10000000
1019#define SECBUFFER_RESERVED 0x60000000
1020
1021#if !defined(_WIN32) || defined(_UWP)
1022
1023typedef void(SEC_ENTRY* SEC_GET_KEY_FN)(void* Arg, void* Principal, UINT32 KeyVer, void** Key,
1024 SECURITY_STATUS* pStatus);
1025
1026typedef SECURITY_STATUS(SEC_ENTRY* ENUMERATE_SECURITY_PACKAGES_FN_A)(ULONG* pcPackages,
1027 PSecPkgInfoA* ppPackageInfo);
1028typedef SECURITY_STATUS(SEC_ENTRY* ENUMERATE_SECURITY_PACKAGES_FN_W)(ULONG* pcPackages,
1029 PSecPkgInfoW* ppPackageInfo);
1030
1031#ifdef UNICODE
1032#define EnumerateSecurityPackages EnumerateSecurityPackagesW
1033#define ENUMERATE_SECURITY_PACKAGES_FN ENUMERATE_SECURITY_PACKAGES_FN_W
1034#else
1035#define EnumerateSecurityPackages EnumerateSecurityPackagesA
1036#define ENUMERATE_SECURITY_PACKAGES_FN ENUMERATE_SECURITY_PACKAGES_FN_A
1037#endif
1038
1039typedef SECURITY_STATUS(SEC_ENTRY* QUERY_CREDENTIALS_ATTRIBUTES_FN_A)(PCredHandle phCredential,
1040 ULONG ulAttribute,
1041 void* pBuffer);
1042typedef SECURITY_STATUS(SEC_ENTRY* QUERY_CREDENTIALS_ATTRIBUTES_FN_W)(PCredHandle phCredential,
1043 ULONG ulAttribute,
1044 void* pBuffer);
1045
1046#ifdef UNICODE
1047#define QueryCredentialsAttributes QueryCredentialsAttributesW
1048#define QUERY_CREDENTIALS_ATTRIBUTES_FN QUERY_CREDENTIALS_ATTRIBUTES_FN_W
1049#else
1050#define QueryCredentialsAttributes QueryCredentialsAttributesA
1051#define QUERY_CREDENTIALS_ATTRIBUTES_FN QUERY_CREDENTIALS_ATTRIBUTES_FN_A
1052#endif
1053
1054typedef SECURITY_STATUS(SEC_ENTRY* ACQUIRE_CREDENTIALS_HANDLE_FN_A)(
1055 LPSTR pszPrincipal, LPSTR pszPackage, ULONG fCredentialUse, void* pvLogonID, void* pAuthData,
1056 SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PCredHandle phCredential,
1057 PTimeStamp ptsExpiry);
1058typedef SECURITY_STATUS(SEC_ENTRY* ACQUIRE_CREDENTIALS_HANDLE_FN_W)(
1059 LPWSTR pszPrincipal, LPWSTR pszPackage, ULONG fCredentialUse, void* pvLogonID, void* pAuthData,
1060 SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PCredHandle phCredential,
1061 PTimeStamp ptsExpiry);
1062
1063#ifdef UNICODE
1064#define AcquireCredentialsHandle AcquireCredentialsHandleW
1065#define ACQUIRE_CREDENTIALS_HANDLE_FN ACQUIRE_CREDENTIALS_HANDLE_FN_W
1066#else
1067#define AcquireCredentialsHandle AcquireCredentialsHandleA
1068#define ACQUIRE_CREDENTIALS_HANDLE_FN ACQUIRE_CREDENTIALS_HANDLE_FN_A
1069#endif
1070
1071typedef SECURITY_STATUS(SEC_ENTRY* FREE_CREDENTIALS_HANDLE_FN)(PCredHandle phCredential);
1072
1073typedef SECURITY_STATUS(SEC_ENTRY* INITIALIZE_SECURITY_CONTEXT_FN_A)(
1074 PCredHandle phCredential, PCtxtHandle phContext, SEC_CHAR* pszTargetName, ULONG fContextReq,
1075 ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput, ULONG Reserved2,
1076 PCtxtHandle phNewContext, PSecBufferDesc pOutput, PULONG pfContextAttr, PTimeStamp ptsExpiry);
1077typedef SECURITY_STATUS(SEC_ENTRY* INITIALIZE_SECURITY_CONTEXT_FN_W)(
1078 PCredHandle phCredential, PCtxtHandle phContext, SEC_WCHAR* pszTargetName, ULONG fContextReq,
1079 ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput, ULONG Reserved2,
1080 PCtxtHandle phNewContext, PSecBufferDesc pOutput, PULONG pfContextAttr, PTimeStamp ptsExpiry);
1081
1082#ifdef UNICODE
1083#define InitializeSecurityContext InitializeSecurityContextW
1084#define INITIALIZE_SECURITY_CONTEXT_FN INITIALIZE_SECURITY_CONTEXT_FN_W
1085#else
1086#define InitializeSecurityContext InitializeSecurityContextA
1087#define INITIALIZE_SECURITY_CONTEXT_FN INITIALIZE_SECURITY_CONTEXT_FN_A
1088#endif
1089
1090typedef SECURITY_STATUS(SEC_ENTRY* ACCEPT_SECURITY_CONTEXT_FN)(
1091 PCredHandle phCredential, PCtxtHandle phContext, PSecBufferDesc pInput, ULONG fContextReq,
1092 ULONG TargetDataRep, PCtxtHandle phNewContext, PSecBufferDesc pOutput, PULONG pfContextAttr,
1093 PTimeStamp ptsTimeStamp);
1094
1095typedef SECURITY_STATUS(SEC_ENTRY* COMPLETE_AUTH_TOKEN_FN)(PCtxtHandle phContext,
1096 PSecBufferDesc pToken);
1097
1098typedef SECURITY_STATUS(SEC_ENTRY* DELETE_SECURITY_CONTEXT_FN)(PCtxtHandle phContext);
1099
1100typedef SECURITY_STATUS(SEC_ENTRY* APPLY_CONTROL_TOKEN_FN)(PCtxtHandle phContext,
1101 PSecBufferDesc pInput);
1102
1103typedef SECURITY_STATUS(SEC_ENTRY* QUERY_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle phContext,
1104 ULONG ulAttribute, void* pBuffer);
1105typedef SECURITY_STATUS(SEC_ENTRY* QUERY_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle phContext,
1106 ULONG ulAttribute, void* pBuffer);
1107
1108#ifdef UNICODE
1109#define QueryContextAttributes QueryContextAttributesW
1110#define QUERY_CONTEXT_ATTRIBUTES_FN QUERY_CONTEXT_ATTRIBUTES_FN_W
1111#else
1112#define QueryContextAttributes QueryContextAttributesA
1113#define QUERY_CONTEXT_ATTRIBUTES_FN QUERY_CONTEXT_ATTRIBUTES_FN_A
1114#endif
1115
1116typedef SECURITY_STATUS(SEC_ENTRY* IMPERSONATE_SECURITY_CONTEXT_FN)(PCtxtHandle phContext);
1117
1118typedef SECURITY_STATUS(SEC_ENTRY* REVERT_SECURITY_CONTEXT_FN)(PCtxtHandle phContext);
1119
1120typedef SECURITY_STATUS(SEC_ENTRY* MAKE_SIGNATURE_FN)(PCtxtHandle phContext, ULONG fQOP,
1121 PSecBufferDesc pMessage, ULONG MessageSeqNo);
1122
1123typedef SECURITY_STATUS(SEC_ENTRY* VERIFY_SIGNATURE_FN)(PCtxtHandle phContext,
1124 PSecBufferDesc pMessage, ULONG MessageSeqNo,
1125 PULONG pfQOP);
1126
1127typedef SECURITY_STATUS(SEC_ENTRY* FREE_CONTEXT_BUFFER_FN)(void* pvContextBuffer);
1128
1129typedef SECURITY_STATUS(SEC_ENTRY* QUERY_SECURITY_PACKAGE_INFO_FN_A)(SEC_CHAR* pszPackageName,
1130 PSecPkgInfoA* ppPackageInfo);
1131typedef SECURITY_STATUS(SEC_ENTRY* QUERY_SECURITY_PACKAGE_INFO_FN_W)(SEC_WCHAR* pszPackageName,
1132 PSecPkgInfoW* ppPackageInfo);
1133
1134#ifdef UNICODE
1135#define QuerySecurityPackageInfo QuerySecurityPackageInfoW
1136#define QUERY_SECURITY_PACKAGE_INFO_FN QUERY_SECURITY_PACKAGE_INFO_FN_W
1137#else
1138#define QuerySecurityPackageInfo QuerySecurityPackageInfoA
1139#define QUERY_SECURITY_PACKAGE_INFO_FN QUERY_SECURITY_PACKAGE_INFO_FN_A
1140#endif
1141
1142typedef SECURITY_STATUS(SEC_ENTRY* EXPORT_SECURITY_CONTEXT_FN)(PCtxtHandle phContext, ULONG fFlags,
1143 PSecBuffer pPackedContext,
1144 HANDLE* pToken);
1145
1146typedef SECURITY_STATUS(SEC_ENTRY* IMPORT_SECURITY_CONTEXT_FN_A)(SEC_CHAR* pszPackage,
1147 PSecBuffer pPackedContext,
1148 HANDLE pToken,
1149 PCtxtHandle phContext);
1150typedef SECURITY_STATUS(SEC_ENTRY* IMPORT_SECURITY_CONTEXT_FN_W)(SEC_WCHAR* pszPackage,
1151 PSecBuffer pPackedContext,
1152 HANDLE pToken,
1153 PCtxtHandle phContext);
1154
1155#ifdef UNICODE
1156#define ImportSecurityContext ImportSecurityContextW
1157#define IMPORT_SECURITY_CONTEXT_FN IMPORT_SECURITY_CONTEXT_FN_W
1158#else
1159#define ImportSecurityContext ImportSecurityContextA
1160#define IMPORT_SECURITY_CONTEXT_FN IMPORT_SECURITY_CONTEXT_FN_A
1161#endif
1162
1163typedef SECURITY_STATUS(SEC_ENTRY* ADD_CREDENTIALS_FN_A)(
1164 PCredHandle hCredentials, SEC_CHAR* pszPrincipal, SEC_CHAR* pszPackage, UINT32 fCredentialUse,
1165 void* pAuthData, SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PTimeStamp ptsExpiry);
1166typedef SECURITY_STATUS(SEC_ENTRY* ADD_CREDENTIALS_FN_W)(
1167 PCredHandle hCredentials, SEC_WCHAR* pszPrincipal, SEC_WCHAR* pszPackage, UINT32 fCredentialUse,
1168 void* pAuthData, SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PTimeStamp ptsExpiry);
1169
1170#ifdef UNICODE
1171#define AddCredentials AddCredentialsW
1172#define ADD_CREDENTIALS_FN ADD_CREDENTIALS_FN_W
1173#else
1174#define AddCredentials AddCredentialsA
1175#define ADD_CREDENTIALS_FN ADD_CREDENTIALS_FN_A
1176#endif
1177
1178typedef SECURITY_STATUS(SEC_ENTRY* QUERY_SECURITY_CONTEXT_TOKEN_FN)(PCtxtHandle phContext,
1179 HANDLE* phToken);
1180
1181typedef SECURITY_STATUS(SEC_ENTRY* ENCRYPT_MESSAGE_FN)(PCtxtHandle phContext, ULONG fQOP,
1182 PSecBufferDesc pMessage, ULONG MessageSeqNo);
1183
1184typedef SECURITY_STATUS(SEC_ENTRY* DECRYPT_MESSAGE_FN)(PCtxtHandle phContext,
1185 PSecBufferDesc pMessage, ULONG MessageSeqNo,
1186 PULONG pfQOP);
1187
1188typedef SECURITY_STATUS(SEC_ENTRY* SET_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle phContext,
1189 ULONG ulAttribute, void* pBuffer,
1190 ULONG cbBuffer);
1191typedef SECURITY_STATUS(SEC_ENTRY* SET_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle phContext,
1192 ULONG ulAttribute, void* pBuffer,
1193 ULONG cbBuffer);
1194
1195#ifdef UNICODE
1196#define SetContextAttributes SetContextAttributesW
1197#define SET_CONTEXT_ATTRIBUTES_FN SET_CONTEXT_ATTRIBUTES_FN_W
1198#else
1199#define SetContextAttributes SetContextAttributesA
1200#define SET_CONTEXT_ATTRIBUTES_FN SET_CONTEXT_ATTRIBUTES_FN_A
1201#endif
1202
1203typedef SECURITY_STATUS(SEC_ENTRY* SET_CREDENTIALS_ATTRIBUTES_FN_A)(PCredHandle phCredential,
1204 ULONG ulAttribute,
1205 void* pBuffer, ULONG cbBuffer);
1206
1207typedef SECURITY_STATUS(SEC_ENTRY* SET_CREDENTIALS_ATTRIBUTES_FN_W)(PCredHandle phCredential,
1208 ULONG ulAttribute,
1209 void* pBuffer, ULONG cbBuffer);
1210
1211#ifdef UNICODE
1212#define SetCredentialsAttributes SetCredentialsAttributesW
1213#define SET_CREDENTIALS_ATTRIBUTES_FN SET_CREDENTIALS_ATTRIBUTES_FN_W
1214#else
1215#define SetCredentialsAttributes SetCredentialsAttributesA
1216#define SET_CREDENTIALS_ATTRIBUTES_FN SET_CREDENTIALS_ATTRIBUTES_FN_A
1217#endif
1218
1219#define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION \
1220 1 /* Interface has all routines through DecryptMessage */
1221#define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_2 \
1222 2 /* Interface has all routines through SetContextAttributes */
1223#define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_3 \
1224 3 /* Interface has all routines through SetCredentialsAttributes */
1225#define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_4 \
1226 4 /* Interface has all routines through ChangeAccountPassword */
1227
1228typedef struct
1229{
1230 UINT32 dwVersion;
1231 WINPR_ATTR_NODISCARD ENUMERATE_SECURITY_PACKAGES_FN_A EnumerateSecurityPackagesA;
1232 WINPR_ATTR_NODISCARD QUERY_CREDENTIALS_ATTRIBUTES_FN_A QueryCredentialsAttributesA;
1233 WINPR_ATTR_NODISCARD ACQUIRE_CREDENTIALS_HANDLE_FN_A AcquireCredentialsHandleA;
1234 FREE_CREDENTIALS_HANDLE_FN FreeCredentialsHandle;
1235 void* Reserved2;
1236 WINPR_ATTR_NODISCARD INITIALIZE_SECURITY_CONTEXT_FN_A InitializeSecurityContextA;
1237 WINPR_ATTR_NODISCARD ACCEPT_SECURITY_CONTEXT_FN AcceptSecurityContext;
1238 WINPR_ATTR_NODISCARD COMPLETE_AUTH_TOKEN_FN CompleteAuthToken;
1239 DELETE_SECURITY_CONTEXT_FN DeleteSecurityContext;
1240 WINPR_ATTR_NODISCARD APPLY_CONTROL_TOKEN_FN ApplyControlToken;
1241 WINPR_ATTR_NODISCARD QUERY_CONTEXT_ATTRIBUTES_FN_A QueryContextAttributesA;
1242 WINPR_ATTR_NODISCARD IMPERSONATE_SECURITY_CONTEXT_FN ImpersonateSecurityContext;
1243 WINPR_ATTR_NODISCARD REVERT_SECURITY_CONTEXT_FN RevertSecurityContext;
1244 WINPR_ATTR_NODISCARD MAKE_SIGNATURE_FN MakeSignature;
1245 WINPR_ATTR_NODISCARD VERIFY_SIGNATURE_FN VerifySignature;
1246 FREE_CONTEXT_BUFFER_FN FreeContextBuffer;
1247 WINPR_ATTR_NODISCARD QUERY_SECURITY_PACKAGE_INFO_FN_A QuerySecurityPackageInfoA;
1248 void* Reserved3;
1249 void* Reserved4;
1250 WINPR_ATTR_NODISCARD EXPORT_SECURITY_CONTEXT_FN ExportSecurityContext;
1251 WINPR_ATTR_NODISCARD IMPORT_SECURITY_CONTEXT_FN_A ImportSecurityContextA;
1252 WINPR_ATTR_NODISCARD ADD_CREDENTIALS_FN_A AddCredentialsA;
1253 void* Reserved8;
1254 WINPR_ATTR_NODISCARD QUERY_SECURITY_CONTEXT_TOKEN_FN QuerySecurityContextToken;
1255 WINPR_ATTR_NODISCARD ENCRYPT_MESSAGE_FN EncryptMessage;
1256 WINPR_ATTR_NODISCARD DECRYPT_MESSAGE_FN DecryptMessage;
1257 WINPR_ATTR_NODISCARD SET_CONTEXT_ATTRIBUTES_FN_A SetContextAttributesA;
1258 WINPR_ATTR_NODISCARD SET_CREDENTIALS_ATTRIBUTES_FN_A SetCredentialsAttributesA;
1261
1262typedef struct
1263{
1264 UINT32 dwVersion;
1265 WINPR_ATTR_NODISCARD ENUMERATE_SECURITY_PACKAGES_FN_W EnumerateSecurityPackagesW;
1266 WINPR_ATTR_NODISCARD QUERY_CREDENTIALS_ATTRIBUTES_FN_W QueryCredentialsAttributesW;
1267 WINPR_ATTR_NODISCARD ACQUIRE_CREDENTIALS_HANDLE_FN_W AcquireCredentialsHandleW;
1268 FREE_CREDENTIALS_HANDLE_FN FreeCredentialsHandle;
1269 void* Reserved2;
1270 WINPR_ATTR_NODISCARD INITIALIZE_SECURITY_CONTEXT_FN_W InitializeSecurityContextW;
1271 WINPR_ATTR_NODISCARD ACCEPT_SECURITY_CONTEXT_FN AcceptSecurityContext;
1272 WINPR_ATTR_NODISCARD COMPLETE_AUTH_TOKEN_FN CompleteAuthToken;
1273 DELETE_SECURITY_CONTEXT_FN DeleteSecurityContext;
1274 WINPR_ATTR_NODISCARD APPLY_CONTROL_TOKEN_FN ApplyControlToken;
1275 WINPR_ATTR_NODISCARD QUERY_CONTEXT_ATTRIBUTES_FN_W QueryContextAttributesW;
1276 WINPR_ATTR_NODISCARD IMPERSONATE_SECURITY_CONTEXT_FN ImpersonateSecurityContext;
1277 WINPR_ATTR_NODISCARD REVERT_SECURITY_CONTEXT_FN RevertSecurityContext;
1278 WINPR_ATTR_NODISCARD MAKE_SIGNATURE_FN MakeSignature;
1279 WINPR_ATTR_NODISCARD VERIFY_SIGNATURE_FN VerifySignature;
1280 FREE_CONTEXT_BUFFER_FN FreeContextBuffer;
1281 WINPR_ATTR_NODISCARD QUERY_SECURITY_PACKAGE_INFO_FN_W QuerySecurityPackageInfoW;
1282 void* Reserved3;
1283 void* Reserved4;
1284 WINPR_ATTR_NODISCARD EXPORT_SECURITY_CONTEXT_FN ExportSecurityContext;
1285 WINPR_ATTR_NODISCARD IMPORT_SECURITY_CONTEXT_FN_W ImportSecurityContextW;
1286 WINPR_ATTR_NODISCARD ADD_CREDENTIALS_FN_W AddCredentialsW;
1287 void* Reserved8;
1288 WINPR_ATTR_NODISCARD QUERY_SECURITY_CONTEXT_TOKEN_FN QuerySecurityContextToken;
1289 WINPR_ATTR_NODISCARD ENCRYPT_MESSAGE_FN EncryptMessage;
1290 WINPR_ATTR_NODISCARD DECRYPT_MESSAGE_FN DecryptMessage;
1291 WINPR_ATTR_NODISCARD SET_CONTEXT_ATTRIBUTES_FN_W SetContextAttributesW;
1292 WINPR_ATTR_NODISCARD SET_CREDENTIALS_ATTRIBUTES_FN_W SetCredentialsAttributesW;
1295
1296typedef PSecurityFunctionTableA(SEC_ENTRY* INIT_SECURITY_INTERFACE_A)(void);
1297typedef PSecurityFunctionTableW(SEC_ENTRY* INIT_SECURITY_INTERFACE_W)(void);
1298
1299#ifdef UNICODE
1300#define InitSecurityInterface InitSecurityInterfaceW
1301#define SecurityFunctionTable SecurityFunctionTableW
1302#define PSecurityFunctionTable PSecurityFunctionTableW
1303#define INIT_SECURITY_INTERFACE INIT_SECURITY_INTERFACE_W
1304#else
1305#define InitSecurityInterface InitSecurityInterfaceA
1306#define SecurityFunctionTable SecurityFunctionTableA
1307#define PSecurityFunctionTable PSecurityFunctionTableA
1308#define INIT_SECURITY_INTERFACE INIT_SECURITY_INTERFACE_A
1309#endif
1310
1311#ifdef __cplusplus
1312extern "C"
1313{
1314#endif
1315
1316#ifdef SSPI_DLL
1317
1318 /* Package Management */
1319
1320 WINPR_ATTR_NODISCARD
1321 WINPR_API SECURITY_STATUS SEC_ENTRY EnumerateSecurityPackagesA(ULONG* pcPackages,
1322 PSecPkgInfoA* ppPackageInfo);
1323
1324 WINPR_ATTR_NODISCARD
1325 WINPR_API SECURITY_STATUS SEC_ENTRY EnumerateSecurityPackagesW(ULONG* pcPackages,
1326 PSecPkgInfoW* ppPackageInfo);
1327
1328 WINPR_ATTR_NODISCARD
1329 WINPR_API PSecurityFunctionTableA SEC_ENTRY InitSecurityInterfaceA(void);
1330
1331 WINPR_ATTR_NODISCARD
1332 WINPR_API PSecurityFunctionTableW SEC_ENTRY InitSecurityInterfaceW(void);
1333
1334 WINPR_ATTR_NODISCARD
1335 WINPR_API SECURITY_STATUS SEC_ENTRY QuerySecurityPackageInfoA(SEC_CHAR* pszPackageName,
1336 PSecPkgInfoA* ppPackageInfo);
1337
1338 WINPR_ATTR_NODISCARD
1339 WINPR_API SECURITY_STATUS SEC_ENTRY QuerySecurityPackageInfoW(SEC_WCHAR* pszPackageName,
1340 PSecPkgInfoW* ppPackageInfo);
1341
1342 /* Credential Management */
1343
1344 WINPR_ATTR_NODISCARD
1345 WINPR_API SECURITY_STATUS SEC_ENTRY AcquireCredentialsHandleA(
1346 SEC_CHAR* pszPrincipal, SEC_CHAR* pszPackage, ULONG fCredentialUse, void* pvLogonID,
1347 void* pAuthData, SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PCredHandle phCredential,
1348 PTimeStamp ptsExpiry);
1349
1350 WINPR_ATTR_NODISCARD
1351 WINPR_API SECURITY_STATUS SEC_ENTRY AcquireCredentialsHandleW(
1352 SEC_WCHAR* pszPrincipal, SEC_WCHAR* pszPackage, ULONG fCredentialUse, void* pvLogonID,
1353 void* pAuthData, SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PCredHandle phCredential,
1354 PTimeStamp ptsExpiry);
1355
1356 WINPR_ATTR_NODISCARD
1357 WINPR_API SECURITY_STATUS SEC_ENTRY ExportSecurityContext(PCtxtHandle phContext, ULONG fFlags,
1358 PSecBuffer pPackedContext,
1359 HANDLE* pToken);
1360
1361 WINPR_ATTR_NODISCARD
1362 WINPR_API SECURITY_STATUS SEC_ENTRY FreeCredentialsHandle(PCredHandle phCredential);
1363
1364 WINPR_ATTR_NODISCARD
1365 WINPR_API SECURITY_STATUS SEC_ENTRY ImportSecurityContextA(SEC_CHAR* pszPackage,
1366 PSecBuffer pPackedContext,
1367 HANDLE pToken,
1368 PCtxtHandle phContext);
1369
1370 WINPR_ATTR_NODISCARD
1371 WINPR_API SECURITY_STATUS SEC_ENTRY ImportSecurityContextW(SEC_WCHAR* pszPackage,
1372 PSecBuffer pPackedContext,
1373 HANDLE pToken,
1374 PCtxtHandle phContext);
1375
1376 WINPR_ATTR_NODISCARD
1377 WINPR_API SECURITY_STATUS SEC_ENTRY QueryCredentialsAttributesA(PCredHandle phCredential,
1378 ULONG ulAttribute,
1379 void* pBuffer);
1380
1381 WINPR_ATTR_NODISCARD
1382 WINPR_API SECURITY_STATUS SEC_ENTRY QueryCredentialsAttributesW(PCredHandle phCredential,
1383 ULONG ulAttribute,
1384 void* pBuffer);
1385
1386 /* Context Management */
1387
1388 WINPR_ATTR_NODISCARD
1389 WINPR_API SECURITY_STATUS SEC_ENTRY
1390 AcceptSecurityContext(PCredHandle phCredential, PCtxtHandle phContext, PSecBufferDesc pInput,
1391 ULONG fContextReq, ULONG TargetDataRep, PCtxtHandle phNewContext,
1392 PSecBufferDesc pOutput, PULONG pfContextAttr, PTimeStamp ptsTimeStamp);
1393
1394 WINPR_ATTR_NODISCARD
1395 WINPR_API SECURITY_STATUS SEC_ENTRY ApplyControlToken(PCtxtHandle phContext,
1396 PSecBufferDesc pInput);
1397
1398 WINPR_ATTR_NODISCARD
1399 WINPR_API SECURITY_STATUS SEC_ENTRY CompleteAuthToken(PCtxtHandle phContext,
1400 PSecBufferDesc pToken);
1401
1402 WINPR_ATTR_NODISCARD
1403 WINPR_API SECURITY_STATUS SEC_ENTRY DeleteSecurityContext(PCtxtHandle phContext);
1404
1405 WINPR_ATTR_NODISCARD
1406 WINPR_API SECURITY_STATUS SEC_ENTRY FreeContextBuffer(void* pvContextBuffer);
1407
1408 WINPR_ATTR_NODISCARD
1409 WINPR_API SECURITY_STATUS SEC_ENTRY ImpersonateSecurityContext(PCtxtHandle phContext);
1410
1411 WINPR_ATTR_NODISCARD
1412 WINPR_API SECURITY_STATUS SEC_ENTRY InitializeSecurityContextA(
1413 PCredHandle phCredential, PCtxtHandle phContext, SEC_CHAR* pszTargetName, ULONG fContextReq,
1414 ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput, ULONG Reserved2,
1415 PCtxtHandle phNewContext, PSecBufferDesc pOutput, PULONG pfContextAttr,
1416 PTimeStamp ptsExpiry);
1417
1418 WINPR_ATTR_NODISCARD
1419 WINPR_API SECURITY_STATUS SEC_ENTRY InitializeSecurityContextW(
1420 PCredHandle phCredential, PCtxtHandle phContext, SEC_WCHAR* pszTargetName,
1421 ULONG fContextReq, ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput,
1422 ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput, PULONG pfContextAttr,
1423 PTimeStamp ptsExpiry);
1424
1425 WINPR_ATTR_NODISCARD
1426 WINPR_API SECURITY_STATUS SEC_ENTRY QueryContextAttributes(PCtxtHandle phContext,
1427 ULONG ulAttribute, void* pBuffer);
1428
1429 WINPR_ATTR_NODISCARD
1430 WINPR_API SECURITY_STATUS SEC_ENTRY QuerySecurityContextToken(PCtxtHandle phContext,
1431 HANDLE* phToken);
1432
1433 WINPR_ATTR_NODISCARD
1434 WINPR_API SECURITY_STATUS SEC_ENTRY SetContextAttributes(PCtxtHandle phContext,
1435 ULONG ulAttribute, void* pBuffer,
1436 ULONG cbBuffer);
1437
1438 WINPR_ATTR_NODISCARD
1439 WINPR_API SECURITY_STATUS SEC_ENTRY RevertSecurityContext(PCtxtHandle phContext);
1440
1441 /* Message Support */
1442
1443 WINPR_ATTR_NODISCARD
1444 WINPR_API SECURITY_STATUS SEC_ENTRY DecryptMessage(PCtxtHandle phContext,
1445 PSecBufferDesc pMessage, ULONG MessageSeqNo,
1446 PULONG pfQOP);
1447
1448 WINPR_ATTR_NODISCARD
1449 WINPR_API SECURITY_STATUS SEC_ENTRY EncryptMessage(PCtxtHandle phContext, ULONG fQOP,
1450 PSecBufferDesc pMessage, ULONG MessageSeqNo);
1451
1452 WINPR_ATTR_NODISCARD
1453 WINPR_API SECURITY_STATUS SEC_ENTRY MakeSignature(PCtxtHandle phContext, ULONG fQOP,
1454 PSecBufferDesc pMessage, ULONG MessageSeqNo);
1455
1456 WINPR_ATTR_NODISCARD
1457 WINPR_API SECURITY_STATUS SEC_ENTRY VerifySignature(PCtxtHandle phContext,
1458 PSecBufferDesc pMessage, ULONG MessageSeqNo,
1459 PULONG pfQOP);
1460
1461#endif /* SSPI_DLL */
1462
1463#ifdef __cplusplus
1464}
1465#endif
1466
1467#endif
1468
1469#ifdef __cplusplus
1470extern "C"
1471{
1472#endif
1473
1474 /* Custom API */
1475
1476/* Extended SECPKG_ATTR IDs begin at 1000 */
1477 enum WINPR_C23_ENUM_TYPE(uint32_t)
1478 {
1479 SECPKG_ATTR_AUTH_IDENTITY = 1001,
1480 SECPKG_ATTR_AUTH_PASSWORD = 1002,
1481 SECPKG_ATTR_AUTH_NTLM_HASH = 1003,
1482 SECPKG_ATTR_AUTH_NTLM_MESSAGE = 1100,
1483 SECPKG_ATTR_AUTH_NTLM_TIMESTAMP = 1101,
1484 SECPKG_ATTR_AUTH_NTLM_CLIENT_CHALLENGE = 1102,
1485 SECPKG_ATTR_AUTH_NTLM_SERVER_CHALLENGE = 1103,
1486 SECPKG_ATTR_AUTH_NTLM_NTPROOF_VALUE = 1104,
1487 SECPKG_ATTR_AUTH_NTLM_RANDKEY = 1105,
1488 SECPKG_ATTR_AUTH_NTLM_MIC = 1106,
1489 SECPKG_ATTR_AUTH_NTLM_MIC_VALUE = 1107,
1490 SECPKG_ATTR_AUTH_NTLM_HOSTNAME = 1108,
1491 SECPKG_ATTR_AUTH_NTLM_HOSTNAME_LEN = 1110,
1492 SECPKG_ATTR_AUTH_NTLM_NB_COMPUTER_NAME = 1111,
1493 SECPKG_ATTR_AUTH_NTLM_NB_COMPUTER_NAME_LEN = 1112,
1494 SECPKG_ATTR_AUTH_NTLM_NB_DOMAIN_NAME = 1113,
1495 SECPKG_ATTR_AUTH_NTLM_NB_DOMAIN_NAME_LEN = 1114,
1496 SECPKG_ATTR_AUTH_NTLM_DNS_COMPUTER_NAME = 1115,
1497 SECPKG_ATTR_AUTH_NTLM_DNS_COMPUTER_NAME_LEN = 1116,
1498 SECPKG_ATTR_AUTH_NTLM_DNS_DOMAIN_NAME = 1117,
1499 SECPKG_ATTR_AUTH_NTLM_DNS_DOMAIN_NAME_LEN = 1118
1500 };
1501
1502#define SECPKG_CRED_ATTR_TICKET_LOGON 1200
1503
1504 typedef struct
1505 {
1506 char User[256 + 1];
1507 char Domain[256 + 1];
1509
1510 typedef struct
1511 {
1512 char Password[256 + 1];
1514
1515 typedef struct
1516 {
1517 int Version;
1518 BYTE NtlmHash[16];
1520
1521 typedef struct
1522 {
1523 BYTE Timestamp[8];
1524 BOOL ChallengeOrResponse;
1526
1527 typedef struct
1528 {
1529 BYTE ClientChallenge[8];
1531
1532 typedef struct
1533 {
1534 BYTE ServerChallenge[8];
1536
1537 typedef struct
1538 {
1539 UINT32 type;
1540 UINT32 length;
1541 BYTE* buffer;
1543
1544#define SSPI_INTERFACE_WINPR 0x00000001
1545#define SSPI_INTERFACE_NATIVE 0x00000002
1546
1547 typedef PSecurityFunctionTableA(SEC_ENTRY* INIT_SECURITY_INTERFACE_EX_A)(DWORD flags);
1548 typedef PSecurityFunctionTableW(SEC_ENTRY* INIT_SECURITY_INTERFACE_EX_W)(DWORD flags);
1549
1550 WINPR_API void sspi_GlobalInit(void);
1551 WINPR_API void sspi_GlobalFinish(void);
1552
1553 WINPR_ATTR_NODISCARD
1554 WINPR_API void* sspi_SecBufferAlloc(PSecBuffer SecBuffer, ULONG size);
1555 WINPR_API void sspi_SecBufferFree(PSecBuffer SecBuffer);
1556
1557#define sspi_SetAuthIdentity sspi_SetAuthIdentityA
1558 WINPR_ATTR_NODISCARD
1559 WINPR_API int sspi_SetAuthIdentityA(SEC_WINNT_AUTH_IDENTITY* identity, const char* user,
1560 const char* domain, const char* password);
1561
1562 WINPR_ATTR_NODISCARD
1563 WINPR_API int sspi_SetAuthIdentityW(SEC_WINNT_AUTH_IDENTITY* identity, const WCHAR* user,
1564 const WCHAR* domain, const WCHAR* password);
1565
1566 WINPR_ATTR_NODISCARD
1567 WINPR_API int sspi_SetAuthIdentityWithLengthW(SEC_WINNT_AUTH_IDENTITY* identity,
1568 const WCHAR* user, size_t userLen,
1569 const WCHAR* domain, size_t domainLen,
1570 const WCHAR* password, size_t passwordLen);
1571
1572 WINPR_ATTR_NODISCARD
1573 WINPR_API UINT32 sspi_GetAuthIdentityVersion(const void* identity);
1574
1575 WINPR_ATTR_NODISCARD
1576 WINPR_API UINT32 sspi_GetAuthIdentityFlags(const void* identity);
1577
1578 WINPR_ATTR_NODISCARD
1579 WINPR_API BOOL sspi_GetAuthIdentityUserDomainW(const void* identity, const WCHAR** pUser,
1580 UINT32* pUserLength, const WCHAR** pDomain,
1581 UINT32* pDomainLength);
1582
1583 WINPR_ATTR_NODISCARD
1584 WINPR_API BOOL sspi_GetAuthIdentityUserDomainA(const void* identity, const char** pUser,
1585 UINT32* pUserLength, const char** pDomain,
1586 UINT32* pDomainLength);
1587
1588 WINPR_ATTR_NODISCARD
1589 WINPR_API BOOL sspi_GetAuthIdentityPasswordW(const void* identity, const WCHAR** pPassword,
1590 UINT32* pPasswordLength);
1591
1592 WINPR_ATTR_NODISCARD
1593 WINPR_API BOOL sspi_GetAuthIdentityPasswordA(const void* identity, const char** pPassword,
1594 UINT32* pPasswordLength);
1595
1596 WINPR_ATTR_NODISCARD
1597 WINPR_API BOOL sspi_CopyAuthIdentityFieldsA(const SEC_WINNT_AUTH_IDENTITY_INFO* identity,
1598 char** pUser, char** pDomain, char** pPassword);
1599
1600 WINPR_ATTR_NODISCARD
1601 WINPR_API BOOL sspi_CopyAuthIdentityFieldsW(const SEC_WINNT_AUTH_IDENTITY_INFO* identity,
1602 WCHAR** pUser, WCHAR** pDomain, WCHAR** pPassword);
1603
1604 WINPR_ATTR_NODISCARD
1605 WINPR_API BOOL sspi_CopyAuthPackageListA(const SEC_WINNT_AUTH_IDENTITY_INFO* identity,
1606 char** pPackageList);
1607
1608 WINPR_ATTR_NODISCARD
1609 WINPR_API int sspi_CopyAuthIdentity(SEC_WINNT_AUTH_IDENTITY* identity,
1610 const SEC_WINNT_AUTH_IDENTITY_INFO* srcIdentity);
1611
1612 WINPR_API void sspi_FreeAuthIdentity(SEC_WINNT_AUTH_IDENTITY* identity);
1613
1614 WINPR_ATTR_NODISCARD
1615 WINPR_API const char* GetSecurityStatusString(SECURITY_STATUS status);
1616
1617 WINPR_ATTR_NODISCARD
1618 WINPR_API SecurityFunctionTableW* SEC_ENTRY InitSecurityInterfaceExW(DWORD flags);
1619
1620 WINPR_ATTR_NODISCARD
1621 WINPR_API SecurityFunctionTableA* SEC_ENTRY InitSecurityInterfaceExA(DWORD flags);
1622
1627 WINPR_API void sspi_FreeSecNtlmSettings(SEC_WINPR_NTLM_SETTINGS_V2* settings);
1628
1633 WINPR_ATTR_MALLOC(sspi_FreeSecNtlmSettings, 1)
1634 WINPR_API SEC_WINPR_NTLM_SETTINGS_V2* sspi_AllocSecNtlmSettings(void);
1635
1640 WINPR_API void sspi_FreeSecKerberosSettings(SEC_WINPR_KERBEROS_SETTINGS_V2* settings);
1641
1646 WINPR_ATTR_MALLOC(sspi_FreeSecKerberosSettings, 1)
1647 WINPR_API SEC_WINPR_KERBEROS_SETTINGS_V2* sspi_AllocSecKerberosSettings(void);
1648
1660 WINPR_ATTR_NODISCARD
1661 WINPR_API BOOL sspi_CloneSecSettingsString(char** dest, const char* src);
1662
1663#ifdef UNICODE
1664#define InitSecurityInterfaceEx InitSecurityInterfaceExW
1665#define INIT_SECURITY_INTERFACE_EX INIT_SECURITY_INTERFACE_EX_W
1666#else
1667#define InitSecurityInterfaceEx InitSecurityInterfaceExA
1668#define INIT_SECURITY_INTERFACE_EX INIT_SECURITY_INTERFACE_EX_A
1669#endif
1670
1671#ifdef __cplusplus
1672}
1673#endif
1674
1675#endif /* WINPR_SSPI_H */