clprops.c

来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 2,600 行 · 第 1/5 页

C
2,600
字号
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.
	
	CLprops.c - handle Key properties dialogs

	$Id: CLprops.c,v 1.57 2002/10/31 04:13:35 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"

// project header files
#include "PGPclx.h"
#include "TreeList.h"
#include "pgpImageList.h"
#include "pgpHashWords.h"
#include "UTF8Edit.h"

// system header files
#include <process.h>

// constant definitions
#define ENFORCELISTWIDTH	52

#define MAXSHEETS			16		// max number of simultaneous dialogs

#define MINSUBKEYSIZE		1024
#define MAXSUBKEYSIZE		4096
#define DEFAULTSUBKEYSIZE	2048
#define ECSUBKEYSIZE		283

#define PROGRESS_TIMER		5432L
#define PROGRESS_TIMER_MS	100
#define NUMLEDS				10
#define LEDSPACING			2

#define NOTIFYTIMER			1111L
#define NOTIFYTIMEMS		100

#define NUMHASHWORDCOLS		4

#define TREELISTOFFSET		8

// external globals
extern HINSTANCE	g_hInst;
extern HIMAGELIST	g_hilKeys;
extern BOOL			g_bUnicodeOS;
// typedefs
typedef struct {
	PGPContextRef		context;
	PGPtlsContextRef	tlscontext;
	HWND				hwndParent;
	WNDPROC				wpOrigProcPhoto;
	WNDPROC				wpOrigProcBox;
	PGPKeyDBObjRef		key;
	PGPKeyDBObjRef		userid;
	PGPKeyDBObjRef		cert;
	PGPKeyDBRef			keydbBacking;
	PGPKeyDBRef			keydbAlt;

	PGPInt32			iValidityThreshold;
	PGPBoolean			bReadOnly;
	PGPBoolean			bNeedsCentering;
	PGPBoolean			bSubkeyOpsDisabled;
	PGPBoolean			bSubkeyGenEnabled;

	PGPUInt32			uKeyAlg;
	PGPUInt32			uKeyVer;
	PGPUInt32			uTrust;
	PGPUInt32			uValidity;
	PGPInt32			iExpireDays;
	PGPUInt32			uNumberADKs;
	PGPUInt32			uNumberRevokers;

	PGPBoolean			bSecret;
	PGPBoolean			bSplit;
	PGPBoolean			bDisabled;
	PGPBoolean			bAxiomatic;
	PGPBoolean			bOnToken;
	PGPBoolean			bInvalid;
	PGPBoolean			bRevoked;
	PGPBoolean			bExpired;
	PGPBoolean			bPhotoInvalid;
	PGPBoolean			bX509;
	PGPBoolean			bShowHexFingerprint;
	PGPBoolean			bReadyToPaint;

	HWND				hwndValidity;
	HWND				hwndStartDate;
	HWND				hwndExpireDate;
	HWND				hwndSubKeys;
	HWND				hwndADKs;
	HWND				hwndRevokers;
	HWND				hwndRevokerDlg;

	HTLITEM				hTSelectedADK;
	HTLITEM				hTSelectedRevoker;

	PGPInt32			iNumPhotoIDs;
	PGPInt32			iImageIndex;
	HBITMAP				hbitmapPhotoID;
	HPALETTE			hpalettePhotoID;
	PGPInt32			iwidthPhotoID;
	PGPInt32			iheightPhotoID;
	PGPByte*			pPhotoBuffer;
	PGPSize				iPhotoBufferLength;

} CLPROPSHEETSTRUCT, *PCLPROPSHEETSTRUCT;

typedef struct {
	PGPKeyDBObjRef		subkey;
	PGPTime				timeStart;
	INT					iExpireDays;
	BOOL				bNeverExpires;
	UINT				uSize;
} SUBKEYSTRUCT, *PSUBKEYSTRUCT;

typedef struct {
	PCLPROPSHEETSTRUCT	pclpss;
	PSUBKEYSTRUCT		psks;
	PGPError			err;
	LPSTR				pszPhrase;
	PGPByte*			pPasskey;
	PGPSize				sizePasskey;
	HWND				hwndProgress;
	BOOL				bCancelPending;
	BOOL				bGenDone;
	BOOL				bGenOK;
	INT					iStatusValue;
	INT					iStatusDirection;
} SUBKEYGENSTRUCT, *PSUBKEYGENSTRUCT;

