Blame winpr/libwinpr/sspi/sspi.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * Security Support Provider Interface (SSPI)
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012-2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#define _NO_KSECDD_IMPORT_	1
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/sspi.h>
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/synch.h>
Packit 1fb8d4
#include <winpr/wlog.h>
Packit 1fb8d4
#include <winpr/library.h>
Packit 1fb8d4
#include <winpr/environment.h>
Packit 1fb8d4
Packit 1fb8d4
#include "sspi.h"
Packit 1fb8d4
Packit 1fb8d4
static wLog* g_Log = NULL;
Packit 1fb8d4
Packit 1fb8d4
static INIT_ONCE g_Initialized = INIT_ONCE_STATIC_INIT;
Packit 1fb8d4
#if defined(WITH_NATIVE_SSPI)
Packit 1fb8d4
static HMODULE g_SspiModule = NULL;
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
static SecurityFunctionTableW* g_SspiW = NULL;
Packit 1fb8d4
static SecurityFunctionTableA* g_SspiA = NULL;
Packit 1fb8d4
Packit 1fb8d4
#if defined(WITH_NATIVE_SSPI)
Packit 1fb8d4
static BOOL ShouldUseNativeSspi(void);
Packit 1fb8d4
static BOOL InitializeSspiModule_Native(void);
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#if defined(WITH_NATIVE_SSPI)
Packit 1fb8d4
BOOL ShouldUseNativeSspi(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL status = FALSE;
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
	LPCSTR sspi = "WINPR_NATIVE_SSPI";
Packit 1fb8d4
	DWORD nSize;
Packit 1fb8d4
	char* env = NULL;
Packit 1fb8d4
	nSize = GetEnvironmentVariableA(sspi, NULL, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (!nSize)
Packit 1fb8d4
		return TRUE;
Packit 1fb8d4
Packit 1fb8d4
	env = (LPSTR) malloc(nSize);
Packit 1fb8d4
Packit 1fb8d4
	if (!env)
Packit 1fb8d4
		return TRUE;
Packit 1fb8d4
Packit 1fb8d4
	if (GetEnvironmentVariableA(sspi, env, nSize) != nSize - 1)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(env);
Packit 1fb8d4
		return TRUE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (strcmp(env, "0") == 0)
Packit 1fb8d4
		status = FALSE;
Packit 1fb8d4
	else
Packit 1fb8d4
		status = TRUE;
Packit 1fb8d4
Packit 1fb8d4
	free(env);
Packit 1fb8d4
#endif
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#if defined(WITH_NATIVE_SSPI)
Packit 1fb8d4
BOOL InitializeSspiModule_Native(void)
Packit 1fb8d4
{
Packit 1fb8d4
	INIT_SECURITY_INTERFACE_W pInitSecurityInterfaceW;
Packit 1fb8d4
	INIT_SECURITY_INTERFACE_A pInitSecurityInterfaceA;
Packit 1fb8d4
	g_SspiModule = LoadLibraryA("secur32.dll");
Packit 1fb8d4
Packit 1fb8d4
	if (!g_SspiModule)
Packit 1fb8d4
		g_SspiModule = LoadLibraryA("security.dll");
Packit 1fb8d4
Packit 1fb8d4
	if (!g_SspiModule)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	pInitSecurityInterfaceW = (INIT_SECURITY_INTERFACE_W) GetProcAddress(g_SspiModule,
Packit 1fb8d4
	                          "InitSecurityInterfaceW");
Packit 1fb8d4
	pInitSecurityInterfaceA = (INIT_SECURITY_INTERFACE_A) GetProcAddress(g_SspiModule,
Packit 1fb8d4
	                          "InitSecurityInterfaceA");
Packit 1fb8d4
Packit 1fb8d4
	if (pInitSecurityInterfaceW)
Packit 1fb8d4
		g_SspiW = pInitSecurityInterfaceW();
Packit 1fb8d4
Packit 1fb8d4
	if (pInitSecurityInterfaceA)
Packit 1fb8d4
		g_SspiA = pInitSecurityInterfaceA();
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
static BOOL CALLBACK InitializeSspiModuleInt(PINIT_ONCE once, PVOID param, PVOID* context)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL status = FALSE;
Packit 1fb8d4
#if defined(WITH_NATIVE_SSPI)
Packit 1fb8d4
	DWORD flags = 0;
Packit 1fb8d4
Packit 1fb8d4
	if (param)
Packit 1fb8d4
		flags = *(DWORD*)param;
Packit 1fb8d4
Packit 1fb8d4
#endif
Packit 1fb8d4
	sspi_GlobalInit();
Packit 1fb8d4
	g_Log = WLog_Get("com.winpr.sspi");
Packit 1fb8d4
#if defined(WITH_NATIVE_SSPI)
Packit 1fb8d4
Packit 1fb8d4
	if (flags && (flags & SSPI_INTERFACE_NATIVE))
Packit 1fb8d4
	{
Packit 1fb8d4
		status = InitializeSspiModule_Native();
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (flags && (flags & SSPI_INTERFACE_WINPR))
Packit 1fb8d4
	{
Packit 1fb8d4
		g_SspiW = winpr_InitSecurityInterfaceW();
Packit 1fb8d4
		g_SspiA = winpr_InitSecurityInterfaceA();
Packit 1fb8d4
		status = TRUE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (!status && ShouldUseNativeSspi())
Packit 1fb8d4
	{
Packit 1fb8d4
		status = InitializeSspiModule_Native();
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
	if (!status)
Packit 1fb8d4
	{
Packit 1fb8d4
		g_SspiW = winpr_InitSecurityInterfaceW();
Packit 1fb8d4
		g_SspiA = winpr_InitSecurityInterfaceA();
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
const char* GetSecurityStatusString(SECURITY_STATUS status)
Packit 1fb8d4
{
Packit 1fb8d4
	switch (status)
Packit 1fb8d4
	{
Packit 1fb8d4
		case SEC_E_OK:
Packit 1fb8d4
			return "SEC_E_OK";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_INSUFFICIENT_MEMORY:
Packit 1fb8d4
			return "SEC_E_INSUFFICIENT_MEMORY";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_INVALID_HANDLE:
Packit 1fb8d4
			return "SEC_E_INVALID_HANDLE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_UNSUPPORTED_FUNCTION:
Packit 1fb8d4
			return "SEC_E_UNSUPPORTED_FUNCTION";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_TARGET_UNKNOWN:
Packit 1fb8d4
			return "SEC_E_TARGET_UNKNOWN";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_INTERNAL_ERROR:
Packit 1fb8d4
			return "SEC_E_INTERNAL_ERROR";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_SECPKG_NOT_FOUND:
Packit 1fb8d4
			return "SEC_E_SECPKG_NOT_FOUND";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_NOT_OWNER:
Packit 1fb8d4
			return "SEC_E_NOT_OWNER";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_CANNOT_INSTALL:
Packit 1fb8d4
			return "SEC_E_CANNOT_INSTALL";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_INVALID_TOKEN:
Packit 1fb8d4
			return "SEC_E_INVALID_TOKEN";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_CANNOT_PACK:
Packit 1fb8d4
			return "SEC_E_CANNOT_PACK";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_QOP_NOT_SUPPORTED:
Packit 1fb8d4
			return "SEC_E_QOP_NOT_SUPPORTED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_NO_IMPERSONATION:
Packit 1fb8d4
			return "SEC_E_NO_IMPERSONATION";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_LOGON_DENIED:
Packit 1fb8d4
			return "SEC_E_LOGON_DENIED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_UNKNOWN_CREDENTIALS:
Packit 1fb8d4
			return "SEC_E_UNKNOWN_CREDENTIALS";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_NO_CREDENTIALS:
Packit 1fb8d4
			return "SEC_E_NO_CREDENTIALS";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_MESSAGE_ALTERED:
Packit 1fb8d4
			return "SEC_E_MESSAGE_ALTERED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_OUT_OF_SEQUENCE:
Packit 1fb8d4
			return "SEC_E_OUT_OF_SEQUENCE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_NO_AUTHENTICATING_AUTHORITY:
Packit 1fb8d4
			return "SEC_E_NO_AUTHENTICATING_AUTHORITY";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_BAD_PKGID:
Packit 1fb8d4
			return "SEC_E_BAD_PKGID";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_CONTEXT_EXPIRED:
Packit 1fb8d4
			return "SEC_E_CONTEXT_EXPIRED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_INCOMPLETE_MESSAGE:
Packit 1fb8d4
			return "SEC_E_INCOMPLETE_MESSAGE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_INCOMPLETE_CREDENTIALS:
Packit 1fb8d4
			return "SEC_E_INCOMPLETE_CREDENTIALS";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_BUFFER_TOO_SMALL:
Packit 1fb8d4
			return "SEC_E_BUFFER_TOO_SMALL";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_WRONG_PRINCIPAL:
Packit 1fb8d4
			return "SEC_E_WRONG_PRINCIPAL";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_TIME_SKEW:
Packit 1fb8d4
			return "SEC_E_TIME_SKEW";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_UNTRUSTED_ROOT:
Packit 1fb8d4
			return "SEC_E_UNTRUSTED_ROOT";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_ILLEGAL_MESSAGE:
Packit 1fb8d4
			return "SEC_E_ILLEGAL_MESSAGE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_CERT_UNKNOWN:
Packit 1fb8d4
			return "SEC_E_CERT_UNKNOWN";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_CERT_EXPIRED:
Packit 1fb8d4
			return "SEC_E_CERT_EXPIRED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_ENCRYPT_FAILURE:
Packit 1fb8d4
			return "SEC_E_ENCRYPT_FAILURE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_DECRYPT_FAILURE:
Packit 1fb8d4
			return "SEC_E_DECRYPT_FAILURE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_ALGORITHM_MISMATCH:
Packit 1fb8d4
			return "SEC_E_ALGORITHM_MISMATCH";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_SECURITY_QOS_FAILED:
Packit 1fb8d4
			return "SEC_E_SECURITY_QOS_FAILED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_UNFINISHED_CONTEXT_DELETED:
Packit 1fb8d4
			return "SEC_E_UNFINISHED_CONTEXT_DELETED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_NO_TGT_REPLY:
Packit 1fb8d4
			return "SEC_E_NO_TGT_REPLY";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_NO_IP_ADDRESSES:
Packit 1fb8d4
			return "SEC_E_NO_IP_ADDRESSES";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_WRONG_CREDENTIAL_HANDLE:
Packit 1fb8d4
			return "SEC_E_WRONG_CREDENTIAL_HANDLE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_CRYPTO_SYSTEM_INVALID:
Packit 1fb8d4
			return "SEC_E_CRYPTO_SYSTEM_INVALID";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_MAX_REFERRALS_EXCEEDED:
Packit 1fb8d4
			return "SEC_E_MAX_REFERRALS_EXCEEDED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_MUST_BE_KDC:
Packit 1fb8d4
			return "SEC_E_MUST_BE_KDC";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_STRONG_CRYPTO_NOT_SUPPORTED:
Packit 1fb8d4
			return "SEC_E_STRONG_CRYPTO_NOT_SUPPORTED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_TOO_MANY_PRINCIPALS:
Packit 1fb8d4
			return "SEC_E_TOO_MANY_PRINCIPALS";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_NO_PA_DATA:
Packit 1fb8d4
			return "SEC_E_NO_PA_DATA";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_PKINIT_NAME_MISMATCH:
Packit 1fb8d4
			return "SEC_E_PKINIT_NAME_MISMATCH";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_SMARTCARD_LOGON_REQUIRED:
Packit 1fb8d4
			return "SEC_E_SMARTCARD_LOGON_REQUIRED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_SHUTDOWN_IN_PROGRESS:
Packit 1fb8d4
			return "SEC_E_SHUTDOWN_IN_PROGRESS";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_KDC_INVALID_REQUEST:
Packit 1fb8d4
			return "SEC_E_KDC_INVALID_REQUEST";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_KDC_UNABLE_TO_REFER:
Packit 1fb8d4
			return "SEC_E_KDC_UNABLE_TO_REFER";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_KDC_UNKNOWN_ETYPE:
Packit 1fb8d4
			return "SEC_E_KDC_UNKNOWN_ETYPE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_UNSUPPORTED_PREAUTH:
Packit 1fb8d4
			return "SEC_E_UNSUPPORTED_PREAUTH";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_DELEGATION_REQUIRED:
Packit 1fb8d4
			return "SEC_E_DELEGATION_REQUIRED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_BAD_BINDINGS:
Packit 1fb8d4
			return "SEC_E_BAD_BINDINGS";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_MULTIPLE_ACCOUNTS:
Packit 1fb8d4
			return "SEC_E_MULTIPLE_ACCOUNTS";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_NO_KERB_KEY:
Packit 1fb8d4
			return "SEC_E_NO_KERB_KEY";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_CERT_WRONG_USAGE:
Packit 1fb8d4
			return "SEC_E_CERT_WRONG_USAGE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_DOWNGRADE_DETECTED:
Packit 1fb8d4
			return "SEC_E_DOWNGRADE_DETECTED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_SMARTCARD_CERT_REVOKED:
Packit 1fb8d4
			return "SEC_E_SMARTCARD_CERT_REVOKED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_ISSUING_CA_UNTRUSTED:
Packit 1fb8d4
			return "SEC_E_ISSUING_CA_UNTRUSTED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_REVOCATION_OFFLINE_C:
Packit 1fb8d4
			return "SEC_E_REVOCATION_OFFLINE_C";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_PKINIT_CLIENT_FAILURE:
Packit 1fb8d4
			return "SEC_E_PKINIT_CLIENT_FAILURE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_SMARTCARD_CERT_EXPIRED:
Packit 1fb8d4
			return "SEC_E_SMARTCARD_CERT_EXPIRED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_NO_S4U_PROT_SUPPORT:
Packit 1fb8d4
			return "SEC_E_NO_S4U_PROT_SUPPORT";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_CROSSREALM_DELEGATION_FAILURE:
Packit 1fb8d4
			return "SEC_E_CROSSREALM_DELEGATION_FAILURE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_REVOCATION_OFFLINE_KDC:
Packit 1fb8d4
			return "SEC_E_REVOCATION_OFFLINE_KDC";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_ISSUING_CA_UNTRUSTED_KDC:
Packit 1fb8d4
			return "SEC_E_ISSUING_CA_UNTRUSTED_KDC";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_KDC_CERT_EXPIRED:
Packit 1fb8d4
			return "SEC_E_KDC_CERT_EXPIRED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_KDC_CERT_REVOKED:
Packit 1fb8d4
			return "SEC_E_KDC_CERT_REVOKED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_INVALID_PARAMETER:
Packit 1fb8d4
			return "SEC_E_INVALID_PARAMETER";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_DELEGATION_POLICY:
Packit 1fb8d4
			return "SEC_E_DELEGATION_POLICY";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_POLICY_NLTM_ONLY:
Packit 1fb8d4
			return "SEC_E_POLICY_NLTM_ONLY";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_NO_CONTEXT:
Packit 1fb8d4
			return "SEC_E_NO_CONTEXT";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_PKU2U_CERT_FAILURE:
Packit 1fb8d4
			return "SEC_E_PKU2U_CERT_FAILURE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_E_MUTUAL_AUTH_FAILED:
Packit 1fb8d4
			return "SEC_E_MUTUAL_AUTH_FAILED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_I_CONTINUE_NEEDED:
Packit 1fb8d4
			return "SEC_I_CONTINUE_NEEDED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_I_COMPLETE_NEEDED:
Packit 1fb8d4
			return "SEC_I_COMPLETE_NEEDED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_I_COMPLETE_AND_CONTINUE:
Packit 1fb8d4
			return "SEC_I_COMPLETE_AND_CONTINUE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_I_LOCAL_LOGON:
Packit 1fb8d4
			return "SEC_I_LOCAL_LOGON";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_I_CONTEXT_EXPIRED:
Packit 1fb8d4
			return "SEC_I_CONTEXT_EXPIRED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_I_INCOMPLETE_CREDENTIALS:
Packit 1fb8d4
			return "SEC_I_INCOMPLETE_CREDENTIALS";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_I_RENEGOTIATE:
Packit 1fb8d4
			return "SEC_I_RENEGOTIATE";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_I_NO_LSA_CONTEXT:
Packit 1fb8d4
			return "SEC_I_NO_LSA_CONTEXT";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_I_SIGNATURE_NEEDED:
Packit 1fb8d4
			return "SEC_I_SIGNATURE_NEEDED";
Packit 1fb8d4
Packit 1fb8d4
		case SEC_I_NO_RENEGOTIATION:
Packit 1fb8d4
			return "SEC_I_NO_RENEGOTIATION";
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return "SEC_E_UNKNOWN";
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL IsSecurityStatusError(SECURITY_STATUS status)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL error = TRUE;
Packit 1fb8d4
Packit 1fb8d4
	switch (status)
Packit 1fb8d4
	{
Packit 1fb8d4
		case SEC_E_OK:
Packit 1fb8d4
		case SEC_I_CONTINUE_NEEDED:
Packit 1fb8d4
		case SEC_I_COMPLETE_NEEDED:
Packit 1fb8d4
		case SEC_I_COMPLETE_AND_CONTINUE:
Packit 1fb8d4
		case SEC_I_LOCAL_LOGON:
Packit 1fb8d4
		case SEC_I_CONTEXT_EXPIRED:
Packit 1fb8d4
		case SEC_I_INCOMPLETE_CREDENTIALS:
Packit 1fb8d4
		case SEC_I_RENEGOTIATE:
Packit 1fb8d4
		case SEC_I_NO_LSA_CONTEXT:
Packit 1fb8d4
		case SEC_I_SIGNATURE_NEEDED:
Packit 1fb8d4
		case SEC_I_NO_RENEGOTIATION:
Packit 1fb8d4
			error = FALSE;
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return error;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SecurityFunctionTableW* SEC_ENTRY InitSecurityInterfaceExW(DWORD flags)
Packit 1fb8d4
{
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, &flags, NULL);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "InitSecurityInterfaceExW");
Packit 1fb8d4
	return g_SspiW;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SecurityFunctionTableA* SEC_ENTRY InitSecurityInterfaceExA(DWORD flags)
Packit 1fb8d4
{
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, &flags, NULL);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "InitSecurityInterfaceExA");
Packit 1fb8d4
	return g_SspiA;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * Standard SSPI API
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
/* Package Management */
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_EnumerateSecurityPackagesW(ULONG* pcPackages,
Packit 1fb8d4
        PSecPkgInfoW* ppPackageInfo)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->EnumerateSecurityPackagesW))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->EnumerateSecurityPackagesW(pcPackages, ppPackageInfo);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "EnumerateSecurityPackagesW: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_EnumerateSecurityPackagesA(ULONG* pcPackages,
Packit 1fb8d4
        PSecPkgInfoA* ppPackageInfo)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiA && g_SspiA->EnumerateSecurityPackagesA))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiA->EnumerateSecurityPackagesA(pcPackages, ppPackageInfo);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "EnumerateSecurityPackagesA: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SecurityFunctionTableW* SEC_ENTRY sspi_InitSecurityInterfaceW(void)
Packit 1fb8d4
{
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "InitSecurityInterfaceW");
Packit 1fb8d4
	return g_SspiW;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SecurityFunctionTableA* SEC_ENTRY sspi_InitSecurityInterfaceA(void)
Packit 1fb8d4
{
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "InitSecurityInterfaceA");
Packit 1fb8d4
	return g_SspiA;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_QuerySecurityPackageInfoW(SEC_WCHAR* pszPackageName,
Packit 1fb8d4
        PSecPkgInfoW* ppPackageInfo)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->QuerySecurityPackageInfoW))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->QuerySecurityPackageInfoW(pszPackageName, ppPackageInfo);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "QuerySecurityPackageInfoW: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_QuerySecurityPackageInfoA(SEC_CHAR* pszPackageName,
Packit 1fb8d4
        PSecPkgInfoA* ppPackageInfo)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiA && g_SspiA->QuerySecurityPackageInfoA))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiA->QuerySecurityPackageInfoA(pszPackageName, ppPackageInfo);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "QuerySecurityPackageInfoA: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Credential Management */
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_AcquireCredentialsHandleW(SEC_WCHAR* pszPrincipal,
Packit 1fb8d4
        SEC_WCHAR* pszPackage,
Packit 1fb8d4
        ULONG fCredentialUse, void* pvLogonID, void* pAuthData, SEC_GET_KEY_FN pGetKeyFn,
Packit 1fb8d4
        void* pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->AcquireCredentialsHandleW))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->AcquireCredentialsHandleW(pszPrincipal, pszPackage, fCredentialUse,
Packit 1fb8d4
	         pvLogonID, pAuthData, pGetKeyFn, pvGetKeyArgument, phCredential, ptsExpiry);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "AcquireCredentialsHandleW: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_AcquireCredentialsHandleA(SEC_CHAR* pszPrincipal,
