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.

383 lines
15 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 1996 - 1999
  6. //
  7. // File: wvtstrss.cpp
  8. //
  9. // Contents: WinVerifyTrust Stress
  10. //
  11. // History: 13-Aug-1997 pberkman created
  12. //
  13. //--------------------------------------------------------------------------
  14. #include "global.hxx"
  15. typedef struct LOOPDATA_
  16. {
  17. WCHAR *pwszFileName;
  18. GUID *pgProvider;
  19. WCHAR *pwszCatalogFile;
  20. WCHAR *pwszTag;
  21. DWORD dwExpectedError;
  22. DWORD dwStateControl;
  23. } LOOPDATA;
  24. typedef struct CERTDATA_
  25. {
  26. PCCERT_CONTEXT pContext;
  27. } CERTDATA;
  28. #define WVTSTRSS_MAX_CERTS 4
  29. CERTDATA sCerts[WVTSTRSS_MAX_CERTS + 1];
  30. GUID gAuthCode = WINTRUST_ACTION_GENERIC_VERIFY_V2;
  31. GUID gDriver = DRIVER_ACTION_VERIFY;
  32. GUID gCertProvider = WINTRUST_ACTION_GENERIC_CERT_VERIFY;
  33. LOOPDATA sGeneralTest[] =
  34. {
  35. L"signing\\bad\\b_dig.cab", &gAuthCode, NULL, NULL, 0x80096010, WTD_STATEACTION_IGNORE,
  36. L"signing\\bad\\b_dig.exe", &gAuthCode, NULL, NULL, 0x80096010, WTD_STATEACTION_IGNORE,
  37. L"signing\\bad\\b_dig.ocx", &gAuthCode, NULL, NULL, 0x80096010, WTD_STATEACTION_IGNORE,
  38. L"signing\\good\\brill.cab", &gAuthCode, NULL, NULL, 0x800b0101, WTD_STATEACTION_IGNORE,
  39. L"signing\\good\\good.cab", &gAuthCode, NULL, NULL, 0x800b0101, WTD_STATEACTION_IGNORE,
  40. L"signing\\good\\timstamp.cab", &gAuthCode, NULL, NULL, 0, WTD_STATEACTION_IGNORE,
  41. L"signing\\good\\b_ok.exe", &gAuthCode, NULL, NULL, 0x800b0101, WTD_STATEACTION_IGNORE,
  42. L"signing\\good\\signwold.exe", &gAuthCode, NULL, NULL, 0x800b0101, WTD_STATEACTION_IGNORE,
  43. L"signing\\good\\wz_named.exe", &gAuthCode, NULL, NULL, 0x800b0101, WTD_STATEACTION_IGNORE,
  44. L"signing\\good\\b_ok.doc", &gAuthCode, NULL, NULL, 0, WTD_STATEACTION_IGNORE,
  45. L"signing\\good\\b_ok.xls", &gAuthCode, NULL, NULL, 0, WTD_STATEACTION_IGNORE,
  46. L"signing\\good\\b_ok.ppt", &gAuthCode, NULL, NULL, 0, WTD_STATEACTION_IGNORE,
  47. L"signing\\good\\good_pcb.exe", &gAuthCode, NULL, NULL, 0, WTD_STATEACTION_IGNORE,
  48. L"signing\\good\\good_pcb.cat", &gAuthCode, NULL, NULL, 0, WTD_STATEACTION_IGNORE,
  49. L"signing\\good\\good_pcb.cab", &gAuthCode, NULL, NULL, 0, WTD_STATEACTION_IGNORE,
  50. L"signing\\bad\\cert_pcb.cab", &gAuthCode, NULL, NULL, 0x80096004, WTD_STATEACTION_IGNORE,
  51. L"signing\\bad\\cert_pcb.cat", &gAuthCode, NULL, NULL, 0x80096004, WTD_STATEACTION_IGNORE,
  52. L"signing\\bad\\cert_pcb.exe", &gAuthCode, NULL, NULL, 0x80096004, WTD_STATEACTION_IGNORE,
  53. L"signing\\bad\\cert_pcb.doc", &gAuthCode, NULL, NULL, 0x80096004, WTD_STATEACTION_IGNORE,
  54. L"signing\\bad\\sig_pcb.cab", &gAuthCode, NULL, NULL, 0x80096010, WTD_STATEACTION_IGNORE,
  55. L"signing\\bad\\sig_pcb.cat", &gAuthCode, NULL, NULL, 0x8009200e, WTD_STATEACTION_IGNORE,
  56. L"signing\\bad\\sig_pcb.exe", &gAuthCode, NULL, NULL, 0x80096010, WTD_STATEACTION_IGNORE,
  57. L"signing\\bad\\sig_pcb.doc", &gAuthCode, NULL, NULL, 0x80096010, WTD_STATEACTION_IGNORE,
  58. L"catalogs\\test.p7s", &gAuthCode, NULL, NULL, 0, WTD_STATEACTION_IGNORE,
  59. L"catalogs\\testrev.exe", &gAuthCode, L"catalogs\\test.p7s", L"TestSignedEXE", 0, WTD_STATEACTION_VERIFY,
  60. L"catalogs\\test2.exe", &gAuthCode, L"catalogs\\test.p7s", L"TestSignedEXENoAttr", 0, WTD_STATEACTION_VERIFY,
  61. L"catalogs\\nosntest.cab", &gAuthCode, L"catalogs\\test.p7s", L"TestUnsignedCAB", 0, WTD_STATEACTION_VERIFY,
  62. L"catalogs\\signtest.cab", &gAuthCode, L"catalogs\\test.p7s", L"TestSignedCAB", 0, WTD_STATEACTION_VERIFY,
  63. L"catalogs\\create.bat", &gAuthCode, L"catalogs\\test.p7s", L"TestFlat", 0, WTD_STATEACTION_VERIFY,
  64. L"catalogs\\create.bat", &gAuthCode, L"catalogs\\test.p7s", L"TestFlatNotThere", 0x800b0100, WTD_STATEACTION_VERIFY,
  65. L"catalogs\\create.bat", &gAuthCode, L"catalogs\\test.p7s", L"CloseTheHandle", 0, WTD_STATEACTION_CLOSE,
  66. NULL, NULL, NULL, NULL, 0, NULL, NULL
  67. };
  68. LOOPDATA sCatalogTest[] =
  69. {
  70. L"catalogs\\publish.spc", &gAuthCode, L"catalogs\\test.p7s", L"publish.spc", 0, WTD_STATEACTION_VERIFY,
  71. L"catalogs\\publish.pvk", &gAuthCode, L"catalogs\\test.p7s", L"publish.pvk", 0, WTD_STATEACTION_VERIFY,
  72. L"catalogs\\regress.cdf", &gAuthCode, L"catalogs\\test.p7s", L"regress.cdf", 0, WTD_STATEACTION_VERIFY,
  73. L"catalogs\\regress2.cdf", &gAuthCode, L"catalogs\\test.p7s", L"regress2.cdf", 0, WTD_STATEACTION_VERIFY,
  74. L"catalogs\\testrev.exe", &gAuthCode, L"catalogs\\test.p7s", L"testrev.exe", 0, WTD_STATEACTION_VERIFY,
  75. L"catalogs\\test2.exe", &gAuthCode, L"catalogs\\test.p7s", L"test2.exe", 0, WTD_STATEACTION_VERIFY,
  76. L"catalogs\\nosntest.cab", &gAuthCode, L"catalogs\\test.p7s", L"nosntest.cab", 0, WTD_STATEACTION_VERIFY,
  77. L"catalogs\\signtest.cab", &gAuthCode, L"catalogs\\test.p7s", L"signtest.cab", 0, WTD_STATEACTION_VERIFY,
  78. L"catalogs\\create.bat", &gAuthCode, L"catalogs\\test.p7s", L"create.bat", 0, WTD_STATEACTION_VERIFY,
  79. L"catalogs\\create.bat", &gAuthCode, L"catalogs\\test.p7s", L"TestFlatNotThere",0, WTD_STATEACTION_VERIFY,
  80. L"catalogs\\create.bat", &gAuthCode, L"catalogs\\test.p7s", L"CloseTheHandle", 0, WTD_STATEACTION_CLOSE,
  81. NULL, NULL, NULL, NULL, 0, NULL, NULL
  82. };
  83. LOOPDATA sDriverTest[] =
  84. {
  85. L"calc.cnt", &gDriver, L"wvtstrss\\dtest.cat", L"calc.cnt", 0, WTD_STATEACTION_VERIFY,
  86. L"calc.exe", &gDriver, L"wvtstrss\\dtest.cat", L"calc.exe", 0, WTD_STATEACTION_VERIFY,
  87. L"cmd.exe", &gDriver, L"wvtstrss\\dtest.cat", L"cmd.exe", 0, WTD_STATEACTION_VERIFY,
  88. L"close", &gDriver, L"close", L"cmd.exe", 0, WTD_STATEACTION_CLOSE,
  89. NULL, NULL, NULL, NULL, 0, NULL, NULL
  90. };
  91. void _LoadCerts(void);
  92. HGLOBAL hglobRes = NULL;
  93. HCERTSTORE hResStore = NULL;
  94. extern "C" int __cdecl wmain(int argc, WCHAR **wargv)
  95. {
  96. cWArgv_ *pArgs;
  97. BOOL fFailed;
  98. LOOPDATA *psData;
  99. LOOPDATA *psUseTest;
  100. CERTDATA *psCerts;
  101. WINTRUST_DATA sWTD;
  102. WINTRUST_FILE_INFO sWTFI;
  103. WINTRUST_CATALOG_INFO sWTCI;
  104. WINTRUST_CERT_INFO sWTCC;
  105. WCHAR wszPrePath[MAX_PATH];
  106. WCHAR wszFile[MAX_PATH];
  107. DWORD dwCount;
  108. HRESULT hResult;
  109. DWORD dwTotalFiles;
  110. int i;
  111. int iRet;
  112. BOOL fVerbose;
  113. BOOL fCheckCerts;
  114. COleDateTime tStart;
  115. COleDateTime tEnd;
  116. COleDateTimeSpan tsTotal;
  117. iRet = 0;
  118. dwTotalFiles = 0;
  119. dwCount = 1;
  120. psUseTest = &sGeneralTest[0];
  121. fCheckCerts = FALSE;
  122. wszPrePath[0] = NULL;
  123. if (!(pArgs = new cWArgv_((HINSTANCE)GetModuleHandle(NULL), &fFailed)))
  124. {
  125. goto MemoryError;
  126. }
  127. if (fFailed)
  128. {
  129. goto MemoryError;
  130. }
  131. pArgs->AddUsageText(IDS_USAGETEXT_USAGE, IDS_USAGETEXT_OPTIONS,
  132. IDS_USAGETEXT_CMDFILE, IDS_USAGETEXT_ADD,
  133. IDS_USAGETEXT_OPTPARAM);
  134. pArgs->Add2List(IDS_PARAM_HELP, IDS_PARAMTEXT_HELP, WARGV_VALUETYPE_BOOL, (void *)FALSE);
  135. pArgs->Add2List(IDS_PARAM_VERBOSE, IDS_PARAMTEXT_VERBOSE, WARGV_VALUETYPE_BOOL, (void *)FALSE);
  136. pArgs->Add2List(IDS_PARAM_COUNT, IDS_PARAMTEXT_COUNT, WARGV_VALUETYPE_DWORDD, NULL);
  137. pArgs->Add2List(IDS_PARAM_CATPREPATH, IDS_PARAMTEXT_CATPREPATH, WARGV_VALUETYPE_WCHAR, NULL);
  138. pArgs->Add2List(IDS_PARAM_TESTCAT, IDS_PARAMTEXT_TESTCAT, WARGV_VALUETYPE_BOOL, (void *)FALSE);
  139. pArgs->Add2List(IDS_PARAM_TESTDRIVER, IDS_PARAMTEXT_TESTDRIVER, WARGV_VALUETYPE_BOOL, (void *)FALSE);
  140. pArgs->Add2List(IDS_PARAM_TESTCERT, IDS_PARAMTEXT_TESTCERT, WARGV_VALUETYPE_BOOL, (void *)FALSE);
  141. if (!(pArgs->Fill(argc, wargv)) ||
  142. (pArgs->GetValue(IDS_PARAM_HELP)))
  143. {
  144. wprintf(L"%s", pArgs->GetUsageString());
  145. goto NeededHelp;
  146. }
  147. fVerbose = (BOOL)((DWORD_PTR)pArgs->GetValue(IDS_PARAM_VERBOSE));
  148. if (pArgs->GetValue(IDS_PARAM_CATPREPATH))
  149. {
  150. wcscpy(&wszPrePath[0], (WCHAR *)pArgs->GetValue(IDS_PARAM_CATPREPATH));
  151. if (wszPrePath[wcslen(&wszPrePath[0]) - 1] != L'\\')
  152. {
  153. wcscat(&wszPrePath[0], L"\\");
  154. }
  155. }
  156. if (pArgs->GetValue(IDS_PARAM_TESTCAT))
  157. {
  158. psUseTest = &sCatalogTest[0];
  159. }
  160. else if (pArgs->GetValue(IDS_PARAM_TESTDRIVER))
  161. {
  162. psUseTest = &sDriverTest[0];
  163. }
  164. else if (pArgs->GetValue(IDS_PARAM_TESTCERT))
  165. {
  166. psUseTest = NULL;
  167. fCheckCerts = TRUE;
  168. _LoadCerts();
  169. }
  170. if (pArgs->GetValue(IDS_PARAM_COUNT))
  171. {
  172. dwCount = (DWORD)((DWORD_PTR)pArgs->GetValue(IDS_PARAM_COUNT));
  173. }
  174. memset(&sWTD, 0x00, sizeof(WINTRUST_DATA));
  175. memset(&sWTFI, 0x00, sizeof(WINTRUST_FILE_INFO));
  176. memset(&sWTCI, 0x00, sizeof(WINTRUST_CATALOG_INFO));
  177. memset(&sWTCC, 0x00, sizeof(WINTRUST_CERT_INFO));
  178. sWTD.cbStruct = sizeof(WINTRUST_DATA);
  179. sWTD.dwUIChoice = WTD_UI_NONE;
  180. sWTFI.cbStruct = sizeof(WINTRUST_FILE_INFO);
  181. sWTCI.cbStruct = sizeof(WINTRUST_CATALOG_INFO);
  182. sWTCC.cbStruct = sizeof(WINTRUST_CERT_INFO);
  183. sWTCC.pcwszDisplayName = L"WVTSTRSS";
  184. //
  185. // start our timer
  186. //
  187. tStart = COleDateTime::GetCurrentTime();
  188. for (i = 0; i < (int)dwCount; i++)
  189. {
  190. psData = psUseTest;
  191. if (psData)
  192. {
  193. while (psData->pwszFileName)
  194. {
  195. wcscpy(&wszFile[0], &wszPrePath[0]);
  196. wcscat(&wszFile[0], psData->pwszFileName);
  197. sWTD.dwStateAction = psData->dwStateControl;
  198. if (psData->pwszCatalogFile)
  199. {
  200. sWTD.dwUnionChoice = WTD_CHOICE_CATALOG;
  201. sWTD.pCatalog = &sWTCI;
  202. sWTCI.pcwszCatalogFilePath = psData->pwszCatalogFile;
  203. sWTCI.pcwszMemberTag = psData->pwszTag;
  204. sWTCI.pcwszMemberFilePath = &wszFile[0];
  205. }
  206. else
  207. {
  208. sWTD.dwUnionChoice = WTD_CHOICE_FILE;
  209. sWTD.pFile = &sWTFI;
  210. sWTFI.pcwszFilePath = &wszFile[0];
  211. }
  212. hResult = WinVerifyTrust(NULL, psData->pgProvider, &sWTD);
  213. if (fVerbose)
  214. {
  215. wprintf(L"\nround %d: 0x%08.8x: %s", i, hResult, &wszFile[0]);
  216. }
  217. dwTotalFiles++;
  218. psData++;
  219. }
  220. }
  221. else if (fCheckCerts)
  222. {
  223. psCerts = &sCerts[0];
  224. while (psCerts->pContext)
  225. {
  226. sWTD.dwUnionChoice = WTD_CHOICE_CERT;
  227. sWTD.pCert = &sWTCC;
  228. sWTCC.psCertContext = (CERT_CONTEXT *)psCerts->pContext;
  229. hResult = WinVerifyTrust(NULL, &gCertProvider, &sWTD);
  230. if (fVerbose)
  231. {
  232. wprintf(L"\nround %d: 0x%08.8x", i, hResult);
  233. }
  234. dwTotalFiles++;
  235. psCerts++;
  236. }
  237. }
  238. }
  239. tEnd = COleDateTime::GetCurrentTime();
  240. tsTotal = tEnd - tStart;
  241. printf("\n\nTotal files verified: %ld", dwTotalFiles);
  242. printf("\nProcessing time: %s", (LPCSTR)tsTotal.Format("%D:%H:%M:%S"));
  243. printf("\nAverage seconds per file: %f", (double)tsTotal.GetTotalSeconds() / (double)dwTotalFiles);
  244. printf("\n");
  245. CommonReturn:
  246. DELETE_OBJECT(pArgs);
  247. for (i = 0; i < WVTSTRSS_MAX_CERTS; i++)
  248. {
  249. if (sCerts[i].pContext)
  250. {
  251. CertFreeCertificateContext(sCerts[i].pContext);
  252. }
  253. }
  254. if (hResStore)
  255. {
  256. CertCloseStore(hResStore, 0);
  257. }
  258. if (hglobRes)
  259. {
  260. UnlockResource(hglobRes);
  261. FreeResource(hglobRes);
  262. }
  263. return(iRet);
  264. ErrorReturn:
  265. iRet = 1;
  266. goto CommonReturn;
  267. TRACE_ERROR_EX(DBG_SS_APP, MemoryError);
  268. TRACE_ERROR_EX(DBG_SS_APP, NeededHelp);
  269. }
  270. void _LoadCerts(void)
  271. {
  272. HRSRC hrsrc;
  273. int i;
  274. CRYPT_DATA_BLOB sBlob;
  275. PCCERT_CONTEXT pCert;
  276. for (i = 0; i < (WVTSTRSS_MAX_CERTS + 1); i++)
  277. {
  278. sCerts[i].pContext = NULL;
  279. }
  280. if (hrsrc = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_CERTS), TEXT("CERTS")))
  281. {
  282. if (hglobRes = LoadResource(GetModuleHandle(NULL), hrsrc))
  283. {
  284. sBlob.cbData = SizeofResource(GetModuleHandle(NULL), hrsrc);
  285. sBlob.pbData = (BYTE *)LockResource(hglobRes);
  286. hResStore = CertOpenStore(CERT_STORE_PROV_SERIALIZED,
  287. X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
  288. NULL,
  289. CERT_STORE_NO_CRYPT_RELEASE_FLAG,
  290. &sBlob);
  291. if (!(hResStore))
  292. {
  293. return;
  294. }
  295. i = 0;
  296. pCert = NULL;
  297. while ((pCert = CertEnumCertificatesInStore(hResStore, pCert)) !=NULL)
  298. {
  299. sCerts[i].pContext = CertDuplicateCertificateContext(pCert);
  300. i++;
  301. }
  302. }
  303. }
  304. }