⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kmkeyops.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*____________________________________________________________________________
	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 + -