Packit 1fb8d4
        SEC_CHAR* pszPackage,
Packit 1fb8d4
        ULONG fCredentialUse, void* pvLogonID, void* pAuthData, SEC_GET_KEY_FN pGetKeyFn,
Packit 1fb8d4
        void* pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiA && g_SspiA->AcquireCredentialsHandleA))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiA->AcquireCredentialsHandleA(pszPrincipal, pszPackage, fCredentialUse,
Packit 1fb8d4
	         pvLogonID, pAuthData, pGetKeyFn, pvGetKeyArgument, phCredential, ptsExpiry);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "AcquireCredentialsHandleA: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_ExportSecurityContext(PCtxtHandle phContext, ULONG fFlags,
Packit 1fb8d4
        PSecBuffer pPackedContext, HANDLE* pToken)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->ExportSecurityContext))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->ExportSecurityContext(phContext, fFlags, pPackedContext, pToken);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "ExportSecurityContext: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_FreeCredentialsHandle(PCredHandle phCredential)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->FreeCredentialsHandle))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->FreeCredentialsHandle(phCredential);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "FreeCredentialsHandle: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_ImportSecurityContextW(SEC_WCHAR* pszPackage,
Packit 1fb8d4
        PSecBuffer pPackedContext, HANDLE pToken, PCtxtHandle phContext)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->ImportSecurityContextW))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->ImportSecurityContextW(pszPackage, pPackedContext, pToken, phContext);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "ImportSecurityContextW: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_ImportSecurityContextA(SEC_CHAR* pszPackage,
