Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A função DecryptMessage (Schannel) descriptografa uma mensagem. Alguns pacotes não criptografam e descriptografam mensagens, mas sim executam e verificam um hash de integridade.
Use essa função com o SSP ( provedor de suporte à segurança ) 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
Você pode chamar EncryptMessage (Schannel) e DecryptMessage (Schannel) ao mesmo tempo de dois threads diferentes em um único 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 sendo criptografado ou mais de um thread estiver descriptografando, cada thread deverá obter um contexto exclusivo.
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 do SecBuffer . Um desses buffers pode ser do tipo SECBUFFER_DATA. Esse buffer contém a mensagem criptografada. A função descriptografa a mensagem criptografada em vigor, substituindo o conteúdo original de seu buffer.
Quando você usa o SSP do Schannel com contextos que não são orientados para conexão, a estrutura deve conter quatro estruturas do SecBuffer na entrada. Exatamente um buffer deve ser do tipo SECBUFFER_DATA e conter uma mensagem criptografada, que a função descriptografa no local. Os buffers restantes são usados para saída e devem ser do tipo SECBUFFER_EMPTY. Para contextos orientados à conexão, você deve fornecer um buffer de tipo SECBUFFER_DATA, conforme observado para contextos não orientados a conexão. Além disso, você deve fornecer um segundo buffer de tipo SECBUFFER_TOKEN que contém um token de segurança.
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, defina esse parâmetro como zero.
Ao usar o SSP do Schannel, defina esse parâmetro 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, não use esse parâmetro. Defina-o como NULL.
Esse parâmetro pode ser o sinalizador a seguir.
| Valor | Significado |
|---|---|
| SECQOP_WRAP_NO_ENCRYPT | A mensagem não foi criptografada, mas a função produziu um cabeçalho ou trailer. Nota: KERB_WRAP_NO_ENCRYPT tem o mesmo valor e o mesmo significado. |
Valor de retorno
Se a função verificar se a mensagem é recebida na sequência correta, ela retorna SEC_E_OK.
Se a função não conseguir descriptografar a mensagem, ela retornará um dos seguintes códigos de erro.
| Código de retorno | Descrição |
|---|---|
| SEC_E_INVALID_HANDLE | O parâmetro phContext especifica um identificador de contexto inválido. Usado com o SSP do Schannel. |
| SEC_E_INVALID_TOKEN | Os buffers são do tipo errado ou nenhum buffer do tipo SECBUFFER_DATA é encontrado. Usado com o SSP do Schannel. |
| SEC_E_MESSAGE_ALTERED | A mensagem é alterada. Usado com o SSP do Schannel. |
| SEC_E_OUT_OF_SEQUENCE | A mensagem não é recebida na sequência correta. |
| SEC_I_CONTEXT_EXPIRED | O remetente da mensagem termina usando a conexão e inicia um desligamento. Para obter informações sobre como iniciar ou reconhecer um desligamento, consulte desligar umde 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 inicia um desligamento. Retorne ao loop de negociação e chame AcceptSecurityContext (Schannel) ou InitializeSecurityContext (Schannel), passando o mesmo buffer que modificado por DecryptMessage, garantindo que o tipo SecBuffer esteja definido como SECBUFFER_TOKEN. |
Observações
Às vezes, um aplicativo lê dados da parte remota, tenta descriptografá-los usando DecryptMessage (Schannel) e descobre que DecryptMessage (Schannel) é bem-sucedido, mas os buffers de saída estão vazios. Esse comportamento é normal e os aplicativos devem ser capazes de lidar com ele.
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 desligar umde Conexão Schannel.
Se você estiver usando o TLS 1.0, talvez seja necessário chamar essa função várias vezes, ajustando o buffer de entrada em cada chamada, para descriptografar uma mensagem inteira.
A função DecryptMessage (Schannel) retorna SEC_I_RENEGOTIATE quando recebe uma mensagem de protocolo TLS pós-handshake diferente dos dados do aplicativo. Depois que DecryptMessage (Schannel) retorna SEC_I_RENEGOTIATE, outras chamadas EncryptMessage() e DecryptMessage() falham com SEC_E_CONTEXT_EXPIRED. Um aplicativo lida com essa situação chamando AcceptSecurityContext (Schannel) (lado do servidor) ou InitializeSecurityContext (Schannel) (lado do cliente) e passando o mesmo buffer que modificado por DecryptMessage, garantindo que o SecBuffer tipo esteja definido como SECBUFFER_TOKEN. Observe que DecryptMessage nem sempre retorna um SECBUFFER_EXTRA buffer quando SEC_I_RENEGOTIATE é retornado. Depois que essa chamada inicial retornar um valor, prossiga como se seu aplicativo estivesse criando uma nova conexão. Em seguida, o aplicativo pode continuar chamando EncryptMessage() e DecryptMessage(). Para obter mais informações, consulte Criando um contexto de segurança Schannel.
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] |
| Cabeçalho | Sspi.h (inclui Security.h) |
| Biblioteca | Secur32.lib |
| DLL | Secur32.dll |