From f04d64869f3b1de54fb343f28f955584780001b8 Mon Sep 17 00:00:00 2001 From: mataes2007 Date: Sat, 26 Nov 2011 15:41:10 +0000 Subject: Project folders rename part 3 git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@215 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- Dbx_mmap_SA/Dbtool/encryption.cpp | 304 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 Dbx_mmap_SA/Dbtool/encryption.cpp (limited to 'Dbx_mmap_SA/Dbtool/encryption.cpp') diff --git a/Dbx_mmap_SA/Dbtool/encryption.cpp b/Dbx_mmap_SA/Dbtool/encryption.cpp new file mode 100644 index 0000000..aabe3f9 --- /dev/null +++ b/Dbx_mmap_SA/Dbtool/encryption.cpp @@ -0,0 +1,304 @@ +// (C) Artem Shpynov aka FYR and Igonin Vitaliy aka chaos.persei, 2007 - 2008 + +#include "dbtool.h" + +typedef struct{ + void* (__stdcall *GenerateKey)(char* pwd); + void (__stdcall *FreeKey)(void* key); + void (__stdcall *EncryptMem)(BYTE* data, int size, void* key); + void (__stdcall *DecryptMem)(BYTE* data, int size, void* key); + + char* Name; + char* Info; + char* Author; + char* Site; + char* Email; + + DWORD Version; + + WORD uid; +} Cryptor; + +typedef struct{ + char dllname[255]; + HMODULE hLib; + Cryptor* cryptor; +} CryptoModule; + +BOOL CALLBACK DlgStdInProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + +char encryptKey[255]; +size_t encryptKeyLength; + +int wrongPass = 0; +void* key; + +Cryptor* CryptoEngine = NULL; + +int ModulesCount = 0; +CryptoModule* Modules[100]; + + +void zero_fill(BYTE * pBuf, size_t bufSize) +{ + size_t i; + for(i = 0; i < bufSize; i++) + pBuf[i] = 0; +} + +void InitSecurity() +{ + HMODULE hLib; + WIN32_FIND_DATAA fd; + + Cryptor* (__stdcall *GetCryptor)(); + + { + TCHAR szMirandaDir[MAX_PATH]; + szMirandaDir[ 0 ] = 0; + TCHAR *str2; + GetModuleFileName(NULL,szMirandaDir,SIZEOF(szMirandaDir)); + str2 = _tcsrchr(szMirandaDir,'\\'); + if( str2 != NULL ) + *str2=0; + _tchdir(szMirandaDir); + } + + HANDLE hFile = FindFirstFileA(".\\plugins\\cryptors\\*.dll", &fd); + + AddToStatus(STATUS_MESSAGE,TranslateT("Scanning cryptors directory")); + + ModulesCount = 0; + while (hFile != INVALID_HANDLE_VALUE) + { + char tmp[MAX_PATH], buf[255]; + strcpy(tmp, ".\\plugins\\cryptors\\"); + strcat(tmp, fd.cFileName); + + hLib = LoadLibraryA(tmp); + if(hLib){ + GetCryptor = (Cryptor* (__stdcall *)()) GetProcAddress(hLib, "GetCryptor"); + if(GetCryptor){ + TCHAR Name[100], Version[100], DllName[100]; + + + Modules[ModulesCount] = (CryptoModule*) malloc(sizeof(CryptoModule)); + Modules[ModulesCount]->cryptor = GetCryptor(); + strcpy(Modules[ModulesCount]->dllname, fd.cFileName); + Modules[ModulesCount]->hLib = hLib; + + _snprintf(buf,SIZEOF(buf),"%d.%d.%d.%d", HIBYTE(HIWORD(Modules[ModulesCount]->cryptor->Version)), LOBYTE(HIWORD(Modules[ModulesCount]->cryptor->Version)), HIBYTE(LOWORD(Modules[ModulesCount]->cryptor->Version)), LOBYTE(LOWORD(Modules[ModulesCount]->cryptor->Version))); +#ifdef _UNICODE + mbstowcs(Name, Modules[ModulesCount]->cryptor->Name, 100); + mbstowcs(Version, buf, 100); + mbstowcs(DllName, Modules[ModulesCount]->dllname, 100); +#else + strcpy(Name, Modules[ModulesCount]->cryptor->Name); + strcpy(Version, buf); + strcpy(DllName, Modules[ModulesCount]->dllname); +#endif + AddToStatus(STATUS_MESSAGE,TranslateT("Cryptor loaded: %s [%s] (%s)"), Name, Version, DllName); + + ModulesCount++; + }else{ + FreeLibrary(hLib); + } + } + if(ModulesCount >= 100) break; + if(!FindNextFileA(hFile, &fd)) break; + } + + AddToStatus(STATUS_MESSAGE,TranslateT("%d crypto modules loaded"), ModulesCount); +} + +void UnloadSecurity() +{ + int i; + + if(CryptoEngine) CryptoEngine->FreeKey(key); + + for(i = 0; i < ModulesCount; i++) + { + FreeLibrary(Modules[i]->hLib); + free(Modules[i]); + } +} + +void EncoderInit() +{ + encryptKey[encryptKeyLength] = 0; + key = CryptoEngine->GenerateKey(encryptKey); +} + +void EncodeCopyMemory(BYTE * dst, void * src, size_t size ) +{ + memcpy(dst, src, size); + CryptoEngine->EncryptMem(dst, (int)size, key); +} + +void DecodeCopyMemory(BYTE * dst, void * src, size_t size ) +{ + memcpy(dst, src, size); + CryptoEngine->DecryptMem(dst, (int)size, key); +} + + +void EncodeMemory(BYTE * mem, size_t size) +{ + CryptoEngine->EncryptMem(mem, (int)size, key); +} + +void DecodeMemory(BYTE * mem, size_t size) +{ + CryptoEngine->DecryptMem(mem, (int)size, key); +} + +int bCheckingPass = 0; + +int CheckPassword(WORD checkWord, WORD cryptorUID, char * szDBName) +{ + WORD ver; + int res; + + if(bCheckingPass) return 0; + bCheckingPass = 1; + + { + int i; + int Found = 0; + for(i = 0; i < ModulesCount; i++){ + if(cryptorUID == Modules[i]->cryptor->uid){ + CryptoEngine = Modules[i]->cryptor; + Found = 1; + break; + } + } + if(!Found){ + AddToStatus(STATUS_FATAL, TranslateT("Sorry, but your database encrypted with unknown module"), MB_OK); + bCheckingPass = 0; + return 0; + } + } + + { + wchar_t Name[100], Author[100]; + + mbstowcs(Name, CryptoEngine->Name, 100); + mbstowcs(Author, CryptoEngine->Author, 100); + + AddToStatus(STATUS_MESSAGE, TranslateT("Database encrypted with %s by %s"), Name, Author); + } + + while(1){ + res = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_LOGIN), NULL, (DLGPROC)DlgStdInProc, (LPARAM)szDBName); + if(res == IDCANCEL) + { + wrongPass = 0; + bCheckingPass = 0; + return 0; + } + if(encryptKeyLength < 1) continue; + EncoderInit(); + DecodeCopyMemory((BYTE*)&ver, &checkWord, sizeof(checkWord)); + if(ver == 0x5195) + { + wrongPass = 0; + bCheckingPass = 0; + return 1; + } + wrongPass++; + } + + bCheckingPass = 0; +} + + +UINT oldLangID = 0; +void LanguageChanged(HWND hDlg) +{ + UINT LangID = (UINT)GetKeyboardLayout(0); + char Lang[3] = {0}; + if (LangID != oldLangID) + { + oldLangID = LangID; + GetLocaleInfoA(MAKELCID((LangID & 0xffffffff), SORT_DEFAULT), LOCALE_SABBREVLANGNAME, Lang, 2); + SetDlgItemTextA(hDlg, IDC_LANG, Lang); + } +} + +BOOL CALLBACK DlgStdInProc(HWND hDlg, UINT uMsg,WPARAM wParam,LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { + HWND hwndCtrl; +// if(pluginLink && ServiceExists(MS_LANGPACK_TRANSLATEDIALOG)) + TranslateDialog(hDlg); + + if(lParam && !wrongPass) SetDlgItemTextA(hDlg, IDC_DBNAME, (LPCSTR)lParam); + if(wrongPass) + { + if (wrongPass > 2) + { + hwndCtrl = GetDlgItem(hDlg, IDC_USERPASS); + EnableWindow(hwndCtrl, FALSE); + hwndCtrl = GetDlgItem(hDlg, IDOK); + EnableWindow(hwndCtrl, FALSE); + + SetDlgItemText(hDlg, IDC_LOGININFO, TranslateT("Too many errors!")); + + } + else + { + SetDlgItemText(hDlg, IDC_LOGININFO, TranslateT("Password is not correct!")); + } + } + oldLangID = 0; + SetTimer(hDlg,1,200,NULL); + LanguageChanged(hDlg); + return TRUE; + } + + case WM_CTLCOLORSTATIC: + { + if ((HWND)lParam == GetDlgItem(hDlg, IDC_LANG)) + { + SetTextColor((HDC)wParam, GetSysColor(COLOR_HIGHLIGHTTEXT)); + SetBkMode((HDC)wParam, TRANSPARENT); + return (BOOL)GetSysColorBrush(COLOR_HIGHLIGHT); + } + + return FALSE; + } + + case WM_COMMAND: + { + UINT uid = LOWORD(wParam); + + if(uid == IDOK){ + if(!GetWindowLongPtr(hDlg,GWLP_USERDATA)) + { + encryptKeyLength = GetDlgItemTextA(hDlg, IDC_USERPASS, encryptKey, 254); + EndDialog(hDlg,IDOK); + }else{ + + } + }else if(uid == IDCANCEL){ + EndDialog(hDlg,IDCANCEL); + } + } + case WM_TIMER: + { + LanguageChanged(hDlg); + return FALSE; + } + case WM_DESTROY: + { + KillTimer(hDlg, 1); + return FALSE; + } + } + + return FALSE; +} -- cgit v1.2.3