Packit 1fb8d4
        PSecBuffer pPackedContext, HANDLE pToken, PCtxtHandle phContext)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiA && g_SspiA->ImportSecurityContextA))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiA->ImportSecurityContextA(pszPackage, pPackedContext, pToken, phContext);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "ImportSecurityContextA: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_QueryCredentialsAttributesW(PCredHandle phCredential,
Packit 1fb8d4
        ULONG ulAttribute, void* pBuffer)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->QueryCredentialsAttributesW))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->QueryCredentialsAttributesW(phCredential, ulAttribute, pBuffer);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "QueryCredentialsAttributesW: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_QueryCredentialsAttributesA(PCredHandle phCredential,
Packit 1fb8d4
        ULONG ulAttribute, void* pBuffer)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiA && g_SspiA->QueryCredentialsAttributesA))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiA->QueryCredentialsAttributesA(phCredential, ulAttribute, pBuffer);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "QueryCredentialsAttributesA: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Context Management */
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_AcceptSecurityContext(PCredHandle phCredential,
Packit 1fb8d4
        PCtxtHandle phContext,
Packit 1fb8d4
        PSecBufferDesc pInput, ULONG fContextReq, ULONG TargetDataRep, PCtxtHandle phNewContext,
Packit 1fb8d4
        PSecBufferDesc pOutput, PULONG pfContextAttr, PTimeStamp ptsTimeStamp)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->AcceptSecurityContext))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->AcceptSecurityContext(phCredential, phContext, pInput, fContextReq,
Packit 1fb8d4
	                                        TargetDataRep, phNewContext, pOutput, pfContextAttr, ptsTimeStamp);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "AcceptSecurityContext: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_ApplyControlToken(PCtxtHandle phContext, PSecBufferDesc pInput)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->ApplyControlToken))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->ApplyControlToken(phContext, pInput);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "ApplyControlToken: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_CompleteAuthToken(PCtxtHandle phContext, PSecBufferDesc pToken)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->CompleteAuthToken))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->CompleteAuthToken(phContext, pToken);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "CompleteAuthToken: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_DeleteSecurityContext(PCtxtHandle phContext)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->DeleteSecurityContext))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->DeleteSecurityContext(phContext);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "DeleteSecurityContext: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_FreeContextBuffer(void* pvContextBuffer)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->FreeContextBuffer))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->FreeContextBuffer(pvContextBuffer);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "FreeContextBuffer: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_ImpersonateSecurityContext(PCtxtHandle phContext)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->ImpersonateSecurityContext))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->ImpersonateSecurityContext(phContext);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "ImpersonateSecurityContext: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_InitializeSecurityContextW(PCredHandle phCredential,
Packit 1fb8d4
        PCtxtHandle phContext,
Packit 1fb8d4
        SEC_WCHAR* pszTargetName, ULONG fContextReq, ULONG Reserved1, ULONG TargetDataRep,
Packit 1fb8d4
        PSecBufferDesc pInput, ULONG Reserved2, PCtxtHandle phNewContext,
Packit 1fb8d4
        PSecBufferDesc pOutput, PULONG pfContextAttr, PTimeStamp ptsExpiry)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->InitializeSecurityContextW))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->InitializeSecurityContextW(phCredential, phContext,
Packit 1fb8d4
	         pszTargetName, fContextReq, Reserved1, TargetDataRep, pInput,
Packit 1fb8d4
	         Reserved2, phNewContext, pOutput, pfContextAttr, ptsExpiry);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "InitializeSecurityContextW: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_InitializeSecurityContextA(PCredHandle phCredential,
