Juan Lang : crypt32: Split querying PKCS messages into helper functions.
Alexandre Julliard
julliard at winehq.org
Fri Dec 12 07:04:10 CST 2008
Module: wine
Branch: master
Commit: 62cbf426895e2ea07c517782eb493268cb66f4e6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=62cbf426895e2ea07c517782eb493268cb66f4e6
Author: Juan Lang <juan.lang at gmail.com>
Date: Thu Dec 11 16:18:47 2008 -0800
crypt32: Split querying PKCS messages into helper functions.
---
dlls/crypt32/object.c | 192 ++++++++++++++++++++++++++++--------------------
1 files changed, 112 insertions(+), 80 deletions(-)
diff --git a/dlls/crypt32/object.c b/dlls/crypt32/object.c
index 97f35f7..97f71b7 100644
--- a/dlls/crypt32/object.c
+++ b/dlls/crypt32/object.c
@@ -322,6 +322,110 @@ static BOOL CRYPT_QuerySerializedStoreObject(DWORD dwObjectType,
return ret;
}
+static BOOL CRYPT_QuerySignedMessage(const CRYPT_DATA_BLOB *blob,
+ DWORD *pdwMsgAndCertEncodingType, DWORD *pdwContentType, HCRYPTMSG *phMsg)
+{
+ DWORD encodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
+ BOOL ret = FALSE;
+ HCRYPTMSG msg;
+
+ if ((msg = CryptMsgOpenToDecode(encodingType, 0, 0, 0, NULL, NULL)))
+ {
+ ret = CryptMsgUpdate(msg, blob->pbData, blob->cbData, TRUE);
+ if (ret)
+ {
+ DWORD type, len = sizeof(type);
+
+ ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, &type, &len);
+ if (ret)
+ {
+ if (type != CMSG_SIGNED)
+ {
+ SetLastError(ERROR_INVALID_DATA);
+ ret = FALSE;
+ }
+ }
+ }
+ if (!ret)
+ {
+ CryptMsgClose(msg);
+ msg = CryptMsgOpenToDecode(encodingType, 0, CMSG_SIGNED, 0, NULL,
+ NULL);
+ if (msg)
+ {
+ ret = CryptMsgUpdate(msg, blob->pbData, blob->cbData, TRUE);
+ if (!ret)
+ {
+ CryptMsgClose(msg);
+ msg = NULL;
+ }
+ }
+ }
+ }
+ if (ret)
+ {
+ if (pdwMsgAndCertEncodingType)
+ *pdwMsgAndCertEncodingType = encodingType;
+ if (pdwContentType)
+ *pdwContentType = CERT_QUERY_CONTENT_PKCS7_SIGNED;
+ if (phMsg)
+ *phMsg = msg;
+ }
+ return ret;
+}
+
+static BOOL CRYPT_QueryUnsignedMessage(const CRYPT_DATA_BLOB *blob,
+ DWORD *pdwMsgAndCertEncodingType, DWORD *pdwContentType, HCRYPTMSG *phMsg)
+{
+ DWORD encodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
+ BOOL ret = FALSE;
+ HCRYPTMSG msg;
+
+ if ((msg = CryptMsgOpenToDecode(encodingType, 0, 0, 0, NULL, NULL)))
+ {
+ ret = CryptMsgUpdate(msg, blob->pbData, blob->cbData, TRUE);
+ if (ret)
+ {
+ DWORD type, len = sizeof(type);
+
+ ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, &type, &len);
+ if (ret)
+ {
+ if (type != CMSG_DATA)
+ {
+ SetLastError(ERROR_INVALID_DATA);
+ ret = FALSE;
+ }
+ }
+ }
+ if (!ret)
+ {
+ CryptMsgClose(msg);
+ msg = CryptMsgOpenToDecode(encodingType, 0, CMSG_DATA, 0,
+ NULL, NULL);
+ if (msg)
+ {
+ ret = CryptMsgUpdate(msg, blob->pbData, blob->cbData, TRUE);
+ if (!ret)
+ {
+ CryptMsgClose(msg);
+ msg = NULL;
+ }
+ }
+ }
+ }
+ if (ret)
+ {
+ if (pdwMsgAndCertEncodingType)
+ *pdwMsgAndCertEncodingType = encodingType;
+ if (pdwContentType)
+ *pdwContentType = CERT_QUERY_CONTENT_PKCS7_SIGNED;
+ if (phMsg)
+ *phMsg = msg;
+ }
+ return ret;
+}
+
/* Used to decode non-embedded messages */
static BOOL CRYPT_QueryMessageObject(DWORD dwObjectType, const void *pvObject,
DWORD dwExpectedContentTypeFlags, DWORD *pdwMsgAndCertEncodingType,
@@ -354,88 +458,16 @@ static BOOL CRYPT_QueryMessageObject(DWORD dwObjectType, const void *pvObject,
return FALSE;
ret = FALSE;
- /* Try it first as a PKCS content info */
- if ((dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED) ||
- (dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED))
- {
- msg = CryptMsgOpenToDecode(encodingType, 0, 0, 0, NULL, NULL);
- if (msg)
- {
- ret = CryptMsgUpdate(msg, blob->pbData, blob->cbData, TRUE);
- if (ret)
- {
- DWORD type, len = sizeof(type);
-
- ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, &type, &len);
- if (ret)
- {
- if ((dwExpectedContentTypeFlags &
- CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED))
- {
- if (type != CMSG_SIGNED)
- {
- SetLastError(ERROR_INVALID_DATA);
- ret = FALSE;
- }
- else if (pdwContentType)
- *pdwContentType = CERT_QUERY_CONTENT_PKCS7_SIGNED;
- }
- else if ((dwExpectedContentTypeFlags &
- CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED))
- {
- if (type != CMSG_DATA)
- {
- SetLastError(ERROR_INVALID_DATA);
- ret = FALSE;
- }
- else if (pdwContentType)
- *pdwContentType = CERT_QUERY_CONTENT_PKCS7_UNSIGNED;
- }
- }
- }
- if (!ret)
- {
- CryptMsgClose(msg);
- msg = NULL;
- }
- }
- }
- /* Failing that, try explicitly typed messages */
- if (!ret &&
- (dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED))
- {
- msg = CryptMsgOpenToDecode(encodingType, 0, CMSG_SIGNED, 0, NULL, NULL);
- if (msg)
- {
- ret = CryptMsgUpdate(msg, blob->pbData, blob->cbData, TRUE);
- if (!ret)
- {
- CryptMsgClose(msg);
- msg = NULL;
- }
- }
- if (msg && pdwContentType)
- *pdwContentType = CERT_QUERY_CONTENT_PKCS7_SIGNED;
- }
+ /* Try it first as a signed message */
+ if (dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED)
+ ret = CRYPT_QuerySignedMessage(blob, pdwMsgAndCertEncodingType,
+ pdwContentType, &msg);
+ /* Failing that, try as an unsigned message */
if (!ret &&
(dwExpectedContentTypeFlags & CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED))
- {
- msg = CryptMsgOpenToDecode(encodingType, 0, CMSG_DATA, 0, NULL, NULL);
- if (msg)
- {
- ret = CryptMsgUpdate(msg, blob->pbData, blob->cbData, TRUE);
- if (!ret)
- {
- CryptMsgClose(msg);
- msg = NULL;
- }
- }
- if (msg && pdwContentType)
- *pdwContentType = CERT_QUERY_CONTENT_PKCS7_UNSIGNED;
- }
- if (pdwMsgAndCertEncodingType)
- *pdwMsgAndCertEncodingType = encodingType;
- if (msg)
+ ret = CRYPT_QueryUnsignedMessage(blob, pdwMsgAndCertEncodingType,
+ pdwContentType, &msg);
+ if (ret)
{
if (phMsg)
*phMsg = msg;
More information about the wine-cvs
mailing list