summaryrefslogtreecommitdiff
path: root/plugins/Dbx_mmap_SA/Dbtool/src/encryption.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Dbx_mmap_SA/Dbtool/src/encryption.cpp')
-rw-r--r--plugins/Dbx_mmap_SA/Dbtool/src/encryption.cpp299
1 files changed, 299 insertions, 0 deletions
diff --git a/plugins/Dbx_mmap_SA/Dbtool/src/encryption.cpp b/plugins/Dbx_mmap_SA/Dbtool/src/encryption.cpp
new file mode 100644
index 0000000000..1e7b264efa
--- /dev/null
+++ b/plugins/Dbx_mmap_SA/Dbtool/src/encryption.cpp
@@ -0,0 +1,299 @@
+// (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)));
+
+ mbstowcs(Name, Modules[ModulesCount]->cryptor->Name, 100);
+ mbstowcs(Version, buf, 100);
+ mbstowcs(DllName, Modules[ModulesCount]->dllname, 100);
+
+ 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;
+ TranslateDialogDefault(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;
+}