Packit 1fb8d4
        PCtxtHandle phContext,
Packit 1fb8d4
        SEC_CHAR* pszTargetName, ULONG fContextReq, ULONG Reserved1, ULONG TargetDataRep,
Packit 1fb8d4
        PSecBufferDesc pInput, ULONG Reserved2, PCtxtHandle phNewContext,
Packit 1fb8d4
        PSecBufferDesc pOutput, PULONG pfContextAttr, PTimeStamp ptsExpiry)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiA && g_SspiA->InitializeSecurityContextA))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiA->InitializeSecurityContextA(phCredential, phContext,
Packit 1fb8d4
	         pszTargetName, fContextReq, Reserved1, TargetDataRep, pInput,
Packit 1fb8d4
	         Reserved2, phNewContext, pOutput, pfContextAttr, ptsExpiry);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "InitializeSecurityContextA: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_QueryContextAttributesW(PCtxtHandle phContext, ULONG ulAttribute,
Packit 1fb8d4
        void* pBuffer)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->QueryContextAttributesW))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->QueryContextAttributesW(phContext, ulAttribute, pBuffer);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "QueryContextAttributesW: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_QueryContextAttributesA(PCtxtHandle phContext, ULONG ulAttribute,
Packit 1fb8d4
        void* pBuffer)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiA && g_SspiA->QueryContextAttributesA))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiA->QueryContextAttributesA(phContext, ulAttribute, pBuffer);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "QueryContextAttributesA: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_QuerySecurityContextToken(PCtxtHandle phContext, HANDLE* phToken)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->QuerySecurityContextToken))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->QuerySecurityContextToken(phContext, phToken);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "QuerySecurityContextToken: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_SetContextAttributesW(PCtxtHandle phContext, ULONG ulAttribute,
Packit 1fb8d4
        void* pBuffer, ULONG cbBuffer)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->SetContextAttributesW))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->SetContextAttributesW(phContext, ulAttribute, pBuffer, cbBuffer);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "SetContextAttributesW: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_SetContextAttributesA(PCtxtHandle phContext, ULONG ulAttribute,
