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

📄 csecret.cpp

📁 加密解密
💻 CPP
📖 第 1 页 / 共 3 页
字号:




#include "stdafx.h"
#include "CSecret.h"
#include <direct.h>

#include "pgpKeys.h"
#include "pgpErrors.h"
#include "pgpEncode.h"
#include "pgpFeatures.h"

#include "pgpUtilities.h"
#include "pgpKeyServer.h"
#include "pgpRandomPool.h"
#include "pgpOptionList.h"
#include "pgpDump.h"


void CSecret::InitDecodeInfo( DecodeInfo* info)
{
	info->outBuf = NULL;
	info->outBufSize = 0;
	info->sessionKey = NULL;
	info->sessionKeySize = 0;
	info->outFile = NULL;
	info->keyCount = 0;
	info->keyIter = kInvalidPGPKeyIterRef;
}

void  CSecret::CleanUpDecodeInfo( DecodeInfo* info)
{
	if(info->outBuf) 
	{
		PGPFreeData(info->outBuf);
		info->outBuf = NULL;
		info->outBufSize = 0;
	}
	
	if(info->sessionKey) 
	{
		PGPFreeData(info->sessionKey);
		info->sessionKey = NULL;
		info->sessionKeySize = 0;
	}

	if( PGPFileSpecRefIsValid(info->outFile))
	{
		PGPFreeFileSpec(info->outFile);
		info->outFile = NULL;
	}
}


