Buffers extras retornados pelo Schannel
As informações devem ser enviadas entre o cliente e o servidor enquanto um contexto de segurança está sendo estabelecido e posteriormente porque as mensagens seguras são trocadas usando os recursos de criptografia e descriptografia fornecidos pelo Schannel. As seguintes funções são usadas para realizar estas tarefas:
O Schannel tem um conjunto bem definido de comportamentos para informações incompletas ou em excesso incluídas nos buffers de entrada para essas funções. As informações são trocadas entre o cliente e o servidor da seguinte maneira:
- A parte local interage com o Schannel chamando uma função SSPI e passando informações. Normalmente, as informações eram recebidas da parte remota.
- A função retorna um status buffers de código e saída que contêm informações.
- Dependendo do código status, os buffers de saída são enviados para a parte remota por meio de algum mecanismo de comunicação.
- A parte remota lê as informações enviadas pela parte local.
- O loop se repete, com as partes locais e remotas trocadas. (A parte remota chama uma função SSPI e passa as informações lidas na etapa anterior.)
Tudo funciona conforme o esperado quando o buffer de entrada para a função SSPI contém exatamente as informações necessárias. No entanto, devido à natureza orientada a fluxo de alguns protocolos de comunicação, isso pode não ser o caso; um bloco de informações recebidas de uma parte remota pode conter menos dados do que o necessário ou mais dados do que podem ser processados pelo Schannel em uma única chamada de função.
Se o buffer de entrada contiver poucas informações, as funções retornarão SEC_E_INCOMPLETE_MESSAGE. O chamador deve obter dados adicionais da parte remota e chamar a função novamente.
Quando os buffers de entrada contêm muitas informações, o Schannel não trata isso como um erro. A função processa o máximo de entrada possível e retorna o código status para essa atividade de processamento. Além disso, o Schannel indica a presença de informações não processadas nos buffers de entrada retornando um buffer de saída do tipo SECBUFFER_EXTRA. Testar os buffers de saída para esse tipo de buffer é a única maneira de detectar essa situação. O campo cbBuffer da estrutura de buffer extra indica quantos bytes de entrada não foram processados.
Observação
O campo pvBuffer do buffer extra não contém uma cópia dos dados em excesso.
Se você receber um buffer extra de uma função SSPI, deverá remover as informações já processadas do buffer de entrada e chamar a função novamente. O Schannel pode e geralmente retorna apenas o buffer extra e nada mais nos buffers de saída.