Função CryptDuplicateHash (wincrypt.h)

A função CryptDuplicateHash faz uma cópia exata de um hash para o ponto em que a duplicação é feita. O hash duplicado inclui o estado do hash.

Um hash pode ser criado por peça. A função CryptDuplicateHash pode ser usada para criar hashes separados de dois conteúdos diferentes que começam com o mesmo conteúdo.

Sintaxe

BOOL CryptDuplicateHash(
  [in]  HCRYPTHASH hHash,
  [in]  DWORD      *pdwReserved,
  [in]  DWORD      dwFlags,
  [out] HCRYPTHASH *phHash
);

Parâmetros

[in] hHash

Identificador do hash a ser duplicado.

[in] pdwReserved

Reservado para uso futuro e deve ser zero.

[in] dwFlags

Reservado para uso futuro e deve ser zero.

[out] phHash

Endereço do identificador do hash duplicado. Quando terminar de usar o hash, solte o identificador chamando a função CryptDestroyHash .

Retornar valor

Se a função for bem-sucedida, a função retornará TRUE.

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

O código de erro precedido por "NTE" é gerado pelo CSP ( provedor de serviços criptográficos ) específico que você está usando. Alguns códigos de erro possíveis seguem.

Código de retorno Descrição
ERROR_CALL_NOT_IMPLEMENTED
Como essa é uma nova função, os CSPs existentes não podem implementá-la. Esse erro será retornado se o CSP não der suporte a essa função.
ERROR_INVALID_PARAMETER
Um dos parâmetros contém um valor que não é válido. Geralmente, esse é um ponteiro que não é válido.
NTE_BAD_HASH
Um identificador para o hash original não é válido.

Comentários

CryptDuplicateHash faz uma cópia de um hash e o estado exato do hash. Essa função pode ser usada se um aplicativo de chamada precisar gerar dois hashes, mas ambos os hashes tiveram que começar com algum hash de dados comum. Por exemplo, um hash pode ser criado, o hash de dados comum, uma duplicata feita com a função CryptDuplicateHash e, em seguida, os dados exclusivos para cada hash seriam adicionados.

A função CryptDestroyHash deve ser chamada para destruir quaisquer hashes criados com CryptDuplicateHash. Destruir o hash original não faz com que o hash duplicado seja destruído. Depois que um hash duplicado é feito, ele é separado do hash original. Não há nenhum estado compartilhado entre os dois hashes.

Exemplos

O exemplo a seguir mostra como fazer uma cópia exata de um hash. Para obter um exemplo que inclui o contexto completo para este exemplo, consulte Exemplo de programa C: duplicando um hash.

//-------------------------------------------------------------------
//  Declare and initialize variables.

HCRYPTPROV   hCryptProv = NULL;
HCRYPTHASH   hOriginalHash = NULL;
HCRYPTHASH   hDuplicateHash = NULL;

//-------------------------------------------------------------------
// Acquire a CSP context.

if(CryptAcquireContext(
   &hCryptProv, 
   NULL, 
   NULL, 
   PROV_RSA_FULL, 
   0)) 
{
    printf("CryptAcquireContext succeeded. \n");
}
else
{
    printf("Error during CryptAcquireContext.\n");
    exit(1);
}
//-------------------------------------------------------------------
// Create a hash.

if (CryptCreateHash(
    hCryptProv, 
    CALG_SHA1, 
    0, 
    0,
    &hOriginalHash))
{
   printf("An empty hash object has been created. \n");
}
else
{
   printf("Error during CryptCreateHash.\n");
   exit(1);
}
//-------------------------------------------------------------------
// Hash a BYTE string.

if (CryptHashData(
    hOriginalHash, 
    (BYTE*)"Some Common Data", 
    sizeof("Some Common Data"), 0))
{
   printf("An original hash has been created. \n");
}
else
{
   printf("Error during CryptHashData.\n");
   exit(1);
}
//-------------------------------------------------------------------
// Duplicate the hash.

if (CryptDuplicateHash(
   hOriginalHash, 
   NULL, 
   0, 
   &hDuplicateHash))
{
   printf("The hash has been duplicated. \n");
}
else
{
   printf("Error during CryptDuplicateHash.\n");
   exit(1);
}
//-------------------------------------------------------------------
// At this point, the two hash objects are exactly the same.
// The two hash objects can be handled separately.
// When all processing on the hash object is completed, 
// both objects should be destroyed, and the cryptographic
// context should be released.

//-------------------------------------------------------------------
// Destroy the original hash.

if(CryptDestroyHash(hOriginalHash))
{
   printf("The original hash has been destroyed. \n");
}
else
{
   printf("Error during CryptDestroyHash on the original "
       "hash object.\n");
   exit(1);
}
//-------------------------------------------------------------------
// Destroy the duplicate hash.

if (CryptDestroyHash(hDuplicateHash))
{
   printf("The duplicate hash has been destroyed. \n");
}
else
{
   printf("Error during CryptDestroyHash on the duplicated hash object.\n");
   exit(1);
}

//-------------------------------------------------------------------
// Release the CSP.

if(hCryptProv) 
   CryptReleaseContext(hCryptProv,0);

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

Confira também

Cryptdestroyhash

Funções hash e assinatura digital