From cb4a46e7fbe62d788e66ed6121c717a2d22a4d7c Mon Sep 17 00:00:00 2001 From: watcherhd Date: Thu, 21 Apr 2011 14:14:52 +0000 Subject: svn.miranda.im is moving to a new home! git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@7 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- cryptopp/cpp_gpgw.cpp | 334 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 334 insertions(+) create mode 100644 cryptopp/cpp_gpgw.cpp (limited to 'cryptopp/cpp_gpgw.cpp') diff --git a/cryptopp/cpp_gpgw.cpp b/cryptopp/cpp_gpgw.cpp new file mode 100644 index 0000000..f053ef8 --- /dev/null +++ b/cryptopp/cpp_gpgw.cpp @@ -0,0 +1,334 @@ +#include "commonheaders.h" + + +HMODULE hgpg; +HRSRC hRS_gpg; +PBYTE pRS_gpg; + +extern DLLEXPORT int __cdecl _gpg_init(void); +extern DLLEXPORT int __cdecl _gpg_done(void); +extern DLLEXPORT int __cdecl _gpg_open_keyrings(LPSTR,LPSTR); +extern DLLEXPORT int __cdecl _gpg_close_keyrings(void); +extern DLLEXPORT void __cdecl _gpg_set_log(LPCSTR); +extern DLLEXPORT void __cdecl _gpg_set_tmp(LPCSTR); +extern DLLEXPORT LPSTR __cdecl _gpg_get_error(void); +extern DLLEXPORT int __cdecl _gpg_size_keyid(void); +extern DLLEXPORT int __cdecl _gpg_select_keyid(HWND,LPSTR); +extern DLLEXPORT LPSTR __cdecl _gpg_encrypt(LPCSTR,LPCSTR); +extern DLLEXPORT LPSTR __cdecl _gpg_decrypt(LPCSTR); +extern DLLEXPORT LPSTR __cdecl _gpg_get_passphrases(); +extern DLLEXPORT void __cdecl _gpg_set_passphrases(LPCSTR); + +int __cdecl _gpg_init(void); +int __cdecl _gpg_done(void); +int __cdecl _gpg_open_keyrings(LPSTR,LPSTR); +int __cdecl _gpg_close_keyrings(void); +void __cdecl _gpg_set_log(LPCSTR); +void __cdecl _gpg_set_tmp(LPCSTR); +LPSTR __cdecl _gpg_get_error(void); +int __cdecl _gpg_size_keyid(void); +int __cdecl _gpg_select_keyid(HWND,LPSTR); +LPSTR __cdecl _gpg_encrypt(LPCSTR,LPCSTR); +LPSTR __cdecl _gpg_decrypt(LPCSTR); +LPSTR __cdecl _gpg_get_passphrases(); +void __cdecl _gpg_set_passphrases(LPCSTR); + +int (__cdecl *p_gpg_init)(void); +int (__cdecl *p_gpg_done)(void); +int (__cdecl *p_gpg_open_keyrings)(LPSTR,LPSTR); +int (__cdecl *p_gpg_close_keyrings)(void); +void (__cdecl *p_gpg_set_log)(LPCSTR); +void (__cdecl *p_gpg_set_tmp)(LPCSTR); +LPSTR (__cdecl *p_gpg_get_error)(void); +int (__cdecl *p_gpg_size_keyid)(void); +int (__cdecl *p_gpg_select_keyid)(HWND,LPSTR); +LPSTR (__cdecl *p_gpg_encrypt)(LPCSTR,LPCSTR); +LPSTR (__cdecl *p_gpg_decrypt)(LPCSTR); +LPSTR (__cdecl *p_gpg_get_passphrases)(); +void (__cdecl *p_gpg_set_passphrases)(LPCSTR); + + +#define GPA(x) \ + { \ + *((PVOID*)&p##x) = (PVOID)GetProcAddress(mod, TEXT(#x)); \ + if (!p##x) { \ + return 0; \ + } \ + } + +int load_gpg_dll(HMODULE mod) { + + GPA(_gpg_init); + GPA(_gpg_done); + GPA(_gpg_open_keyrings); + GPA(_gpg_close_keyrings); + GPA(_gpg_set_log); + GPA(_gpg_set_tmp); + GPA(_gpg_get_error); + GPA(_gpg_size_keyid); + GPA(_gpg_select_keyid); + GPA(_gpg_encrypt); + GPA(_gpg_decrypt); + GPA(_gpg_get_passphrases); + GPA(_gpg_set_passphrases); + + return 1; +} + +#undef GPA + + +#define GPA(x) \ + { \ + *((PVOID*)&p##x) = (PVOID)MemGetProcAddress(mod, TEXT(#x)); \ + if (!p##x) { \ + return 0; \ + } \ + } + +int load_gpg_mem(HMODULE mod) { + + GPA(_gpg_init); + GPA(_gpg_done); + GPA(_gpg_open_keyrings); + GPA(_gpg_close_keyrings); + GPA(_gpg_set_log); + GPA(_gpg_set_tmp); + GPA(_gpg_get_error); + GPA(_gpg_size_keyid); + GPA(_gpg_select_keyid); + GPA(_gpg_encrypt); + GPA(_gpg_decrypt); + GPA(_gpg_get_passphrases); + GPA(_gpg_set_passphrases); + + return 1; +} + +#undef GPA + + +int __cdecl gpg_init() +{ + int r; char t[MAX_PATH]; + if( isVista ){ + sprintf(t,"%s\\gnupgw.dll",TEMP); + ExtractFile(t,666,1); + hgpg = LoadLibraryA(t); + } + else { + hRS_gpg = FindResource( g_hInst, MAKEINTRESOURCE(1), MAKEINTRESOURCE(666) ); + pRS_gpg = (PBYTE) LoadResource( g_hInst, hRS_gpg ); LockResource( pRS_gpg ); + hgpg = MemLoadLibrary( pRS_gpg ); + } + if (hgpg) { + if( isVista ) load_gpg_dll(hgpg); + else load_gpg_mem(hgpg); + r = p_gpg_init(); + if(r) { + return r; + } + if( isVista ){ + FreeLibrary(hgpg); + } + else { + MemFreeLibrary(hgpg); + UnlockResource( pRS_gpg ); + FreeResource( pRS_gpg ); + } + } + + hgpg = 0; + + return 0; +} + + +int __cdecl gpg_done() +{ + int r = 0; + if(hgpg) { + r = p_gpg_done(); + if( isVista ){ + FreeLibrary(hgpg); + } + else { + MemFreeLibrary(hgpg); + UnlockResource( pRS_gpg ); + FreeResource( pRS_gpg ); + } + hgpg = 0; + } + return r; +} + + +int __cdecl gpg_open_keyrings(LPSTR ExecPath, LPSTR HomePath) +{ + return p_gpg_open_keyrings(ExecPath, HomePath); +} + + +int __cdecl gpg_close_keyrings() +{ + return p_gpg_close_keyrings(); +} + + +void __cdecl gpg_set_log(LPCSTR LogPath) +{ + p_gpg_set_log(LogPath); +} + + +void __cdecl gpg_set_tmp(LPCSTR TmpPath) +{ + p_gpg_set_tmp(TmpPath); +} + + +LPSTR __cdecl gpg_get_error() +{ + return p_gpg_get_error(); +} + + +LPSTR __cdecl gpg_encrypt(pCNTX ptr, LPCSTR szPlainMsg) +{ + ptr->error = ERROR_NONE; + pGPGDATA p = (pGPGDATA) ptr->pdata; + SAFE_FREE(ptr->tmp); + + LPSTR szEncMsg; + szEncMsg = p_gpg_encrypt(szPlainMsg,(LPCSTR)p->gpgKeyID); + if(!szEncMsg) return 0; + + ptr->tmp = (LPSTR) strdup(szEncMsg); + LocalFree((LPVOID)szEncMsg); + + return ptr->tmp; +} + + +LPSTR __cdecl gpg_decrypt(pCNTX ptr, LPCSTR szEncMsg) +{ + ptr->error = ERROR_NONE; + SAFE_FREE(ptr->tmp); + + LPSTR szPlainMsg = p_gpg_decrypt(szEncMsg); +/* if(!szPlainMsg) { + ptr = get_context_on_id(hPGPPRIV); // find private pgp keys + if(ptr && ptr->pgpKey) + szPlainMsg = p_gpg_decrypt_key(szEncMsg,(LPCSTR)ptr->pgpKey); + if(!szPlainMsg) return NULL; + }*/ + + ptr->tmp = (LPSTR) strdup(szPlainMsg); + LocalFree((LPVOID)szPlainMsg); + + return ptr->tmp; +} + + +LPSTR __cdecl gpg_encode(HANDLE context, LPCSTR szPlainMsg) +{ + pCNTX ptr = get_context_on_id(context); if(!ptr) return NULL; + pGPGDATA p = (pGPGDATA) cpp_alloc_pdata(ptr); + if(!p->gpgKeyID) { ptr->error = ERROR_NO_GPG_KEY; return NULL; } + + // utf8 message: encrypt. + LPSTR szUtfMsg; + if( ptr->mode & MODE_GPG_ANSI ) { + LPWSTR wszMsg = utf8decode(szPlainMsg); + int wlen = wcslen(wszMsg)+1; + szUtfMsg = (LPSTR) alloca(wlen); + WideCharToMultiByte(CP_ACP, 0, wszMsg, -1, szUtfMsg, wlen, 0, 0); + } + else { + szUtfMsg = (LPSTR)szPlainMsg; + } + return gpg_encrypt(ptr, szUtfMsg); +} + + +LPSTR __cdecl gpg_decode(HANDLE context, LPCSTR szEncMsg) +{ + pCNTX ptr = get_context_on_id(context); + if(!ptr) return NULL; + + LPSTR szNewMsg = NULL; + LPSTR szOldMsg = gpg_decrypt(ptr, szEncMsg); + + if(szOldMsg) { + if( !is_7bit_string(szOldMsg) && !is_utf8_string(szOldMsg) ) { + int slen = strlen(szOldMsg)+1; + LPWSTR wszMsg = (LPWSTR) alloca(slen*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, szOldMsg, -1, wszMsg, slen*sizeof(WCHAR)); + szNewMsg = _strdup(utf8encode(wszMsg)); + } + else { + szNewMsg = _strdup(szOldMsg); + } + } + SAFE_FREE(ptr->tmp); + ptr->tmp = szNewMsg; + return szNewMsg; +} + + +int __cdecl gpg_set_key(HANDLE context, LPCSTR RemoteKey) +{ +/* pCNTX ptr = get_context_on_id(context); + if(!ptr) return 0; + ptr->error = ERROR_NONE; + +// if(!p_gpg_check_key(RemoteKey)) return 0; + + SAFE_FREE(ptr->pgpKey); + ptr->pgpKey = (BYTE *) malloc(strlen(RemoteKey)+1); + strcpy((LPSTR)ptr->pgpKey,RemoteKey); + + return 1; +*/ + return 0; +} + + +int __cdecl gpg_set_keyid(HANDLE context, LPCSTR RemoteKeyID) +{ + pCNTX ptr = get_context_on_id(context); if(!ptr) return 0; + pGPGDATA p = (pGPGDATA) cpp_alloc_pdata(ptr); + ptr->error = ERROR_NONE; + + SAFE_FREE(p->gpgKeyID); + p->gpgKeyID = (PBYTE) strdup(RemoteKeyID); + + return 1; +} + + +int __cdecl gpg_size_keyid() +{ + return p_gpg_size_keyid(); +} + + +int __cdecl gpg_select_keyid(HWND hDlg,LPSTR szKeyID) +{ + return p_gpg_select_keyid(hDlg,szKeyID); +} + + +LPSTR __cdecl gpg_get_passphrases() +{ + return p_gpg_get_passphrases(); +} + + +void __cdecl gpg_set_passphrases(LPCSTR buffer) +{ + p_gpg_set_passphrases(buffer); +} + + +// EOF \ No newline at end of file -- cgit v1.2.3