summaryrefslogtreecommitdiff
path: root/plugins/CryptoPP/cpp_gpgw.cpp
diff options
context:
space:
mode:
authorVadim Dashevskiy <watcherhd@gmail.com>2012-05-15 10:38:20 +0000
committerVadim Dashevskiy <watcherhd@gmail.com>2012-05-15 10:38:20 +0000
commit48540940b6c28bb4378abfeb500ec45a625b37b6 (patch)
tree2ef294c0763e802f91d868bdef4229b6868527de /plugins/CryptoPP/cpp_gpgw.cpp
parent5c350913f011e119127baeb32a6aedeb4f0d33bc (diff)
initial commit
git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/CryptoPP/cpp_gpgw.cpp')
-rw-r--r--plugins/CryptoPP/cpp_gpgw.cpp334
1 files changed, 334 insertions, 0 deletions
diff --git a/plugins/CryptoPP/cpp_gpgw.cpp b/plugins/CryptoPP/cpp_gpgw.cpp
new file mode 100644
index 0000000000..f053ef8085
--- /dev/null
+++ b/plugins/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