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