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:
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.