Commit 8777a834 authored by Juan Lang's avatar Juan Lang Committed by Alexandre Julliard

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

parent a104479d
......@@ -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)
{
......
......@@ -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());
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment