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