crypt32: Implement streamed encoding of an indefinite-length data message.
This commit is contained in:
parent
19956d6e97
commit
71b5ba0336
|
@ -146,10 +146,18 @@ static BOOL CRYPT_EncodeDataContentInfoHeader(CDataEncodeMsg *msg,
|
||||||
|
|
||||||
if (msg->base.streamed && msg->base.stream_info.cbContent == 0xffffffff)
|
if (msg->base.streamed && msg->base.stream_info.cbContent == 0xffffffff)
|
||||||
{
|
{
|
||||||
FIXME("unimplemented for indefinite-length encoding\n");
|
static const BYTE headerValue[] = { 0x30,0x80,0x06,0x09,0x2a,0x86,0x48,
|
||||||
header->cbData = 0;
|
0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x80,0x24,0x80 };
|
||||||
header->pbData = NULL;
|
|
||||||
ret = TRUE;
|
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
|
else
|
||||||
{
|
{
|
||||||
|
@ -197,6 +205,25 @@ static BOOL CDataEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData,
|
||||||
LocalFree(header.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)
|
if (!fFinal)
|
||||||
ret = msg->base.stream_info.pfnStreamOutput(
|
ret = msg->base.stream_info.pfnStreamOutput(
|
||||||
msg->base.stream_info.pvArg, (BYTE *)pbData, cbData,
|
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), FALSE);
|
||||||
CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
|
CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
|
||||||
CryptMsgClose(msg);
|
CryptMsgClose(msg);
|
||||||
todo_wine
|
|
||||||
check_updates("data message with indefinite length", &a3, &accum);
|
check_updates("data message with indefinite length", &a3, &accum);
|
||||||
free_updates(&accum);
|
free_updates(&accum);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue