icqenc.c

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

C
558
字号
/*__________________________________________________________________________
 Copyright (C) 2002 PGP Corporation
 All rights reserved.
 
 $Id: ICQenc.c,v 1.18 2002/11/20 16:50:25 pbj Exp $
__________________________________________________________________________*/
#include "precomp.h"

/* Generic event handler */
PGPError
myEvents(
	PGPContextRef context,
	PGPEvent *event,
	PGPUserValue userValue
	)
{
	MYSTATE *s;
	(void) context;

	s = (MYSTATE *)userValue;

	if(PGPscProgressGetCancel(s->hwndWorking))
	{	
		return kPGPError_UserAbort;
	}

	switch( event->type ) 
	{
	case kPGPEvent_NullEvent:
		{	PGPEventNullData *d = &event->data.nullData;

			if(d->bytesTotal!=0)
			{
				return PGPscProgressSetBar(s->hwndWorking,
					(DWORD)(d->bytesWritten*100/d->bytesTotal),FALSE);
			}
		}
		break;
	case kPGPEvent_ErrorEvent:
		{	PGPEventErrorData *d = &event->data.errorData;

			if((d->error!=kPGPError_BadPassphrase)&&
				(d->error!=kPGPError_UserAbort))
				PGPclEncDecErrorBox (s->hwndWorking,d->error); 
		}
		break;
	case kPGPEvent_WarningEvent:
		{	PGPEventWarningData *d = &event->data.warningData;

		}
		break;
	case kPGPEvent_EntropyEvent:
		{	PGPEventEntropyData *d = &event->data.entropyData;
			PGPError err;

			err=PGPclRandom(context, s->hwndWorking, 
				d->entropyBitsNeeded);

			if(err==kPGPError_UserAbort)
			{
				return kPGPError_UserAbort;
			}
		}
		break;
	case kPGPEvent_AnalyzeEvent:
		{	PGPEventAnalyzeData *d = &event->data.analyzeData;

		}
		break;
	case kPGPEvent_BeginLexEvent:
		{	PGPEventBeginLexData *d = &event->data.beginLexData;
			s->sectionCount = d->sectionNumber;
		}
		break;
	case kPGPEvent_EndLexEvent:
		{	PGPEventEndLexData *d = &event->data.endLexData;

		}
		break;
		
	default:
		break;
	}
				
	return kPGPError_NoErr;
}

BOOL GetCommentLine(PGPContextRef context,
					char *comment,PGPSize size,PGPUInt32 *PrefAlg,
					PGPCipherAlgorithm *pAllowedAlgs, int *pNumAlgs)
{
	PGPPrefRef	prefRef=NULL;
	PGPError	err;
	BOOL RetVal;

	RetVal=TRUE;

	*comment=0;
	*PrefAlg=kPGPCipherAlgorithm_CAST5;

	err=PGPclPeekClientLibPrefRefs(&prefRef,NULL);

	if(IsntPGPError(err))
	{
		PGPPrefArray *prefArray = NULL;
		int i;

		PGPGetPrefNumber(prefRef,
			kPGPPrefPreferredAlgorithm, 
			PrefAlg);

		err = PGPGetPrefArray(prefRef,
			kPGPPrefAllowedAlgorithmsList, 
			&prefArray);

		if (IsntPGPError(err))
		{
			PGPBoolean aes256=FALSE;
			PGPInt32 num = prefArray->numElements;

			for (i=0; i<num; i++)  
			{
				pAllowedAlgs[i] = (PGPCipherAlgorithm) 
									prefArray->elements[i].data;
				if( pAllowedAlgs[i]==kPGPCipherAlgorithm_AES256 )
					aes256=TRUE;
			}
			
			if( aes256 )  
			{	
					pAllowedAlgs[i++] = kPGPCipherAlgorithm_AES128;
					pAllowedAlgs[i++] = kPGPCipherAlgorithm_AES192;
			}

			*pNumAlgs = i;

			PGPFreePrefArray(prefArray);
		}
		else
			*pNumAlgs = 0;

		if(*comment==0)
		{
			PGPGetPrefStringBuffer(prefRef,
				kPGPPrefComment,
				size,
				comment);
		}
	}
	
	return RetVal;
}

