/* Copyright (c) 1992-2001, Microsoft Corporation, all rights reserved ** ** pcache.h ** Remote Access Phonebook - Win9x Password cache (PWL) decrypter ** Private header ** ** Portions of this code have been ported from: ** Win9x\proj\net\user\src\WNET\PCACHE ** ** Whistler bug: 208318 Win9x Upg: Username and Password for DUN connectoid not ** migrated from Win9x to Whistler ** ** 06/24/92 gregj ** 03/06/01 Jeff Sigman */ #ifndef _PCACHE_H_ #define _PCACHE_H_ //---------------------------------------------------------------------------- // Constants //---------------------------------------------------------------------------- #define IERR_PCACHE_BASE 7200 #define IERR_BadSig (IERR_PCACHE_BASE + 1) #define IERR_CacheEntryNotFound (IERR_PCACHE_BASE + 4) #define IERR_IncorrectUsername (IERR_PCACHE_BASE + 6) #define IERR_CacheCorrupt (IERR_PCACHE_BASE + 7) #define PLAINTEXT_SIGNATURE 0x4E464DB0 #define NEW_PLAINTEXT_SIGNATURE 0x968582E3 #define PCE_END_MARKER 0x8000 #define BUCKET_COUNT 16 #define RAS_MaxPortName MAX_PATH #define MAX_ENTRY_SIZE 250 // so total file size < 64K #define PCE_MISC 0x06 // entry is for some other resource #define MAX_PHONENUMBER_SIZE 128 #define MAX_CALLBACKNUMBER_SIZE MAX_PHONENUMBER_SIZE #define DLPARAMS_MASK_USERNAME 0x00000001 #define DLPARAMS_MASK_PASSWORD 0x00000002 #define DLPARAMS_MASK_DOMAIN 0x00000004 #define DLPARAMS_MASK_OLDSTYLE 0x80000000 #define S_RESOURCEMASK2 "*Rna\\%s\\%s" #define S_SRCHPWL "*.PWL" #define S_PWLDIR "\\Pwls" //---------------------------------------------------------------------------- // Datatypes //---------------------------------------------------------------------------- typedef struct { USHORT cbResource; USHORT cbPassword; UCHAR iEntry; UCHAR nType; USHORT dchResource; USHORT dchPassword; } CACHE_ENTRY_INFO; typedef struct { USHORT cbEntry; USHORT cbResource; USHORT cbPassword; UCHAR iEntry; UCHAR nType; CHAR abResource[ 1 ]; } PASSWORD_CACHE_ENTRY; typedef struct { CHAR abRandomPadding[ 16 ]; CHAR abAuthenticationHash[ 16 ]; USHORT aibBuckets[ BUCKET_COUNT + 1 ]; } NEW_ENCRYPTED_HEADER; typedef struct { USHORT cbBlob; } KEYBLOB; typedef struct { ULONG ulSig; ULONG ulSerial; USHORT cMRUEntries; UCHAR aiOrder[ 255 ]; UCHAR aiBucket[ 255 ]; DWORD cbHeader; DWORD adwBucketSalts[ BUCKET_COUNT + 1 ]; KEYBLOB keyBlobs; } NEW_PLAINTEXT_HEADER; typedef struct _RAS_DIALPARAMS { DWORD DP_Uid; WCHAR DP_PhoneNumber[MAX_PHONENUMBER_SIZE + 1]; WCHAR DP_CallbackNumber[MAX_CALLBACKNUMBER_SIZE + 1]; WCHAR DP_UserName[UNLEN + 1]; WCHAR DP_Password[PWLEN + 1]; WCHAR DP_Domain[DNLEN + 1]; DWORD DP_SubEntry; } RAS_DIALPARAMS, *PRAS_DIALPARAMS; //---------------------------------------------------------------------------- // Macros //---------------------------------------------------------------------------- #define FIELDOFFSET(type,field) (((CHAR*)&(((type*)NULL)->field))-((CHAR*)NULL)) #define BREAK_ON_DWERR(_e) if ((_e)) break; #define NEXT_PCE(pce) ((PASSWORD_CACHE_ENTRY*)(((CHAR*)(pce))+(pce)->cbEntry)) #undef min #define min(a,b) ((a)<(b)?(a):(b)) //---------------------------------------------------------------------------- // Prototypes //---------------------------------------------------------------------------- DWORD (* g_SetEntryDialParams) ( IN PWCHAR pszSid, IN DWORD dwUID, IN DWORD dwSetMask, IN DWORD dwClearMask, IN PRAS_DIALPARAMS lpRasDialParams ); UINT HashName ( const CHAR* pbResource, WORD cbResource ); VOID Encrypt ( CHAR *pbSource, WORD cbSource, CHAR *pbDest ); VOID Decrypt ( CHAR *pbSource, WORD cbSource ); VOID ENCRYPTER ( const CHAR* pszUsername, const CHAR* pszPassword, UINT iBucket, DWORD dwSalt ); DWORD ReadData ( WORD ibSeek, PVOID pbBuffer, WORD cbBuffer ); VOID AssembleFindCacheName ( CHAR* pszWindir, CHAR* pszResult ); DWORD OpenCacheFile ( VOID ); DWORD ReadAndDecrypt ( WORD ibSeek, PVOID pbBuffer, WORD cbBuffer ); INT CompareCacheNames ( const CHAR* pbRes1, WORD cbRes1, const CHAR* pbRes2, WORD cbRes2 ); DWORD LoadEncryptedHeader ( VOID ); DWORD LoadPlaintextHeader ( VOID ); DWORD LookupEntry ( const CHAR* pbResource, WORD cbResource, UCHAR nType, PASSWORD_CACHE_ENTRY** ppce ); DWORD ValidateEncryptedHeader ( VOID ); DWORD FindPWLResource ( const CHAR* pbResource, WORD cbResource, CHAR* pbBuffer, WORD cbBuffer, UCHAR nType ); DWORD FindNewestFile ( IN OUT CHAR* SourceName ); VOID DeleteAllPwls ( VOID ); BOOL StrCpyAFromWUsingAnsiEncoding( LPSTR pszDst, LPCWSTR pszSrc, DWORD dwDstChars ); BOOL StrCpyWFromAUsingAnsiEncoding( WCHAR* pszDst, LPCSTR pszSrc, DWORD dwDstChars ); VOID CopyAndTruncate ( LPSTR lpszDest, LPCSTR lpszSrc, UINT cbDest, BOOL flag ); DWORD OpenPWL ( CHAR* Username, CHAR* Password, BOOL flag ); DWORD FindPWLString ( IN CHAR* EntryName, IN CHAR* ConnUser, IN OUT CHAR* Output ); BOOL MigrateEntryCreds ( IN OUT PRAS_DIALPARAMS prdp, IN PCTSTR pszEntryName, IN PCTSTR pszUserName, IN PDWORD pdwFlag ); #endif // _PCACHE_H_