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

Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/sspi.h>
Packit 1fb8d4
#include <winpr/print.h>
Packit 1fb8d4
#include <winpr/wlog.h>
Packit 1fb8d4
Packit 1fb8d4
static BYTE TEST_NTLM_TIMESTAMP[8] = { 0x33, 0x57, 0xbd, 0xb1, 0x07, 0x8b, 0xcf, 0x01 };
Packit 1fb8d4
Packit 1fb8d4
static BYTE TEST_NTLM_CLIENT_CHALLENGE[8] = { 0x20, 0xc0, 0x2b, 0x3d, 0xc0, 0x61, 0xa7, 0x73 };
Packit 1fb8d4
Packit 1fb8d4
static BYTE TEST_NTLM_SERVER_CHALLENGE[8] = { 0xa4, 0xf1, 0xba, 0xa6, 0x7c, 0xdc, 0x1a, 0x12 };
Packit 1fb8d4
Packit 1fb8d4
static BYTE TEST_NTLM_NEGOTIATE[] =
Packit 1fb8d4
    "\x4e\x54\x4c\x4d\x53\x53\x50\x00\x01\x00\x00\x00\x07\x82\x08\xa2"
Packit 1fb8d4
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
Packit 1fb8d4
    "\x06\x03\x80\x25\x00\x00\x00\x0f";
Packit 1fb8d4
Packit 1fb8d4
static BYTE TEST_NTLM_CHALLENGE[] =
Packit 1fb8d4
    "\x4e\x54\x4c\x4d\x53\x53\x50\x00\x02\x00\x00\x00\x00\x00\x00\x00"
Packit 1fb8d4
    "\x38\x00\x00\x00\x07\x82\x88\xa2\xa4\xf1\xba\xa6\x7c\xdc\x1a\x12"
Packit 1fb8d4
    "\x00\x00\x00\x00\x00\x00\x00\x00\x66\x00\x66\x00\x38\x00\x00\x00"
Packit 1fb8d4
    "\x06\x03\x80\x25\x00\x00\x00\x0f\x02\x00\x0e\x00\x4e\x00\x45\x00"
Packit 1fb8d4
    "\x57\x00\x59\x00\x45\x00\x41\x00\x52\x00\x01\x00\x0e\x00\x4e\x00"
Packit 1fb8d4
    "\x45\x00\x57\x00\x59\x00\x45\x00\x41\x00\x52\x00\x04\x00\x1c\x00"
Packit 1fb8d4
    "\x6c\x00\x61\x00\x62\x00\x2e\x00\x77\x00\x61\x00\x79\x00\x6b\x00"
Packit 1fb8d4
    "\x2e\x00\x6c\x00\x6f\x00\x63\x00\x61\x00\x6c\x00\x03\x00\x0e\x00"
Packit 1fb8d4
    "\x6e\x00\x65\x00\x77\x00\x79\x00\x65\x00\x61\x00\x72\x00\x07\x00"
Packit 1fb8d4
    "\x08\x00\x33\x57\xbd\xb1\x07\x8b\xcf\x01\x00\x00\x00\x00";
Packit 1fb8d4
Packit 1fb8d4
static BYTE TEST_NTLM_AUTHENTICATE[] =
Packit 1fb8d4
    "\x4e\x54\x4c\x4d\x53\x53\x50\x00\x03\x00\x00\x00\x18\x00\x18\x00"
Packit 1fb8d4
    "\x82\x00\x00\x00\x08\x01\x08\x01\x9a\x00\x00\x00\x0c\x00\x0c\x00"
Packit 1fb8d4
    "\x58\x00\x00\x00\x10\x00\x10\x00\x64\x00\x00\x00\x0e\x00\x0e\x00"
Packit 1fb8d4
    "\x74\x00\x00\x00\x00\x00\x00\x00\xa2\x01\x00\x00\x05\x82\x88\xa2"
Packit 1fb8d4
    "\x06\x03\x80\x25\x00\x00\x00\x0f\x12\xe5\x5a\xf5\x80\xee\x3f\x29"
Packit 1fb8d4
    "\xe1\xde\x90\x4d\x73\x77\x06\x25\x44\x00\x6f\x00\x6d\x00\x61\x00"
Packit 1fb8d4
    "\x69\x00\x6e\x00\x55\x00\x73\x00\x65\x00\x72\x00\x6e\x00\x61\x00"
Packit 1fb8d4
    "\x6d\x00\x65\x00\x4e\x00\x45\x00\x57\x00\x59\x00\x45\x00\x41\x00"
Packit 1fb8d4
    "\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
Packit 1fb8d4
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x14\x68\xc8\x98\x12"
Packit 1fb8d4
    "\xe7\x39\xd8\x76\x1b\xe9\xf7\x54\xb5\xe3\x01\x01\x00\x00\x00\x00"
Packit 1fb8d4
    "\x00\x00\x33\x57\xbd\xb1\x07\x8b\xcf\x01\x20\xc0\x2b\x3d\xc0\x61"
Packit 1fb8d4
    "\xa7\x73\x00\x00\x00\x00\x02\x00\x0e\x00\x4e\x00\x45\x00\x57\x00"
Packit 1fb8d4
    "\x59\x00\x45\x00\x41\x00\x52\x00\x01\x00\x0e\x00\x4e\x00\x45\x00"
Packit 1fb8d4
    "\x57\x00\x59\x00\x45\x00\x41\x00\x52\x00\x04\x00\x1c\x00\x6c\x00"