typedef struct
{
	// Client Prefs
	PGPBoolean encryptToSelf;
	PGPKeyDBObjRef defaultKey;
} APREF;

PGPError GrabRecipClientPrefs(HWND hwndParent,
							  PGPContextRef context,
							  PGPKeyDBRef keydb,
							  APREF *apref)
{
	PGPError		err;
	PGPPrefRef		prefRef;

	err = PGPclPeekClientLibPrefRefs(&prefRef,NULL);

	if (IsntPGPError (err))
	{
		PGPGetPrefBoolean(prefRef, kPGPPrefEncryptToSelf,
				&(apref->encryptToSelf));

		if(IsntPGPError(err))
		{
			//err=PGPclGetDefaultPrivateKey(keydb,&(apref->defaultKey));
			err=GetLocalUserKey(keydb,&apref->defaultKey);

			if(IsPGPError(err))
			{
				// Warning message here
				apref->defaultKey=NULL;
				err=kPGPError_NoErr;
			}
		}
	}

	return err;
}

PGPError GenericEncSign(MYSTATE *ms,
					PGPOptionListRef opts,
					char *OperationTarget)
{
	PGPError err;
	PPGPclRecipientDialogStruct prds;
	PGPContextRef	context;
	char StrRes[500],szPassTitle[100];
	PGPKeyDBObjRef Key;
	APREF apref;
	PGPKeySetRef EncKeySet=NULL;

	err=kPGPError_NoErr;	
	
	context=ms->context;

	prds=ms->prds;

	GrabRecipClientPrefs(ms->hwndWorking,
		context,
		ms->KeyDB,
		&apref);
	// If this is first operation, put up recipient/sign dialog

	if(ms->Encrypt)
	{
		Key=MatchICQWithKey(prds->szRecipientArray[0],ms->KeyDB,FALSE);

		if(Key==NULL)
		{
			MessageBox(ms->hwndWorking,
				"No key was found that matches the ICQ user\n"
				"number. Please have the recipient send you\n"
				"his/her PGP key using the Send Key button.",
				"PGP Error",
				MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);
			return kPGPError_UserAbort;
		}

		PGPNewOneKeySet(Key,&EncKeySet);

		if((apref.encryptToSelf)&&(apref.defaultKey!=NULL))
		{
			err = PGPAddKey (apref.defaultKey,EncKeySet);
		}
	}

	if(ms->Sign)
	{
		DWORD *lpOptions;
		PGPError err;

		LoadString (g_hinst, IDS_ENTERPASSPHRASE, StrRes, sizeof(StrRes));
		strcpy(szPassTitle,ms->szAppName);
		strcat(szPassTitle,StrRes);

		lpOptions=&(prds->dwOptions);

		if (ms->Encrypt || (ms->Operation==MS_ENCRYPTCLIPBOARD))
			lpOptions=0;

		LoadString (g_hinst, IDS_PASSPROMPTABOVEKEY, StrRes, sizeof(StrRes));

		GetLocalUserKey(ms->KeyDB,&(ms->SignKey));

		err=PGPclGetCachedSigningPhrase (context,
			ms->tlsContext,
			ms->hwndWorking, 
			StrRes,
			FALSE, // ForceEntry
			&ms->PassPhrase,
			ms->KeyDB,
			&(ms->SignKey),
//			NULL,
			lpOptions,
			prds->dwFlags,
			&ms->PassKey,
			&ms->PassKeyLen,
			NULL,szPassTitle);
			
		if(err != kPGPError_NoErr)
		{
			PGPclEncDecErrorBox(ms->hwndWorking,err);
			return kPGPError_UserAbort; // UserCancel 
		}
	}

	ms->fileName=OperationTarget;

	// if encrypting, throw in recipients
	if(ms->Encrypt)
	{
		PGPAppendOptionList(opts,
			PGPOEncryptToKeySet(context,EncKeySet),
			PGPOLastOption(context) );
	}

	if(ms->Sign)  // If signing, throw in a passphrase and key
	{
		// Use passkey if available
		if(ms->PassKey)
		{
			PGPAppendOptionList(opts,
				PGPOSignWithKey(context,ms->SignKey,
					PGPOPasskeyBuffer(context,
						ms->PassKey,ms->PassKeyLen),
					PGPOLastOption(context) ),
				PGPOLastOption(context) );
		}
		else
		{
			PGPAppendOptionList(opts,
				PGPOSignWithKey(context,ms->SignKey,
					PGPOLastOption(context) ),
				PGPOLastOption(context) );
		}
	}

	PGPAppendOptionList(opts,
		PGPOArmorOutput(context, TRUE),
		PGPOLastOption(context));

	if(*(ms->comment)!=0)
	{
		PGPAppendOptionList(opts,
			PGPOCommentString(context,(ms->comment)),
			PGPOLastOption(context));
	}

	err = PGPEncode(context,
		opts,
		PGPOPreferredAlgorithms(context,ms->allowedAlgs,ms->nNumAlgs),
		PGPOSendNullEvents(context,75),
		PGPOEventHandler(context,myEvents,ms),
		PGPOVersionString(context,pgpVersionHeaderString()),
		PGPOAskUserForEntropy(context, TRUE),
		PGPODataIsASCII(context,TRUE),
		PGPOLastOption(context));

	PGPscProgressSetBar(ms->hwndWorking,100,TRUE);	

	return err;
}

