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

📄 clserver.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 4 页
字号:

		err = DialogBoxParam (g_hInst, MAKEINTRESOURCE(IDD_SERVERPROGRESS),
						hwndParent, sServerProgressDlgProc, (LPARAM)psts);

		if (!psts->bThreadFree) {
			if (psts->keysetIn) PGPFreeKeySet (psts->keysetIn);
			free (psts);
		}
	}

	return err;
}


//	___________________________________________________
//
//	delete keyset from keyserver

PGPError PGPclExport 
PGPclDeleteKeysFromServer (
		PGPContextRef			context,
		PGPtlsContextRef		tlsContext,
		HWND					hwndParent, 
		PGPKeyServerEntry*		pkeyserver,
		PGPKeyServerKeySpace	space,
		PGPKeySetRef			keysetMain,
		PGPKeySetRef			keysetToSend)
{
	PSERVERTHREADSTRUCT	psts;
	PGPError			err;


	psts = (PSERVERTHREADSTRUCT)malloc (sizeof(SERVERTHREADSTRUCT));

	if (psts) {
		PGPNewKeySet (context, &(psts->keysetIn));
		PGPAddKeys (keysetToSend, psts->keysetIn);
		PGPCommitKeyRingChanges (psts->keysetIn);
	
		psts->uOperation		= DELETEKEY;
		psts->context			= context;
		psts->tlsContext		= tlsContext;
		psts->keysetMain		= keysetMain;
		psts->lpThread			= sKeyserverThreadRoutine;
		psts->bSearchInProgress	= FALSE;
		psts->bCancel			= FALSE;
		psts->bThreadFree		= FALSE;
		psts->iStatusValue		= -1;
		psts->iStatusDirection	= 1;
		psts->space				= space;
		psts->groupset			= kInvalidPGPGroupSetRef;

		CopyMemory (&psts->ksentry, pkeyserver, sizeof(PGPKeyServerEntry));

		err = DialogBoxParam (g_hInst, MAKEINTRESOURCE(IDD_SERVERPROGRESS),
						hwndParent, sServerProgressDlgProc, (LPARAM)psts);

		if (!psts->bThreadFree) {
			if (psts->keysetIn) PGPFreeKeySet (psts->keysetIn);
			free (psts);
		}
	}

	return err;
}


//	___________________________________________________
//
//	request a certificate from a CA server

PGPError PGPclExport 
PGPclSendCertificateRequestToServer (
		PGPContextRef			context,
		PGPtlsContextRef		tlsContext,
		HWND					hwndParent, 
		PGPKeySetRef			keysetMain,
		PGPUserIDRef			userid,
		PGPKeySetRef			keysetKey)
{
	PGPError			err				= kPGPError_NoErr;
	PGPBoolean			bCheckForCRL	= FALSE;
	PGPPrefRef			prefref			= kInvalidPGPPrefRef;
	PSERVERTHREADSTRUCT	psts			= NULL;
	PGPKeyServerEntry*	pentry			= NULL;

	PGPKeyRef			keyRootCA;
	PGPSigRef			sigRootCA;

	err = PGPclOpenClientPrefs (
				PGPGetContextMemoryMgr (context), &prefref);  CKERR;
	err = PGPclGetRootCACertPrefs (context, prefref, keysetMain,
				&keyRootCA, &sigRootCA); CKERR;

	psts = PGPNewData (PGPGetContextMemoryMgr (context),
				sizeof(SERVERTHREADSTRUCT), kPGPMemoryMgrFlags_Clear);
	if (psts) 
	{
		psts->keyIn				= keyRootCA;
		psts->keysetIn			= keysetKey;
		psts->pszPassPhrase		= NULL;
		psts->keysetOut			= kInvalidPGPKeySetRef;
		psts->uOperation		= REQUESTCERTIFICATE;
		psts->context			= context;
		psts->tlsContext		= tlsContext;
		psts->keysetMain		= keysetMain;
		psts->lpThread			= sCAThreadRoutine;
		psts->bSearchInProgress	= FALSE;
		psts->bCancel			= FALSE;
		psts->bThreadFree		= FALSE;
		psts->iStatusValue		= -1;
		psts->iStatusDirection	= 1;
		psts->space				= kPGPKeyServerKeySpace_Default;
		psts->groupset			= kInvalidPGPGroupSetRef;

		err = CLGetCAServerPrefs (context, prefref, &pentry); CKERR;
		if (pentry[0].serverDNS[0] == '\0')
		{
			err = kPGPError_Win32_NoCAServerPrefs;
			goto done;
		}
		pgpCopyMemory (&pentry[0], 
					&psts->ksentry, sizeof(PGPKeyServerEntry));

		{
			PGPKeyRef	key;

			if (!PGPUserIDRefIsValid (userid)) 
			{
				sGetFirstKeyInSet (keysetKey, &key);
				PGPGetPrimaryUserID (key, &userid);
			}

			err = PGPclGetCACertRequestAVList (
					hwndParent, context, FALSE, userid, 
					pentry->protocol, 
					&(psts->pAVlist), &(psts->numAVs)); CKERR;
		}

		err = DialogBoxParam (g_hInst, 
					MAKEINTRESOURCE(IDD_SERVERPROGRESS),
					hwndParent, sServerProgressDlgProc, (LPARAM)psts);

		if (IsntPGPError (err))
		{
			CLSetCAServerPrefs (context, prefref, &psts->ksentry);
		}
	}

done :
	if (psts)
	{
		if (!psts->bThreadFree) 
		{
			PGPclFreeCACertRequestAVList (psts->pAVlist, psts->numAVs);
			PGPFreeData (psts);
		}
	}
	if (PGPPrefRefIsValid (prefref))
		PGPclCloseClientPrefs (prefref, IsntPGPError (err));
	if (IsntNull (pentry))
		PGPFreeData (pentry);

	return err;
}

