Función CryptDuplicateHash (wincrypt.h)

La función CryptDuplicateHash realiza una copia exacta de un hash en el punto en que se realiza la duplicación. El hash duplicado incluye el estado del hash.

Se puede crear un hash de forma por pieza. La función CryptDuplicateHash se puede usar para crear hashes independientes de dos contenidos diferentes que comienzan con el mismo contenido.

Sintaxis

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

Parámetros

[in] hHash

Identificador del hash que se va a duplicar.

[in] pdwReserved

Reservado para uso futuro y debe ser cero.

[in] dwFlags

Reservado para uso futuro y debe ser cero.

[out] phHash

Dirección del identificador del hash duplicado. Cuando haya terminado de usar el hash, libere el identificador llamando a la función CryptDestroyHash .

Valor devuelto

Si la función se ejecuta correctamente, la función devuelve TRUE.

Si se produce un error en la función, devuelve FALSE. Para obtener información de error extendida, llame a GetLastError.

El código de error precedido por "NTE" lo genera el proveedor de servicios criptográficos (CSP) determinado que está usando. Siguen algunos códigos de error posibles.

Código devuelto Descripción
ERROR_CALL_NOT_IMPLEMENTED
Dado que se trata de una nueva función, los CSP existentes no pueden implementarlo. Este error se devuelve si el CSP no admite esta función.
ERROR_INVALID_PARAMETER
Uno de los parámetros contiene un valor que no es válido. Suele ser un puntero que no es válido.
NTE_BAD_HASH
Un identificador del hash original no es válido.

Comentarios

CryptDuplicateHash realiza una copia de un hash y el estado exacto del hash. Esta función puede usarse si una aplicación que llama necesitaba generar dos hashes, pero ambos hash tenían que empezar con algunos datos comunes con hash. Por ejemplo, se podría crear un hash, el hash de datos común, un duplicado realizado con la función CryptDuplicateHash y, a continuación, se agregarían los datos únicos para cada hash.

Se debe llamar a la función CryptDestroyHash para destruir los hashes creados con CryptDuplicateHash. Destruir el hash original no hace que se destruya el hash duplicado. Después de crear un hash duplicado, es independiente del hash original. No hay ningún estado compartido entre los dos hashes.

Ejemplos

En el ejemplo siguiente se muestra cómo realizar una copia exacta de un hash. Para obtener un ejemplo que incluya el contexto completo de este ejemplo, vea Ejemplo de programa C: duplicación de un 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 Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado wincrypt.h
Library Advapi32.lib
Archivo DLL Advapi32.dll

Consulte también

CryptDestroyHash

Funciones hash y firma digital