Поделиться через


Использование SecBufferDesc и SecBuffer

Связь часто включает в себя потенциально большие объемы данных или данные неизвестной длины. В обоих случаях отправка и получение данных выполняются аналогичным или идентичным образом. Для работы с неизвестной длиной и потенциально большими объемами данных обмен данными по протоколу SSPI осуществляется с помощью двух структур: SecBufferDesc и SecBuffer.

Структура SecBufferDesc — это контейнер для массива структур SecBuffer . Структура SecBufferDesc состоит из следующих элементов:

  • номер версии;
  • Количество элементов SecBuffer
  • Адрес массива структур SecBuffer

Структура SecBuffer содержит следующие три элемента:

  • Количество байтов в буфере
  • Тип сведений, содержащихся в элементе данных
  • Сами байты

Сообщение SSPI часто состоит из массива структур SecBuffer .

Следующие типы данных буфера определяются следующим образом.

Тип буфера Значение
SECBUFFER_EMPTY Не определено, заменено функцией пакета безопасности
SECBUFFER_DATA Данные пакетов
SECBUFFER_TOKEN Маркер безопасности
SECBUFFER_PKG_PARAMS Параметры, относящиеся к пакету
SECBUFFER_MISSING Индикатор отсутствующих данных
SECBUFFER_EXTRA Дополнительные данные
SECBUFFER_STREAM Данные потока безопасности
SECBUFFER_STREAM_TRAILER Трейлер потока безопасности
SECBUFFER_STREAM_HEADER Заголовок потока безопасности

 

Приведенные выше типы буферов можно объединить с помощью побитовой операции ИЛИ с помощью любого из следующих типов буферов.

Тип буфера Значение
SECBUFFER_ATTRMASK Маскирование атрибутов безопасности путем отделения флагов атрибутов от типа буфера.
SECBUFFER_READONLY Буфер доступен только для чтения

 

Перед каждым вызовом API SSPI, которому требуется параметр SecBufferDesc , объявляется и инициализируется один или несколько элементов массива SecBuffer . Например, может существовать два буфера безопасности: один из них содержит входные данные сообщения, а другой — для выходного непрозрачного маркера безопасности, возвращаемого пакетом безопасности. Порядок буферов безопасности в дескрипторе буфера безопасности не важен, но каждый буфер должен быть помечен соответствующим типом. Тег только для чтения можно использовать с любым входным буфером, который не должен изменяться пакетом безопасности.

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

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

Дополнительные сведения см. в разделе Пример кода SecBuffer и SecBufferDesc.