📄 clserver.c
字号:
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 + -