ReactOS 0.4.17-dev-357-ga8f14ff
cryptnet_main.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2006 Maarten Lankhorst
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
21#define CERT_REVOCATION_PARA_HAS_EXTRA_FIELDS
22
23#include <share.h>
24#include <stdio.h>
25#include <stdarg.h>
26
27#include "windef.h"
28#include "winbase.h"
29#include "winnt.h"
30#include "winnls.h"
31#include "wininet.h"
32#include "objbase.h"
33#include "wincrypt.h"
34#include "initguid.h"
35#include "knownfolders.h"
36#include "shlobj.h"
37#ifdef __REACTOS__
38#include <shlwapi.h>
39#endif
40
41#include "wine/debug.h"
42
44
45#define IS_INTOID(x) (((ULONG_PTR)(x) >> 16) == 0)
46
47#ifdef __REACTOS__
48/* We don't have SHGetKnownFolderPath yet */
49#define SHGetKnownFolderPath(a,b,c,out) CryptnetSHGetKnownFolderPath(out)
50static HRESULT CryptnetSHGetKnownFolderPath(WCHAR **out)
51{
54 if (SUCCEEDED(hr))
55 {
56 hr = SHStrDupW(buf, out);
57 }
58 return hr;
59}
60#endif /* __REACTOS__ */
61
62/***********************************************************************
63 * DllRegisterServer (CRYPTNET.@)
64 */
66{
67 TRACE("\n");
69 CRYPT_OID_VERIFY_REVOCATION_FUNC, 0, L"cryptnet.dll");
71 L"cryptnet.dll", "LdapProvOpenStore");
73 CERT_STORE_PROV_LDAP_W, L"cryptnet.dll", "LdapProvOpenStore");
74 return S_OK;
75}
76
77/***********************************************************************
78 * DllUnregisterServer (CRYPTNET.@)
79 */
81{
82 TRACE("\n");
84 CRYPT_OID_VERIFY_REVOCATION_FUNC, L"cryptnet.dll");
88 return S_OK;
89}
90
91static const char *url_oid_to_str(LPCSTR oid)
92{
93 if (IS_INTOID(oid))
94 {
95 static char buf[10];
96
97 switch (LOWORD(oid))
98 {
99#define _x(oid) case LOWORD(oid): return #oid
108#undef _x
109 default:
110 snprintf(buf, sizeof(buf), "%d", LOWORD(oid));
111 return buf;
112 }
113 }
114 else
115 return oid;
116}
117
120
122 LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray,
123 PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
124{
125 PCCERT_CONTEXT cert = pvPara;
127 BOOL ret = FALSE;
128
129 /* The only applicable flag is CRYPT_GET_URL_FROM_EXTENSION */
131 {
133 return FALSE;
134 }
136 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
137 {
139 DWORD size;
140
142 ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL,
143 &aia, &size);
144 if (ret)
145 {
146 DWORD i, cUrl, bytesNeeded = sizeof(CRYPT_URL_ARRAY);
147
148 for (i = 0, cUrl = 0; i < aia->cAccDescr; i++)
149 if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
151 {
152 if (aia->rgAccDescr[i].AccessLocation.dwAltNameChoice ==
154 {
155 if (aia->rgAccDescr[i].AccessLocation.pwszURL)
156 {
157 cUrl++;
158 bytesNeeded += sizeof(LPWSTR) +
159 (lstrlenW(aia->rgAccDescr[i].AccessLocation.
160 pwszURL) + 1) * sizeof(WCHAR);
161 }
162 }
163 else
164 FIXME("unsupported alt name type %ld\n",
165 aia->rgAccDescr[i].AccessLocation.dwAltNameChoice);
166 }
167 if (!pcbUrlArray)
168 {
170 ret = FALSE;
171 }
172 else if (!pUrlArray)
173 *pcbUrlArray = bytesNeeded;
174 else if (*pcbUrlArray < bytesNeeded)
175 {
177 *pcbUrlArray = bytesNeeded;
178 ret = FALSE;
179 }
180 else
181 {
182 LPWSTR nextUrl;
183
184 *pcbUrlArray = bytesNeeded;
185 pUrlArray->cUrl = 0;
186 pUrlArray->rgwszUrl =
187 (LPWSTR *)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY));
188 nextUrl = (LPWSTR)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY)
189 + cUrl * sizeof(LPWSTR));
190 for (i = 0; i < aia->cAccDescr; i++)
191 if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
193 {
194 if (aia->rgAccDescr[i].AccessLocation.dwAltNameChoice
196 {
197 if (aia->rgAccDescr[i].AccessLocation.pwszURL)
198 {
199 lstrcpyW(nextUrl,
200 aia->rgAccDescr[i].AccessLocation.pwszURL);
201 pUrlArray->rgwszUrl[pUrlArray->cUrl++] =
202 nextUrl;
203 nextUrl += (lstrlenW(nextUrl) + 1);
204 }
205 }
206 }
207 }
208 if (ret)
209 {
210 if (pcbUrlInfo)
211 {
212 FIXME("url info: stub\n");
213 if (!pUrlInfo)
214 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
215 else if (*pcbUrlInfo < sizeof(CRYPT_URL_INFO))
216 {
217 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
219 ret = FALSE;
220 }
221 else
222 {
223 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
224 memset(pUrlInfo, 0, sizeof(CRYPT_URL_INFO));
225 }
226 }
227 }
228 LocalFree(aia);
229 }
230 }
231 else
233 return ret;
234}
235
237 PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo,
238 DWORD *pcbUrlInfo)
239{
240 BOOL ret;
242 DWORD size;
243
245 value->pbData, value->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size);
246 if (ret)
247 {
248 DWORD i, cUrl, bytesNeeded = sizeof(CRYPT_URL_ARRAY);
249
250 for (i = 0, cUrl = 0; i < info->cDistPoint; i++)
251 if (info->rgDistPoint[i].DistPointName.dwDistPointNameChoice
253 {
254 DWORD j;
256 &info->rgDistPoint[i].DistPointName.FullName;
257
258 for (j = 0; j < name->cAltEntry; j++)
259 if (name->rgAltEntry[j].dwAltNameChoice ==
261 {
262 if (name->rgAltEntry[j].pwszURL)
263 {
264 cUrl++;
265 bytesNeeded += sizeof(LPWSTR) +
266 (lstrlenW(name->rgAltEntry[j].pwszURL) + 1)
267 * sizeof(WCHAR);
268 }
269 }
270 }
271 if (!pcbUrlArray)
272 {
274 ret = FALSE;
275 }
276 else if (!pUrlArray)
277 *pcbUrlArray = bytesNeeded;
278 else if (*pcbUrlArray < bytesNeeded)
279 {
281 *pcbUrlArray = bytesNeeded;
282 ret = FALSE;
283 }
284 else
285 {
286 LPWSTR nextUrl;
287
288 *pcbUrlArray = bytesNeeded;
289 pUrlArray->cUrl = 0;
290 pUrlArray->rgwszUrl =
291 (LPWSTR *)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY));
292 nextUrl = (LPWSTR)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY)
293 + cUrl * sizeof(LPWSTR));
294 for (i = 0; i < info->cDistPoint; i++)
295 if (info->rgDistPoint[i].DistPointName.dwDistPointNameChoice
297 {
298 DWORD j;
300 &info->rgDistPoint[i].DistPointName.FullName;
301
302 for (j = 0; j < name->cAltEntry; j++)
303 if (name->rgAltEntry[j].dwAltNameChoice ==
305 {
306 if (name->rgAltEntry[j].pwszURL)
307 {
308 lstrcpyW(nextUrl,
309 name->rgAltEntry[j].pwszURL);
310 pUrlArray->rgwszUrl[pUrlArray->cUrl++] =
311 nextUrl;
312 nextUrl +=
313 (lstrlenW(name->rgAltEntry[j].pwszURL) + 1);
314 }
315 }
316 }
317 }
318 if (ret)
319 {
320 if (pcbUrlInfo)
321 {
322 FIXME("url info: stub\n");
323 if (!pUrlInfo)
324 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
325 else if (*pcbUrlInfo < sizeof(CRYPT_URL_INFO))
326 {
327 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
329 ret = FALSE;
330 }
331 else
332 {
333 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
334 memset(pUrlInfo, 0, sizeof(CRYPT_URL_INFO));
335 }
336 }
337 }
339 }
340 return ret;
341}
342
344 LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray,
345 PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
346{
347 PCCERT_CONTEXT cert = pvPara;
349 BOOL ret = FALSE;
350
351 /* The only applicable flag is CRYPT_GET_URL_FROM_EXTENSION */
353 {
355 return FALSE;
356 }
358 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
359 ret = CRYPT_GetUrlFromCRLDistPointsExt(&ext->Value, pUrlArray,
360 pcbUrlArray, pUrlInfo, pcbUrlInfo);
361 else
363 return ret;
364}
365
366/***********************************************************************
367 * CryptGetObjectUrl (CRYPTNET.@)
368 */
370 PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo,
371 DWORD *pcbUrlInfo, LPVOID pvReserved)
372{
374 HCRYPTOIDFUNCADDR hFunc = NULL;
375 BOOL ret = FALSE;
376
377 TRACE("(%s, %p, %08lx, %p, %p, %p, %p, %p)\n", debugstr_a(pszUrlOid),
378 pvPara, dwFlags, pUrlArray, pcbUrlArray, pUrlInfo, pcbUrlInfo, pvReserved);
379
380 if (IS_INTOID(pszUrlOid))
381 {
382 switch (LOWORD(pszUrlOid))
383 {
386 break;
389 break;
390 default:
391 FIXME("unimplemented for %s\n", url_oid_to_str(pszUrlOid));
393 }
394 }
395 else
396 {
397 static HCRYPTOIDFUNCSET set = NULL;
398
399 if (!set)
402 (void **)&func, &hFunc);
403 }
404 if (func)
405 ret = func(pszUrlOid, pvPara, dwFlags, pUrlArray, pcbUrlArray,
406 pUrlInfo, pcbUrlInfo, pvReserved);
407 if (hFunc)
409 return ret;
410}
411
412/***********************************************************************
413 * CryptRetrieveObjectByUrlA (CRYPTNET.@)
414 */
416 DWORD dwRetrievalFlags, DWORD dwTimeout, LPVOID *ppvObject,
417 HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, LPVOID pvVerify,
419{
420 BOOL ret = FALSE;
421 int len;
422
423 TRACE("(%s, %s, %08lx, %ld, %p, %p, %p, %p, %p)\n", debugstr_a(pszURL),
424 debugstr_a(pszObjectOid), dwRetrievalFlags, dwTimeout, ppvObject,
425 hAsyncRetrieve, pCredentials, pvVerify, pAuxInfo);
426
427 if (!pszURL)
428 {
430 return FALSE;
431 }
432 len = MultiByteToWideChar(CP_ACP, 0, pszURL, -1, NULL, 0);
433 if (len)
434 {
435 LPWSTR url = CryptMemAlloc(len * sizeof(WCHAR));
436
437 if (url)
438 {
439 MultiByteToWideChar(CP_ACP, 0, pszURL, -1, url, len);
440 ret = CryptRetrieveObjectByUrlW(url, pszObjectOid,
441 dwRetrievalFlags, dwTimeout, ppvObject, hAsyncRetrieve,
442 pCredentials, pvVerify, pAuxInfo);
444 }
445 else
447 }
448 return ret;
449}
450
451static void WINAPI CRYPT_FreeBlob(LPCSTR pszObjectOid,
452 PCRYPT_BLOB_ARRAY pObject, void *pvFreeContext)
453{
454 DWORD i;
455
456 for (i = 0; i < pObject->cBlob; i++)
457 CryptMemFree(pObject->rgBlob[i].pbData);
458 CryptMemFree(pObject->rgBlob);
459}
460
462{
463 BOOL ret;
465
466 if ((ret = GetFileSizeEx(hFile, &size)))
467 {
468 if (size.HighPart)
469 {
470 WARN("file too big\n");
472 ret = FALSE;
473 }
474 else
475 {
477
478 blob.pbData = CryptMemAlloc(size.LowPart);
479 if (blob.pbData)
480 {
481 ret = ReadFile(hFile, blob.pbData, size.LowPart, &blob.cbData,
482 NULL);
483 if (ret)
484 {
485 pObject->rgBlob = CryptMemAlloc(sizeof(CRYPT_DATA_BLOB));
486 if (pObject->rgBlob)
487 {
488 pObject->cBlob = 1;
489 memcpy(pObject->rgBlob, &blob, sizeof(CRYPT_DATA_BLOB));
490 }
491 else
492 {
494 ret = FALSE;
495 }
496 }
497 if (!ret)
498 CryptMemFree(blob.pbData);
499 }
500 else
501 {
503 ret = FALSE;
504 }
505 }
506 }
507 return ret;
508}
509
512{
513 BOOL ret = FALSE;
514 INTERNET_CACHE_ENTRY_INFOW *pCacheInfo = NULL;
515 DWORD size = 0;
516
517 TRACE("(%s, %p, %p)\n", debugstr_w(pszURL), pObject, pAuxInfo);
518
521 return FALSE;
522
523 pCacheInfo = CryptMemAlloc(size);
524 if (!pCacheInfo)
525 {
527 return FALSE;
528 }
529
530 if ((ret = RetrieveUrlCacheEntryFileW(pszURL, pCacheInfo, &size, 0)))
531 {
532 FILETIME ft;
533
535 if (CompareFileTime(&pCacheInfo->ExpireTime, &ft) >= 0)
536 {
539
541 {
543 {
544 if (pAuxInfo && pAuxInfo->cbSize >= RTL_SIZEOF_THROUGH_FIELD(CRYPT_RETRIEVE_AUX_INFO, pLastSyncTime)
545 && pAuxInfo->pLastSyncTime)
546 {
547 memcpy(pAuxInfo->pLastSyncTime,
548 &pCacheInfo->LastSyncTime,
549 sizeof(FILETIME));
550 }
551 }
553 }
554 else
555 {
556 DeleteUrlCacheEntryW(pszURL);
557 ret = FALSE;
558 }
559 }
560 else
561 {
562 DeleteUrlCacheEntryW(pszURL);
563 ret = FALSE;
564 }
565 UnlockUrlCacheEntryFileW(pszURL, 0);
566 }
567 CryptMemFree(pCacheInfo);
568 TRACE("returning %d\n", ret);
569 return ret;
570}
571
572/* Parses the URL, and sets components' lpszHostName and lpszUrlPath members
573 * to NULL-terminated copies of those portions of the URL (to be freed with
574 * CryptMemFree.)
575 */
577{
578 BOOL ret;
579
580 TRACE("(%s, %p)\n", debugstr_w(pszURL), components);
581
582 memset(components, 0, sizeof(*components));
583 components->dwStructSize = sizeof(*components);
585 components->dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH;
586 if (!components->lpszHostName)
587 {
589 return FALSE;
590 }
591 components->lpszUrlPath = CryptMemAlloc(INTERNET_MAX_PATH_LENGTH * sizeof(WCHAR));
592 components->dwUrlPathLength = INTERNET_MAX_PATH_LENGTH;
593 if (!components->lpszUrlPath)
594 {
595 CryptMemFree(components->lpszHostName);
597 return FALSE;
598 }
599
601 if (ret)
602 {
603 switch (components->nScheme)
604 {
606 if (!components->nPort)
608 break;
610 if (!components->nPort)
612 break;
613 default:
614 ; /* do nothing */
615 }
616 }
617 TRACE("returning %d\n", ret);
618 return ret;
619}
620
622{
626};
627
628static struct InetContext *CRYPT_MakeInetContext(DWORD dwTimeout)
629{
630 struct InetContext *context = CryptMemAlloc(sizeof(struct InetContext));
631
632 if (context)
633 {
635 if (!context->event)
636 {
638 context = NULL;
639 }
640 else
641 {
642 context->timeout = dwTimeout;
643 context->error = ERROR_SUCCESS;
644 }
645 }
646 return context;
647}
648
649static BOOL CRYPT_DownloadObject(DWORD dwRetrievalFlags, HINTERNET hHttp,
652{
653 CRYPT_DATA_BLOB object = { 0, NULL };
654 DWORD bytesAvailable;
655 BOOL ret;
656
657 do {
658 if ((ret = InternetQueryDataAvailable(hHttp, &bytesAvailable, 0, 0)))
659 {
660 if (bytesAvailable)
661 {
662 if (object.pbData)
663 object.pbData = CryptMemRealloc(object.pbData,
664 object.cbData + bytesAvailable);
665 else
666 object.pbData = CryptMemAlloc(bytesAvailable);
667 if (object.pbData)
668 {
669 INTERNET_BUFFERSA buffer = { sizeof(buffer), 0 };
670
671 buffer.dwBufferLength = bytesAvailable;
672 buffer.lpvBuffer = object.pbData + object.cbData;
673 if (!(ret = InternetReadFileExA(hHttp, &buffer, IRF_NO_WAIT,
675 {
677 {
679 context->timeout) == WAIT_TIMEOUT)
681 else if (context->error)
682 SetLastError(context->error);
683 else
684 ret = TRUE;
685 }
686 }
687 if (ret)
688 object.cbData += buffer.dwBufferLength;
689 }
690 else
691 {
693 ret = FALSE;
694 }
695 }
696 }
697 else if (GetLastError() == ERROR_IO_PENDING)
698 {
699 if (WaitForSingleObject(context->event, context->timeout) ==
702 else
703 ret = TRUE;
704 }
705 } while (ret && bytesAvailable);
706 if (ret)
707 {
708 pObject->rgBlob = CryptMemAlloc(sizeof(CRYPT_DATA_BLOB));
709 if (!pObject->rgBlob)
710 {
711 CryptMemFree(object.pbData);
713 ret = FALSE;
714 }
715 else
716 {
717 pObject->rgBlob[0].cbData = object.cbData;
718 pObject->rgBlob[0].pbData = object.pbData;
719 pObject->cBlob = 1;
720 }
721 }
722 TRACE("returning %d\n", ret);
723 return ret;
724}
725
726/* Finds the object specified by pszURL in the cache. If it's not found,
727 * creates a new cache entry for the object and writes the object to it.
728 * Sets the expiration time of the cache entry to expires.
729 */
731 DWORD dwRetrievalFlags, FILETIME expires)
732{
733 WCHAR cacheFileName[MAX_PATH];
734 HANDLE hCacheFile;
735 DWORD size = 0, entryType;
736 FILETIME ft;
737
740 {
742
743 if (!info)
744 {
745 ERR("out of memory\n");
746 return;
747 }
748
749 if (GetUrlCacheEntryInfoW(pszURL, info, &size))
750 {
751 lstrcpyW(cacheFileName, info->lpszLocalFileName);
752 /* Check if the existing cache entry is up to date. If it isn't,
753 * remove the existing cache entry, and create a new one with the
754 * new value.
755 */
757 if (CompareFileTime(&info->ExpireTime, &ft) < 0)
758 {
759 DeleteUrlCacheEntryW(pszURL);
760 }
761 else
762 {
763 info->ExpireTime = expires;
766 return;
767 }
768 }
770 }
771
772 if (!CreateUrlCacheEntryW(pszURL, pObject->rgBlob[0].cbData, NULL, cacheFileName, 0))
773 return;
774
775 hCacheFile = CreateFileW(cacheFileName, GENERIC_WRITE, 0,
777 if(hCacheFile == INVALID_HANDLE_VALUE)
778 return;
779
780 WriteFile(hCacheFile, pObject->rgBlob[0].pbData,
781 pObject->rgBlob[0].cbData, &size, NULL);
782 CloseHandle(hCacheFile);
783
784 if (!(dwRetrievalFlags & CRYPT_STICKY_CACHE_RETRIEVAL))
785 entryType = NORMAL_CACHE_ENTRY;
786 else
787 entryType = STICKY_CACHE_ENTRY;
788 memset(&ft, 0, sizeof(ft));
789 CommitUrlCacheEntryW(pszURL, cacheFileName, expires, ft, entryType,
790 NULL, 0, NULL, NULL);
791}
792
794 DWORD_PTR dwContext, DWORD status, void *statusInfo, DWORD statusInfoLen)
795{
796 struct InetContext *context = (struct InetContext *)dwContext;
798
799 switch (status)
800 {
802 result = statusInfo;
803 context->error = result->dwError;
805 }
806}
807
809 struct InetContext *context, PCRYPT_CREDENTIALS pCredentials,
810 HINTERNET *phInt, HINTERNET *phHost)
811{
812 BOOL ret;
813
814 TRACE("(%s:%d, %p, %p, %p, %p)\n", debugstr_w(components->lpszHostName),
815 components->nPort, context, pCredentials, phInt, phInt);
816
817 *phHost = NULL;
820 if (*phInt)
821 {
822 DWORD service;
823
824 if (context)
826 switch (components->nScheme)
827 {
829 service = INTERNET_SERVICE_FTP;
830 break;
832 service = INTERNET_SERVICE_HTTP;
833 break;
834 default:
835 service = 0;
836 }
837 /* FIXME: use pCredentials for username/password */
838 *phHost = InternetConnectW(*phInt, components->lpszHostName,
839 components->nPort, NULL, NULL, service, 0, (DWORD_PTR)context);
840 if (!*phHost)
841 {
842 InternetCloseHandle(*phInt);
843 *phInt = NULL;
844 ret = FALSE;
845 }
846 else
847 ret = TRUE;
848 }
849 else
850 ret = FALSE;
851 TRACE("returning %d\n", ret);
852 return ret;
853}
854
856 LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout,
858 void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve,
859 PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
860{
861 FIXME("(%s, %s, %08lx, %ld, %p, %p, %p, %p, %p, %p)\n", debugstr_w(pszURL),
862 debugstr_a(pszObjectOid), dwRetrievalFlags, dwTimeout, pObject,
863 ppfnFreeObject, ppvFreeContext, hAsyncRetrieve, pCredentials, pAuxInfo);
864
865 pObject->cBlob = 0;
866 pObject->rgBlob = NULL;
867 *ppfnFreeObject = CRYPT_FreeBlob;
868 *ppvFreeContext = NULL;
869 return FALSE;
870}
871
873 LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout,
875 void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve,
876 PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
877{
878 BOOL ret = FALSE;
879
880 TRACE("(%s, %s, %08lx, %ld, %p, %p, %p, %p, %p, %p)\n", debugstr_w(pszURL),
881 debugstr_a(pszObjectOid), dwRetrievalFlags, dwTimeout, pObject,
882 ppfnFreeObject, ppvFreeContext, hAsyncRetrieve, pCredentials, pAuxInfo);
883
884 pObject->cBlob = 0;
885 pObject->rgBlob = NULL;
886 *ppfnFreeObject = CRYPT_FreeBlob;
887 *ppvFreeContext = NULL;
888
889 if (!(dwRetrievalFlags & CRYPT_WIRE_ONLY_RETRIEVAL))
890 ret = CRYPT_GetObjectFromCache(pszURL, pObject, pAuxInfo);
891 if (!ret && (!(dwRetrievalFlags & CRYPT_CACHE_ONLY_RETRIEVAL) ||
892 (dwRetrievalFlags & CRYPT_WIRE_ONLY_RETRIEVAL)))
893 {
895
896 if ((ret = CRYPT_CrackUrl(pszURL, &components)))
897 {
898 HINTERNET hInt, hHost;
899 struct InetContext *context = NULL;
900
901 if (dwTimeout)
902 context = CRYPT_MakeInetContext(dwTimeout);
903 ret = CRYPT_Connect(&components, context, pCredentials, &hInt,
904 &hHost);
905 if (ret)
906 {
907 static LPCWSTR types[] =
908 {
909 L"application/x-x509-ca-cert", L"application/x-x509-email-cert",
910 L"application/x-x509-server-cert", L"application/x-x509-user-cert",
911 L"application/x-pkcs7-certificates", L"application/pkix-crl",
912 L"application/x-pkcs7-crl", L"application/x-pkcs7-signature",
913 L"application/x-pkcs7-mime", NULL
914 };
915 HINTERNET hHttp = HttpOpenRequestW(hHost, NULL,
916 components.lpszUrlPath, NULL, NULL, types,
919
920 if (hHttp)
921 {
922 if (dwTimeout)
923 {
924 InternetSetOptionW(hHttp,
926 sizeof(dwTimeout));
928 &dwTimeout, sizeof(dwTimeout));
929 }
930 ret = HttpSendRequestExW(hHttp, NULL, NULL, 0,
932 if (!ret && GetLastError() == ERROR_IO_PENDING)
933 {
935 context->timeout) == WAIT_TIMEOUT)
937 else
938 ret = TRUE;
939 }
940 if (ret &&
941 !(ret = HttpEndRequestW(hHttp, NULL, 0, (DWORD_PTR)context)) &&
943 {
945 context->timeout) == WAIT_TIMEOUT)
947 else
948 ret = TRUE;
949 }
950 if (ret)
951 ret = CRYPT_DownloadObject(dwRetrievalFlags, hHttp,
952 context, pObject, pAuxInfo);
953 if (ret && !(dwRetrievalFlags & CRYPT_DONT_CACHE_RESULT))
954 {
955 SYSTEMTIME st;
956 FILETIME ft;
957 DWORD len = sizeof(st);
958
960 &st, &len, NULL) && SystemTimeToFileTime(&st, &ft))
961 CRYPT_CacheURL(pszURL, pObject, dwRetrievalFlags, ft);
962 }
963 InternetCloseHandle(hHttp);
964 }
965 InternetCloseHandle(hHost);
967 }
968 if (context)
969 {
972 }
973 CryptMemFree(components.lpszUrlPath);
974 CryptMemFree(components.lpszHostName);
975 }
976 }
977 TRACE("returning %d\n", ret);
978 return ret;
979}
980
982 LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout,
984 void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve,
985 PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
986{
987 URL_COMPONENTSW components = { sizeof(components), 0 };
988 BOOL ret;
989
990 TRACE("(%s, %s, %08lx, %ld, %p, %p, %p, %p, %p, %p)\n", debugstr_w(pszURL),
991 debugstr_a(pszObjectOid), dwRetrievalFlags, dwTimeout, pObject,
992 ppfnFreeObject, ppvFreeContext, hAsyncRetrieve, pCredentials, pAuxInfo);
993
994 pObject->cBlob = 0;
995 pObject->rgBlob = NULL;
996 *ppfnFreeObject = CRYPT_FreeBlob;
997 *ppvFreeContext = NULL;
998
1000 components.dwUrlPathLength = INTERNET_MAX_PATH_LENGTH;
1001 if (!components.lpszUrlPath)
1002 {
1004 return FALSE;
1005 }
1006
1008 if (ret)
1009 {
1010 LPWSTR path;
1011
1012 /* 3 == lstrlenW(L"c:") + 1 */
1013 path = CryptMemAlloc((components.dwUrlPathLength + 3) * sizeof(WCHAR));
1014 if (path)
1015 {
1016 HANDLE hFile;
1017
1018 /* Try to create the file directly - Wine handles / in pathnames */
1019 lstrcpynW(path, components.lpszUrlPath,
1020 components.dwUrlPathLength + 1);
1023#ifdef __REACTOS__
1024 if ((hFile == INVALID_HANDLE_VALUE) && (lstrlenW(components.lpszUrlPath) > 1) && (components.lpszUrlPath[1] != ':'))
1025#else
1027#endif
1028 {
1029 /* Try again on the current drive */
1030 GetCurrentDirectoryW(components.dwUrlPathLength, path);
1031 if (path[1] == ':')
1032 {
1033 lstrcpynW(path + 2, components.lpszUrlPath,
1034 components.dwUrlPathLength + 1);
1037 }
1039 {
1040 /* Try again on the Windows drive */
1041 GetWindowsDirectoryW(path, components.dwUrlPathLength);
1042 if (path[1] == ':')
1043 {
1044 lstrcpynW(path + 2, components.lpszUrlPath,
1045 components.dwUrlPathLength + 1);
1048 }
1049 }
1050 }
1052 {
1054 {
1055 if (pAuxInfo && pAuxInfo->cbSize >= RTL_SIZEOF_THROUGH_FIELD(CRYPT_RETRIEVE_AUX_INFO, pLastSyncTime)
1056 && pAuxInfo->pLastSyncTime)
1057 {
1059 pAuxInfo->pLastSyncTime);
1060 }
1061 }
1063 }
1064 else
1065 ret = FALSE;
1067 }
1068 else
1069 {
1071 ret = FALSE;
1072 }
1073 }
1074 CryptMemFree(components.lpszUrlPath);
1075 return ret;
1076}
1077
1079 LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout,
1081 void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve,
1082 PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo);
1083
1086{
1087 URL_COMPONENTSW components = { sizeof(components), 0 };
1088 BOOL ret;
1089
1090 TRACE("(%s, %p, %p)\n", debugstr_w(pszURL), pFunc, phFunc);
1091
1092 *pFunc = NULL;
1093 *phFunc = 0;
1094 components.dwSchemeLength = 1;
1095 ret = InternetCrackUrlW(pszURL, 0, 0, &components);
1096 if (ret)
1097 {
1098 /* Microsoft always uses CryptInitOIDFunctionSet/
1099 * CryptGetOIDFunctionAddress, but there doesn't seem to be a pressing
1100 * reason to do so for builtin schemes.
1101 */
1102 switch (components.nScheme)
1103 {
1106 break;
1109 break;
1112 break;
1113 default:
1114 {
1115 int len = WideCharToMultiByte(CP_ACP, 0, components.lpszScheme,
1116 components.dwSchemeLength, NULL, 0, NULL, NULL);
1117
1118 if (len)
1119 {
1121
1122 if (scheme)
1123 {
1124 static HCRYPTOIDFUNCSET set = NULL;
1125
1126 if (!set)
1129 WideCharToMultiByte(CP_ACP, 0, components.lpszScheme,
1130 components.dwSchemeLength, scheme, len, NULL, NULL);
1132 scheme, 0, (void **)pFunc, phFunc);
1134 }
1135 else
1136 {
1138 ret = FALSE;
1139 }
1140 }
1141 else
1142 ret = FALSE;
1143 }
1144 }
1145 }
1146 TRACE("returning %d\n", ret);
1147 return ret;
1148}
1149
1151 DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
1152{
1153 DWORD size, i;
1155 BOOL ret = FALSE;
1156
1157 size = sizeof(CRYPT_BLOB_ARRAY) + pObject->cBlob * sizeof(CRYPT_DATA_BLOB);
1158 for (i = 0; i < pObject->cBlob; i++)
1159 size += pObject->rgBlob[i].cbData;
1161 if (context)
1162 {
1163 LPBYTE nextData;
1164
1165 context->cBlob = 0;
1166 context->rgBlob =
1168 nextData =
1169 (LPBYTE)context->rgBlob + pObject->cBlob * sizeof(CRYPT_DATA_BLOB);
1170 for (i = 0; i < pObject->cBlob; i++)
1171 {
1172 memcpy(nextData, pObject->rgBlob[i].pbData,
1173 pObject->rgBlob[i].cbData);
1174 context->rgBlob[i].pbData = nextData;
1175 context->rgBlob[i].cbData = pObject->rgBlob[i].cbData;
1176 nextData += pObject->rgBlob[i].cbData;
1177 context->cBlob++;
1178 }
1179 *ppvContext = context;
1180 ret = TRUE;
1181 }
1182 return ret;
1183}
1184
1186 const void *pContext, DWORD dwAddDisposition, const void **ppStoreContext);
1187
1189{
1190 BOOL ret;
1191 DWORD len = in->cbData;
1192
1193 while (len && !in->pbData[len - 1]) len--;
1194 if (!CryptStringToBinaryA( (char *)in->pbData, len, CRYPT_STRING_BASE64_ANY,
1195 NULL, &out->cbData, NULL, NULL )) return FALSE;
1196
1197 if (!(out->pbData = CryptMemAlloc( out->cbData ))) return FALSE;
1199 out->pbData, &out->cbData, NULL, NULL );
1200 if (!ret) CryptMemFree( out->pbData );
1201 return ret;
1202}
1203
1205 DWORD dwExpectedContentTypeFlags, AddContextToStore addFunc, void **ppvContext)
1206{
1207 BOOL ret = TRUE;
1209
1210 if (!pObject->cBlob)
1211 {
1213 *ppvContext = NULL;
1214 ret = FALSE;
1215 }
1216 else if (pObject->cBlob == 1)
1217 {
1218 if (decode_base64_blob(&pObject->rgBlob[0], &blob))
1219 {
1221 dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY, 0,
1222 NULL, NULL, NULL, NULL, NULL, (const void **)ppvContext);
1223 CryptMemFree(blob.pbData);
1224 }
1225 else
1226 {
1228 dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY, 0,
1229 NULL, NULL, NULL, NULL, NULL, (const void **)ppvContext);
1230 }
1231 if (!ret)
1232 {
1234 ret = FALSE;
1235 }
1236 }
1237 else
1238 {
1241
1242 if (store)
1243 {
1244 DWORD i;
1245 const void *context;
1246
1247 for (i = 0; i < pObject->cBlob; i++)
1248 {
1249 if (decode_base64_blob(&pObject->rgBlob[i], &blob))
1250 {
1252 dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY,
1253 0, NULL, NULL, NULL, NULL, NULL, &context);
1254 CryptMemFree(blob.pbData);
1255 }
1256 else
1257 {
1259 &pObject->rgBlob[i], dwExpectedContentTypeFlags,
1261 NULL, &context);
1262 }
1263 if (ret)
1264 {
1265 if (!addFunc(store, context, CERT_STORE_ADD_ALWAYS, NULL))
1266 ret = FALSE;
1267 }
1268 else
1269 {
1271 ret = FALSE;
1272 }
1273 }
1274 }
1275 else
1276 ret = FALSE;
1277 *ppvContext = store;
1278 }
1279 return ret;
1280}
1281
1283 DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
1284{
1287}
1288
1289static BOOL WINAPI CRYPT_CreateCRL(LPCSTR pszObjectOid,
1290 DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
1291{
1294}
1295
1296static BOOL WINAPI CRYPT_CreateCTL(LPCSTR pszObjectOid,
1297 DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
1298{
1301}
1302
1304 DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
1305{
1306 BOOL ret;
1307
1308 if (!pObject->cBlob)
1309 {
1311 *ppvContext = NULL;
1312 ret = FALSE;
1313 }
1314 else if (pObject->cBlob == 1)
1318 0, NULL, NULL, NULL, ppvContext, NULL, NULL);
1319 else
1320 {
1321 FIXME("multiple messages unimplemented\n");
1322 ret = FALSE;
1323 }
1324 return ret;
1325}
1326
1327static BOOL WINAPI CRYPT_CreateAny(LPCSTR pszObjectOid,
1328 DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
1329{
1330 BOOL ret;
1331
1332 if (!pObject->cBlob)
1333 {
1335 *ppvContext = NULL;
1336 ret = FALSE;
1337 }
1338 else
1339 {
1342
1343 if (store)
1344 {
1347
1348 if (memStore)
1349 {
1350 CertAddStoreToCollection(store, memStore,
1352 CertCloseStore(memStore, 0);
1353 }
1354 else
1355 {
1356 CertCloseStore(store, 0);
1357 store = NULL;
1358 }
1359 }
1360 if (store)
1361 {
1362 DWORD i;
1363
1364 ret = TRUE;
1365 for (i = 0; i < pObject->cBlob; i++)
1366 {
1367 DWORD contentType, expectedContentTypes =
1373 HCERTSTORE contextStore;
1374 const void *context;
1375
1377 &pObject->rgBlob[i], expectedContentTypes,
1378 CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL, &contentType, NULL,
1379 &contextStore, NULL, &context))
1380 {
1381 switch (contentType)
1382 {
1386 ret = FALSE;
1388 break;
1390 if (!CertAddCRLContextToStore(store,
1392 ret = FALSE;
1394 break;
1396 if (!CertAddCTLContextToStore(store,
1398 ret = FALSE;
1400 break;
1401 default:
1402 CertAddStoreToCollection(store, contextStore, 0, 0);
1403 }
1404 CertCloseStore(contextStore, 0);
1405 }
1406 else
1407 ret = FALSE;
1408 }
1409 }
1410 else
1411 ret = FALSE;
1412 *ppvContext = store;
1413 }
1414 return ret;
1415}
1416
1418 DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext);
1419
1422{
1423 BOOL ret = TRUE;
1424
1425 TRACE("(%s, %p, %p)\n", debugstr_a(pszObjectOid), pFunc, phFunc);
1426
1427 *pFunc = NULL;
1428 *phFunc = 0;
1429 if (IS_INTOID(pszObjectOid))
1430 {
1431 switch (LOWORD(pszObjectOid))
1432 {
1433 case 0:
1434 *pFunc = CRYPT_CreateBlob;
1435 break;
1437 *pFunc = CRYPT_CreateCert;
1438 break;
1439 case LOWORD(CONTEXT_OID_CRL):
1440 *pFunc = CRYPT_CreateCRL;
1441 break;
1442 case LOWORD(CONTEXT_OID_CTL):
1443 *pFunc = CRYPT_CreateCTL;
1444 break;
1446 *pFunc = CRYPT_CreatePKCS7;
1447 break;
1449 *pFunc = CRYPT_CreateAny;
1450 break;
1451 }
1452 }
1453 if (!*pFunc)
1454 {
1455 static HCRYPTOIDFUNCSET set = NULL;
1456
1457 if (!set)
1461 0, (void **)pFunc, phFunc);
1462 }
1463 TRACE("returning %d\n", ret);
1464 return ret;
1465}
1466
1467static BOOL CRYPT_GetExpiration(const void *object, const char *pszObjectOid, FILETIME *expiration)
1468{
1469 if (!IS_INTOID(pszObjectOid))
1470 return FALSE;
1471
1472 switch (LOWORD(pszObjectOid)) {
1474 *expiration = ((const CERT_CONTEXT*)object)->pCertInfo->NotAfter;
1475 return TRUE;
1476 case LOWORD(CONTEXT_OID_CRL):
1477 *expiration = ((const CRL_CONTEXT*)object)->pCrlInfo->NextUpdate;
1478 return TRUE;
1479 case LOWORD(CONTEXT_OID_CTL):
1480 *expiration = ((const CTL_CONTEXT*)object)->pCtlInfo->NextUpdate;
1481 return TRUE;
1482 }
1483
1484 return FALSE;
1485}
1486
1487/***********************************************************************
1488 * CryptRetrieveObjectByUrlW (CRYPTNET.@)
1489 */
1491 DWORD dwRetrievalFlags, DWORD dwTimeout, LPVOID *ppvObject,
1492 HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, LPVOID pvVerify,
1493 PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
1494{
1495 BOOL ret;
1498 HCRYPTOIDFUNCADDR hRetrieve = 0, hCreate = 0;
1499
1500 TRACE("(%s, %s, %08lx, %ld, %p, %p, %p, %p, %p)\n", debugstr_w(pszURL),
1501 debugstr_a(pszObjectOid), dwRetrievalFlags, dwTimeout, ppvObject,
1502 hAsyncRetrieve, pCredentials, pvVerify, pAuxInfo);
1503
1504 if (!pszURL)
1505 {
1507 return FALSE;
1508 }
1509 ret = CRYPT_GetRetrieveFunction(pszURL, &retrieve, &hRetrieve);
1510 if (ret)
1511 ret = CRYPT_GetCreateFunction(pszObjectOid, &create, &hCreate);
1512 if (ret)
1513 {
1514 CRYPT_BLOB_ARRAY object = { 0, NULL };
1516 void *freeContext;
1517 FILETIME expires;
1518
1519 ret = retrieve(pszURL, pszObjectOid, dwRetrievalFlags, dwTimeout,
1520 &object, &freeObject, &freeContext, hAsyncRetrieve, pCredentials,
1521 pAuxInfo);
1522 if (ret)
1523 {
1524 ret = create(pszObjectOid, dwRetrievalFlags, &object, ppvObject);
1525 if (ret && !(dwRetrievalFlags & CRYPT_DONT_CACHE_RESULT) &&
1526 CRYPT_GetExpiration(*ppvObject, pszObjectOid, &expires))
1527 {
1528 CRYPT_CacheURL(pszURL, &object, dwRetrievalFlags, expires);
1529 }
1530 freeObject(pszObjectOid, &object, freeContext);
1531 }
1532 }
1533 if (hCreate)
1534 CryptFreeOIDFunctionAddress(hCreate, 0);
1535 if (hRetrieve)
1536 CryptFreeOIDFunctionAddress(hRetrieve, 0);
1537 TRACE("returning %d\n", ret);
1538 return ret;
1539}
1540
1541/* Store successful revocation checks (whether the certificate was revoked or
1542 * not) in an on-disk cache. This is not because of network latency—we already
1543 * have a cache for that—but rather because parsing very large CRLs can take a
1544 * long time (at the time of writing, 20 MB CRLs have been seen in the wild and
1545 * can take several hundred milliseconds) and applications expect chain building
1546 * to be much faster.
1547 *
1548 * The cache is treated as invalid once we pass the nextUpdate field of the CRL.
1549 * This isn't quite what the field is meant for (it's rather meant to specify a
1550 * later bound for the next time the CRL will be reissued, and doesn't prescribe
1551 * a date by which the CRL is invalid; see RFC 5280 § 5.1.2.5) but it's the way
1552 * it's used in practice.
1553 *
1554 * The location of the cache roughly matches Windows, but the file name and
1555 * contents do not.
1556 */
1557
1558static const char revocation_cache_signature[] = "Wine cached revocation";
1559
1560#define CACHED_CERT_HASH_SIZE 20
1561
1563 const WCHAR *mode, int sharing)
1564{
1567 WCHAR *appdata_path;
1568 DWORD len, i, size;
1569 HCRYPTPROV prov;
1571 HRESULT hr;
1572
1573 if (FAILED(hr = SHGetKnownFolderPath(&FOLDERID_LocalAppDataLow, 0, NULL, &appdata_path)))
1574 {
1575 ERR("Failed to get LocalAppDataLow path, hr %#lx.\n", hr);
1576 return INVALID_HANDLE_VALUE;
1577 }
1578
1579 len = swprintf(path, ARRAY_SIZE(path), L"%s\\Microsoft\\CryptnetUrlCache\\Content\\", appdata_path);
1580 CoTaskMemFree(appdata_path);
1581
1582 if (len + CACHED_CERT_HASH_SIZE * 2 * sizeof(WCHAR) > ARRAY_SIZE(path) - 1)
1583 {
1584 WARN("Hash length exceeds static buffer; not caching.\n");
1585 return INVALID_HANDLE_VALUE;
1586 }
1587
1589 CryptCreateHash(prov, CALG_SHA1, 0, 0, &hash);
1590 CryptHashData(hash, cert->pbCertEncoded, cert->cbCertEncoded, 0);
1591 if (params && params->pIssuerCert)
1592 {
1593 CryptHashData(hash, (BYTE *)&params->pIssuerCert->cbCertEncoded, sizeof(params->pIssuerCert->cbCertEncoded), 0);
1594 CryptHashData(hash, params->pIssuerCert->pbCertEncoded, params->pIssuerCert->cbCertEncoded, 0);
1595 }
1596 else
1597 {
1598 size = 0;
1599 CryptHashData(hash, (BYTE *)&size, sizeof(size), 0);
1600 }
1601 size = sizeof(hash_data);
1604 CryptReleaseContext(prov, 0);
1605
1607
1608 for (i = 0; i < CACHED_CERT_HASH_SIZE; ++i)
1609 {
1610 swprintf(path + len, 3, L"%02x", hash_data[i]);
1611 len += 2;
1612 }
1613
1614 return _wfsopen(path, mode, sharing);
1615}
1616
1619{
1620 char buffer[sizeof(revocation_cache_signature)];
1621 FILETIME update_time;
1622 FILE *file;
1623 int len;
1624
1626 return FALSE;
1627
1628 if ((len = fread(buffer, 1, sizeof(buffer), file)) != sizeof(buffer)
1630 {
1631 ERR("Invalid cache signature.\n");
1632 fclose(file);
1633 return FALSE;
1634 }
1635
1636 if (fread(&update_time, sizeof(update_time), 1, file) != 1)
1637 {
1638 ERR("Failed to read update time.\n");
1639 fclose(file);
1640 return FALSE;
1641 }
1642
1643 if (CompareFileTime(time, &update_time) > 0)
1644 {
1645 TRACE("Cached revocation status is potentially out of date.\n");
1646 fclose(file);
1647 return FALSE;
1648 }
1649
1650 if (fread(&status->dwError, sizeof(status->dwError), 1, file) != 1)
1651 {
1652 ERR("Failed to read error code.\n");
1653 fclose(file);
1654 return FALSE;
1655 }
1656
1657 if (status->dwError == CERT_E_REVOKED && fread(&status->dwReason, sizeof(status->dwReason), 1, file) != 1)
1658 {
1659 ERR("Failed to read revocation reason.\n");
1660 fclose(file);
1661 return FALSE;
1662 }
1663
1664 TRACE("Using cached status %#lx, reason %#lx.\n", status->dwError, status->dwReason);
1665 return TRUE;
1666}
1667
1670{
1671 FILE *file;
1672
1674 return;
1676 fwrite(time, sizeof(*time), 1, file);
1677 fwrite(&status->dwError, sizeof(status->dwError), 1, file);
1678 if (status->dwError == CERT_E_REVOKED)
1679 fwrite(&status->dwReason, sizeof(status->dwReason), 1, file);
1680 fclose(file);
1681}
1682
1684 const CRL_CONTEXT *crl, FILETIME *pTime, CERT_REVOCATION_STATUS *pRevStatus)
1685{
1687
1689 if (entry)
1690 return CRYPT_E_REVOKED;
1691
1692 /* Since the CRL was retrieved for the cert being checked, then it's
1693 * guaranteed to be fresh, and the cert is not revoked. */
1694 return ERROR_SUCCESS;
1695}
1696
1697/* Try to retrieve a CRL from any one of the specified distribution points. */
1699 DWORD verify_flags, DWORD timeout)
1700{
1701 DWORD retrieve_flags = 0;
1702 const CRL_CONTEXT *crl;
1703 DWORD i;
1704
1705 if (verify_flags & CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION)
1706 retrieve_flags |= CRYPT_CACHE_ONLY_RETRIEVAL;
1707
1708 /* Yes, this is a weird algorithm, but the documentation for
1709 * CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT specifies this, and
1710 * tests seem to bear it out for CertVerifyRevocation() as well. */
1712 timeout /= 2;
1713
1714 for (i = 0; i < array->cUrl; ++i)
1715 {
1716 if (CryptRetrieveObjectByUrlW(array->rgwszUrl[i], CONTEXT_OID_CRL, retrieve_flags,
1717 timeout, (void **)&crl, NULL, NULL, NULL, NULL))
1718 return crl;
1719
1720 /* We don't check the current time here. This may result in less
1721 * accurate timeouts, but this too seems to be true of Windows. */
1723 timeout /= 2;
1724 }
1725
1726 return NULL;
1727}
1728
1731 FILETIME *next_update)
1732{
1733 DWORD url_array_size, error;
1734 CRYPT_URL_ARRAY *url_array;
1735 const CRL_CONTEXT *crl;
1736 DWORD timeout = 0;
1737
1738 if (!params || !params->pIssuerCert)
1739 {
1740 TRACE("no issuer certificate\n");
1742 }
1743
1744 if (!CRYPT_GetUrlFromCRLDistPointsExt(value, NULL, &url_array_size, NULL, NULL))
1745 return GetLastError();
1746
1747 if (!(url_array = CryptMemAlloc(url_array_size)))
1748 return ERROR_OUTOFMEMORY;
1749
1750 if (!CRYPT_GetUrlFromCRLDistPointsExt(value, url_array, &url_array_size, NULL, NULL))
1751 {
1752 CryptMemFree(url_array);
1753 return GetLastError();
1754 }
1755
1756 if (params && params->cbSize >= RTL_SIZEOF_THROUGH_FIELD(CERT_REVOCATION_PARA, dwUrlRetrievalTimeout))
1757 timeout = params->dwUrlRetrievalTimeout;
1758
1759 if (!(crl = retrieve_crl_from_dist_points(url_array, flags, timeout)))
1760 {
1761 CryptMemFree(url_array);
1763 }
1764
1766
1767 *next_update = crl->pCrlInfo->NextUpdate;
1768
1770 CryptMemFree(url_array);
1771 return error;
1772}
1773
1774static void sha1_hash(const BYTE *data, DWORD datalen, BYTE *buf, DWORD *buflen)
1775{
1776 HCRYPTPROV prov;
1778
1780 CryptCreateHash(prov, CALG_SHA1, 0, 0, &hash);
1782 CryptGetHashParam(hash, HP_HASHVAL, buf, buflen, 0);
1783
1785 CryptReleaseContext(prov, 0);
1786}
1787
1789{
1792 OCSP_SIGNED_REQUEST_INFO request_signed;
1793 CERT_INFO *issuer = issuer_cert->pCertInfo;
1794 BYTE issuer_name_hash[20], issuer_key_hash[20], *buf, *ret;
1795 DWORD size = 0, hash_len = sizeof(issuer_name_hash);
1796
1797 memset(&entry, 0, sizeof(entry));
1798 entry.CertId.HashAlgorithm.pszObjId = (char *)szOID_OIWSEC_sha1;
1799
1800 sha1_hash(issuer->Subject.pbData, issuer->Subject.cbData, issuer_name_hash, &hash_len);
1801 entry.CertId.IssuerNameHash.cbData = sizeof(issuer_name_hash);
1802 entry.CertId.IssuerNameHash.pbData = issuer_name_hash;
1803
1804 sha1_hash(issuer->SubjectPublicKeyInfo.PublicKey.pbData, issuer->SubjectPublicKeyInfo.PublicKey.cbData,
1805 issuer_key_hash, &hash_len);
1806 entry.CertId.IssuerKeyHash.cbData = sizeof(issuer_key_hash);
1807 entry.CertId.IssuerKeyHash.pbData = issuer_key_hash;
1808
1809 entry.CertId.SerialNumber.cbData = cert->pCertInfo->SerialNumber.cbData;
1810 entry.CertId.SerialNumber.pbData = cert->pCertInfo->SerialNumber.pbData;
1811
1812 request.dwVersion = OCSP_REQUEST_V1;
1813 request.pRequestorName = NULL;
1814 request.cRequestEntry = 1;
1815 request.rgRequestEntry = &entry;
1816 request.cExtension = 0;
1817 request.rgExtension = NULL;
1819 {
1820 ERR("failed to encode request %#lx\n", GetLastError());
1821 return NULL;
1822 }
1823
1824 request_signed.ToBeSigned.pbData = buf;
1825 request_signed.ToBeSigned.cbData = size;
1826 request_signed.pOptionalSignatureInfo = NULL;
1828 &ret, &size))
1829 {
1830 ERR("failed to encode signed request %#lx\n", GetLastError());
1831 LocalFree(buf);
1832 return NULL;
1833 }
1834
1835 LocalFree(buf);
1836 *ret_size = size;
1837 return ret;
1838}
1839
1840static void escape_path(const WCHAR *src, DWORD src_len, WCHAR *dst, DWORD *dst_len)
1841{
1842 static const WCHAR hex[] = L"0123456789ABCDEF";
1843 WCHAR *ptr = dst;
1844 DWORD i;
1845
1846 *dst_len = src_len;
1847 for (i = 0; i < src_len; i++)
1848 {
1849 if (src[i] == '+' || src[i] == '/' || src[i] == '=')
1850 {
1851 if (dst)
1852 {
1853 ptr[0] = '%';
1854 ptr[1] = hex[(src[i] >> 4) & 0xf];
1855 ptr[2] = hex[src[i] & 0xf];
1856 ptr += 3;
1857 }
1858 *dst_len += 2;
1859 }
1860 else if (dst) *ptr++ = src[i];
1861 }
1862}
1863
1864static WCHAR *build_request_path(const BYTE *data, DWORD data_size)
1865{
1866 WCHAR *path, *ret;
1868
1870 if (!(path = malloc(path_len * sizeof(WCHAR)))) return NULL;
1872
1874 if (!(ret = malloc((ret_len + 2) * sizeof(WCHAR))))
1875 {
1876 free(path);
1877 return NULL;
1878 }
1880 ret[ret_len + 1] = 0;
1881 ret[0] = '/';
1882
1883 free(path);
1884 return ret;
1885}
1886
1887static WCHAR *build_request_url(const WCHAR *base_url, const BYTE *data, DWORD data_size)
1888{
1889 WCHAR *path, *ret;
1890 DWORD len = 0;
1891
1892 if (!(path = build_request_path(data, data_size))) return NULL;
1893 len = (wcslen(base_url) + wcslen(path) + 1) * sizeof(WCHAR);
1894 if (!(ret = malloc(len * sizeof(WCHAR))))
1895 {
1896 free(path);
1897 return NULL;
1898 }
1900 wcscat(ret, path);
1901 free(path);
1902 TRACE("-> %s.\n", debugstr_w(ret));
1903 return ret;
1904}
1905
1907{
1908 switch (status)
1909 {
1913 default:
1914 FIXME("unhandled status %lu\n", status);
1916 }
1917}
1918
1920{
1921 BYTE hash[20];
1922 DWORD hash_len = sizeof(hash);
1923
1924 if (!id->HashAlgorithm.pszObjId || strcmp(id->HashAlgorithm.pszObjId, szOID_OIWSEC_sha1))
1925 {
1926 FIXME("hash algorithm %s not supported\n", debugstr_a(id->HashAlgorithm.pszObjId));
1927 return FALSE;
1928 }
1929
1930 sha1_hash(issuer->Subject.pbData, issuer->Subject.cbData, hash, &hash_len);
1931 if (id->IssuerNameHash.cbData != hash_len) return FALSE;
1932 if (memcmp(id->IssuerNameHash.pbData, hash, hash_len)) return FALSE;
1933
1934 sha1_hash(issuer->SubjectPublicKeyInfo.PublicKey.pbData,
1935 issuer->SubjectPublicKeyInfo.PublicKey.cbData, hash, &hash_len);
1936 if (id->IssuerKeyHash.cbData != hash_len) return FALSE;
1937 if (memcmp(id->IssuerKeyHash.pbData, hash, hash_len)) return FALSE;
1938
1939 if (cert->SerialNumber.cbData != id->SerialNumber.cbData) return FALSE;
1940 return !memcmp(cert->SerialNumber.pbData, id->SerialNumber.pbData, id->SerialNumber.cbData);
1941}
1942
1944 const CRYPT_OBJID_BLOB *blob, DWORD *status, FILETIME *next_update)
1945{
1947 DWORD size, i;
1948
1949 memset(next_update, 0, sizeof(*next_update));
1952
1953 FIXME("check responder id\n");
1954 for (i = 0; i < info->cResponseEntry; i++)
1955 {
1956 OCSP_BASIC_RESPONSE_ENTRY *entry = &info->rgResponseEntry[i];
1957 if (match_cert_id(&entry->CertId, cert, issuer))
1958 {
1959 *status = map_ocsp_status(entry->dwCertStatus);
1960 *next_update = entry->NextUpdate;
1961 }
1962 }
1963
1964 LocalFree(info);
1965 return ERROR_SUCCESS;
1966}
1967
1969 const CRYPT_OBJID_BLOB *blob, FILETIME *next_update)
1970{
1974 CRYPT_BIT_BLOB *sig;
1975 HCRYPTPROV prov = 0;
1976 HCRYPTHASH hash = 0;
1977 HCRYPTKEY key = 0;
1978 DWORD algid;
1979
1982
1983 if ((error = check_ocsp_response_info(cert, issuer, &info->ToBeSigned, &status, next_update))) goto done;
1984
1985 alg = &info->SignatureInfo.SignatureAlgorithm;
1986 if (!alg->pszObjId || !(algid = CertOIDToAlgId(alg->pszObjId)))
1987 {
1988 FIXME("unhandled signature algorithm %s\n", debugstr_a(alg->pszObjId));
1990 goto done;
1991 }
1992
1994 if (!CryptCreateHash(prov, algid, 0, 0, &hash)) goto done;
1995 if (!CryptHashData(hash, info->ToBeSigned.pbData, info->ToBeSigned.cbData, 0)) goto done;
1996
1997 sig = &info->SignatureInfo.Signature;
1998 if (!CryptImportPublicKeyInfoEx(prov, X509_ASN_ENCODING, (CERT_PUBLIC_KEY_INFO *)&issuer->SubjectPublicKeyInfo,
1999 0, 0, NULL, &key))
2000 {
2001 error = GetLastError();
2002 TRACE("failed to import public key %#lx\n", error);
2003 }
2004 else if (!CryptVerifySignatureW(hash, sig->pbData, sig->cbData, key, NULL, 0))
2005 {
2006 error = GetLastError();
2007 TRACE("failed to verify signature %#lx\n", error);
2008 }
2009 else error = ERROR_SUCCESS;
2010
2011done:
2014 CryptReleaseContext(prov, 0);
2015 LocalFree(info);
2016 if (error) return error;
2017 return status;
2018}
2019
2020static DWORD handle_ocsp_response(const CERT_INFO *cert, const CERT_INFO *issuer, const BYTE *encoded,
2021 DWORD encoded_size, FILETIME *next_update)
2022{
2025
2027 &info, &size)) return GetLastError();
2028
2029 switch (info->dwStatus)
2030 {
2032 if (!info->pszObjId || strcmp(info->pszObjId, szOID_PKIX_OCSP_BASIC_SIGNED_RESPONSE))
2033 {
2034 FIXME("unhandled response type %s\n", debugstr_a(info->pszObjId));
2035 break;
2036 }
2037 error = verify_signed_ocsp_response_info(cert, issuer, &info->Value, next_update);
2038 break;
2039
2040 default:
2041 FIXME("unhandled status %lu\n", info->dwStatus);
2042 break;
2043 }
2044
2045 LocalFree(info);
2046 return error;
2047}
2048
2050 const CERT_REVOCATION_PARA *revpara, FILETIME *next_update)
2051{
2052 HINTERNET ses, con, req = NULL;
2053 BYTE *request_data = NULL, *response_data = NULL;
2054 DWORD size, flags, status, request_len, response_len, count, ret = CRYPT_E_REVOCATION_OFFLINE;
2055 URL_COMPONENTSW comp;
2056 WCHAR *url;
2057
2058 if (!revpara || !revpara->pIssuerCert)
2059 {
2060 TRACE("no issuer certificate\n");
2062 }
2063 if (!(request_data = build_ocsp_request(cert, revpara->pIssuerCert, &request_len)))
2065
2066 url = build_request_url(base_url, request_data, request_len);
2067 LocalFree(request_data);
2068 if (!url) return CRYPT_E_REVOCATION_OFFLINE;
2069
2070 memset(&comp, 0, sizeof(comp));
2071 comp.dwStructSize = sizeof(comp);
2072 comp.dwHostNameLength = ~0u;
2073 comp.dwUrlPathLength = ~0u;
2074 if (!InternetCrackUrlW(url, 0, 0, &comp))
2075 {
2076 free(url);
2078 }
2079
2080 switch (comp.nScheme)
2081 {
2083 flags = 0;
2084 break;
2087 break;
2088 default:
2089 FIXME("scheme %u not supported\n", comp.nScheme);
2090 free(url);
2091 return ERROR_NOT_SUPPORTED;
2092 }
2093
2094 if (!(ses = InternetOpenW(L"CryptoAPI", 0, NULL, NULL, 0))) return GetLastError();
2095 comp.lpszHostName[comp.dwHostNameLength] = 0;
2096 if (!(con = InternetConnectW(ses, comp.lpszHostName, comp.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0)))
2097 {
2098 free(url);
2100 return GetLastError();
2101 }
2102 comp.lpszHostName[comp.dwHostNameLength] = '/';
2103 if (!(req = HttpOpenRequestW(con, NULL, comp.lpszUrlPath, NULL, NULL, NULL, flags, 0)) ||
2104 !HttpSendRequestW(req, NULL, 0, NULL, 0)) goto done;
2105
2106 size = sizeof(status);
2108 if (status != HTTP_STATUS_OK)
2109 {
2110 WARN("request status %lu\n", status);
2111 goto done;
2112 }
2113
2114 size = sizeof(response_len);
2115 if (!HttpQueryInfoW(req, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_CONTENT_LENGTH, &response_len, &size, 0) ||
2116 !response_len || !(response_data = malloc(response_len)) ||
2117 !InternetReadFile(req, response_data, response_len, &count) || count != response_len) goto done;
2118
2119 ret = handle_ocsp_response(cert->pCertInfo, revpara->pIssuerCert->pCertInfo, response_data, response_len,
2120 next_update);
2121
2122done:
2123 free(url);
2124 free(response_data);
2128 return ret;
2129}
2130
2132 FILETIME *pTime, DWORD dwFlags, CERT_REVOCATION_PARA *pRevPara, CERT_REVOCATION_STATUS *pRevStatus,
2133 FILETIME *next_update)
2134{
2135 BOOL ret;
2138
2141 if (!ret) return GetLastError();
2142
2143 for (i = 0; i < aia->cAccDescr; i++)
2144 {
2145 if (!strcmp(aia->rgAccDescr[i].pszAccessMethod, szOID_PKIX_OCSP))
2146 {
2147 if (aia->rgAccDescr[i].AccessLocation.dwAltNameChoice == CERT_ALT_NAME_URL)
2148 {
2149 const WCHAR *url = aia->rgAccDescr[i].AccessLocation.pwszURL;
2150 TRACE("OCSP URL = %s\n", debugstr_w(url));
2151 error = verify_cert_revocation_with_ocsp(cert, url, pRevPara, next_update);
2152 }
2153 else
2154 {
2155 FIXME("unsupported AccessLocation type %lu\n", aia->rgAccDescr[i].AccessLocation.dwAltNameChoice);
2157 }
2158 break;
2159 }
2160 }
2161
2162 LocalFree(aia);
2163 return error;
2164}
2165
2167 const CRL_CONTEXT *crl, FILETIME *pTime, CERT_REVOCATION_STATUS *pRevStatus)
2168{
2170 LONG valid;
2171
2172 valid = CompareFileTime(pTime, &crl->pCrlInfo->ThisUpdate);
2173 if (valid <= 0)
2174 {
2175 /* If this CRL is not older than the time being verified, there's no
2176 * way to know whether the certificate was revoked.
2177 */
2178 TRACE("CRL not old enough\n");
2180 }
2181
2183 if (entry)
2184 return CRYPT_E_REVOKED;
2185
2186 /* Since the CRL was not retrieved for the cert being checked, there's no
2187 * guarantee it's fresh, so the cert *might* be okay, but it's safer not to
2188 * guess. */
2189 TRACE("certificate not found\n");
2191}
2192
2195{
2197 FILETIME next_update = {0};
2199
2200 if (find_cached_revocation_status(cert, pRevPara, pTime, pRevStatus))
2201 {
2202 if (pRevStatus->dwError == ERROR_SUCCESS || pRevStatus->dwError == CRYPT_E_REVOKED)
2203 {
2204 TRACE("Returning cached status.\n");
2205 return pRevStatus->dwError;
2206 }
2207 }
2208
2209 if ((ext = CertFindExtension(szOID_AUTHORITY_INFO_ACCESS, cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
2210 {
2211 error = verify_cert_revocation_from_aia_ext(&ext->Value, cert, pTime, dwFlags, pRevPara, pRevStatus,
2212 &next_update);
2213 TRACE("verify_cert_revocation_from_aia_ext() returned %08lx\n", error);
2214 if (error == ERROR_SUCCESS || error == CRYPT_E_REVOKED) goto done;
2215 }
2216 if ((ext = CertFindExtension(szOID_CRL_DIST_POINTS, cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
2217 {
2218 error = verify_cert_revocation_from_dist_points_ext(&ext->Value, cert, pTime, dwFlags, pRevPara, pRevStatus,
2219 &next_update);
2220 TRACE("verify_cert_revocation_from_dist_points_ext() returned %08lx\n", error);
2221 if (error == ERROR_SUCCESS || error == CRYPT_E_REVOKED) goto done;
2222 }
2223 if (!ext)
2224 {
2225 if (pRevPara && pRevPara->hCrlStore && pRevPara->pIssuerCert)
2226 {
2228 BOOL canSignCRLs;
2229
2230 /* If the caller told us about the issuer, make sure the issuer
2231 * can sign CRLs before looking for one.
2232 */
2234 pRevPara->pIssuerCert->pCertInfo->cExtension,
2235 pRevPara->pIssuerCert->pCertInfo->rgExtension)))
2236 {
2238 DWORD size = sizeof(usage);
2239
2240 if (!CryptDecodeObjectEx(cert->dwCertEncodingType, X509_BITS,
2241 ext->Value.pbData, ext->Value.cbData,
2243 canSignCRLs = FALSE;
2244 else if (usage.cbData > 2)
2245 {
2246 /* The key usage extension only defines 9 bits => no more
2247 * than 2 bytes are needed to encode all known usages.
2248 */
2249 canSignCRLs = FALSE;
2250 }
2251 else
2252 {
2253 BYTE usageBits = usage.pbData[usage.cbData - 1];
2254
2255 canSignCRLs = usageBits & CERT_CRL_SIGN_KEY_USAGE;
2256 }
2257 }
2258 else
2259 canSignCRLs = TRUE;
2260 if (canSignCRLs)
2261 {
2262 /* If the caller was helpful enough to tell us where to find a
2263 * CRL for the cert, look for one and check it.
2264 */
2265 crl = CertFindCRLInStore(pRevPara->hCrlStore,
2266 cert->dwCertEncodingType,
2269 CRL_FIND_ISSUED_BY, pRevPara->pIssuerCert, NULL);
2270 }
2271 if (crl)
2272 {
2275 }
2276 else
2277 {
2278 TRACE("no CRL found\n");
2280 }
2281 }
2282 else
2283 {
2284 if (!pRevPara)
2285 WARN("no CERT_REVOCATION_PARA\n");
2286 else if (!pRevPara->hCrlStore)
2287 WARN("no dist points/aia extension and no CRL store\n");
2288 else if (!pRevPara->pIssuerCert)
2289 WARN("no dist points/aia extension and no issuer\n");
2291 }
2292 }
2293done:
2294 if ((next_update.dwLowDateTime || next_update.dwHighDateTime)
2296 {
2297 CERT_REVOCATION_STATUS rev_status;
2298
2299 memset(&rev_status, 0, sizeof(rev_status));
2300 rev_status.cbSize = sizeof(rev_status);
2301 rev_status.dwError = error;
2302 cache_revocation_status(cert, pRevPara, &next_update, &rev_status);
2303 }
2304 return error;
2305}
2306
2315
2316typedef struct _OLD_CERT_REVOCATION_STATUS {
2317 DWORD cbSize;
2318 DWORD dwIndex;
2319 DWORD dwError;
2322
2323/***********************************************************************
2324 * CertDllVerifyRevocation (CRYPTNET.@)
2325 */
2327 DWORD cContext, PVOID rgpvContext[], DWORD dwFlags,
2329{
2330 DWORD error = 0, i;
2331 FILETIME now;
2332 LPFILETIME pTime = NULL;
2333
2334 TRACE("(%08lx, %ld, %ld, %p, %08lx, %p, %p)\n", dwEncodingType, dwRevType,
2335 cContext, rgpvContext, dwFlags, pRevPara, pRevStatus);
2336
2337 if (pRevStatus->cbSize != sizeof(OLD_CERT_REVOCATION_STATUS) &&
2338 pRevStatus->cbSize != sizeof(CERT_REVOCATION_STATUS))
2339 {
2341 return FALSE;
2342 }
2343 if (!cContext)
2344 {
2346 return FALSE;
2347 }
2348 if (pRevPara && pRevPara->cbSize >=
2350 pTime = pRevPara->pftTimeToUse;
2351 if (!pTime)
2352 {
2354 pTime = &now;
2355 }
2356 memset(&pRevStatus->dwIndex, 0, pRevStatus->cbSize - sizeof(DWORD));
2357 if (dwRevType != CERT_CONTEXT_REVOCATION_TYPE)
2359 else
2360 {
2361 for (i = 0; i < cContext; i++)
2362 {
2363 if ((error = verify_cert_revocation(rgpvContext[i], pTime, dwFlags, pRevPara, pRevStatus)))
2364 {
2365 pRevStatus->dwIndex = i;
2366 break;
2367 }
2368 }
2369 }
2370 if (error)
2371 {
2373 pRevStatus->dwError = error;
2374 }
2375 TRACE("returning %d (%08lx)\n", !error, error);
2376 return !error;
2377}
ios_base &_STLP_CALL hex(ios_base &__s)
Definition: _ios_base.h:324
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
Definition: _set.h:50
BOOL WINAPI CertAddStoreToCollection(HCERTSTORE hCollectionStore, HCERTSTORE hSiblingStore, DWORD dwUpdateFlags, DWORD dwPriority)
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
static DWORD verify_cert_revocation_with_crl_offline(PCCERT_CONTEXT cert, const CRL_CONTEXT *crl, FILETIME *pTime, CERT_REVOCATION_STATUS *pRevStatus)
static BOOL find_cached_revocation_status(const CERT_CONTEXT *cert, const CERT_REVOCATION_PARA *params, const FILETIME *time, CERT_REVOCATION_STATUS *status)
static void cache_revocation_status(const CERT_CONTEXT *cert, const CERT_REVOCATION_PARA *params, const FILETIME *time, const CERT_REVOCATION_STATUS *status)
static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid, LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
static DWORD handle_ocsp_response(const CERT_INFO *cert, const CERT_INFO *issuer, const BYTE *encoded, DWORD encoded_size, FILETIME *next_update)
static BOOL WINAPI CRYPT_CreateCert(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
HRESULT WINAPI DllRegisterServer(void)
Definition: cryptnet_main.c:65
static BOOL decode_base64_blob(const CRYPT_DATA_BLOB *in, CRYPT_DATA_BLOB *out)
static BOOL CRYPT_GetRetrieveFunction(LPCWSTR pszURL, SchemeDllRetrieveEncodedObjectW *pFunc, HCRYPTOIDFUNCADDR *phFunc)
static FILE * open_cached_revocation_file(const CERT_CONTEXT *cert, const CERT_REVOCATION_PARA *params, const WCHAR *mode, int sharing)
static BOOL CRYPT_Connect(const URL_COMPONENTSW *components, struct InetContext *context, PCRYPT_CREDENTIALS pCredentials, HINTERNET *phInt, HINTERNET *phHost)
BOOL WINAPI CertDllVerifyRevocation(DWORD dwEncodingType, DWORD dwRevType, DWORD cContext, PVOID rgpvContext[], DWORD dwFlags, PCERT_REVOCATION_PARA pRevPara, PCERT_REVOCATION_STATUS pRevStatus)
static DWORD check_ocsp_response_info(const CERT_INFO *cert, const CERT_INFO *issuer, const CRYPT_OBJID_BLOB *blob, DWORD *status, FILETIME *next_update)
static BOOL CRYPT_GetCreateFunction(LPCSTR pszObjectOid, ContextDllCreateObjectContext *pFunc, HCRYPTOIDFUNCADDR *phFunc)
static struct InetContext * CRYPT_MakeInetContext(DWORD dwTimeout)
static void CRYPT_CacheURL(LPCWSTR pszURL, const CRYPT_BLOB_ARRAY *pObject, DWORD dwRetrievalFlags, FILETIME expires)
BOOL WINAPI CryptRetrieveObjectByUrlA(LPCSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, LPVOID *ppvObject, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, LPVOID pvVerify, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
static DWORD map_ocsp_status(DWORD status)
static BOOL CRYPT_GetExpiration(const void *object, const char *pszObjectOid, FILETIME *expiration)
static DWORD verify_cert_revocation_from_dist_points_ext(const CRYPT_DATA_BLOB *value, const CERT_CONTEXT *cert, FILETIME *time, DWORD flags, const CERT_REVOCATION_PARA *params, CERT_REVOCATION_STATUS *status, FILETIME *next_update)
static DWORD verify_cert_revocation(const CERT_CONTEXT *cert, FILETIME *pTime, DWORD dwFlags, CERT_REVOCATION_PARA *pRevPara, CERT_REVOCATION_STATUS *pRevStatus)
static void CALLBACK CRYPT_InetStatusCallback(HINTERNET hInt, DWORD_PTR dwContext, DWORD status, void *statusInfo, DWORD statusInfoLen)
HRESULT WINAPI DllUnregisterServer(void)
Definition: cryptnet_main.c:80
static BOOL CRYPT_DownloadObject(DWORD dwRetrievalFlags, HINTERNET hHttp, struct InetContext *context, PCRYPT_BLOB_ARRAY pObject, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
static BOOL WINAPI CRYPT_CreatePKCS7(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
static DWORD verify_signed_ocsp_response_info(const CERT_INFO *cert, const CERT_INFO *issuer, const CRYPT_OBJID_BLOB *blob, FILETIME *next_update)
static BOOL match_cert_id(const OCSP_CERT_ID *id, const CERT_INFO *cert, const CERT_INFO *issuer)
static void sha1_hash(const BYTE *data, DWORD datalen, BYTE *buf, DWORD *buflen)
BOOL WINAPI CryptRetrieveObjectByUrlW(LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, LPVOID *ppvObject, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, LPVOID pvVerify, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
static WCHAR * build_request_url(const WCHAR *base_url, const BYTE *data, DWORD data_size)
static BOOL WINAPI CRYPT_CreateBlob(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
struct _CERT_REVOCATION_PARA_NO_EXTRA_FIELDS CERT_REVOCATION_PARA_NO_EXTRA_FIELDS
static DWORD verify_cert_revocation_from_aia_ext(const CRYPT_DATA_BLOB *value, const CERT_CONTEXT *cert, FILETIME *pTime, DWORD dwFlags, CERT_REVOCATION_PARA *pRevPara, CERT_REVOCATION_STATUS *pRevStatus, FILETIME *next_update)
static DWORD verify_cert_revocation_with_ocsp(const CERT_CONTEXT *cert, const WCHAR *base_url, const CERT_REVOCATION_PARA *revpara, FILETIME *next_update)
static DWORD verify_cert_revocation_with_crl_online(const CERT_CONTEXT *cert, const CRL_CONTEXT *crl, FILETIME *pTime, CERT_REVOCATION_STATUS *pRevStatus)
static BOOL CRYPT_GetObjectFromCache(LPCWSTR pszURL, PCRYPT_BLOB_ARRAY pObject, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
static BOOL WINAPI File_RetrieveEncodedObjectW(LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
static BYTE * build_ocsp_request(const CERT_CONTEXT *cert, const CERT_CONTEXT *issuer_cert, DWORD *ret_size)
static WCHAR * build_request_path(const BYTE *data, DWORD data_size)
static BOOL CRYPT_GetObjectFromFile(HANDLE hFile, PCRYPT_BLOB_ARRAY pObject)
static const CRL_CONTEXT * retrieve_crl_from_dist_points(const CRYPT_URL_ARRAY *array, DWORD verify_flags, DWORD timeout)
static BOOL WINAPI FTP_RetrieveEncodedObjectW(LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
static BOOL WINAPI CRYPT_CreateCTL(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
static BOOL WINAPI HTTP_RetrieveEncodedObjectW(LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
BOOL(WINAPI * AddContextToStore)(HCERTSTORE hCertStore, const void *pContext, DWORD dwAddDisposition, const void **ppStoreContext)
static void escape_path(const WCHAR *src, DWORD src_len, WCHAR *dst, DWORD *dst_len)
static const char * url_oid_to_str(LPCSTR oid)
Definition: cryptnet_main.c:91
struct _OLD_CERT_REVOCATION_STATUS OLD_CERT_REVOCATION_STATUS
#define CACHED_CERT_HASH_SIZE
BOOL(WINAPI * ContextDllCreateObjectContext)(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
BOOL(WINAPI * SchemeDllRetrieveEncodedObjectW)(LPCWSTR pwszUrl, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
BOOL(WINAPI * UrlDllGetObjectUrlFunc)(LPCSTR, LPVOID, DWORD, PCRYPT_URL_ARRAY, DWORD *, PCRYPT_URL_INFO, DWORD *, LPVOID)
BOOL WINAPI CryptGetObjectUrl(LPCSTR pszUrlOid, LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
static const char revocation_cache_signature[]
static BOOL CRYPT_GetUrlFromCRLDistPointsExt(const CRYPT_DATA_BLOB *value, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo)
#define IS_INTOID(x)
Definition: cryptnet_main.c:45
static void WINAPI CRYPT_FreeBlob(LPCSTR pszObjectOid, PCRYPT_BLOB_ARRAY pObject, void *pvFreeContext)
static BOOL WINAPI CRYPT_CreateCRL(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
static BOOL CRYPT_CreateContext(const CRYPT_BLOB_ARRAY *pObject, DWORD dwExpectedContentTypeFlags, AddContextToStore addFunc, void **ppvContext)
#define _x(oid)
static BOOL WINAPI CRYPT_CreateAny(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
static BOOL CRYPT_CrackUrl(LPCWSTR pszURL, URL_COMPONENTSW *components)
static BOOL WINAPI CRYPT_GetUrlFromCertificateIssuer(LPCSTR pszUrlOid, LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define ERROR_IO_PENDING
Definition: dderror.h:15
#define E_INVALIDARG
Definition: ddrawi.h:101
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
#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
BOOL WINAPI CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash)
Definition: crypt.c:715
BOOL WINAPI CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
Definition: crypt.c:1584
BOOL WINAPI CryptDestroyKey(HCRYPTKEY hKey)
Definition: crypt.c:911
BOOL WINAPI CryptDestroyHash(HCRYPTHASH hHash)
Definition: crypt.c:875
BOOL WINAPI CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
Definition: crypt.c:641
BOOL WINAPI CryptHashData(HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
Definition: crypt.c:1745
BOOL WINAPI CryptVerifySignatureW(HCRYPTHASH hHash, const BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCWSTR sDescription, DWORD dwFlags)
Definition: crypt.c:2205
BOOL WINAPI CryptAcquireContextW(HCRYPTPROV *phProv, LPCWSTR pszContainer, LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
Definition: crypt.c:362
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
BOOL WINAPI CryptBinaryToStringW(const BYTE *pbBinary, DWORD cbBinary, DWORD dwFlags, LPWSTR pszString, DWORD *pcchString)
Definition: base64.c:473
BOOL WINAPI CryptStringToBinaryA(LPCSTR pszString, DWORD cchString, DWORD dwFlags, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags)
Definition: base64.c:772
BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore, PCCERT_CONTEXT pCertContext, DWORD dwAddDisposition, PCCERT_CONTEXT *ppStoreContext)
Definition: cert.c:286
BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext)
Definition: cert.c:371
PCERT_EXTENSION WINAPI CertFindExtension(LPCSTR pszObjId, DWORD cExtensions, CERT_EXTENSION rgExtensions[])
Definition: cert.c:2028
BOOL WINAPI CertFreeCRLContext(PCCRL_CONTEXT pCrlContext)
Definition: crl.c:386
BOOL WINAPI CertFindCertificateInCRL(PCCERT_CONTEXT pCert, PCCRL_CONTEXT pCrlContext, DWORD dwFlags, void *pvReserved, PCRL_ENTRY *ppCrlEntry)
Definition: crl.c:750
PCCRL_CONTEXT WINAPI CertFindCRLInStore(HCERTSTORE hCertStore, DWORD dwCertEncodingType, DWORD dwFindFlags, DWORD dwFindType, const void *pvFindPara, PCCRL_CONTEXT pPrevCrlContext)
Definition: crl.c:287
BOOL WINAPI CertFreeCTLContext(PCCTL_CONTEXT pCTLContext)
Definition: ctl.c:499
BOOL WINAPI CertAddCTLContextToStore(HCERTSTORE hCertStore, PCCTL_CONTEXT pCtlContext, DWORD dwAddDisposition, PCCTL_CONTEXT *ppStoreContext)
Definition: ctl.c:63
BOOL WINAPI CryptEncodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, void *pvEncoded, DWORD *pcbEncoded)
Definition: encode.c:4696
BOOL WINAPI CryptImportPublicKeyInfoEx(HCRYPTPROV hCryptProv, DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pInfo, ALG_ID aiKeyAlg, DWORD dwFlags, void *pvAuxInfo, HCRYPTKEY *phKey)
Definition: encode.c:5044
LPVOID WINAPI CryptMemAlloc(ULONG cbSize)
Definition: main.c:131
LPVOID WINAPI CryptMemRealloc(LPVOID pv, ULONG cbSize)
Definition: main.c:136
VOID WINAPI CryptMemFree(LPVOID pv)
Definition: main.c:141
static WCHAR aia[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1601
BOOL WINAPI CryptQueryObject(DWORD dwObjectType, const void *pvObject, DWORD dwExpectedContentTypeFlags, DWORD dwExpectedFormatTypeFlags, DWORD dwFlags, DWORD *pdwMsgAndCertEncodingType, DWORD *pdwContentType, DWORD *pdwFormatType, HCERTSTORE *phCertStore, HCRYPTMSG *phMsg, const void **ppvContext)
Definition: object.c:699
static WCHAR issuer[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1905
BOOL WINAPI CryptRegisterDefaultOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, DWORD dwIndex, LPCWSTR pwszDll)
Definition: oid.c:1109
BOOL WINAPI CryptUnregisterDefaultOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, LPCWSTR pwszDll)
Definition: oid.c:1142
HCRYPTOIDFUNCSET WINAPI CryptInitOIDFunctionSet(LPCSTR pszFuncName, DWORD dwFlags)
Definition: oid.c:114
BOOL WINAPI CryptGetOIDFunctionAddress(HCRYPTOIDFUNCSET hFuncSet, DWORD dwEncodingType, LPCSTR pszOID, DWORD dwFlags, void **ppvFuncAddr, HCRYPTOIDFUNCADDR *phFuncAddr)
Definition: oid.c:387
BOOL WINAPI CryptRegisterOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID, LPCWSTR pwszDll, LPCSTR pszOverrideFuncName)
Definition: oid.c:647
DWORD WINAPI CertOIDToAlgId(LPCSTR pszObjId)
Definition: oid.c:1901
BOOL WINAPI CryptUnregisterOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID)
Definition: oid.c:831
BOOL WINAPI CryptFreeOIDFunctionAddress(HCRYPTOIDFUNCADDR hFuncAddr, DWORD dwFlags)
Definition: oid.c:468
BOOL WINAPI CertAddCRLContextToStore(HCERTSTORE hCertStore, PCCRL_CONTEXT pCrlContext, DWORD dwAddDisposition, PCCRL_CONTEXT *ppStoreContext)
Definition: store.c:960
HCERTSTORE WINAPI CertOpenStore(LPCSTR lpszStoreProvider, DWORD dwMsgAndCertEncodingType, HCRYPTPROV_LEGACY hCryptProv, DWORD dwFlags, const void *pvPara)
Definition: store.c:815
BOOL WINAPI CertCloseStore(HCERTSTORE hCertStore, DWORD dwFlags)
Definition: store.c:1127
#define CloseHandle
Definition: compat.h:739
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define GetCurrentDirectoryW(x, y)
Definition: compat.h:756
#define CP_ACP
Definition: compat.h:109
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define GENERIC_READ
Definition: compat.h:135
#define ERROR_NOT_SUPPORTED
Definition: compat.h:100
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define GetFileSizeEx
Definition: compat.h:757
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define CALLBACK
Definition: compat.h:35
#define lstrcpyW
Definition: compat.h:749
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define FILE_SHARE_READ
Definition: compat.h:136
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
static const WCHAR *const ext[]
Definition: module.c:53
BOOL WINAPI GetFileTime(IN HANDLE hFile, OUT LPFILETIME lpCreationTime OPTIONAL, OUT LPFILETIME lpLastAccessTime OPTIONAL, OUT LPFILETIME lpLastWriteTime OPTIONAL)
Definition: fileinfo.c:880
BOOL WINAPI WriteFile(_In_ HANDLE hFile, _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer, _In_ DWORD nNumberOfBytesToWrite, _Out_opt_ LPDWORD lpNumberOfBytesWritten, _Inout_opt_ LPOVERLAPPED lpOverlapped)
Definition: rw.c:25
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2271
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
Definition: time.c:128
BOOL WINAPI SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime)
Definition: time.c:153
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
Definition: time.c:106
FILE *CDECL _wfsopen(const wchar_t *path, const wchar_t *mode, int share)
Definition: file.c:4254
int CDECL fclose(FILE *file)
Definition: file.c:3757
size_t CDECL fread(void *ptr, size_t size, size_t nmemb, FILE *file)
Definition: file.c:4406
size_t CDECL fwrite(const void *ptr, size_t size, size_t nmemb, FILE *file)
Definition: file.c:4129
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
#define _SH_DENYRW
Definition: share.h:37
#define _SH_DENYWR
Definition: share.h:38
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
HRESULT WINAPI SHStrDupW(const WCHAR *src, WCHAR **dest)
Definition: main.c:1692
HRESULT WINAPI SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath)
Definition: shellpath.c:2716
BOOL WINAPI HttpEndRequestW(HINTERNET hRequest, LPINTERNET_BUFFERSW lpBuffersOut, DWORD dwFlags, DWORD_PTR dwContext)
Definition: http.c:5389
BOOL WINAPI HttpSendRequestW(HINTERNET hHttpRequest, LPCWSTR lpszHeaders, DWORD dwHeaderLength, LPVOID lpOptional, DWORD dwOptionalLength)
Definition: http.c:5595
BOOL WINAPI HttpQueryInfoW(HINTERNET hHttpRequest, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
Definition: http.c:3870
BOOL WINAPI HttpSendRequestExW(HINTERNET hRequest, LPINTERNET_BUFFERSW lpBuffersIn, LPINTERNET_BUFFERSW lpBuffersOut, DWORD dwFlags, DWORD_PTR dwContext)
Definition: http.c:5500
HINTERNET WINAPI HttpOpenRequestW(HINTERNET hHttpSession, LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion, LPCWSTR lpszReferrer, LPCWSTR *lpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext)
Definition: http.c:3469
BOOL WINAPI InternetCrackUrlW(const WCHAR *lpszUrl, DWORD dwUrlLength, DWORD dwFlags, URL_COMPONENTSW *lpUC)
Definition: internet.c:1625
BOOL WINAPI InternetReadFile(HINTERNET hFile, LPVOID lpBuffer, DWORD dwNumOfBytesToRead, LPDWORD pdwNumOfBytesRead)
Definition: internet.c:2154
BOOL WINAPI InternetReadFileExA(HINTERNET hFile, LPINTERNET_BUFFERSA lpBuffersOut, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:2210
INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallbackW(HINTERNET hInternet, INTERNET_STATUS_CALLBACK lpfnIntCB)
Definition: internet.c:2075
BOOL WINAPI InternetCloseHandle(HINTERNET hInternet)
Definition: internet.c:1414
BOOL WINAPI InternetQueryDataAvailable(HINTERNET hFile, LPDWORD lpdwNumberOfBytesAvailable, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:3960
HINTERNET WINAPI InternetConnectW(HINTERNET hInternet, LPCWSTR lpszServerName, INTERNET_PORT nServerPort, LPCWSTR lpszUserName, LPCWSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:1258
HINTERNET WINAPI InternetOpenW(LPCWSTR lpszAgent, DWORD dwAccessType, LPCWSTR lpszProxy, LPCWSTR lpszProxyBypass, DWORD dwFlags)
Definition: internet.c:979
BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, DWORD dwBufferLength)
Definition: internet.c:2837
#define swprintf
Definition: precomp.h:40
BOOL WINAPI SetUrlCacheEntryInfoW(LPCWSTR lpszUrl, LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo, DWORD dwFieldControl)
Definition: urlcache.c:2079
BOOL WINAPI GetUrlCacheEntryInfoW(LPCWSTR lpszUrl, LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo, LPDWORD lpdwCacheEntryInfoBufferSize)
Definition: urlcache.c:2012
BOOL WINAPI UnlockUrlCacheEntryFileW(LPCWSTR lpszUrlName, DWORD dwReserved)
Definition: urlcache.c:2621
BOOL WINAPI CreateUrlCacheEntryW(LPCWSTR lpszUrlName, DWORD dwExpectedFileSize, LPCWSTR lpszFileExtension, LPWSTR lpszFileName, DWORD dwReserved)
Definition: urlcache.c:2815
BOOL WINAPI RetrieveUrlCacheEntryFileW(LPCWSTR lpszUrlName, LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo, LPDWORD lpdwCacheEntryInfoBufferSize, DWORD dwReserved)
Definition: urlcache.c:2185
BOOL WINAPI CommitUrlCacheEntryW(LPCWSTR lpszUrlName, LPCWSTR lpszLocalFileName, FILETIME ExpireTime, FILETIME LastModifiedTime, DWORD CacheEntryType, LPWSTR lpHeaderInfo, DWORD dwHeaderSize, LPCWSTR lpszFileExtension, LPCWSTR lpszOriginalUrl)
Definition: urlcache.c:3085
BOOL WINAPI DeleteUrlCacheEntryW(LPCWSTR lpszUrlName)
Definition: urlcache.c:3344
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
time_t now
Definition: finger.c:65
FxObject * pObject
BOOLEAN valid
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum func
Definition: glext.h:6028
GLenum src
Definition: glext.h:6340
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLenum GLenum GLuint components
Definition: glext.h:9620
GLenum mode
Definition: glext.h:6217
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint in
Definition: glext.h:9616
GLenum GLenum dst
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
GLuint64EXT * result
Definition: glext.h:11304
GLenum GLsizei len
Definition: glext.h:6722
GLuint id
Definition: glext.h:5910
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
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
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 * u
Definition: glfuncs.h:240
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 GLint GLint j
Definition: glfuncs.h:250
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
int const JOCTET unsigned int datalen
Definition: jpeglib.h:1033
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
__u16 time
Definition: mkdosfs.c:8
#define error(str)
Definition: mkdosfs.c:1605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static PVOID ptr
Definition: dispmode.c:27
static DWORD path_len
Definition: batch.c:31
static const WCHAR url[]
Definition: encode.c:1384
static const BYTE crl[]
Definition: message.c:817
static BYTE cert[]
Definition: msg.c:1374
static LPCWSTR LPVOID pvReserved
Definition: asmcache.c:749
const WCHAR * base_url
Definition: mimeole.c:1439
static JOBOBJECTINFOCLASS LPVOID DWORD LPDWORD ret_len
Definition: process.c:81
static const struct @1831 hash_data[]
static const struct access_res create[16]
Definition: package.c:7505
static void ULONG ULONG * ret_size
Definition: time.c:40
_In_ HANDLE hFile
Definition: mswsock.h:90
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define LPVOID
Definition: nt_native.h:45
#define BOOL
Definition: nt_native.h:43
#define DWORD
Definition: nt_native.h:44
#define GENERIC_WRITE
Definition: nt_native.h:90
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
Definition: ntbasedef.h:684
static OBJECT_ATTRIBUTES *static ULONG POBJECT_ATTRIBUTES PIO_STATUS_BLOCK ULONG sharing
Definition: pipe.c:95
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
Definition: shlwapi.h:761
DWORD scheme
wcscat
wcscpy
#define memset(x, y, z)
Definition: compat.h:39
int WINAPI SHCreateDirectoryExW(HWND hWnd, LPCWSTR path, LPSECURITY_ATTRIBUTES sec)
Definition: shlfileop.cpp:1006
@ SHGFP_TYPE_CURRENT
Definition: shlobj.h:2157
#define CSIDL_LOCAL_APPDATA
Definition: shlobj.h:2208
#define TRACE(s)
Definition: solgame.cpp:4
DWORD dwStructSize
Definition: wininet.h:211
DWORD dwUrlPathLength
Definition: wininet.h:223
LPWSTR lpszHostName
Definition: wininet.h:215
DWORD dwHostNameLength
Definition: wininet.h:216
INTERNET_SCHEME nScheme
Definition: wininet.h:214
LPWSTR lpszUrlPath
Definition: wininet.h:222
INTERNET_PORT nPort
Definition: wininet.h:217
PCERT_INFO pCertInfo
Definition: wincrypt.h:491
PCERT_EXTENSION rgExtension
Definition: wincrypt.h:261
DWORD cExtension
Definition: wincrypt.h:260
LPFILETIME pftTimeToUse
Definition: wincrypt.h:920
HCERTSTORE hCrlStore
Definition: wincrypt.h:919
PCCERT_CONTEXT pIssuerCert
Definition: wincrypt.h:916
Definition: wincrypt.h:496
BYTE * pbData
Definition: wincrypt.h:112
BYTE * pbData
Definition: wincrypt.h:206
FILETIME * pLastSyncTime
Definition: wincrypt.h:1843
LPWSTR * rgwszUrl
Definition: wincrypt.h:1738
DWORD dwHighDateTime
Definition: mapidefs.h:66
DWORD dwLowDateTime
Definition: mapidefs.h:65
DWORD dwBufferLength
Definition: wininet.h:265
Definition: wininet.h:2127
FILETIME LastSyncTime
Definition: wininet.h:2139
FILETIME ExpireTime
Definition: wininet.h:2137
LPWSTR lpszLocalFileName
Definition: wininet.h:2130
Definition: wincrypt.h:700
Definition: wincrypt.h:654
POCSP_SIGNATURE_INFO pOptionalSignatureInfo
Definition: wincrypt.h:644
CRYPT_DER_BLOB ToBeSigned
Definition: wincrypt.h:643
Definition: undname.c:54
Definition: image.c:134
Definition: http.c:7252
HANDLE event
Definition: http.c:7253
Definition: fci.c:127
Definition: _hash_fun.h:40
Definition: copy.c:22
Definition: name.c:39
Definition: tftpd.h:86
Definition: ps.c:97
Definition: dhcpd.h:248
Definition: cmds.c:130
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:587
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint32_t DWORD_PTR
Definition: typedefs.h:65
unsigned char * LPBYTE
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
char * LPSTR
Definition: typedefs.h:51
Definition: pdh_main.c:96
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define URL_OID_CRL_ISSUER
Definition: wincrypt.h:1752
#define szOID_PKIX_OCSP_BASIC_SIGNED_RESPONSE
Definition: wincrypt.h:678
#define OCSP_BASIC_GOOD_CERT_STATUS
Definition: wincrypt.h:696
#define CONTEXT_OID_CERTIFICATE
Definition: wincrypt.h:1876
#define CRL_FIND_ISSUED_BY_AKI_FLAG
Definition: wincrypt.h:3079
struct _CRYPT_URL_ARRAY * PCRYPT_URL_ARRAY
#define CRYPT_DECODE_NOCOPY_FLAG
Definition: wincrypt.h:3608
#define PROV_RSA_FULL
Definition: wincrypt.h:2243
#define CRYPT_VERIFYCONTEXT
Definition: wincrypt.h:2273
#define CALG_SHA1
Definition: wincrypt.h:2060
#define CONTEXT_OID_CRL
Definition: wincrypt.h:1877
#define CERT_QUERY_CONTENT_FLAG_CTL
Definition: wincrypt.h:3704
#define URL_OID_CERTIFICATE_ISSUER
Definition: wincrypt.h:1748
#define CERT_STORE_PROV_COLLECTION
Definition: wincrypt.h:2465
#define CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG
Definition: wincrypt.h:2743
#define CRYPT_DONT_CACHE_RESULT
Definition: wincrypt.h:1885
#define CERT_STORE_PROV_LDAP_W
Definition: wincrypt.h:2473
#define CONTEXT_OID_CAPI2_ANY
Definition: wincrypt.h:1880
#define OCSP_REQUEST_V1
Definition: wincrypt.h:660
#define CERT_ALT_NAME_URL
Definition: wincrypt.h:360
#define OCSP_BASIC_UNKNOWN_CERT_STATUS
Definition: wincrypt.h:698
#define CRYPT_GET_URL_FROM_EXTENSION
Definition: wincrypt.h:3637
ULONG_PTR HCRYPTPROV
Definition: wincrypt.h:55
#define szOID_CRL_DIST_POINTS
Definition: wincrypt.h:3352
#define CERT_QUERY_CONTENT_FLAG_CRL
Definition: wincrypt.h:3705
#define CERT_QUERY_CONTENT_FLAG_CERT
Definition: wincrypt.h:3703
#define CRL_FIND_ISSUED_BY_SIGNATURE_FLAG
Definition: wincrypt.h:3080
#define CERT_QUERY_CONTENT_CRL
Definition: wincrypt.h:3691
#define CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED
Definition: wincrypt.h:3716
#define X509_AUTHORITY_INFO_ACCESS
Definition: wincrypt.h:3551
#define OCSP_BASIC_RESPONSE
Definition: wincrypt.h:3591
#define szOID_PKIX_OCSP
Definition: wincrypt.h:3482
#define CERT_STORE_CREATE_NEW_FLAG
Definition: wincrypt.h:2633
#define CRYPT_OID_VERIFY_REVOCATION_FUNC
Definition: wincrypt.h:2666
#define CERT_QUERY_OBJECT_BLOB
Definition: wincrypt.h:3687
#define URL_OID_CTL_NEXT_UPDATE
Definition: wincrypt.h:1751
#define CRYPT_STRING_BASE64
Definition: wincrypt.h:3132
#define CRYPT_STRING_BASE64_ANY
Definition: wincrypt.h:3137
#define OCSP_SUCCESSFUL_RESPONSE
Definition: wincrypt.h:671
#define CERT_CRL_SIGN_KEY_USAGE
Definition: wincrypt.h:320
#define CERT_QUERY_FORMAT_FLAG_BINARY
Definition: wincrypt.h:3743
#define CERT_QUERY_CONTENT_CTL
Definition: wincrypt.h:3690
struct _CRYPT_URL_ARRAY CRYPT_URL_ARRAY
#define OCSP_BASIC_SIGNED_RESPONSE
Definition: wincrypt.h:3590
void(WINAPI * PFN_FREE_ENCODED_OBJECT_FUNC)(LPCSTR pszObjectOid, PCRYPT_BLOB_ARRAY pObject, void *pvFreeContext)
Definition: wincrypt.h:1854
#define szOID_KEY_USAGE
Definition: wincrypt.h:3341
#define X509_ASN_ENCODING
Definition: wincrypt.h:2501
#define OCSP_BASIC_REVOKED_CERT_STATUS
Definition: wincrypt.h:697
#define URL_OID_CROSS_CERT_DIST_POINT
Definition: wincrypt.h:1755
#define CRYPT_DECODE_ALLOC_FLAG
Definition: wincrypt.h:3612
#define CERT_STORE_PROV_MEMORY
Definition: wincrypt.h:2455
#define SCHEME_OID_RETRIEVE_ENCODED_OBJECTW_FUNC
Definition: wincrypt.h:1860
#define CRL_DIST_POINT_FULL_NAME
Definition: wincrypt.h:523
#define CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION
Definition: wincrypt.h:932
#define CRYPT_STRING_NOCRLF
Definition: wincrypt.h:3149
#define CONTEXT_OID_PKCS7
Definition: wincrypt.h:1879
ULONG_PTR HCRYPTKEY
Definition: wincrypt.h:58
ULONG_PTR HCRYPTHASH
Definition: wincrypt.h:59
#define CRYPT_OID_OPEN_STORE_PROV_FUNC
Definition: wincrypt.h:2660
#define URL_OID_GET_OBJECT_URL_FUNC
Definition: wincrypt.h:2678
#define CRYPT_WIRE_ONLY_RETRIEVAL
Definition: wincrypt.h:1884
#define X509_BITS
Definition: wincrypt.h:3544
#define CRYPT_STICKY_CACHE_RETRIEVAL
Definition: wincrypt.h:1887
#define CERT_VERIFY_REV_ACCUMULATIVE_TIMEOUT_FLAG
Definition: wincrypt.h:933
#define szOID_OIWSEC_sha1
Definition: wincrypt.h:3253
#define CERT_CONTEXT_REVOCATION_TYPE
Definition: wincrypt.h:930
#define URL_OID_CERTIFICATE_CRL_DIST_POINT
Definition: wincrypt.h:1749
#define CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED
Definition: wincrypt.h:3714
#define CERT_STORE_ADD_ALWAYS
Definition: wincrypt.h:2654
#define URL_OID_CERTIFICATE_FRESHEST_CRL
Definition: wincrypt.h:1753
#define CRYPT_ENCODE_ALLOC_FLAG
Definition: wincrypt.h:3599
#define OCSP_REQUEST
Definition: wincrypt.h:3588
#define szOID_AUTHORITY_INFO_ACCESS
Definition: wincrypt.h:3446
struct _CRYPT_BLOB_ARRAY CRYPT_BLOB_ARRAY
struct _CRYPT_URL_INFO CRYPT_URL_INFO
#define URL_OID_CRL_FRESHEST_CRL
Definition: wincrypt.h:1754
#define OCSP_SIGNED_REQUEST
Definition: wincrypt.h:3587
#define CONTEXT_OID_CTL
Definition: wincrypt.h:1878
struct _CRYPT_URL_INFO * PCRYPT_URL_INFO
#define CERT_QUERY_CONTENT_CERT
Definition: wincrypt.h:3689
#define X509_CRL_DIST_POINTS
Definition: wincrypt.h:3554
#define CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNC
Definition: wincrypt.h:1870
#define CRYPT_CACHE_ONLY_RETRIEVAL
Definition: wincrypt.h:1883
#define HP_HASHVAL
Definition: wincrypt.h:2387
#define URL_OID_CTL_ISSUER
Definition: wincrypt.h:1750
#define szOID_PKIX_CA_ISSUERS
Definition: wincrypt.h:3483
#define CRL_FIND_ISSUED_BY
Definition: wincrypt.h:3075
#define OCSP_RESPONSE
Definition: wincrypt.h:3589
#define WINAPI
Definition: msvc.h:6
#define CRYPT_E_REVOKED
Definition: winerror.h:4433
#define CRYPT_E_NO_MATCH
Definition: winerror.h:4426
#define CRYPT_E_NOT_FOUND
Definition: winerror.h:4421
#define CERT_E_REVOKED
Definition: winerror.h:4642
#define CRYPT_E_NO_REVOCATION_CHECK
Definition: winerror.h:4435
#define CRYPT_E_REVOCATION_OFFLINE
Definition: winerror.h:4436
#define ERROR_TIMEOUT
Definition: winerror.h:1286
#define ERROR_INVALID_DATA
Definition: winerror.h:238
#define HTTP_STATUS_OK
Definition: winhttp.h:301
#define INTERNET_SCHEME_FTP
Definition: winhttp.h:49
#define ICU_DECODE
Definition: winhttp.h:353
#define INTERNET_SCHEME_HTTP
Definition: winhttp.h:47
#define INTERNET_DEFAULT_HTTP_PORT
Definition: winhttp.h:41
#define INTERNET_SCHEME_HTTPS
Definition: winhttp.h:48
#define IRF_NO_WAIT
Definition: wininet.h:625
#define INTERNET_DEFAULT_FTP_PORT
Definition: wininet.h:38
#define HTTP_QUERY_FLAG_SYSTEMTIME
Definition: wininet.h:1605
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
#define INTERNET_MAX_HOST_NAME_LENGTH
Definition: wininet.h:44
#define INTERNET_FLAG_NO_COOKIES
Definition: wininet.h:75
#define CACHE_ENTRY_EXPTIME_FC
Definition: wininet.h:2296
#define INTERNET_SERVICE_FTP
Definition: wininet.h:560
#define HTTP_QUERY_FLAG_NUMBER
Definition: wininet.h:1606
#define NORMAL_CACHE_ENTRY
Definition: wininet.h:2087
#define INTERNET_FLAG_SECURE
Definition: wininet.h:71
#define STICKY_CACHE_ENTRY
Definition: wininet.h:2088
#define INTERNET_FLAG_NO_UI
Definition: wininet.h:84
@ INTERNET_SCHEME_FILE
Definition: wininet.h:143
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
#define INTERNET_MAX_PATH_LENGTH
Definition: wininet.h:49
#define INTERNET_OPTION_SEND_TIMEOUT
Definition: wininet.h:704
#define HTTP_QUERY_STATUS_CODE
Definition: wininet.h:1542
#define INTERNET_OPEN_TYPE_PRECONFIG
Definition: wininet.h:521
#define INTERNET_OPTION_RECEIVE_TIMEOUT
Definition: wininet.h:706
#define HTTP_QUERY_EXPIRES
Definition: wininet.h:1533
#define HTTP_QUERY_CONTENT_LENGTH
Definition: wininet.h:1528
#define INTERNET_SERVICE_HTTP
Definition: wininet.h:562
#define snprintf
Definition: wintirpc.h:48
unsigned char BYTE
Definition: xxhash.c:193