Juan Lang : crypt32: Test and fix CryptMsgGetParam for streamed messages.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jul 10 08:02:39 CDT 2007


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Mon Jul  9 11:19:44 2007 -0700

crypt32: Test and fix CryptMsgGetParam for streamed messages.

---

 dlls/crypt32/msg.c       |   27 ++++++++++++++++-----------
 dlls/crypt32/tests/msg.c |   22 +++++++++++++++++++++-
 2 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index 7280642..7c7a8e0 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -132,19 +132,24 @@ static BOOL CDataEncodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
     switch (dwParamType)
     {
     case CMSG_CONTENT_PARAM:
-    {
-        CRYPT_CONTENT_INFO info;
-        char rsa_data[] = "1.2.840.113549.1.7.1";
-
-        info.pszObjId = rsa_data;
-        info.Content.cbData = msg->bare_content_len;
-        info.Content.pbData = msg->bare_content;
-        ret = CryptEncodeObject(X509_ASN_ENCODING, PKCS_CONTENT_INFO, &info,
-         pvData, pcbData);
+        if (msg->base.streamed)
+            SetLastError(E_INVALIDARG);
+        else
+        {
+            CRYPT_CONTENT_INFO info;
+            char rsa_data[] = "1.2.840.113549.1.7.1";
+
+            info.pszObjId = rsa_data;
+            info.Content.cbData = msg->bare_content_len;
+            info.Content.pbData = msg->bare_content;
+            ret = CryptEncodeObject(X509_ASN_ENCODING, PKCS_CONTENT_INFO, &info,
+             pvData, pcbData);
+        }
         break;
-    }
     case CMSG_BARE_CONTENT_PARAM:
-        if (!pvData)
+        if (msg->base.streamed)
+            SetLastError(E_INVALIDARG);
+        else if (!pvData)
         {
             *pcbData = msg->bare_content_len;
             ret = TRUE;
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index ed54e82..2b0bc18 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -345,6 +345,12 @@ static void test_data_msg_open(void)
 
 static const BYTE msgData[] = { 1, 2, 3, 4 };
 
+static BOOL WINAPI nop_stream_output(const void *pvArg, BYTE *pb, DWORD cb,
+ BOOL final)
+{
+    return TRUE;
+}
+
 static void test_data_msg_update(void)
 {
     HCRYPTMSG msg;
@@ -403,11 +409,12 @@ static void test_data_msg_get_param(void)
     HCRYPTMSG msg;
     DWORD size;
     BOOL ret;
+    CMSG_STREAM_INFO streamInfo = { 0, nop_stream_output, NULL };
 
     msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_DATA, NULL, NULL,
      NULL);
 
-    /* Content and bare content are always gettable */
+    /* Content and bare content are always gettable when not streaming */
     size = 0;
     ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, NULL, &size);
     ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError());
@@ -430,6 +437,19 @@ static void test_data_msg_get_param(void)
     ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE,
      "Expected CRYPT_E_INVALID_MSG_TYPE, got %x\n", GetLastError());
     CryptMsgClose(msg);
+
+    /* Can't get content or bare content when streaming */
+    msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_DATA, NULL,
+     NULL, &streamInfo);
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgGetParam(msg, CMSG_BARE_CONTENT_PARAM, 0, NULL, &size);
+    ok(!ret && GetLastError() == E_INVALIDARG,
+     "Expected E_INVALIDARG, got %x\n", GetLastError());
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, NULL, &size);
+    ok(!ret && GetLastError() == E_INVALIDARG,
+     "Expected E_INVALIDARG, got %x\n", GetLastError());
+    CryptMsgClose(msg);
 }
 
 static const BYTE dataEmptyBareContent[] = { 0x04,0x00 };




More information about the wine-cvs mailing list