Blame winpr/libwinpr/sspi/test/TestInitializeSecurityContext.c

Packit 1fb8d4
Packit 1fb8d4
#include <stdio.h>
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/sspi.h>
Packit 1fb8d4
#include <winpr/winpr.h>
Packit 1fb8d4
Packit 1fb8d4
static const char* test_User = "User";
Packit 1fb8d4
static const char* test_Domain = "Domain";
Packit 1fb8d4
static const char* test_Password = "Password";
Packit 1fb8d4
Packit 1fb8d4
int TestInitializeSecurityContext(int argc, char* argv[])
Packit 1fb8d4
{
Packit 1fb8d4
	int rc = -1;
Packit 1fb8d4
	UINT32 cbMaxLen;
Packit 1fb8d4
	UINT32 fContextReq;
Packit 1fb8d4
	void* output_buffer = NULL;
Packit 1fb8d4
	CtxtHandle context;
Packit 1fb8d4
	ULONG pfContextAttr;
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	CredHandle credentials = { 0 };
Packit 1fb8d4
	TimeStamp expiration;
Packit 1fb8d4
	PSecPkgInfo pPackageInfo;
Packit 1fb8d4
	SEC_WINNT_AUTH_IDENTITY identity = { 0 };
Packit 1fb8d4
	SecurityFunctionTable* table;
Packit 1fb8d4
	PSecBuffer p_SecBuffer;
Packit 1fb8d4
	SecBuffer output_SecBuffer;
Packit 1fb8d4
	SecBufferDesc output_SecBuffer_desc;
Packit 1fb8d4
	sspi_GlobalInit();
Packit 1fb8d4
	table = InitSecurityInterface();
Packit 1fb8d4
	status = QuerySecurityPackageInfo(NTLM_SSP_NAME, &pPackageInfo);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("QuerySecurityPackageInfo status: 0x%08" PRIX32 "\n", status);
Packit 1fb8d4
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	cbMaxLen = pPackageInfo->cbMaxToken;
Packit Service 5a9772
	identity.User = (UINT16*)_strdup(test_User);
Packit Service 5a9772
	identity.Domain = (UINT16*)_strdup(test_Domain);
Packit Service 5a9772
	identity.Password = (UINT16*)_strdup(test_Password);
Packit 1fb8d4
Packit 1fb8d4
	if (!identity.User || !identity.Domain || !identity.Password)
Packit 1fb8d4
		goto fail;
Packit 1fb8d4
Packit 1fb8d4
	identity.UserLength = strlen(test_User);
Packit 1fb8d4
	identity.DomainLength = strlen(test_Domain);
Packit 1fb8d4
	identity.PasswordLength = strlen(test_Password);
Packit 1fb8d4
	identity.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
Packit Service 5a9772
	status = table->AcquireCredentialsHandle(NULL, NTLM_SSP_NAME, SECPKG_CRED_OUTBOUND, NULL,
Packit Service 5a9772
	                                         &identity, NULL, NULL, &credentials, &expiration);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("AcquireCredentialsHandle status: 0x%08" PRIX32 "\n", status);
Packit 1fb8d4
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	fContextReq = ISC_REQ_REPLAY_DETECT | ISC_REQ_SEQUENCE_DETECT | ISC_REQ_CONFIDENTIALITY |
Packit 1fb8d4
	              ISC_REQ_DELEGATE;
Packit 1fb8d4
	output_buffer = malloc(cbMaxLen);
Packit 1fb8d4
Packit 1fb8d4
	if (!output_buffer)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Memory allocation failed\n");
Packit 1fb8d4
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	output_SecBuffer_desc.ulVersion = 0;
Packit 1fb8d4
	output_SecBuffer_desc.cBuffers = 1;
Packit 1fb8d4
	output_SecBuffer_desc.pBuffers = &output_SecBuffer;
Packit 1fb8d4
	output_SecBuffer.cbBuffer = cbMaxLen;
Packit 1fb8d4
	output_SecBuffer.BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
	output_SecBuffer.pvBuffer = output_buffer;
Packit 1fb8d4
	status = table->InitializeSecurityContext(&credentials, NULL, NULL, fContextReq, 0, 0, NULL, 0,
Packit Service 5a9772
	                                          &context, &output_SecBuffer_desc, &pfContextAttr,
Packit Service 5a9772
	                                          &expiration);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_I_CONTINUE_NEEDED)
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("InitializeSecurityContext status: 0x%08" PRIX32 "\n", status);
Packit 1fb8d4
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit Service 5a9772
	printf("cBuffers: %" PRIu32 " ulVersion: %" PRIu32 "\n", output_SecBuffer_desc.cBuffers,
Packit 1fb8d4
	       output_SecBuffer_desc.ulVersion);
Packit 1fb8d4
	p_SecBuffer = &output_SecBuffer_desc.pBuffers[0];
Packit Service 5a9772
	printf("BufferType: 0x%08" PRIX32 " cbBuffer: %" PRIu32 "\n", p_SecBuffer->BufferType,
Packit 1fb8d4
	       p_SecBuffer->cbBuffer);
Packit 1fb8d4
	status = table->DeleteSecurityContext(&context);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("DeleteSecurityContext status: 0x%08" PRIX32 "\n", status);
Packit 1fb8d4
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	rc = 0;
Packit 1fb8d4
fail:
Packit 1fb8d4
	free(identity.User);
Packit 1fb8d4
	free(identity.Domain);
Packit 1fb8d4
	free(identity.Password);
Packit 1fb8d4
	free(output_buffer);
Packit 1fb8d4
Packit 1fb8d4
	if (SecIsValidHandle(&credentials))
Packit 1fb8d4
		table->FreeCredentialsHandle(&credentials);
Packit 1fb8d4
Packit 1fb8d4
	FreeContextBuffer(pPackageInfo);
Packit 1fb8d4
	sspi_GlobalFinish();
Packit 1fb8d4
	return rc;
Packit 1fb8d4
}