//	___________________________________________________
//
//	request a certificate from a CA server

PGPError PGPclExport 
PGPclSendCertificateRequestToServerNotify (
		PGPContextRef			context,
		PGPtlsContextRef		tlsContext,
		HWND					hwndToNotify, 
		PGPKeySetRef			keysetMain,
		PGPUserIDRef			userid,
		PGPKeySetRef			keysetKey,
		LPSTR					pszPassPhrase)
{
	PGPError			err				= kPGPError_NoErr;
	PGPBoolean			bCheckForCRL	= FALSE;
	PGPPrefRef			prefref			= kInvalidPGPPrefRef;
	PSERVERTHREADSTRUCT	psts			= NULL;
	PGPKeyServerEntry*	pentry			= NULL;

	PGPKeyRef			keyRootCA;
	PGPSigRef			sigRootCA;
	DWORD				dwThreadID;

	err = PGPclOpenClientPrefs (
				PGPGetContextMemoryMgr (context), &prefref);  CKERR;
	err = PGPclGetRootCACertPrefs (context, prefref, keysetMain,
				&keyRootCA, &sigRootCA); CKERR;

	psts = PGPNewData (PGPGetContextMemoryMgr (context),
				sizeof(SERVERTHREADSTRUCT), kPGPMemoryMgrFlags_Clear);
	if (psts) 
	{
		psts->keyIn				= keyRootCA;
		psts->keysetIn			= keysetKey;
		psts->pszPassPhrase		= pszPassPhrase;
		psts->keysetOut			= kInvalidPGPKeySetRef;
		psts->uOperation		= REQUESTCERTIFICATE;
		psts->context			= context;
		psts->tlsContext		= tlsContext;
		psts->keysetMain		= keysetMain;
		psts->hwnd				= hwndToNotify;
		psts->bSearchInProgress	= FALSE;
		psts->bCancel			= FALSE;
		psts->bThreadFree		= FALSE;  // see below!
		psts->iStatusValue		= -1;
		psts->iStatusDirection	= 1;
		psts->space				= kPGPKeyServerKeySpace_Default;
		psts->groupset			= kInvalidPGPGroupSetRef;

		err = CLGetCAServerPrefs (context, prefref, &pentry); CKERR;
		if (pentry[0].serverDNS[0] == '\0')
		{
			err = kPGPError_Win32_NoCAServerPrefs;
			goto done;
		}
		pgpCopyMemory (&pentry[0], 
					&psts->ksentry, sizeof(PGPKeyServerEntry));

		{
			PGPKeyRef	key;

			if (!PGPUserIDRefIsValid (userid)) 
			{
				sGetFirstKeyInSet (keysetKey, &key);
				PGPGetPrimaryUserID (key, &userid);
			}

			err = PGPclGetCACertRequestAVList (
					hwndToNotify, context, FALSE, userid, 
					pentry->protocol, 
					&(psts->pAVlist), &(psts->numAVs)); CKERR;
		}

		psts->bThreadFree = TRUE;
		CreateThread (NULL, 0, sCAThreadRoutine, 
										(void*)psts, 0, &dwThreadID);
	}

done :
	if (psts)
	{
		if (!psts->bThreadFree) 
		{
			if (PGPKeySetRefIsValid (psts->keysetIn))
				PGPFreeKeySet (psts->keysetIn);
			PGPFreeData (psts);
		}
	}
	if (PGPPrefRefIsValid (prefref))
		PGPclCloseClientPrefs (prefref, IsntPGPError (err));
	if (IsntNull (pentry))
		PGPFreeData (pentry);

	return err;
}

