0

我正在尝试使用 Schannel SSPI 使用套接字通过 SSL 连接发送/接收数据。我有一些问题DecryptMessage()

1) MSDN说,有时应用程序会从远程方接收数据,然后使用成功解密它,DecryptMessage()但输出数据缓冲区将为空。这是正常的,应用程序必须能够处理它。(据我了解,“空”表示 SecBuffer::cbBuffer==0)

我应该如何处理?我正在尝试创建一个(安全)srecv()函数,以替代 winsockrecv()函数。因此我不能只返回 0。因为调用应用程序会认为远程方已经关闭了连接。我应该尝试从连接中接收另一个加密块并尝试解密它吗?

2)还有另一个问题。使用 (return value = SEC_E_OK) 成功解密数据后 DecryptMessage,我试图SECBUFFER_DATA在输出缓冲区中找到一个类型缓冲区。

  PSecBuffer pDataBuf=NULL;
  for(int i = 1; i < 4; ++i) { // should I always start with 1?
    if(NULL == pDataBuf && SECBUFFER_DATA == buffers[i].BufferType) {
      pDataBuf  = buffers+i;
    }
  }

如果我没有找到数据缓冲区怎么办?我应该将其视为错误吗?还是我应该再次尝试接收加密块来解密它?(我看到了几个例子。其中一个他们正在重试接收数据,另一个他们正在报告错误)

4

1 回答 1

0
  1. 您似乎正在尝试recv为您的 Schannel 安全套接字实现复制阻塞功能。在这种情况下,您别无选择,只能返回 0。另一种方法是将回调传递给您的实现,并且仅在 时调用它SecBuffer.cbBuffer > 0

  2. 是的,总是从索引 1 开始检查剩余的缓冲区。您的 for 循环缺少对SECBUFFER_EXTRA. cbBuffer size > 0如果有额外DecryptMessage数据srecv和在将聚合返回给调用应用程序之前,为循环中收到的每个 SECBUFFER_DATA 附加 DecryptMessage 的结果。

于 2021-01-28T11:07:31.950 回答