Juan Lang : crypt32: Implement CryptMsgUpdate for data messages opened to encode.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jun 29 08:14:39 CDT 2007


Module: wine
Branch: master
Commit: 74bf713be79c40be97c37f2a83257e04447300e7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=74bf713be79c40be97c37f2a83257e04447300e7

Author: Juan Lang <juan.lang at gmail.com>
Date:   Thu Jun 28 17:14:02 2007 -0700

crypt32: Implement CryptMsgUpdate for data messages opened to encode.

---

 dlls/crypt32/msg.c       |   53 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/crypt32/tests/msg.c |    8 -------
 2 files changed, 53 insertions(+), 8 deletions(-)

diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index c701107..b88694a 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -58,8 +58,57 @@ static inline void CryptMsgBase_Init(CryptMsgBase *msg, DWORD dwFlags,
 typedef struct _CDataEncodeMsg
 {
     CryptMsgBase base;
+    DWORD        bare_content_len;
+    LPBYTE       bare_content;
 } CDataEncodeMsg;
 
+static const BYTE empty_data_content[] = { 0x04,0x00 };
+
+static void CDataEncodeMsg_Close(HCRYPTMSG hCryptMsg)
+{
+    CDataEncodeMsg *msg = (CDataEncodeMsg *)hCryptMsg;
+
+    if (msg->bare_content != empty_data_content)
+        LocalFree(msg->bare_content);
+}
+
+static BOOL CDataEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData,
+ DWORD cbData, BOOL fFinal)
+{
+    CDataEncodeMsg *msg = (CDataEncodeMsg *)hCryptMsg;
+    BOOL ret = FALSE;
+
+    if (msg->base.finalized)
+        SetLastError(CRYPT_E_MSG_ERROR);
+    else if (!fFinal)
+    {
+        if (msg->base.open_flags & CMSG_DETACHED_FLAG)
+            SetLastError(E_INVALIDARG);
+        else
+            SetLastError(CRYPT_E_MSG_ERROR);
+    }
+    else
+    {
+        msg->base.finalized = TRUE;
+        if (!cbData)
+            SetLastError(E_INVALIDARG);
+        else
+        {
+            CRYPT_DATA_BLOB blob = { cbData, (LPBYTE)pbData };
+
+            /* data messages don't allow non-final updates, don't bother
+             * checking whether data already exist, they can't.
+             */
+            ret = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_OCTET_STRING,
+             &blob, CRYPT_ENCODE_ALLOC_FLAG, NULL, &msg->bare_content,
+             &msg->bare_content_len);
+            if (ret && msg->base.stream_info)
+                FIXME("stream info unimplemented\n");
+        }
+    }
+    return ret;
+}
+
 static HCRYPTMSG CDataEncodeMsg_Open(DWORD dwFlags, const void *pvMsgEncodeInfo,
  LPSTR pszInnerContentObjID, PCMSG_STREAM_INFO pStreamInfo)
 {
@@ -75,6 +124,10 @@ static HCRYPTMSG CDataEncodeMsg_Open(DWORD dwFlags, const void *pvMsgEncodeInfo,
     if (msg)
     {
         CryptMsgBase_Init((CryptMsgBase *)msg, dwFlags, pStreamInfo);
+        msg->base.close = CDataEncodeMsg_Close;
+        msg->base.update = CDataEncodeMsg_Update;
+        msg->bare_content_len = sizeof(empty_data_content);
+        msg->bare_content = (LPBYTE)empty_data_content;
     }
     return (HCRYPTMSG)msg;
 }
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index df5e83f..03d0abf 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -309,17 +309,14 @@ static void test_data_msg_update(void)
     /* Can't update a message that wasn't opened detached with final = FALSE */
     SetLastError(0xdeadbeef);
     ret = CryptMsgUpdate(msg, NULL, 0, FALSE);
-    todo_wine
     ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR,
      "Expected CRYPT_E_MSG_ERROR, got %x\n", GetLastError());
     /* Updating it with final = TRUE succeeds */
     ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
-    todo_wine
     ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
     /* Any subsequent update will fail, as the last was final */
     SetLastError(0xdeadbeef);
     ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
-    todo_wine
     ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR,
      "Expected CRYPT_E_MSG_ERROR, got %x\n", GetLastError());
     CryptMsgClose(msg);
@@ -329,7 +326,6 @@ static void test_data_msg_update(void)
     /* Can't update a message with no data */
     SetLastError(0xdeadbeef);
     ret = CryptMsgUpdate(msg, NULL, 0, TRUE);
-    todo_wine {
     ok(!ret && GetLastError() == E_INVALIDARG,
      "Expected E_INVALIDARG, got %x\n", GetLastError());
     /* Curiously, a valid update will now fail as well, presumably because of
@@ -338,7 +334,6 @@ static void test_data_msg_update(void)
     ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
     ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR,
      "Expected CRYPT_E_MSG_ERROR, got %x\n", GetLastError());
-    }
     CryptMsgClose(msg);
 
     msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG,
@@ -346,16 +341,13 @@ static void test_data_msg_update(void)
     /* Dont appear to be able to update CMSG-DATA with non-final updates */
     SetLastError(0xdeadbeef);
     ret = CryptMsgUpdate(msg, NULL, 0, FALSE);
-    todo_wine
     ok(!ret && GetLastError() == E_INVALIDARG,
      "Expected E_INVALIDARG, got %x\n", GetLastError());
     SetLastError(0xdeadbeef);
     ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE);
-    todo_wine
     ok(!ret && GetLastError() == E_INVALIDARG,
      "Expected E_INVALIDARG, got %x\n", GetLastError());
     ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
-    todo_wine
     ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
     CryptMsgClose(msg);
 }




More information about the wine-cvs mailing list