//	___________________________________________________
//
//	retrieve a previously-requested certificate from a CA server

PGPError PGPclExport 
PGPclRetrieveCertificateFromServer (
		PGPContextRef			context,
		PGPtlsContextRef		tlsContext,
		HWND					hwndParent, 
		PGPKeySetRef			keysetMain,
		PGPKeySetRef			keysetKey,
		PGPUserIDRef			userid,
		PGPKeySetRef*			pkeysetCert)
{
	PGPError			err				= kPGPError_NoErr;
	PGPBoolean			bCheckForCRL	= FALSE;
	PGPPrefRef			prefref			= kInvalidPGPPrefRef;
	PSERVERTHREADSTRUCT	psts			= NULL;
	PGPKeyServerEntry*	pentry			= NULL;

	err = PGPclOpenClientPrefs (
				PGPGetContextMemoryMgr (context), &prefref);  CKERR;

	psts = PGPNewData (PGPGetContextMemoryMgr (context),
				sizeof(SERVERTHREADSTRUCT), kPGPMemoryMgrFlags_Clear);
	if (psts) 
	{		
		psts->keysetIn			= kInvalidPGPKeySetRef;
		psts->pszPassPhrase		= NULL;
		psts->uOperation		= RETRIEVECERTIFICATE;
		psts->context			= context;
		psts->tlsContext		= tlsContext;
		psts->keysetMain		= keysetMain;
		psts->lpThread			= sCAThreadRoutine;
		psts->bSearchInProgress	= FALSE;
		psts->bCancel			= FALSE;
		psts->bThreadFree		= FALSE;
		psts->iStatusValue		= -1;
		psts->iStatusDirection	= 1;
		psts->space				= kPGPKeyServerKeySpace_Default;
		psts->groupset			= kInvalidPGPGroupSetRef;

		err = sGetFirstKeyInSet (keysetKey, &psts->keyIn);  CKERR;
		err = PGPNewKeySet (context, &psts->keysetOut); CKERR;

		err = CLGetCAServerPrefs (context, prefref, &pentry); CKERR;
		if (pentry[0].serverDNS[0] == '\0')
		{
			err = kPGPError_Win32_NoCAServerPrefs;
			goto done;
		}
		pgpCopyMemory (&pentry[0], 
					&psts->ksentry, sizeof(PGPKeyServerEntry));

		err = DialogBoxParam (g_hInst, 
					MAKEINTRESOURCE(IDD_SERVERPROGRESS),
					hwndParent, sServerProgressDlgProc, (LPARAM)psts);

		if (IsPGPError (err))
		{
			PGPFreeKeySet (psts->keysetOut);
			psts->keysetOut = kInvalidPGPKeySetRef;
		}
		else
		{
			CLSetCAServerPrefs (context, prefref, &psts->ksentry);
			if (pkeysetCert)
			{
				*pkeysetCert = psts->keysetOut;
				psts->keysetOut = kInvalidPGPKeySetRef;
			}
		}
	}

done :
	if (psts)
	{
		if (!psts->bThreadFree) 
		{
			if (PGPKeySetRefIsValid (psts->keysetOut))
				PGPFreeKeySet (psts->keysetOut);
			PGPFreeData (psts);
		}
	}
	if (PGPPrefRefIsValid (prefref))
		PGPclCloseClientPrefs (prefref, IsntPGPError (err));
	if (IsntNull (pentry))
		PGPFreeData (pentry);

	return err;
}


