Hans Leidekker : cryptnet: Add support for base64 encoded certificates, CRLs and CTLs in CryptRetrieveObjectByUrl.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Dec 9 15:35:50 CST 2014
Module: wine
Branch: master
Commit: 5e6490a835fff0d2ebe5ee78e04276757143f0b3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5e6490a835fff0d2ebe5ee78e04276757143f0b3
Author: Hans Leidekker <hans at codeweavers.com>
Date: Tue Dec 9 12:44:00 2014 +0100
cryptnet: Add support for base64 encoded certificates, CRLs and CTLs in CryptRetrieveObjectByUrl.
---
dlls/cryptnet/cryptnet_main.c | 53 +++++++++++++++++++++++++++++++++++++------
1 file changed, 46 insertions(+), 7 deletions(-)
diff --git a/dlls/cryptnet/cryptnet_main.c b/dlls/cryptnet/cryptnet_main.c
index df9eb49..90057d9 100644
--- a/dlls/cryptnet/cryptnet_main.c
+++ b/dlls/cryptnet/cryptnet_main.c
@@ -1184,10 +1184,27 @@ static BOOL WINAPI CRYPT_CreateBlob(LPCSTR pszObjectOid,
typedef BOOL (WINAPI *AddContextToStore)(HCERTSTORE hCertStore,
const void *pContext, DWORD dwAddDisposition, const void **ppStoreContext);
+static BOOL decode_base64_blob( const CRYPT_DATA_BLOB *in, CRYPT_DATA_BLOB *out )
+{
+ BOOL ret;
+ DWORD len = in->cbData;
+
+ while (len && !in->pbData[len - 1]) len--;
+ if (!CryptStringToBinaryA( (char *)in->pbData, len, CRYPT_STRING_BASE64_ANY,
+ NULL, &out->cbData, NULL, NULL )) return FALSE;
+
+ if (!(out->pbData = CryptMemAlloc( out->cbData ))) return FALSE;
+ ret = CryptStringToBinaryA( (char *)in->pbData, len, CRYPT_STRING_BASE64_ANY,
+ out->pbData, &out->cbData, NULL, NULL );
+ if (!ret) CryptMemFree( out->pbData );
+ return ret;
+}
+
static BOOL CRYPT_CreateContext(const CRYPT_BLOB_ARRAY *pObject,
DWORD dwExpectedContentTypeFlags, AddContextToStore addFunc, void **ppvContext)
{
BOOL ret = TRUE;
+ CRYPT_DATA_BLOB blob;
if (!pObject->cBlob)
{
@@ -1197,9 +1214,20 @@ static BOOL CRYPT_CreateContext(const CRYPT_BLOB_ARRAY *pObject,
}
else if (pObject->cBlob == 1)
{
- if (!CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &pObject->rgBlob[0],
- dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL,
- NULL, NULL, NULL, NULL, (const void **)ppvContext))
+ if (decode_base64_blob(&pObject->rgBlob[0], &blob))
+ {
+ ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
+ dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY, 0,
+ NULL, NULL, NULL, NULL, NULL, (const void **)ppvContext);
+ CryptMemFree(blob.pbData);
+ }
+ else
+ {
+ ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &pObject->rgBlob[0],
+ dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY, 0,
+ NULL, NULL, NULL, NULL, NULL, (const void **)ppvContext);
+ }
+ if (!ret)
{
SetLastError(CRYPT_E_NO_MATCH);
ret = FALSE;
@@ -1217,10 +1245,21 @@ static BOOL CRYPT_CreateContext(const CRYPT_BLOB_ARRAY *pObject,
for (i = 0; i < pObject->cBlob; i++)
{
- if (CryptQueryObject(CERT_QUERY_OBJECT_BLOB,
- &pObject->rgBlob[i], dwExpectedContentTypeFlags,
- CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL, NULL, NULL, NULL,
- NULL, &context))
+ if (decode_base64_blob(&pObject->rgBlob[i], &blob))
+ {
+ ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
+ dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY,
+ 0, NULL, NULL, NULL, NULL, NULL, &context);
+ CryptMemFree(blob.pbData);
+ }
+ else
+ {
+ ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB,
+ &pObject->rgBlob[i], dwExpectedContentTypeFlags,
+ CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL, NULL, NULL, NULL,
+ NULL, &context);
+ }
+ if (ret)
{
if (!addFunc(store, context, CERT_STORE_ADD_ALWAYS, NULL))
ret = FALSE;
More information about the wine-cvs
mailing list