Функция CryptDuplicateHash (wincrypt.h)

Функция CryptDuplicateHash создает точную копию хэша до точки, когда выполняется дублирование. Повторяющийся хэш включает состояние хэша.

Хэш можно создать по частям. Функцию CryptDuplicateHash можно использовать для создания отдельных хэшей двух разных содержимого, которые начинаются с одного и того же содержимого.

Синтаксис

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

Параметры

[in] hHash

Дескриптор дублирующегося хэша.

[in] pdwReserved

Зарезервировано для использования в будущем и должно быть равно нулю.

[in] dwFlags

Зарезервировано для использования в будущем и должно быть равно нулю.

[out] phHash

Адрес дескриптора повторяющегося хэша. Завершив использование хэша, отпустите дескриптор, вызвав функцию CryptDeographyHash .

Возвращаемое значение

Если функция выполняется успешно, функция возвращает значение TRUE.

Если функция завершается сбоем, она возвращает значение FALSE. Для получения дополнительных сведений об ошибке вызовите Метод GetLastError.

Код ошибки, предваряемый "NTE", создается конкретным поставщиком служб шифрования (CSP), который вы используете. Ниже приведены некоторые возможные коды ошибок.

Код возврата Описание
ERROR_CALL_NOT_IMPLEMENTED
Так как это новая функция, существующие CSP не могут ее реализовать. Эта ошибка возвращается, если CSP не поддерживает эту функцию.
ERROR_INVALID_PARAMETER
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель.
NTE_BAD_HASH
Недопустимый дескриптор исходного хэша.

Комментарии

CryptDuplicateHash создает копию хэша и точное состояние хэша. Эту функцию можно использовать, если вызывающему приложению требуется создать два хэша, но оба хэша должны были начинаться с некоторых общих хэшированных данных. Например, может быть создан хэш, хэш общих данных, дубликат, созданный с помощью функции CryptDuplicateHash , а затем будут добавлены данные, уникальные для каждого хэша.

Для уничтожения всех хэшей, созданных с помощью CryptDuplicateHash, необходимо вызвать функцию CryptDegradhash. Уничтожение исходного хэша не приводит к уничтожению дублирующего хэша. После того как будет создан дублирующийся хэш, он отделяется от исходного хэша. Между двумя хэшами нет общего состояния .

Примеры

В следующем примере показано создание точной копии хэша. Пример, включающий полный контекст для этого примера, см. в разделе Пример программы C: дублирование хэша.

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

Требования

Требование Значение
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header wincrypt.h
Библиотека Advapi32.lib
DLL Advapi32.dll

См. также раздел

CryptDeographyHash

Функции хэша и цифровой подписи