Контексты потока

Контексты потоков обрабатывают безопасные потоковые протоколы, такие как SSL или PCT. В интересах совместного использования одного интерфейса и аналогичного управления учетными данными SSPI обеспечивает поддержку контекстов потока. Протокол безопасности включает в себя как схему проверки подлинности потока, так и форматы записей.

Для обеспечения потоковых протоколов пакеты безопасности , поддерживающие контексты потоков, имеют следующие характеристики процесса:

  • Пакет задает флаг SECPKG_FLAG_STREAM, чтобы указать, что он поддерживает семантику потока.

  • Транспортные приложения запрашивают семантику потока, устанавливая флаги ISC_REQ_STREAM и ASC_REQ_STREAM в вызовах функций InitializeSecurityContext (General) и AcceptSecurityContext (General).

  • Приложение вызывает функцию QueryContextAttributes (General) со структурой SecPkgContext_StreamSizes , чтобы запросить в контексте безопасности количество буферов для предоставления и размеров, которые необходимо зарезервировать для заголовков или трейлеров.

  • Приложение предоставляет дескрипторы буфера, которые можно сэкономить во время фактической обработки данных. Задав семантику потока, вызывающий объект указывает на готовность выполнить дополнительную обработку, чтобы пакет безопасности смог обработать блокировку сообщений. По сути, для функций MakeSignature и VerifySignature вызывающий объект передает список буферов. При получении сообщения из канала, ориентированного на поток (например, TCP-порт), вызывающий объект передает список буфера следующим образом.

    Буфер Длина Тип буфера
    1 Длина сообщения SECBUFFER_DATA
    2 0 SECBUFFER_EMPTY
    3 0 SECBUFFER_EMPTY
    4 0 SECBUFFER_EMPTY
    5 0 SECBUFFER_EMPTY

     

    Затем пакет безопасности работает с большим двоичным объектом. Если функция возвращается успешно, список буферов выглядит следующим образом.

    Буфер Длина Тип буфера
    1 Длина заголовка SECBUFFER_STREAM_HEADER
    2 Длина данных SECBUFFER_DATA
    3 Длина трейлера SECBUFFER_STREAM_TRAILER
    4 0 SECBUFFER_EMPTY
    5 0 SECBUFFER_EMPTY

     

    Пакет также мог вернуть буфер No 4 с длиной x и типом буфера SECBUFFER_EXTRA что указывает, что данные в этом буфере являются частью следующей записи и еще не обработаны. И наоборот, если функция message возвращает код ошибки SEC_E_INCOMPLETE_MESSAGE, список возвращаемых буферов будет выглядеть следующим образом.

    Буфер Длина Тип буфера
    1 x SECBUFFER_MISSING

     

    Это означает, что для обработки записи требовалось больше данных. В отличие от большинства ошибок, возвращаемых функцией сообщений, этот тип буфера не указывает на компрометацию контекста. Вместо этого он указывает, что требуется больше данных. Пакеты безопасности не должны обновлять свое состояние в этом условии.

    Аналогичным образом, на стороне отправителя связи вызывающий объект может вызвать функцию MakeSignature . Пакету безопасности может потребоваться перераспределить буфер или скопировать все вокруг. Вызывающий объект может быть более эффективным, предоставив список буферов следующим образом.

    Буфер Длина Тип
    1 Длина заголовка SECBUFFER_STREAM_HEADER
    2 Длина данных SECBUFFER_DATA
    3 Длина трейлера SECBUFFER_STREAM_TRAILER

     

    Это позволяет вызывающей объекту более эффективно использовать буферы. Вызывая функцию QueryContextAttributes для определения объема резервируемого пространства перед вызовом MakeSignature, операция становится более эффективной для приложения и пакета безопасности.