Процесс рукопожатия TLS с помощью InitializeSecurityContext (Schannel) - PullRequest
4 голосов
/ 02 апреля 2012

Я должен реализовать процесс установления связи 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 говорит установить его на ноль?

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

1 Ответ

3 голосов
/ 03 апреля 2012

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

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

...