Leaked source code of windows server 2003
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.
 
 
 
 
 
 

224 lines
4.2 KiB

/* Copyright (c) 1994, Microsoft Corporation, all rights reserved
**
** pwutil.c
** Remote Access
** Password handling routines
**
** 03/01/94 Steve Cobb
*/
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#define INCL_PWUTIL
#include <ppputil.h>
#define PASSWORDMAGIC 0xA5
VOID ReverseString( CHAR* psz );
CHAR*
DecodePw(
IN CHAR chSeed,
IN OUT CHAR* pszPassword )
/* Un-obfuscate 'pszPassword' in place.
**
** Returns the address of 'pszPassword'.
*/
{
return EncodePw( chSeed, pszPassword );
}
CHAR*
EncodePw(
IN CHAR chSeed,
IN OUT CHAR* pszPassword )
/* Obfuscate 'pszPassword' in place to foil memory scans for passwords.
**
** Returns the address of 'pszPassword'.
*/
{
if (pszPassword)
{
CHAR* psz;
ReverseString( pszPassword );
for (psz = pszPassword; *psz != '\0'; ++psz)
{
if (*psz != chSeed)
*psz ^= chSeed;
/*
if (*psz != (CHAR)PASSWORDMAGIC)
*psz ^= PASSWORDMAGIC;
*/
}
}
return pszPassword;
}
VOID
ReverseString(
CHAR* psz )
/* Reverses order of characters in 'psz'.
*/
{
CHAR* pszBegin;
CHAR* pszEnd;
for (pszBegin = psz, pszEnd = psz + strlen( psz ) - 1;
pszBegin < pszEnd;
++pszBegin, --pszEnd)
{
CHAR ch = *pszBegin;
*pszBegin = *pszEnd;
*pszEnd = ch;
}
}
CHAR*
WipePw(
IN OUT CHAR* pszPassword )
/* Zero out the memory occupied by a password.
**
** Returns the address of 'pszPassword'.
*/
{
if (pszPassword)
{
CHAR* psz = pszPassword;
while (*psz != '\0')
*psz++ = '\0';
}
return pszPassword;
}
DWORD
EncodePassword(
DWORD cbPassword,
PBYTE pbPassword,
DATA_BLOB * pDataBlobPassword)
{
DWORD dwErr = NO_ERROR;
DATA_BLOB DataBlobIn;
if(NULL == pDataBlobPassword)
{
dwErr = E_INVALIDARG;
goto done;
}
if( (0 == cbPassword)
|| (NULL == pbPassword))
{
//
// nothing to encrypt. just return success
//
goto done;
}
ZeroMemory(pDataBlobPassword, sizeof(DATA_BLOB));
DataBlobIn.cbData = cbPassword;
DataBlobIn.pbData = pbPassword;
if(!CryptProtectData(
&DataBlobIn,
NULL,
NULL,
NULL,
NULL,
CRYPTPROTECT_UI_FORBIDDEN |
CRYPTPROTECT_LOCAL_MACHINE,
pDataBlobPassword))
{
dwErr = GetLastError();
goto done;
}
done:
return dwErr;
}
DWORD
DecodePassword(
DATA_BLOB * pDataBlobPassword,
DWORD * pcbPassword,
PBYTE * ppbPassword)
{
DWORD dwErr = NO_ERROR;
DATA_BLOB DataOut;
if( (NULL == pDataBlobPassword)
|| (NULL == pcbPassword)
|| (NULL == ppbPassword))
{
dwErr = E_INVALIDARG;
goto done;
}
*pcbPassword = 0;
*ppbPassword = NULL;
if( (NULL == pDataBlobPassword->pbData)
|| (0 == pDataBlobPassword->cbData))
{
//
// nothing to decrypt. Just return success.
//
goto done;
}
ZeroMemory(&DataOut, sizeof(DATA_BLOB));
if(!CryptUnprotectData(
pDataBlobPassword,
NULL,
NULL,
NULL,
NULL,
CRYPTPROTECT_UI_FORBIDDEN |
CRYPTPROTECT_LOCAL_MACHINE,
&DataOut))
{
dwErr = GetLastError();
goto done;
}
*pcbPassword = DataOut.cbData;
*ppbPassword = DataOut.pbData;
done:
return dwErr;
}
VOID
FreePassword(DATA_BLOB *pDBPassword)
{
if(NULL == pDBPassword)
{
return;
}
if(NULL != pDBPassword->pbData)
{
RtlSecureZeroMemory(pDBPassword->pbData, pDBPassword->cbData);
LocalFree(pDBPassword->pbData);
}
ZeroMemory(pDBPassword, sizeof(DATA_BLOB));
}