Juan Lang : crypt32: Support wide character base64-encoded PKCS messages in CryptQueryObject.

Alexandre Julliard julliard at winehq.org
Fri Dec 12 07:04:10 CST 2008


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Thu Dec 11 17:02:13 2008 -0800

crypt32: Support wide character base64-encoded PKCS messages in CryptQueryObject.

---

 dlls/crypt32/object.c       |   40 ++++++++++++++++++++++++++++++++++++++++
 dlls/crypt32/tests/object.c |    2 --
 2 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/dlls/crypt32/object.c b/dlls/crypt32/object.c
index b55b441..202f458 100644
--- a/dlls/crypt32/object.c
+++ b/dlls/crypt32/object.c
@@ -517,6 +517,46 @@ static BOOL CRYPT_QueryMessageObject(DWORD dwObjectType, const void *pvObject,
             else
                 ret = FALSE;
         }
+        if (!ret && !(blob->cbData % sizeof(WCHAR)))
+        {
+            CRYPT_DATA_BLOB decoded;
+            LPWSTR str = (LPWSTR)blob->pbData;
+            DWORD strLen = blob->cbData / sizeof(WCHAR);
+
+            /* Try again, assuming the input string is UTF-16 base64 */
+            while (strLen && !str[strLen - 1])
+                strLen--;
+            ret = CryptStringToBinaryW(str, strLen, CRYPT_STRING_BASE64_ANY,
+             NULL, &decoded.cbData, NULL, NULL);
+            if (ret)
+            {
+                decoded.pbData = CryptMemAlloc(decoded.cbData);
+                if (decoded.pbData)
+                {
+                    ret = CryptStringToBinaryW(str, strLen,
+                     CRYPT_STRING_BASE64_ANY, decoded.pbData, &decoded.cbData,
+                     NULL, NULL);
+                    if (ret)
+                    {
+                        /* Try it first as a signed message */
+                        if (dwExpectedContentTypeFlags &
+                         CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED)
+                            ret = CRYPT_QuerySignedMessage(&decoded,
+                             pdwMsgAndCertEncodingType, pdwContentType, &msg);
+                        /* Failing that, try as an unsigned message */
+                        if (!ret && (dwExpectedContentTypeFlags &
+                         CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED))
+                            ret = CRYPT_QueryUnsignedMessage(&decoded,
+                             pdwMsgAndCertEncodingType, pdwContentType, &msg);
+                        if (ret)
+                            formatType = CERT_QUERY_FORMAT_BASE64_ENCODED;
+                    }
+                    CryptMemFree(decoded.pbData);
+                }
+                else
+                    ret = FALSE;
+            }
+        }
     }
     if (ret)
     {
diff --git a/dlls/crypt32/tests/object.c b/dlls/crypt32/tests/object.c
index e658dd6..911fc9f 100644
--- a/dlls/crypt32/tests/object.c
+++ b/dlls/crypt32/tests/object.c
@@ -202,7 +202,6 @@ static void test_query_object(void)
     ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
      CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL,
      NULL, NULL, NULL, NULL);
-    todo_wine
     ok(ret, "CryptQueryObject failed: %08x\n", GetLastError());
     SetLastError(0xdeadbeef);
     ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
@@ -214,7 +213,6 @@ static void test_query_object(void)
     ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
      CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED, 0,
      NULL, NULL, NULL, NULL, NULL, NULL);
-    todo_wine
     ok(ret, "CryptQueryObject failed: %08x\n", GetLastError());
 }
 




More information about the wine-cvs mailing list