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
ERROR_CALL_NOT_IMPLEMENTED
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.
ERROR_INVALID_PARAMETER
Uno dei parametri contiene un valore non valido. Questo è più spesso un puntatore che non è valido.
NTE_BAD_HASH
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

Vedi anche

CryptDestroyHash

Funzioni hash e firma digitale