BOOL WeNeedToWordWrap(PGPContextRef context,
					  unsigned short* WordWrapThreshold)
{
	PGPBoolean	bWrapReturn=TRUE;
	PGPUInt32	WrapWidth=72;
	PGPPrefRef	prefRef;

	PGPclPeekClientLibPrefRefs(&prefRef,NULL);

	PGPGetPrefBoolean (prefRef,
		kPGPPrefWordWrapEnable, &bWrapReturn);
	PGPGetPrefNumber (prefRef, 
		kPGPPrefWordWrapWidth, &WrapWidth);

	*WordWrapThreshold=WrapWidth;

	return bWrapReturn;
}

PGPError EncryptClipboardStub (MYSTATE *ms) 
{
	PGPOptionListRef opts;
	PGPContextRef context;
	PGPError err;
	char StrRes[100];

	err=kPGPError_NoErr;

	context=ms->context;

	PGPBuildOptionList(context,&opts,
		PGPOInputBuffer(context,ms->pInput,ms->dwInputSize),
		PGPOAllocatedOutputBuffer(context,
			&(ms->pOutput),MAX_PGPSize ,&(ms->dwOutputSize)),
		PGPOLastOption(context));

	LoadString (g_hinst, IDS_CLIPBOARD, StrRes, sizeof(StrRes));

	err=GenericEncSign(ms,opts,StrRes);

	PGPFreeOptionList(opts);

	return err;
}

UINT DoWorkThread(HWND hwndWorking,void *pUserValue)
{
	MYSTATE *myState;
	PGPError err;
	DWORD nOleErr;

	err=kPGPError_UnknownError;

	myState=(MYSTATE *)pUserValue;

	myState->hwndWorking=hwndWorking;

	nOleErr = OleInitialize(NULL);

	if ((nOleErr == S_OK) || (nOleErr == S_FALSE))
	{
		err=EncryptClipboardStub (myState);

		OleUninitialize();
	}

	return err;
}

void FreePhrases(MYSTATE *ms)
{
	if(ms->PassPhrase)
	{
		PGPclFreeCachedPhrase(ms->PassPhrase);
		ms->PassPhrase=NULL;
	}

	if(ms->PassKey)
	{
		memset(ms->PassKey,0x00,ms->PassKeyLen);
		PGPFreeData(ms->PassKey);
		ms->PassKey=NULL;
	}
}

BOOL OpenRings(HWND hwnd,PGPContextRef context,PGPKeyDBRef *pkeydb)
{
	PGPError err;

	err=PGPclOpenDefaultKeyrings(context,
		kPGPOpenKeyDBFileOptions_None,pkeydb);

	if(IsPGPError(err))
	{
		MessageBox (hwnd,"PGP Error","Can't Open Rings",
				MB_OK|MB_ICONSTOP);
		return FALSE;
	}
	
	return TRUE;
}

