crypt32: Support wide character base64-encoded PKCS messages in CryptQueryObject.
This commit is contained in:
parent
a104479da1
commit
8777a83467
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue