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 |
---|---|
|
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. |
|
Um dos parâmetros contém um valor que não é válido. Geralmente, esse é um ponteiro que não é válido. |
|
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 |