ReactOS 0.4.16-dev-2491-g3dc6630
wintrust_main.c
Go to the documentation of this file.
1/*
2 * Copyright 2001 Rein Klazes
3 * Copyright 2007 Juan Lang
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20#include <stdarg.h>
21
22#include "windef.h"
23#include "winbase.h"
24#include "winerror.h"
25#include "winreg.h"
26#include "guiddef.h"
27#include "wintrust.h"
28#include "softpub.h"
29#include "mscat.h"
30#include "objbase.h"
31#include "winuser.h"
32#include "cryptdlg.h"
33#include "cryptuiapi.h"
34#include "wintrust_priv.h"
35#include "wine/debug.h"
36
38
39/***********************************************************************
40 * TrustIsCertificateSelfSigned (WINTRUST.@)
41 */
43{
45 DWORD size;
46 BOOL ret;
47
48 TRACE("%p\n", cert);
50 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
51 {
53
54 ret = CryptDecodeObjectEx(cert->dwCertEncodingType,
55 X509_AUTHORITY_KEY_ID2, ext->Value.pbData, ext->Value.cbData,
57 &info, &size);
58 if (ret)
59 {
60 if (info->AuthorityCertIssuer.cAltEntry &&
61 info->AuthorityCertSerialNumber.cbData)
62 {
63 PCERT_ALT_NAME_ENTRY directoryName = NULL;
64 DWORD i;
65
66 for (i = 0; !directoryName &&
67 i < info->AuthorityCertIssuer.cAltEntry; i++)
68 if (info->AuthorityCertIssuer.rgAltEntry[i].dwAltNameChoice
70 directoryName =
71 &info->AuthorityCertIssuer.rgAltEntry[i];
72 if (directoryName)
73 {
74 ret = CertCompareCertificateName(cert->dwCertEncodingType,
75 &directoryName->DirectoryName, &cert->pCertInfo->Issuer)
76 && CertCompareIntegerBlob(&info->AuthorityCertSerialNumber,
77 &cert->pCertInfo->SerialNumber);
78 }
79 else
80 {
81 FIXME("no supported name type in authority key id2\n");
82 ret = FALSE;
83 }
84 }
85 else if (info->KeyId.cbData)
86 {
89 if (ret && size == info->KeyId.cbData)
90 {
92
93 if (buf)
94 {
97 ret = !memcmp(buf, info->KeyId.pbData, size);
99 }
100 else
101 ret = FALSE;
102 }
103 else
104 ret = FALSE;
105 }
107 }
108 }
110 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
111 {
113
114 ret = CryptDecodeObjectEx(cert->dwCertEncodingType,
115 X509_AUTHORITY_KEY_ID, ext->Value.pbData, ext->Value.cbData,
117 &info, &size);
118 if (ret)
119 {
120 if (info->CertIssuer.cbData && info->CertSerialNumber.cbData)
121 {
122 ret = CertCompareCertificateName(cert->dwCertEncodingType,
123 &info->CertIssuer, &cert->pCertInfo->Issuer) &&
124 CertCompareIntegerBlob(&info->CertSerialNumber,
125 &cert->pCertInfo->SerialNumber);
126 }
127 else if (info->KeyId.cbData)
128 {
131 if (ret && size == info->KeyId.cbData)
132 {
134
135 if (buf)
136 {
139 ret = !memcmp(buf, info->KeyId.pbData, size);
141 }
142 else
143 ret = FALSE;
144 }
145 else
146 ret = FALSE;
147 }
148 else
149 ret = FALSE;
151 }
152 }
153 else
154 ret = CertCompareCertificateName(cert->dwCertEncodingType,
155 &cert->pCertInfo->Subject, &cert->pCertInfo->Issuer);
156 return ret;
157}
158
160
162{
165};
166
168 DWORD numSteps, CRYPT_PROVIDER_DATA *provData)
169{
171
172 for (i = 0; !err && i < numSteps; i++)
173 {
174 err = steps[i].func(provData);
175 if (err)
176 err = provData->padwTrustStepErrors[steps[i].error_index];
177 }
178 return err;
179}
180
182{
183 CRYPT_PROVIDER_DATA *provData;
184
185 provData = calloc(1, sizeof(CRYPT_PROVIDER_DATA));
186 if (!provData)
187 goto oom;
188 provData->cbStruct = sizeof(CRYPT_PROVIDER_DATA);
189
191 if (!provData->padwTrustStepErrors)
192 goto oom;
194
195 provData->pPDSip = calloc(1, sizeof(PROVDATA_SIP));
196 if (!provData->pPDSip)
197 goto oom;
198 provData->pPDSip->cbStruct = sizeof(PROVDATA_SIP);
199
200 provData->psPfns = calloc(1, sizeof(CRYPT_PROVIDER_FUNCTIONS));
201 if (!provData->psPfns)
202 goto oom;
203 provData->psPfns->cbStruct = sizeof(CRYPT_PROVIDER_FUNCTIONS);
204 return provData;
205
206oom:
207 if (provData)
208 {
209 free(provData->padwTrustStepErrors);
210 free(provData->pPDSip);
211 free(provData->psPfns);
212 free(provData);
213 }
214 return NULL;
215}
216
217/* Adds trust steps for each function in psPfns. Assumes steps has at least
218 * 5 entries. Returns the number of steps added.
219 */
221 const CRYPT_PROVIDER_FUNCTIONS *psPfns)
222{
223 DWORD numSteps = 0;
224
225 if (psPfns->pfnInitialize)
226 {
227 steps[numSteps].func = psPfns->pfnInitialize;
228 steps[numSteps++].error_index = TRUSTERROR_STEP_FINAL_WVTINIT;
229 }
230 if (psPfns->pfnObjectTrust)
231 {
232 steps[numSteps].func = psPfns->pfnObjectTrust;
233 steps[numSteps++].error_index = TRUSTERROR_STEP_FINAL_OBJPROV;
234 }
235 if (psPfns->pfnSignatureTrust)
236 {
237 steps[numSteps].func = psPfns->pfnSignatureTrust;
238 steps[numSteps++].error_index = TRUSTERROR_STEP_FINAL_SIGPROV;
239 }
240 if (psPfns->pfnCertificateTrust)
241 {
242 steps[numSteps].func = psPfns->pfnCertificateTrust;
243 steps[numSteps++].error_index = TRUSTERROR_STEP_FINAL_CERTPROV;
244 }
245 if (psPfns->pfnFinalPolicy)
246 {
247 steps[numSteps].func = psPfns->pfnFinalPolicy;
248 steps[numSteps++].error_index = TRUSTERROR_STEP_FINAL_POLICYPROV;
249 }
250 return numSteps;
251}
252
255{
256 DWORD err = ERROR_SUCCESS, numSteps = 0;
257 CRYPT_PROVIDER_DATA *provData;
258 BOOL ret;
259 struct wintrust_step verifySteps[5];
260
261 TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(actionID), data);
262
264 if (!provData)
265 return ERROR_OUTOFMEMORY;
266
267 ret = WintrustLoadFunctionPointers(actionID, provData->psPfns);
268 if (!ret)
269 {
270 err = GetLastError();
271 goto error;
272 }
273
274 data->hWVTStateData = provData;
275 provData->pWintrustData = data;
276
277 if (WVT_ISINSTRUCT(WINTRUST_DATA, data->cbStruct, pSignatureSettings))
278 provData->pSigSettings = data->pSignatureSettings;
279
281 provData->hWndParent = GetDesktopWindow();
282 else
283 provData->hWndParent = hwnd;
284 provData->pgActionID = actionID;
286
287 numSteps = WINTRUST_AddTrustStepsFromFunctions(verifySteps,
288 provData->psPfns);
289 err = WINTRUST_ExecuteSteps(verifySteps, numSteps, provData);
290 goto done;
291
292error:
293 free(provData->padwTrustStepErrors);
294 free(provData->pPDSip);
295 free(provData->psPfns);
296 free(provData);
297
298done:
299 TRACE("returning %08lx\n", err);
300 return err;
301}
302
305{
307 CRYPT_PROVIDER_DATA *provData = data->hWVTStateData;
308
309 TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(actionID), data);
310
311 if (provData)
312 {
313 if (provData->psPfns->pfnCleanupPolicy)
314 err = provData->psPfns->pfnCleanupPolicy(provData);
315
316 free(provData->padwTrustStepErrors);
317 free(provData->pPDSip);
318 free(provData->psPfns);
319 free(provData);
320 data->hWVTStateData = NULL;
321 }
322 TRACE("returning %08lx\n", err);
323 return err;
324}
325
328{
329 LONG err;
330
331 TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(actionID), data);
332
333 err = WINTRUST_DefaultVerify(hwnd, actionID, data);
334 WINTRUST_DefaultClose(hwnd, actionID, data);
335 TRACE("returning %08lx\n", err);
336 return err;
337}
338
341{
342 WINTRUST_DATA wintrust_data = { sizeof(wintrust_data), 0 };
343 /* Undocumented: the published software action is passed a path,
344 * and pSIPClientData points to a WIN_TRUST_SUBJECT_FILE.
345 */
346 LPWIN_TRUST_SUBJECT_FILE subjectFile = data->pSIPClientData;
347 WINTRUST_FILE_INFO fileInfo = { sizeof(fileInfo), 0 };
348
349 TRACE("subjectFile->hFile: %p\n", subjectFile->hFile);
350 TRACE("subjectFile->lpPath: %s\n", debugstr_w(subjectFile->lpPath));
351 fileInfo.pcwszFilePath = subjectFile->lpPath;
352 fileInfo.hFile = subjectFile->hFile;
353 wintrust_data.pFile = &fileInfo;
354 wintrust_data.dwUnionChoice = WTD_CHOICE_FILE;
355 wintrust_data.dwUIChoice = WTD_UI_NONE;
356
357 return WINTRUST_DefaultVerifyAndClose(hwnd, actionID, &wintrust_data);
358}
359
360/* Sadly, the function to load the cert for the CERT_CERTIFICATE_ACTION_VERIFY
361 * action is not stored in the registry and is located in wintrust, not in
362 * cryptdlg along with the rest of the implementation (verified by running the
363 * action with a native wintrust.dll.)
364 */
366{
367 BOOL ret;
368
369 TRACE("(%p)\n", data);
370
371 if (!data->padwTrustStepErrors)
372 return S_FALSE;
373
374 switch (data->pWintrustData->dwUnionChoice)
375 {
376 case WTD_CHOICE_BLOB:
377 if (data->pWintrustData->pBlob &&
379 data->pWintrustData->pBlob->cbStruct, pbMemObject) &&
380 data->pWintrustData->pBlob->cbMemObject ==
382 data->pWintrustData->pBlob->pbMemObject)
383 {
386 data->pWintrustData->pBlob->pbMemObject;
387
388 if (pCert->cbSize == sizeof(CERT_VERIFY_CERTIFICATE_TRUST) &&
389 pCert->pccert)
390 {
391 CRYPT_PROVIDER_SGNR signer = { sizeof(signer), { 0 } };
392 DWORD i;
393 SYSTEMTIME sysTime;
394
395 /* Add a signer with nothing but the time to verify, so we can
396 * add a cert to it
397 */
398 GetSystemTime(&sysTime);
399 SystemTimeToFileTime(&sysTime, &signer.sftVerifyAsOf);
400 ret = data->psPfns->pfnAddSgnr2Chain(data, FALSE, 0, &signer);
401 if (!ret)
402 goto error;
403 ret = data->psPfns->pfnAddCert2Chain(data, 0, FALSE, 0,
404 pCert->pccert);
405 if (!ret)
406 goto error;
407 for (i = 0; ret && i < pCert->cRootStores; i++)
408 ret = data->psPfns->pfnAddStore2Chain(data,
409 pCert->rghstoreRoots[i]);
410 for (i = 0; ret && i < pCert->cStores; i++)
411 ret = data->psPfns->pfnAddStore2Chain(data,
412 pCert->rghstoreCAs[i]);
413 for (i = 0; ret && i < pCert->cTrustStores; i++)
414 ret = data->psPfns->pfnAddStore2Chain(data,
415 pCert->rghstoreTrust[i]);
416 }
417 else
418 {
420 ret = FALSE;
421 }
422 }
423 else
424 {
426 ret = FALSE;
427 }
428 break;
429 default:
430 FIXME("unimplemented for %ld\n", data->pWintrustData->dwUnionChoice);
432 ret = FALSE;
433 }
434
435error:
436 if (!ret)
437 data->padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV] =
438 GetLastError();
439 TRACE("returning %ld (%08lx)\n", ret ? S_OK : S_FALSE,
440 data->padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV]);
441 return ret ? S_OK : S_FALSE;
442}
443
446{
447 DWORD err = ERROR_SUCCESS, numSteps = 0;
448 CRYPT_PROVIDER_DATA *provData;
449 BOOL ret;
450 struct wintrust_step verifySteps[5];
451
452 TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(actionID), data);
453
455 if (!provData)
456 return ERROR_OUTOFMEMORY;
457
458 ret = WintrustLoadFunctionPointers(actionID, provData->psPfns);
459 if (!ret)
460 {
461 err = GetLastError();
462 goto error;
463 }
464 if (!provData->psPfns->pfnObjectTrust)
466 /* Not sure why, but native skips the policy check */
467 provData->psPfns->pfnCertCheckPolicy = NULL;
468
469 data->hWVTStateData = provData;
470 provData->pWintrustData = data;
472 provData->hWndParent = GetDesktopWindow();
473 else
474 provData->hWndParent = hwnd;
475 provData->pgActionID = actionID;
477
478 numSteps = WINTRUST_AddTrustStepsFromFunctions(verifySteps,
479 provData->psPfns);
480 err = WINTRUST_ExecuteSteps(verifySteps, numSteps, provData);
481 goto done;
482
483error:
484 free(provData->padwTrustStepErrors);
485 free(provData->pPDSip);
486 free(provData->psPfns);
487 free(provData);
488
489done:
490 TRACE("returning %08lx\n", err);
491 return err;
492}
493
496{
497 LONG err;
498
499 TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(actionID), data);
500
501 err = WINTRUST_CertVerify(hwnd, actionID, data);
502 WINTRUST_DefaultClose(hwnd, actionID, data);
503 TRACE("returning %08lx\n", err);
504 return err;
505}
506
509{
510 DWORD stateAction;
512
513 if (WVT_ISINSTRUCT(WINTRUST_DATA, data->cbStruct, dwStateAction))
514 stateAction = data->dwStateAction;
515 else
516 {
517 TRACE("no dwStateAction, assuming WTD_STATEACTION_IGNORE\n");
518 stateAction = WTD_STATEACTION_IGNORE;
519 }
520 switch (stateAction)
521 {
524 break;
526 err = WINTRUST_CertVerify(hwnd, actionID, data);
527 break;
529 err = WINTRUST_DefaultClose(hwnd, actionID, data);
530 break;
531 default:
532 FIXME("unimplemented for %ld\n", data->dwStateAction);
533 }
534 return err;
535}
536
538{
539 TRACE("%p\n", pFile);
540 if (pFile)
541 {
542 TRACE("cbStruct: %ld\n", pFile->cbStruct);
543 TRACE("pcwszFilePath: %s\n", debugstr_w(pFile->pcwszFilePath));
544 TRACE("hFile: %p\n", pFile->hFile);
545 TRACE("pgKnownSubject: %s\n", debugstr_guid(pFile->pgKnownSubject));
546 }
547}
548
550{
551 TRACE("%p\n", catalog);
552 if (catalog)
553 {
554 TRACE("cbStruct: %ld\n", catalog->cbStruct);
555 TRACE("dwCatalogVersion: %ld\n", catalog->dwCatalogVersion);
556 TRACE("pcwszCatalogFilePath: %s\n",
558 TRACE("pcwszMemberTag: %s\n", debugstr_w(catalog->pcwszMemberTag));
559 TRACE("pcwszMemberFilePath: %s\n",
561 TRACE("hMemberFile: %p\n", catalog->hMemberFile);
562 TRACE("pbCalculatedFileHash: %p\n", catalog->pbCalculatedFileHash);
563 TRACE("cbCalculatedFileHash: %ld\n", catalog->cbCalculatedFileHash);
564 TRACE("pcCatalogContext: %p\n", catalog->pcCatalogContext);
565 }
566}
567
569{
570 TRACE("%p\n", blob);
571 if (blob)
572 {
573 TRACE("cbStruct: %ld\n", blob->cbStruct);
574 TRACE("gSubject: %s\n", debugstr_guid(&blob->gSubject));
575 TRACE("pcwszDisplayName: %s\n", debugstr_w(blob->pcwszDisplayName));
576 TRACE("cbMemObject: %ld\n", blob->cbMemObject);
577 TRACE("pbMemObject: %p\n", blob->pbMemObject);
578 TRACE("cbMemSignedMsg: %ld\n", blob->cbMemSignedMsg);
579 TRACE("pbMemSignedMsg: %p\n", blob->pbMemSignedMsg);
580 }
581}
582
584{
585 TRACE("%p\n", sgnr);
586 if (sgnr)
587 {
588 TRACE("cbStruct: %ld\n", sgnr->cbStruct);
589 TRACE("pcwszDisplayName: %s\n", debugstr_w(sgnr->pcwszDisplayName));
590 TRACE("psSignerInfo: %p\n", sgnr->psSignerInfo);
591 TRACE("chStores: %ld\n", sgnr->chStores);
592 }
593}
594
596{
597 TRACE("%p\n", cert);
598 if (cert)
599 {
600 TRACE("cbStruct: %ld\n", cert->cbStruct);
601 TRACE("pcwszDisplayName: %s\n", debugstr_w(cert->pcwszDisplayName));
602 TRACE("psCertContext: %p\n", cert->psCertContext);
603 TRACE("chStores: %ld\n", cert->chStores);
604 TRACE("dwFlags: %08lx\n", cert->dwFlags);
605 TRACE("psftVerifyAsOf: %p\n", cert->psftVerifyAsOf);
606 }
607}
608
610{
611 TRACE("%p\n", data);
612 if (data)
613 {
614 TRACE("cbStruct: %ld\n", data->cbStruct);
615 TRACE("pPolicyCallbackData: %p\n", data->pPolicyCallbackData);
616 TRACE("pSIPClientData: %p\n", data->pSIPClientData);
617 TRACE("dwUIChoice: %ld\n", data->dwUIChoice);
618 TRACE("fdwRevocationChecks: %08lx\n", data->fdwRevocationChecks);
619 TRACE("dwUnionChoice: %ld\n", data->dwUnionChoice);
620 switch (data->dwUnionChoice)
621 {
622 case WTD_CHOICE_FILE:
623 dump_file_info(data->pFile);
624 break;
626 dump_catalog_info(data->pCatalog);
627 break;
628 case WTD_CHOICE_BLOB:
629 dump_blob_info(data->pBlob);
630 break;
632 dump_sgnr_info(data->pSgnr);
633 break;
634 case WTD_CHOICE_CERT:
635 dump_cert_info(data->pCert);
636 break;
637 }
638 TRACE("dwStateAction: %ld\n", data->dwStateAction);
639 TRACE("hWVTStateData: %p\n", data->hWVTStateData);
640 TRACE("pwszURLReference: %s\n", debugstr_w(data->pwszURLReference));
641 TRACE("dwProvFlags: %08lx\n", data->dwProvFlags);
642 TRACE("dwUIContext: %ld\n", data->dwUIContext);
643 }
644}
645
646/***********************************************************************
647 * WinVerifyTrust (WINTRUST.@)
648 *
649 * Verifies an object by calling the specified trust provider.
650 *
651 * PARAMS
652 * hwnd [I] Handle to a caller window.
653 * ActionID [I] Pointer to a GUID that identifies the action to perform.
654 * ActionData [I] Information used by the trust provider to verify the object.
655 *
656 * RETURNS
657 * Success: Zero.
658 * Failure: A TRUST_E_* error code.
659 *
660 * NOTES
661 * Trust providers can be found at:
662 * HKLM\SOFTWARE\Microsoft\Cryptography\Providers\Trust\
663 */
664LONG WINAPI WinVerifyTrust( HWND hwnd, GUID *ActionID, LPVOID ActionData )
665{
666 static const GUID unknown = { 0xC689AAB8, 0x8E78, 0x11D0, { 0x8C,0x47,
667 0x00,0xC0,0x4F,0xC2,0x95,0xEE } };
668 static const GUID published_software = WIN_SPUB_ACTION_PUBLISHED_SOFTWARE;
669 static const GUID generic_verify_v2 = WINTRUST_ACTION_GENERIC_VERIFY_V2;
670 static const GUID generic_cert_verify = WINTRUST_ACTION_GENERIC_CERT_VERIFY;
671 static const GUID generic_chain_verify = WINTRUST_ACTION_GENERIC_CHAIN_VERIFY;
672 static const GUID cert_action_verify = CERT_CERTIFICATE_ACTION_VERIFY;
674 WINTRUST_DATA *actionData = ActionData;
675
676 TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(ActionID), ActionData);
677 dump_wintrust_data(ActionData);
678
679 /* Support for known old-style callers: */
680 if (IsEqualGUID(ActionID, &published_software))
681 err = WINTRUST_PublishedSoftware(hwnd, ActionID, ActionData);
682 else if (IsEqualGUID(ActionID, &cert_action_verify))
683 err = WINTRUST_CertActionVerify(hwnd, ActionID, ActionData);
684 else
685 {
686 DWORD stateAction;
687
688 /* Check known actions to warn of possible problems */
689 if (!IsEqualGUID(ActionID, &unknown) &&
690 !IsEqualGUID(ActionID, &generic_verify_v2) &&
691 !IsEqualGUID(ActionID, &generic_cert_verify) &&
692 !IsEqualGUID(ActionID, &generic_chain_verify))
693 WARN("unknown action %s, default behavior may not be right\n",
694 debugstr_guid(ActionID));
695 if (WVT_ISINSTRUCT(WINTRUST_DATA, actionData->cbStruct, dwStateAction))
696 stateAction = actionData->dwStateAction;
697 else
698 {
699 TRACE("no dwStateAction, assuming WTD_STATEACTION_IGNORE\n");
700 stateAction = WTD_STATEACTION_IGNORE;
701 }
702 switch (stateAction)
703 {
705 err = WINTRUST_DefaultVerifyAndClose(hwnd, ActionID, ActionData);
706 break;
708 err = WINTRUST_DefaultVerify(hwnd, ActionID, ActionData);
709 break;
711 err = WINTRUST_DefaultClose(hwnd, ActionID, ActionData);
712 break;
713 default:
714 FIXME("unimplemented for %ld\n", actionData->dwStateAction);
715 }
716 }
717
718 if (err) SetLastError(err);
719 TRACE("returning %08lx\n", err);
720 return err;
721}
722
723/***********************************************************************
724 * WinVerifyTrustEx (WINTRUST.@)
725 */
727 WINTRUST_DATA* ActionData )
728{
729 return WinVerifyTrust(hwnd, ActionID, ActionData);
730}
731
732/***********************************************************************
733 * WTHelperGetProvSignerFromChain (WINTRUST.@)
734 */
736 CRYPT_PROVIDER_DATA *pProvData, DWORD idxSigner, BOOL fCounterSigner,
737 DWORD idxCounterSigner)
738{
740
741 TRACE("(%p %ld %d %ld)\n", pProvData, idxSigner, fCounterSigner,
742 idxCounterSigner);
743
744 if (idxSigner >= pProvData->csSigners || !pProvData->pasSigners)
745 return NULL;
746 sgnr = &pProvData->pasSigners[idxSigner];
747 if (fCounterSigner)
748 {
749 if (idxCounterSigner >= sgnr->csCounterSigners ||
750 !sgnr->pasCounterSigners)
751 return NULL;
752 sgnr = &sgnr->pasCounterSigners[idxCounterSigner];
753 }
754 TRACE("returning %p\n", sgnr);
755 return sgnr;
756}
757
758/***********************************************************************
759 * WTHelperGetProvCertFromChain (WINTRUST.@)
760 */
762 CRYPT_PROVIDER_SGNR *pSgnr, DWORD idxCert)
763{
765
766 TRACE("(%p %ld)\n", pSgnr, idxCert);
767
768 if (idxCert >= pSgnr->csCertChain || !pSgnr->pasCertChain)
769 return NULL;
770 cert = &pSgnr->pasCertChain[idxCert];
771 TRACE("returning %p\n", cert);
772 return cert;
773}
774
776 CRYPT_PROVIDER_DATA* pProvData,
777 GUID* pgProviderID)
778{
779 CRYPT_PROVIDER_PRIVDATA *privdata = NULL;
780 DWORD i;
781
782 TRACE("(%p, %s)\n", pProvData, debugstr_guid(pgProviderID));
783
784 for (i = 0; i < pProvData->csProvPrivData; i++)
785 if (IsEqualGUID(pgProviderID, &pProvData->pasProvPrivData[i].gProviderID))
786 {
787 privdata = &pProvData->pasProvPrivData[i];
788 break;
789 }
790
791 return privdata;
792}
793
794/***********************************************************************
795 * WTHelperProvDataFromStateData (WINTRUST.@)
796 */
798{
799 TRACE("%p\n", hStateData);
800 return hStateData;
801}
802
803/***********************************************************************
804 * WTHelperGetFileName(WINTRUST.@)
805 */
807{
808 TRACE("%p\n",data);
809 if (data->dwUnionChoice == WTD_CHOICE_FILE)
810 return data->pFile->pcwszFilePath;
811 else
812 return NULL;
813}
814
815/***********************************************************************
816 * WTHelperGetFileHandle(WINTRUST.@)
817 */
819{
820 TRACE("%p\n",data);
821 if (data->dwUnionChoice == WTD_CHOICE_FILE)
822 return data->pFile->hFile;
823 else
825}
826
828{
829 PCCRYPT_OID_INFO **usages = pvArg;
830 DWORD cUsages;
831 BOOL ret;
832
833 if (!*usages)
834 {
835 cUsages = 0;
836 *usages = malloc(2 * sizeof(PCCRYPT_OID_INFO));
837 }
838 else
839 {
841
842 /* Count the existing usages.
843 * FIXME: make sure the new usage doesn't duplicate any in the list?
844 */
845 for (cUsages = 0, ptr = *usages; *ptr; ptr++, cUsages++)
846 ;
847 *usages = realloc(*usages, (cUsages + 2) * sizeof(PCCRYPT_OID_INFO));
848 }
849 if (*usages)
850 {
851 (*usages)[cUsages] = pInfo;
852 (*usages)[cUsages + 1] = NULL;
853 ret = TRUE;
854 }
855 else
856 {
858 ret = FALSE;
859 }
860 return ret;
861}
862
863/***********************************************************************
864 * WTHelperGetKnownUsages(WINTRUST.@)
865 *
866 * Enumerates the known enhanced key usages as an array of PCCRYPT_OID_INFOs.
867 *
868 * PARAMS
869 * action [In] 1 => allocate and return known usages, 2 => free previously
870 * allocated usages.
871 * usages [In/Out] If action == 1, *usages is set to an array of
872 * PCCRYPT_OID_INFO *. The array is terminated with a NULL
873 * pointer.
874 * If action == 2, *usages is freed.
875 *
876 * RETURNS
877 * TRUE on success, FALSE on failure.
878 */
880{
881 BOOL ret;
882
883 TRACE("(%ld, %p)\n", action, usages);
884
885 if (!usages)
886 {
888 return FALSE;
889 }
890
891 if (action == 1)
892 {
893 *usages = NULL;
896 }
897 else if (action == 2)
898 {
899 free(*usages);
900 *usages = NULL;
901 ret = TRUE;
902 }
903 else
904 {
905 WARN("unknown action %ld\n", action);
907 ret = FALSE;
908 }
909 return ret;
910}
911
912static const WCHAR Software_Publishing[] = {
913 'S','o','f','t','w','a','r','e','\\',
914 'M','i','c','r','o','s','o','f','t','\\',
915 'W','i','n','d','o','w','s','\\',
916 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
917 'W','i','n','t','r','u','s','t','\\',
918 'T','r','u','s','t',' ','P','r','o','v','i','d','e','r','s','\\',
919 'S','o','f','t','w','a','r','e',' ',
920 'P','u','b','l','i','s','h','i','n','g',0 };
921static const WCHAR State[] = { 'S','t','a','t','e',0 };
922
923/***********************************************************************
924 * WintrustGetRegPolicyFlags (WINTRUST.@)
925 */
927{
928 HKEY key;
929 LONG r;
930
931 TRACE("%p\n", pdwPolicyFlags);
932
933 *pdwPolicyFlags = 0;
935 KEY_READ, NULL, &key, NULL);
936 if (!r)
937 {
938 DWORD size = sizeof(DWORD);
939
940 r = RegQueryValueExW(key, State, NULL, NULL, (LPBYTE)pdwPolicyFlags,
941 &size);
943 if (r)
944 {
945 /* Failed to query, create and return default value */
946 *pdwPolicyFlags = WTPF_IGNOREREVOCATIONONTS |
951 WintrustSetRegPolicyFlags(*pdwPolicyFlags);
952 }
953 }
954}
955
956/***********************************************************************
957 * WintrustSetRegPolicyFlags (WINTRUST.@)
958 */
960{
961 HKEY key;
962 LONG r;
963
964 TRACE("%lx\n", dwPolicyFlags);
965
967 NULL, 0, KEY_WRITE, NULL, &key, NULL);
968 if (!r)
969 {
970 r = RegSetValueExW(key, State, 0, REG_DWORD, (LPBYTE)&dwPolicyFlags,
971 sizeof(DWORD));
973 }
974 if (r) SetLastError(r);
975 return r == ERROR_SUCCESS;
976}
977
978/* Utility functions */
979
981{
982 BOOL ret = FALSE;
983
984 TRACE("(%p, %p)\n", data, store);
985
986 data->pahStores = realloc(data->pahStores, (data->chStores + 1) * sizeof(HCERTSTORE));
987 if (data->pahStores)
988 {
989 data->pahStores[data->chStores++] = CertDuplicateStore(store);
990 ret = TRUE;
991 }
992 else
994 return ret;
995}
996
998 BOOL fCounterSigner, DWORD idxSigner, CRYPT_PROVIDER_SGNR *sgnr)
999{
1000 BOOL ret = FALSE;
1001
1002 TRACE("(%p, %d, %ld, %p)\n", data, fCounterSigner, idxSigner, sgnr);
1003
1004 if (sgnr->cbStruct > sizeof(CRYPT_PROVIDER_SGNR))
1005 {
1007 return FALSE;
1008 }
1009 if (fCounterSigner)
1010 {
1011 FIXME("unimplemented for counter signers\n");
1013 return FALSE;
1014 }
1015 data->pasSigners = realloc(data->pasSigners,
1016 (data->csSigners + 1) * sizeof(CRYPT_PROVIDER_SGNR));
1017 if (data->pasSigners)
1018 {
1019 if (idxSigner < data->csSigners)
1020 memmove(&data->pasSigners[idxSigner],
1021 &data->pasSigners[idxSigner + 1],
1022 (data->csSigners - idxSigner) * sizeof(CRYPT_PROVIDER_SGNR));
1023 ret = TRUE;
1024 if (sgnr->cbStruct == sizeof(CRYPT_PROVIDER_SGNR))
1025 {
1026 /* The PSDK says psSigner should be allocated using pfnAlloc, but
1027 * it doesn't say anything about ownership. Since callers are
1028 * internal, assume ownership is passed, and just store the
1029 * pointer.
1030 */
1031 memcpy(&data->pasSigners[idxSigner], sgnr,
1032 sizeof(CRYPT_PROVIDER_SGNR));
1033 }
1034 else
1035 memset(&data->pasSigners[idxSigner], 0,
1036 sizeof(CRYPT_PROVIDER_SGNR));
1037 data->csSigners++;
1038 }
1039 else
1041 return ret;
1042}
1043
1045 BOOL fCounterSigner, DWORD idxCounterSigner, PCCERT_CONTEXT pCert2Add)
1046{
1047 BOOL ret = FALSE;
1048
1049 TRACE("(%p, %ld, %d, %ld, %p)\n", data, idxSigner, fCounterSigner,
1050 idxSigner, pCert2Add);
1051
1052 if (fCounterSigner)
1053 {
1054 FIXME("unimplemented for counter signers\n");
1056 return FALSE;
1057 }
1058 data->pasSigners[idxSigner].pasCertChain =
1059 realloc(data->pasSigners[idxSigner].pasCertChain,
1060 (data->pasSigners[idxSigner].csCertChain + 1) *
1061 sizeof(CRYPT_PROVIDER_CERT));
1062 if (data->pasSigners[idxSigner].pasCertChain)
1063 {
1064 CRYPT_PROVIDER_CERT *cert = &data->pasSigners[idxSigner].pasCertChain[
1065 data->pasSigners[idxSigner].csCertChain];
1066
1067 cert->cbStruct = sizeof(CRYPT_PROVIDER_CERT);
1068 cert->pCert = CertDuplicateCertificateContext(pCert2Add);
1069 data->pasSigners[idxSigner].csCertChain++;
1070 ret = TRUE;
1071 }
1072 else
1074 return ret;
1075}
1076
1078 CRYPT_PROVIDER_PRIVDATA *pPrivData2Add)
1079{
1080 BOOL ret = FALSE;
1081
1082 TRACE("(%p, %p)\n", data, pPrivData2Add);
1083
1084 if (pPrivData2Add->cbStruct > sizeof(CRYPT_PROVIDER_PRIVDATA))
1085 {
1087 WARN("invalid struct size\n");
1088 return FALSE;
1089 }
1090 data->pasProvPrivData = realloc(data->pasProvPrivData,
1091 (data->csProvPrivData + 1) * sizeof(*data->pasProvPrivData));
1092 if (data->pasProvPrivData)
1093 {
1094 DWORD i;
1095
1096 for (i = 0; i < data->csProvPrivData; i++)
1097 if (IsEqualGUID(&pPrivData2Add->gProviderID, &data->pasProvPrivData[i]))
1098 break;
1099
1100 data->pasProvPrivData[i] = *pPrivData2Add;
1101 if (i == data->csProvPrivData)
1102 data->csProvPrivData++;
1103 }
1104 else
1106 return ret;
1107}
1108
1109/***********************************************************************
1110 * OpenPersonalTrustDBDialog (WINTRUST.@)
1111 *
1112 * Opens the certificate manager dialog, showing only the stores that
1113 * contain trusted software publishers.
1114 *
1115 * PARAMS
1116 * hwnd [I] handle of parent window
1117 *
1118 * RETURNS
1119 * TRUE if the dialog could be opened, FALSE if not.
1120 */
1122{
1123 CRYPTUI_CERT_MGR_STRUCT uiCertMgr;
1124
1125 uiCertMgr.dwSize = sizeof(uiCertMgr);
1126 uiCertMgr.hwndParent = hwnd;
1128 uiCertMgr.pwszTitle = NULL;
1129 uiCertMgr.pszInitUsageOID = NULL;
1130 return CryptUIDlgCertMgr(&uiCertMgr);
1131}
1132
1133/***********************************************************************
1134 * WTHelperCertCheckValidSignature
1135 */
1137{
1138 FIXME("Stub\n");
1139 return S_OK;
1140}
1141
1142/***********************************************************************
1143 * IsCatalogFile
1144 */
1146{
1147 static const GUID catGUID = { 0xDE351A43, 0x8E59, 0x11D0, { 0x8C,0x47,0x00,0xC0,0x4F,0xC2,0x95,0xEE }};
1148 GUID guid;
1149
1150 TRACE("(%p, %s)\n", hFile, debugstr_w(pwszFileName));
1151
1152 if (!CryptSIPRetrieveSubjectGuid(pwszFileName, hFile, &guid))
1153 return FALSE;
1154 return IsEqualGUID(&guid, &catGUID);
1155}
1156
1157/***********************************************************************
1158 * FindCertsByIssuer
1159 */
1161 DWORD *pcCertChains, BYTE* pbEncodedIssuerName, DWORD cbEncodedIssuerName,
1162 LPCWSTR pwszPurpose, DWORD dwKeySpec)
1163{
1164 FIXME("(%p, %p, %p, %p, %ld, %s, %ld): stub\n", pCertChains, pcbCertChains,
1165 pcCertChains, pbEncodedIssuerName, cbEncodedIssuerName,
1166 debugstr_w(pwszPurpose), dwKeySpec);
1167 return E_FAIL;
1168}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define RegCloseKey(hKey)
Definition: registry.h:49
BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
Definition: decode.c:6286
#define CERT_CERTIFICATE_ACTION_VERIFY
Definition: cryptdlg.h:236
#define CRYPTUI_CERT_MGR_PUBLISHER_TAB
Definition: cryptuiapi.h:47
#define E_FAIL
Definition: ddrawi.h:102
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
BOOL WINAPI CertCompareCertificateName(DWORD dwCertEncodingType, PCERT_NAME_BLOB pCertName1, PCERT_NAME_BLOB pCertName2)
Definition: cert.c:1180
PCERT_EXTENSION WINAPI CertFindExtension(LPCSTR pszObjId, DWORD cExtensions, CERT_EXTENSION rgExtensions[])
Definition: cert.c:2028
BOOL WINAPI CertGetCertificateContextProperty(PCCERT_CONTEXT pCertContext, DWORD dwPropId, void *pvData, DWORD *pcbData)
Definition: cert.c:551
PCCERT_CONTEXT WINAPI CertDuplicateCertificateContext(PCCERT_CONTEXT pCertContext)
Definition: cert.c:360
BOOL WINAPI CertCompareIntegerBlob(PCRYPT_INTEGER_BLOB pInt1, PCRYPT_INTEGER_BLOB pInt2)
Definition: cert.c:1221
LPVOID WINAPI CryptMemAlloc(ULONG cbSize)
Definition: main.c:131
VOID WINAPI CryptMemFree(LPVOID pv)
Definition: main.c:141
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1605
BOOL WINAPI CryptEnumOIDInfo(DWORD dwGroupId, DWORD dwFlags, void *pvArg, PFN_CRYPT_ENUM_OID_INFO pfnEnumOIDInfo)
Definition: oid.c:1776
BOOL WINAPI CryptSIPRetrieveSubjectGuid(LPCWSTR FileName, HANDLE hFileIn, GUID *pgSubject)
Definition: sip.c:310
HCERTSTORE WINAPI CertDuplicateStore(HCERTSTORE hCertStore)
Definition: store.c:1116
BOOL WINAPI CryptUIDlgCertMgr(PCCRYPTUI_CERT_MGR_STRUCT pCryptUICertMgr)
Definition: main.c:1313
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
static const WCHAR *const ext[]
Definition: module.c:53
BOOL WINAPI SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime)
Definition: time.c:158
VOID WINAPI GetSystemTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:327
GUID guid
Definition: version.c:147
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
static const GUID catGUID
Definition: crypt.c:1619
BOOL WINAPI WintrustLoadFunctionPointers(GUID *pgActionID, CRYPT_PROVIDER_FUNCTIONS *pPfns)
Definition: register.c:865
return ret
Definition: mutex.c:146
action
Definition: namespace.c:707
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
MdFileObject pFile
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizeiptr size
Definition: glext.h:5919
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
#define S_OK
Definition: intsafe.h:52
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
if(dx< 0)
Definition: linetemp.h:194
#define error(str)
Definition: mkdosfs.c:1605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
static PVOID ptr
Definition: dispmode.c:27
static BYTE cert[]
Definition: msg.c:1374
static DWORD DWORD DWORD DWORD * steps
Definition: cursoricon.c:1804
static PCCRYPT_OID_INFO ** usages
Definition: softpub.c:81
_In_ HANDLE hFile
Definition: mswsock.h:90
#define KEY_READ
Definition: nt_native.h:1026
#define KEY_WRITE
Definition: nt_native.h:1034
#define DWORD
Definition: nt_native.h:44
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define err(...)
#define calloc
Definition: rosglue.h:14
#define REG_DWORD
Definition: sdbapi.c:615
#define memset(x, y, z)
Definition: compat.h:39
#define WINTRUST_ACTION_GENERIC_VERIFY_V2
Definition: softpub.h:108
#define WINTRUST_ACTION_GENERIC_CHAIN_VERIFY
Definition: softpub.h:37
#define WINTRUST_ACTION_GENERIC_CERT_VERIFY
Definition: softpub.h:24
#define TRACE(s)
Definition: solgame.cpp:4
LPCWSTR pcwszCatalogFilePath
Definition: wintrust.h:39
LPCWSTR pcwszMemberTag
Definition: wintrust.h:40
LPCWSTR pcwszMemberFilePath
Definition: wintrust.h:41
PCCTL_CONTEXT pcCatalogContext
Definition: wintrust.h:45
DWORD cbCalculatedFileHash
Definition: wintrust.h:44
BYTE * pbCalculatedFileHash
Definition: wintrust.h:43
LPCWSTR pcwszFilePath
Definition: wintrust.h:30
CMSG_SIGNER_INFO * psSignerInfo
Definition: wintrust.h:63
LPCWSTR pcwszDisplayName
Definition: wintrust.h:62
Definition: wincrypt.h:341
CERT_NAME_BLOB DirectoryName
Definition: wincrypt.h:347
struct WINTRUST_SIGNATURE_SETTINGS_ * pSigSettings
Definition: wintrust.h:381
CRYPT_PROVIDER_PRIVDATA * pasProvPrivData
Definition: wintrust.h:366
CRYPT_PROVIDER_SGNR * pasSigners
Definition: wintrust.h:364
CRYPT_PROVIDER_FUNCTIONS * psPfns
Definition: wintrust.h:356
DWORD * padwTrustStepErrors
Definition: wintrust.h:358
WINTRUST_DATA * pWintrustData
Definition: wintrust.h:348
DWORD dwRegPolicySettings
Definition: wintrust.h:355
DWORD cdwTrustStepErrors
Definition: wintrust.h:357
struct _PROVDATA_SIP * pPDSip
Definition: wintrust.h:369
PFN_PROVIDER_CLEANUP_CALL pfnCleanupPolicy
Definition: wintrust.h:329
PFN_PROVIDER_CERTTRUST_CALL pfnCertificateTrust
Definition: wintrust.h:324
PFN_PROVIDER_OBJTRUST_CALL pfnObjectTrust
Definition: wintrust.h:322
PFN_PROVIDER_SIGTRUST_CALL pfnSignatureTrust
Definition: wintrust.h:323
PFN_PROVIDER_FINALPOLICY_CALL pfnFinalPolicy
Definition: wintrust.h:325
PFN_PROVIDER_INIT_CALL pfnInitialize
Definition: wintrust.h:321
PFN_PROVIDER_CERTCHKPOLICY_CALL pfnCertCheckPolicy
Definition: wintrust.h:326
struct _CRYPT_PROVIDER_SGNR * pasCounterSigners
Definition: wintrust.h:240
CRYPT_PROVIDER_CERT * pasCertChain
Definition: wintrust.h:235
FILETIME sftVerifyAsOf
Definition: wintrust.h:233
DWORD dwUnionChoice
Definition: wintrust.h:104
struct WINTRUST_FILE_INFO_ * pFile
Definition: wintrust.h:107
DWORD dwStateAction
Definition: wintrust.h:114
DWORD cbStruct
Definition: wintrust.h:99
DWORD dwUIChoice
Definition: wintrust.h:102
Definition: image.c:134
Definition: copy.c:22
wintrust_step_func func
unsigned char * LPBYTE
Definition: typedefs.h:53
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define X509_AUTHORITY_KEY_ID2
Definition: wincrypt.h:3550
#define szOID_AUTHORITY_KEY_IDENTIFIER
Definition: wincrypt.h:3331
#define CRYPT_DECODE_NOCOPY_FLAG
Definition: wincrypt.h:3608
#define CERT_KEY_IDENTIFIER_PROP_ID
Definition: wincrypt.h:2853
#define CERT_ALT_NAME_DIRECTORY_NAME
Definition: wincrypt.h:358
#define CRYPT_ENHKEY_USAGE_OID_GROUP_ID
Definition: wincrypt.h:1943
#define CRYPT_DECODE_ALLOC_FLAG
Definition: wincrypt.h:3612
#define X509_AUTHORITY_KEY_ID
Definition: wincrypt.h:3526
#define szOID_AUTHORITY_KEY_IDENTIFIER2
Definition: wincrypt.h:3356
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define WVT_ISINSTRUCT(t, s, f)
Definition: wintrust.h:433
#define WTD_CHOICE_CATALOG
Definition: wintrust.h:92
#define WTPF_OFFLINEOK_COM
Definition: wintrust.h:441
#define WTD_CHOICE_BLOB
Definition: wintrust.h:93
struct _CRYPT_PROVIDER_CERT CRYPT_PROVIDER_CERT
#define WTPF_IGNOREREVOCATIONONTS
Definition: wintrust.h:445
#define TRUSTERROR_STEP_FINAL_OBJPROV
Definition: wintrust.h:275
struct _CRYPT_PROVIDER_DATA CRYPT_PROVIDER_DATA
#define WTD_CHOICE_SIGNER
Definition: wintrust.h:94
#define WTD_STATEACTION_CLOSE
Definition: wintrust.h:124
struct _PROVDATA_SIP PROVDATA_SIP
#define TRUSTERROR_STEP_FINAL_WVTINIT
Definition: wintrust.h:273
struct _CRYPT_PROVIDER_FUNCTIONS CRYPT_PROVIDER_FUNCTIONS
#define TRUSTERROR_STEP_FINAL_POLICYPROV
Definition: wintrust.h:279
#define TRUSTERROR_MAX_STEPS
Definition: wintrust.h:282
#define TRUSTERROR_STEP_FINAL_CERTPROV
Definition: wintrust.h:277
#define WTD_STATEACTION_VERIFY
Definition: wintrust.h:123
#define WTD_STATEACTION_IGNORE
Definition: wintrust.h:122
#define WIN_SPUB_ACTION_PUBLISHED_SOFTWARE
Definition: wintrust.h:660
#define WTPF_OFFLINEOK_IND
Definition: wintrust.h:440
#define WTPF_OFFLINEOKNBU_COM
Definition: wintrust.h:443
#define WTD_UI_NONE
Definition: wintrust.h:84
#define WTD_CHOICE_CERT
Definition: wintrust.h:95
#define TRUSTERROR_STEP_FINAL_SIGPROV
Definition: wintrust.h:276
#define WTD_CHOICE_FILE
Definition: wintrust.h:91
#define WVT_IS_CBSTRUCT_GT_MEMBEROFFSET(t, s, f)
Definition: wintrust.h:434
#define WTPF_OFFLINEOKNBU_IND
Definition: wintrust.h:442
static const WCHAR Software_Publishing[]
static LONG WINTRUST_CertActionVerify(HWND hwnd, GUID *actionID, WINTRUST_DATA *data)
HRESULT(WINAPI * wintrust_step_func)(CRYPT_PROVIDER_DATA *data)
static CRYPT_PROVIDER_DATA * WINTRUST_AllocateProviderData(void)
HANDLE WINAPI WTHelperGetFileHandle(WINTRUST_DATA *data)
BOOL WINAPI WTHelperGetKnownUsages(DWORD action, PCCRYPT_OID_INFO **usages)
CRYPT_PROVIDER_CERT *WINAPI WTHelperGetProvCertFromChain(CRYPT_PROVIDER_SGNR *pSgnr, DWORD idxCert)
CRYPT_PROVIDER_SGNR *WINAPI WTHelperGetProvSignerFromChain(CRYPT_PROVIDER_DATA *pProvData, DWORD idxSigner, BOOL fCounterSigner, DWORD idxCounterSigner)
static void dump_sgnr_info(WINTRUST_SGNR_INFO *sgnr)
BOOL WINAPI OpenPersonalTrustDBDialog(HWND hwnd)
static LONG WINTRUST_PublishedSoftware(HWND hwnd, GUID *actionID, WINTRUST_DATA *data)
static LONG WINTRUST_CertVerify(HWND hwnd, GUID *actionID, WINTRUST_DATA *data)
BOOL WINAPI IsCatalogFile(HANDLE hFile, WCHAR *pwszFileName)
HRESULT WINAPI WTHelperCertCheckValidSignature(CRYPT_PROVIDER_DATA *pProvData)
static void dump_catalog_info(WINTRUST_CATALOG_INFO *catalog)
static DWORD WINTRUST_ExecuteSteps(const struct wintrust_step *steps, DWORD numSteps, CRYPT_PROVIDER_DATA *provData)
static LONG WINTRUST_DefaultVerify(HWND hwnd, GUID *actionID, WINTRUST_DATA *data)
static void dump_cert_info(WINTRUST_CERT_INFO *cert)
static LONG WINTRUST_DefaultVerifyAndClose(HWND hwnd, GUID *actionID, WINTRUST_DATA *data)
void WINAPI WintrustGetRegPolicyFlags(DWORD *pdwPolicyFlags)
static LONG WINTRUST_CertVerifyAndClose(HWND hwnd, GUID *actionID, WINTRUST_DATA *data)
HRESULT WINAPI WinVerifyTrustEx(HWND hwnd, GUID *ActionID, WINTRUST_DATA *ActionData)
BOOL WINAPI WINTRUST_AddStore(CRYPT_PROVIDER_DATA *data, HCERTSTORE store)
static void dump_blob_info(WINTRUST_BLOB_INFO *blob)
BOOL WINAPI WintrustSetRegPolicyFlags(DWORD dwPolicyFlags)
static void dump_wintrust_data(WINTRUST_DATA *data)
CRYPT_PROVIDER_DATA *WINAPI WTHelperProvDataFromStateData(HANDLE hStateData)
static void dump_file_info(WINTRUST_FILE_INFO *pFile)
static DWORD WINTRUST_AddTrustStepsFromFunctions(struct wintrust_step *steps, const CRYPT_PROVIDER_FUNCTIONS *psPfns)
BOOL WINAPI TrustIsCertificateSelfSigned(PCCERT_CONTEXT cert)
Definition: wintrust_main.c:42
static HRESULT WINAPI WINTRUST_CertVerifyObjTrust(CRYPT_PROVIDER_DATA *data)
static BOOL WINAPI WINTRUST_enumUsages(PCCRYPT_OID_INFO pInfo, void *pvArg)
BOOL WINAPI WINTRUST_AddCert(CRYPT_PROVIDER_DATA *data, DWORD idxSigner, BOOL fCounterSigner, DWORD idxCounterSigner, PCCERT_CONTEXT pCert2Add)
HRESULT WINAPI FindCertsByIssuer(PCERT_CHAIN pCertChains, DWORD *pcbCertChains, DWORD *pcCertChains, BYTE *pbEncodedIssuerName, DWORD cbEncodedIssuerName, LPCWSTR pwszPurpose, DWORD dwKeySpec)
CRYPT_PROVIDER_PRIVDATA *WINAPI WTHelperGetProvPrivateDataFromChain(CRYPT_PROVIDER_DATA *pProvData, GUID *pgProviderID)
static LONG WINTRUST_DefaultClose(HWND hwnd, GUID *actionID, WINTRUST_DATA *data)
LPCWSTR WINAPI WTHelperGetFileName(WINTRUST_DATA *data)
BOOL WINAPI WINTRUST_AddPrivData(CRYPT_PROVIDER_DATA *data, CRYPT_PROVIDER_PRIVDATA *pPrivData2Add)
BOOL WINAPI WINTRUST_AddSgnr(CRYPT_PROVIDER_DATA *data, BOOL fCounterSigner, DWORD idxSigner, CRYPT_PROVIDER_SGNR *sgnr)
LONG WINAPI WinVerifyTrust(HWND hwnd, GUID *ActionID, LPVOID ActionData)
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:628
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char BYTE
Definition: xxhash.c:193