Сообщения канала больше, чем cbmaximummessage

У меня проблема с отправкой сообщения SChannel TLS, превышающего согласованную максимальную длину.

Когда «EncryptSend» вызывается с буфером, превышающим SecPkgContext_StreamSizes.cbMaximumMessage, часть, превышающая SecPkgContext_StreamSizes.cbMaximumMessage, не распознается сервером (или Wireshark).

0

Решение

Вы должны иметь возможность разбивать ваши данные на куски, которые меньше или равны размеру cbMaximumMessage. Например, если вы отправляете VOID * pvData из ULONG байтов cbData, то …

while(0 < cbData)
{
ULONG cbChunk = (cbData > m_Sizes.cbMaximumMessage) ? m_Sizes.cbMaximumMessage : cbData;

Message.ulVersion = SECBUFFER_VERSION;
Message.cBuffers = ARRAYSIZE(Buffers);
Message.pBuffers = Buffers;

Buffers[0].pvBuffer = m_pSendBuffer;
Buffers[0].cbBuffer = m_Sizes.cbHeader;
Buffers[0].BufferType = SECBUFFER_STREAM_HEADER;

Buffers[1].pvBuffer = m_pSendBuffer + m_Sizes.cbHeader;
Buffers[1].cbBuffer = cbChunk;
Buffers[1].BufferType = SECBUFFER_DATA;
CopyMemory(Buffers[1].pvBuffer, pvData, cbChunk);

Buffers[2].pvBuffer = m_pSendBuffer + m_Sizes.cbHeader + cbChunk;
Buffers[2].cbBuffer = m_Sizes.cbTrailer;
Buffers[2].BufferType = SECBUFFER_STREAM_TRAILER;

Buffers[3].BufferType = SECBUFFER_EMPTY;

hr = EncryptMessage(&m_hContext, &Message, 0, 0);
if(FAILED(hr))
break;

hr = pSocket->Send(m_pSendBuffer, Buffers[0].cbBuffer + cbChunk + Buffers[2].cbBuffer);
if(FAILED(hr))
break;

pvData = reinterpret_cast<PBYTE>(pvData) + cbChunk;
cbData -= cbChunk;
}

На каждой итерации цикла шифруется и отправляется фрагмент, который меньше или равен максимальному размеру. Чтобы это работало, механизм, используемый для отправки данных в сокет, вероятно, должен будет использовать стратегию буферизации в случае, если внутренний буфер сокета заполнен до предела.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]