Compartilhar via


Usando SecBufferDesc e SecBuffer

A comunicação geralmente envolve quantidades potencialmente grandes de dados ou dados de comprimento desconhecido. O envio e o recebimento de dados são feitos de forma semelhante ou idêntica em ambos os casos. Para lidar com comprimento desconhecido e quantidades potencialmente grandes de dados, a comunicação SSPI é feita usando duas estruturas, SecBufferDesc e SecBuffer.

Uma estrutura SecBufferDesc é um contêiner para uma matriz de estruturas SecBuffer . Uma estrutura SecBufferDesc tem os seguintes membros:

  • Número de versão
  • Número de elementos SecBuffer
  • Endereço da matriz de estruturas SecBuffer

Uma estrutura SecBuffer contém os três membros a seguir:

  • Número de bytes no buffer
  • Tipo de informação contida no item de dados
  • Os bytes em si

Uma mensagem SSPI inteira geralmente consiste em uma matriz de estruturas SecBuffer .

Os seguintes tipos de dados de buffer são definidos da seguinte maneira.

Tipo de buffer Significado
SECBUFFER_EMPTY Indefinido, substituído pela função de pacote de segurança
SECBUFFER_DATA Dados de pacote
SECBUFFER_TOKEN Token de segurança
SECBUFFER_PKG_PARAMS Parâmetros específicos do pacote
SECBUFFER_MISSING Indicador de dados ausente
SECBUFFER_EXTRA Dados extras
SECBUFFER_STREAM Dados de fluxo de segurança
SECBUFFER_STREAM_TRAILER Trailer do fluxo de segurança
SECBUFFER_STREAM_HEADER Cabeçalho do fluxo de segurança

 

Os tipos de buffer acima podem ser combinados usando uma operação OR bit a bit com qualquer um dos seguintes tipos de buffer.

Tipo de buffer Significado
SECBUFFER_ATTRMASK Mascarar atributos de segurança separando os sinalizadores de atributo do tipo de buffer.
SECBUFFER_READONLY O buffer é somente leitura

 

Antes de cada chamada para uma API SSPI que requer um parâmetro SecBufferDesc , um ou mais elementos de matriz SecBuffer são declarados e inicializados. Por exemplo, pode haver dois buffers de segurança: um que contém dados de mensagem de entrada e outro para o token de segurança opaco de saída retornado pelo pacote de segurança. A ordem dos buffers de segurança no descritor de buffer de segurança não é importante, mas cada buffer deve ser marcado com seu tipo apropriado. Uma marca somente leitura pode ser usada com qualquer buffer de entrada que não deve ser modificado pelo pacote de segurança.

O tamanho do buffer de saída que deve conter o token de segurança é importante. Um aplicativo pode encontrar o tamanho máximo do token para um pacote de segurança durante a instalação inicial. A chamada para EnumerateSecurityPackages retorna uma matriz de ponteiros para informações do pacote de segurança. A estrutura de informações do pacote de segurança contém o tamanho máximo do token para cada pacote. No exemplo, as informações estão no membro cbMaxToken da estrutura SecPkgInfo . As mesmas informações podem ser obtidas posteriormente usando QuerySecurityPackageInfo.

O aplicativo inicializa os ponteiros e os tamanhos do buffer na descrição do buffer para indicar onde os dados da mensagem e outras informações podem ser encontrados.

Para obter detalhes, consulte SecBuffer e SecBufferDesc Example Code.