clphrase.c

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

C
827
字号
		PGPKeyDBRef			keydbMain,
		PGPKeyDBObjRef		key,
		char**				ppszPhrase,
		PGPByte**			ppPasskeyBuffer,
		PGPInt32*			piPasskeyLength)
{
	PGPError	err				= kPGPError_BadParams;
	PGPBoolean	bSplit			= FALSE;
	LPSTR		psz;
	UINT		uFlags;

	if (!ppPasskeyBuffer)
		return err;
	if (!piPasskeyLength)
		return err;

	psz = NULL;
	*ppPasskeyBuffer = NULL;
	*piPasskeyLength = 0;

	if (key)
	{
		PGPGetKeyDBObjBooleanProperty (key,
				kPGPKeyProperty_IsSecretShared, &bSplit);
	}

	do
	{
		if (bSplit)
		{
			err=PGPclReconstituteKey(
				context,			// in context
				tlsContext,			// in TLS context
				hwnd,				// in hwnd of parent
				keydbMain,			// in keydb
				key,				// in key
				ppPasskeyBuffer,	// out passkey buffer
				piPasskeyLength);	// out passkey length
		}
		else
		{
			if (key)
				uFlags = kPGPclKeyPassphrase;
			else
				uFlags = kPGPclDecryption;

			err = PGPclGetPhrase (
				context,			// in context
				keydbMain,			// in main keydb
				hwnd,				// in hwnd of parent
				szPrompt,			// in prompt
				&psz,				// out phrase
				NULL,				// in keyset
				NULL,				// in keyids
				0,					// in keyid count
				&key,				// in/out key
				NULL,				// out options
				uFlags,				// in flags
				ppPasskeyBuffer,	// out passkey buffer
				piPasskeyLength,	// out passkey length
				0,0,				// in min length/quality
				tlsContext,			// in tlsContext,
				NULL,				// out AddedKeys
				NULL);

		}

		if (IsPGPError (err))
		{
			if (psz)
			{
				PGPFreeData (psz);
				psz = NULL;
			}
			if (*ppPasskeyBuffer)
			{
				PGPFreeData (*ppPasskeyBuffer);
				*ppPasskeyBuffer = NULL;
			}
			PGPclErrorBox (hwnd, err);
		}
		else
		{
			PGPclCachePhrase (context, key, 
					psz, *ppPasskeyBuffer, *piPasskeyLength);

			if (ppszPhrase)
				*ppszPhrase = psz;
			else
				PGPclFreePhrase (psz);
		}

	} while (err == kPGPError_BadPassphrase);

	return err;
}


//	_______________________________________________________
//
//	get passphrase for decryption from user

PGPError PGPclExport
PGPclGetDecryptionPhrase (
		PGPContextRef		context,
		PGPtlsContextRef	tlsContext,
		HWND				hwnd,
		char*				szPrompt,
		PGPKeyDBRef			keydbMain,
		PGPKeyDBObjRef*		pkey,
		PGPKeySetRef		keysetDecryption,
		PGPInt32			iKeyIDCount,
		PGPKeyID*			keyidsDecryption,
		PGPKeyDBRef*		pkeydbToAdd,
		char**				ppszPhrase,
		PGPByte**			ppPasskeyBuffer,
		PGPInt32*			piPasskeyLength)
{
	PGPError	err				= kPGPError_BadParams;
	PGPBoolean	bSplit			= FALSE;
	LPSTR		psz;

	if (!ppPasskeyBuffer) return err;
	if (!piPasskeyLength) return err;

	psz = NULL;
	*ppPasskeyBuffer = NULL;
	*piPasskeyLength = 0;

	if (pkey)
	{
		if (*pkey)
		{
			PGPGetKeyDBObjBooleanProperty (*pkey,
					kPGPKeyProperty_IsSecretShared, &bSplit);
		}
	}

	do {
		if (bSplit) 
		{
			err=PGPclReconstituteKey(
				context,			// in context
				tlsContext,			// in TLS context
				hwnd,				// in hwnd of parent
				keydbMain,			// in keyset
				*pkey,				// in key
				ppPasskeyBuffer,	// out passkey buffer
				piPasskeyLength);	// out passkey length
		}
		else 
		{
			err = PGPclGetPhrase (
				context,			// in context
				keydbMain,			// in main keyset
				hwnd,				// in hwnd of parent
				szPrompt,			// in prompt
				&psz,				// out phrase
				keysetDecryption,	// in keyset
				keyidsDecryption,	// in keyids
				iKeyIDCount,		// in keyid count
				pkey,				// in/out key
				NULL,				// out options
				kPGPclDecryption,	// in flags
				ppPasskeyBuffer,	// out passkey buffer
				piPasskeyLength,	// out passkey length
				0,0,				// in min length/quality
				tlsContext,			// in tlsContext,
				pkeydbToAdd,		// out AddedKeys
				NULL);

		}

		if (IsPGPError (err)) 
		{
			if (psz) 
			{
				PGPFreeData (psz);
				psz = NULL;
			}
			if (*ppPasskeyBuffer) 
			{
				PGPFreeData (*ppPasskeyBuffer);
				*ppPasskeyBuffer = NULL;
			}
			PGPclErrorBox (hwnd, err);
		}
		else 
		{
			if (pkey)
			{
				PGPclCachePhrase (context, *pkey, 
						psz, *ppPasskeyBuffer, *piPasskeyLength);
			}

			if (ppszPhrase) 
				*ppszPhrase = psz;
			else 
				PGPclFreePhrase (psz);
		}

	} while (err == kPGPError_BadPassphrase);

	return err;
}


