Schannel 返回的额外缓冲区

在建立 安全上下文 时,必须在客户端和服务器之间发送信息,因为安全消息是使用 Schannel 提供的加密和解密功能交换的。 以下函数用于完成这些任务:

Schannel 针对这些函数的输入缓冲区中包含的不完整或过多信息,具有一组定义完善的行为。 客户端和服务器之间按以下方式交换信息:

  1. 本地方通过调用 SSPI 函数并传入信息来与 Schannel 交互。 通常,信息是从远程方收到的。
  2. 函数返回状态代码和包含信息的输出缓冲区。
  3. 根据状态代码,输出缓冲区通过某种通信机制发送到远程一方。
  4. 远程方读取本地方发送的信息。
  5. 循环重复,本地和远程方交换。 (远程方调用 SSPI 函数,并传入在上一步中读取的信息。)

当 SSPI 函数的输入缓冲区完全包含所需的信息时,一切按预期工作。 但是,由于某些通信协议的面向流的性质,这种情况可能并非如此:从远程方接收的信息块可能包含的数据少于所需的数据,也可能包含比 Schannel 在单个函数调用中可以处理的数据多。

如果输入缓冲区包含的信息太少,则函数返回SEC_E_INCOMPLETE_MESSAGE。 调用方必须从远程方获取其他数据,然后再次调用函数。

当输入缓冲区包含过多的信息时,Schannel 不会将此视为错误。 函数处理尽可能多的输入,并返回该处理活动的状态代码。 此外,Schannel 通过返回类型为 SECBUFFER_EXTRA 的输出缓冲区来指示输入缓冲区中是否存在未处理的信息。 测试此类缓冲区的输出缓冲区是检测这种情况的唯一方法。 额外缓冲区结构的 cbBuffer 字段指示未处理的输入字节数。

注意

额外缓冲区的 pvBuffer 字段不包含多余数据的副本。

 

如果从 SSPI 函数收到额外的缓冲区,则必须从输入缓冲区中删除已处理的信息,然后再次调用该函数。 Schannel 可以并且通常只返回额外的缓冲区,而输出缓冲区中没有其他任何内容。