Compartilhar via


Função DecryptMessage (Geral)

A função DecryptMessage (Geral) descriptografa uma mensagem. Alguns pacotes não criptografam e descriptografam mensagens, mas executam e marcar um hash de integridade.

O SSP ( provedor de suporte de segurança ) Digest fornece confidencialidade de criptografia e descriptografia para mensagens trocadas entre o cliente e o servidor apenas como um mecanismo SASL.

Essa função também é usada com o SSP do Schannel para sinalizar uma solicitação de um remetente de mensagem para uma renegociação (refazer) dos atributos de conexão ou para um desligamento da conexão.

Observação

EncryptMessage (Geral) e DecryptMessage (Geral) podem ser chamados ao mesmo tempo de dois threads diferentes em um contexto de SSPI ( interface de provedor de suporte de segurança ) se um thread estiver criptografando e o outro estiver descriptografando. Se mais de um thread estiver criptografando ou mais de um thread estiver descriptografando, cada thread deverá obter um contexto exclusivo.

 

Para obter informações sobre como usar essa função com um SSP específico, consulte os tópicos a seguir.

Tópico Descrição
DecryptMessage (Digest) Descriptografa uma mensagem usando Digest.
DecryptMessage (Kerberos) Descriptografa uma mensagem usando Kerberos.
DecryptMessage (Negotiate) Descriptografa uma mensagem usando Negotiate.
DecryptMessage (NTLM) Descriptografa uma mensagem usando NTLM.
DecryptMessage (Schannel) Descriptografa uma mensagem usando schannel.

 

Sintaxe

SECURITY_STATUS SEC_Entry DecryptMessage(
  _In_    PCtxtHandle    phContext,
  _Inout_ PSecBufferDesc pMessage,
  _In_    ULONG          MessageSeqNo,
  _Out_   PULONG         pfQOP
);

Parâmetros

phContext [in]

Um identificador para o contexto de segurança a ser usado para descriptografar a mensagem.

pMessage [in, out]

Um ponteiro para uma estrutura SecBufferDesc . Na entrada, a estrutura faz referência a uma ou mais estruturas SecBuffer . Um deles pode ser do tipo SECBUFFER_DATA. Esse buffer contém a mensagem criptografada. A mensagem criptografada é descriptografada no local, substituindo o conteúdo original de seu buffer.

Ao usar o Digest SSP, na entrada, a estrutura faz referência a uma ou mais estruturas SecBuffer . Um deles deve ser do tipo SECBUFFER_DATA ou SECBUFFER_STREAM e deve conter a mensagem criptografada.

Ao usar o SSP do Schannel com contextos que não são orientados à conexão, na entrada, a estrutura deve conter quatro estruturas SecBuffer . Exatamente um buffer deve ser do tipo SECBUFFER_DATA e conter uma mensagem criptografada, que é descriptografada no local. Os buffers restantes são usados para saída e devem ser do tipo SECBUFFER_EMPTY. Para contextos orientados à conexão, um buffer de tipo SECBUFFER_DATA deve ser fornecido, conforme observado para contextos não orientados para conexão. Além disso, um segundo buffer de tipo SECBUFFER_TOKEN que contém um token de segurança também deve ser fornecido.

MessageSeqNo [in]

O número de sequência esperado pelo aplicativo de transporte, se houver. Se o aplicativo de transporte não mantiver números de sequência, esse parâmetro deverá ser definido como zero.

Ao usar o Digest SSP, esse parâmetro deve ser definido como zero. O Digest SSP gerencia a numeração de sequência internamente.

Ao usar o SSP do Schannel, esse parâmetro deve ser definido como zero. O SSP do Schannel não usa números de sequência.

pfQOP [out]

Um ponteiro para uma variável do tipo ULONG que recebe sinalizadores específicos do pacote que indicam a qualidade da proteção.

Ao usar o SSP do Schannel, esse parâmetro não é usado e deve ser definido como NULL.

Esse parâmetro pode ser um dos sinalizadores a seguir.

Valor Significado
SECQOP_WRAP_NO_ENCRYPT
A mensagem não foi criptografada, mas um cabeçalho ou trailer foi produzido.
Nota: KERB_WRAP_NO_ENCRYPT tem o mesmo valor e o mesmo significado.
SIGN_ONLY
Ao usar o Digest SSP, use esse sinalizador quando o contexto de segurança estiver definido para verificar apenas a assinatura . Para obter mais informações, consulte Qualidade de proteção.

 

