From ccd31b4d2207f037d2ff07b67c9ed2b907ecf8ec Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Tue, 18 Sep 2007 09:21:08 -0700 Subject: [PATCH] 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_EncodeDataContentInfoH 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(HCRYPT 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); } -- 1.4.1