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 + -
显示快捷键?