Juan Lang : crypt32: Support base64-encoded context objects in CryptQueryObject.
Alexandre Julliard
julliard at winehq.org
Fri Dec 12 07:04:10 CST 2008
Module: wine
Branch: master
Commit: 626a6fe15dbf9c314370f9fea4a87168b07ed0f4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=626a6fe15dbf9c314370f9fea4a87168b07ed0f4
Author: Juan Lang <juan.lang at gmail.com>
Date: Thu Dec 11 15:42:06 2008 -0800
crypt32: Support base64-encoded context objects in CryptQueryObject.
---
dlls/crypt32/object.c | 104 ++++++++++++++++++++++++++++++------------
dlls/crypt32/tests/object.c | 2 -
2 files changed, 74 insertions(+), 32 deletions(-)
diff --git a/dlls/crypt32/object.c b/dlls/crypt32/object.c
index fcb1440..97f35f7 100644
--- a/dlls/crypt32/object.c
+++ b/dlls/crypt32/object.c
@@ -61,15 +61,46 @@ static BOOL CRYPT_ReadBlobFromFile(LPCWSTR fileName, PCERT_BLOB blob)
return ret;
}
+static BOOL CRYPT_QueryContextBlob(const CERT_BLOB *blob,
+ DWORD dwExpectedContentTypeFlags, HCERTSTORE store,
+ DWORD *contentType, const void **ppvContext)
+{
+ BOOL ret = FALSE;
+
+ if (dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_CERT)
+ {
+ ret = pCertInterface->addEncodedToStore(store, X509_ASN_ENCODING,
+ blob->pbData, blob->cbData, CERT_STORE_ADD_ALWAYS, ppvContext);
+ if (ret && contentType)
+ *contentType = CERT_QUERY_CONTENT_CERT;
+ }
+ if (!ret && (dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_CRL))
+ {
+ ret = pCRLInterface->addEncodedToStore(store, X509_ASN_ENCODING,
+ blob->pbData, blob->cbData, CERT_STORE_ADD_ALWAYS, ppvContext);
+ if (ret && contentType)
+ *contentType = CERT_QUERY_CONTENT_CRL;
+ }
+ if (!ret && (dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_CTL))
+ {
+ ret = pCTLInterface->addEncodedToStore(store, X509_ASN_ENCODING,
+ blob->pbData, blob->cbData, CERT_STORE_ADD_ALWAYS, ppvContext);
+ if (ret && contentType)
+ *contentType = CERT_QUERY_CONTENT_CTL;
+ }
+ return ret;
+}
+
static BOOL CRYPT_QueryContextObject(DWORD dwObjectType, const void *pvObject,
- DWORD dwExpectedContentTypeFlags, DWORD *pdwMsgAndCertEncodingType,
- DWORD *pdwContentType, HCERTSTORE *phCertStore, const void **ppvContext)
+ DWORD dwExpectedContentTypeFlags, DWORD dwExpectedFormatTypeFlags,
+ DWORD *pdwMsgAndCertEncodingType, DWORD *pdwContentType, DWORD *pdwFormatType,
+ HCERTSTORE *phCertStore, const void **ppvContext)
{
CERT_BLOB fileBlob;
const CERT_BLOB *blob;
HCERTSTORE store;
- DWORD contentType;
BOOL ret;
+ DWORD formatType = 0;
switch (dwObjectType)
{
@@ -91,36 +122,54 @@ static BOOL CRYPT_QueryContextObject(DWORD dwObjectType, const void *pvObject,
if (!ret)
return FALSE;
+ ret = FALSE;
store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
CERT_STORE_CREATE_NEW_FLAG, NULL);
- ret = FALSE;
- if (dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_CERT)
+ if (dwExpectedFormatTypeFlags & CERT_QUERY_FORMAT_FLAG_BINARY)
{
- ret = pCertInterface->addEncodedToStore(store, X509_ASN_ENCODING,
- blob->pbData, blob->cbData, CERT_STORE_ADD_ALWAYS, ppvContext);
+ ret = CRYPT_QueryContextBlob(blob, dwExpectedContentTypeFlags, store,
+ pdwContentType, ppvContext);
if (ret)
- contentType = CERT_QUERY_CONTENT_CERT;
+ formatType = CERT_QUERY_FORMAT_BINARY;
}
- if (!ret && (dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_CRL))
- {
- ret = pCRLInterface->addEncodedToStore(store, X509_ASN_ENCODING,
- blob->pbData, blob->cbData, CERT_STORE_ADD_ALWAYS, ppvContext);
- if (ret)
- contentType = CERT_QUERY_CONTENT_CRL;
- }
- if (!ret && (dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_CTL))
+ if (!ret &&
+ (dwExpectedFormatTypeFlags & CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED))
{
- ret = pCTLInterface->addEncodedToStore(store, X509_ASN_ENCODING,
- blob->pbData, blob->cbData, CERT_STORE_ADD_ALWAYS, ppvContext);
+ CRYPT_DATA_BLOB trimmed = { blob->cbData, blob->pbData };
+ CRYPT_DATA_BLOB decoded;
+
+ while (trimmed.cbData && !trimmed.pbData[trimmed.cbData - 1])
+ trimmed.cbData--;
+ ret = CryptStringToBinaryA((LPSTR)trimmed.pbData, trimmed.cbData,
+ CRYPT_STRING_BASE64_ANY, NULL, &decoded.cbData, NULL, NULL);
if (ret)
- contentType = CERT_QUERY_CONTENT_CTL;
+ {
+ decoded.pbData = CryptMemAlloc(decoded.cbData);
+ if (decoded.pbData)
+ {
+ ret = CryptStringToBinaryA((LPSTR)trimmed.pbData,
+ trimmed.cbData, CRYPT_STRING_BASE64_ANY, decoded.pbData,
+ &decoded.cbData, NULL, NULL);
+ if (ret)
+ {
+ ret = CRYPT_QueryContextBlob(&decoded,
+ dwExpectedContentTypeFlags, store, pdwContentType,
+ ppvContext);
+ if (ret)
+ formatType = CERT_QUERY_FORMAT_BASE64_ENCODED;
+ }
+ CryptMemFree(decoded.pbData);
+ }
+ else
+ ret = FALSE;
+ }
}
if (ret)
{
if (pdwMsgAndCertEncodingType)
*pdwMsgAndCertEncodingType = X509_ASN_ENCODING;
- if (pdwContentType)
- *pdwContentType = contentType;
+ if (pdwFormatType)
+ *pdwFormatType = formatType;
if (phCertStore)
*phCertStore = CertDuplicateStore(store);
}
@@ -509,15 +558,9 @@ BOOL WINAPI CryptQueryObject(DWORD dwObjectType, const void *pvObject,
if (dwExpectedContentTypeFlags & unimplementedTypes)
WARN("unimplemented for types %08x\n",
dwExpectedContentTypeFlags & unimplementedTypes);
- if (!(dwExpectedFormatTypeFlags & CERT_QUERY_FORMAT_FLAG_BINARY))
- {
- FIXME("unimplemented for anything but binary\n");
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
- }
+
if (pdwFormatType)
*pdwFormatType = CERT_QUERY_FORMAT_BINARY;
-
if (phCertStore)
*phCertStore = NULL;
if (phMsg)
@@ -531,8 +574,9 @@ BOOL WINAPI CryptQueryObject(DWORD dwObjectType, const void *pvObject,
(dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_CTL))
{
ret = CRYPT_QueryContextObject(dwObjectType, pvObject,
- dwExpectedContentTypeFlags, pdwMsgAndCertEncodingType, pdwContentType,
- phCertStore, ppvContext);
+ dwExpectedContentTypeFlags, dwExpectedFormatTypeFlags,
+ pdwMsgAndCertEncodingType, pdwContentType, pdwFormatType, phCertStore,
+ ppvContext);
}
if (!ret &&
(dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE))
diff --git a/dlls/crypt32/tests/object.c b/dlls/crypt32/tests/object.c
index 6e440c6..b0b95a6 100644
--- a/dlls/crypt32/tests/object.c
+++ b/dlls/crypt32/tests/object.c
@@ -152,7 +152,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());
/* The same base64-encoded cert, restricting the format types */
SetLastError(0xdeadbeef);
@@ -165,7 +164,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());
/* The same cert, base64-encoded but as a wide character string */
blob.pbData = (BYTE *)bigCertBase64W;
More information about the wine-cvs
mailing list