Juan Lang : crypt32: Implement streamed encoding of an indefinite-length data message.

Alexandre Julliard julliard at winehq.org
Wed Sep 19 08:16:17 CDT 2007


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Tue Sep 18 09:21:08 2007 -0700

crypt32: Implement streamed encoding of an indefinite-length data message.

---

 dlls/crypt32/msg.c       |   35 +++++++++++++++++++++++++++++++----
 dlls/crypt32/tests/msg.c |    1 -
 2 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index baa6a29..1a96205 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -146,10 +146,18 @@ static BOOL CRYPT_EncodeDataContentInfoHeader(CDataEncodeMsg *msg,
 
     if (msg->base.streamed && msg->base.stream_info.cbContent == 0xffffffff)
     {
-        FIXME("unimplemented for indefinite-length encoding\n");
-        header->cbData = 0;
-        header->pbData = NULL;
-        ret = TRUE;
+        static const BYTE headerValue[] = { 0x30,0x80,0x06,0x09,0x2a,0x86,0x48,
+         0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x80,0x24,0x80 };
+
+        header->pbData = LocalAlloc(0, sizeof(headerValue));
+        if (header->pbData)
+        {
+            header->cbData = sizeof(headerValue);
+            memcpy(header->pbData, headerValue, sizeof(headerValue));
+            ret = TRUE;
+        }
+        else
+            ret = FALSE;
     }
     else
     {
@@ -197,6 +205,25 @@ static BOOL CDataEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData,
                     LocalFree(header.pbData);
                 }
             }
+            /* Curiously, every indefinite-length streamed update appears to
+             * get its own tag and length, regardless of fFinal.
+             */
+            if (msg->base.stream_info.cbContent == 0xffffffff)
+            {
+                BYTE *header;
+                DWORD headerLen;
+
+                ret = CRYPT_EncodeContentLength(X509_ASN_ENCODING, NULL,
+                 &cbData, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&header,
+                 &headerLen);
+                if (ret)
+                {
+                    ret = msg->base.stream_info.pfnStreamOutput(
+                     msg->base.stream_info.pvArg, header, headerLen,
+                     FALSE);
+                    LocalFree(header);
+                }
+            }
             if (!fFinal)
                 ret = msg->base.stream_info.pfnStreamOutput(
                  msg->base.stream_info.pvArg, (BYTE *)pbData, cbData,
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 68487a5..711677b 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -659,7 +659,6 @@ static void test_data_msg_encoding(void)
     CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE);
     CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
     CryptMsgClose(msg);
-    todo_wine
     check_updates("data message with indefinite length", &a3, &accum);
     free_updates(&accum);
 }




More information about the wine-cvs mailing list