crypt32: Implement CertVerifyRevocation.
This commit is contained in:
parent
3b85a7946e
commit
5928c698ae
|
@ -1231,13 +1231,86 @@ PCCERT_CONTEXT WINAPI CertGetIssuerCertificateFromStore(HCERTSTORE hCertStore,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct _OLD_CERT_REVOCATION_STATUS {
|
||||||
|
DWORD cbSize;
|
||||||
|
DWORD dwIndex;
|
||||||
|
DWORD dwError;
|
||||||
|
DWORD dwReason;
|
||||||
|
} OLD_CERT_REVOCATION_STATUS, *POLD_CERT_REVOCATION_STATUS;
|
||||||
|
|
||||||
|
typedef BOOL (WINAPI *CertVerifyRevocationFunc)(DWORD, DWORD, DWORD,
|
||||||
|
void **, DWORD, PCERT_REVOCATION_PARA, PCERT_REVOCATION_STATUS);
|
||||||
|
|
||||||
BOOL WINAPI CertVerifyRevocation(DWORD dwEncodingType, DWORD dwRevType,
|
BOOL WINAPI CertVerifyRevocation(DWORD dwEncodingType, DWORD dwRevType,
|
||||||
DWORD cContext, void *rgpvContext[], DWORD dwFlags,
|
DWORD cContext, void *rgpvContext[], DWORD dwFlags,
|
||||||
PCERT_REVOCATION_PARA pRevPara, PCERT_REVOCATION_STATUS pRevStatus)
|
PCERT_REVOCATION_PARA pRevPara, PCERT_REVOCATION_STATUS pRevStatus)
|
||||||
{
|
{
|
||||||
FIXME("(%08x, %d, %d, %p, %08x, %p, %p): stub\n", dwEncodingType, dwRevType,
|
BOOL ret;
|
||||||
|
|
||||||
|
TRACE("(%08x, %d, %d, %p, %08x, %p, %p)\n", dwEncodingType, dwRevType,
|
||||||
cContext, rgpvContext, dwFlags, pRevPara, pRevStatus);
|
cContext, rgpvContext, dwFlags, pRevPara, pRevStatus);
|
||||||
return FALSE;
|
|
||||||
|
if (pRevStatus->cbSize != sizeof(OLD_CERT_REVOCATION_STATUS) &&
|
||||||
|
pRevStatus->cbSize != sizeof(CERT_REVOCATION_STATUS))
|
||||||
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (cContext)
|
||||||
|
{
|
||||||
|
static HCRYPTOIDFUNCSET set = NULL;
|
||||||
|
DWORD size;
|
||||||
|
|
||||||
|
if (!set)
|
||||||
|
set = CryptInitOIDFunctionSet(CRYPT_OID_VERIFY_REVOCATION_FUNC, 0);
|
||||||
|
ret = CryptGetDefaultOIDDllList(set, dwEncodingType, NULL, &size);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
if (size == 1)
|
||||||
|
{
|
||||||
|
/* empty list */
|
||||||
|
SetLastError(CRYPT_E_NO_REVOCATION_DLL);
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LPWSTR dllList = CryptMemAlloc(size * sizeof(WCHAR)), ptr;
|
||||||
|
|
||||||
|
if (dllList)
|
||||||
|
{
|
||||||
|
ret = CryptGetDefaultOIDDllList(set, dwEncodingType,
|
||||||
|
dllList, &size);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
for (ptr = dllList; ret && *ptr;
|
||||||
|
ptr += lstrlenW(ptr) + 1)
|
||||||
|
{
|
||||||
|
CertVerifyRevocationFunc func;
|
||||||
|
HCRYPTOIDFUNCADDR hFunc;
|
||||||
|
|
||||||
|
ret = CryptGetDefaultOIDFunctionAddress(set,
|
||||||
|
dwEncodingType, ptr, 0, (void **)&func, &hFunc);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
ret = func(dwEncodingType, dwRevType, cContext,
|
||||||
|
rgpvContext, dwFlags, pRevPara, pRevStatus);
|
||||||
|
CryptFreeOIDFunctionAddress(hFunc, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CryptMemFree(dllList);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_OUTOFMEMORY);
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret = TRUE;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
PCRYPT_ATTRIBUTE WINAPI CertFindAttribute(LPCSTR pszObjId, DWORD cAttr,
|
PCRYPT_ATTRIBUTE WINAPI CertFindAttribute(LPCSTR pszObjId, DWORD cAttr,
|
||||||
|
|
|
@ -2587,27 +2587,21 @@ static void testVerifyRevocation(void)
|
||||||
*/
|
*/
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
ret = CertVerifyRevocation(0, 0, 0, NULL, 0, NULL, &status);
|
ret = CertVerifyRevocation(0, 0, 0, NULL, 0, NULL, &status);
|
||||||
todo_wine
|
|
||||||
ok(!ret && GetLastError() == E_INVALIDARG,
|
ok(!ret && GetLastError() == E_INVALIDARG,
|
||||||
"Expected E_INVALIDARG, got %08x\n", GetLastError());
|
"Expected E_INVALIDARG, got %08x\n", GetLastError());
|
||||||
status.cbSize = sizeof(status);
|
status.cbSize = sizeof(status);
|
||||||
ret = CertVerifyRevocation(0, 0, 0, NULL, 0, NULL, &status);
|
ret = CertVerifyRevocation(0, 0, 0, NULL, 0, NULL, &status);
|
||||||
todo_wine
|
|
||||||
ok(ret, "CertVerifyRevocation failed: %08x\n", GetLastError());
|
ok(ret, "CertVerifyRevocation failed: %08x\n", GetLastError());
|
||||||
ret = CertVerifyRevocation(0, 2, 0, NULL, 0, NULL, &status);
|
ret = CertVerifyRevocation(0, 2, 0, NULL, 0, NULL, &status);
|
||||||
todo_wine
|
|
||||||
ok(ret, "CertVerifyRevocation failed: %08x\n", GetLastError());
|
ok(ret, "CertVerifyRevocation failed: %08x\n", GetLastError());
|
||||||
ret = CertVerifyRevocation(2, 0, 0, NULL, 0, NULL, &status);
|
ret = CertVerifyRevocation(2, 0, 0, NULL, 0, NULL, &status);
|
||||||
todo_wine
|
|
||||||
ok(ret, "CertVerifyRevocation failed: %08x\n", GetLastError());
|
ok(ret, "CertVerifyRevocation failed: %08x\n", GetLastError());
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
ret = CertVerifyRevocation(0, 0, 1, (void **)&cert, 0, NULL, &status);
|
ret = CertVerifyRevocation(0, 0, 1, (void **)&cert, 0, NULL, &status);
|
||||||
todo_wine
|
|
||||||
ok(!ret && GetLastError() == CRYPT_E_NO_REVOCATION_DLL,
|
ok(!ret && GetLastError() == CRYPT_E_NO_REVOCATION_DLL,
|
||||||
"Expected CRYPT_E_NO_REVOCATION_DLL, got %08x\n", GetLastError());
|
"Expected CRYPT_E_NO_REVOCATION_DLL, got %08x\n", GetLastError());
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
ret = CertVerifyRevocation(0, 2, 1, (void **)&cert, 0, NULL, &status);
|
ret = CertVerifyRevocation(0, 2, 1, (void **)&cert, 0, NULL, &status);
|
||||||
todo_wine
|
|
||||||
ok(!ret && GetLastError() == CRYPT_E_NO_REVOCATION_DLL,
|
ok(!ret && GetLastError() == CRYPT_E_NO_REVOCATION_DLL,
|
||||||
"Expected CRYPT_E_NO_REVOCATION_DLL, got %08x\n", GetLastError());
|
"Expected CRYPT_E_NO_REVOCATION_DLL, got %08x\n", GetLastError());
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue