Compartilhar via


Função CryptVerifySignatureA (wincrypt.h)

Importante essa API foi preterida. O software novo e existente deve começar a usar APIs de Próxima Geração da Criptografia. Microsoft pode remover essa API em versões futuras.
 
A função CryptVerifySignature verifica a assinatura de um objeto de hash .

Antes de chamar essa função, CryptCreateHash deve ser chamado para criar o identificador de um objeto hash. CryptHashData ou CryptHashSessionKey é usado para adicionar dados ou chaves de sessão ao objeto hash.

Depois que CryptVerifySignature for concluído, somente CryptDestroyHash poderá ser chamado usando o identificador de de hHash.

Sintaxe

BOOL CryptVerifySignatureA(
  [in] HCRYPTHASH hHash,
  [in] const BYTE *pbSignature,
  [in] DWORD      dwSigLen,
  [in] HCRYPTKEY  hPubKey,
  [in] LPCSTR     szDescription,
  [in] DWORD      dwFlags
);

Parâmetros

[in] hHash

Um identificador para o objeto hash a ser verificado.

[in] pbSignature

O endereço dos dados de assinatura a serem verificados.

[in] dwSigLen

O número de bytes no pbSignature dados de assinatura.

[in] hPubKey

Um identificador para a chave pública a ser usado para autenticar a assinatura. Essa chave pública deve pertencer ao par de chaves que foi originalmente usado para criar a assinatura digital .

[in] szDescription

Esse parâmetro não deve mais ser usado e deve ser definido como NULL para evitar vulnerabilidades de segurança. No entanto, ainda há suporte para compatibilidade com versões anteriores no Provedor Criptográfico Base da Microsoft.

[in] dwFlags

Os valores de sinalizador a seguir são definidos.

Valor Significado
CRYPT_NOHASHOID
0x00000001
Esse sinalizador é usado com provedores RSA. Ao verificar a assinatura, o identificador de objeto hash (OID) não deverá estar presente ou verificado. Se esse sinalizador não estiver definido, o OID de hash na assinatura padrão será verificado conforme especificado na definição de DigestInfo no PKCS nº 7.
CRYPT_TYPE2_FORMAT
0x00000002
Esse sinalizador não é usado.
CRYPT_X931_FORMAT
0x00000004
Use o suporte ao X.931 para a versão compatível com FIPS 186-2 do RSA (rDSA).

Valor de retorno

Se a função for bem-sucedida, o valor retornado será VERDADEIRO.

Se a função falhar, o valor retornado será false. Para obter informações de erro estendidas, chame GetLastError.

Os códigos de erro precedidos por "NTE" são gerados pelo CSP específico que você está usando. Alguns códigos de erro possíveis seguem.

Código de retorno Descrição
ERROR_INVALID_HANDLE
Um dos parâmetros especifica um identificador que não é válido.
ERROR_INVALID_PARAMETER
Um dos parâmetros contém um valor que não é válido. Isso geralmente é um ponteiro que não é válido.
NTE_BAD_FLAGS
O parâmetro dwFlags não é zero.
NTE_BAD_HASH
O objeto hash especificado pelo parâmetro hHash não é válido.
NTE_BAD_KEY
O parâmetro hPubKey não contém um identificador para umde chave pública válido.
NTE_BAD_SIGNATURE
A assinatura não era válida. Isso pode ocorrer porque os dados em si foram alterados, a cadeia de caracteres de descrição não correspondeu ou a chave pública errada foi especificada por hPubKey.

Esse erro também poderá ser retornado se os algoritmos de hash ou assinatura não corresponderem aos usados para criar a assinatura.

NTE_BAD_UID
O contexto de do provedor de serviços criptográficos (CSP) que foi especificado quando o objeto hash foi criado não pode ser encontrado.
NTE_NO_MEMORY
O CSP ficou sem memória durante a operação.

Observações

A função CryptVerifySignature conclui o hash. Após essa chamada, não é possível adicionar mais dados ao hash. As chamadas adicionais para CryptHashData ou CryptHashSessionKey falhar. Depois que o aplicativo for concluído com o hash, CryptDestroyHash deverá ser chamado para destruir o objeto hash.

Se você gerar uma assinatura usando as APIs do .NET Framework e tentar verificá-la usando a função CryptVerifySignature, a função falhará e GetLastError retornará NTE_BAD_SIGNATURE. Isso ocorre devido aos diferentes pedidos de bytes entre a API nativa do Win32 e a API do .NET Framework.

A API de criptografia nativa usa ordem de bytes little-endian, enquanto a API do .NET Framework usa ordem de bytes big-endian. Se você estiver verificando uma assinatura gerada usando uma API do .NET Framework, deverá trocar a ordem dos bytes de assinatura antes de chamar a função CryptVerifySignature para verificar a assinatura.

Exemplos

Para obter um exemplo que usa a função CryptVerifySignature, consulte Exemplo de Programa C: assinando um hash e verificando a assinatura de hash.

Nota

O cabeçalho wincrypt.h define CryptVerifySignature como um alias que seleciona automaticamente a versão ANSI ou Unicode dessa função com base na definição da constante do pré-processador UNICODE. A combinação do uso do alias neutro de codificação com código que não é neutro em codificação pode levar a incompatibilidades que resultam em erros de compilação ou de runtime. Para obter mais informações, consulte Conventions for Function Prototypes.

Requisitos

Requisito Valor
de cliente com suporte mínimo Windows XP [somente aplicativos da área de trabalho]
servidor com suporte mínimo Windows Server 2003 [somente aplicativos da área de trabalho]
da Plataforma de Destino Windows
cabeçalho wincrypt.h
biblioteca Advapi32.lib
de DLL Advapi32.dll

Consulte também

CryptCreateHash

CryptDestroyHash

CryptHashData

CryptHashSessionKey

CryptSignHash

Funções de hash e assinatura digital