流上下文

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

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

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

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

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

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

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

     

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

    缓冲区 长度 缓冲区类型
    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错误代码,则返回的缓冲区列表如下所示。

    缓冲区 长度 缓冲区类型
    1 x SECBUFFER_MISSING

     

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

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

    缓冲区 长度 类型
    1 标头长度 SECBUFFER_STREAM_HEADER
    2 数据长度 SECBUFFER_DATA
    3 尾部长度 SECBUFFER_STREAM_TRAILER

     

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