//	_______________________________________________________
//
//	get passphrase for signing key from user

PGPError PGPclExport
PGPclGetSigningKeyPhrase (
		PGPContextRef		context,
		PGPtlsContextRef	tlsContext,
		HWND				hwnd,
		char*				szPrompt,
		PGPKeyDBRef			keydbMain,
		PGPBoolean			bRejectSplitKeys,
		PGPKeyDBObjRef*		pkey,
		char**				ppszPhrase,
		PGPByte**			ppPasskeyBuffer,
		PGPInt32*			piPasskeyLength)
{
	PGPError	err			= kPGPError_BadParams;
	LPSTR		psz;
	UINT		uFlags;

	if (!ppPasskeyBuffer)
		return err;
	if (!piPasskeyLength)
		return err;

	psz = NULL;
	*ppPasskeyBuffer = NULL;
	*piPasskeyLength = 0;

	if (bRejectSplitKeys)
		uFlags = kPGPclRejectSplitKeys;
	else
		uFlags = 0;

	err = PGPclGetPhrase (
		context,			// in context
		keydbMain,			// in main keydb
		hwnd,				// in hwnd of parent
		szPrompt,			// in prompt
		&psz,				// out phrase
		NULL,				// in keyset
		NULL,				// in keyids
		0,					// in keyid count
		pkey,				// in/out key
		NULL,				// out options
		uFlags,				// in flags
		ppPasskeyBuffer,	// out passkey buffer
		piPasskeyLength,	// out passkey length
		0,0,				// in min length/quality
		tlsContext,			// in tlsContext
		NULL,NULL);			// out AddedKeys

	if (IsPGPError (err))
	{
		if (psz)
		{
			PGPFreeData (psz);
			psz = NULL;
		}
		if (*ppPasskeyBuffer)
		{
			PGPFreeData (*ppPasskeyBuffer);
			*ppPasskeyBuffer = NULL;
		}
	}
	else
	{
		if (pkey)
		{
			PGPclCachePhrase (context, *pkey, 
					psz, *ppPasskeyBuffer, *piPasskeyLength);
		}

		if (ppszPhrase)
			*ppszPhrase = psz;
		else
			PGPclFreePhrase (psz);
	}

	if (bRejectSplitKeys)
	{
		if (err == kPGPError_KeyUnusableForSignature)
		{
			PGPclMessageBox (hwnd, IDS_CAPTIONINFO, 
					IDS_SPLITKEYSNOTALLOWED, MB_OK|MB_ICONINFORMATION);
			err = kPGPError_UserAbort;
		}
	}

	return err;
}


//	_______________________________________________________
//
//	get passphrase with confirmation from user

PGPError PGPclExport
PGPclGetConfirmationPhrase (
		PGPContextRef	context,
		HWND			hwnd,
		LPSTR			szPrompt,
		PGPKeyDBRef		keydbMain,
		INT				iMinLen,
		INT				iMinQual,
		LPSTR*			ppszPhrase)
{
	PGPError	err			= kPGPError_BadParams;
	PGPUInt32	uFlags		= kPGPclEncryption;

	if (iMinQual < 0)
	{
		iMinQual = 0;
		uFlags |= kPGPclHideQualityIndicator;
	}

	if (!ppszPhrase)
		return err;

	err = PGPclGetPhrase (
		context,			// in context
		keydbMain,			// in main keydb
		hwnd,				// in hwnd of parent
		szPrompt,			// in prompt
		ppszPhrase,			// out phrase
		NULL,				// in keyset
		NULL,				// in keyids
		0,					// in keyid count
		NULL,				// in/out key
		NULL,				// out options
		uFlags,				// in flags
		NULL,				// out passkey buffer
		NULL,				// out passkey length
		iMinLen,iMinQual,	// min length/quality
		NULL,NULL,NULL);	// tlsContext/Added Keys

	if (IsPGPError (err))
	{
		if (*ppszPhrase)
		{
			PGPFreeData (*ppszPhrase);
			*ppszPhrase = NULL;
		}
	}

	return err;
}


//	_______________________________________________________
//
//	get conventional passphrase from user

PGPError PGPclExport
PGPclGetConventionalPhrase (
		PGPContextRef	context,
		HWND			hwnd,
		LPSTR			pszPrompt,
		LPSTR*			ppszPhrase)
{
	PGPError			err			= kPGPError_BadParams;
	PGPOptionListRef	optionList	= kInvalidPGPOptionListRef;

	if (!ppszPhrase)
		return err;

	err = PGPBuildOptionList (context, &optionList,
			PGPOUIOutputPassphrase (context, ppszPhrase),
			PGPOUIParentWindowHandle (context, hwnd),
			PGPOLastOption (context));

	if (IsntPGPError (err))
	{
		// If we have a prompt, use it
		if (IsntNull (pszPrompt))
		{
			err = PGPAppendOptionList (optionList,
				PGPOUIDialogPrompt (context, pszPrompt),
				PGPOLastOption (context));
		}

		if (IsntPGPError (err))
		{
			err = PGPConventionalDecryptionPassphraseDialog (context,
					optionList,
					PGPOLastOption (context));
		}
	}

	if (IsPGPError (err))
	{
		if (*ppszPhrase)
		{
			PGPFreeData (*ppszPhrase);
			*ppszPhrase = NULL;
		}
	}

	if (PGPOptionListRefIsValid (optionList))
		PGPFreeOptionList (optionList);

	return err;
}

⌨️ 快捷键说明

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