ReactOS  0.4.13-dev-455-g28ed234
crl.c
Go to the documentation of this file.
1 /*
2  * Copyright 2006 Juan Lang
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  *
18  */
19 
20 #include <assert.h>
21 #include <stdarg.h>
22 #define NONAMELESSUNION
23 #include "windef.h"
24 #include "winbase.h"
25 #include "wincrypt.h"
26 #include "wine/debug.h"
27 #include "wine/unicode.h"
28 #include "crypt32_private.h"
29 
31 
32 static void CRL_free(context_t *context)
33 {
34  crl_t *crl = (crl_t*)context;
35 
36  CryptMemFree(crl->ctx.pbCrlEncoded);
37  LocalFree(crl->ctx.pCrlInfo);
38 }
39 
40 static const context_vtbl_t crl_vtbl;
41 
43 {
44  crl_t *crl;
45 
46  if(use_link) {
48  if(!crl)
49  return NULL;
50  }else {
51  const crl_t *cloned = (const crl_t*)context;
52  DWORD size = 0;
53  BOOL res;
54 
56  if(!crl)
57  return NULL;
58 
59  Context_CopyProperties(&crl->ctx, &cloned->ctx);
60 
61  crl->ctx.dwCertEncodingType = cloned->ctx.dwCertEncodingType;
62  crl->ctx.pbCrlEncoded = CryptMemAlloc(cloned->ctx.cbCrlEncoded);
63  memcpy(crl->ctx.pbCrlEncoded, cloned->ctx.pbCrlEncoded, cloned->ctx.cbCrlEncoded);
64  crl->ctx.cbCrlEncoded = cloned->ctx.cbCrlEncoded;
65 
66  /* FIXME: We don't need to decode the object here, we could just clone crl info. */
67  res = CryptDecodeObjectEx(crl->ctx.dwCertEncodingType, X509_CERT_CRL_TO_BE_SIGNED,
68  crl->ctx.pbCrlEncoded, crl->ctx.cbCrlEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL,
69  &crl->ctx.pCrlInfo, &size);
70  if(!res) {
71  CertFreeCRLContext(&crl->ctx);
72  return NULL;
73  }
74  }
75 
76  crl->ctx.hCertStore = store;
77  return &crl->base;
78 }
79 
80 static const context_vtbl_t crl_vtbl = {
81  CRL_free,
82  CRL_clone
83 };
84 
86  const BYTE* pbCrlEncoded, DWORD cbCrlEncoded)
87 {
88  crl_t *crl = NULL;
89  BOOL ret;
90  PCRL_INFO crlInfo = NULL;
91  BYTE *data = NULL;
92  DWORD size = 0;
93 
94  TRACE("(%08x, %p, %d)\n", dwCertEncodingType, pbCrlEncoded,
95  cbCrlEncoded);
96 
98  {
100  return NULL;
101  }
103  pbCrlEncoded, cbCrlEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL,
104  &crlInfo, &size);
105  if (!ret)
106  return NULL;
107 
109  if (!crl)
110  return NULL;
111 
113  if (!data)
114  {
115  Context_Release(&crl->base);
116  return NULL;
117  }
118 
119  memcpy(data, pbCrlEncoded, cbCrlEncoded);
120  crl->ctx.dwCertEncodingType = dwCertEncodingType;
121  crl->ctx.pbCrlEncoded = data;
122  crl->ctx.cbCrlEncoded = cbCrlEncoded;
123  crl->ctx.pCrlInfo = crlInfo;
124  crl->ctx.hCertStore = &empty_store;
125 
126  return &crl->ctx;
127 }
128 
130  DWORD dwCertEncodingType, const BYTE *pbCrlEncoded, DWORD cbCrlEncoded,
132 {
134  pbCrlEncoded, cbCrlEncoded);
135  BOOL ret;
136 
137  TRACE("(%p, %08x, %p, %d, %08x, %p)\n", hCertStore, dwCertEncodingType,
138  pbCrlEncoded, cbCrlEncoded, dwAddDisposition, ppCrlContext);
139 
140  if (crl)
141  {
143  ppCrlContext);
145  }
146  else
147  ret = FALSE;
148  return ret;
149 }
150 
152  DWORD dwFlags, const void *pvPara);
153 
155  DWORD dwFlags, const void *pvPara)
156 {
157  return TRUE;
158 }
159 
161  DWORD dwFlags, const void *pvPara)
162 {
163  BOOL ret;
164 
165  if (pvPara)
166  {
168 
169  ret = CertCompareCertificateName(issuer->dwCertEncodingType,
170  &issuer->pCertInfo->Subject, &pCrlContext->pCrlInfo->Issuer);
173  issuer->dwCertEncodingType,
177  {
181 
182  if (ext)
183  {
185  DWORD size;
186 
188  X509_AUTHORITY_KEY_ID2, ext->Value.pbData, ext->Value.cbData,
190  {
191  if (info->AuthorityCertIssuer.cAltEntry &&
192  info->AuthorityCertSerialNumber.cbData)
193  {
194  PCERT_ALT_NAME_ENTRY directoryName = NULL;
195  DWORD i;
196 
197  for (i = 0; !directoryName &&
198  i < info->AuthorityCertIssuer.cAltEntry; i++)
199  if (info->AuthorityCertIssuer.rgAltEntry[i].
200  dwAltNameChoice == CERT_ALT_NAME_DIRECTORY_NAME)
201  directoryName =
202  &info->AuthorityCertIssuer.rgAltEntry[i];
203  if (directoryName)
204  {
206  issuer->dwCertEncodingType,
207  &issuer->pCertInfo->Subject,
208  &directoryName->u.DirectoryName);
209  if (ret)
211  &issuer->pCertInfo->SerialNumber,
212  &info->AuthorityCertSerialNumber);
213  }
214  else
215  {
216  FIXME("no supported name type in authority key id2\n");
217  ret = FALSE;
218  }
219  }
220  else if (info->KeyId.cbData)
221  {
222  DWORD size;
223 
226  if (ret && size == info->KeyId.cbData)
227  {
229 
230  if (buf)
231  {
234  ret = !memcmp(buf, info->KeyId.pbData, size);
235  CryptMemFree(buf);
236  }
237  else
238  ret = FALSE;
239  }
240  else
241  ret = FALSE;
242  }
243  else
244  {
245  FIXME("unsupported value for AKI extension\n");
246  ret = FALSE;
247  }
248  LocalFree(info);
249  }
250  }
251  /* else: a CRL without an AKI matches any cert */
252  }
253  }
254  else
255  ret = TRUE;
256  return ret;
257 }
258 
260  DWORD dwFlags, const void *pvPara)
261 {
262  BOOL ret;
263 
264  if (pvPara)
265  {
267 
269  &pCrlContext->pCrlInfo->Issuer, &crl->pCrlInfo->Issuer);
270  }
271  else
272  ret = TRUE;
273  return ret;
274 }
275 
277  DWORD dwFlags, const void *pvPara)
278 {
279  const CRL_FIND_ISSUED_FOR_PARA *para = pvPara;
280  BOOL ret;
281 
284  return ret;
285 }
286 
288  DWORD dwCertEncodingType, DWORD dwFindFlags, DWORD dwFindType,
289  const void *pvFindPara, PCCRL_CONTEXT pPrevCrlContext)
290 {
293 
294  TRACE("(%p, %d, %d, %d, %p, %p)\n", hCertStore, dwCertEncodingType,
295  dwFindFlags, dwFindType, pvFindPara, pPrevCrlContext);
296 
297  switch (dwFindType)
298  {
299  case CRL_FIND_ANY:
301  break;
302  case CRL_FIND_ISSUED_BY:
304  break;
305  case CRL_FIND_EXISTING:
307  break;
308  case CRL_FIND_ISSUED_FOR:
310  break;
311  default:
312  FIXME("find type %08x unimplemented\n", dwFindType);
313  compare = NULL;
314  }
315 
316  if (compare)
317  {
318  BOOL matches = FALSE;
319 
321  do {
322  ret = CertEnumCRLsInStore(hCertStore, ret);
323  if (ret)
324  matches = compare(ret, dwFindType, dwFindFlags, pvFindPara);
325  } while (ret != NULL && !matches);
326  if (!ret)
328  }
329  else
330  {
332  ret = NULL;
333  }
334  return ret;
335 }
336 
338  PCCERT_CONTEXT pIssuerContext, PCCRL_CONTEXT pPrevCrlContext, DWORD *pdwFlags)
339 {
340  static const DWORD supportedFlags = CERT_STORE_SIGNATURE_FLAG |
344 
345  TRACE("(%p, %p, %p, %08x)\n", hCertStore, pIssuerContext, pPrevCrlContext,
346  *pdwFlags);
347 
348  if (*pdwFlags & ~supportedFlags)
349  {
351  return NULL;
352  }
353  if (pIssuerContext)
354  ret = CertFindCRLInStore(hCertStore, pIssuerContext->dwCertEncodingType,
355  0, CRL_FIND_ISSUED_BY, pIssuerContext, pPrevCrlContext);
356  else
357  ret = CertFindCRLInStore(hCertStore, 0, 0, CRL_FIND_ANY, NULL,
359  if (ret)
360  {
361  if (*pdwFlags & CERT_STORE_TIME_VALIDITY_FLAG)
362  {
363  if (0 == CertVerifyCRLTimeValidity(NULL, ret->pCrlInfo))
364  *pdwFlags &= ~CERT_STORE_TIME_VALIDITY_FLAG;
365  }
366  if (*pdwFlags & CERT_STORE_SIGNATURE_FLAG)
367  {
368  if (CryptVerifyCertificateSignatureEx(0, ret->dwCertEncodingType,
370  CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT, (void *)pIssuerContext, 0,
371  NULL))
372  *pdwFlags &= ~CERT_STORE_SIGNATURE_FLAG;
373  }
374  }
375  return ret;
376 }
377 
379 {
380  TRACE("(%p)\n", pCrlContext);
381  if (pCrlContext)
383  return pCrlContext;
384 }
385 
387 {
388  TRACE("(%p)\n", pCrlContext);
389 
390  if (pCrlContext)
392  return TRUE;
393 }
394 
396  DWORD dwPropId)
397 {
398  TRACE("(%p, %d)\n", pCRLContext, dwPropId);
399 
400  return ContextPropertyList_EnumPropIDs(crl_from_ptr(pCRLContext)->base.properties, dwPropId);
401 }
402 
404  DWORD dwFlags, const void *pvData);
405 
407  ALG_ID algID, const BYTE *toHash, DWORD toHashLen, void *pvData,
408  DWORD *pcbData)
409 {
410  BOOL ret = CryptHashCertificate(0, algID, 0, toHash, toHashLen, pvData,
411  pcbData);
412  if (ret && pvData)
413  {
415 
417  }
418  return ret;
419 }
420 
422  void *pvData, DWORD *pcbData)
423 {
424  BOOL ret;
426 
427  TRACE("(%p, %d, %p, %p)\n", crl, dwPropId, pvData, pcbData);
428 
429  if (crl->base.properties)
430  ret = ContextPropertyList_FindProperty(crl->base.properties, dwPropId, &blob);
431  else
432  ret = FALSE;
433  if (ret)
434  {
435  if (!pvData)
436  *pcbData = blob.cbData;
437  else if (*pcbData < blob.cbData)
438  {
440  *pcbData = blob.cbData;
441  ret = FALSE;
442  }
443  else
444  {
445  memcpy(pvData, blob.pbData, blob.cbData);
446  *pcbData = blob.cbData;
447  }
448  }
449  else
450  {
451  /* Implicit properties */
452  switch (dwPropId)
453  {
456  crl->ctx.pbCrlEncoded, crl->ctx.cbCrlEncoded, pvData,
457  pcbData);
458  break;
461  crl->ctx.pbCrlEncoded, crl->ctx.cbCrlEncoded, pvData,
462  pcbData);
463  break;
464  default:
466  }
467  }
468  TRACE("returning %d\n", ret);
469  return ret;
470 }
471 
473  DWORD dwPropId, void *pvData, DWORD *pcbData)
474 {
475  BOOL ret;
476 
477  TRACE("(%p, %d, %p, %p)\n", pCRLContext, dwPropId, pvData, pcbData);
478 
479  switch (dwPropId)
480  {
481  case 0:
482  case CERT_CERT_PROP_ID:
483  case CERT_CRL_PROP_ID:
484  case CERT_CTL_PROP_ID:
486  ret = FALSE;
487  break;
489  if (!pvData)
490  {
491  *pcbData = sizeof(DWORD);
492  ret = TRUE;
493  }
494  else if (*pcbData < sizeof(DWORD))
495  {
497  *pcbData = sizeof(DWORD);
498  ret = FALSE;
499  }
500  else
501  {
503  }
504  break;
505  default:
507  }
508  return ret;
509 }
510 
512  DWORD dwFlags, const void *pvData)
513 {
514  BOOL ret;
515 
516  TRACE("(%p, %d, %08x, %p)\n", crl, dwPropId, dwFlags, pvData);
517 
518  if (!crl->base.properties)
519  ret = FALSE;
520  else if (!pvData)
521  {
523  ret = TRUE;
524  }
525  else
526  {
527  switch (dwPropId)
528  {
530  case CERT_CTL_USAGE_PROP_ID: /* same as CERT_ENHKEY_USAGE_PROP_ID */
533  case CERT_HASH_PROP_ID:
546  {
548 
549  ret = ContextPropertyList_SetProperty(crl->base.properties, dwPropId,
550  blob->pbData, blob->cbData);
551  break;
552  }
554  ret = ContextPropertyList_SetProperty(crl->base.properties, dwPropId,
555  pvData, sizeof(FILETIME));
556  break;
557  default:
558  FIXME("%d: stub\n", dwPropId);
559  ret = FALSE;
560  }
561  }
562  TRACE("returning %d\n", ret);
563  return ret;
564 }
565 
567  DWORD dwPropId, DWORD dwFlags, const void *pvData)
568 {
569  BOOL ret;
570 
571  TRACE("(%p, %d, %08x, %p)\n", pCRLContext, dwPropId, dwFlags, pvData);
572 
573  /* Handle special cases for "read-only"/invalid prop IDs. Windows just
574  * crashes on most of these, I'll be safer.
575  */
576  switch (dwPropId)
577  {
578  case 0:
580  case CERT_CERT_PROP_ID:
581  case CERT_CRL_PROP_ID:
582  case CERT_CTL_PROP_ID:
584  return FALSE;
585  }
587  TRACE("returning %d\n", ret);
588  return ret;
589 }
590 
592  const CRL_DIST_POINT_NAME *name2)
593 {
594  BOOL match;
595 
596  if (name1->dwDistPointNameChoice == name2->dwDistPointNameChoice)
597  {
598  match = TRUE;
599  if (name1->dwDistPointNameChoice == CRL_DIST_POINT_FULL_NAME)
600  {
601  if (name1->u.FullName.cAltEntry == name2->u.FullName.cAltEntry)
602  {
603  DWORD i;
604 
605  for (i = 0; match && i < name1->u.FullName.cAltEntry; i++)
606  {
607  const CERT_ALT_NAME_ENTRY *entry1 =
608  &name1->u.FullName.rgAltEntry[i];
609  const CERT_ALT_NAME_ENTRY *entry2 =
610  &name2->u.FullName.rgAltEntry[i];
611 
612  if (entry1->dwAltNameChoice == entry2->dwAltNameChoice)
613  {
614  switch (entry1->dwAltNameChoice)
615  {
616  case CERT_ALT_NAME_URL:
617  match = !strcmpiW(entry1->u.pwszURL,
618  entry2->u.pwszURL);
619  break;
621  match = (entry1->u.DirectoryName.cbData ==
622  entry2->u.DirectoryName.cbData) &&
623  !memcmp(entry1->u.DirectoryName.pbData,
624  entry2->u.DirectoryName.pbData,
625  entry1->u.DirectoryName.cbData);
626  break;
627  default:
628  FIXME("unimplemented for type %d\n",
629  entry1->dwAltNameChoice);
630  match = FALSE;
631  }
632  }
633  else
634  match = FALSE;
635  }
636  }
637  else
638  match = FALSE;
639  }
640  }
641  else
642  match = FALSE;
643  return match;
644 }
645 
647  const CRL_DIST_POINT *distPoint, const CRL_ISSUING_DIST_POINT *idp)
648 {
649  BOOL match;
650 
651  /* While RFC 5280, section 4.2.1.13 recommends against segmenting
652  * CRL distribution points by reasons, it doesn't preclude doing so.
653  * "This profile RECOMMENDS against segmenting CRLs by reason code."
654  * If the issuing distribution point for this CRL is only valid for
655  * some reasons, only match if the reasons covered also match the
656  * reasons in the CRL distribution point.
657  */
658  if (idp->OnlySomeReasonFlags.cbData)
659  {
660  if (idp->OnlySomeReasonFlags.cbData == distPoint->ReasonFlags.cbData)
661  {
662  DWORD i;
663 
664  match = TRUE;
665  for (i = 0; match && i < distPoint->ReasonFlags.cbData; i++)
666  if (idp->OnlySomeReasonFlags.pbData[i] !=
667  distPoint->ReasonFlags.pbData[i])
668  match = FALSE;
669  }
670  else
671  match = FALSE;
672  }
673  else
674  match = TRUE;
675  if (match)
677  &distPoint->DistPointName);
678  return match;
679 }
680 
682  PCCRL_CONTEXT pCrl, DWORD dwFlags, void *pvReserved)
683 {
685  BOOL ret;
686 
687  TRACE("(%p, %p, %08x, %p)\n", pCert, pCrl, dwFlags, pvReserved);
688 
689  if (!pCert)
690  return TRUE;
691 
693  pCrl->pCrlInfo->cExtension, pCrl->pCrlInfo->rgExtension)))
694  {
696  DWORD size;
697 
699  X509_ISSUING_DIST_POINT, ext->Value.pbData, ext->Value.cbData,
700  CRYPT_DECODE_ALLOC_FLAG, NULL, &idp, &size)))
701  {
703  pCert->pCertInfo->cExtension, pCert->pCertInfo->rgExtension)))
704  {
705  CRL_DIST_POINTS_INFO *distPoints;
706 
708  X509_CRL_DIST_POINTS, ext->Value.pbData, ext->Value.cbData,
709  CRYPT_DECODE_ALLOC_FLAG, NULL, &distPoints, &size)))
710  {
711  DWORD i;
712 
713  ret = FALSE;
714  for (i = 0; !ret && i < distPoints->cDistPoint; i++)
716  &distPoints->rgDistPoint[i], idp);
717  if (!ret)
719  LocalFree(distPoints);
720  }
721  }
722  else
723  {
724  /* no CRL dist points extension in cert, can't match the CRL
725  * (which has an issuing dist point extension)
726  */
727  ret = FALSE;
729  }
730  LocalFree(idp);
731  }
732  }
733  else
734  ret = TRUE;
735  return ret;
736 }
737 
739 {
740  DWORD i;
742 
743  for (i = 0; !entry && i < crl->cCRLEntry; i++)
744  if (CertCompareIntegerBlob(&crl->rgCRLEntry[i].SerialNumber,
745  &cert->SerialNumber))
746  entry = &crl->rgCRLEntry[i];
747  return entry;
748 }
749 
752  PCRL_ENTRY *ppCrlEntry)
753 {
754  TRACE("(%p, %p, %08x, %p, %p)\n", pCert, pCrlContext, dwFlags, pvReserved,
755  ppCrlEntry);
756 
757  *ppCrlEntry = CRYPT_FindCertificateInCRL(pCert->pCertInfo,
759  return TRUE;
760 }
761 
763  PCERT_INFO pCertId, DWORD cCrlInfo, PCRL_INFO rgpCrlInfo[])
764 {
765  DWORD i;
767 
768  TRACE("(%08x, %p, %d, %p)\n", dwCertEncodingType, pCertId, cCrlInfo,
769  rgpCrlInfo);
770 
771  for (i = 0; !entry && i < cCrlInfo; i++)
772  entry = CRYPT_FindCertificateInCRL(pCertId, rgpCrlInfo[i]);
773  return entry == NULL;
774 }
775 
777  PCRL_INFO pCrlInfo)
778 {
780  LONG ret;
781 
782  if (!pTimeToVerify)
783  {
785  pTimeToVerify = &fileTime;
786  }
787  if ((ret = CompareFileTime(pTimeToVerify, &pCrlInfo->ThisUpdate)) >= 0)
788  {
789  ret = CompareFileTime(pTimeToVerify, &pCrlInfo->NextUpdate);
790  if (ret < 0)
791  ret = 0;
792  }
793  return ret;
794 }
void Context_CopyProperties(const void *to, const void *from)
Definition: context.c:123
Definition: bug.cpp:7
void ContextPropertyList_RemoveProperty(CONTEXT_PROPERTY_LIST *list, DWORD id) DECLSPEC_HIDDEN
Definition: proplist.c:149
DWORD dwAltNameChoice
Definition: wincrypt.h:333
PCRL_DIST_POINT rgDistPoint
Definition: wincrypt.h:533
#define CERT_ENROLLMENT_PROP_ID
Definition: wincrypt.h:2712
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
Definition: time.c:128
#define CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID
Definition: wincrypt.h:2711
CRL_DIST_POINT_NAME DistPointName
Definition: wincrypt.h:518
WINECRYPT_CERTSTORE empty_store
Definition: store.c:1509
#define TRUE
Definition: types.h:120
#define CRL_FIND_ISSUED_BY_SIGNATURE_FLAG
Definition: wincrypt.h:2933
BOOL WINAPI CertGetStoreProperty(HCERTSTORE hCertStore, DWORD dwPropId, void *pvData, DWORD *pcbData)
Definition: store.c:1172
PCRL_INFO pCrlInfo
Definition: wincrypt.h:622
static const BYTE crl[]
Definition: message.c:864
#define matches(FN)
Definition: match.h:70
BOOL WINAPI CertIsValidCRLForCertificate(PCCERT_CONTEXT pCert, PCCRL_CONTEXT pCrl, DWORD dwFlags, void *pvReserved)
Definition: crl.c:681
BOOL WINAPI CertSetCRLContextProperty(PCCRL_CONTEXT pCRLContext, DWORD dwPropId, DWORD dwFlags, const void *pvData)
Definition: crl.c:566
CERT_NAME_BLOB DirectoryName
Definition: wincrypt.h:338
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
CRL_DIST_POINT_NAME DistPointName
Definition: wincrypt.h:563
#define CRYPT_E_NOT_FOUND
Definition: winerror.h:3007
unsigned int ALG_ID
Definition: wincrypt.h:45
PCCRL_CONTEXT WINAPI CertEnumCRLsInStore(HCERTSTORE hCertStore, PCCRL_CONTEXT pPrev)
Definition: store.c:1101
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 BOOL match_dist_point_with_issuing_dist_point(const CRL_DIST_POINT *distPoint, const CRL_ISSUING_DIST_POINT *idp)
Definition: crl.c:646
#define CERT_CERT_PROP_ID
Definition: image.c:133
static BOOL compare_dist_point_name(const CRL_DIST_POINT_NAME *name1, const CRL_DIST_POINT_NAME *name2)
Definition: crl.c:591
Definition: http.c:6587
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
Definition: match.c:28
BOOL WINAPI CertGetCRLContextProperty(PCCRL_CONTEXT pCRLContext, DWORD dwPropId, void *pvData, DWORD *pcbData)
Definition: crl.c:472
#define CERT_ALT_NAME_DIRECTORY_NAME
Definition: wincrypt.h:349
static BOOL compare_crl_any(PCCRL_CONTEXT pCrlContext, DWORD dwType, DWORD dwFlags, const void *pvPara)
Definition: crl.c:154
BOOL ContextPropertyList_SetProperty(CONTEXT_PROPERTY_LIST *list, DWORD id, const BYTE *pbData, size_t cbData) DECLSPEC_HIDDEN
Definition: proplist.c:95
BOOL ContextPropertyList_FindProperty(CONTEXT_PROPERTY_LIST *list, DWORD id, PCRYPT_DATA_BLOB blob) DECLSPEC_HIDDEN
Definition: proplist.c:72
#define CERT_ALT_NAME_URL
Definition: wincrypt.h:351
static BOOL compare_crl_issued_by(PCCRL_CONTEXT pCrlContext, DWORD dwType, DWORD dwFlags, const void *pvPara)
Definition: crl.c:160
#define CERT_STORE_SIGNATURE_FLAG
Definition: wincrypt.h:3458
DWORD dwCertEncodingType
Definition: wincrypt.h:479
#define CERT_DATE_STAMP_PROP_ID
Definition: wincrypt.h:2713
static crl_t * crl_from_ptr(const CRL_CONTEXT *ptr)
static BOOL(WINAPI *pCertFindCertificateInCRL)(PCCERT_CONTEXT
Definition: wincrypt.h:332
PCCRL_CONTEXT WINAPI CertGetCRLFromStore(HCERTSTORE hCertStore, PCCERT_CONTEXT pIssuerContext, PCCRL_CONTEXT pPrevCrlContext, DWORD *pdwFlags)
Definition: crl.c:337
_In_ PCCERT_CONTEXT _In_ DWORD dwAddDisposition
Definition: wincrypt.h:4987
#define CERT_ENCODING_TYPE_MASK
Definition: wincrypt.h:2290
void Context_AddRef(context_t *context)
Definition: context.c:78
#define CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID
Definition: wincrypt.h:2710
#define CRL_FIND_ISSUED_BY_AKI_FLAG
Definition: wincrypt.h:2932
static WCHAR name1[]
Definition: record.c:34
#define CERT_AUTO_ENROLL_PROP_ID
Definition: wincrypt.h:2707
#define CERT_STORE_TIME_VALIDITY_FLAG
Definition: wincrypt.h:3459
BOOL WINAPI CertAddEncodedCRLToStore(HCERTSTORE hCertStore, DWORD dwCertEncodingType, const BYTE *pbCrlEncoded, DWORD cbCrlEncoded, DWORD dwAddDisposition, PCCRL_CONTEXT *ppCrlContext)
Definition: crl.c:129
#define CERT_CTL_PROP_ID
void Context_Release(context_t *context)
Definition: context.c:106
BOOL WINAPI CertCompareCertificateName(DWORD dwCertEncodingType, PCERT_NAME_BLOB pCertName1, PCERT_NAME_BLOB pCertName2)
Definition: cert.c:1180
struct _test_info info[]
Definition: SetCursorPos.c:19
struct _CRYPTOAPI_BLOB * PCRYPT_DATA_BLOB
#define CERT_KEY_IDENTIFIER_PROP_ID
Definition: wincrypt.h:2706
context_t * Context_CreateDataContext(size_t contextSize, const context_vtbl_t *vtbl, WINECRYPT_CERTSTORE *store)
Definition: context.c:28
#define X509_ASN_ENCODING
Definition: wincrypt.h:2297
#define CERT_ACCESS_STATE_PROP_ID
Definition: wincrypt.h:2700
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
LPVOID WINAPI CryptMemAlloc(ULONG cbSize)
Definition: main.c:131
SYSTEMTIME fileTime
Definition: main.cpp:57
BOOL WINAPI CertGetCertificateContextProperty(PCCERT_CONTEXT pCertContext, DWORD dwPropId, void *pvData, DWORD *pcbData)
Definition: cert.c:551
unsigned char * LPBYTE
Definition: typedefs.h:52
FILETIME NextUpdate
Definition: wincrypt.h:499
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
DWORD cExtension
Definition: wincrypt.h:502
CERT_NAME_BLOB Issuer
Definition: wincrypt.h:244
_In_ DWORD _In_ DWORD cbCrlEncoded
Definition: wincrypt.h:5071
#define FIXME(fmt,...)
Definition: debug.h:110
PCERT_EXTENSION rgExtension
Definition: wincrypt.h:252
BYTE * pbCrlEncoded
Definition: wincrypt.h:620
#define CRL_FIND_ANY
Definition: wincrypt.h:2927
#define E_INVALIDARG
Definition: ddrawi.h:101
_In_ ULONG _In_opt_ PVOID pvData
Definition: winddi.h:3748
smooth NULL
Definition: ftsmooth.c:416
char ext[3]
Definition: mkdosfs.c:358
BOOL(* CrlCompareFunc)(PCCRL_CONTEXT pCrlContext, DWORD dwType, DWORD dwFlags, const void *pvPara)
Definition: crl.c:151
#define CERT_PVK_FILE_PROP_ID
Definition: wincrypt.h:2698
static BYTE cert[]
Definition: msg.c:1437
#define CERT_FRIENDLY_NAME_PROP_ID
Definition: wincrypt.h:2697
struct match match
Definition: match.c:33
HCERTSTORE hCertStore
Definition: wincrypt.h:623
static DWORD
Definition: crl.c:80
PCCERT_CONTEXT pIssuerCert
Definition: wincrypt.h:2940
#define szOID_CRL_DIST_POINTS
Definition: wincrypt.h:3196
DWORD cbCrlEncoded
Definition: wincrypt.h:621
BOOL WINAPI CertCompareIntegerBlob(PCRYPT_INTEGER_BLOB pInt1, PCRYPT_INTEGER_BLOB pInt2)
Definition: cert.c:1221
#define X509_CERT_CRL_TO_BE_SIGNED
Definition: wincrypt.h:3367
BOOL WINAPI CertVerifyCRLRevocation(DWORD dwCertEncodingType, PCERT_INFO pCertId, DWORD cCrlInfo, PCRL_INFO rgpCrlInfo[])
Definition: crl.c:762
#define TRACE(s)
Definition: solgame.cpp:4
PCERT_INFO pCertInfo
Definition: wincrypt.h:482
#define CERT_MD5_HASH_PROP_ID
Definition: wincrypt.h:2689
GLsizeiptr size
Definition: glext.h:5919
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
Definition: time.c:106
#define CRL_DIST_POINT_FULL_NAME
Definition: wincrypt.h:514
#define CERT_SIGNATURE_HASH_PROP_ID
Definition: wincrypt.h:2701
DWORD dwCertEncodingType
Definition: wincrypt.h:619
static LPCSTR DWORD void * pvReserved
Definition: str.c:196
PCCRL_CONTEXT WINAPI CertCreateCRLContext(DWORD dwCertEncodingType, const BYTE *pbCrlEncoded, DWORD cbCrlEncoded)
Definition: crl.c:85
#define WINAPI
Definition: msvc.h:8
#define CERT_CROSS_CERT_DIST_POINTS_PROP_ID
Definition: wincrypt.h:2709
CRYPT_BIT_BLOB OnlySomeReasonFlags
Definition: wincrypt.h:566
unsigned long DWORD
Definition: ntddk_ex.h:95
#define CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL
Definition: wincrypt.h:3470
#define SetLastError(x)
Definition: compat.h:409
PCERT_EXTENSION WINAPI CertFindExtension(LPCSTR pszObjId, DWORD cExtensions, CERT_EXTENSION rgExtensions[])
Definition: cert.c:2028
CRYPT_BIT_BLOB ReasonFlags
Definition: wincrypt.h:519
#define CERT_HASH_PROP_ID
Definition: wincrypt.h:2688
BOOL WINAPI CryptVerifyCertificateSignatureEx(HCRYPTPROV_LEGACY hCryptProv, DWORD dwCertEncodingType, DWORD dwSubjectType, void *pvSubject, DWORD dwIssuerType, void *pvIssuer, DWORD dwFlags, void *pvReserved)
Definition: cert.c:2717
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
static BOOL compare_crl_issued_for(PCCRL_CONTEXT pCrlContext, DWORD dwType, DWORD dwFlags, const void *pvPara)
Definition: crl.c:276
int ret
static PCRL_ENTRY CRYPT_FindCertificateInCRL(PCERT_INFO cert, const CRL_INFO *crl)
Definition: crl.c:738
BYTE * pbData
Definition: wincrypt.h:103
#define CERT_STORE_BASE_CRL_FLAG
Definition: wincrypt.h:3464
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
WINE_DEFAULT_DEBUG_CHANNEL(crypt)
uint32_t entry
Definition: isohybrid.c:63
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned char BYTE
Definition: mem.h:68
DWORD WINAPI CertEnumCRLContextProperties(PCCRL_CONTEXT pCRLContext, DWORD dwPropId)
Definition: crl.c:395
#define CALG_MD5
Definition: wincrypt.h:1805
#define X509_ISSUING_DIST_POINT
Definition: wincrypt.h:3424
BOOL WINAPI CertFindCertificateInCRL(PCCERT_CONTEXT pCert, PCCRL_CONTEXT pCrlContext, DWORD dwFlags, void *pvReserved, PCRL_ENTRY *ppCrlEntry)
Definition: crl.c:750
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define CRL_FIND_EXISTING
Definition: wincrypt.h:2929
#define CERT_NEXT_UPDATE_LOCATION_PROP_ID
Definition: wincrypt.h:2696
_In_ DWORD dwCertEncodingType
Definition: wincrypt.h:5041
#define strcmpiW(s1, s2)
Definition: unicode.h:39
#define CERT_RENEWAL_PROP_ID
Definition: wincrypt.h:2724
static const context_vtbl_t crl_vtbl
Definition: crl.c:40
#define CRYPT_E_NO_MATCH
Definition: winerror.h:3012
CERT_NAME_BLOB Issuer
Definition: wincrypt.h:497
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1577
#define CALG_SHA1
Definition: wincrypt.h:1807
LONG WINAPI CertVerifyCRLTimeValidity(LPFILETIME pTimeToVerify, PCRL_INFO pCrlInfo)
Definition: crl.c:776
#define CERT_STORE_DELTA_CRL_FLAG
Definition: wincrypt.h:3465
BOOL WINAPI CertAddCRLContextToStore(HCERTSTORE hCertStore, PCCRL_CONTEXT pCrlContext, DWORD dwAddDisposition, PCCRL_CONTEXT *ppStoreContext)
Definition: store.c:960
static BOOL compare_crl_existing(PCCRL_CONTEXT pCrlContext, DWORD dwType, DWORD dwFlags, const void *pvPara)
Definition: crl.c:259
_In_ DWORD dwPropId
Definition: wincrypt.h:4952
#define CRL_FIND_ISSUED_BY
Definition: wincrypt.h:2928
#define CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT
Definition: wincrypt.h:3474
_In_ PCCERT_STORE_PROV_FIND_INFO _In_ PCCRL_CONTEXT pPrevCrlContext
Definition: wincrypt.h:1306
#define szOID_AUTHORITY_KEY_IDENTIFIER2
Definition: wincrypt.h:3200
static BOOL CRLContext_SetProperty(crl_t *crl, DWORD dwPropId, DWORD dwFlags, const void *pvData)
Definition: crl.c:511
DWORD cExtension
Definition: wincrypt.h:251
#define X509_AUTHORITY_KEY_ID2
Definition: wincrypt.h:3398
VOID WINAPI CryptMemFree(LPVOID pv)
Definition: main.c:141
LPWSTR pwszURL
Definition: wincrypt.h:339
_In_ DWORD _In_ DWORD _In_ DWORD _Outptr_opt_ PCCRL_CONTEXT * ppCrlContext
Definition: wincrypt.h:5071
_In_ PCCRL_CONTEXT pCrlContext
Definition: wincrypt.h:4996
#define szOID_ISSUING_DIST_POINT
Definition: wincrypt.h:3194
GLuint res
Definition: glext.h:9613
#define CERT_SHA1_HASH_PROP_ID
Definition: wincrypt.h:2687
#define compare
static BOOL CRLContext_GetProperty(crl_t *crl, DWORD dwPropId, void *pvData, DWORD *pcbData)
Definition: crl.c:421
#define CRL_FIND_ISSUED_FOR
Definition: wincrypt.h:2930
#define CRYPT_DECODE_ALLOC_FLAG
Definition: wincrypt.h:3454
static WCHAR name2[]
Definition: record.c:35
#define CERT_SUBJECT_NAME_MD5_HASH_PROP_ID
Definition: wincrypt.h:2715
Definition: wincrypt.h:487
BOOL WINAPI CryptHashCertificate(HCRYPTPROV_LEGACY hCryptProv, ALG_ID Algid, DWORD dwFlags, const BYTE *pbEncoded, DWORD cbEncoded, BYTE *pbComputedHash, DWORD *pcbComputedHash)
Definition: cert.c:2187
#define CERT_DESCRIPTION_PROP_ID
Definition: wincrypt.h:2699
_In_ void * pvPara
Definition: wincrypt.h:6081
#define X509_CRL_DIST_POINTS
Definition: wincrypt.h:3402
#define CERT_CTL_USAGE_PROP_ID
Definition: wincrypt.h:2695
static WCHAR issuer[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1905
#define CERT_CRL_PROP_ID
PCCRL_CONTEXT WINAPI CertFindCRLInStore(HCERTSTORE hCertStore, DWORD dwCertEncodingType, DWORD dwFindFlags, DWORD dwFindType, const void *pvFindPara, PCCRL_CONTEXT pPrevCrlContext)
Definition: crl.c:287
static context_t * CRL_clone(context_t *context, WINECRYPT_CERTSTORE *store, BOOL use_link)
Definition: crl.c:42
context_t * Context_CreateLinkContext(unsigned int contextSize, context_t *linked, WINECRYPT_CERTSTORE *store)
Definition: context.c:54
static void CRL_free(context_t *context)
Definition: crl.c:32
DWORD ContextPropertyList_EnumPropIDs(CONTEXT_PROPERTY_LIST *list, DWORD id) DECLSPEC_HIDDEN
Definition: proplist.c:170
static BOOL CRLContext_GetHashProp(crl_t *crl, DWORD dwPropId, ALG_ID algID, const BYTE *toHash, DWORD toHashLen, void *pvData, DWORD *pcbData)
Definition: crl.c:406
PCCRL_CONTEXT WINAPI CertDuplicateCRLContext(PCCRL_CONTEXT pCrlContext)
Definition: crl.c:378
FILETIME ThisUpdate
Definition: wincrypt.h:498
_In_ DWORD _Out_writes_bytes_to_opt_ pcbData void _Inout_ DWORD * pcbData
Definition: wincrypt.h:4953
BYTE * pbData
Definition: wincrypt.h:197
#define CERT_PUBKEY_ALG_PARA_PROP_ID
Definition: wincrypt.h:2708
BOOL WINAPI CertFreeCRLContext(PCCRL_CONTEXT pCrlContext)
Definition: crl.c:386
PCERT_EXTENSION rgExtension
Definition: wincrypt.h:503
CRL_CONTEXT ctx