Added function sspi_SetAuthIdentityW

This commit is contained in:
akallabeth 2022-03-25 14:10:35 +01:00 committed by akallabeth
parent 905609381f
commit 47bd162065
4 changed files with 90 additions and 51 deletions

View File

@ -84,7 +84,7 @@ BOOL ntlm_client_init(rdpNtlm* ntlm, BOOL http, LPCSTR user, LPCSTR domain, LPCS
if (!ntlm->table)
return FALSE;
sspi_SetAuthIdentity(&(ntlm->identity), user, domain, password);
sspi_SetAuthIdentityA(&(ntlm->identity), user, domain, password);
status = ntlm->table->QuerySecurityPackageInfo(NTLM_SSP_NAME, &ntlm->pPackageInfo);
if (status != SEC_E_OK)

View File

@ -783,7 +783,7 @@ static BOOL nla_client_setup_identity(rdpNla* nla)
{
if (settings->PasswordHash && strlen(settings->PasswordHash) == 32)
{
if (sspi_SetAuthIdentity(nla->identity, settings->Username, settings->Domain,
if (sspi_SetAuthIdentityA(nla->identity, settings->Username, settings->Domain,
settings->PasswordHash) < 0)
return -1;
@ -799,7 +799,7 @@ static BOOL nla_client_setup_identity(rdpNla* nla)
if (usePassword)
{
if (sspi_SetAuthIdentity(nla->identity, settings->Username, settings->Domain,
if (sspi_SetAuthIdentityA(nla->identity, settings->Username, settings->Domain,
settings->Password) < 0)
return -1;
}
@ -2006,6 +2006,12 @@ fail:
BOOL nla_read_ts_password_creds(rdpNla* nla, wStream* s)
{
size_t length;
size_t userLen = 0;
size_t domainLen = 0;
size_t passwordLen = 0;
WCHAR* user = NULL;
WCHAR* domain = NULL;
WCHAR* password = NULL;
WINPR_ASSERT(nla);
WINPR_ASSERT(s);
@ -2036,61 +2042,37 @@ BOOL nla_read_ts_password_creds(rdpNla* nla, wStream* s)
return FALSE;
}
nla->identity->DomainLength = (UINT32)length;
domainLen = length / sizeof(WCHAR);
if (length > 0)
domain = Stream_Pointer(s);
if (nla->identity->DomainLength > 0)
{
nla->identity->Domain = (UINT16*)malloc(length);
if (!nla->identity->Domain)
if (!Stream_SafeSeek(s, length))
return FALSE;
CopyMemory(nla->identity->Domain, Stream_Pointer(s), nla->identity->DomainLength);
Stream_Seek(s, nla->identity->DomainLength);
nla->identity->DomainLength /= 2;
}
/* [1] userName (OCTET STRING) */
if (!ber_read_contextual_tag(s, 1, &length, TRUE) || !ber_read_octet_string_tag(s, &length))
{
return FALSE;
}
nla->identity->UserLength = (UINT32)length;
if (nla->identity->UserLength > 0)
{
nla->identity->User = (UINT16*)malloc(length);
if (!nla->identity->User)
return FALSE;
CopyMemory(nla->identity->User, Stream_Pointer(s), nla->identity->UserLength);
Stream_Seek(s, nla->identity->UserLength);
nla->identity->UserLength /= 2;
}
userLen = length / sizeof(WCHAR);
if (length > 0)
user = Stream_Pointer(s);
if (!Stream_SafeSeek(s, length))
return FALSE;
/* [2] password (OCTET STRING) */
if (!ber_read_contextual_tag(s, 2, &length, TRUE) || !ber_read_octet_string_tag(s, &length))
{
return FALSE;
}
nla->identity->PasswordLength = (UINT32)length;
if (nla->identity->PasswordLength > 0)
{
nla->identity->Password = (UINT16*)malloc(length);
if (!nla->identity->Password)
return FALSE;
CopyMemory(nla->identity->Password, Stream_Pointer(s), nla->identity->PasswordLength);
Stream_Seek(s, nla->identity->PasswordLength);
nla->identity->PasswordLength /= 2;
}
passwordLen = length / sizeof(WCHAR);
if (length > 0)
password = Stream_Pointer(s);
return TRUE;
if (!Stream_SafeSeek(s, length))
return FALSE;
return sspi_SetAuthIdentityWithLengthW(nla->identity, user, userLen, domain, domainLen,
password, passwordLen) > 0;
}
static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data, size_t offset)

View File

@ -1228,8 +1228,15 @@ extern "C"
WINPR_API void* sspi_SecBufferAlloc(PSecBuffer SecBuffer, ULONG size);
WINPR_API void sspi_SecBufferFree(PSecBuffer SecBuffer);
WINPR_API int sspi_SetAuthIdentity(SEC_WINNT_AUTH_IDENTITY* identity, const char* user,
#define sspi_SetAuthIdentity sspi_SetAuthIdentityA
WINPR_API int sspi_SetAuthIdentityA(SEC_WINNT_AUTH_IDENTITY* identity, const char* user,
const char* domain, const char* password);
WINPR_API int sspi_SetAuthIdentityW(SEC_WINNT_AUTH_IDENTITY* identity, const WCHAR* user,
const WCHAR* domain, const WCHAR* password);
WINPR_API int sspi_SetAuthIdentityWithLengthW(SEC_WINNT_AUTH_IDENTITY* identity,
const WCHAR* user, size_t userLen,
const WCHAR* domain, size_t domainLen,
const WCHAR* password, size_t passwordLen);
WINPR_API int sspi_SetAuthIdentityWithUnicodePassword(SEC_WINNT_AUTH_IDENTITY* identity,
const char* user, const char* domain,
LPWSTR password, ULONG passwordLength);

View File

@ -19,7 +19,7 @@
*/
#include <winpr/config.h>
#include <winpr/assert.h>
#include <winpr/windows.h>
#include <winpr/crt.h>
@ -318,7 +318,57 @@ void sspi_SecureHandleFree(SecHandle* handle)
free(handle);
}
int sspi_SetAuthIdentity(SEC_WINNT_AUTH_IDENTITY* identity, const char* user, const char* domain,
int sspi_SetAuthIdentityW(SEC_WINNT_AUTH_IDENTITY* identity, const WCHAR* user, const WCHAR* domain,
const WCHAR* password)
{
return sspi_SetAuthIdentityWithLengthW(identity, user, user ? _wcslen(user) : 0, domain,
domain ? _wcslen(domain) : 0, password,
password ? _wcslen(password) : 0);
}
static BOOL copy(WCHAR** dst, UINT32* dstLen, const WCHAR* what, size_t len)
{
WINPR_ASSERT(dst);
WINPR_ASSERT(dstLen);
WINPR_ASSERT(what);
WINPR_ASSERT(len > 0);
WINPR_ASSERT(_wcsnlen(what, len) == len);
*dst = calloc(sizeof(WCHAR), len + 1);
if (!*dst)
return FALSE;
memcpy(*dst, what, len * sizeof(WCHAR));
*dstLen = len;
return TRUE;
}
int sspi_SetAuthIdentityWithLengthW(SEC_WINNT_AUTH_IDENTITY* identity, const WCHAR* user,
size_t userLen, const WCHAR* domain, size_t domainLen,
const WCHAR* password, size_t passwordLen)
{
WINPR_ASSERT(identity);
sspi_FreeAuthIdentity(identity);
identity->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
if (user)
{
if (!copy(&identity->User, &identity->UserLength, user, userLen))
return -1;
}
if (domain)
{
if (!copy(&identity->Domain, &identity->DomainLength, domain, domainLen))
return -1;
}
if (password)
{
if (!copy(&identity->Password, &identity->PasswordLength, password, passwordLen))
return -1;
}
return 1;
}
int sspi_SetAuthIdentityA(SEC_WINNT_AUTH_IDENTITY* identity, const char* user, const char* domain,
const char* password)
{
int rc;