Juan Lang : crypt32: Implement decoding data messages (
when opened in non-streaming mode).
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jul 16 08:23:38 CDT 2007
Module: wine
Branch: master
Commit: 76061f403b0a2491803259ef30293fcdfa6a2d7d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=76061f403b0a2491803259ef30293fcdfa6a2d7d
Author: Juan Lang <juan.lang at gmail.com>
Date: Fri Jul 13 11:47:46 2007 -0700
crypt32: Implement decoding data messages (when opened in non-streaming mode).
---
dlls/crypt32/msg.c | 19 ++++++++++++++-----
dlls/crypt32/tests/msg.c | 1 -
2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index 470bf58..854ee7c 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -607,10 +607,11 @@ HCRYPTMSG WINAPI CryptMsgOpenToEncode(DWORD dwMsgEncodingType, DWORD dwFlags,
typedef struct _CDecodeMsg
{
- CryptMsgBase base;
- DWORD type;
- HCRYPTPROV crypt_prov;
- CRYPT_DATA_BLOB msg_data;
+ CryptMsgBase base;
+ DWORD type;
+ HCRYPTPROV crypt_prov;
+ CRYPT_DATA_BLOB msg_data;
+ PCRYPT_DATA_BLOB data; /* for type == CMSG_DATA */
} CDecodeMsg;
static void CDecodeMsg_Close(HCRYPTMSG hCryptMsg)
@@ -620,6 +621,7 @@ static void CDecodeMsg_Close(HCRYPTMSG hCryptMsg)
if (msg->base.open_flags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG)
CryptReleaseContext(msg->crypt_prov, 0);
CryptMemFree(msg->msg_data.pbData);
+ LocalFree(msg->data);
}
static BOOL CDecodeMsg_CopyData(CDecodeMsg *msg, const BYTE *pbData,
@@ -654,10 +656,17 @@ static BOOL CDecodeMsg_DecodeContent(CDecodeMsg *msg, CRYPT_DER_BLOB *blob,
DWORD type)
{
BOOL ret;
+ DWORD size;
switch (type)
{
case CMSG_DATA:
+ ret = CryptDecodeObjectEx(X509_ASN_ENCODING, X509_OCTET_STRING,
+ blob->pbData, blob->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL,
+ (LPBYTE)&msg->data, &size);
+ if (ret)
+ msg->type = CMSG_DATA;
+ break;
case CMSG_HASHED:
case CMSG_ENVELOPED:
case CMSG_SIGNED:
@@ -667,7 +676,6 @@ static BOOL CDecodeMsg_DecodeContent(CDecodeMsg *msg, CRYPT_DER_BLOB *blob,
default:
{
CRYPT_CONTENT_INFO *info;
- DWORD size;
ret = CryptDecodeObjectEx(X509_ASN_ENCODING, PKCS_CONTENT_INFO,
msg->msg_data.pbData, msg->msg_data.cbData, CRYPT_DECODE_ALLOC_FLAG,
@@ -774,6 +782,7 @@ HCRYPTMSG WINAPI CryptMsgOpenToDecode(DWORD dwMsgEncodingType, DWORD dwFlags,
}
msg->msg_data.cbData = 0;
msg->msg_data.pbData = NULL;
+ msg->data = NULL;
}
return msg;
}
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 17beca1..1293070 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -1092,7 +1092,6 @@ static void test_decode_msg_update(void)
SetLastError(0xdeadbeef);
ret = CryptMsgUpdate(msg, dataEmptyContent, sizeof(dataEmptyContent),
TRUE);
- todo_wine
ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG,
"Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError());
CryptMsgClose(msg);
More information about the wine-cvs
mailing list