crypt32(2/2): Implement decoding data messages (when opened in
non-streaming mode)
Juan Lang
juan.lang at gmail.com
Fri Jul 13 13:52:06 CDT 2007
--Juan
-------------- next part --------------
From 5e1cad12dd71fb61eb25b0398b2ee53d74788120 Mon Sep 17 00:00:00 2001
From: Juan Lang <juanlang at juan.corp.google.com>
Date: Fri, 13 Jul 2007 11:47:46 -0700
Subject: [PATCH] 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..a2590e8 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -607,10 +607,11 @@ HCRYPTMSG WINAPI CryptMsgOpenToEncode(DW
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 h
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(CDe
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(CDe
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(DW
}
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);
--
1.4.1
More information about the wine-patches
mailing list