summaryrefslogtreecommitdiff
path: root/plugins/CryptoPP/src
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/CryptoPP/src')
-rw-r--r--plugins/CryptoPP/src/GPGw/passdialog.cpp2
-rw-r--r--plugins/CryptoPP/src/GPGw/passdialog.h2
-rw-r--r--plugins/CryptoPP/src/GPGw/userdialog.cpp2
-rw-r--r--plugins/CryptoPP/src/GPGw/userdialog.h2
-rw-r--r--plugins/CryptoPP/src/PGPw/sdk8.cpp391
-rw-r--r--plugins/CryptoPP/src/PGPw/sdk8/include/pgpBase.h3
6 files changed, 395 insertions, 7 deletions
diff --git a/plugins/CryptoPP/src/GPGw/passdialog.cpp b/plugins/CryptoPP/src/GPGw/passdialog.cpp
index d00753af9e..f367d66eba 100644
--- a/plugins/CryptoPP/src/GPGw/passdialog.cpp
+++ b/plugins/CryptoPP/src/GPGw/passdialog.cpp
@@ -3,7 +3,7 @@
char dlgpassphrase[passphrasesize];
-BOOL CALLBACK PassphraseDialogProcedure(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
+INT_PTR CALLBACK PassphraseDialogProcedure(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch(msg)
{
diff --git a/plugins/CryptoPP/src/GPGw/passdialog.h b/plugins/CryptoPP/src/GPGw/passdialog.h
index b59f421b3c..0bf5b9522b 100644
--- a/plugins/CryptoPP/src/GPGw/passdialog.h
+++ b/plugins/CryptoPP/src/GPGw/passdialog.h
@@ -3,6 +3,6 @@
extern char dlgpassphrase[];
-BOOL CALLBACK PassphraseDialogProcedure(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam);
+INT_PTR CALLBACK PassphraseDialogProcedure(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam);
#endif // __PASSDIALOG_H__
diff --git a/plugins/CryptoPP/src/GPGw/userdialog.cpp b/plugins/CryptoPP/src/GPGw/userdialog.cpp
index 65edcfe278..0227a5d549 100644
--- a/plugins/CryptoPP/src/GPGw/userdialog.cpp
+++ b/plugins/CryptoPP/src/GPGw/userdialog.cpp
@@ -3,7 +3,7 @@
void RefreshListView(HWND hLV);
-BOOL CALLBACK UserIdDialogProcedure(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
+INT_PTR CALLBACK UserIdDialogProcedure(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
{
static char *keyid;
HWND hLV = GetDlgItem(hdlg,IDC_KEYLIST);
diff --git a/plugins/CryptoPP/src/GPGw/userdialog.h b/plugins/CryptoPP/src/GPGw/userdialog.h
index 5f49882a29..acdf0a3bcc 100644
--- a/plugins/CryptoPP/src/GPGw/userdialog.h
+++ b/plugins/CryptoPP/src/GPGw/userdialog.h
@@ -1,6 +1,6 @@
#ifndef __USERDIALOG_H__
#define __USERDIALOG_H__
-BOOL CALLBACK UserIdDialogProcedure(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam);
+INT_PTR CALLBACK UserIdDialogProcedure(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam);
#endif // __USERDIALOG_H__
diff --git a/plugins/CryptoPP/src/PGPw/sdk8.cpp b/plugins/CryptoPP/src/PGPw/sdk8.cpp
new file mode 100644
index 0000000000..61b25a45c5
--- /dev/null
+++ b/plugins/CryptoPP/src/PGPw/sdk8.cpp
@@ -0,0 +1,391 @@
+#include "../commonheaders.h"
+
+#define PGP_WIN32 0x800
+
+#include "sdk8/include/pgpEncode.h"
+#include "sdk8/include/pgpErrors.h"
+#include "sdk8/include/pgpKeys.h"
+#include "sdk8/include/pgpOptionList.h"
+#include "sdk8/include/pgpUserInterface.h"
+#include "sdk8/include/pgpUtilities.h"
+#include "sdk8/include/pgpFeatures.h"
+
+#include "pgpw.h"
+
+#pragma comment(lib, "pgpsdk.lib")
+#pragma comment(lib, "pgpsdknl.lib")
+#pragma comment(lib, "pgpsdkui.lib")
+
+PGPContextRef pgpContext;
+PGPKeyDBRef pgpKeyDB = 0;
+LPSTR pszPassphrase = 0;
+LPSTR pgpErrMsg = 0;
+#define pgpErrMsgLen 512
+extern UINT pgpVer;
+
+
+void ClearPGPError()
+{
+ *pgpErrMsg = '\0';
+}
+
+
+bool CheckPGPError(PGPError err)
+{
+ if (IsPGPError(err)) {
+ PGPSize ErrMsgLen = pgpErrMsgLen;
+ PGPGetErrorString(err, ErrMsgLen, pgpErrMsg);
+ return 1;
+ }
+ else {
+ *pgpErrMsg = '\0';
+ return 0;
+ }
+}
+
+#define _pgp_memcpy memmove
+
+int __cdecl _pgp_init()
+{
+ if (!pgpErrMsg)
+ pgpErrMsg = (LPSTR) LocalAlloc(LPTR,pgpErrMsgLen);
+
+ pgpVer = 0;
+
+ __try {
+ if (CheckPGPError(PGPsdkInit(0)) || CheckPGPError(PGPsdkUILibInit(0))) return 0;
+ PGPNewContext(kPGPsdk20APIVersion, &pgpContext);
+ }
+ __except ( EXCEPTION_EXECUTE_HANDLER ) {
+ return 0;
+ }
+
+ pgpVer = PGPGetPGPsdkVersion();
+ return 1;
+}
+
+
+int __cdecl _pgp_done()
+{
+ pgpVer = 0;
+ __try {
+ if(pgpErrMsg) LocalFree(pgpErrMsg);
+ if (pszPassphrase) PGPFreeData(pszPassphrase);
+ if (pgpKeyDB) PGPFreeKeyDB(pgpKeyDB);
+ PGPFreeContext(pgpContext);
+ PGPsdkUILibCleanup();
+ PGPsdkCleanup();
+ pszPassphrase = pgpErrMsg = 0;
+ pgpKeyDB = 0;
+ pgpContext = 0;
+ }
+ __except ( EXCEPTION_EXECUTE_HANDLER ) {
+ return 0;
+ }
+ return 1;
+}
+
+
+int __cdecl _pgp_open_keyrings(LPSTR PubRingPath, LPSTR SecRingPath)
+{
+ _pgp_close_keyrings();
+
+ if ((!PubRingPath || !*PubRingPath) && !ShowSelectKeyringsDlg(0,PubRingPath,SecRingPath))
+ return 0;
+
+ PGPFileSpecRef PubKeyRing, SecKeyRing;
+ PGPNewFileSpecFromFullPath(pgpContext, PubRingPath, &PubKeyRing);
+ PGPNewFileSpecFromFullPath(pgpContext, SecRingPath, &SecKeyRing);
+
+ PGPError err = PGPOpenKeyDBFile(pgpContext, kPGPOpenKeyDBFileOptions_None, PubKeyRing, SecKeyRing, &pgpKeyDB);
+ PGPFreeFileSpec(SecKeyRing);
+ PGPFreeFileSpec(PubKeyRing);
+
+ if (CheckPGPError(err))
+ return 0;
+
+ return 1;
+}
+
+
+int __cdecl _pgp_close_keyrings()
+{
+ if (pgpKeyDB) {
+ PGPFreeKeyDB(pgpKeyDB);
+ pgpKeyDB = 0;
+ }
+ return 1;
+}
+
+
+int __cdecl _pgp_get_version()
+{
+ return pgpVer;
+}
+
+
+LPSTR __cdecl _pgp_get_error()
+{
+ return pgpErrMsg;
+}
+
+
+LPSTR __cdecl _pgp_encrypt_keydb(LPCSTR szPlainMsg, PVOID pgpKeyID)
+{
+ PGPKeyID *RemoteKeyID = (PGPKeyID *) pgpKeyID;
+ LPSTR szEncMsg = 0;
+ PGPSize dwEncMsgLen;
+
+ ClearPGPError();
+ if (!pgpKeyDB)
+ return 0;
+
+ PGPKeyDBObjRef PublicKey;
+ PGPFindKeyByKeyID(pgpKeyDB, RemoteKeyID, &PublicKey);
+
+ PGPError err = PGPEncode(pgpContext,
+ PGPOInputBuffer(pgpContext, szPlainMsg, lstrlen(szPlainMsg)),
+ PGPOArmorOutput(pgpContext, TRUE),
+ PGPOAllocatedOutputBuffer(pgpContext, (LPVOID *)&szEncMsg, 16384, &dwEncMsgLen),
+ PGPOEncryptToKeyDBObj(pgpContext, PublicKey),
+ PGPOVersionString(pgpContext, szVersionStr),
+ PGPOLastOption(pgpContext));
+
+ if (CheckPGPError(err))
+ return 0;
+
+ LPSTR szMsg = (LPSTR) LocalAlloc(LPTR,dwEncMsgLen+1);
+ _pgp_memcpy(szMsg, szEncMsg, dwEncMsgLen);
+ szMsg[dwEncMsgLen] = 0;
+ PGPFreeData((LPVOID)szEncMsg);
+
+ return szMsg;
+}
+
+LPSTR __cdecl _pgp_decrypt_keydb(LPCSTR szEncMsg)
+{
+ LPSTR szPlainMsg = 0;
+ PGPSize dwPlainMsgLen;
+
+ ClearPGPError();
+ if (!pgpKeyDB)
+ return 0;
+
+ int iTry = 0;
+
+ do {
+ if (!pszPassphrase &&
+ PGPPassphraseDialog(pgpContext,
+ PGPOUIOutputPassphrase(pgpContext, &pszPassphrase),
+ PGPOLastOption(pgpContext)) == kPGPError_UserAbort) {
+ iTry = 3;
+ break;
+ }
+
+ PGPError err = PGPDecode(pgpContext,
+ PGPOInputBuffer(pgpContext, szEncMsg, lstrlen(szEncMsg)),
+ PGPOAllocatedOutputBuffer(pgpContext, (LPVOID *)&szPlainMsg, 16384, &dwPlainMsgLen),
+ PGPOKeyDBRef(pgpContext, pgpKeyDB),
+ PGPOPassphrase(pgpContext, pszPassphrase),
+ PGPOLastOption(pgpContext));
+
+ if (CheckPGPError(err))
+ iTry = 3;
+ else
+ if (!dwPlainMsgLen) {
+ PGPFreeData(pszPassphrase);
+ pszPassphrase = 0;
+ iTry++;
+ }
+
+ } while(!dwPlainMsgLen && iTry<3);
+
+ if(iTry == 3) return 0;
+
+ LPSTR szMsg = (LPSTR) LocalAlloc(LPTR,dwPlainMsgLen+1);
+ _pgp_memcpy(szMsg, szPlainMsg, dwPlainMsgLen);
+ szMsg[dwPlainMsgLen] = 0;
+ PGPFreeData((LPVOID)szPlainMsg);
+
+ return szMsg;
+}
+
+
+PGPError _pgp_import_key(PGPKeyDBRef *keyDB, LPCSTR pgpKey)
+{
+ return PGPImport( pgpContext,
+ keyDB,
+ PGPOInputBuffer( pgpContext,
+ pgpKey,
+ lstrlen(pgpKey) ),
+ PGPOLastOption(pgpContext ));
+}
+
+
+LPSTR __cdecl _pgp_encrypt_key(LPCSTR szPlainMsg, LPCSTR pgpKey)
+{
+ LPSTR szEncMsg = 0;
+ PGPSize dwEncMsgLen;
+
+ PGPUInt32 dwKeys;
+ PGPKeyDBRef PublicKeyDB;
+ if (CheckPGPError(_pgp_import_key(&PublicKeyDB,pgpKey)))
+ return 0;
+
+ PGPKeyIterRef KeyIterRef;
+ PGPNewKeyIterFromKeyDB(PublicKeyDB, &KeyIterRef);
+
+ PGPKeyDBObjRef PublicKey;
+ PGPKeyIterNextKeyDBObj(KeyIterRef, kPGPKeyDBObjType_Key, &PublicKey);
+
+ PGPCountKeysInKeyDB(PublicKeyDB, &dwKeys);
+
+ if(dwKeys==0) {
+ PGPFreeKeyIter(KeyIterRef);
+ PGPFreeKeyDB(PublicKeyDB);
+ return 0;
+ }
+
+ PGPError err = PGPEncode(pgpContext,
+ PGPOInputBuffer(pgpContext, szPlainMsg, lstrlen(szPlainMsg)),
+ PGPOArmorOutput(pgpContext, TRUE),
+ PGPOAllocatedOutputBuffer(pgpContext, (LPVOID *)&szEncMsg, 16384, &dwEncMsgLen),
+ PGPOEncryptToKeyDBObj(pgpContext, PublicKey),
+ PGPOVersionString(pgpContext, szVersionStr),
+ PGPOLastOption(pgpContext));
+
+ PGPFreeKeyIter(KeyIterRef);
+ PGPFreeKeyDB(PublicKeyDB);
+
+ if (CheckPGPError(err))
+ return 0;
+
+ LPSTR szMsg = (LPSTR) LocalAlloc(LPTR,dwEncMsgLen+1);
+ _pgp_memcpy(szMsg, szEncMsg, dwEncMsgLen);
+ szMsg[dwEncMsgLen] = 0;
+ PGPFreeData((LPVOID)szEncMsg);
+
+ return szMsg;
+}
+
+
+LPSTR __cdecl _pgp_decrypt_key(LPCSTR szEncMsg, LPCSTR pgpKey)
+{
+ LPSTR szPlainMsg = 0;
+ PGPSize dwPlainMsgLen;
+
+ PGPUInt32 dwKeys;
+ PGPKeyDBRef PrivateKeyDB;
+ if (CheckPGPError(_pgp_import_key(&PrivateKeyDB,pgpKey)))
+ return 0;
+ PGPCountKeysInKeyDB(PrivateKeyDB, &dwKeys);
+
+ if(dwKeys==0) {
+ PGPFreeKeyDB(PrivateKeyDB);
+ return 0;
+ }
+
+ int iTry = 0;
+
+ do {
+ if (!pszPassphrase &&
+ PGPPassphraseDialog(pgpContext,
+ PGPOUIOutputPassphrase(pgpContext, &pszPassphrase),
+ PGPOLastOption(pgpContext)) == kPGPError_UserAbort) {
+ iTry = 3;
+ break;
+ }
+
+ PGPError err = PGPDecode(pgpContext,
+ PGPOInputBuffer(pgpContext, szEncMsg, lstrlen(szEncMsg)),
+ PGPOAllocatedOutputBuffer(pgpContext, (LPVOID *)&szPlainMsg, 16384, &dwPlainMsgLen),
+ PGPOKeyDBRef(pgpContext, PrivateKeyDB),
+ PGPOPassphrase(pgpContext, pszPassphrase),
+ PGPOLastOption(pgpContext));
+
+ if (CheckPGPError(err))
+ iTry = 3;
+ else
+ if (!dwPlainMsgLen) {
+ PGPFreeData(pszPassphrase);
+ pszPassphrase = 0;
+ iTry++;
+ }
+
+ } while(!dwPlainMsgLen && iTry<3);
+
+ PGPFreeKeyDB(PrivateKeyDB);
+
+ if(iTry == 3) return 0;
+
+ LPSTR szMsg = (LPSTR) LocalAlloc(LPTR,dwPlainMsgLen+1);
+ _pgp_memcpy(szMsg, szPlainMsg, dwPlainMsgLen);
+ szMsg[dwPlainMsgLen] = 0;
+ PGPFreeData((LPVOID)szPlainMsg);
+
+ return szMsg;
+}
+
+int __cdecl _pgp_size_keyid()
+{
+ return sizeof(PGPKeyID);
+}
+
+
+PVOID __cdecl _pgp_select_keyid(HWND hDlg,LPSTR szKeyID)
+{
+ PGPKeyDBRef ContactKeyDB;
+ PGPError err;
+ err = PGPRecipientDialog(pgpContext, pgpKeyDB, TRUE, &ContactKeyDB,
+ PGPOUIParentWindowHandle(pgpContext, hDlg),
+ PGPOUIWindowTitle(pgpContext, "Select Contact's Key"),
+ PGPOLastOption(pgpContext));
+ if (err == kPGPError_UserAbort)
+ return 0;
+
+ PGPUInt32 dwKeys;
+ PGPCountKeysInKeyDB(ContactKeyDB, &dwKeys);
+ if (!dwKeys)
+ return 0;
+ if (dwKeys > 1)
+ MessageBox(hDlg, "You selected more than one key. Only the first key will be used.", szModuleName, MB_ICONINFORMATION);
+
+ static PGPKeyID KeyID;
+
+ PGPKeyIterRef KeyIterRef;
+ PGPNewKeyIterFromKeyDB(ContactKeyDB, &KeyIterRef);
+
+ PGPKeyDBObjRef KeyDBObjRef;
+ PGPKeyIterNextKeyDBObj(KeyIterRef, kPGPKeyDBObjType_Key, &KeyDBObjRef);
+
+ PGPSize dwFilled;
+ PGPGetKeyDBObjDataProperty(KeyDBObjRef, kPGPKeyProperty_KeyID, &KeyID, sizeof(PGPKeyID), &dwFilled);
+ PGPGetKeyIDString(&KeyID, kPGPKeyIDString_Abbreviated, szKeyID);
+
+ PGPFreeKeyIter(KeyIterRef);
+ PGPFreeKeyDB(ContactKeyDB);
+ return (PVOID)&KeyID;
+}
+
+
+BOOL ShowSelectKeyringsDlg(HWND hParent, LPSTR PubRingPath, LPSTR SecRingPath)
+{
+ // set keyring paths
+ OPENFILENAME ofn={0};
+ ofn.lStructSize = sizeof(ofn);
+ ofn.hwndOwner = hParent;
+ ofn.nMaxFile = MAX_PATH;
+ ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_NONETWORKBUTTON;
+
+ ofn.lpstrFile = PubRingPath;
+ ofn.lpstrFilter = "Public key rings (pubring.pkr)\0pubring.pkr\0All files (*.*)\0*.*\0";
+ ofn.lpstrTitle = "Open Public Keyring";
+ if (!GetOpenFileName(&ofn)) return FALSE;
+
+ ofn.lpstrFile = SecRingPath;
+ ofn.lpstrFilter = "Secret key rings (secring.skr)\0secring.skr\0All files (*.*)\0*.*\0";
+ ofn.lpstrTitle = "Open Secret Keyring";
+ if (!GetOpenFileName(&ofn)) return FALSE;
+
+ return TRUE;
+}
diff --git a/plugins/CryptoPP/src/PGPw/sdk8/include/pgpBase.h b/plugins/CryptoPP/src/PGPw/sdk8/include/pgpBase.h
index 53a1df46e7..38122bca7f 100644
--- a/plugins/CryptoPP/src/PGPw/sdk8/include/pgpBase.h
+++ b/plugins/CryptoPP/src/PGPw/sdk8/include/pgpBase.h
@@ -221,9 +221,6 @@ typedef unsigned int PGPUInt;
#if PGP_WIN32
#if defined(_WIN64)
- #if PGP_HAVE_64_HARDWARE==0
- #error "Configuration error: PGP_HAVE_64_HARDWARE must be 1 for WIN64"
- #endif
typedef __int64 PGPLong;
typedef unsigned __int64 PGPULong;
#else