Compartilhar via


Função CryptVerifyMessageSignature (wincrypt.h)

A função CryptVerifyMessageSignature verifica a assinatura de uma mensagem assinada.

Essa função não deve ser usada para verificar a assinatura de uma mensagem desanexada. Você deve usar a função CryptVerifyDetachedMessageSignature para verificar a assinatura de uma mensagem desanexada.

Sintaxe

BOOL CryptVerifyMessageSignature(
  [in]            PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
  [in]            DWORD                      dwSignerIndex,
  [in]            const BYTE                 *pbSignedBlob,
  [in]            DWORD                      cbSignedBlob,
  [out]           BYTE                       *pbDecoded,
  [in, out]       DWORD                      *pcbDecoded,
  [out, optional] PCCERT_CONTEXT             *ppSignerCert
);

Parâmetros

[in] pVerifyPara

Um ponteiro para uma estrutura CRYPT_VERIFY_MESSAGE_PARA que contém parâmetros de verificação.

[in] dwSignerIndex

O índice da assinatura desejada. Pode haver mais de uma assinatura. CryptVerifyMessageSignature pode ser chamado repetidamente, incrementando dwSignerIndex todas as vezes. Defina esse parâmetro como zero para o primeiro signatário ou se houver apenas um signatário. Se a função retornar FALSE e GetLastError retornar CRYPT_E_NO_SIGNER, a chamada anterior processou o último signatário da mensagem.

[in] pbSignedBlob

Um ponteiro para um buffer que contém a mensagem assinada.

[in] cbSignedBlob

O tamanho, em bytes, do buffer de mensagens assinado.

[out] pbDecoded

Um ponteiro para um buffer para receber a mensagem decodificada.

Esse parâmetro poderá ser NULL se a mensagem decodificada não for necessária para processamento adicional ou para definir o tamanho da mensagem para fins de alocação de memória. Para obter mais informações, consulte Recuperando dados de comprimento desconhecido.

[in, out] pcbDecoded

Um ponteiro para um valor DWORD que especifica o tamanho, em bytes, do buffer pbDecoded . Quando a função retorna, esse DWORD contém o tamanho, em bytes, da mensagem decodificada. A mensagem decodificada não será retornada se esse parâmetro for NULL.

Nota Ao processar os dados retornados, os aplicativos devem usar o tamanho real dos dados retornados. O tamanho real pode ser ligeiramente menor do que o tamanho do buffer especificado na entrada. (Na entrada, os tamanhos de buffer geralmente são especificados grandes o suficiente para garantir que os maiores dados de saída possíveis caibam no buffer.) Na saída, a variável apontada por esse parâmetro é atualizada para refletir o tamanho real dos dados copiados para o buffer.
 

[out, optional] ppSignerCert

O endereço de um ponteiro de estrutura CERT_CONTEXT que recebe o certificado do signatário. Quando terminar de usar essa estrutura, libere-a passando esse ponteiro para a função CertFreeCertificateContext . Esse parâmetro poderá ser NULL se o certificado do signatário não for necessário.

Valor retornado

Se a função for bem-sucedida, a função retornará diferente de zero. Isso não significa necessariamente que a assinatura foi verificada. No caso de uma mensagem desanexada, a variável apontada por pcbDecoded conterá zero. Nesse caso, essa função retornará diferente de zero, mas a assinatura não é verificada. Para verificar a assinatura de uma mensagem desanexada, use a função CryptVerifyDetachedMessageSignature .

Se a função falhar, ela retornará zero. Para obter informações de erro estendidas, chame GetLastError.

A tabela a seguir mostra os códigos de erro mais comumente retornados pela função GetLastError .

Código de retorno Descrição
ERROR_MORE_DATA
Se o buffer especificado pelo parâmetro pbDecoded não for grande o suficiente para manter os dados retornados, a função definirá o código ERROR_MORE_DATA e armazenará o tamanho do buffer necessário, em bytes, na variável apontada por pcbDecoded.
E_INVALIDARG
Tipos de codificação de mensagem e certificado inválidos. Atualmente, há suporte apenas para PKCS_7_ASN_ENCODING e X509_ASN_ENCODING_TYPE. CbSize inválido em *pVerifyPara.
CRYPT_E_UNEXPECTED_MSG_TYPE
Não é uma mensagem criptográfica assinada.
CRYPT_E_NO_SIGNER
A mensagem não tem nenhum signatário ou signatário para o dwSignerIndex especificado.
NTE_BAD_ALGID
A mensagem foi hash e assinada usando um algoritmo desconhecido ou sem suporte.
NTE_BAD_SIGNATURE
A assinatura da mensagem não foi verificada.
 
Nota Erros das funções chamadas CryptCreateHash, CryptHashData, CryptVerifySignature e CryptImportKey podem ser propagados para essa função.

Se a função falhar, GetLastError poderá retornar um erro de codificação/decodificação ASN.1 ( Abstract Syntax Notation One ). Para obter informações sobre esses erros, consulte Valores retornados de codificação/decodificação asn.1.

 

Comentários

Para um signatário verificado e uma mensagem, ppSignerCert é atualizado com o CERT_CONTEXT do signatário. Ele deve ser liberado chamando CertFreeCertificateContext. Caso contrário, ppSignerCert será definido como NULL.

Para uma mensagem que contém apenas certificados e CRLs, pcbDecoded é definido como NULL.

Exemplos

Para obter um exemplo que usa essa função, consulte Exemplo de programa C: assinando uma mensagem e verificando uma assinatura de mensagem.

Requisitos

   
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]
Plataforma de Destino Windows
Cabeçalho wincrypt.h
Biblioteca Crypt32.lib
DLL Crypt32.dll

Confira também

CryptSignMessage

CryptVerifyDetachedMessageSignature

Funções de mensagem simplificadas