20#include <winpr/platform.h>
21#include <winpr/config.h>
24WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
25WINPR_PRAGMA_DIAG_IGNORED_UNUSED_MACRO
27#define _NO_KSECDD_IMPORT_ 1
31#include <winpr/sspi.h>
34#include <winpr/synch.h>
35#include <winpr/wlog.h>
36#include <winpr/library.h>
37#include <winpr/environment.h>
41#if defined(__GNUC__) || defined(__clang__)
42#define IFCALLRESULT(_default_return, _cb, ...) \
46 WLog_VRB("com.winpr.api", "IFCALLRESULT(" #_cb ") == nullptr"); \
48 ((_cb != nullptr) ? _cb(__VA_ARGS__) : (_default_return)); \
51#define IFCALLRESULT(_default_return, _cb, ...) \
52 ((_cb != nullptr) ? _cb(__VA_ARGS__) : (_default_return))
56WINPR_PRAGMA_DIAG_IGNORED_MISSING_PROTOTYPES
58static wLog* g_Log =
nullptr;
60static INIT_ONCE g_Initialized = INIT_ONCE_STATIC_INIT;
61#if defined(WITH_NATIVE_SSPI)
62static HMODULE g_SspiModule =
nullptr;
70#if defined(WITH_NATIVE_SSPI)
71static BOOL ShouldUseNativeSspi(
void);
72static BOOL InitializeSspiModule_Native(
void);
75#if defined(WITH_NATIVE_SSPI)
76BOOL ShouldUseNativeSspi(
void)
80 LPCSTR sspi =
"WINPR_NATIVE_SSPI";
83 nSize = GetEnvironmentVariableA(sspi,
nullptr, 0);
88 env = (LPSTR)malloc(nSize);
93 if (GetEnvironmentVariableA(sspi, env, nSize) != nSize - 1)
99 if (strcmp(env,
"0") == 0)
110#if defined(WITH_NATIVE_SSPI)
111BOOL InitializeSspiModule_Native(
void)
115 INIT_SECURITY_INTERFACE_W pInitSecurityInterfaceW;
116 INIT_SECURITY_INTERFACE_A pInitSecurityInterfaceA;
117 g_SspiModule = LoadLibraryA(
"secur32.dll");
120 g_SspiModule = LoadLibraryA(
"sspicli.dll");
125 pInitSecurityInterfaceW =
126 GetProcAddressAs(g_SspiModule,
"InitSecurityInterfaceW", INIT_SECURITY_INTERFACE_W);
127 pInitSecurityInterfaceA =
128 GetProcAddressAs(g_SspiModule,
"InitSecurityInterfaceA", INIT_SECURITY_INTERFACE_A);
130 if (pInitSecurityInterfaceW)
132 pSspiW = pInitSecurityInterfaceW();
136 g_SspiW = &windows_SecurityFunctionTableW;
137 CopyMemory(g_SspiW, pSspiW,
140 g_SspiW->dwVersion = SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_3;
142 g_SspiW->SetContextAttributesW = GetProcAddressAs(g_SspiModule,
"SetContextAttributesW",
143 SET_CONTEXT_ATTRIBUTES_FN_W);
145 g_SspiW->SetCredentialsAttributesW = GetProcAddressAs(
146 g_SspiModule,
"SetCredentialsAttributesW", SET_CREDENTIALS_ATTRIBUTES_FN_W);
150 if (pInitSecurityInterfaceA)
152 pSspiA = pInitSecurityInterfaceA();
156 g_SspiA = &windows_SecurityFunctionTableA;
157 CopyMemory(g_SspiA, pSspiA,
160 g_SspiA->dwVersion = SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_3;
162 g_SspiA->SetContextAttributesA = GetProcAddressAs(g_SspiModule,
"SetContextAttributesA",
163 SET_CONTEXT_ATTRIBUTES_FN_W);
165 g_SspiA->SetCredentialsAttributesA = GetProcAddressAs(
166 g_SspiModule,
"SetCredentialsAttributesA", SET_CREDENTIALS_ATTRIBUTES_FN_W);
174static BOOL CALLBACK InitializeSspiModuleInt(WINPR_ATTR_UNUSED
PINIT_ONCE once,
175 WINPR_ATTR_UNUSED PVOID param,
176 WINPR_ATTR_UNUSED PVOID* context)
179#if defined(WITH_NATIVE_SSPI)
183 flags = *(DWORD*)param;
187 g_Log = WLog_Get(
"com.winpr.sspi");
188#if defined(WITH_NATIVE_SSPI)
190 if (flags && (flags & SSPI_INTERFACE_NATIVE))
192 status = InitializeSspiModule_Native();
194 else if (flags && (flags & SSPI_INTERFACE_WINPR))
196 g_SspiW = winpr_InitSecurityInterfaceW();
197 g_SspiA = winpr_InitSecurityInterfaceA();
201 if (!status && ShouldUseNativeSspi())
203 status = InitializeSspiModule_Native();
210 g_SspiW = winpr_InitSecurityInterfaceW();
211 g_SspiA = winpr_InitSecurityInterfaceA();
217const char* GetSecurityStatusString(SECURITY_STATUS status)
224 case SEC_E_INSUFFICIENT_MEMORY:
225 return "SEC_E_INSUFFICIENT_MEMORY";
227 case SEC_E_INVALID_HANDLE:
228 return "SEC_E_INVALID_HANDLE";
230 case SEC_E_UNSUPPORTED_FUNCTION:
231 return "SEC_E_UNSUPPORTED_FUNCTION";
233 case SEC_E_TARGET_UNKNOWN:
234 return "SEC_E_TARGET_UNKNOWN";
236 case SEC_E_INTERNAL_ERROR:
237 return "SEC_E_INTERNAL_ERROR";
239 case SEC_E_SECPKG_NOT_FOUND:
240 return "SEC_E_SECPKG_NOT_FOUND";
242 case SEC_E_NOT_OWNER:
243 return "SEC_E_NOT_OWNER";
245 case SEC_E_CANNOT_INSTALL:
246 return "SEC_E_CANNOT_INSTALL";
248 case SEC_E_INVALID_TOKEN:
249 return "SEC_E_INVALID_TOKEN";
251 case SEC_E_CANNOT_PACK:
252 return "SEC_E_CANNOT_PACK";
254 case SEC_E_QOP_NOT_SUPPORTED:
255 return "SEC_E_QOP_NOT_SUPPORTED";
257 case SEC_E_NO_IMPERSONATION:
258 return "SEC_E_NO_IMPERSONATION";
260 case SEC_E_LOGON_DENIED:
261 return "SEC_E_LOGON_DENIED";
263 case SEC_E_UNKNOWN_CREDENTIALS:
264 return "SEC_E_UNKNOWN_CREDENTIALS";
266 case SEC_E_NO_CREDENTIALS:
267 return "SEC_E_NO_CREDENTIALS";
269 case SEC_E_MESSAGE_ALTERED:
270 return "SEC_E_MESSAGE_ALTERED";
272 case SEC_E_OUT_OF_SEQUENCE:
273 return "SEC_E_OUT_OF_SEQUENCE";
275 case SEC_E_NO_AUTHENTICATING_AUTHORITY:
276 return "SEC_E_NO_AUTHENTICATING_AUTHORITY";
278 case SEC_E_BAD_PKGID:
279 return "SEC_E_BAD_PKGID";
281 case SEC_E_CONTEXT_EXPIRED:
282 return "SEC_E_CONTEXT_EXPIRED";
284 case SEC_E_INCOMPLETE_MESSAGE:
285 return "SEC_E_INCOMPLETE_MESSAGE";
287 case SEC_E_INCOMPLETE_CREDENTIALS:
288 return "SEC_E_INCOMPLETE_CREDENTIALS";
290 case SEC_E_BUFFER_TOO_SMALL:
291 return "SEC_E_BUFFER_TOO_SMALL";
293 case SEC_E_WRONG_PRINCIPAL:
294 return "SEC_E_WRONG_PRINCIPAL";
296 case SEC_E_TIME_SKEW:
297 return "SEC_E_TIME_SKEW";
299 case SEC_E_UNTRUSTED_ROOT:
300 return "SEC_E_UNTRUSTED_ROOT";
302 case SEC_E_ILLEGAL_MESSAGE:
303 return "SEC_E_ILLEGAL_MESSAGE";
305 case SEC_E_CERT_UNKNOWN:
306 return "SEC_E_CERT_UNKNOWN";
308 case SEC_E_CERT_EXPIRED:
309 return "SEC_E_CERT_EXPIRED";
311 case SEC_E_ENCRYPT_FAILURE:
312 return "SEC_E_ENCRYPT_FAILURE";
314 case SEC_E_DECRYPT_FAILURE:
315 return "SEC_E_DECRYPT_FAILURE";
317 case SEC_E_ALGORITHM_MISMATCH:
318 return "SEC_E_ALGORITHM_MISMATCH";
320 case SEC_E_SECURITY_QOS_FAILED:
321 return "SEC_E_SECURITY_QOS_FAILED";
323 case SEC_E_UNFINISHED_CONTEXT_DELETED:
324 return "SEC_E_UNFINISHED_CONTEXT_DELETED";
326 case SEC_E_NO_TGT_REPLY:
327 return "SEC_E_NO_TGT_REPLY";
329 case SEC_E_NO_IP_ADDRESSES:
330 return "SEC_E_NO_IP_ADDRESSES";
332 case SEC_E_WRONG_CREDENTIAL_HANDLE:
333 return "SEC_E_WRONG_CREDENTIAL_HANDLE";
335 case SEC_E_CRYPTO_SYSTEM_INVALID:
336 return "SEC_E_CRYPTO_SYSTEM_INVALID";
338 case SEC_E_MAX_REFERRALS_EXCEEDED:
339 return "SEC_E_MAX_REFERRALS_EXCEEDED";
341 case SEC_E_MUST_BE_KDC:
342 return "SEC_E_MUST_BE_KDC";
344 case SEC_E_STRONG_CRYPTO_NOT_SUPPORTED:
345 return "SEC_E_STRONG_CRYPTO_NOT_SUPPORTED";
347 case SEC_E_TOO_MANY_PRINCIPALS:
348 return "SEC_E_TOO_MANY_PRINCIPALS";
350 case SEC_E_NO_PA_DATA:
351 return "SEC_E_NO_PA_DATA";
353 case SEC_E_PKINIT_NAME_MISMATCH:
354 return "SEC_E_PKINIT_NAME_MISMATCH";
356 case SEC_E_SMARTCARD_LOGON_REQUIRED:
357 return "SEC_E_SMARTCARD_LOGON_REQUIRED";
359 case SEC_E_SHUTDOWN_IN_PROGRESS:
360 return "SEC_E_SHUTDOWN_IN_PROGRESS";
362 case SEC_E_KDC_INVALID_REQUEST:
363 return "SEC_E_KDC_INVALID_REQUEST";
365 case SEC_E_KDC_UNABLE_TO_REFER:
366 return "SEC_E_KDC_UNABLE_TO_REFER";
368 case SEC_E_KDC_UNKNOWN_ETYPE:
369 return "SEC_E_KDC_UNKNOWN_ETYPE";
371 case SEC_E_UNSUPPORTED_PREAUTH:
372 return "SEC_E_UNSUPPORTED_PREAUTH";
374 case SEC_E_DELEGATION_REQUIRED:
375 return "SEC_E_DELEGATION_REQUIRED";
377 case SEC_E_BAD_BINDINGS:
378 return "SEC_E_BAD_BINDINGS";
380 case SEC_E_MULTIPLE_ACCOUNTS:
381 return "SEC_E_MULTIPLE_ACCOUNTS";
383 case SEC_E_NO_KERB_KEY:
384 return "SEC_E_NO_KERB_KEY";
386 case SEC_E_CERT_WRONG_USAGE:
387 return "SEC_E_CERT_WRONG_USAGE";
389 case SEC_E_DOWNGRADE_DETECTED:
390 return "SEC_E_DOWNGRADE_DETECTED";
392 case SEC_E_SMARTCARD_CERT_REVOKED:
393 return "SEC_E_SMARTCARD_CERT_REVOKED";
395 case SEC_E_ISSUING_CA_UNTRUSTED:
396 return "SEC_E_ISSUING_CA_UNTRUSTED";
398 case SEC_E_REVOCATION_OFFLINE_C:
399 return "SEC_E_REVOCATION_OFFLINE_C";
401 case SEC_E_PKINIT_CLIENT_FAILURE:
402 return "SEC_E_PKINIT_CLIENT_FAILURE";
404 case SEC_E_SMARTCARD_CERT_EXPIRED:
405 return "SEC_E_SMARTCARD_CERT_EXPIRED";
407 case SEC_E_NO_S4U_PROT_SUPPORT:
408 return "SEC_E_NO_S4U_PROT_SUPPORT";
410 case SEC_E_CROSSREALM_DELEGATION_FAILURE:
411 return "SEC_E_CROSSREALM_DELEGATION_FAILURE";
413 case SEC_E_REVOCATION_OFFLINE_KDC:
414 return "SEC_E_REVOCATION_OFFLINE_KDC";
416 case SEC_E_ISSUING_CA_UNTRUSTED_KDC:
417 return "SEC_E_ISSUING_CA_UNTRUSTED_KDC";
419 case SEC_E_KDC_CERT_EXPIRED:
420 return "SEC_E_KDC_CERT_EXPIRED";
422 case SEC_E_KDC_CERT_REVOKED:
423 return "SEC_E_KDC_CERT_REVOKED";
425 case SEC_E_INVALID_PARAMETER:
426 return "SEC_E_INVALID_PARAMETER";
428 case SEC_E_DELEGATION_POLICY:
429 return "SEC_E_DELEGATION_POLICY";
431 case SEC_E_POLICY_NLTM_ONLY:
432 return "SEC_E_POLICY_NLTM_ONLY";
434 case SEC_E_NO_CONTEXT:
435 return "SEC_E_NO_CONTEXT";
437 case SEC_E_PKU2U_CERT_FAILURE:
438 return "SEC_E_PKU2U_CERT_FAILURE";
440 case SEC_E_MUTUAL_AUTH_FAILED:
441 return "SEC_E_MUTUAL_AUTH_FAILED";
443 case SEC_I_CONTINUE_NEEDED:
444 return "SEC_I_CONTINUE_NEEDED";
446 case SEC_I_COMPLETE_NEEDED:
447 return "SEC_I_COMPLETE_NEEDED";
449 case SEC_I_COMPLETE_AND_CONTINUE:
450 return "SEC_I_COMPLETE_AND_CONTINUE";
452 case SEC_I_LOCAL_LOGON:
453 return "SEC_I_LOCAL_LOGON";
455 case SEC_I_CONTEXT_EXPIRED:
456 return "SEC_I_CONTEXT_EXPIRED";
458 case SEC_I_INCOMPLETE_CREDENTIALS:
459 return "SEC_I_INCOMPLETE_CREDENTIALS";
461 case SEC_I_RENEGOTIATE:
462 return "SEC_I_RENEGOTIATE";
464 case SEC_I_NO_LSA_CONTEXT:
465 return "SEC_I_NO_LSA_CONTEXT";
467 case SEC_I_SIGNATURE_NEEDED:
468 return "SEC_I_SIGNATURE_NEEDED";
470 case SEC_I_NO_RENEGOTIATION:
471 return "SEC_I_NO_RENEGOTIATION";
476 return NtStatus2Tag(status);
479BOOL IsSecurityStatusError(SECURITY_STATUS status)
486 case SEC_I_CONTINUE_NEEDED:
487 case SEC_I_COMPLETE_NEEDED:
488 case SEC_I_COMPLETE_AND_CONTINUE:
489 case SEC_I_LOCAL_LOGON:
490 case SEC_I_CONTEXT_EXPIRED:
491 case SEC_I_INCOMPLETE_CREDENTIALS:
492 case SEC_I_RENEGOTIATE:
493 case SEC_I_NO_LSA_CONTEXT:
494 case SEC_I_SIGNATURE_NEEDED:
495 case SEC_I_NO_RENEGOTIATION:
507 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, &flags,
nullptr))
509 WLog_Print(g_Log, WLOG_DEBUG,
"InitSecurityInterfaceExW");
515 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, &flags,
nullptr))
517 WLog_Print(g_Log, WLOG_DEBUG,
"InitSecurityInterfaceExA");
525static SECURITY_STATUS sspi_init(
void)
527 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt,
nullptr,
nullptr))
528 return SEC_E_INTERNAL_ERROR;
530 if (!g_SspiA || !g_SspiW)
532 WLog_Print(g_Log, WLOG_WARN,
"Security module does not provide an implementation");
534 return SEC_E_UNSUPPORTED_FUNCTION;
540SECURITY_STATUS SEC_ENTRY sspi_EnumerateSecurityPackagesW(ULONG* pcPackages,
543 SECURITY_STATUS status = sspi_init();
544 if (status != SEC_E_OK)
547 status = g_SspiW->EnumerateSecurityPackagesW(pcPackages, ppPackageInfo);
548 WLog_Print(g_Log, WLOG_DEBUG,
"EnumerateSecurityPackagesW: %s (0x%08" PRIX32
")",
549 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
553SECURITY_STATUS SEC_ENTRY sspi_EnumerateSecurityPackagesA(ULONG* pcPackages,
556 SECURITY_STATUS status = sspi_init();
557 if (status != SEC_E_OK)
559 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiA->EnumerateSecurityPackagesA,
560 pcPackages, ppPackageInfo);
561 WLog_Print(g_Log, WLOG_DEBUG,
"EnumerateSecurityPackagesA: %s (0x%08" PRIX32
")",
562 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
568 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt,
nullptr,
nullptr))
570 WLog_Print(g_Log, WLOG_DEBUG,
"InitSecurityInterfaceW");
576 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt,
nullptr,
nullptr))
578 WLog_Print(g_Log, WLOG_DEBUG,
"InitSecurityInterfaceA");
582SECURITY_STATUS SEC_ENTRY sspi_QuerySecurityPackageInfoW(SEC_WCHAR* pszPackageName,
585 SECURITY_STATUS status = sspi_init();
586 if (status != SEC_E_OK)
588 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->QuerySecurityPackageInfoW,
589 pszPackageName, ppPackageInfo);
590 WLog_Print(g_Log, WLOG_DEBUG,
"QuerySecurityPackageInfoW: %s (0x%08" PRIX32
")",
591 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
595SECURITY_STATUS SEC_ENTRY sspi_QuerySecurityPackageInfoA(SEC_CHAR* pszPackageName,
598 SECURITY_STATUS status = sspi_init();
599 if (status != SEC_E_OK)
601 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiA->QuerySecurityPackageInfoA,
602 pszPackageName, ppPackageInfo);
603 WLog_Print(g_Log, WLOG_DEBUG,
"QuerySecurityPackageInfoA: %s (0x%08" PRIX32
")",
604 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
610SECURITY_STATUS SEC_ENTRY sspi_AcquireCredentialsHandleW(
611 SEC_WCHAR* pszPrincipal, SEC_WCHAR* pszPackage, ULONG fCredentialUse,
void* pvLogonID,
612 void* pAuthData, SEC_GET_KEY_FN pGetKeyFn,
void* pvGetKeyArgument,
PCredHandle phCredential,
615 SECURITY_STATUS status = sspi_init();
616 if (status != SEC_E_OK)
618 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->AcquireCredentialsHandleW,
619 pszPrincipal, pszPackage, fCredentialUse, pvLogonID, pAuthData, pGetKeyFn,
620 pvGetKeyArgument, phCredential, ptsExpiry);
621 WLog_Print(g_Log, WLOG_DEBUG,
"AcquireCredentialsHandleW: %s (0x%08" PRIX32
")",
622 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
626SECURITY_STATUS SEC_ENTRY sspi_AcquireCredentialsHandleA(
627 SEC_CHAR* pszPrincipal, SEC_CHAR* pszPackage, ULONG fCredentialUse,
void* pvLogonID,
628 void* pAuthData, SEC_GET_KEY_FN pGetKeyFn,
void* pvGetKeyArgument,
PCredHandle phCredential,
631 SECURITY_STATUS status = sspi_init();
632 if (status != SEC_E_OK)
634 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiA->AcquireCredentialsHandleA,
635 pszPrincipal, pszPackage, fCredentialUse, pvLogonID, pAuthData, pGetKeyFn,
636 pvGetKeyArgument, phCredential, ptsExpiry);
637 WLog_Print(g_Log, WLOG_DEBUG,
"AcquireCredentialsHandleA: %s (0x%08" PRIX32
")",
638 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
642SECURITY_STATUS SEC_ENTRY sspi_ExportSecurityContext(
PCtxtHandle phContext, ULONG fFlags,
645 SECURITY_STATUS status = sspi_init();
646 if (status != SEC_E_OK)
648 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->ExportSecurityContext, phContext,
649 fFlags, pPackedContext, pToken);
650 WLog_Print(g_Log, WLOG_DEBUG,
"ExportSecurityContext: %s (0x%08" PRIX32
")",
651 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
655SECURITY_STATUS SEC_ENTRY sspi_FreeCredentialsHandle(
PCredHandle phCredential)
657 SECURITY_STATUS status = sspi_init();
658 if (status != SEC_E_OK)
660 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->FreeCredentialsHandle, phCredential);
661 WLog_Print(g_Log, WLOG_DEBUG,
"FreeCredentialsHandle: %s (0x%08" PRIX32
")",
662 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
666SECURITY_STATUS SEC_ENTRY sspi_ImportSecurityContextW(SEC_WCHAR* pszPackage,
670 SECURITY_STATUS status = sspi_init();
671 if (status != SEC_E_OK)
673 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->ImportSecurityContextW, pszPackage,
674 pPackedContext, pToken, phContext);
675 WLog_Print(g_Log, WLOG_DEBUG,
"ImportSecurityContextW: %s (0x%08" PRIX32
")",
676 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
680SECURITY_STATUS SEC_ENTRY sspi_ImportSecurityContextA(SEC_CHAR* pszPackage,
684 SECURITY_STATUS status = sspi_init();
685 if (status != SEC_E_OK)
687 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiA->ImportSecurityContextA, pszPackage,
688 pPackedContext, pToken, phContext);
689 WLog_Print(g_Log, WLOG_DEBUG,
"ImportSecurityContextA: %s (0x%08" PRIX32
")",
690 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
694SECURITY_STATUS SEC_ENTRY sspi_QueryCredentialsAttributesW(
PCredHandle phCredential,
695 ULONG ulAttribute,
void* pBuffer)
697 SECURITY_STATUS status = sspi_init();
698 if (status != SEC_E_OK)
700 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->QueryCredentialsAttributesW,
701 phCredential, ulAttribute, pBuffer);
702 WLog_Print(g_Log, WLOG_DEBUG,
"QueryCredentialsAttributesW: %s (0x%08" PRIX32
")",
703 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
707SECURITY_STATUS SEC_ENTRY sspi_QueryCredentialsAttributesA(
PCredHandle phCredential,
708 ULONG ulAttribute,
void* pBuffer)
710 SECURITY_STATUS status = sspi_init();
711 if (status != SEC_E_OK)
713 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiA->QueryCredentialsAttributesA,
714 phCredential, ulAttribute, pBuffer);
715 WLog_Print(g_Log, WLOG_DEBUG,
"QueryCredentialsAttributesA: %s (0x%08" PRIX32
")",
716 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
722SECURITY_STATUS SEC_ENTRY sspi_AcceptSecurityContext(
PCredHandle phCredential,
724 ULONG fContextReq, ULONG TargetDataRep,
729 SECURITY_STATUS status = sspi_init();
730 if (status != SEC_E_OK)
732 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->AcceptSecurityContext, phCredential,
733 phContext, pInput, fContextReq, TargetDataRep, phNewContext, pOutput,
734 pfContextAttr, ptsTimeStamp);
735 WLog_Print(g_Log, WLOG_DEBUG,
"AcceptSecurityContext: %s (0x%08" PRIX32
")",
736 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
742 SECURITY_STATUS status = sspi_init();
743 if (status != SEC_E_OK)
746 IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->ApplyControlToken, phContext, pInput);
747 WLog_Print(g_Log, WLOG_DEBUG,
"ApplyControlToken: %s (0x%08" PRIX32
")",
748 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
754 SECURITY_STATUS status = sspi_init();
755 if (status != SEC_E_OK)
758 IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->CompleteAuthToken, phContext, pToken);
759 WLog_Print(g_Log, WLOG_DEBUG,
"CompleteAuthToken: %s (0x%08" PRIX32
")",
760 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
764SECURITY_STATUS SEC_ENTRY sspi_DeleteSecurityContext(
PCtxtHandle phContext)
766 SECURITY_STATUS status = sspi_init();
767 if (status != SEC_E_OK)
769 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->DeleteSecurityContext, phContext);
770 WLog_Print(g_Log, WLOG_DEBUG,
"DeleteSecurityContext: %s (0x%08" PRIX32
")",
771 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
775SECURITY_STATUS SEC_ENTRY sspi_FreeContextBuffer(
void* pvContextBuffer)
777 SECURITY_STATUS status = sspi_init();
778 if (status != SEC_E_OK)
780 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->FreeContextBuffer, pvContextBuffer);
781 WLog_Print(g_Log, WLOG_DEBUG,
"FreeContextBuffer: %s (0x%08" PRIX32
")",
782 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
786SECURITY_STATUS SEC_ENTRY sspi_ImpersonateSecurityContext(
PCtxtHandle phContext)
788 SECURITY_STATUS status = sspi_init();
789 if (status != SEC_E_OK)
792 IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->ImpersonateSecurityContext, phContext);
793 WLog_Print(g_Log, WLOG_DEBUG,
"ImpersonateSecurityContext: %s (0x%08" PRIX32
")",
794 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
798SECURITY_STATUS SEC_ENTRY sspi_InitializeSecurityContextW(
800 ULONG Reserved1, ULONG TargetDataRep,
PSecBufferDesc pInput, ULONG Reserved2,
803 SECURITY_STATUS status = sspi_init();
804 if (status != SEC_E_OK)
807 IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->InitializeSecurityContextW, phCredential,
808 phContext, pszTargetName, fContextReq, Reserved1, TargetDataRep, pInput,
809 Reserved2, phNewContext, pOutput, pfContextAttr, ptsExpiry);
810 WLog_Print(g_Log, WLOG_DEBUG,
"InitializeSecurityContextW: %s (0x%08" PRIX32
")",
811 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
815SECURITY_STATUS SEC_ENTRY sspi_InitializeSecurityContextA(
817 ULONG Reserved1, ULONG TargetDataRep,
PSecBufferDesc pInput, ULONG Reserved2,
820 SECURITY_STATUS status = sspi_init();
821 if (status != SEC_E_OK)
824 IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiA->InitializeSecurityContextA, phCredential,
825 phContext, pszTargetName, fContextReq, Reserved1, TargetDataRep, pInput,
826 Reserved2, phNewContext, pOutput, pfContextAttr, ptsExpiry);
827 WLog_Print(g_Log, WLOG_DEBUG,
"InitializeSecurityContextA: %s (0x%08" PRIX32
")",
828 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
832SECURITY_STATUS SEC_ENTRY sspi_QueryContextAttributesW(
PCtxtHandle phContext, ULONG ulAttribute,
835 SECURITY_STATUS status = sspi_init();
836 if (status != SEC_E_OK)
838 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->QueryContextAttributesW, phContext,
839 ulAttribute, pBuffer);
840 WLog_Print(g_Log, WLOG_DEBUG,
"QueryContextAttributesW: %s (0x%08" PRIX32
")",
841 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
845SECURITY_STATUS SEC_ENTRY sspi_QueryContextAttributesA(
PCtxtHandle phContext, ULONG ulAttribute,
848 SECURITY_STATUS status = sspi_init();
849 if (status != SEC_E_OK)
851 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiA->QueryContextAttributesA, phContext,
852 ulAttribute, pBuffer);
853 WLog_Print(g_Log, WLOG_DEBUG,
"QueryContextAttributesA: %s (0x%08" PRIX32
")",
854 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
858SECURITY_STATUS SEC_ENTRY sspi_QuerySecurityContextToken(
PCtxtHandle phContext, HANDLE* phToken)
860 SECURITY_STATUS status = sspi_init();
861 if (status != SEC_E_OK)
863 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->QuerySecurityContextToken, phContext,
865 WLog_Print(g_Log, WLOG_DEBUG,
"QuerySecurityContextToken: %s (0x%08" PRIX32
")",
866 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
870SECURITY_STATUS SEC_ENTRY sspi_SetContextAttributesW(
PCtxtHandle phContext, ULONG ulAttribute,
871 void* pBuffer, ULONG cbBuffer)
873 SECURITY_STATUS status = sspi_init();
874 if (status != SEC_E_OK)
876 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->SetContextAttributesW, phContext,
877 ulAttribute, pBuffer, cbBuffer);
878 WLog_Print(g_Log, WLOG_DEBUG,
"SetContextAttributesW: %s (0x%08" PRIX32
")",
879 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
883SECURITY_STATUS SEC_ENTRY sspi_SetContextAttributesA(
PCtxtHandle phContext, ULONG ulAttribute,
884 void* pBuffer, ULONG cbBuffer)
886 SECURITY_STATUS status = sspi_init();
887 if (status != SEC_E_OK)
889 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiA->SetContextAttributesA, phContext,
890 ulAttribute, pBuffer, cbBuffer);
891 WLog_Print(g_Log, WLOG_DEBUG,
"SetContextAttributesA: %s (0x%08" PRIX32
")",
892 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
896SECURITY_STATUS SEC_ENTRY sspi_RevertSecurityContext(
PCtxtHandle phContext)
898 SECURITY_STATUS status = sspi_init();
899 if (status != SEC_E_OK)
901 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->RevertSecurityContext, phContext);
902 WLog_Print(g_Log, WLOG_DEBUG,
"RevertSecurityContext: %s (0x%08" PRIX32
")",
903 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
910 ULONG MessageSeqNo, PULONG pfQOP)
912 SECURITY_STATUS status = sspi_init();
913 if (status != SEC_E_OK)
915 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->DecryptMessage, phContext, pMessage,
916 MessageSeqNo, pfQOP);
917 WLog_Print(g_Log, WLOG_DEBUG,
"DecryptMessage: %s (0x%08" PRIX32
")",
918 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
922SECURITY_STATUS SEC_ENTRY sspi_EncryptMessage(
PCtxtHandle phContext, ULONG fQOP,
925 SECURITY_STATUS status = sspi_init();
926 if (status != SEC_E_OK)
928 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->EncryptMessage, phContext, fQOP,
929 pMessage, MessageSeqNo);
930 WLog_Print(g_Log, WLOG_DEBUG,
"EncryptMessage: %s (0x%08" PRIX32
")",
931 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
935SECURITY_STATUS SEC_ENTRY sspi_MakeSignature(
PCtxtHandle phContext, ULONG fQOP,
938 SECURITY_STATUS status = sspi_init();
939 if (status != SEC_E_OK)
941 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->MakeSignature, phContext, fQOP,
942 pMessage, MessageSeqNo);
943 WLog_Print(g_Log, WLOG_DEBUG,
"MakeSignature: %s (0x%08" PRIX32
")",
944 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
949 ULONG MessageSeqNo, PULONG pfQOP)
951 SECURITY_STATUS status = sspi_init();
952 if (status != SEC_E_OK)
954 status = IFCALLRESULT(SEC_E_UNSUPPORTED_FUNCTION, g_SspiW->VerifySignature, phContext, pMessage,
955 MessageSeqNo, pfQOP);
956 WLog_Print(g_Log, WLOG_DEBUG,
"VerifySignature: %s (0x%08" PRIX32
")",
957 GetSecurityStatusString(status), WINPR_CXX_COMPAT_CAST(UINT32, status));
963static void zfree(WCHAR* str,
size_t len, BOOL isWCHAR)
966 memset(str, 0, len * (isWCHAR ?
sizeof(WCHAR) : sizeof(char)));
970void sspi_FreeAuthIdentity(SEC_WINNT_AUTH_IDENTITY* identity)
975 const BOOL wc = (identity->Flags & SEC_WINNT_AUTH_IDENTITY_UNICODE) != 0;
976 zfree(identity->User, identity->UserLength, wc);
977 zfree(identity->Domain, identity->DomainLength, wc);
983 size_t len = identity->PasswordLength;
984 if (len > SSPI_CREDENTIALS_HASH_LENGTH_OFFSET)
985 len -= SSPI_CREDENTIALS_HASH_LENGTH_OFFSET;
986 zfree(identity->Password, len, wc);
988 const SEC_WINNT_AUTH_IDENTITY empty = WINPR_C_ARRAY_INIT;