Commit 71b5ba03 authored by Juan Lang's avatar Juan Lang Committed by Alexandre Julliard

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

parent 19956d6e
......@@ -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,
......
......@@ -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);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment