From 8777a83467db7f9d269123ad25e5b2783dcbcb3a Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Thu, 11 Dec 2008 17:02:13 -0800 Subject: [PATCH] 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 b55b441f8c8..202f4580655 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 e658dd6286c..911fc9f7c91 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()); }