Valor retornado

Se a função verificar se a mensagem foi recebida na sequência correta, a função retornará SEC_E_OK.

Se a função não conseguir descriptografar a mensagem, ela retornará um dos códigos de erro a seguir.

Código de retorno Descrição
SEC_E_BUFFER_TOO_SMALL
O buffer de mensagens é muito pequeno. Usado com o Digest SSP.
SEC_E_CRYPTO_SYSTEM_INVALID
Não há suporte para a codificação escolhida para o contexto de segurança . Usado com o Digest SSP.
SEC_E_INCOMPLETE_MESSAGE
Os dados no buffer de entrada estão incompletos. O aplicativo precisa ler mais dados do servidor e chamar DecryptMessage (Geral) novamente.
SEC_E_INVALID_HANDLE
Um identificador de contexto que não é válido foi especificado no parâmetro phContext . Usado com os SSPs Digest e Schannel.
SEC_E_INVALID_TOKEN
Os buffers são do tipo errado ou nenhum buffer do tipo SECBUFFER_DATA foi encontrado. Usado com o SSP do Schannel.
SEC_E_MESSAGE_ALTERED
A mensagem foi alterada. Usado com os SSPs Digest e Schannel.
SEC_E_OUT_OF_SEQUENCE
A mensagem não foi recebida na sequência correta.
SEC_E_QOP_NOT_SUPPORTED
Não há suporte para confidencialidade nem integridade no contexto de segurança. Usado com o Digest SSP.
SEC_I_CONTEXT_EXPIRED
O remetente da mensagem terminou de usar a conexão e iniciou um desligamento. Para obter informações sobre como iniciar ou reconhecer um desligamento, consulte Desligando uma conexão Schannel. Usado com o SSP do Schannel.
SEC_I_RENEGOTIATE
A parte remota requer uma nova sequência de handshake ou o aplicativo acabou de iniciar um desligamento. Retorne ao loop de negociação e chame AcceptSecurityContext (Geral) ou InitializeSecurityContext (Geral), passando buffers de entrada vazios.
Se a função retornar um buffer do tipo SEC_BUFFER_EXTRA, isso deverá ser passado para a função AcceptSecurityContext (Geral) como um buffer de entrada.
Usado com o SSP do Schannel.
Não há suporte para renegociação no modo kernel Schannel. O chamador deve ignorar esse valor retornado ou desligar a conexão. Se o valor for ignorado, o cliente ou o servidor poderão desligar a conexão como resultado.

 

Comentários

Quando você usa o SSP do Schannel, a função DecryptMessage (Geral) retorna SEC_I_CONTEXT_EXPIRED quando o remetente da mensagem desliga a conexão. Para obter informações sobre como iniciar ou reconhecer um desligamento, consulte Desligando uma Conexão Schannel.

Quando você usa o SSP do Schannel, DecryptMessage (Geral) retorna SEC_I_RENEGOTIATE quando o remetente da mensagem deseja renegociar a conexão (contexto de segurança). Um aplicativo lida com uma renegociação solicitada chamando AcceptSecurityContext (Geral) ( lado do servidor) ou InitializeSecurityContext (geral) (lado do cliente) e passando buffers de entrada vazios. Depois que essa chamada inicial retornar um valor, prossiga como se seu aplicativo estivesse criando uma nova conexão. Para obter mais informações, consulte [Criando um contexto de segurança Schannel](creating-an-schannel-security-context.md).

Para obter informações sobre como interoperar com GSSAPI, consulte Interoperabilidade SSPI/Kerberos com GSSAPI.

Requisitos

Requisito Valor
Cliente mínimo com suporte
Windows XP [somente aplicativos da área de trabalho]
Servidor mínimo com suporte
Windows Server 2003 [somente aplicativos da área de trabalho]
parâmetro
Sspi.h (inclua Security.h)
Biblioteca
Secur32.lib
DLL
Secur32.dll

Confira também

Funções SSPI

EncryptMessage (Geral)

Secbuffer

Secbufferdesc