使用 SecBufferDesc 和 SecBuffer

通信通常涉及潜在的大量数据或长度未知的数据。 在这两种情况下,发送和接收数据的方式都类似或相同。 为了处理未知长度和潜在的大量数据,SSPI 通信使用两个结构( SecBufferDescSecBuffer)来完成。

SecBufferDesc 结构是 SecBuffer 结构数组的容器。 SecBufferDesc 结构具有以下成员:

SecBuffer 结构包含以下三个成员:

  • 缓冲区中的字节数
  • 数据项中包含的信息类型
  • 字节本身

整个 SSPI 消息通常由 SecBuffer 结构的数组组成。

以下缓冲区数据类型的定义如下。

缓冲区类型 含义
SECBUFFER_EMPTY 未定义,替换为 安全包 函数
SECBUFFER_DATA 数据包数据
SECBUFFER_TOKEN 安全令牌
SECBUFFER_PKG_PARAMS 包特定的参数
SECBUFFER_MISSING 缺少数据指示器
SECBUFFER_EXTRA 额外数据
SECBUFFER_STREAM 安全流数据
SECBUFFER_STREAM_TRAILER 安全流预告片
SECBUFFER_STREAM_HEADER 安全流标头

 

上述缓冲区类型可以使用位 OR 运算与以下任一缓冲区类型结合使用。

缓冲区类型 含义
SECBUFFER_ATTRMASK 通过将属性标志与缓冲区类型分开来屏蔽安全属性。
SECBUFFER_READONLY 缓冲区为只读

 

每次调用需要 SecBufferDesc 参数的 SSPI API 之前,都会声明和初始化一个或多个 SecBuffer 数组元素。 例如,可以有两个安全缓冲区:一个包含输入消息数据,另一个用于安全包返回的输出不透明安全令牌。 安全缓冲区描述符中安全缓冲区的顺序并不重要,但每个缓冲区必须用其适当的类型进行标记。 只读标记可以与安全 不得修改的任何输入缓冲区一起使用。

预期包含安全令牌的输出缓冲区的大小非常重要。 在初始设置期间,应用程序可以找到安全包的最大令牌大小。 对 EnumerateSecurityPackages 的 调用返回指向安全包信息的指针数组。 安全包信息结构包含每个包的最大令牌大小。 在示例中,信息位于 SecPkgInfo 结构的 cbMaxToken 成员中。 稍后可以使用 QuerySecurityPackageInfo 获取相同的信息。

应用程序初始化缓冲区说明中的缓冲区指针和大小,以指示可在何处找到消息数据和其他信息。

有关详细信息,请参阅 SecBuffer 和 SecBufferDesc 示例代码