Juan Lang : crypt32: Support CRYPT_DECODE_TO_BE_SIGNED_FLAG.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Sep 11 07:28:46 CDT 2007


Module: wine
Branch: master
Commit: d7115ce33c7ffb393cd6853010dd8e63ba2db88a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d7115ce33c7ffb393cd6853010dd8e63ba2db88a

Author: Juan Lang <juan.lang at gmail.com>
Date:   Mon Sep 10 16:02:52 2007 -0700

crypt32: 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(DWORD dwCertEncodingType,
  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(DWORD dwCertEncodingType,
     __EXCEPT_PAGE_FAULT
     {
         SetLastError(STATUS_ACCESS_VIOLATION);
-        ret = FALSE;
     }
     __ENDTRY
 
@@ -1026,28 +1029,32 @@ static BOOL WINAPI CRYPT_AsnDecodeCRL(DWORD dwCertEncodingType,
  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(DWORD dwCertEncodingType,
     __EXCEPT_PAGE_FAULT
     {
         SetLastError(STATUS_ACCESS_VIOLATION);
-        ret = FALSE;
     }
     __ENDTRY
 




More information about the wine-cvs mailing list