//	___________________________________________________
//
//	retrieve certificate revocation list for root CA

PGPError PGPclExport 
PGPclGetCertificateRevocationsFromServer (
		PGPContextRef			context,
		PGPtlsContextRef		tlsContext,
		HWND					hwndParent, 
		PGPKeySetRef			keysetMain)
{
	PGPError			err				= kPGPError_NoErr;
	PGPBoolean			bCheckForCRL	= FALSE;
	PGPPrefRef			prefref			= kInvalidPGPPrefRef;
	PSERVERTHREADSTRUCT	psts			= NULL;
	PGPKeyServerEntry*	pentry			= NULL;

	PGPKeyRef			keyRootCA;
	PGPSigRef			sigRootCA;
	PGPBoolean			bHasCRL;
	PGPTime				timeExpiration;

	err = PGPclOpenClientPrefs (
				PGPGetContextMemoryMgr (context), &prefref);  CKERR;
	err = PGPclGetRootCACertPrefs (context, prefref, keysetMain,
				&keyRootCA, &sigRootCA); CKERR;
	err = PGPGetKeyBoolean (
				keyRootCA, kPGPKeyPropHasCRL, &bHasCRL); CKERR;

	if (bHasCRL)
	{	
		err = PGPGetKeyTime (keyRootCA,
					kPGPKeyPropCRLNextUpdate, &timeExpiration); CKERR;

		if (timeExpiration <= PGPGetTime())
			bCheckForCRL = TRUE;
	}
	else
		bCheckForCRL = TRUE;

	if (bCheckForCRL)
	{
		psts = PGPNewData (PGPGetContextMemoryMgr (context),
					sizeof(SERVERTHREADSTRUCT), kPGPMemoryMgrFlags_Clear);

		if (psts) 
		{		
			psts->keyIn				= keyRootCA;
			psts->keysetIn			= kInvalidPGPKeySetRef;
			psts->pszPassPhrase		= NULL;
			psts->uOperation		= UPDATEREVOCATIONS;
			psts->context			= context;
			psts->tlsContext		= tlsContext;
			psts->keysetMain		= keysetMain;
			psts->lpThread			= sCAThreadRoutine;
			psts->bSearchInProgress	= FALSE;
			psts->bCancel			= FALSE;
			psts->bThreadFree		= FALSE;
			psts->iStatusValue		= -1;
			psts->iStatusDirection	= 1;
			psts->space				= kPGPKeyServerKeySpace_Default;
			psts->groupset			= kInvalidPGPGroupSetRef;

			err = CLGetCAServerPrefs (context, prefref, &pentry); CKERR;
			if (pentry[1].serverDNS[0] == '\0')
			{
				err = kPGPError_Win32_NoCAServerPrefs;
				goto done;
			}
			pgpCopyMemory (&pentry[1], 
						&psts->ksentry, sizeof(PGPKeyServerEntry));

			err = DialogBoxParam (g_hInst, 
						MAKEINTRESOURCE(IDD_SERVERPROGRESS),
						hwndParent, sServerProgressDlgProc, (LPARAM)psts);

			if (IsPGPError (err))
			{
				psts->keysetOut = kInvalidPGPKeySetRef;
			}
			else
			{
				CLSetCARevocationServerPrefs (
						context, prefref, &psts->ksentry);
			}
		}
	}
	else
		err = kPGPError_Win32_NoNewCRL;

done :
	if (psts)
	{
		if (!psts->bThreadFree) 
		{
			PGPFreeData (psts);
		}
	}
	if (PGPPrefRefIsValid (prefref))
		PGPclCloseClientPrefs (prefref, IsntPGPError (err));
	if (IsntNull (pentry))
		PGPFreeData (pentry);

	return err;
}


⌨️ 快捷键说明

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