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

📄 pkkeyops.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
📖 第 1 页 / 共 4 页
字号:
/*____________________________________________________________________________
	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 + -