Schannel 返回的额外缓冲区
必须在客户端和服务器之间发送信息,同时建立 安全上下文 之后,因为安全消息是使用 Schannel 提供的加密和解密功能交换的。 以下函数用于完成这些任务:
Schannel 具有一组定义完善的行为,用于这些函数的输入缓冲区中包含的不完整或多余的信息。 以下列方式在客户端和服务器之间交换信息:
- 本地方通过调用 SSPI 函数并传入信息来与 Schannel 交互。 通常,从远程方接收信息。
- 该函数返回状态代码和包含信息的输出缓冲区。
- 根据状态代码,输出缓冲区通过某种通信机制发送到远程方。
- 远程方读取本地方发送的信息。
- 循环重复,本地和远程方交换。 (远程方调用 SSPI 函数,并传入上一步中读取的信息。
当 SSPI 函数的输入缓冲区包含所需的信息时,一切都按预期工作。 但是,由于某些通信协议的流导向性,这种情况可能并非如此:从远程方接收的信息块可能包含的数据少于所需数据,或者单个函数调用中的 Schannel 可以处理的数据多。
如果输入缓冲区包含的信息太少,函数将返回SEC_E_INCOMPLETE_MESSAGE。 调用方必须从远程方获取其他数据,然后再次调用该函数。
当输入缓冲区包含太多信息时,Schannel 不会将此视为错误。 该函数处理尽可能多的输入,并返回该处理活动的状态代码。 此外,Schannel 通过返回类型为 SECBUFFER_EXTRA 的输出缓冲区,指示输入缓冲区中是否存在未处理的信息。 测试此类缓冲区的输出缓冲区是检测这种情况的唯一方法。 额外缓冲区结构的 cbBuffer 字段指示未处理输入的字节数。
注意
额外缓冲区的 pvBuffer 字段不包含多余的数据的副本。
如果从 SSPI 函数收到额外的缓冲区,则必须从输入缓冲区中删除已处理的信息,然后再次调用该函数。 Schannel 通常只能返回额外的缓冲区,并且输出缓冲区中没有其他任何内容。