Partager via


Fonction CryptDuplicateHash (wincrypt.h)

La fonction CryptDuplicateHash effectue une copie exacte d’un hachage jusqu’au moment où la duplication est effectuée. Le hachage en double inclut l’état du hachage.

Un hachage peut être créé pièce par pièce. La fonction CryptDuplicateHash peut être utilisée pour créer des hachages distincts de deux contenus différents qui commencent par le même contenu.

Syntaxe

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

Paramètres

[in] hHash

Handle du hachage à dupliquer.

[in] pdwReserved

Réservé pour une utilisation ultérieure et doit être égal à zéro.

[in] dwFlags

Réservé pour une utilisation ultérieure et doit être égal à zéro.

[out] phHash

Adresse du handle du hachage dupliqué. Lorsque vous avez terminé d’utiliser le hachage, relâchez le handle en appelant la fonction CryptDestroyHash .

Valeur retournée

Si la fonction réussit, la fonction retourne TRUE.

Si la fonction échoue, elle retourne FALSE. Pour obtenir des informations d’erreur étendues, appelez GetLastError.

Le code d’erreur préfacé par « NTE » est généré par le fournisseur de services de chiffrement (CSP) particulier que vous utilisez. Certains codes d’erreur possibles suivent.

Code de retour Description
ERROR_CALL_NOT_IMPLEMENTED
Comme il s’agit d’une nouvelle fonction, les fournisseurs de services cloud existants ne peuvent pas l’implémenter. Cette erreur est retournée si le fournisseur de solutions Cloud ne prend pas en charge cette fonction.
ERROR_INVALID_PARAMETER
L’un des paramètres contient une valeur qui n’est pas valide. Il s’agit le plus souvent d’un pointeur qui n’est pas valide.
NTE_BAD_HASH
Un handle du hachage d’origine n’est pas valide.

Remarques

CryptDuplicateHash effectue une copie d’un hachage et de l’état exact du hachage. Cette fonction peut être utilisée si une application appelante devait générer deux hachages, mais que les deux hachages devaient commencer par des données courantes hachées. Par exemple, un hachage peut être créé, le hachage de données commun, un doublon créé avec la fonction CryptDuplicateHash , puis les données uniques à chaque hachage sont ajoutées.

La fonction CryptDestroyHash doit être appelée pour détruire tous les hachages créés avec CryptDuplicateHash. La destruction du hachage d’origine n’entraîne pas la destruction du hachage en double. Une fois qu’un hachage en double est créé, il est distinct du hachage d’origine. Il n’existe aucun état partagé entre les deux hachages.

Exemples

L’exemple suivant montre comment effectuer une copie exacte d’un hachage. Pour obtenir un exemple qui inclut le contexte complet de cet exemple, consultez Exemple de programme C : duplication d’un hachage.

//-------------------------------------------------------------------
//  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);

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows XP [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau uniquement]
Plateforme cible Windows
En-tête wincrypt.h
Bibliothèque Advapi32.lib
DLL Advapi32.dll

Voir aussi

CryptDestroyHash

Fonctions de hachage et de signature numérique