Module: wine Branch: master Commit: 76061f403b0a2491803259ef30293fcdfa6a2d7d URL: http://source.winehq.org/git/wine.git/?a=commit;h=76061f403b0a2491803259ef30...
Author: Juan Lang juan.lang@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);