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

📄 sclogin.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
📖 第 1 页 / 共 2 页
字号:
	DebugOutput("Reconnect!");

	if(IsPGPError(PGPsdkReconnect()))
	{
		DebugOutput("Reconnect failed.");

		return CP_NONE;
	}

	dwRet=CP_NONE;

	// Find the correct prefs file
	if(!SwitchToCorrectPrefs(pszUserASCII,szNT))
	{
		DebugOutput("No prefs for user?");

		return CP_NONE;
	}

	err=PGPclPeekClientLibPrefRefs(&prefRef,NULL);

	if(IsPGPError(err))
	{
		DebugOutput("PGPclPeekClientLibPrefRefs failed CP_NONE");

		dwRet=CP_NONE;
	}
	else
	{
		PGPGetPrefNumber( prefRef, 
			kPGPPrefCacheType, &cacheType );

		PGPGetPrefNumber( prefRef, 
			kPGPPrefCacheSeconds, &cacheSeconds );

		PGPGetPrefBoolean( prefRef, 
			kPGPPrefShareCache, &globalCache );

		err=PGPclOpenDefaultKeyrings(*PGPsc,
			kPGPOpenKeyDBFileOptions_None,&(keydb));

		if(IsPGPError(err))
		{
			dwRet=CP_NONE;
		}
		else
		{
			DebugOutput("Getting default key!");

			err=PGPclGetDefaultPrivateKey(keydb,&key);

			DebugOutput("Done getting default!");

			if(IsPGPError(err))
			{
				dwRet=CP_NONE;
			}
			else
			{
				char prefs[256];

				wsprintf(prefs,
					"Type %d Seconds %d global %d",
					cacheType,cacheSeconds,globalCache);

				DebugOutput(prefs);

				// Cache phrase 
				if(PGPPassphraseIsValid (key, 
					PGPOPassphrase (*PGPsc, pszPassASCII),
						( cacheType == kPGPPrefCacheTypeNone ) ?
							PGPONullOption( *PGPsc ) :
							PGPOCachePassphrase(*PGPsc,
								( cacheType == kPGPPrefCacheTypeLogon ) ?
								kPGPMaxTimeInterval : cacheSeconds,
								globalCache),
					PGPOLastOption (*PGPsc)))
				{
					DebugOutput("DEBUG VERSION: Caching succeeded");

					dwRet=CP_OK;
				}
				else
				{
					DebugOutput("DEBUG VERSION: Caching failed");
				}
			}

			PGPFreeKeyDB(keydb);
		}
	}

	return dwRet;
}

#define EWI_NONE 0
#define EWI_DROPWITHWININFO 1

DWORD PGPscEncryptWinInfo(HWND hwnd,
					void **vPGPsc,
					void **vPGPtls,
					void *memmgr,
					char *pszUserASCII,
					void *pInput,
					DWORD dwInputSize,
					char *szNT)
{
	PGPError err;
	void *pOutput;
	DWORD dwOutputSize;
	PGPKeyDBRef	keydb;
	PGPKeyDBObjRef key;
	PGPPrefRef prefRef;
	DWORD dwRet;
	PGPContextRef *PGPsc;
	PGPtlsContextRef *PGPtls;

	PGPsc=(PGPContextRef *)vPGPsc;
	PGPtls=(PGPtlsContextRef *)vPGPtls;

	DebugOutput("PGPSC: PGPscEncryptWinInfo");

	// Wait here till our context is created
	WaitOnSC(PGPsc);

	if(*PGPsc==(PGPContextRef)(-1))
	{
		DebugOutput("There is no context. Retreat! EWI_NONE");
		return EWI_NONE;
	}

	dwRet=EWI_NONE;

	// Find the correct prefs file
	if(!SwitchToCorrectPrefs(pszUserASCII,szNT))
	{
		DebugOutput("No prefs for user?");

		return EWI_NONE;
	}

	err=PGPclPeekClientLibPrefRefs(&prefRef,NULL);

	if(IsPGPError(err))
	{
		DebugOutput("PGPclPeekClientLibPrefRefs failed EWI_DROPWITHWININFO");

		dwRet=EWI_DROPWITHWININFO;
	}
	else
	{
		err=PGPclOpenDefaultKeyrings(*PGPsc,
			kPGPOpenKeyDBFileOptions_None,&(keydb));

		if(IsPGPError(err))
		{
			dwRet=EWI_DROPWITHWININFO;
		}
		else
		{
			DebugOutput("Getting default key!");

			err=PGPclGetDefaultPrivateKey(keydb,&key);

			DebugOutput("Done getting default!");

			if(IsPGPError(err))
			{
				dwRet=EWI_DROPWITHWININFO;
			}
			else
			{

				err = PGPEncode(*PGPsc,
						PGPOEncryptToKeyDBObj(*PGPsc,key),
						PGPOInputBuffer(*PGPsc,pInput,dwInputSize),
						PGPOAllocatedOutputBuffer(*PGPsc,
							&(pOutput),100000,&(dwOutputSize)),
						PGPOLastOption(*PGPsc));

				if(IsPGPError(err))
				{
					dwRet=EWI_DROPWITHWININFO;
				}
				else
				{
					DebugOutput("Setting pref!");

					err = PGPSetPrefData (prefRef, 
						kPGPPrefLoginWindowsInfo,dwOutputSize,pOutput);

					if(IsPGPError(err))
					{
						dwRet=EWI_DROPWITHWININFO;
					}
					else
					{
						DebugOutput("Flushing prefs!");

						PGPclFlushClientLibPrefs (prefRef, NULL);
						dwRet=EWI_DROPWITHWININFO;
					}

					PGPFreeData(pOutput);
				}

				memset(pInput,0x00,dwInputSize);
				PGPFreeData(pInput);
			}

			PGPFreeKeyDB(keydb);
		}
	}

	return dwRet;
}