Packit 1fb8d4
    "\x61\x00\x62\x00\x2e\x00\x77\x00\x61\x00\x79\x00\x6b\x00\x2e\x00"
Packit 1fb8d4
    "\x6c\x00\x6f\x00\x63\x00\x61\x00\x6c\x00\x03\x00\x0e\x00\x6e\x00"
Packit 1fb8d4
    "\x65\x00\x77\x00\x79\x00\x65\x00\x61\x00\x72\x00\x07\x00\x08\x00"
Packit 1fb8d4
    "\x33\x57\xbd\xb1\x07\x8b\xcf\x01\x06\x00\x04\x00\x02\x00\x00\x00"
Packit 1fb8d4
    "\x08\x00\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00"
Packit 1fb8d4
    "\x00\x20\x00\x00\x1e\x10\xf5\x2c\x54\x2f\x2e\x77\x1c\x13\xbf\xc3"
Packit 1fb8d4
    "\x3f\xe1\x7b\x28\x7e\x0b\x93\x5a\x39\xd2\xce\x12\xd7\xbd\x8c\x4e"
Packit 1fb8d4
    "\x2b\xb5\x0b\xf5\x0a\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00"
Packit 1fb8d4
    "\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x1a\x00\x48\x00\x54\x00"
Packit 1fb8d4
    "\x54\x00\x50\x00\x2f\x00\x72\x00\x77\x00\x2e\x00\x6c\x00\x6f\x00"
Packit 1fb8d4
    "\x63\x00\x61\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
Packit 1fb8d4
    "\x00\x00";
Packit 1fb8d4
Packit 1fb8d4
#define TEST_SSPI_INTERFACE SSPI_INTERFACE_WINPR
Packit 1fb8d4
Packit 1fb8d4
static const char* TEST_NTLM_USER = "Username";
Packit 1fb8d4
static const char* TEST_NTLM_DOMAIN = "Domain";
Packit 1fb8d4
static const char* TEST_NTLM_PASSWORD = "P4ss123!";
Packit 1fb8d4
Packit Service 5a9772
// static const char* TEST_NTLM_HASH_STRING = "d5922a65c4d5c082ca444af1be0001db";
Packit 1fb8d4
Packit Service 5a9772
static const BYTE TEST_NTLM_HASH[16] = { 0xd5, 0x92, 0x2a, 0x65, 0xc4, 0xd5, 0xc0, 0x82,
Packit Service 5a9772
	                                     0xca, 0x44, 0x4a, 0xf1, 0xbe, 0x00, 0x01, 0xdb };
Packit 1fb8d4
Packit Service 5a9772
// static const char* TEST_NTLM_HASH_V2_STRING = "4c7f706f7dde05a9d1a0f4e7ffe3bfb8";
Packit 1fb8d4
Packit Service 5a9772
static const BYTE TEST_NTLM_V2_HASH[16] = { 0x4c, 0x7f, 0x70, 0x6f, 0x7d, 0xde, 0x05, 0xa9,
Packit Service 5a9772
	                                        0xd1, 0xa0, 0xf4, 0xe7, 0xff, 0xe3, 0xbf, 0xb8 };
Packit 1fb8d4
Packit Service 5a9772
#define NTLM_PACKAGE_NAME NTLM_SSP_NAME
Packit 1fb8d4
Packit 1fb8d4
struct _TEST_NTLM_CLIENT
Packit 1fb8d4
{
Packit 1fb8d4
	CtxtHandle context;
Packit 1fb8d4
	ULONG cbMaxToken;
Packit 1fb8d4
	ULONG fContextReq;
Packit 1fb8d4
	ULONG pfContextAttr;
Packit 1fb8d4
	TimeStamp expiration;
Packit 1fb8d4
	PSecBuffer pBuffer;
Packit 1fb8d4
	SecBuffer inputBuffer[2];
Packit 1fb8d4
	SecBuffer outputBuffer[2];
Packit 1fb8d4
	BOOL haveContext;
Packit 1fb8d4
	BOOL haveInputBuffer;
Packit 1fb8d4
	LPTSTR ServicePrincipalName;
Packit 1fb8d4
	SecBufferDesc inputBufferDesc;
Packit 1fb8d4
	SecBufferDesc outputBufferDesc;
Packit 1fb8d4
	CredHandle credentials;
Packit 1fb8d4
	BOOL confidentiality;
Packit 1fb8d4
	SecPkgInfo* pPackageInfo;
Packit 1fb8d4
	SecurityFunctionTable* table;
Packit 1fb8d4
	SEC_WINNT_AUTH_IDENTITY identity;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _TEST_NTLM_CLIENT TEST_NTLM_CLIENT;
Packit 1fb8d4
Packit 1fb8d4
int test_ntlm_client_init(TEST_NTLM_CLIENT* ntlm, const char* user, const char* domain,
Packit 1fb8d4
                          const char* password)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	SecInvalidateHandle(&(ntlm->context));
Packit 1fb8d4
	ntlm->table = InitSecurityInterfaceEx(TEST_SSPI_INTERFACE);
Packit 1fb8d4
	sspi_SetAuthIdentity(&(ntlm->identity), user, domain, password);
Packit 1fb8d4
	status = ntlm->table->QuerySecurityPackageInfo(NTLM_PACKAGE_NAME, &ntlm->pPackageInfo);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit Service 5a9772
		fprintf(stderr, "QuerySecurityPackageInfo status: %s (0x%08" PRIX32 ")\n",
Packit 1fb8d4
		        GetSecurityStatusString(status), status);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	ntlm->cbMaxToken = ntlm->pPackageInfo->cbMaxToken;
Packit Service 5a9772
	status = ntlm->table->AcquireCredentialsHandle(NULL, NTLM_PACKAGE_NAME, SECPKG_CRED_OUTBOUND,
Packit Service 5a9772
	                                               NULL, &ntlm->identity, NULL, NULL,
Packit Service 5a9772
	                                               &ntlm->credentials, &ntlm->expiration);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit Service 5a9772
		fprintf(stderr, "AcquireCredentialsHandle status: %s (0x%08" PRIX32 ")\n",
Packit 1fb8d4
		        GetSecurityStatusString(status), status);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	ntlm->haveContext = FALSE;
Packit 1fb8d4
	ntlm->haveInputBuffer = FALSE;
Packit 1fb8d4
	ZeroMemory(&ntlm->inputBuffer, sizeof(SecBuffer));
Packit 1fb8d4
	ZeroMemory(&ntlm->outputBuffer, sizeof(SecBuffer));
Packit 1fb8d4
	ntlm->fContextReq = 0;
Packit 1fb8d4
#if 0
Packit 1fb8d4
	/* HTTP authentication flags */
Packit 1fb8d4
	ntlm->fContextReq |= ISC_REQ_CONFIDENTIALITY;
Packit 1fb8d4
#endif
Packit 1fb8d4
	/* NLA authentication flags */
Packit 1fb8d4
	ntlm->fContextReq |= ISC_REQ_MUTUAL_AUTH;
Packit 1fb8d4
	ntlm->fContextReq |= ISC_REQ_CONFIDENTIALITY;
Packit 1fb8d4
	ntlm->fContextReq |= ISC_REQ_USE_SESSION_KEY;
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void test_ntlm_client_uninit(TEST_NTLM_CLIENT* ntlm)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!ntlm)
Packit 1fb8d4
		return;
