CryptDuplicateHash 関数 (wincrypt.h)

CryptDuplicateHash 関数は、重複が行われた時点へのハッシュの正確なコピーを作成します。 重複するハッシュには、ハッシュの 状態 が含まれます。

ハッシュは、1 つずつ作成できます。 CryptDuplicateHash 関数を使用すると、同じコンテンツで始まる 2 つの異なるコンテンツの個別のハッシュを作成できます。

構文

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

パラメーター

[in] hHash

重複するハッシュのハンドル。

[in] pdwReserved

将来使用するために予約されており、0 である必要があります。

[in] dwFlags

将来使用するために予約されており、0 である必要があります。

[out] phHash

重複したハッシュのハンドルのアドレス。 ハッシュの使用が完了したら、 CryptDestroyHash 関数を呼び出してハンドルを解放します。

戻り値

関数が成功した場合、関数は TRUE を返します。

関数が失敗した場合は、 FALSE を返します。 拡張エラー情報については、 GetLastError を呼び出します。

"NTE" の前に表示されるエラー コードは、使用している特定の 暗号化サービス プロバイダー (CSP) によって生成されます。 考えられるエラー コードの一部を次に示します。

リターン コード 説明
ERROR_CALL_NOT_IMPLEMENTED
これは新しい関数であるため、既存の CSP はそれを実装できません。 このエラーは、CSP がこの関数をサポートしていない場合に返されます。
ERROR_INVALID_PARAMETER
パラメーターの 1 つに無効な値が含まれています。 これはほとんどの場合、無効なポインターです。
NTE_BAD_HASH
元のハッシュへのハンドルが無効です。

注釈

CryptDuplicateHash、ハッシュ のコピーとハッシュの正確な 状態 を作成します。 この関数は、呼び出し元のアプリケーションが 2 つのハッシュを生成する必要があるが、両方のハッシュがハッシュされた一般的なデータから開始する必要がある場合に使用できます。 たとえば、ハッシュが作成され、共通データがハッシュされ、 CryptDuplicateHash 関数で作成された複製が作成され、各ハッシュに固有のデータが追加されます。

CryptDuplicateHash を使用して作成されたハッシュを破棄するには、CryptDestroyHash 関数を呼び出す必要があります。 元のハッシュを破棄しても、重複するハッシュは破棄されません。 重複するハッシュが作成されると、元のハッシュとは別のハッシュになります。 2 つのハッシュ間に共有 状態 はありません。

次の例は、ハッシュの正確なコピーを作成する方法を示しています。 この例の完全なコンテキストを含む例については、「 C Program の例: ハッシュの複製」を参照してください。

//-------------------------------------------------------------------
//  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
ヘッダー wincrypt.h
Library Advapi32.lib
[DLL] Advapi32.dll

こちらもご覧ください

CryptDestroyHash

ハッシュ関数とデジタル署名関数