📄 csecret.cpp
字号:
#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 + -