// local globals
static UINT uSubkeySizes[] = {1024, 1536, 2048, 3072};

static DWORD aKeyPropIds[] = {
	IDC_CHANGEPHRASE,		IDH_PGPCL_CHANGEPHRASE,	// this must be first item
	IDC_KEYID,				IDH_PGPCL_KEYID,
	IDC_KEYTYPE,			IDH_PGPCL_KEYTYPE,
	IDC_KEYSIZE,			IDH_PGPCL_KEYSIZE,
	IDC_CREATEDATE,			IDH_PGPCL_CREATEDATE,
	IDC_EXPIREDATE,			IDH_PGPCL_KEYEXPIRES,
	IDC_CIPHER,				IDH_PGPCL_CIPHER,
	IDC_HEXFINGERPRINT,		IDH_PGPCL_HEXFINGERPRINT,
	IDC_FINGERPRINT1,		IDH_PGPCL_FINGERPRINT,
	IDC_FINGERPRINT2,		IDH_PGPCL_FINGERPRINT,
	IDC_FINGERPRINT3,		IDH_PGPCL_FINGERPRINT,
	IDC_FINGERPRINT4,		IDH_PGPCL_FINGERPRINT,
	IDC_USEHEXFINGERPRINT,	IDH_PGPCL_DISPLAYHEXFINGERPRINT,
	IDC_ENABLED,			IDH_PGPCL_ENABLED,
	IDC_ONTOKEN,			IDH_PGPCL_ONTOKEN,
	IDC_PHOTOID,			IDH_PGPCL_PHOTOID,
	IDC_VALIDITYBAR,		IDH_PGPCL_VALIDITYBAR,
	IDC_TRUSTSLIDER,		IDH_PGPCL_TRUSTSLIDER,
	IDC_AXIOMATIC,			IDH_PGPCL_AXIOMATIC,
	0,0 
}; 

static DWORD aNewSubkeyIds[] = {
	IDC_SUBKEYSIZE,		IDH_PGPCL_NEWSUBKEYSIZE,
	IDC_STARTDATE,		IDH_PGPCL_NEWSUBKEYSTARTDATE,
	IDC_NEVEREXPIRES,	IDH_PGPCL_NEWSUBKEYNEVEREXPIRES,
	IDC_EXPIRESON,		IDH_PGPCL_NEWSUBKEYEXPIRES,
	IDC_EXPIRATIONDATE,	IDH_PGPCL_NEWSUBKEYEXPIREDATE,
	0,0 
}; 

static DWORD aSubkeyIds[] = {
	IDC_SUBKEYLIST,		IDH_PGPCL_SUBKEYLIST,
	IDC_NEWSUBKEY,		IDH_PGPCL_SUBKEYCREATE,
	IDC_REVOKESUBKEY,	IDH_PGPCL_SUBKEYREVOKE,
	IDC_REMOVESUBKEY,	IDH_PGPCL_SUBKEYREMOVE,
	IDC_STATICTEXT1,	-1,
	IDC_STATICTEXT2,	-1,
	0,0 
}; 

static DWORD aADKIds[] = {
	IDC_FRAME,			IDH_PGPCL_ADKLIST,
	IDC_ADKTREELIST,	IDH_PGPCL_ADKLIST,
	IDC_UPDATE,			IDH_PGPCL_UPDATEADK,
	0,0 
}; 

static DWORD aRevokerIds[] = {
	IDC_FRAME,			IDH_PGPCL_REVOKERLIST,
	IDC_REVOKERTREELIST,IDH_PGPCL_REVOKERLIST,
	IDC_UPDATE,			IDH_PGPCL_UPDATEREVOKER,
	0,0 
}; 

static DWORD aPGPcertIds[] = {
	IDC_NAME,			IDH_PGPCL_PGPCERTNAME,
	IDC_KEYID,			IDH_PGPCL_PGPCERTKEYID,
	IDC_CREATIONDATE,	IDH_PGPCL_PGPCERTCREATION,
	IDC_EXPIRATIONDATE,	IDH_PGPCL_PGPCERTEXPIRATION,
	IDC_EXPORTABLE,		IDH_PGPCL_PGPCERTEXPORTABLE,
	IDC_EXPIRED,		IDH_PGPCL_PGPCERTEXPIRED,
	IDC_REVOKED,		IDH_PGPCL_PGPCERTREVOKED,
	IDC_SHOWSIGNER,		IDH_PGPCL_PGPCERTSHOWSIGNER,
	IDC_DOMAIN,			IDH_PGPCL_PGPCERTDOMAIN,
	IDC_ICONFRAME,		-1,
	0,0 
}; 

