mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
236 lines
5.7 KiB
236 lines
5.7 KiB
/*****************************************************************/
|
|
/** Microsoft Windows for Workgroups **/
|
|
/** Copyright (C) Microsoft Corp., 1991-1992 **/
|
|
/*****************************************************************/
|
|
|
|
|
|
/*
|
|
cache.c
|
|
Memory based Password caching support
|
|
|
|
FILE HISTORY:
|
|
|
|
davidar 12/30/93 Created
|
|
|
|
*/
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
#include <security.h>
|
|
#include <ntlmsspi.h>
|
|
#include <crypt.h>
|
|
#include <cred.h>
|
|
#include <debug.h>
|
|
#include <ctype.h>
|
|
#include <rpc.h>
|
|
|
|
BOOL
|
|
SspGetWorkstation(
|
|
PSSP_CREDENTIAL Credential
|
|
);
|
|
|
|
static PSSP_CREDENTIAL Cache = NULL;
|
|
|
|
void
|
|
CacheInitializeCache(
|
|
)
|
|
{
|
|
}
|
|
|
|
BOOL
|
|
CacheGetPassword(
|
|
PSSP_CREDENTIAL Credential
|
|
)
|
|
{
|
|
ASSERT(Credential != NULL);
|
|
|
|
ASSERT(Credential->Password == NULL);
|
|
|
|
if (Cache == NULL) {
|
|
return (FALSE);
|
|
}
|
|
|
|
Credential->Password = SspAlloc (sizeof(LM_OWF_PASSWORD));
|
|
if (Credential->Password == NULL) {
|
|
return (FALSE);
|
|
}
|
|
_fmemcpy((PCHAR)Credential->Password, (PCHAR)Cache->Password, sizeof(LM_OWF_PASSWORD));
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
SECURITY_STATUS
|
|
CacheSetCredentials(
|
|
IN PVOID AuthData,
|
|
PSSP_CREDENTIAL Credential
|
|
)
|
|
{
|
|
SEC_WINNT_AUTH_IDENTITY *Identity = AuthData;
|
|
char TmpText[CLEAR_BLOCK_LENGTH*2];
|
|
int Length;
|
|
int i;
|
|
|
|
if (Identity->Domain == NULL)
|
|
return SEC_E_UNKNOWN_CREDENTIALS;
|
|
|
|
Credential->Username = NULL;
|
|
Credential->Domain = NULL;
|
|
Credential->Password = NULL;
|
|
Credential->Workstation = NULL;
|
|
|
|
// If no identity is passed and there is no cached identity, give up.
|
|
if (AuthData == NULL)
|
|
{
|
|
if (Cache == NULL)
|
|
return SEC_E_UNKNOWN_CREDENTIALS;
|
|
}
|
|
|
|
// Save the latest authentication information.
|
|
else
|
|
{
|
|
|
|
// If an old cache entry exists, release its strings.
|
|
if (Cache != NULL)
|
|
{
|
|
if (Cache->Username != NULL)
|
|
SspFree(Cache->Username);
|
|
if (Cache->Domain != NULL)
|
|
SspFree(Cache->Domain);
|
|
if (Cache->Workstation != NULL)
|
|
SspFree(Cache->Workstation);
|
|
if (Cache->Password != NULL)
|
|
SspFree(Cache->Password);
|
|
}
|
|
|
|
// Otherwise, allocate a cache entry
|
|
else
|
|
{
|
|
Cache = (PSSP_CREDENTIAL) SspAlloc (sizeof(SSP_CREDENTIAL));
|
|
if (Cache == NULL) {
|
|
return (SEC_E_INSUFFICIENT_MEMORY);
|
|
}
|
|
}
|
|
|
|
Cache->Username = NULL;
|
|
Cache->Domain = NULL;
|
|
Cache->Password = NULL;
|
|
Cache->Workstation = NULL;
|
|
|
|
Cache->Username = SspAlloc(_fstrlen(Identity->User) + 1);
|
|
if (Cache->Username == NULL) {
|
|
goto cache_failure;
|
|
}
|
|
_fstrcpy(Cache->Username, Identity->User);
|
|
|
|
Cache->Domain = SspAlloc(_fstrlen(Identity->Domain) + 1);
|
|
if (Cache->Domain == NULL) {
|
|
goto cache_failure;
|
|
}
|
|
_fstrcpy(Cache->Domain, Identity->Domain);
|
|
|
|
// If netbios won't tell us the workstation name, make one up.
|
|
if (!SspGetWorkstation(Cache))
|
|
{
|
|
Cache->Workstation = SspAlloc(_fstrlen("none") + 1);
|
|
if (Cache->Workstation == NULL) {
|
|
goto cache_failure;
|
|
}
|
|
_fstrcpy(Cache->Workstation, "none");
|
|
}
|
|
|
|
if (Identity->Password == NULL)
|
|
Length = 0;
|
|
else
|
|
Length = _fstrlen(Identity->Password);
|
|
if (Length > CLEAR_BLOCK_LENGTH * 2)
|
|
goto cache_failure;
|
|
Cache->Password = SspAlloc (sizeof(LM_OWF_PASSWORD));
|
|
if (Cache->Password == NULL) {
|
|
goto cache_failure;
|
|
}
|
|
|
|
// Allow NULL and "\0" passwords by prefilling TmpText with and
|
|
// empty string.
|
|
if (Length == 0)
|
|
TmpText[0] = 0;
|
|
else
|
|
for (i = 0; i <= Length; i++)
|
|
TmpText[i] = toupper(Identity->Password[i]);
|
|
CalculateLmOwfPassword((PLM_PASSWORD)TmpText, Cache->Password);
|
|
}
|
|
|
|
// Copy the credentials for the caller.
|
|
Credential->Username = SspAlloc(_fstrlen(Cache->Username) + 1);
|
|
if (Credential->Username == NULL) {
|
|
goto out_failure;
|
|
}
|
|
_fstrcpy(Credential->Username, Cache->Username);
|
|
|
|
if (_fstrcmp(Cache->Domain, "WORKGROUP") != 0) {
|
|
Credential->Domain = SspAlloc(_fstrlen(Cache->Domain) + 1);
|
|
if (Credential->Domain == NULL) {
|
|
goto out_failure;
|
|
}
|
|
_fstrcpy(Credential->Domain, Cache->Domain);
|
|
}
|
|
|
|
Credential->Workstation = SspAlloc(_fstrlen(Cache->Workstation) + 1);
|
|
if (Credential->Workstation == NULL) {
|
|
goto out_failure;
|
|
}
|
|
_fstrcpy(Credential->Workstation, Cache->Workstation);
|
|
|
|
Credential->Password = SspAlloc(sizeof(LM_OWF_PASSWORD));
|
|
if (Credential->Password == NULL) {
|
|
goto out_failure;
|
|
}
|
|
_fmemcpy(Credential->Password, Cache->Password, sizeof(LM_OWF_PASSWORD));
|
|
|
|
return (SEC_E_OK);
|
|
|
|
cache_failure:
|
|
|
|
if (Cache->Username != NULL) {
|
|
SspFree(Cache->Username);
|
|
}
|
|
|
|
if (Cache->Domain != NULL) {
|
|
SspFree(Cache->Domain);
|
|
}
|
|
|
|
if (Cache->Workstation != NULL) {
|
|
SspFree(Cache->Workstation);
|
|
}
|
|
|
|
if (Cache->Password != NULL) {
|
|
SspFree(Cache->Password);
|
|
}
|
|
|
|
SspFree(Cache);
|
|
Cache = NULL;
|
|
|
|
out_failure:
|
|
|
|
if (Credential->Username != NULL) {
|
|
SspFree(Credential->Username);
|
|
Credential->Username = NULL;
|
|
}
|
|
|
|
if (Credential->Domain != NULL) {
|
|
SspFree(Credential->Domain);
|
|
Credential->Domain = NULL;
|
|
}
|
|
|
|
if (Credential->Workstation != NULL) {
|
|
SspFree(Credential->Workstation);
|
|
Credential->Workstation = NULL;
|
|
}
|
|
|
|
if (Credential->Password != NULL) {
|
|
SspFree(Credential->Password);
|
|
Credential->Password = NULL;
|
|
}
|
|
|
|
return (SEC_E_INSUFFICIENT_MEMORY);
|
|
}
|
|
|
|
|