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 |
---|---|
|
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. |
|
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. |
|
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 |