static DWORD aX509certIds[] = {
	IDC_NAME,			IDH_PGPCL_X509CERTNAME,
	IDC_ISSUER,			IDH_PGPCL_X509CERTISSUER,
	IDC_LASTCRL,		IDH_PGPCL_X509CERTLASTCRL,
	IDC_NEXTCRL,		IDH_PGPCL_X509CERTNEXTCRL,
	IDC_CREATIONDATE,	IDH_PGPCL_X509CERTCREATION,
	IDC_EXPIRATIONDATE,	IDH_PGPCL_X509CERTEXPIRATION,
	IDC_EXPORTABLE,		IDH_PGPCL_X509CERTEXPORTABLE,
	IDC_EXPIRED,		IDH_PGPCL_X509CERTEXPIRED,
	IDC_REVOKED,		IDH_PGPCL_X509CERTREVOKED,
	IDC_SHOWSIGNER,		IDH_PGPCL_X509CERTSHOWSIGNER,
	IDC_ICONFRAME,		-1,
	0,0 
}; 

//	___________________________________________________
//
//	copy the appropriate hash word to the string buffer

static VOID
sGetHashWord (
		PGPByte		bIndex,
		PGPBoolean	bEven,
		LPSTR		psz)
{
	if (bEven)
		lstrcpy (psz, &hashWordListEven[bIndex][0]);
	else
		lstrcpy (psz, &hashWordListOdd[bIndex][0]);
}

//	___________________________________________________
//
//	set the fingerprint controls on basis of "usehex" flag

static VOID
sSetFingerprintControls (
		 HWND			hwnd,
		 PGPBoolean		bUseHex,
		 PGPKeyDBObjRef	key,
		 PGPUInt32		uKeyVer)
{
	UINT		u, uWordsTotal;
	PGPBoolean	bEven;
	CHAR		sz[64];
	CHAR		sz1[64];
	CHAR		sz2[256];

	if (bUseHex) 
	{
		ShowWindow (GetDlgItem (hwnd, IDC_HEXFINGERPRINT), TRUE);
		ShowWindow (GetDlgItem (hwnd, IDC_FINGERPRINT1), FALSE);
		ShowWindow (GetDlgItem (hwnd, IDC_FINGERPRINT2), FALSE);
		ShowWindow (GetDlgItem (hwnd, IDC_FINGERPRINT3), FALSE);
		ShowWindow (GetDlgItem (hwnd, IDC_FINGERPRINT4), FALSE);

		PGPGetKeyDBObjDataProperty (key, 
				kPGPKeyProperty_Fingerprint, sz, sizeof(sz), &u);
		PGPclConvertFingerprintToString (uKeyVer, sz);
		SetDlgItemText (hwnd, IDC_HEXFINGERPRINT, sz);
	}
	else 
	{
		ShowWindow (GetDlgItem (hwnd, IDC_HEXFINGERPRINT), FALSE);
		ShowWindow (GetDlgItem (hwnd, IDC_FINGERPRINT1), TRUE);
		ShowWindow (GetDlgItem (hwnd, IDC_FINGERPRINT2), TRUE);
		ShowWindow (GetDlgItem (hwnd, IDC_FINGERPRINT3), TRUE);
		ShowWindow (GetDlgItem (hwnd, IDC_FINGERPRINT4), TRUE);

		PGPGetKeyDBObjDataProperty (key, 
				kPGPKeyProperty_Fingerprint, sz1, sizeof(sz1), &u);

		if (uKeyVer > kPGPKeyVersion_V3) 
			uWordsTotal = 20;
		else
			uWordsTotal = 16;

		sz2[0] = '\0';
		bEven = TRUE;
		for (u=0; u<uWordsTotal; u+=NUMHASHWORDCOLS) 
		{
			sGetHashWord (sz1[u], bEven, sz);
			lstrcat (sz2, sz);
			lstrcat (sz2, "\n");
		}
		SetDlgItemText (hwnd, IDC_FINGERPRINT1, sz2);

		sz2[0] = '\0';
		bEven = !bEven;
		for (u=1; u<uWordsTotal; u+=NUMHASHWORDCOLS) 
		{
			sGetHashWord (sz1[u], bEven, sz);
			lstrcat (sz2, sz);
			lstrcat (sz2, "\n");
		}
		SetDlgItemText (hwnd, IDC_FINGERPRINT2, sz2);

		sz2[0] = '\0';
		bEven = !bEven;
		for (u=2; u<uWordsTotal; u+=NUMHASHWORDCOLS) 
		{
			sGetHashWord (sz1[u], bEven, sz);
			lstrcat (sz2, sz);
			lstrcat (sz2, "\n");
		}
		SetDlgItemText (hwnd, IDC_FINGERPRINT3, sz2);

		sz2[0] = '\0';
		bEven = !bEven;
		for (u=3; u<uWordsTotal; u+=NUMHASHWORDCOLS) 
		{
			sGetHashWord (sz1[u], bEven, sz);
			lstrcat (sz2, sz);
			lstrcat (sz2, "\n");
		}
		SetDlgItemText (hwnd, IDC_FINGERPRINT4, sz2);
	}
}

//	___________________________________________________
//
//	convert SYSTEMTIME structure to number of days from today

static PGPError
sSystemTimeToPGPTime (
		 SYSTEMTIME*	pst, 
		 PGPTime*		ptime) 
{
	struct tm	tmstruct;
	time_t		timeStd;

	pgpAssert (pst != NULL);
	pgpAssert (ptime != NULL);

	*ptime = 0;

	if (pst->wYear > 2037) 
		return kPGPError_BadParams;

	tmstruct.tm_mday = pst->wDay;
	tmstruct.tm_mon = pst->wMonth -1;
	tmstruct.tm_year = pst->wYear -1900;
	tmstruct.tm_hour = 0;
	tmstruct.tm_min = 0;
	tmstruct.tm_sec = 0;
	tmstruct.tm_isdst = -1;

	timeStd = mktime (&tmstruct);
	if (timeStd == (time_t)-1) return kPGPError_BadParams;

	*ptime = PGPGetPGPTimeFromStdTime (timeStd);

	return kPGPError_NoErr;
}


//	_____________________________________________________
//
//  attempt to update keyid from server

static BOOL 
sUpdateKeyIDFromServer (
		HWND				hwnd,
		PCLPROPSHEETSTRUCT	pclpss,
		PGPKeyID*			pkeyid)
{
	BOOL			bUpdated		= FALSE;
	PGPKeyDBRef		keydb			= kInvalidPGPKeyDBRef;
	PGPUInt32		uCount;
	PGPError		err;

	SendMessage (pclpss->hwndParent, PGPCL_M_PROPERTYMESSAGE, 
			kPGPclProperties_EnableWindows, (LPARAM)FALSE);

	err = PGPclSearchServerForKeyIDs (
			pclpss->context, pclpss->tlscontext, 
			hwnd, pkeyid, 1, kPGPclDefaultServer, 
			pclpss->keydbBacking, &keydb);

	if (IsntPGPError (err))
	{
		if (PGPKeyDBRefIsValid (keydb)) 
		{
			PGPCountKeys (PGPPeekKeyDBRootKeySet (keydb), &uCount);
			if (uCount > 0)
			{
				err = PGPCopyKeys (PGPPeekKeyDBRootKeySet (keydb), 
						pclpss->keydbBacking, NULL);

				if (IsntPGPError (err))
				{
					bUpdated = TRUE;

					SendMessage (pclpss->hwndParent, 
							PGPCL_M_PROPERTYMESSAGE, 
							kPGPclProperties_UpdateKeyring, 0);
				}
			}
			PGPFreeKeyDB (keydb);
		}
	}

	SendMessage (pclpss->hwndParent, PGPCL_M_PROPERTYMESSAGE, 
			kPGPclProperties_EnableWindows, (LPARAM)TRUE);

	return bUpdated;
}


//	______________________________________________
//
//  callback routine called by library key generation routine
//  every so often with status of keygen.  Returning a nonzero
//  value cancels the key generation.

static PGPError 
sSubkeyGenEventHandler (
		PGPContextRef	context, 
		PGPEvent*		event,
		PGPUserValue	userValue)
{
	INT					iReturnCode = kPGPError_NoErr;
	PSUBKEYGENSTRUCT	pskgs;

	pskgs = (PSUBKEYGENSTRUCT) userValue;

	if (pskgs->bCancelPending) 
		iReturnCode = kPGPError_UserAbort;
	
	return (iReturnCode);
}


