Juan Lang : crypt32: A decoded message'
s parameters are dependent on its type.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jul 30 08:55:38 CDT 2007
Module: wine
Branch: master
Commit: fd1e88ae61aa347e45f32e0770536f46f5e93369
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fd1e88ae61aa347e45f32e0770536f46f5e93369
Author: Juan Lang <juan.lang at gmail.com>
Date: Fri Jul 27 10:55:15 2007 -0700
crypt32: A decoded message's parameters are dependent on its type.
---
dlls/crypt32/msg.c | 61 ++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 52 insertions(+), 9 deletions(-)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index d932815..f6cddbb 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -1239,7 +1239,9 @@ typedef struct _CDecodeMsg
CryptMsgBase base;
DWORD type;
HCRYPTPROV crypt_prov;
- HCRYPTHASH hash;
+ union {
+ HCRYPTHASH hash;
+ } u;
CRYPT_DATA_BLOB msg_data;
PCONTEXT_PROPERTY_LIST properties;
} CDecodeMsg;
@@ -1250,7 +1252,12 @@ static void CDecodeMsg_Close(HCRYPTMSG hCryptMsg)
if (msg->base.open_flags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG)
CryptReleaseContext(msg->crypt_prov, 0);
- CryptDestroyHash(msg->hash);
+ switch (msg->type)
+ {
+ case CMSG_HASHED:
+ CryptDestroyHash(msg->u.hash);
+ break;
+ }
CryptMemFree(msg->msg_data.pbData);
ContextPropertyList_Free(msg->properties);
}
@@ -1479,10 +1486,9 @@ static BOOL CDecodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData,
return ret;
}
-static BOOL CDecodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
+static BOOL CDecodeHashMsg_GetParam(CDecodeMsg *msg, DWORD dwParamType,
DWORD dwIndex, void *pvData, DWORD *pcbData)
{
- CDecodeMsg *msg = (CDecodeMsg *)hCryptMsg;
BOOL ret = FALSE;
switch (dwParamType)
@@ -1508,7 +1514,7 @@ static BOOL CDecodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
break;
}
case CMSG_COMPUTED_HASH_PARAM:
- if (!msg->hash)
+ if (!msg->u.hash)
{
CRYPT_ALGORITHM_IDENTIFIER *hashAlgoID = NULL;
DWORD size = 0;
@@ -1520,7 +1526,7 @@ static BOOL CDecodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
hashAlgoID, &size);
if (ret)
algID = CertOIDToAlgId(hashAlgoID->pszObjId);
- ret = CryptCreateHash(msg->crypt_prov, algID, 0, 0, &msg->hash);
+ ret = CryptCreateHash(msg->crypt_prov, algID, 0, 0, &msg->u.hash);
if (ret)
{
CRYPT_DATA_BLOB content;
@@ -1528,7 +1534,7 @@ static BOOL CDecodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
ret = ContextPropertyList_FindProperty(msg->properties,
CMSG_CONTENT_PARAM, &content);
if (ret)
- ret = CryptHashData(msg->hash, content.pbData,
+ ret = CryptHashData(msg->u.hash, content.pbData,
content.cbData, 0);
}
CryptMemFree(hashAlgoID);
@@ -1536,7 +1542,8 @@ static BOOL CDecodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
else
ret = TRUE;
if (ret)
- ret = CryptGetHashParam(msg->hash, HP_HASHVAL, pvData, pcbData, 0);
+ ret = CryptGetHashParam(msg->u.hash, HP_HASHVAL, pvData, pcbData,
+ 0);
break;
default:
{
@@ -1553,6 +1560,42 @@ static BOOL CDecodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
return ret;
}
+static BOOL CDecodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
+ DWORD dwIndex, void *pvData, DWORD *pcbData)
+{
+ CDecodeMsg *msg = (CDecodeMsg *)hCryptMsg;
+ BOOL ret = FALSE;
+
+ switch (msg->type)
+ {
+ case CMSG_HASHED:
+ ret = CDecodeHashMsg_GetParam(msg, dwParamType, dwIndex, pvData,
+ pcbData);
+ break;
+ default:
+ switch (dwParamType)
+ {
+ case CMSG_TYPE_PARAM:
+ ret = CRYPT_CopyParam(pvData, pcbData, (const BYTE *)&msg->type,
+ sizeof(msg->type));
+ break;
+ default:
+ {
+ CRYPT_DATA_BLOB blob;
+
+ ret = ContextPropertyList_FindProperty(msg->properties, dwParamType,
+ &blob);
+ if (ret)
+ ret = CRYPT_CopyParam(pvData, pcbData, blob.pbData,
+ blob.cbData);
+ else
+ SetLastError(CRYPT_E_INVALID_MSG_TYPE);
+ }
+ }
+ }
+ return ret;
+}
+
HCRYPTMSG WINAPI CryptMsgOpenToDecode(DWORD dwMsgEncodingType, DWORD dwFlags,
DWORD dwMsgType, HCRYPTPROV hCryptProv, PCERT_INFO pRecipientInfo,
PCMSG_STREAM_INFO pStreamInfo)
@@ -1580,7 +1623,7 @@ HCRYPTMSG WINAPI CryptMsgOpenToDecode(DWORD dwMsgEncodingType, DWORD dwFlags,
msg->crypt_prov = CRYPT_GetDefaultProvider();
msg->base.open_flags &= ~CMSG_CRYPT_RELEASE_CONTEXT_FLAG;
}
- msg->hash = 0;
+ memset(&msg->u, 0, sizeof(msg->u));
msg->msg_data.cbData = 0;
msg->msg_data.pbData = NULL;
msg->properties = ContextPropertyList_Create();
More information about the wine-cvs
mailing list