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) によって生成されます。 考えられるエラー コードの一部を次に示します。
リターン コード | 説明 |
---|---|
|
これは新しい関数であるため、既存の CSP はそれを実装できません。 このエラーは、CSP がこの関数をサポートしていない場合に返されます。 |
|
パラメーターの 1 つに無効な値が含まれています。 これはほとんどの場合、無効なポインターです。 |
|
元のハッシュへのハンドルが無効です。 |
注釈
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 |