Packit 1fb8d4
        void* pBuffer, ULONG cbBuffer)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiA && g_SspiA->SetContextAttributesA))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiA->SetContextAttributesA(phContext, ulAttribute, pBuffer, cbBuffer);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "SetContextAttributesA: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_RevertSecurityContext(PCtxtHandle phContext)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->RevertSecurityContext))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->RevertSecurityContext(phContext);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "RevertSecurityContext: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Message Support */
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_DecryptMessage(PCtxtHandle phContext, PSecBufferDesc pMessage,
Packit 1fb8d4
        ULONG MessageSeqNo, PULONG pfQOP)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->DecryptMessage))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->DecryptMessage(phContext, pMessage, MessageSeqNo, pfQOP);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "DecryptMessage: %s (0x%08"PRIX32")", GetSecurityStatusString(status),
Packit 1fb8d4
	           status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_EncryptMessage(PCtxtHandle phContext, ULONG fQOP,
Packit 1fb8d4
        PSecBufferDesc pMessage, ULONG MessageSeqNo)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->EncryptMessage))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->EncryptMessage(phContext, fQOP, pMessage, MessageSeqNo);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "EncryptMessage: %s (0x%08"PRIX32")", GetSecurityStatusString(status),
Packit 1fb8d4
	           status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_MakeSignature(PCtxtHandle phContext, ULONG fQOP,
Packit 1fb8d4
        PSecBufferDesc pMessage, ULONG MessageSeqNo)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->MakeSignature))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->MakeSignature(phContext, fQOP, pMessage, MessageSeqNo);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "MakeSignature: %s (0x%08"PRIX32")", GetSecurityStatusString(status),