#define DWI_NONE 0
#define DWI_DROPWITHMAIN 1
#define DWI_GETWININFO 2
#define DWI_RETRY 3
#define DWI_DECODEDOK 4

// Make sure to free up ppszPassPhrase and ppszDomain beforehand
DWORD PGPscDecryptWinInfo(HWND hwnd,
					void **vPGPsc,
					void **vPGPtls,
					void *memmgr,
					char *pszUserASCII,
					char *pszPassASCII,
					void **ppOutput,
					DWORD *pdwOutputSize,
					BOOL bEraseWinInfo,
					char *szNT,
					DWORD *pdwDecErr)
{
	PGPError err;
	PGPKeyDBRef	keydb;
    PGPKeyDBObjRef key;
	PGPPrefRef prefRef;
	void *szLoginWindowsInfo;
	DWORD dwInputSize;
	DWORD dwRet;
	PGPContextRef *PGPsc;
	PGPtlsContextRef *PGPtls;

	PGPsc=(PGPContextRef *)vPGPsc;
	PGPtls=(PGPtlsContextRef *)vPGPtls;

	DebugOutput("PGPSC: PGPscDecryptWinInfo");

	WaitOnSC(PGPsc);

	if(*PGPsc==(PGPContextRef)(-1))
	{
		*pdwDecErr=*pdwDecErr|DE_NOCONTEXT;

		DebugOutput("There is no context. Retreat! DWI_DROPWITHMAIN");
		return DWI_DROPWITHMAIN;
	}

	dwRet=DWI_NONE;

	// Find the correct prefs file
	if(!SwitchToCorrectPrefs(pszUserASCII,szNT))
	{
		*pdwDecErr=*pdwDecErr|DE_NOPREFS;

		DebugOutput("No prefs for user?");

		// Just go with windows stuff
		return DWI_DROPWITHMAIN;
	}

	err=PGPclPeekClientLibPrefRefs(&prefRef,NULL);

	if(IsPGPError(err))
	{
		*pdwDecErr=*pdwDecErr|DE_NOPREFS;

		DebugOutput("PGPclPeekClientLibPrefRefs failed DWI_DROPWITHMAIN");

		dwRet=DWI_DROPWITHMAIN;
	}
	else
	{
		szLoginWindowsInfo=NULL;
		dwInputSize=0;

		// If we erase, just don't read it in
		if(!bEraseWinInfo)
		{
			DebugOutput("Reading the windows pref!");

			err=PGPGetPrefData(prefRef,
			   kPGPPrefLoginWindowsInfo,
			   &dwInputSize,
			   &szLoginWindowsInfo);

			DebugOutput("Done reading the windows pref!");

			// Oops. This is bad. Reset it
			if(IsPGPError(err))
			{
				szLoginWindowsInfo=NULL;
				dwInputSize=0;
			}
		}

		{
			err=PGPclOpenDefaultKeyrings(*PGPsc,
				kPGPOpenKeyDBFileOptions_None,&(keydb));

			if(IsPGPError(err))
			{
				*pdwDecErr=*pdwDecErr|DE_NOKEYRINGS;

				dwRet=DWI_DROPWITHMAIN;
			}
			else
			{
				DebugOutput("Getting default key!");

				err=PGPclGetDefaultPrivateKey(keydb,&key);

				DebugOutput("Done getting default!");

				if(IsPGPError(err))
				{
					*pdwDecErr=*pdwDecErr|DE_NODEFAULTKEY;

					dwRet=DWI_DROPWITHMAIN;
				}
				else
				{
					// There is a key to try
	
					// does phrase match selected key ?
					if (PGPPassphraseIsValid (key, 
							PGPOPassphrase (*PGPsc, pszPassASCII),
							PGPOLastOption (*PGPsc))) 
					{
						// Yup, lets do blob work
						if(szLoginWindowsInfo==NULL)
						{
							dwRet=DWI_GETWININFO;
						}
						else
						{
							*ppOutput=NULL;
							*pdwOutputSize=0;

							// Decrypt the blob
							err = PGPDecode(*PGPsc,
								PGPOKeyDBRef(*PGPsc,keydb),
								PGPOPassphraseBuffer(*PGPsc,
									pszPassASCII,strlen(pszPassASCII)),
								PGPOInputBuffer(*PGPsc,szLoginWindowsInfo,dwInputSize),
								PGPOAllocatedOutputBuffer(*PGPsc,
									ppOutput,100000,pdwOutputSize),
									PGPOLastOption(*PGPsc));

							if((IsPGPError(err))||(*ppOutput==NULL))
							{
								dwRet=DWI_GETWININFO;
							}
							else
							{
								dwRet=DWI_DECODEDOK;
							}
						}
					}
					else
					{
						DebugOutput("PGP passphrase wrong");
						dwRet=DWI_DROPWITHMAIN;
					}
				}

				PGPFreeKeyDB(keydb);
			}

			if(szLoginWindowsInfo!=NULL)
				PGPFreeData(szLoginWindowsInfo);
		}
	}

	return dwRet;
}

/*__Editor_settings____

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

⌨️ 快捷键说明

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