Fungsi CryptDuplicateHash (wincrypt.h)

Fungsi CryptDuplicateHash membuat salinan hash yang tepat ke titik ketika duplikasi dilakukan. Hash duplikat mencakup status hash.

Hash dapat dibuat dengan cara sepotong demi sepotong. Fungsi CryptDuplicateHash dapat digunakan untuk membuat hash terpisah dari dua konten berbeda yang dimulai dengan konten yang sama.

Sintaks

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

Parameter

[in] hHash

Tangani hash yang akan diduplikasi.

[in] pdwReserved

Dicadangkan untuk digunakan di masa mendatang dan harus nol.

[in] dwFlags

Dicadangkan untuk digunakan di masa mendatang dan harus nol.

[out] phHash

Alamat handel hash duplikat. Setelah Anda selesai menggunakan hash, lepaskan handel dengan memanggil fungsi CryptDestroyHash .

Mengembalikan nilai

Jika fungsi berhasil, fungsi mengembalikan TRUE.

Jika fungsi gagal, fungsi akan mengembalikan FALSE. Untuk informasi kesalahan yang diperluas, hubungi GetLastError.

Kode kesalahan yang diawali oleh "NTE" dihasilkan oleh penyedia layanan kriptografi (CSP) tertentu yang Anda gunakan. Beberapa kemungkinan kode kesalahan mengikuti.

Menampilkan kode Deskripsi
ERROR_CALL_NOT_IMPLEMENTED
Karena ini adalah fungsi baru, CSP yang ada tidak dapat menerapkannya. Kesalahan ini dikembalikan jika CSP tidak mendukung fungsi ini.
ERROR_INVALID_PARAMETER
Salah satu parameter berisi nilai yang tidak valid. Ini paling sering merupakan pointer yang tidak valid.
NTE_BAD_HASH
Handel ke hash asli tidak valid.

Keterangan

CryptDuplicateHash membuat salinan hash dan status hash yang tepat. Fungsi ini dapat digunakan jika aplikasi panggilan diperlukan untuk menghasilkan dua hash tetapi kedua hash harus dimulai dengan beberapa data umum yang di-hash. Misalnya, hash mungkin dibuat, data umum di-hash, duplikat yang dibuat dengan fungsi CryptDuplicateHash , dan kemudian data yang unik untuk setiap hash akan ditambahkan.

Fungsi CryptDestroyHash harus dipanggil untuk menghancurkan hash apa pun yang dibuat dengan CryptDuplicateHash. Menghancurkan hash asli tidak menyebabkan hash duplikat dihancurkan. Setelah hash duplikat dibuat, hash tersebut terpisah dari hash asli. Tidak ada status bersama di antara dua hash.

Contoh

Contoh berikut menunjukkan pembuatan salinan hash yang tepat. Untuk contoh yang menyertakan konteks lengkap untuk contoh ini, lihat Contoh Program C: Menduplikasi 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);

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows XP [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2003 [hanya aplikasi desktop]
Target Platform Windows
Header wincrypt.h
Pustaka Advapi32.lib
DLL Advapi32.dll

Lihat juga

CryptDestroyHash

Fungsi Hash dan Tanda Tangan Digital