Packit 1fb8d4
	           status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS SEC_ENTRY sspi_VerifySignature(PCtxtHandle phContext, PSecBufferDesc pMessage,
Packit 1fb8d4
        ULONG MessageSeqNo, PULONG pfQOP)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSspiModuleInt, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!(g_SspiW && g_SspiW->VerifySignature))
Packit 1fb8d4
		return SEC_E_UNSUPPORTED_FUNCTION;
Packit 1fb8d4
Packit 1fb8d4
	status = g_SspiW->VerifySignature(phContext, pMessage, MessageSeqNo, pfQOP);
Packit 1fb8d4
	WLog_Print(g_Log, WLOG_DEBUG, "VerifySignature: %s (0x%08"PRIX32")",
Packit 1fb8d4
	           GetSecurityStatusString(status), status);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SecurityFunctionTableA sspi_SecurityFunctionTableA =
Packit 1fb8d4
{
Packit 1fb8d4
	1, /* dwVersion */
Packit 1fb8d4
	sspi_EnumerateSecurityPackagesA, /* EnumerateSecurityPackages */
Packit 1fb8d4
	sspi_QueryCredentialsAttributesA, /* QueryCredentialsAttributes */
Packit 1fb8d4
	sspi_AcquireCredentialsHandleA, /* AcquireCredentialsHandle */
Packit 1fb8d4
	sspi_FreeCredentialsHandle, /* FreeCredentialsHandle */
Packit 1fb8d4
	NULL, /* Reserved2 */
Packit 1fb8d4
	sspi_InitializeSecurityContextA, /* InitializeSecurityContext */
Packit 1fb8d4
	sspi_AcceptSecurityContext, /* AcceptSecurityContext */
Packit 1fb8d4
	sspi_CompleteAuthToken, /* CompleteAuthToken */
Packit 1fb8d4
	sspi_DeleteSecurityContext, /* DeleteSecurityContext */
Packit 1fb8d4
	sspi_ApplyControlToken, /* ApplyControlToken */
Packit 1fb8d4
	sspi_QueryContextAttributesA, /* QueryContextAttributes */
Packit 1fb8d4
	sspi_ImpersonateSecurityContext, /* ImpersonateSecurityContext */
Packit 1fb8d4
	sspi_RevertSecurityContext, /* RevertSecurityContext */
Packit 1fb8d4
	sspi_MakeSignature, /* MakeSignature */
Packit 1fb8d4
	sspi_VerifySignature, /* VerifySignature */
Packit 1fb8d4
	sspi_FreeContextBuffer, /* FreeContextBuffer */
Packit 1fb8d4
	sspi_QuerySecurityPackageInfoA, /* QuerySecurityPackageInfo */
Packit 1fb8d4
	NULL, /* Reserved3 */
Packit 1fb8d4
	NULL, /* Reserved4 */
Packit 1fb8d4
	sspi_ExportSecurityContext, /* ExportSecurityContext */
Packit 1fb8d4
	sspi_ImportSecurityContextA, /* ImportSecurityContext */
Packit 1fb8d4
	NULL, /* AddCredentials */
Packit 1fb8d4
	NULL, /* Reserved8 */
Packit 1fb8d4
	sspi_QuerySecurityContextToken, /* QuerySecurityContextToken */
Packit 1fb8d4
	sspi_EncryptMessage, /* EncryptMessage */
Packit 1fb8d4
	sspi_DecryptMessage, /* DecryptMessage */
Packit 1fb8d4
	sspi_SetContextAttributesA, /* SetContextAttributes */
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
SecurityFunctionTableW sspi_SecurityFunctionTableW =
Packit 1fb8d4
{
Packit 1fb8d4
	1, /* dwVersion */
Packit 1fb8d4
	sspi_EnumerateSecurityPackagesW, /* EnumerateSecurityPackages */
Packit 1fb8d4
	sspi_QueryCredentialsAttributesW, /* QueryCredentialsAttributes */
Packit 1fb8d4
	sspi_AcquireCredentialsHandleW, /* AcquireCredentialsHandle */
Packit 1fb8d4
	sspi_FreeCredentialsHandle, /* FreeCredentialsHandle */
Packit 1fb8d4
	NULL, /* Reserved2 */
Packit 1fb8d4
	sspi_InitializeSecurityContextW, /* InitializeSecurityContext */
Packit 1fb8d4
	sspi_AcceptSecurityContext, /* AcceptSecurityContext */
Packit 1fb8d4
	sspi_CompleteAuthToken, /* CompleteAuthToken */
Packit 1fb8d4
	sspi_DeleteSecurityContext, /* DeleteSecurityContext */
Packit 1fb8d4
	sspi_ApplyControlToken, /* ApplyControlToken */
Packit 1fb8d4
	sspi_QueryContextAttributesW, /* QueryContextAttributes */
Packit 1fb8d4
	sspi_ImpersonateSecurityContext, /* ImpersonateSecurityContext */
Packit 1fb8d4
	sspi_RevertSecurityContext, /* RevertSecurityContext */
Packit 1fb8d4
	sspi_MakeSignature, /* MakeSignature */
Packit 1fb8d4
	sspi_VerifySignature, /* VerifySignature */
Packit 1fb8d4
	sspi_FreeContextBuffer, /* FreeContextBuffer */
Packit 1fb8d4
	sspi_QuerySecurityPackageInfoW, /* QuerySecurityPackageInfo */
Packit 1fb8d4
	NULL, /* Reserved3 */
Packit 1fb8d4
	NULL, /* Reserved4 */
Packit 1fb8d4
	sspi_ExportSecurityContext, /* ExportSecurityContext */
Packit 1fb8d4
	sspi_ImportSecurityContextW, /* ImportSecurityContext */
Packit 1fb8d4
	NULL, /* AddCredentials */
Packit 1fb8d4
	NULL, /* Reserved8 */
Packit 1fb8d4
	sspi_QuerySecurityContextToken, /* QuerySecurityContextToken */
Packit 1fb8d4
	sspi_EncryptMessage, /* EncryptMessage */
Packit 1fb8d4
	sspi_DecryptMessage, /* DecryptMessage */
Packit 1fb8d4
	sspi_SetContextAttributesW, /* SetContextAttributes */
Packit 1fb8d4
};