📄 pkkeyops.c
字号:
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
PKKeyOps.c - implements various operations performed on keys.
$Id: PKKeyOps.c,v 1.56 2002/11/19 14:11:29 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"
// project header files
#include "PGPkeysx.h"
#include "pgpImageList.h"
#include "keydrawitem.h"
#include "pgpUnicodeWin32.h"
#include "UTF8Edit.h"
#include <process.h>
// constant definitions
#define BITMAP_WIDTH 16
#define BITMAP_HEIGHT 16
#define INITIAL_SIGN_COLUMNWIDTH 210
#define MINTRUSTDEPTH 2
#define MAXTRUSTDEPTH 8
#define MAXTRUSTDEPTHDIGITS 1
#define DEFAULTTRUSTDEPTH 2
#define SIG_NONEXPORTABLE 0
#define SIG_EXPORTABLE 1
#define SIG_META 2
#define SIG_TRUST 3
// external globals
extern HINSTANCE g_hinst;
extern HWND g_hwndMain;
extern HIMAGELIST g_hilKeys;
extern PGPContextRef g_context;
extern PGPtlsContextRef g_tlscontext;
// typedefs
typedef struct {
FARPROC pfnCallback;
PPGPKEYSSTRUCT ppks;
BOOL bItemModified;
PGPKeyDBObjRef keySigning;
PGPByte* pPasskey;
PGPSize sizePasskey;
PGPBoolean bExportable;
PGPUInt32 uTrustLevel;
PGPUInt32 uExpireDays;
CHAR szRegExpression[256];
} CERTIFYSTRUCT, *PCERTIFYSTRUCT;
typedef struct {
FARPROC pfnCallback;
PPGPKEYSSTRUCT ppks;
LPSTR pszPrompt;
LPSTR pszUserID;
PGPBoolean bMultiple;
BOOL bItemModified;
BOOL bItemNotDeleted;
BOOL bDeleteAll;
BOOL bDeletedPrimaryUserID;
PGPKeyDBObjRef keyDefault;
PGPKeyDBObjRef keyPrev;
HTLITEM hPostDeleteFocusItem;
} DELETESTRUCT, *PDELETESTRUCT;
typedef struct {
FARPROC pfnCallback;
PPGPKEYSSTRUCT ppks;
PGPBoolean bSyncWithServer;
INT iSigType;
HWND hwndList;
HWND hwndDTPicker;
INT iItem;
BOOL bExpires;
PGPInt32 iExpireDays;
BOOL bExpandedChoices;
PGPUInt32 uTrustLevel;
PGPUInt32 uTrustLoLimit;
CHAR szDomain[120];
HFONT hUTF8Font;
} CERTIFYCONFIRMSTRUCT, *PCERTIFYCONFIRMSTRUCT;
typedef struct {
HWND hwndParent;
HWND hwndProgress;
INT iNumSigsTotal;
BOOL bCancel;
} REVERIFYSTRUCT, *PREVERIFYSTRUCT;
static DWORD aDeleteAllIds[] = { // Help IDs
IDOK, IDH_PGPPK_DELETEKEY,
IDC_YESTOALL, IDH_PGPPK_DELETEALLKEYS,
IDNO, IDH_PGPPK_DONTDELETEKEY,
IDCANCEL, IDH_PGPPK_CANCELDELETE,
0,0
};
static DWORD aSignKeyIds[] = { // Help IDs
IDC_KEYLIST, IDH_PGPPK_SIGNUSERIDLIST,
IDC_MORECHOICES, IDH_PGPPK_MORESIGCHOICES,
IDC_EXPORTABLECHECK,IDH_PGPPK_ALLOWSIGEXPORT,
IDC_FEWERCHOICES, IDH_PGPPK_FEWERSIGCHOICES,
IDC_NONEXPORTABLE, IDH_PGPPK_SIGNONEXPORTABLE,
IDC_EXPORTABLE, IDH_PGPPK_SIGEXPORTABLE,
IDC_TRUSTED, IDH_PGPPK_SIGTRUSTED,
IDC_DEPTH, IDH_PGPPK_TRUSTDEPTH,
IDC_DEPTHSPIN, IDH_PGPPK_TRUSTDEPTH,
IDC_META, IDH_PGPPK_SIGMETA,
IDC_DOMAIN, IDH_PGPPK_DOMAINRESTRICTION,
IDC_NEVEREXPIRES, IDH_PGPPK_SIGNEVEREXPIRES,
IDC_EXPIRES, IDH_PGPPK_SIGEXPIRES,
IDC_EXPIRATIONDATE, IDH_PGPPK_SIGEXPIRATIONDATE,
0,0
};
// _______________________________________________
//
// Certify a single object
// routine called either from KMCertifyKeyOrUserID or as a
// callback function from the TreeList control to
// certify a single item.
//
// lptli = pointer to TreeList item to certify
static BOOL CALLBACK
sCertifySingleObject (
TL_TREEITEM* lptli,
LPARAM lParam)
{
PCERTIFYSTRUCT pcs = (PCERTIFYSTRUCT)lParam;
PGPError err = kPGPError_NoErr;
PGPKeyDBObjRef key;
PGPKeyDBObjRef userid;
CHAR sz512[512];
CHAR sz256[256];
CHAR sz64[64];
PGPBoolean bMultiple;
switch (lptli->iImage) {
case IDX_RSAPUBKEY :
case IDX_RSAPUBDISKEY :
case IDX_RSASECKEY :
case IDX_RSASECDISKEY :
case IDX_RSASECSHRKEY :
case IDX_DSAPUBKEY :
case IDX_DSAPUBDISKEY :
case IDX_DSASECKEY :
case IDX_DSASECDISKEY :
case IDX_DSASECSHRKEY :
case IDX_RSAV4PUBKEY :
case IDX_RSAV4PUBDISKEY :
case IDX_RSAV4SECKEY :
case IDX_RSAV4SECDISKEY :
case IDX_RSAV4SECSHRKEY :
case IDX_RSATOKKEY :
case IDX_RSATOKDISKEY :
case IDX_RSAV4TOKKEY :
case IDX_RSAV4TOKDISKEY :
case IDX_ECPUBKEY :
case IDX_ECPUBDISKEY :
case IDX_ECSECKEY :
case IDX_ECSECDISKEY :
case IDX_ECSECSHRKEY :
key = (PGPKeyDBObjRef)(lptli->lParam);
PGPGetPrimaryUserID (key, &userid);
break;
case IDX_RSAUSERID :
case IDX_DSAUSERID :
case IDX_PHOTOUSERID :
userid = (PGPKeyDBObjRef)(lptli->lParam);
key = PGPPeekKeyDBObjKey (userid);
break;
case IDX_RSAPUBREVKEY :
case IDX_RSAPUBEXPKEY :
case IDX_RSASECREVKEY :
case IDX_RSASECEXPKEY :
case IDX_DSAPUBREVKEY :
case IDX_DSAPUBEXPKEY :
case IDX_DSASECREVKEY :
case IDX_DSASECEXPKEY :
case IDX_RSAV4PUBREVKEY :
case IDX_RSAV4PUBEXPKEY :
case IDX_RSAV4SECREVKEY :
case IDX_RSAV4SECEXPKEY :
case IDX_RSATOKREVKEY :
case IDX_RSATOKEXPKEY :
case IDX_RSAV4TOKREVKEY :
case IDX_RSAV4TOKEXPKEY :
case IDX_ECPUBREVKEY :
case IDX_ECPUBEXPKEY :
case IDX_ECSECREVKEY :
case IDX_ECSECEXPKEY :
return TRUE;
default :
return FALSE;
}
// make sure we have enough entropy
PGPclRandom (g_context, pcs->ppks->hwndMain, 0);
err = PGPCertifyUserID (userid, pcs->keySigning,
PGPOExpiration (g_context, pcs->uExpireDays),
PGPOExportable (g_context, pcs->bExportable),
PGPOSigTrust (g_context, pcs->uTrustLevel,
kPGPKeyTrust_Complete),
(pcs->pPasskey) ?
PGPOPasskeyBuffer (g_context, pcs->pPasskey, pcs->sizePasskey) :
PGPONullOption (g_context),
(pcs->szRegExpression[0]) ?
PGPOSigRegularExpression (g_context, pcs->szRegExpression) :
PGPONullOption (g_context),
PGPOLastOption (g_context));
if (IsntPGPError (err))
{
pcs->bItemModified = TRUE;
return TRUE;
}
LoadString (g_hinst, IDS_CERTIFYERROR, sz64, 64);
PGPclErrorToString (err, sz256, 256, NULL);
wsprintf (sz512, sz64, lptli->pszText, sz256);
LoadString (g_hinst, IDS_CAPTIONALERT, sz64, 64);
PGPclKeyListGetSelectionInfo (
pcs->ppks->hKL, NULL, NULL, &bMultiple, NULL);
if (bMultiple)
{
if (PGPclMessageBoxUTF8 (pcs->ppks->hwndMain, sz512, sz64,
MB_OKCANCEL|MB_ICONEXCLAMATION) == IDOK)
{
return TRUE;
}
}
else
{
if (PGPclMessageBoxUTF8 (pcs->ppks->hwndMain, sz512, sz64,
MB_OK|MB_ICONEXCLAMATION) == IDOK)
{
return TRUE;
}
}
return FALSE;
}
// _______________________________________________
//
// Populate ListView with userids to sign
static BOOL CALLBACK
sInsertOneID (TL_TREEITEM* lptli, LPARAM lParam)
{
PCERTIFYCONFIRMSTRUCT pccs = (PCERTIFYCONFIRMSTRUCT)lParam;
PGPKeyDBObjRef key;
PGPKeyDBObjRef userid;
UINT u, uAlgorithm, uKeyVersion;
LV_ITEM lvI;
PGPByte fingerprintBytes[256];
CHAR sz[kPGPMaxUserIDSize];
lvI.iImage = -1;
switch (lptli->iImage) {
case IDX_RSAPUBKEY :
case IDX_RSAPUBDISKEY :
case IDX_RSASECKEY :
case IDX_RSASECDISKEY :
case IDX_RSASECSHRKEY :
case IDX_DSAPUBKEY :
case IDX_DSAPUBDISKEY :
case IDX_DSASECKEY :
case IDX_DSASECDISKEY :
case IDX_DSASECSHRKEY :
case IDX_RSAV4PUBKEY :
case IDX_RSAV4PUBDISKEY :
case IDX_RSAV4SECKEY :
case IDX_RSAV4SECDISKEY :
case IDX_RSAV4SECSHRKEY :
case IDX_RSATOKKEY :
case IDX_RSATOKDISKEY :
case IDX_RSAV4TOKKEY :
case IDX_RSAV4TOKDISKEY :
case IDX_ECPUBKEY :
case IDX_ECPUBDISKEY :
case IDX_ECSECKEY :
case IDX_ECSECDISKEY :
case IDX_ECSECSHRKEY :
key = (PGPKeyDBObjRef)(lptli->lParam);
PGPclGetPrimaryUserIDNameUTF8 (key, sz, sizeof(sz), &u);
break;
case IDX_RSAUSERID :
case IDX_DSAUSERID :
userid = (PGPKeyDBObjRef)(lptli->lParam);
key = PGPPeekKeyDBObjKey (userid);
PGPclGetUserIDNameUTF8 (userid, sz, sizeof(sz), &u);
break;
case IDX_PHOTOUSERID :
userid = (PGPKeyDBObjRef)(lptli->lParam);
key = PGPPeekKeyDBObjKey (userid);
LoadString (g_hinst, IDS_PHOTOUSERID, sz, sizeof(sz));
lvI.iImage = IDX_PHOTOUSERID;
break;
case IDX_RSAPUBREVKEY :
case IDX_RSAPUBEXPKEY :
case IDX_RSASECREVKEY :
case IDX_RSASECEXPKEY :
case IDX_DSAPUBREVKEY :
case IDX_DSAPUBEXPKEY :
case IDX_DSASECREVKEY :
case IDX_DSASECEXPKEY :
case IDX_RSAV4PUBREVKEY :
case IDX_RSAV4PUBEXPKEY :
case IDX_RSAV4SECREVKEY :
case IDX_RSAV4SECEXPKEY :
case IDX_RSATOKREVKEY :
case IDX_RSATOKEXPKEY :
case IDX_RSAV4TOKREVKEY :
case IDX_RSAV4TOKEXPKEY :
case IDX_ECPUBREVKEY :
case IDX_ECPUBEXPKEY :
case IDX_ECSECREVKEY :
case IDX_ECSECEXPKEY :
return TRUE;
default :
return FALSE;
}
if (lvI.iImage == -1)
{
PGPGetKeyDBObjNumericProperty (key,
kPGPKeyProperty_AlgorithmID, &uAlgorithm);
switch (uAlgorithm) {
case kPGPPublicKeyAlgorithm_RSA : lvI.iImage = IDX_RSAUSERID; break;
case kPGPPublicKeyAlgorithm_DSA : lvI.iImage = IDX_DSAUSERID; break;
default : lvI.iImage = IDX_DSAUSERID; break;
}
}
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
lvI.state = 0;
lvI.stateMask = 0;
lvI.iItem = pccs->iItem;
lvI.iSubItem = 0;
lvI.pszText = sz;
lvI.cchTextMax = 0;
if (ListView_InsertItem (pccs->hwndList, &lvI) == -1)
return FALSE;
PGPGetKeyDBObjDataProperty (key, kPGPKeyProperty_Fingerprint,
fingerprintBytes, sizeof(fingerprintBytes), &u);
PGPGetKeyDBObjNumericProperty (key,
kPGPKeyProperty_Version, &uKeyVersion);
PGPclConvertFingerprintToString (uKeyVersion, fingerprintBytes);
ListView_SetItemText (pccs->hwndList, pccs->iItem, 1, fingerprintBytes);
(pccs->iItem)++;
return TRUE;
}
// _______________________________________________
//
// Populate ListView with userids to sign
static VOID
sFillKeyList (PCERTIFYCONFIRMSTRUCT pccs)
{
LV_COLUMN lvC;
CHAR sz[256];
ListView_SetImageList (pccs->hwndList, g_hilKeys, LVSIL_SMALL);
lvC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
lvC.fmt = LVCFMT_LEFT;
lvC.pszText = sz;
LoadString (g_hinst, IDS_USERID, sz, sizeof(sz));
lvC.cx = INITIAL_SIGN_COLUMNWIDTH;
lvC.iSubItem = 0;
if (ListView_InsertColumn (pccs->hwndList, 0, &lvC) == -1) return;
LoadString (g_hinst, IDS_FINGERPRINT, sz, sizeof(sz));
lvC.cx = 360;
lvC.iSubItem = 1;
if (ListView_InsertColumn (pccs->hwndList, 1, &lvC) == -1) return;
// populate control by iterating through selected items
pccs->pfnCallback = sInsertOneID;
pccs->iItem = 0;
TreeList_IterateSelected (pccs->ppks->hwndTreeList, pccs);
}
// _______________________________________________
//
// Convert domain string to regular expression
static VOID
sDomainToRegExpression (
LPSTR szDomain,
LPSTR szRegExp)
{
LPSTR pszSrc = szDomain;
LPSTR pszDst = szRegExp;
lstrcpy (pszDst, "<[^>]+[@.]");
pszDst += lstrlen (pszDst);
for ( ; *pszSrc; pszSrc++)
{
switch (*pszSrc)
{
case '*':
case '+':
case '?':
case '.':
case '^':
case '$':
case '\\':
case '[':
case ']':
case '-':
*pszDst++ = '\\';
*pszDst++ = *pszSrc;
break;
default:
*pszDst++ = *pszSrc;
break;
}
}
*pszDst++ = '>';
*pszDst++ = '$';
*pszDst++ = '\0';
}
// _______________________________________________
//
// Sign key dialog message procedure
static BOOL CALLBACK
sSignKeyDlgProc (
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
PCERTIFYCONFIRMSTRUCT pccs;
INT iNewY, iNewWindowHeight, iOffset;
HWND hwndControl;
RECT rectControl;
RECT rc;
switch (uMsg) {
case WM_INITDIALOG :
{
SYSTEMTIME st;
SetWindowLong (hDlg, GWL_USERDATA, lParam);
pccs = (PCERTIFYCONFIRMSTRUCT)lParam;
pccs->hwndList = GetDlgItem (hDlg, IDC_KEYLIST);
EnableWindow (GetDlgItem (hDlg, IDC_MORECHOICES), TRUE);
ShowWindow (GetDlgItem (hDlg, IDC_MORECHOICES), SW_SHOW);
pccs->bExpandedChoices = FALSE;
sFillKeyList (pccs);
// initialize trust depth
pccs->uTrustLoLimit = 0;
SendDlgItemMessage (hDlg, IDC_DEPTHSPIN, UDM_SETRANGE,
0, (LPARAM)MAKELONG (MAXTRUSTDEPTH, pccs->uTrustLoLimit));
SendDlgItemMessage (hDlg, IDC_DEPTH, EM_SETLIMITTEXT,
MAXTRUSTDEPTHDIGITS, 0);
SetDlgItemInt (hDlg, IDC_DEPTH, 0, FALSE);
// create and initialize date/time picker control
GetWindowRect (GetDlgItem (hDlg, IDC_EXPIRATIONDATE), &rc);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rc, 2);
pccs->hwndDTPicker = CreateWindowEx (0, DATETIMEPICK_CLASS,
"DateTime",
WS_BORDER|WS_CHILD|WS_TABSTOP,
rc.left, rc.top,
rc.right-rc.left, rc.bottom-rc.top,
hDlg, (HMENU)IDC_EXPIRATIONDATE,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -