clchange.c

来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 259 行

C
259
字号
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.

	CLchange.c - handle dialog for changing key passphrase
	
	$Id: CLchange.c,v 1.20 2002/10/31 04:13:35 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"

// project header files
#include "PGPclx.h"

// external globals
extern HINSTANCE	g_hInst;

// local globals
static BOOL			sbChangingPhrase	= FALSE;


//	___________________________________________________
//
//  Change Passphrase of split key and all subkeys

static PGPError 
sChangePhraseSplit (
		PGPContextRef	context,
		PGPKeyDBRef		keydb,
		PGPKeyDBObjRef	key, 
		PGPByte*		passkey,
		PGPSize			sizePasskey,
		LPSTR			szNew) 
{
	PGPKeyIterRef	keyiter;
	PGPKeyDBObjRef	subkey;
	PGPError		err;

	err = PGPChangePassphrase (key, 
			PGPOPasskeyBuffer (context, passkey, sizePasskey),
			PGPOPassphrase (context, szNew), 
			PGPOLastOption (context));
	if (IsPGPError (err)) 
		return err;

	PGPNewKeyIterFromKeyDB (keydb, &keyiter);
	PGPKeyIterSeek (keyiter, key);
	PGPKeyIterNextKeyDBObj (keyiter, kPGPKeyDBObjType_SubKey, &subkey);
	while (subkey) 
	{
		err = PGPChangePassphrase (subkey, 
				PGPOPasskeyBuffer (context, passkey, sizePasskey),
				PGPOPassphrase (context, szNew),
				PGPOLastOption (context));
		PGPKeyIterNextKeyDBObj (keyiter, kPGPKeyDBObjType_SubKey, &subkey);
	}
	PGPFreeKeyIter (keyiter);

	return err;
}

//	___________________________________________________
//
//  Change Passphrase of normal key and all subkeys

static PGPError 
sChangePhraseNormal (
		PGPContextRef	context,
		PGPKeyDBRef		keydb,
		PGPKeyDBObjRef	key, 
		PGPBoolean		bOnToken,
		LPSTR			szOld,
		LPSTR			szNew) 
{
	PGPKeyIterRef	keyiter;
	PGPKeyDBObjRef	subkey;
	PGPError		err;

	err = PGPChangePassphrase (key, 
			PGPOPassphrase (context, szOld),
			PGPOPassphrase (context, szNew), 
			PGPOLastOption (context));
	if (IsPGPError (err)) 
		return err;

	if (!bOnToken)
	{
		PGPNewKeyIterFromKeyDB (keydb, &keyiter);
		PGPKeyIterSeek (keyiter, key);
		PGPKeyIterNextKeyDBObj (keyiter, kPGPKeyDBObjType_SubKey, &subkey);
		while (subkey) 
		{
			err = PGPChangePassphrase (subkey, 
					PGPOPassphrase (context, szOld),
					PGPOPassphrase (context, szNew),
					PGPOLastOption (context));
			PGPKeyIterNextKeyDBObj (keyiter, kPGPKeyDBObjType_SubKey, &subkey);
		}
		PGPFreeKeyIter (keyiter);
	}

	return err;
}


//	___________________________________________________
//
//  Change passphrase on key 

