Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

247 lines
7.5 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1995 - 1996
//
// File: trevfunc.cpp
//
// Contents: CertVerifyRevocation Function Tests
//
// See Usage() for a list of test options.
//
//
// Functions: main
//
// History: 21-Dec-96 philh created
//--------------------------------------------------------------------------
#define CERT_REVOCATION_PARA_HAS_EXTRA_FIELDS 1
#include <windows.h>
#include <assert.h>
#include "wincrypt.h"
#include "certtest.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <time.h>
static void Usage(void)
{
printf("Usage: trevfunc [options] <FileName1> <FileName2> ...\n");
printf("Options are:\n");
printf(" -h - This message\n");
printf(" -r<RevocationType Number> - For example, -r1 (Certificate)\n");
printf(" -e<Expected Error> - For example, -e0x0\n");
printf(" -i<Expected Index> - For example, -i0\n");
printf(" -s<SystemStore> - Additional System Store\n");
printf(" -S<FileSystemStore> - Additional File System Store\n");
printf(" -L<Loop Count> - Defaults to 1 iteration\n");
printf(" -t<Number> - Url timeout (milliseconds)\n");
printf(" -T<Number> - Accumulative Url timeout (milliseconds)\n");
printf(" -f<Number> - Freshness (seconds)\n");
printf("\n");
printf("Defaults:\n");
printf(" -r%d (Certificate)\n", CERT_CONTEXT_REVOCATION_TYPE);
printf(" -e0 (All files successfully verified)\n");
printf("\n");
}
int _cdecl main(int argc, char * argv[])
{
int status;
BOOL fResult;
DWORD dwError = 0;
DWORD dwIndex = 0;
DWORD dwRevType = CERT_CONTEXT_REVOCATION_TYPE;
#define MAX_CONTEXT_COUNT 16
DWORD cFileName = 0;
LPSTR rgpszFileName[MAX_CONTEXT_COUNT];
DWORD cContext = 0;
PVOID rgpvContext[MAX_CONTEXT_COUNT];
CERT_REVOCATION_STATUS RevStatus;
CERT_REVOCATION_PARA RevPara;
PCERT_REVOCATION_PARA pRevPara = NULL;
HCERTSTORE hAdditionalStore = NULL;
DWORD i;
DWORD dwLoopCnt = 1;
DWORD dwUrlRetrievalTimeout = 0;
BOOL fCheckFreshnessTime = FALSE;
DWORD dwFreshnessTime;
DWORD dwFlags = 0;
while (--argc>0) {
if (**++argv == '-')
{
switch(argv[0][1])
{
case 'r':
dwRevType = strtoul(argv[0]+2, NULL, 0);
break;
case 'e':
dwError = strtoul(argv[0]+2, NULL, 0);
break;
case 'i':
dwIndex = strtoul(argv[0]+2, NULL, 0);
break;
case 's':
case 'S':
if (NULL == (hAdditionalStore =
OpenSystemStoreOrFile(
argv[0][1] == 's', // fSystemStore
argv[0]+2,
0 // dwFlags
)))
goto BadUsage;
break;
case 'L':
dwLoopCnt = strtoul(argv[0]+2, NULL, 0);
break;
case 'T':
dwFlags |= CERT_VERIFY_REV_ACCUMULATIVE_TIMEOUT_FLAG;
case 't':
dwUrlRetrievalTimeout = (DWORD) strtoul(argv[0]+2, NULL, 0);
break;
case 'f':
fCheckFreshnessTime = TRUE;
dwFreshnessTime = (DWORD) strtoul(argv[0]+2, NULL, 0);
break;
case 'h':
default:
goto BadUsage;
}
} else {
if (cFileName >= MAX_CONTEXT_COUNT) {
printf("Exceeded maximum FileName count of %d\n",
MAX_CONTEXT_COUNT);
goto BadUsage;
}
rgpszFileName[cFileName++] = argv[0];
}
}
if (cFileName == 0) {
printf("Missing FileNames\n");
goto BadUsage;
}
if (dwRevType != CERT_CONTEXT_REVOCATION_TYPE) {
printf("Currently only support revocation type (-r%d) (certificates)\n",
CERT_CONTEXT_REVOCATION_TYPE);
goto BadUsage;
}
printf("command line: %s\n", GetCommandLine());
for (i = 0; i < cFileName; i++) {
BYTE *pbDER;
DWORD cbDER;
PCCERT_CONTEXT pCert;
if (!ReadDERFromFile(
rgpszFileName[i],
&pbDER,
&cbDER)) goto ErrorReturn;
pCert = CertCreateCertificateContext(dwCertEncodingType, pbDER, cbDER);
TestFree(pbDER);
if (pCert == NULL) {
printf("Unable to create certificate context for: %s\n",
rgpszFileName[i]);
PrintLastError("CertCreateCertificateContext");
goto ErrorReturn;
}
rgpvContext[cContext++] = (void *) pCert;
}
memset(&RevPara, 0, sizeof(RevPara));
RevPara.cbSize = sizeof(RevPara);
if ( hAdditionalStore != NULL )
{
RevPara.cCertStore = 1;
RevPara.rgCertStore = &hAdditionalStore;
RevPara.hCrlStore = hAdditionalStore;
pRevPara = &RevPara;
}
if (dwUrlRetrievalTimeout || fCheckFreshnessTime) {
RevPara.dwUrlRetrievalTimeout = dwUrlRetrievalTimeout;
RevPara.fCheckFreshnessTime = fCheckFreshnessTime;
RevPara.dwFreshnessTime = dwFreshnessTime;
pRevPara = &RevPara;
}
while (dwLoopCnt--)
{
memset(&RevStatus, 0, sizeof(RevStatus));
RevStatus.cbSize = sizeof(RevStatus);
fResult = CertVerifyRevocation(
dwCertEncodingType | dwMsgEncodingType,
dwRevType,
cContext,
rgpvContext,
dwFlags,
pRevPara, // pvReserved
&RevStatus);
if (fResult) {
if (0 == dwError) {
printf("CertVerifyRevocation:: verified all files\n");
if (RevStatus.fHasFreshnessTime)
printf("FreshnessTime: %d\n", RevStatus.dwFreshnessTime);
} else {
printf("Failed, CertVerifyRevocation returned Success, not the expected dwError: 0x%x (%d)\n",
dwError, dwError);
if (dwLoopCnt == 0)
goto ErrorReturn;
}
} else {
printf("CertVerifyRevocation:: dwIndex: %d dwError: 0x%x (%d), dwReason: %d\n",
RevStatus.dwIndex, RevStatus.dwError, RevStatus.dwError,
RevStatus.dwReason);
if (RevStatus.fHasFreshnessTime)
printf("FreshnessTime: %d\n", RevStatus.dwFreshnessTime);
if (dwError != RevStatus.dwError || dwIndex != RevStatus.dwIndex) {
printf("Failed, CertVerifyRevocation didn't return the expected dwIndex: %d or dwError: 0x%x (%d)\n",
dwIndex, dwError, dwError);
if (dwLoopCnt == 0)
goto ErrorReturn;
}
}
}
printf("Passed\n");
status = 0;
CommonReturn:
while (cContext--)
CertFreeCertificateContext((PCCERT_CONTEXT) rgpvContext[cContext]);
if (hAdditionalStore)
CertCloseStore(hAdditionalStore, 0);
return status;
BadUsage:
Usage();
status = 0;
goto CommonReturn;
ErrorReturn:
printf("Failed\n");
status = -1;
goto CommonReturn;
}