流上下文

流上下文处理面向流的安全协议,例如 SSL 或 PCT。 为了共享相同的接口和类似的凭据管理,SSPI 提供对流上下文的支持。 安全协议包含流身份验证方案和记录格式。

为了提供面向流的协议,支持流上下文 的安全包 具有以下过程特征:

  • 包设置SECPKG_FLAG_STREAM标志,以指示它支持流语义。

  • 传输应用程序通过在调用 InitializeSecurityContext (General) 和 AcceptSecurityContext (General) 函数中设置ISC_REQ_STREAM 和ASC_REQ_STREAM标志来 请求流语义。

  • 应用程序使用 SecPkgContext_StreamSizes 结构调用QueryContextAttributes (General) 函数,以查询要提供的缓冲区数以及要为标头或尾部保留的大小的安全上下文

  • 应用程序在实际处理数据期间提供备用的缓冲区描述符。 通过指定流语义,调用方表示愿意执行额外的处理,以便 安全包 可以处理消息的阻塞。 实质上,对于 MakeSignatureVerifySignature 函数,调用方传入缓冲区列表。 从面向流 (的通道(如 TCP 端口) )接收消息时,调用方将传入缓冲区列表,如下所示。

    Buffer Length 缓冲区类型
    1 消息长度 SECBUFFER_DATA
    2 0 SECBUFFER_EMPTY
    3 0 SECBUFFER_EMPTY
    4 0 SECBUFFER_EMPTY
    5 0 SECBUFFER_EMPTY

     

    然后,安全包适用于 BLOB。 如果函数成功返回,则缓冲区列表如下所示。

    Buffer Length 缓冲区类型
    1 标头长度 SECBUFFER_STREAM_HEADER
    2 数据长度 SECBUFFER_DATA
    3 拖车长度 SECBUFFER_STREAM_TRAILER
    4 0 SECBUFFER_EMPTY
    5 0 SECBUFFER_EMPTY

     

    包可能还返回了长度为 x 的缓冲区 #4,缓冲区类型SECBUFFER_EXTRA指示此缓冲区中的数据是下一条记录的一部分,并且尚未处理。 相反,如果消息函数返回SEC_E_INCOMPLETE_MESSAGE错误代码,则返回的缓冲区列表将如下所示。

    Buffer Length 缓冲区类型
    1 x SECBUFFER_MISSING

     

    这表示处理记录需要更多数据。 与消息函数返回的大多数错误不同,此缓冲区类型并不指示上下文已泄露。 相反,它表示需要更多的数据。 在这种情况下,安全包 不得更新其 状态

    同样,在通信的发送方,调用方可以调用 MakeSignature 函数。 安全包可能需要重新分配缓冲区或复制内容。 通过提供如下所示的缓冲区列表,调用方可以更高效。

    Buffer Length 类型
    1 标头长度 SECBUFFER_STREAM_HEADER
    2 数据长度 SECBUFFER_DATA
    3 拖车长度 SECBUFFER_STREAM_TRAILER

     

    这允许调用方更有效地使用缓冲区。 通过调用 QueryContextAttributes 函数来确定在调用 MakeSignature 之前要保留的空间量,该操作对应用程序和安全包更有效。