Packit 1fb8d4
Packit 1fb8d4
	if (ntlm->outputBuffer[0].pvBuffer)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(ntlm->outputBuffer[0].pvBuffer);
Packit 1fb8d4
		ntlm->outputBuffer[0].pvBuffer = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	free(ntlm->identity.User);
Packit 1fb8d4
	free(ntlm->identity.Domain);
Packit 1fb8d4
	free(ntlm->identity.Password);
Packit 1fb8d4
	free(ntlm->ServicePrincipalName);
Packit 1fb8d4
Packit 1fb8d4
	if (ntlm->table)
Packit 1fb8d4
	{
Packit 1fb8d4
		ntlm->table->FreeCredentialsHandle(&ntlm->credentials);
Packit 1fb8d4
		ntlm->table->FreeContextBuffer(ntlm->pPackageInfo);
Packit 1fb8d4
		ntlm->table->DeleteSecurityContext(&ntlm->context);
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 *                                        SSPI Client Ceremony
Packit 1fb8d4
 *
Packit 1fb8d4
 *                                           --------------
Packit 1fb8d4
 *                                          ( Client Begin )
Packit 1fb8d4
 *                                           --------------
Packit 1fb8d4
 *                                                 |
Packit 1fb8d4
 *                                                 |
Packit 1fb8d4
 *                                                \|/
Packit 1fb8d4
 *                                      -----------+--------------
Packit 1fb8d4
 *                                     | AcquireCredentialsHandle |
Packit 1fb8d4
 *                                      --------------------------
Packit 1fb8d4
 *                                                 |
Packit 1fb8d4
 *                                                 |
Packit 1fb8d4
 *                                                \|/
Packit 1fb8d4
 *                                    -------------+--------------
Packit 1fb8d4
 *                 +---------------> / InitializeSecurityContext /
Packit 1fb8d4
 *                 |                 ----------------------------
Packit 1fb8d4
 *                 |                               |
Packit 1fb8d4
 *                 |                               |
Packit 1fb8d4
 *                 |                              \|/
Packit 1fb8d4
 *     ---------------------------        ---------+-------------            ----------------------
Packit 1fb8d4
 *    / Receive blob from server /      < Received security blob? > --Yes-> / Send blob to server /
Packit 1fb8d4
 *    -------------+-------------         -----------------------           ----------------------
Packit 1fb8d4
 *                /|\                              |                                |
Packit 1fb8d4
 *                 |                               No                               |
Packit 1fb8d4
 *                Yes                             \|/                               |
Packit 1fb8d4
 *                 |                   ------------+-----------                     |
Packit 1fb8d4
 *                 +---------------- < Received Continue Needed > <-----------------+
Packit 1fb8d4
 *                                     ------------------------
Packit 1fb8d4
 *                                                 |
Packit 1fb8d4
 *                                                 No
Packit 1fb8d4
 *                                                \|/
Packit 1fb8d4
 *                                           ------+-------
Packit 1fb8d4
 *                                          (  Client End  )
Packit 1fb8d4
 *                                           --------------
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
int test_ntlm_client_authenticate(TEST_NTLM_CLIENT* ntlm)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
Packit 1fb8d4
	if (ntlm->outputBuffer[0].pvBuffer)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(ntlm->outputBuffer[0].pvBuffer);
Packit 1fb8d4
		ntlm->outputBuffer[0].pvBuffer = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	ntlm->outputBufferDesc.ulVersion = SECBUFFER_VERSION;
Packit 1fb8d4
	ntlm->outputBufferDesc.cBuffers = 1;
Packit 1fb8d4
	ntlm->outputBufferDesc.pBuffers = ntlm->outputBuffer;
Packit 1fb8d4
	ntlm->outputBuffer[0].BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
	ntlm->outputBuffer[0].cbBuffer = ntlm->cbMaxToken;
Packit 1fb8d4
	ntlm->outputBuffer[0].pvBuffer = malloc(ntlm->outputBuffer[0].cbBuffer);
Packit 1fb8d4
Packit 1fb8d4
	if (!ntlm->outputBuffer[0].pvBuffer)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (ntlm->haveInputBuffer)
Packit 1fb8d4
	{
Packit 1fb8d4
		ntlm->inputBufferDesc.ulVersion = SECBUFFER_VERSION;
Packit 1fb8d4
		ntlm->inputBufferDesc.cBuffers = 1;
Packit 1fb8d4
		ntlm->inputBufferDesc.pBuffers = ntlm->inputBuffer;
Packit 1fb8d4
		ntlm->inputBuffer[0].BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if ((!ntlm) || (!ntlm->table))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "ntlm_authenticate: invalid ntlm context\n");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit Service 5a9772
	status = ntlm->table->InitializeSecurityContext(
Packit Service 5a9772
	    &ntlm->credentials, (ntlm->haveContext) ? &ntlm->context : NULL,
Packit Service 5a9772
	    (ntlm->ServicePrincipalName) ? ntlm->ServicePrincipalName : NULL, ntlm->fContextReq, 0,
Packit Service 5a9772
	    SECURITY_NATIVE_DREP, (ntlm->haveInputBuffer) ? &ntlm->inputBufferDesc : NULL, 0,
Packit Service 5a9772
	    &ntlm->context, &ntlm->outputBufferDesc, &ntlm->pfContextAttr, &ntlm->expiration);
Packit 1fb8d4
Packit 1fb8d4
	if ((status == SEC_I_COMPLETE_AND_CONTINUE) || (status == SEC_I_COMPLETE_NEEDED))
Packit 1fb8d4
	{
Packit 1fb8d4
		if (ntlm->table->CompleteAuthToken)
Packit 1fb8d4
			ntlm->table->CompleteAuthToken(&ntlm->context, &ntlm->outputBufferDesc);
Packit 1fb8d4
Packit 1fb8d4
		if (status == SEC_I_COMPLETE_NEEDED)
Packit 1fb8d4
			status = SEC_E_OK;
Packit 1fb8d4
		else if (status == SEC_I_COMPLETE_AND_CONTINUE)
Packit 1fb8d4
			status = SEC_I_CONTINUE_NEEDED;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (ntlm->haveInputBuffer)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(ntlm->inputBuffer[0].pvBuffer);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	ntlm->haveInputBuffer = TRUE;
Packit 1fb8d4
	ntlm->haveContext = TRUE;
Packit 1fb8d4
	return (status == SEC_I_CONTINUE_NEEDED) ? 1 : 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
TEST_NTLM_CLIENT* test_ntlm_client_new()
Packit 1fb8d4
{
Packit 1fb8d4
	TEST_NTLM_CLIENT* ntlm;
Packit Service 5a9772
	ntlm = (TEST_NTLM_CLIENT*)calloc(1, sizeof(TEST_NTLM_CLIENT));
Packit 1fb8d4
Packit 1fb8d4
	if (!ntlm)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	return ntlm;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void test_ntlm_client_free(TEST_NTLM_CLIENT* ntlm)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!ntlm)
Packit 1fb8d4
		return;
Packit 1fb8d4
Packit 1fb8d4
	test_ntlm_client_uninit(ntlm);
Packit 1fb8d4
	free(ntlm);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
struct _TEST_NTLM_SERVER
Packit 1fb8d4
{
Packit 1fb8d4
	CtxtHandle context;
Packit 1fb8d4
	ULONG cbMaxToken;
Packit 1fb8d4
	ULONG fContextReq;
Packit 1fb8d4
	ULONG pfContextAttr;
Packit 1fb8d4
	TimeStamp expiration;
Packit 1fb8d4
	PSecBuffer pBuffer;
Packit 1fb8d4
	SecBuffer inputBuffer[2];
Packit 1fb8d4
	SecBuffer outputBuffer[2];
Packit 1fb8d4
	BOOL haveContext;
Packit 1fb8d4
	BOOL haveInputBuffer;
Packit 1fb8d4
	BOOL UseNtlmV2Hash;
Packit 1fb8d4
	LPTSTR ServicePrincipalName;
Packit 1fb8d4
	SecBufferDesc inputBufferDesc;
Packit 1fb8d4
	SecBufferDesc outputBufferDesc;
Packit 1fb8d4
	CredHandle credentials;
Packit 1fb8d4
	BOOL confidentiality;
Packit 1fb8d4
	SecPkgInfo* pPackageInfo;
Packit 1fb8d4
	SecurityFunctionTable* table;
Packit 1fb8d4
	SEC_WINNT_AUTH_IDENTITY identity;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _TEST_NTLM_SERVER TEST_NTLM_SERVER;
Packit 1fb8d4
Packit 1fb8d4
int test_ntlm_server_init(TEST_NTLM_SERVER* ntlm)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	ntlm->UseNtlmV2Hash = TRUE;
Packit 1fb8d4
	SecInvalidateHandle(&(ntlm->context));
Packit 1fb8d4
	ntlm->table = InitSecurityInterfaceEx(TEST_SSPI_INTERFACE);
Packit 1fb8d4
	status = ntlm->table->QuerySecurityPackageInfo(NTLM_PACKAGE_NAME, &ntlm->pPackageInfo);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit Service 5a9772
		fprintf(stderr, "QuerySecurityPackageInfo status: %s (0x%08" PRIX32 ")\n",
Packit 1fb8d4
		        GetSecurityStatusString(status), status);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	ntlm->cbMaxToken = ntlm->pPackageInfo->cbMaxToken;
Packit Service 5a9772
	status = ntlm->table->AcquireCredentialsHandle(NULL, NTLM_PACKAGE_NAME, SECPKG_CRED_INBOUND,
Packit Service 5a9772
	                                               NULL, NULL, NULL, NULL, &ntlm->credentials,
Packit Service 5a9772
	                                               &ntlm->expiration);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit Service 5a9772
		fprintf(stderr, "AcquireCredentialsHandle status: %s (0x%08" PRIX32 ")\n",
Packit 1fb8d4
		        GetSecurityStatusString(status), status);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	ntlm->haveContext = FALSE;
Packit 1fb8d4
	ntlm->haveInputBuffer = FALSE;
Packit 1fb8d4
	ZeroMemory(&ntlm->inputBuffer, sizeof(SecBuffer));
Packit 1fb8d4
	ZeroMemory(&ntlm->outputBuffer, sizeof(SecBuffer));
Packit 1fb8d4
	ntlm->fContextReq = 0;
Packit 1fb8d4
	/* NLA authentication flags */
Packit 1fb8d4
	ntlm->fContextReq |= ASC_REQ_MUTUAL_AUTH;
Packit 1fb8d4
	ntlm->fContextReq |= ASC_REQ_CONFIDENTIALITY;
Packit 1fb8d4
	ntlm->fContextReq |= ASC_REQ_CONNECTION;
Packit 1fb8d4
	ntlm->fContextReq |= ASC_REQ_USE_SESSION_KEY;
Packit 1fb8d4
	ntlm->fContextReq |= ASC_REQ_REPLAY_DETECT;
Packit 1fb8d4
	ntlm->fContextReq |= ASC_REQ_SEQUENCE_DETECT;
Packit 1fb8d4
	ntlm->fContextReq |= ASC_REQ_EXTENDED_ERROR;
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void test_ntlm_server_uninit(TEST_NTLM_SERVER* ntlm)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!ntlm)
Packit 1fb8d4
		return;
Packit 1fb8d4
Packit 1fb8d4
	if (ntlm->outputBuffer[0].pvBuffer)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(ntlm->outputBuffer[0].pvBuffer);
Packit 1fb8d4
		ntlm->outputBuffer[0].pvBuffer = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	free(ntlm->identity.User);
Packit 1fb8d4
	free(ntlm->identity.Domain);
Packit 1fb8d4
	free(ntlm->identity.Password);
Packit 1fb8d4
	free(ntlm->ServicePrincipalName);
Packit 1fb8d4
Packit 1fb8d4
	if (ntlm->table)
Packit 1fb8d4
	{
Packit 1fb8d4
		ntlm->table->FreeCredentialsHandle(&ntlm->credentials);
Packit 1fb8d4
		ntlm->table->FreeContextBuffer(ntlm->pPackageInfo);
Packit 1fb8d4
		ntlm->table->DeleteSecurityContext(&ntlm->context);
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int test_ntlm_server_authenticate(TEST_NTLM_SERVER* ntlm)
Packit 1fb8d4
{
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	ntlm->inputBufferDesc.ulVersion = SECBUFFER_VERSION;
Packit 1fb8d4
	ntlm->inputBufferDesc.cBuffers = 1;
Packit 1fb8d4
	ntlm->inputBufferDesc.pBuffers = ntlm->inputBuffer;
Packit 1fb8d4
	ntlm->inputBuffer[0].BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
	ntlm->outputBufferDesc.ulVersion = SECBUFFER_VERSION;
Packit 1fb8d4
	ntlm->outputBufferDesc.cBuffers = 1;
Packit 1fb8d4
	ntlm->outputBufferDesc.pBuffers = &ntlm->outputBuffer[0];
Packit 1fb8d4
	ntlm->outputBuffer[0].BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
	ntlm->outputBuffer[0].cbBuffer = ntlm->cbMaxToken;
Packit 1fb8d4
	ntlm->outputBuffer[0].pvBuffer = malloc(ntlm->outputBuffer[0].cbBuffer);
Packit 1fb8d4
Packit 1fb8d4
	if (!ntlm->outputBuffer[0].pvBuffer)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit Service 5a9772
	status = ntlm->table->AcceptSecurityContext(
Packit Service 5a9772
	    &ntlm->credentials, ntlm->haveContext ? &ntlm->context : NULL, &ntlm->inputBufferDesc,
Packit Service 5a9772
	    ntlm->fContextReq, SECURITY_NATIVE_DREP, &ntlm->context, &ntlm->outputBufferDesc,
Packit Service 5a9772
	    &ntlm->pfContextAttr, &ntlm->expiration);
Packit 1fb8d4
Packit 1fb8d4
	if ((status == SEC_I_COMPLETE_AND_CONTINUE) || (status == SEC_I_COMPLETE_NEEDED))
Packit 1fb8d4
	{
Packit 1fb8d4
		SecPkgContext_AuthIdentity AuthIdentity;
Packit 1fb8d4
		SecPkgContext_AuthNtlmHash AuthNtlmHash;
Packit 1fb8d4
		ZeroMemory(&AuthIdentity, sizeof(SecPkgContext_AuthIdentity));
Packit 1fb8d4
		ZeroMemory(&AuthNtlmHash, sizeof(SecPkgContext_AuthNtlmHash));
Packit 1fb8d4
		status = ntlm->table->QueryContextAttributes(&ntlm->context, SECPKG_ATTR_AUTH_IDENTITY,
Packit Service 5a9772
		                                             &AuthIdentity);
Packit 1fb8d4
Packit 1fb8d4
		if (status == SEC_E_OK)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (strcmp(AuthIdentity.User, TEST_NTLM_USER) == 0)
Packit 1fb8d4
			{
Packit 1fb8d4
				if (ntlm->UseNtlmV2Hash)
Packit 1fb8d4
				{
Packit 1fb8d4
					AuthNtlmHash.Version = 2;
Packit 1fb8d4
					CopyMemory(AuthNtlmHash.NtlmHash, TEST_NTLM_V2_HASH, 16);
Packit 1fb8d4
				}
Packit 1fb8d4
				else
Packit 1fb8d4
				{
Packit 1fb8d4
					AuthNtlmHash.Version = 1;
Packit 1fb8d4
					CopyMemory(AuthNtlmHash.NtlmHash, TEST_NTLM_HASH, 16);
Packit 1fb8d4
				}
Packit 1fb8d4
Packit Service 5a9772
				status = ntlm->table->SetContextAttributes(
Packit Service 5a9772
				    &ntlm->context, SECPKG_ATTR_AUTH_NTLM_HASH, &AuthNtlmHash,
Packit Service 5a9772
				    sizeof(SecPkgContext_AuthNtlmHash));
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (ntlm->table->CompleteAuthToken)
Packit 1fb8d4
			status = ntlm->table->CompleteAuthToken(&ntlm->context, &ntlm->outputBufferDesc);
Packit 1fb8d4
Packit 1fb8d4
		if (status == SEC_I_COMPLETE_NEEDED)
Packit 1fb8d4
			status = SEC_E_OK;
Packit 1fb8d4
		else if (status == SEC_I_COMPLETE_AND_CONTINUE)
Packit 1fb8d4
			status = SEC_I_CONTINUE_NEEDED;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if ((status != SEC_E_OK) && (status != SEC_I_CONTINUE_NEEDED))
Packit 1fb8d4
	{
Packit Service 5a9772
		fprintf(stderr, "AcceptSecurityContext status: %s (0x%08" PRIX32 ")\n",
Packit 1fb8d4
		        GetSecurityStatusString(status), status);
Packit 1fb8d4
		return -1; /* Access Denied */
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	ntlm->haveContext = TRUE;
Packit 1fb8d4
	return (status == SEC_I_CONTINUE_NEEDED) ? 1 : 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
TEST_NTLM_SERVER* test_ntlm_server_new()
Packit 1fb8d4
{
Packit 1fb8d4
	TEST_NTLM_SERVER* ntlm;
Packit Service 5a9772
	ntlm = (TEST_NTLM_SERVER*)calloc(1, sizeof(TEST_NTLM_SERVER));
Packit 1fb8d4
Packit 1fb8d4
	if (!ntlm)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	return ntlm;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void test_ntlm_server_free(TEST_NTLM_SERVER* ntlm)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!ntlm)
Packit 1fb8d4
		return;
Packit 1fb8d4
Packit 1fb8d4
	test_ntlm_server_uninit(ntlm);
Packit 1fb8d4
	free(ntlm);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int TestNTLM(int argc, char* argv[])
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int rc = -1;
Packit 1fb8d4
	PSecBuffer pSecBuffer;
Packit Service 5a9772
	TEST_NTLM_CLIENT* client = NULL;
Packit Service 5a9772
	TEST_NTLM_SERVER* server = NULL;
Packit 1fb8d4
	BOOL DynamicTest = TRUE;
Packit Service 5a9772
Packit Service 5a9772
	WINPR_UNUSED(argc);
Packit Service 5a9772
	WINPR_UNUSED(argv);
Packit Service 5a9772
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * Client Initialization
Packit 1fb8d4
	 */
Packit 1fb8d4
	client = test_ntlm_client_new();
Packit 1fb8d4
Packit 1fb8d4
	if (!client)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Memory allocation failed");
Packit Service 5a9772
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	status = test_ntlm_client_init(client, TEST_NTLM_USER, TEST_NTLM_DOMAIN, TEST_NTLM_PASSWORD);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("test_ntlm_client_init failure\n");
Packit Service 5a9772
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * Server Initialization
Packit 1fb8d4
	 */
Packit 1fb8d4
	server = test_ntlm_server_new();
Packit 1fb8d4
Packit 1fb8d4
	if (!server)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Memory allocation failed\n");
Packit Service 5a9772
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	status = test_ntlm_server_init(server);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("test_ntlm_server_init failure\n");
Packit Service 5a9772
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * Client -> Negotiate Message
Packit 1fb8d4
	 */
Packit 1fb8d4
	status = test_ntlm_client_authenticate(client);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("test_ntlm_client_authenticate failure\n");
Packit Service 5a9772
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (!DynamicTest)
Packit 1fb8d4
	{
Packit 1fb8d4
		SecPkgContext_AuthNtlmTimestamp AuthNtlmTimestamp;
Packit 1fb8d4
		SecPkgContext_AuthNtlmClientChallenge AuthNtlmClientChallenge;
Packit 1fb8d4
		SecPkgContext_AuthNtlmServerChallenge AuthNtlmServerChallenge;
Packit 1fb8d4
		CopyMemory(AuthNtlmTimestamp.Timestamp, TEST_NTLM_TIMESTAMP, 8);
Packit 1fb8d4
		AuthNtlmTimestamp.ChallengeOrResponse = TRUE;
Packit 1fb8d4
		client->table->SetContextAttributes(&client->context, SECPKG_ATTR_AUTH_NTLM_TIMESTAMP,
Packit Service 5a9772
		                                    &AuthNtlmTimestamp,
Packit Service 5a9772
		                                    sizeof(SecPkgContext_AuthNtlmTimestamp));
Packit 1fb8d4
		AuthNtlmTimestamp.ChallengeOrResponse = FALSE;
Packit 1fb8d4
		client->table->SetContextAttributes(&client->context, SECPKG_ATTR_AUTH_NTLM_TIMESTAMP,
Packit Service 5a9772
		                                    &AuthNtlmTimestamp,
Packit Service 5a9772
		                                    sizeof(SecPkgContext_AuthNtlmTimestamp));
Packit 1fb8d4
		CopyMemory(AuthNtlmClientChallenge.ClientChallenge, TEST_NTLM_CLIENT_CHALLENGE, 8);
Packit 1fb8d4
		CopyMemory(AuthNtlmServerChallenge.ServerChallenge, TEST_NTLM_SERVER_CHALLENGE, 8);
Packit Service 5a9772
		client->table->SetContextAttributes(
Packit Service 5a9772
		    &client->context, SECPKG_ATTR_AUTH_NTLM_CLIENT_CHALLENGE, &AuthNtlmClientChallenge,
Packit Service 5a9772
		    sizeof(SecPkgContext_AuthNtlmClientChallenge));
Packit Service 5a9772
		client->table->SetContextAttributes(
Packit Service 5a9772
		    &client->context, SECPKG_ATTR_AUTH_NTLM_SERVER_CHALLENGE, &AuthNtlmServerChallenge,
Packit Service 5a9772
		    sizeof(SecPkgContext_AuthNtlmServerChallenge));
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	pSecBuffer = &(client->outputBuffer[0]);
Packit 1fb8d4
Packit 1fb8d4
	if (!DynamicTest)
Packit 1fb8d4
	{
Packit 1fb8d4
		pSecBuffer->cbBuffer = sizeof(TEST_NTLM_NEGOTIATE) - 1;
Packit Service 5a9772
		pSecBuffer->pvBuffer = (void*)malloc(pSecBuffer->cbBuffer);
Packit 1fb8d4
Packit 1fb8d4
		if (!pSecBuffer->pvBuffer)
Packit 1fb8d4
		{
Packit 1fb8d4
			printf("Memory allocation failed\n");
Packit Service 5a9772
			goto fail;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		CopyMemory(pSecBuffer->pvBuffer, TEST_NTLM_NEGOTIATE, pSecBuffer->cbBuffer);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit Service 5a9772
	fprintf(stderr, "NTLM_NEGOTIATE (length = %" PRIu32 "):\n", pSecBuffer->cbBuffer);
Packit Service 5a9772
	winpr_HexDump("sspi.test", WLOG_DEBUG, (BYTE*)pSecBuffer->pvBuffer, pSecBuffer->cbBuffer);
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * Server <- Negotiate Message
Packit 1fb8d4
	 * Server -> Challenge Message
Packit 1fb8d4
	 */
Packit 1fb8d4
	server->haveInputBuffer = TRUE;
Packit 1fb8d4
	server->inputBuffer[0].BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
	server->inputBuffer[0].pvBuffer = pSecBuffer->pvBuffer;
Packit 1fb8d4
	server->inputBuffer[0].cbBuffer = pSecBuffer->cbBuffer;
Packit 1fb8d4
	status = test_ntlm_server_authenticate(server);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("test_ntlm_server_authenticate failure\n");
Packit Service 5a9772
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (!DynamicTest)
Packit 1fb8d4
	{
Packit 1fb8d4
		SecPkgContext_AuthNtlmTimestamp AuthNtlmTimestamp;
Packit 1fb8d4
		SecPkgContext_AuthNtlmClientChallenge AuthNtlmClientChallenge;
Packit 1fb8d4
		SecPkgContext_AuthNtlmServerChallenge AuthNtlmServerChallenge;
Packit 1fb8d4
		CopyMemory(AuthNtlmTimestamp.Timestamp, TEST_NTLM_TIMESTAMP, 8);
Packit 1fb8d4
		AuthNtlmTimestamp.ChallengeOrResponse = TRUE;
Packit 1fb8d4
		client->table->SetContextAttributes(&server->context, SECPKG_ATTR_AUTH_NTLM_TIMESTAMP,
Packit Service 5a9772
		                                    &AuthNtlmTimestamp,
Packit Service 5a9772
		                                    sizeof(SecPkgContext_AuthNtlmTimestamp));
Packit 1fb8d4
		AuthNtlmTimestamp.ChallengeOrResponse = FALSE;
Packit 1fb8d4
		client->table->SetContextAttributes(&server->context, SECPKG_ATTR_AUTH_NTLM_TIMESTAMP,
Packit Service 5a9772
		                                    &AuthNtlmTimestamp,
Packit Service 5a9772
		                                    sizeof(SecPkgContext_AuthNtlmTimestamp));
Packit 1fb8d4
		CopyMemory(AuthNtlmClientChallenge.ClientChallenge, TEST_NTLM_CLIENT_CHALLENGE, 8);
Packit 1fb8d4
		CopyMemory(AuthNtlmServerChallenge.ServerChallenge, TEST_NTLM_SERVER_CHALLENGE, 8);
Packit Service 5a9772
		server->table->SetContextAttributes(
Packit Service 5a9772
		    &server->context, SECPKG_ATTR_AUTH_NTLM_CLIENT_CHALLENGE, &AuthNtlmClientChallenge,
Packit Service 5a9772
		    sizeof(SecPkgContext_AuthNtlmClientChallenge));
Packit Service 5a9772
		server->table->SetContextAttributes(
Packit Service 5a9772
		    &server->context, SECPKG_ATTR_AUTH_NTLM_SERVER_CHALLENGE, &AuthNtlmServerChallenge,
Packit Service 5a9772
		    sizeof(SecPkgContext_AuthNtlmServerChallenge));
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	pSecBuffer = &(server->outputBuffer[0]);
Packit 1fb8d4
Packit 1fb8d4
	if (!DynamicTest)
Packit 1fb8d4
	{
Packit 1fb8d4
		SecPkgContext_AuthNtlmMessage AuthNtlmMessage;
Packit 1fb8d4
		pSecBuffer->cbBuffer = sizeof(TEST_NTLM_CHALLENGE) - 1;
Packit Service 5a9772
		pSecBuffer->pvBuffer = (void*)malloc(pSecBuffer->cbBuffer);
Packit 1fb8d4
Packit 1fb8d4
		if (!pSecBuffer->pvBuffer)
Packit 1fb8d4
		{
Packit 1fb8d4
			printf("Memory allocation failed\n");
Packit Service 5a9772
			goto fail;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		CopyMemory(pSecBuffer->pvBuffer, TEST_NTLM_CHALLENGE, pSecBuffer->cbBuffer);
Packit 1fb8d4
		AuthNtlmMessage.type = 2;
Packit 1fb8d4
		AuthNtlmMessage.length = pSecBuffer->cbBuffer;
Packit Service 5a9772
		AuthNtlmMessage.buffer = (BYTE*)pSecBuffer->pvBuffer;
Packit 1fb8d4
		server->table->SetContextAttributes(&server->context, SECPKG_ATTR_AUTH_NTLM_MESSAGE,
Packit Service 5a9772
		                                    &AuthNtlmMessage,
Packit Service 5a9772
		                                    sizeof(SecPkgContext_AuthNtlmMessage));
Packit 1fb8d4
	}
Packit 1fb8d4
Packit Service 5a9772
	fprintf(stderr, "NTLM_CHALLENGE (length = %" PRIu32 "):\n", pSecBuffer->cbBuffer);
Packit Service 5a9772
	winpr_HexDump("sspi.test", WLOG_DEBUG, (BYTE*)pSecBuffer->pvBuffer, pSecBuffer->cbBuffer);
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * Client <- Challenge Message
Packit 1fb8d4
	 * Client -> Authenticate Message
Packit 1fb8d4
	 */
Packit 1fb8d4
	client->haveInputBuffer = TRUE;
Packit 1fb8d4
	client->inputBuffer[0].BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
	client->inputBuffer[0].pvBuffer = pSecBuffer->pvBuffer;
Packit 1fb8d4
	client->inputBuffer[0].cbBuffer = pSecBuffer->cbBuffer;
Packit 1fb8d4
	status = test_ntlm_client_authenticate(client);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("test_ntlm_client_authenticate failure\n");
Packit Service 5a9772
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	pSecBuffer = &(client->outputBuffer[0]);
Packit 1fb8d4
Packit 1fb8d4
	if (!DynamicTest)
Packit 1fb8d4
	{
Packit 1fb8d4
		pSecBuffer->cbBuffer = sizeof(TEST_NTLM_AUTHENTICATE) - 1;
Packit Service 5a9772
		pSecBuffer->pvBuffer = (void*)malloc(pSecBuffer->cbBuffer);
Packit 1fb8d4
Packit 1fb8d4
		if (!pSecBuffer->pvBuffer)
Packit 1fb8d4
		{
Packit 1fb8d4
			printf("Memory allocation failed\n");
Packit Service 5a9772
			goto fail;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		CopyMemory(pSecBuffer->pvBuffer, TEST_NTLM_AUTHENTICATE, pSecBuffer->cbBuffer);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit Service 5a9772
	fprintf(stderr, "NTLM_AUTHENTICATE (length = %" PRIu32 "):\n", pSecBuffer->cbBuffer);
Packit Service 5a9772
	winpr_HexDump("sspi.test", WLOG_DEBUG, (BYTE*)pSecBuffer->pvBuffer, pSecBuffer->cbBuffer);
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * Server <- Authenticate Message
Packit 1fb8d4
	 */
Packit 1fb8d4
	server->haveInputBuffer = TRUE;
Packit 1fb8d4
	server->inputBuffer[0].BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
	server->inputBuffer[0].pvBuffer = pSecBuffer->pvBuffer;
Packit 1fb8d4
	server->inputBuffer[0].cbBuffer = pSecBuffer->cbBuffer;
Packit 1fb8d4
	status = test_ntlm_server_authenticate(server);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("test_ntlm_server_authenticate failure\n");
Packit Service 5a9772
		goto fail;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit Service 5a9772
	rc = 0;
Packit Service 5a9772
Packit Service 5a9772
fail:
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * Cleanup & Termination
Packit 1fb8d4
	 */
Packit 1fb8d4
	test_ntlm_client_free(client);
Packit 1fb8d4
	test_ntlm_server_free(server);
Packit Service 5a9772
	return rc;
Packit 1fb8d4
}