CryptDuplicateHash-Funktion (wincrypt.h)

Die CryptDuplicateHash-Funktion erstellt eine exakte Kopie eines Hashs bis zu dem Punkt, an dem die Duplizierung abgeschlossen ist. Der doppelte Hash enthält den Status des Hashs.

Ein Hash kann Stück für Stück erstellt werden. Die CryptDuplicateHash-Funktion kann verwendet werden, um separate Hashes von zwei verschiedenen Inhalten zu erstellen, die mit demselben Inhalt beginnen.

Syntax

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

Parameter

[in] hHash

Handle des zu duplizierenden Hashs.

[in] pdwReserved

Für die zukünftige Verwendung reserviert und muss null sein.

[in] dwFlags

Für die zukünftige Verwendung reserviert und muss null sein.

[out] phHash

Adresse des Handle des duplizierten Hashs. Wenn Sie den Hash verwendet haben, lassen Sie das Handle los, indem Sie die Funktion CryptDestroyHash aufrufen.

Rückgabewert

Wenn die Funktion erfolgreich ist, gibt die Funktion TRUE zurück.

Wenn die Funktion fehlschlägt, gibt sie FALSE zurück. Rufen Sie GetLastError auf, um erweiterte Fehlerinformationen zu erhalten.

Der von "NTE" vorangestellte Fehlercode wird vom jeweiligen Kryptografiedienstanbieter (CSP) generiert, den Sie verwenden. Es folgen einige mögliche Fehlercodes.

Rückgabecode Beschreibung
ERROR_CALL_NOT_IMPLEMENTED
Da es sich um eine neue Funktion handelt, können vorhandene CSPs sie nicht implementieren. Dieser Fehler wird zurückgegeben, wenn der CSP diese Funktion nicht unterstützt.
ERROR_INVALID_PARAMETER
Einer der Parameter enthält einen ungültigen Wert. Dies ist in den meisten Fällen ein nicht gültiger Zeiger.
NTE_BAD_HASH
Ein Handle für den ursprünglichen Hash ist ungültig.

Hinweise

CryptDuplicateHash erstellt eine Kopie eines Hashs und des genauen Zustands des Hashs. Diese Funktion kann verwendet werden, wenn eine aufrufende Anwendung zwei Hashes generieren musste, aber beide Hashes mit einigen gängigen Daten beginnen mussten. Beispielsweise kann ein Hash erstellt werden, die allgemeinen Daten hashed, ein Duplikat mit der CryptDuplicateHash-Funktion erstellt werden, und dann würden die für jeden Hash eindeutigen Daten hinzugefügt.

Die CryptDestroyHash-Funktion muss aufgerufen werden, um alle Hashes zu zerstören, die mit CryptDuplicateHash erstellt werden. Das Zerstören des ursprünglichen Hashs führt nicht dazu, dass der doppelte Hash zerstört wird. Nachdem ein doppelter Hash erstellt wurde, ist er vom ursprünglichen Hash getrennt. Es gibt keinen freigegebenen Zustand zwischen den beiden Hashes.

Beispiele

Das folgende Beispiel zeigt das Erstellen einer exakten Kopie eines Hashs. Ein Beispiel, das den vollständigen Kontext für dieses Beispiel enthält, finden Sie unter Beispiel C-Programm: Duplizieren eines Hashs.

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

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile wincrypt.h
Bibliothek Advapi32.lib
DLL Advapi32.dll

Weitere Informationen

CryptDestroyHash

Hash- und Digitale Signaturfunktionen