Использование SecBufferDesc и SecBuffer
Связь часто включает в себя потенциально большие объемы данных или данные неизвестной длины. В обоих случаях отправка и получение данных выполняются аналогичным или идентичным образом. Для работы с неизвестной длиной и потенциально большими объемами данных обмен данными по протоколу SSPI осуществляется с помощью двух структур: SecBufferDesc и SecBuffer.
Структура SecBufferDesc — это контейнер для массива структур SecBuffer . Структура SecBufferDesc состоит из следующих элементов:
Структура 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.