Процесс рукопожатия TLS с помощью InitializeSecurityContext (Schannel)

Мне нужно реализовать процесс рукопожатия TLS с использованием интерфейса SSPI.
Мое приложение реализует клиентскую сторону, и, как я увидел из здесь общий порядок действий таков:

  1. InitializeSecurityContext — первый вызов возвращает указатель на структуру SecBufferDesc.
  2. Вызов функции send(=WinSock API) с выходными буферами.
  3. Вызов функции recv
  4. Снова вызовите InitializeSecurityContext с буферами.

Объяснение MSDN об этих буферах:

«При вызовах этой функции после первоначального вызова должно быть два буфера. Первый имеет тип SECBUFFER_TOKEN и содержит токен, полученный от сервера. Второй буфер имеет тип SECBUFFER_EMPTY; установите для членов pvBuffer и cbBuffer значение ноль».

Мои вопросы:

  1. Мне нужно еще одно объяснение: что означают буферы? что содержит второй буфер? для чего они?
  2. В MSDN написано, что входной параметр TargetDataRep функции InitializeSecurityContext не используется для Schannel, но многие образцы, которые я видел, устанавливают для него значение SECURITY_NATIVE_DREP. что такое флаг SECURITY_NATIVE_DREP? почему MSDN говорит установить его на ноль?

Буду очень признателен за любую помощь.
Спасибо!.


person RRR    schedule 02.04.2012    source источник


Ответы (1)


1. SChannel дает вам уровень абстракции, позволяющий передавать буферы данных по защищенным каналам. API разработан таким образом, что когда вы отправляете часть данных, вы предоставляете два буфера данных — фактические данные (полезная нагрузка) и второй буфер, который содержит токен/контекст безопасного канала. Предполагается, что вы будете присоединять этот буфер к каждому буферу полезной нагрузки, который вы проталкиваете, например. потому что API не предназначен для хранения и управления этими данными внутри, например. с ручкой.

2. InitializeSecurityContext относится не только к пакету SChannel, в других сценариях используется этот параметр и, возможно, в примере кода у вас была возможность увидеть, что относится к другому пакету, либо скопировано оттуда, либо относится к обоим.

person Roman R.    schedule 03.04.2012
comment
благодарю вас!. 1. Не могли бы вы привести пример содержимого этих буферов во время цикла рукопожатия? (пример того, что содержимое в какой-то момент процесса будет отличным). 2. В этом образце кода MSDN SSPI(Schannel) SECURITY_NATIVE_DREP установлен. это ошибка? (Вы найдете это с помощью быстрого поиска флага SECURITY_NATIVE_DREP на этом сайте) - person RRR; 04.04.2012
comment
1 — при первом вызове InitializeSecurityContext вы предоставляете выходной пустой буфер SECBUFFER_TOKEN для хранения токена. Получив SEC_I_CONTINUE_NEEDED, вы отправляете данные, которые у вас есть в выходном буфере токена, удаленной стороне, вы получаете данные обратно в ответ и делаете еще один InitializeSecurityContext вызов, предоставляя входной SECBUFFER_TOKEN буфер с полученными данными. Если вы снова получаете результат SEC_I_CONTINUE_NEEDED, вы повторяете все это - вы отправляете данные токена удаленной стороне, получаете ответ и снова передаете его в SChannel API для продолжения инициализации. - person Roman R.; 04.04.2012
comment
2 - я не уверен, является ли SECURITY_NATIVE_DREP ошибкой или нет. Похоже, что этот флаг не требуется, и API его игнорирует. Я бы придерживался документации и удалил ее из реального кода. - person Roman R.; 04.04.2012