我正在测试我编写的一些安全套接字层通道代码。这是通过HTTP GET测试的,它从IIS请求一个大(9mb)文本文件和一个小的txt文件(19字节)。 IIS已配置了自签名证书。
我根据SSPI MSDN文档使用DecryptMessage。
https://docs.microsoft.com/en-us/windows/desktop/api/sspi/nf-sspi-decryptmessage
文档指出:
“其中至少有一个必须为SECBUFFER_DATA类型。该缓冲区包含加密的消息。加密的消息将被解密,从而覆盖其缓冲区的原始内容。”
但是事实并非如此。 “返回”两个缓冲区的BufferType等于SECBUFFER_DATA和SECBUFFER_EXTRA。我放置在结构中的数据保持不变。
SecBufferDesc message;
SecBuffer sec_buffers[ 4 ];
// Decrypt the received data.
sec_buffers[ 0 ].pvBuffer = p_Decrypt_Buffer;
sec_buffers[ 0 ].cbBuffer = v_Decrypt_Buffer_Used;
sec_buffers[ 0 ].BufferType = SECBUFFER_DATA;
sec_buffers[ 1 ].BufferType = SECBUFFER_EMPTY;
sec_buffers[ 2 ].BufferType = SECBUFFER_EMPTY;
sec_buffers[ 3 ].BufferType = SECBUFFER_EMPTY;
message.ulVersion = SECBUFFER_VERSION;
message.cBuffers = ARRAYSIZE( sec_buffers );
message.pBuffers = sec_buffers;
status = v_SSPI_Function_Table->DecryptMessage( &v_Context_Handle, &message, 0, 0 );
if( status == SEC_I_CONTEXT_EXPIRED )
break;
// Locate data and (optional) extra buffers.
for( int i = 1; i < 4; ++i )
{
if( !p_data_buffer && sec_buffers[ i ].BufferType == SECBUFFER_DATA )
p_data_buffer = &sec_buffers[ i ];
if( !p_extra_buffer && sec_buffers[ i ].BufferType == SECBUFFER_EXTRA )
p_extra_buffer = &sec_buffers[ i ];
}
当我在65536字节的套接字上执行recv时,对于上述两个文件我都得到相同的结果。第一个解密是SECBUFFER_DATA中的1个字节,是SECBUFFER_EXTRA中剩余的数据块-如果认为不完整,我将再次循环到DecryptMessage和/或从套接字中接收。更准确地说,数据缓冲区的cbBuffer值为1,转换的缓冲区文本(pvBuffer)为字母'H'。 “ H”来自HTTPS响应“ HTTP / 1.1 200 OK \ n”的第一行
我所写的作品可以成功获取两个txt文件-但是为什么只解密了1个字节?我在某个地方犯了一个错误,还是发生了什么?随后对DecryptMessage的调用可以正常工作,并顺便解密其余部分!