PGPError PGPclExport 
PGPclChangePhrase (
		PGPContextRef		context,
		PGPtlsContextRef	tlscontext,
		HWND				hwnd, 
		PGPKeyDBObjRef		key,
		PGPBoolean			bAdvise) 
{
	LPSTR		pszOldPhrase		= NULL;
	LPSTR		pszNewPhrase		= NULL;
	PGPByte*	pPasskey			= NULL;
	PGPPrefRef	prefs				= kInvalidPGPPrefRef;
	INT			iMinPhraseLength	= 0;
	INT			iMinPhraseQuality	= 0;
	PGPBoolean	bOnToken			= FALSE;

	PGPKeyDBRef	keydb;
	CHAR		szPrompt[64];
	PGPSize		sizePasskey;
	PGPError	err;
	BOOL		bSplit;
	PGPBoolean	b;
	PGPUInt32	u;

	err=kPGPError_NoErr;

	if (!sbChangingPhrase) 
	{
		sbChangingPhrase = TRUE;

		if(PGPlnEnterprise())
		{
			// minimum passphrase length
			err = PGPclPeekClientLibPrefRefs (&prefs, NULL); CKERR;

			err = PGPGetPrefBoolean (prefs, kPGPPrefEnforceMinChars, &b); CKERR;
			if (b) 
			{
				err = PGPGetPrefNumber (prefs, kPGPPrefMinChars, &u); CKERR;
				iMinPhraseLength = (INT)u;
			}

			// minimum passphrase quality
			PGPGetPrefBoolean (prefs, kPGPPrefEnforceMinQuality, &b); CKERR;
			if (b) 
			{
				err = PGPGetPrefNumber (prefs, kPGPPrefMinQuality, &u); CKERR;
				iMinPhraseQuality = (INT)u;
			}
		}

		PGPGetKeyDBObjBooleanProperty (key, 
				kPGPKeyProperty_IsOnToken, &bOnToken);

		if (bOnToken)
		{
			PGPTokenInfo	pti;

			pti.size =  sizeof(pti);
			PGPGetTokenInfo (context, 0, &pti);

			iMinPhraseLength = pti.minPinLen;
			iMinPhraseQuality = 0;

			if (PGPclMessageBox (hwnd, 
					IDS_CAPTIONINFO, IDS_CHANGETOKENPHRASE, 
					MB_OKCANCEL|MB_ICONINFORMATION) == IDCANCEL)
			{
				err = kPGPError_UserAbort;
			}
		}

		if (IsntPGPError (err))
		{
			keydb = PGPPeekKeyDBObjKeyDB (key);
			err = PGPclGetKeyPhrase (context, tlscontext, hwnd, 
					NULL, keydb, key, &pszOldPhrase, &pPasskey, &sizePasskey);
		}

		if (IsntPGPError (err)) 
		{
			LoadString (g_hInst, 
					IDS_NEWPHRASEPROMPT, szPrompt, sizeof(szPrompt));

			err = PGPclGetConfirmationPhrase (context, hwnd, szPrompt,
					keydb, iMinPhraseLength, iMinPhraseQuality, 
					&pszNewPhrase);

			if (IsntPGPError (err)) 
			{
				if (pszOldPhrase) 
					bSplit = FALSE;
				else 
					bSplit = TRUE;

				if (bSplit) 
				{
					err = sChangePhraseSplit (context,
							keydb, key, pPasskey, sizePasskey, pszNewPhrase);
				}
				else 
				{
					err = sChangePhraseNormal (context,
							keydb, key, bOnToken, pszOldPhrase, pszNewPhrase);
				}
			}
		}

		if (IsntPGPError (err))
		{
			PGPclCachePhrase (context, key, 
					pszNewPhrase, pPasskey, sizePasskey);
		}

		if (pszOldPhrase)
			PGPclFreePhrase (pszOldPhrase);
		if (pszNewPhrase)
			PGPclFreePhrase (pszNewPhrase);
		if (pPasskey)
			PGPclFreePasskey (pPasskey, sizePasskey);

		if (bAdvise && IsntPGPError (err))
		{
			if (bSplit)
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONINFO, 
						IDS_KEYRECONSTITUTED, MB_OK|MB_ICONINFORMATION);
			}
			else
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONINFO, 
						IDS_PHRASECHANGED, MB_OK|MB_ICONINFORMATION);
			}
		}
	}

done :

	sbChangingPhrase = FALSE;

	if (bOnToken && (err == kPGPError_BadPassphrase))
	{
		PGPclMessageBox (hwnd, IDS_CAPTIONALERT,
				IDS_TOKENPHRASEREJECTED, MB_OK|MB_ICONEXCLAMATION);
	}
	else
		PGPclErrorBox (hwnd, err);

	return err;
}

⌨️ 快捷键说明

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