crypt32: Support CRYPT_DECODE_TO_BE_SIGNED_FLAG

Juan Lang juan.lang at gmail.com
Mon Sep 10 18:03:45 CDT 2007


--Juan
-------------- next part --------------
From 95e0abc7bd58e532bef1363080b8071ddb634b67 Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Mon, 10 Sep 2007 16:02:52 -0700
Subject: [PATCH] Support CRYPT_DECODE_TO_BE_SIGNED_FLAG
---
 dlls/crypt32/decode.c |   62 +++++++++++++++++++++++++++----------------------
 1 files changed, 34 insertions(+), 28 deletions(-)

diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c
index 723873a..7349f5e 100644
--- a/dlls/crypt32/decode.c
+++ b/dlls/crypt32/decode.c
@@ -893,28 +893,32 @@ static BOOL WINAPI CRYPT_AsnDecodeCert(D
  LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
  PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
 {
-    BOOL ret = TRUE;
+    BOOL ret = FALSE;
 
     TRACE("%p, %d, %08x, %p, %p, %d\n", pbEncoded, cbEncoded, dwFlags,
      pDecodePara, pvStructInfo, *pcbStructInfo);
 
     __TRY
     {
-        PCERT_SIGNED_CONTENT_INFO signedCert = NULL;
         DWORD size = 0;
 
-        /* First try to decode it as a signed cert. */
-        ret = CRYPT_AsnDecodeCertSignedContent(dwCertEncodingType, X509_CERT,
-         pbEncoded, cbEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL,
-         (BYTE *)&signedCert, &size);
-        if (ret)
+        /* Unless told not to, first try to decode it as a signed cert. */
+        if (!(dwFlags & CRYPT_DECODE_TO_BE_SIGNED_FLAG))
         {
-            size = 0;
-            ret = CRYPT_AsnDecodeCertInfo(dwCertEncodingType,
-             X509_CERT_TO_BE_SIGNED, signedCert->ToBeSigned.pbData,
-             signedCert->ToBeSigned.cbData, dwFlags, pDecodePara, pvStructInfo,
-             pcbStructInfo);
-            LocalFree(signedCert);
+            PCERT_SIGNED_CONTENT_INFO signedCert = NULL;
+
+            ret = CRYPT_AsnDecodeCertSignedContent(dwCertEncodingType,
+             X509_CERT, pbEncoded, cbEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL,
+             (BYTE *)&signedCert, &size);
+            if (ret)
+            {
+                size = 0;
+                ret = CRYPT_AsnDecodeCertInfo(dwCertEncodingType,
+                 X509_CERT_TO_BE_SIGNED, signedCert->ToBeSigned.pbData,
+                 signedCert->ToBeSigned.cbData, dwFlags, pDecodePara,
+                 pvStructInfo, pcbStructInfo);
+                LocalFree(signedCert);
+            }
         }
         /* Failing that, try it as an unsigned cert */
         if (!ret)
@@ -928,7 +932,6 @@ static BOOL WINAPI CRYPT_AsnDecodeCert(D
     __EXCEPT_PAGE_FAULT
     {
         SetLastError(STATUS_ACCESS_VIOLATION);
-        ret = FALSE;
     }
     __ENDTRY
 
@@ -1026,28 +1029,32 @@ static BOOL WINAPI CRYPT_AsnDecodeCRL(DW
  LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
  PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
 {
-    BOOL ret = TRUE;
+    BOOL ret = FALSE;
 
     TRACE("%p, %d, %08x, %p, %p, %d\n", pbEncoded, cbEncoded, dwFlags,
      pDecodePara, pvStructInfo, *pcbStructInfo);
 
     __TRY
     {
-        PCERT_SIGNED_CONTENT_INFO signedCrl = NULL;
         DWORD size = 0;
 
-        /* First try to decode it as a signed crl. */
-        ret = CRYPT_AsnDecodeCertSignedContent(dwCertEncodingType, X509_CERT,
-         pbEncoded, cbEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL,
-         (BYTE *)&signedCrl, &size);
-        if (ret)
+        /* Unless told not to, first try to decode it as a signed crl. */
+        if (!(dwFlags & CRYPT_DECODE_TO_BE_SIGNED_FLAG))
         {
-            size = 0;
-            ret = CRYPT_AsnDecodeCRLInfo(dwCertEncodingType,
-             X509_CERT_CRL_TO_BE_SIGNED, signedCrl->ToBeSigned.pbData,
-             signedCrl->ToBeSigned.cbData, dwFlags, pDecodePara,
-             pvStructInfo, pcbStructInfo);
-            LocalFree(signedCrl);
+            PCERT_SIGNED_CONTENT_INFO signedCrl = NULL;
+
+            ret = CRYPT_AsnDecodeCertSignedContent(dwCertEncodingType,
+             X509_CERT, pbEncoded, cbEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL,
+             (BYTE *)&signedCrl, &size);
+            if (ret)
+            {
+                size = 0;
+                ret = CRYPT_AsnDecodeCRLInfo(dwCertEncodingType,
+                 X509_CERT_CRL_TO_BE_SIGNED, signedCrl->ToBeSigned.pbData,
+                 signedCrl->ToBeSigned.cbData, dwFlags, pDecodePara,
+                 pvStructInfo, pcbStructInfo);
+                LocalFree(signedCrl);
+            }
         }
         /* Failing that, try it as an unsigned crl */
         if (!ret)
@@ -1061,7 +1068,6 @@ static BOOL WINAPI CRYPT_AsnDecodeCRL(DW
     __EXCEPT_PAGE_FAULT
     {
         SetLastError(STATUS_ACCESS_VIOLATION);
-        ret = FALSE;
     }
     __ENDTRY
 
-- 
1.4.1


More information about the wine-patches mailing list