PGPError  CSecret::OptestEventHandler(PGPContextRef context, PGPEvent *event, PGPUserValue userValue) 
{
	PGPError		err = kPGPError_NoErr;
	DecodeInfo*		info = (DecodeInfo*)userValue;
	static PGPBoolean   bKeyGen = false , bNull = false;
	static int			nlastProgress = 0; 
  	static PGPEventRecipientsData	*recipdata = NULL;
 	
	if( event->type != kPGPEvent_KeyGenEvent)
		bKeyGen = FALSE;
	if( event->type != kPGPEvent_NullEvent)
		bNull = FALSE;
	switch(event->type)
	{
	case kPGPEvent_NullEvent    ://			=  0,		/* ----- Null Event-----Nothing happened */
		{
			PGPEventNullData  *d = &event->data.nullData;
			int nprogress =  (int)(( (float) d->bytesWritten /  d->bytesTotal) * 100);			
			if(!bNull)
				bNull = TRUE;
			nlastProgress = nprogress;
		}
		break ;
	case kPGPEvent_InitialEvent	://	=  1,		/* ----- Initial Event----- */
		{
			bKeyGen = FALSE;
			bNull = FALSE;
			nlastProgress = 0;
			info->keyIter = kInvalidPGPKeyIterRef;
		}
		break ;
	case kPGPEvent_FinalEvent	://	=  2,		/* ----- Final Event----- */
//释放内存资源
		{
			nlastProgress = 0;
 			if( recipdata != NULL) 
			{ 
				PGPFreeData(recipdata); 
				recipdata = NULL; 
			}			
			if( PGPKeyIterRefIsValid( info->keyIter ) ) 
			{	
				PGPFreeKeyIter( info->keyIter );
				info->keyIter = kInvalidPGPKeyIterRef;
			}; 
			if(info->outBuf == NULL) 
				break ;
			if(info->option == kDecode_DumpTar)
			{
 				//dumpTAR(info->outBuf, (int)(info->outBufSize), FALSE);
				PGPFreeData(info->outBuf);
				info->outBuf = NULL;
				info->outBufSize = 0;
			}
 		//	else  if(info->option == kDecode_Ignore_Output)
			//{
			//}
			//else
			//{	
			//}
		}
		break ;
	case kPGPEvent_ErrorEvent	://	=  3,		/* ----- Error Event----- An error occurred */
		{
			PGPEventErrorData *d = &event->data.errorData;
		}
		break ;
	case kPGPEvent_WarningEvent	://	=  4,		/*----- Warning Event----- Warning event */
		{
 			PGPEventWarningData *d = &event->data.warningData;		
/*			if(d->warning == kPGPError_KeyInvalid && d->warningArg)
			{
				PGPKeySetRef keyset = d->warningArg;
				PGPUInt32 numKeys;	
				err = PGPCountKeys(keyset, &numKeys);
				if(numKeys)
				{
					PGPKeyIterRef   iter	= kInvalidPGPKeyIterRef;
					PGPKeyDBObjRef  aKey	= kInvalidPGPKeyDBObjRef;					
					err = PGPNewKeyIterFromKeySet(keyset, &iter);
					while( IsntPGPError( PGPKeyIterNextKeyDBObj( iter, kPGPKeyDBObjType_Key, &aKey) ) )
					{
						PGPKeyID  keyID;
						PGPChar8 outString[ kPGPMaxKeyIDStringSize ];						
						PGPGetKeyID( aKey, &keyID );
						PGPGetKeyIDString( &keyID, kPGPKeyIDString_Full, outString);
					}			
					if( PGPKeyIterRefIsValid( iter ) ) 
						PGPFreeKeyIter( iter );
				}
 			}	*/		
		}
		break ;
	case kPGPEvent_EntropyEvent	://	=  5,		/* More entropy is needed */

		break ;
	case kPGPEvent_PassphraseEvent ://	=  6,		/* ----- Passphrase Event-----A passphrase is needed */
		{
			PGPEventPassphraseData  *d = &event->data.passphraseData;
			if(d->keyset == NULL)
				break ;
			PGPUInt32 numKeys;		
			err = PGPCountKeys(d->keyset, &numKeys);
			if(numKeys < 1)
				break ;
			PGPKeyDBObjRef  aKey = kInvalidPGPKeyDBObjRef;			
			if( !PGPKeyIterRefIsValid( info->keyIter ) ) 
				err = PGPNewKeyIterFromKeySet(d->keyset, &info->keyIter);
			int i = 0 ;
			while( IsntPGPError( PGPKeyIterNextKeyDBObj( info->keyIter, kPGPKeyDBObjType_Key, &aKey) ) )
			{
				PGPKeyID  keyID;
				PGPChar8 outString[ kPGPMaxKeyIDStringSize ];								
				PGPGetKeyID( aKey, &keyID );
				PGPGetKeyIDString( &keyID, kPGPKeyIDString_Full, outString);				
				for(i = 0;i < info->keyCount; i++)
				{
					if( PGPCompareKeyIDs( &info->key[i].keyID, &keyID) != 0 )
						continue ;
					err = PGPAddJobOptions( event->job,
								PGPOPassphraseBuffer( context, info->key[i].passPhrase, 
													  strlen( info->key[i].passPhrase ) ),
								PGPOLastOption( context ) );
					goto got_paassphrase;
				}
			}			
		got_paassphrase:	
			break ;
		}
		break ;
	case kPGPEvent_InsertKeyEvent ://	=  7,		/* Smart card must be inserted */

		break ;
	case kPGPEvent_AnalyzeEvent	://	=  8,		/* ----- Analyze Event-----Initial analysis event,  before any output */
		{
			PGPEventAnalyzeData *d = &event->data.analyzeData;
	  	}			
		break ;
	case kPGPEvent_RecipientsEvent ://	=  9,		/*-----  Recipients Event----- Recipient list report,  before any output */
		{
			PGPEventRecipientsData  *d = &event->data.recipientsData;
			if(recipdata != NULL)
				PGPFreeData(recipdata);
			recipdata = (PGPEventRecipientsData*) PGPNewData( PGPGetDefaultMemoryMgr(), sizeof(PGPEventRecipientsData) ,  0 );
			if(recipdata != NULL)
			{
				recipdata->recipientSet = d->recipientSet;
				recipdata->keyCount 	= d->keyCount;
				recipdata->keyIDArray 	= d->keyIDArray;				
				PGPIncKeySetRefCount(d->recipientSet);
			}			
		}
		break ;
	case kPGPEvent_KeyFoundEvent ://		= 10,		/* Key packet found */

		break ;
	case kPGPEvent_OutputEvent	://	= 11,		/* ----- Output Event-----Output specification needed */
		{
			PGPEventOutputData *d = &event->data.outputData;
			PGPBoolean  bHandled   = FALSE;			
			if(d->suggestedName != NULL)
			{
 				char		*ext	= extname(d->suggestedName);
				char		baseName[MAX_PATH];
				char		pathName[MAX_PATH];				
				PGPBoolean  bTAR	= FALSE;				
				baseName[0] = 0;				
 				if ((d->messageType == 'b') && (ext && (strcmp("tar", ext) == 0))) 
					bTAR = TRUE;
				if(ext != NULL )
				{
					strncat(baseName, d->suggestedName, ext - d->suggestedName );
					baseName[ ext - d->suggestedName-1] = 0;
				}
				else 
					strcat(baseName, d->suggestedName);	
				switch( info->option)
				{
					case kDecode_MakeTarCache:
					if(bTAR)
					{
						if( PGPFileSpecRefIsValid(info->outFile))
						{
							PGPFreeFileSpec(info->outFile);
							info->outFile = NULL;
						}
						err = PGPNewFileSpecFromFullPath( context, pathName, &info->outFile );
						err = PGPAddJobOptions( event->job,
												PGPOOutputTARCache(context, info->outFile ),
												PGPOLastOption(context));
						bHandled = TRUE;
					}
					break;	 
					case kDecode_UnpackTar:
					if(bTAR)  /* make a directory to drop the TAR */
 					{
						if( (_mkdir(pathName) != 0) && (errno != EEXIST))
								err = kPGPError_FileOpFailed;  
						else
						{						
							if( PGPFileSpecRefIsValid(info->outFile))
							{
								PGPFreeFileSpec(info->outFile);
								info->outFile = NULL;
							}
							err = PGPNewFileSpecFromFullPath( context, pathName, &info->outFile );
							err = PGPAddJobOptions( event->job,
											PGPOOutputDirectory(context, info->outFile ),
											PGPOLastOption(context));
							bHandled = TRUE;
						}
					}
					break;					
					case kDecode_FileOutput:
						err = PGPNewFileSpecFromFullPath( context, pathName, &info->outFile );
						err = PGPAddJobOptions( event->job,
										PGPOOutputFile(context, info->outFile ),
										PGPOLastOption(context));
						bHandled = TRUE;
					break;					
					default:;
				}
			}
			if(!bHandled)
			{
				if(info->outBuf) 
				{
					PGPFreeData(info->outBuf);
					info->outBuf = NULL;
					info->outBufSize = 0;
				}
				err = PGPAddJobOptions( event->job,
					   PGPOAllocatedOutputBuffer( context, (void**)&info->outBuf, MAX_PGPSize, &info->outBufSize),
					   PGPOLastOption(context));
			}
		}
		break ;
	case kPGPEvent_SignatureEvent ://	= 12,		/* -----  Sig Event-----Signature status report */
 		{
			PGPEventSignatureData *d = &event->data.signatureData;
		}
		break ;
	case kPGPEvent_BeginLexEvent ://		= 13,		/*----- Begin Lex Event----- Initial event per lexical unit*/
		{
			PGPEventBeginLexData *d = &event->data.beginLexData;
		}
		break ;
	case kPGPEvent_EndLexEvent	://	= 14,		/* ----- End Lex Event-----Final event per lexical unit */
		{
			PGPEventEndLexData *d = &event->data.endLexData;			
		}	
		break ;
	case kPGPEvent_RecursionEvent ://	= 15,		/* Notification of recursive  job creation */

		break ;
	case kPGPEvent_DetachedSignatureEvent :// = 16,	/*----- Detached Sig Event----- Need input for verification of   detached signature */

		break ;
	case kPGPEvent_KeyGenEvent	://	= 17,		/* ----- KeyGen Event-----Key generation progress */
		{
			PGPUInt32 state =  event->data.keyGenData.state;
			if (!bKeyGen )
				bKeyGen = TRUE;
		}
		break ;
	case kPGPEvent_KeyServerEvent ://	= 18,		/*-----  Key Server Event----- Key Server progress */
		{
			PGPEventKeyServerData  *d = &event->data.keyServerData;	
 		}
		break ;
	case kPGPEvent_KeyServerSignEvent :// = 19,		/* Key Server passphrase */

		break ;
	case kPGPEvent_KeyServerTLSEvent ://	= 20,		/* Key Server TLS event */

		break ;
	case kPGPEvent_KeyServerIdleEvent :// = 21,		/* Idle during keyserver call */

		break ;
	case kPGPEvent_SocketsIdleEvent ://	= 22,		/* Idle during sockets */

		break ;
	case kPGPEvent_DecryptionEvent ://	= 23,		/* ----- Decryption Event-----Decryption data report */
		{
			PGPEventDecryptionData  *d = &event->data.decryptionData;
			char * cipher =  cipher_algor_table(d->cipherAlgorithm);
			unsigned int i;
 	
			if(info->sessionKey) 
			{
				PGPFreeData(info->sessionKey);
				info->sessionKey = NULL;
				info->sessionKeySize = 0;
			}

			info->sessionKey = (PGPByte*) PGPNewSecureData( PGPGetDefaultMemoryMgr(), d->sessionKeyLength, kPGPMemoryMgrFlags_None);
			if( info->sessionKey  == NULL)
			{
				err = kPGPError_OutOfMemory;
				goto done;
 			}
 			info->sessionKeySize = d->sessionKeyLength;

⌨️ 快捷键说明

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