#define IDR_PROGAVI 121

BOOL ICQEncryptBuffer(HWND hwnd,char *szApp,void *PGPsc,void *PGPtls,
				   BOOL Encrypt,BOOL Sign,
				   char *pInput,DWORD dwInputSize,
				   char **pOutput,DWORD *pdwOutputSize,
				   char **szRecipientArray,DWORD dwNumRecipients,
				   BOOL bForce)
{
	PGPContextRef context;
	PPGPclRecipientDialogStruct prds;
	char comment[80];
	PGPUInt32 PrefAlg;
	PGPCipherAlgorithm allowedAlgs[20];
	int nNumAlgs;
	MYSTATE *ms;
	PGPtlsContextRef tls;
	PGPError err;
	char StrRes[500];

	err=kPGPError_NoErr;

	context=(PGPContextRef)PGPsc;
	tls=(PGPtlsContextRef)PGPtls;

	PGPlnLicenseCheck (context);
	if(!PGPlnPGPmailEnabled())
	{
		PGPclNoLicense(hwnd,kPGPclICQplugin);
		return FALSE;
	}

	if(IsPGPError(PGPlnIsExpired(hwnd, kPGPlnOperationStandardExpiration)))
		return FALSE;

	if(!GetCommentLine(context,comment,sizeof(comment),&PrefAlg,
		allowedAlgs, &nNumAlgs))
		return FALSE;

	prds=(PPGPclRecipientDialogStruct)
		malloc(sizeof(PGPclRecipientDialogStruct));

	if(prds)
	{
		memset(prds,0x00,sizeof(PGPclRecipientDialogStruct));

		LoadString (g_hinst, IDS_PGPKEYSELDLG, StrRes, sizeof(StrRes));

		prds->szTitle=StrRes;
		prds->dwOptions=kPGPclASCIIArmor;
		prds->dwDisableFlags=kPGPclDisableASCIIArmor |
			kPGPclDisableWipeOriginal |
			kPGPclDisableInputIsText;

		if(bForce)
			prds->dwDisableFlags|=kPGPclDisableAutoMode;

		prds->dwNumRecipients	= dwNumRecipients;	
		prds->szRecipientArray	= szRecipientArray;

		ms=(MYSTATE *)malloc(sizeof(MYSTATE));
	
		if(ms)
		{
			memset(ms, 0x00, sizeof(MYSTATE) );

			ms->context=context;
			ms->tlsContext=tls;
			ms->pInput=pInput;
			ms->dwInputSize=dwInputSize;
			ms->Operation=MS_ENCRYPTCLIPBOARD;
			ms->prds=prds;
			ms->Encrypt=Encrypt; 
			ms->Sign=Sign;
			ms->comment=comment;
			ms->PrefAlg=PrefAlg;
			ms->allowedAlgs=allowedAlgs; 
			ms->nNumAlgs=nNumAlgs;
			ms->szAppName=szApp;

			if(OpenRings(hwnd,context,&(ms->KeyDB)))
			{	
				err=PGPscProgressDialog(hwnd,DoWorkThread,ms,
					  0,"Encoding...",
					  "","",IDR_PROGAVI);
	
				if(prds->keydbSelected)
					PGPFreeKeyDB(prds->keydbSelected);

				FreePhrases(ms);
				
				if((ms->pOutput!=0) && (IsntPGPError(err)))
				{
					*pOutput=ms->pOutput;
					*pdwOutputSize=ms->dwOutputSize;
				}

				PGPFreeKeyDB(ms->KeyDB);
			}
			free(ms);
		}
		free(prds);
	}

	if(IsPGPError(err))
		return FALSE;

	return TRUE;
}


/*__Editor_settings____

	Local Variables:
	tab-width: 4
	End:
	vi: ts=4 sw=4
	vim: si
_____________________*/

⌨️ 快捷键说明

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