|
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 |
}
|