📄 kmkeyops.c
字号:
/*____________________________________________________________________________
Copyright (C) 1998 Network Associates, Inc.
All rights reserved.
KMKeyOps.c - implements various operations performed on keys.
$Id: KMKeyOps.c,v 1.55 1999/04/14 23:23:45 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"
// project header files
#include "pgpkmx.h"
#include "pgpclx.h"
// constant definitions
#define BITMAP_WIDTH 16
#define BITMAP_HEIGHT 16
#define INITIAL_SIGN_COLUMNWIDTH 210
#define SIG_NONEXPORTABLE 0
#define SIG_EXPORTABLE 1
#define SIG_TRUST 2
#define SIG_META 3
// external globals
extern HINSTANCE g_hInst;
// typedefs
typedef struct {
FARPROC lpfnCallback;
PKEYMAN pKM;
BOOL bItemModified;
PGPKeyRef keySigning;
PGPByte* pPasskey;
PGPSize sizePasskey;
PGPBoolean bExportable;
PGPUInt32 uTrustLevel;
PGPUInt32 uExpireDays;
CHAR szRegExpression[256];
} CERTIFYSTRUCT, *PCERTIFYSTRUCT;
typedef struct {
FARPROC lpfnCallback;
PGPContextRef context;
PKEYMAN pKM;
LPSTR pszPrompt;
BOOL bItemModified;
BOOL bItemNotDeleted;
BOOL bDeleteAll;
BOOL bDeletedPrimaryUserID;
PGPKeyRef keyDefault;
HTLITEM hPostDeleteFocusItem;
} DELETESTRUCT, *PDELETESTRUCT;
typedef struct {
FARPROC lpfnCallback;
PKEYMAN pKM;
PGPBoolean bSyncWithServer;
INT iSigType;
HWND hwndList;
HWND hwndDTPicker;
HIMAGELIST hIml;
INT iItem;
BOOL bExpires;
PGPInt32 iExpireDays;
BOOL bExpandedChoices;
CHAR szDomain[120];
} CERTIFYCONFIRMSTRUCT, *PCERTIFYCONFIRMSTRUCT;
typedef struct {
HWND hwndParent;
HWND hwndProgress;
INT iNumSigsTotal;
BOOL bCancel;
} REVERIFYSTRUCT, *PREVERIFYSTRUCT;
static DWORD aDeleteAllIds[] = { // Help IDs
IDOK, IDH_PGPKM_DELETEKEY,
IDC_YESTOALL, IDH_PGPKM_DELETEALLKEYS,
IDNO, IDH_PGPKM_DONTDELETEKEY,
IDCANCEL, IDH_PGPKM_CANCELDELETE,
0,0
};
static DWORD aSignKeyIds[] = { // Help IDs
IDC_KEYLIST, IDH_PGPKM_SIGNUSERIDLIST,
IDC_MORECHOICES, IDH_PGPKM_MORESIGCHOICES,
IDC_EXPORTABLECHECK,IDH_PGPKM_ALLOWSIGEXPORT,
IDC_FEWERCHOICES, IDH_PGPKM_FEWERSIGCHOICES,
IDC_NONEXPORTABLE, IDH_PGPKM_SIGNONEXPORTABLE,
IDC_EXPORTABLE, IDH_PGPKM_SIGEXPORTABLE,
IDC_TRUSTED, IDH_PGPKM_SIGTRUSTED,
IDC_META, IDH_PGPKM_SIGMETA,
IDC_DOMAIN, IDH_PGPKM_DOMAINRESTRICTION,
IDC_NEVEREXPIRES, IDH_PGPKM_SIGNEVEREXPIRES,
IDC_EXPIRES, IDH_PGPKM_SIGEXPIRES,
IDC_EXPIRATIONDATE, IDH_PGPKM_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;
PGPKeyRef key;
PGPUserIDRef userid;
PGPContextRef context;
CHAR sz512[512];
CHAR sz256[256];
CHAR sz64[64];
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 :
key = (PGPKeyRef)(lptli->lParam);
PGPGetPrimaryUserID (key, &userid);
break;
case IDX_RSAUSERID :
case IDX_DSAUSERID :
case IDX_PHOTOUSERID :
userid = (PGPUserIDRef)(lptli->lParam);
key = KMGetKeyFromUserID (pcs->pKM, 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 :
return TRUE;
default :
return FALSE;
}
context = pcs->pKM->Context;
// make sure we have enough entropy
PGPclRandom (context, pcs->pKM->hWndParent, 0);
err = PGPSignUserID (userid, pcs->keySigning,
PGPOExpiration (context, pcs->uExpireDays),
PGPOExportable (context, pcs->bExportable),
PGPOSigTrust (context, pcs->uTrustLevel,
kPGPKeyTrust_Complete),
(pcs->pPasskey) ?
PGPOPasskeyBuffer (context, pcs->pPasskey, pcs->sizePasskey) :
PGPONullOption (context),
(pcs->szRegExpression[0]) ?
PGPOSigRegularExpression (context, pcs->szRegExpression) :
PGPONullOption (context),
PGPOLastOption (context));
if (IsntPGPError (err)) {
pcs->bItemModified = TRUE;
return TRUE;
}
LoadString (g_hInst, IDS_CERTIFYERROR, sz64, 64);
PGPclErrorToString (err, sz256, 256);
wsprintf (sz512, sz64, lptli->pszText, sz256);
LoadString (g_hInst, IDS_CAPTION, sz64, 64);
if (KMMultipleSelected (pcs->pKM)) {
if (MessageBox (pcs->pKM->hWndParent, sz512, sz64,
MB_OKCANCEL|MB_ICONEXCLAMATION) == IDOK)
return TRUE;
}
else {
if (MessageBox (pcs->pKM->hWndParent, 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;
PGPKeyRef key;
PGPUserIDRef userid;
UINT u, uAlgorithm;
LV_ITEM lvI;
PGPByte fingerprintBytes[256];
CHAR sz[kPGPMaxUserIDSize];
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 :
key = (PGPKeyRef)(lptli->lParam);
KMGetKeyName (key, sz, sizeof(sz));
break;
case IDX_RSAUSERID :
case IDX_DSAUSERID :
case IDX_PHOTOUSERID :
userid = (PGPUserIDRef)(lptli->lParam);
key = KMGetKeyFromUserID (pccs->pKM, userid);
KMGetUserIDName (userid, sz, sizeof(sz));
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 :
return TRUE;
default :
return FALSE;
}
PGPGetKeyNumber (key, kPGPKeyPropAlgID, &uAlgorithm);
switch (uAlgorithm) {
case kPGPPublicKeyAlgorithm_RSA : lvI.iImage = IDX_RSAUSERID; break;
case kPGPPublicKeyAlgorithm_DSA : lvI.iImage = IDX_DSAUSERID; break;
default : lvI.iImage = IDX_RSAUSERID; 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;
PGPGetKeyPropertyBuffer (key, kPGPKeyPropFingerprint,
sizeof(fingerprintBytes), fingerprintBytes, &u);
KMConvertStringFingerprint (uAlgorithm, 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];
HBITMAP hBmp;
HDC hDC;
INT iNumBits;
// create image list
hDC = GetDC (NULL); // DC for desktop
iNumBits = GetDeviceCaps (hDC, BITSPIXEL) * GetDeviceCaps (hDC, PLANES);
ReleaseDC (NULL, hDC);
if (iNumBits <= 8) {
pccs->hIml = ImageList_Create (16, 16, ILC_COLOR|ILC_MASK,
NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hInst, MAKEINTRESOURCE (IDB_IMAGES4BIT));
ImageList_AddMasked (pccs->hIml, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
}
else {
pccs->hIml = ImageList_Create (16, 16, ILC_COLOR24|ILC_MASK,
NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hInst, MAKEINTRESOURCE (IDB_IMAGES24BIT));
ImageList_AddMasked (pccs->hIml, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
}
ListView_SetImageList (pccs->hwndList, pccs->hIml, 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->lpfnCallback = sInsertOneID;
pccs->iItem = 0;
TreeList_IterateSelected (pccs->pKM->hWndTree, 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);
// 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,
g_hInst, NULL);
SetWindowPos (pccs->hwndDTPicker,
GetDlgItem (hDlg, IDC_EXPIRATIONDATE),
0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
SendMessage (pccs->hwndDTPicker, DTM_SETMCCOLOR,
MCSC_MONTHBK, (LPARAM)GetSysColor (COLOR_3DFACE));
// initialize to one year from today
GetLocalTime (&st);
st.wYear++;
SendMessage (pccs->hwndDTPicker, DTM_SETSYSTEMTIME,
GDT_VALID, (LPARAM)&st);
EnableWindow (pccs->hwndDTPicker, FALSE);
CheckDlgButton (hDlg, IDC_NEVEREXPIRES, BST_CHECKED);
// user "more" button as desired Y location
hwndControl = GetDlgItem (hDlg, IDC_MORECHOICES);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
GetWindowRect (hDlg, &rc);
iOffset = rc.bottom-rc.top;
GetClientRect (hDlg, &rc);
iOffset -= rc.bottom;
iOffset += (rectControl.bottom - rectControl.top) / 2;
iNewY = rectControl.top;
iNewWindowHeight = rectControl.bottom + iOffset;
// move OK Button
hwndControl = GetDlgItem (hDlg, IDOK);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
MoveWindow( hwndControl,
rectControl.left,
iNewY,
rectControl.right - rectControl.left,
rectControl.bottom - rectControl.top,
TRUE);
// move Cancel Button
hwndControl = GetDlgItem (hDlg, IDCANCEL);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
MoveWindow( hwndControl,
rectControl.left,
iNewY,
rectControl.right - rectControl.left,
rectControl.bottom - rectControl.top,
TRUE);
// move Help Button
hwndControl = GetDlgItem (hDlg, IDHELP);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
MoveWindow( hwndControl,
rectControl.left,
iNewY,
rectControl.right - rectControl.left,
rectControl.bottom - rectControl.top,
TRUE);
// size Window
GetWindowRect (hDlg, &rectControl);
MoveWindow( hDlg,
rectControl.left,
rectControl.top,
rectControl.right - rectControl.left,
iNewWindowHeight,
TRUE);
break;
}
case WM_HELP:
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
WinHelp (((LPHELPINFO) lParam)->hItemHandle, pccs->pKM->szHelpFile,
HELP_WM_HELP, (DWORD) (LPSTR) aSignKeyIds);
break;
case WM_CONTEXTMENU:
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
WinHelp ((HWND) wParam, pccs->pKM->szHelpFile, HELP_CONTEXTMENU,
(DWORD) (LPVOID) aSignKeyIds);
break;
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR) lParam;
if (pnmh->code == DTN_DATETIMECHANGE) {
SYSTEMTIME st;
pccs =
(PCERTIFYCONFIRMSTRUCT)GetWindowLong(hDlg, GWL_USERDATA);
SendMessage (pccs->hwndDTPicker, DTM_GETSYSTEMTIME,
0, (LPARAM)&st);
PGPclSystemTimeToDays (&st, &(pccs->iExpireDays));
if (pccs->iExpireDays > 0)
EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
else
EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
}
}
break;
case WM_PAINT :
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
if (pccs->bExpandedChoices)
{
// paint icons
HDC hdc = GetDC (hDlg);
GetWindowRect (GetDlgItem (hDlg, IDC_NONEXPORTABLE), &rc);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rc, 2);
ImageList_Draw (pccs->hIml, IDX_CERT, hdc,
rc.left-22, rc.top, ILD_TRANSPARENT);
GetWindowRect (GetDlgItem (hDlg, IDC_EXPORTABLE), &rc);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rc, 2);
ImageList_Draw (pccs->hIml, IDX_EXPORTCERT, hdc,
rc.left-22, rc.top, ILD_TRANSPARENT);
GetWindowRect (GetDlgItem (hDlg, IDC_TRUSTED), &rc);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -