Funzione CryptDuplicateHash (wincrypt.h)
La funzione CryptDuplicateHash esegue una copia esatta di un hash al punto in cui viene eseguita la duplicazione. L'hash duplicato include lo stato dell'hash.
Un hash può essere creato in modo frammento. La funzione CryptDuplicateHash può essere usata per creare hash separati di due contenuti diversi che iniziano con lo stesso contenuto.
Sintassi
BOOL CryptDuplicateHash(
[in] HCRYPTHASH hHash,
[in] DWORD *pdwReserved,
[in] DWORD dwFlags,
[out] HCRYPTHASH *phHash
);
Parametri
[in] hHash
Handle dell'hash da duplicare.
[in] pdwReserved
Riservato per l'uso futuro e deve essere zero.
[in] dwFlags
Riservato per l'uso futuro e deve essere zero.
[out] phHash
Indirizzo dell'handle dell'hash duplicato. Al termine dell'uso dell'hash, rilasciare l'handle chiamando la funzione CryptDestroyHash .
Valore restituito
Se la funzione ha esito positivo, la funzione restituisce TRUE.
Se la funzione ha esito negativo, restituisce FALSE. Per informazioni sull'errore estese, chiamare GetLastError.
Il codice di errore preceduto da "NTE" viene generato dal provider di servizi di crittografia specifico usato. Alcuni codici di errore possibili seguono.
Codice restituito | Descrizione |
---|---|
|
Poiché si tratta di una nuova funzione, i provider di servizi di rete esistenti non possono implementarlo. Questo errore viene restituito se il CSP non supporta questa funzione. |
|
Uno dei parametri contiene un valore non valido. Questo è più spesso un puntatore che non è valido. |
|
Un handle per l'hash originale non è valido. |
Commenti
CryptDuplicateHash esegue una copia di un hash e lo stato esatto dell'hash. Questa funzione può essere usata se un'applicazione chiamante deve generare due hash, ma entrambi gli hash devono iniziare con alcuni hash di dati comuni. Ad esempio, è possibile creare un hash, l'hash dei dati comuni, un duplicato creato con la funzione CryptDuplicateHash e quindi i dati univoci per ogni hash verranno aggiunti.
La funzione CryptDestroyHash deve essere chiamata per eliminare eventuali hash creati con CryptDuplicateHash. La eliminazione dell'hash originale non causa l'eliminazione dell'hash duplicato. Dopo aver eseguito un hash duplicato, è separato dall'hash originale. Non esiste uno stato condiviso tra i due hash.
Esempio
Nell'esempio seguente viene illustrata la creazione di una copia esatta di un hash. Per un esempio che include il contesto completo per questo esempio, vedere Esempio di programma C: duplicare 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);
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows XP [solo app desktop] |
Server minimo supportato | Windows Server 2003 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | wincrypt.h |
Libreria | Advapi32.lib |
DLL | Advapi32.dll |