//	___________________________________________________
//
//  subkey generation thread

static VOID 
sSubkeyGenerationThread (void *pArgs)
{
	PSUBKEYGENSTRUCT	pskgs			= (PSUBKEYGENSTRUCT)pArgs;
	BOOL				bRetVal			= FALSE;
	PGPPrefRef			prefref			= kInvalidPGPPrefRef;
	UINT				uSubKeyAlg		= 0;

	PGPBoolean			bFastGen;
	PGPContextRef		ctx;
	UINT				uEntropyNeeded;

	if (pskgs->pclpss->uKeyAlg == kPGPPublicKeyAlgorithm_DSA)
		uSubKeyAlg = kPGPPublicKeyAlgorithm_ElGamal;
	else if (pskgs->pclpss->uKeyAlg == kPGPPublicKeyAlgorithm_ECSign)
		uSubKeyAlg = kPGPPublicKeyAlgorithm_ECEncrypt;
	else
		uSubKeyAlg = kPGPPublicKeyAlgorithm_RSA;

	// get client preferences
	pskgs->err = PGPclPeekClientLibPrefRefs (&prefref, NULL);
	if (IsntPGPError (pskgs->err))
	{
		ctx = pskgs->pclpss->context;
		PGPGetPrefBoolean (prefref, kPGPPrefFastKeyGen, &bFastGen);

		uEntropyNeeded = PGPGetKeyEntropyNeeded (ctx,	
				PGPOKeyGenParams (ctx, uSubKeyAlg, pskgs->psks->uSize),
				PGPOKeyFlags (ctx, kPGPKeyPropertyFlags_UsageEncrypt),
				PGPOKeyGenFast (ctx, bFastGen),
				PGPOLastOption (ctx));
		PGPclRandom (ctx, pskgs->hwndProgress, uEntropyNeeded);

		// generate subkey
		if (pskgs->pszPhrase) 
		{
			pskgs->err = PGPGenerateSubKey (
				ctx, &pskgs->psks->subkey,
				PGPOKeyGenMasterKey (ctx, pskgs->pclpss->key),
				PGPOKeyGenParams (ctx, uSubKeyAlg, pskgs->psks->uSize),
				PGPOKeyFlags (ctx, kPGPKeyPropertyFlags_UsageEncrypt),
				PGPOKeyGenFast (ctx, bFastGen),
				PGPOPassphrase (ctx, pskgs->pszPhrase),
				PGPOCreationDate (ctx, pskgs->psks->timeStart),
				PGPOExpiration (ctx, pskgs->psks->iExpireDays),
				PGPOEventHandler (ctx, sSubkeyGenEventHandler, pskgs),
				pskgs->pclpss->bOnToken ? 
					PGPOKeyGenOnToken (ctx, 0) :
					PGPONullOption (ctx),
				PGPOLastOption (ctx));
		}
		else 
		{
			pskgs->err = PGPGenerateSubKey (
				ctx, &pskgs->psks->subkey,
				PGPOKeyGenMasterKey (ctx, pskgs->pclpss->key),
				PGPOKeyGenParams (ctx, uSubKeyAlg, pskgs->psks->uSize),
				PGPOKeyFlags (ctx, kPGPKeyPropertyFlags_UsageEncrypt),
				PGPOKeyGenFast (ctx, bFastGen),
				PGPOPasskeyBuffer (ctx, pskgs->pPasskey, pskgs->sizePasskey),
				PGPOCreationDate (ctx, pskgs->psks->timeStart),
				PGPOExpiration (ctx, pskgs->psks->iExpireDays),
				PGPOEventHandler (ctx, sSubkeyGenEventHandler, pskgs),
				pskgs->pclpss->bOnToken ? 
					PGPOKeyGenOnToken (ctx, 0) :
					PGPONullOption (ctx),
				PGPOLastOption (ctx));
		}

		// note: PGPGenerateSubKey returns kPGPError_OutOfMemory 
		// when user aborts!
		if ((pskgs->err == kPGPError_OutOfMemory) ||
			(pskgs->bCancelPending))
		{
			pskgs->err = kPGPError_UserAbort;
		}
	}

	pskgs->bGenDone = TRUE;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?