CryptVerifySignatureA 関数 (wincrypt.h)
この関数を呼び出す前に、 CryptCreateHash を呼び出してハッシュ オブジェクトのハンドルを作成する必要があります。 その後、CryptHashData または CryptHashSessionKey を使用して、ハッシュ オブジェクトにデータキーまたは セッション キー を追加します。
CryptVerifySignature が完了すると、hHash ハンドルを使用して CryptDestroyHash のみを呼び出すことができます。
構文
BOOL CryptVerifySignatureA(
[in] HCRYPTHASH hHash,
[in] const BYTE *pbSignature,
[in] DWORD dwSigLen,
[in] HCRYPTKEY hPubKey,
[in] LPCSTR szDescription,
[in] DWORD dwFlags
);
パラメーター
[in] hHash
検証するハッシュ オブジェクトへのハンドル。
[in] pbSignature
検証する署名データのアドレス。
[in] dwSigLen
pbSignature 署名データのバイト数。
[in] hPubKey
署名の認証に使用する 公開キー のハンドル。 この公開キーは、デジタル署名の作成に最初に使用されたキー ペアに属している必要があります。
[in] szDescription
このパラメーターは使用されなくなり、セキュリティの脆弱性を防ぐために NULL に設定する必要があります。 ただし、Microsoft Base Cryptographic Provider では下位互換性のために引き続きサポートされています。
[in] dwFlags
次のフラグ値が定義されています。
値 | 意味 |
---|---|
|
このフラグは、RSA プロバイダーで使用されます。 署名を確認するときに、ハッシュ オブジェクト識別子 (OID) が存在しないか、チェックされるとは思われません。 このフラグが設定されていない場合、PKCS #7 の DigestInfo の定義で指定されているように、既定の署名のハッシュ OID が検証されます。 |
|
このフラグは使用されません。 |
|
FIPS 186-2 準拠バージョンの RSA (rDSA) に対して X.931 サポートを使用します。 |
戻り値
関数が成功した場合、戻り値は TRUE になります。
関数が失敗した場合、戻り値は FALSE になります。 拡張エラー情報については、 GetLastError を呼び出します。
"NTE" の前に表示されるエラー コードは、使用している特定の CSP によって生成されます。 考えられるエラー コードの一部を次に示します。
リターン コード | 説明 |
---|---|
|
パラメーターの 1 つは、無効なハンドルを指定します。 |
|
パラメーターの 1 つに無効な値が含まれています。 これはほとんどの場合、無効なポインターです。 |
|
dwFlags パラメーターは 0 以外です。 |
|
hHash パラメーターで指定されたハッシュ オブジェクトが無効です。 |
|
hPubKey パラメーターには、有効な公開キーへのハンドルが含まれていません。 |
|
署名が無効です。 これは、データ自体が変更されたか、説明文字列が一致しなかったか、間違った公開キーが hPubKey によって指定されたことが原因である可能性があります。
このエラーは、ハッシュアルゴリズムまたは署名アルゴリズムが署名の作成に使用されたものと一致しない場合にも返すことができます。 |
|
ハッシュ オブジェクトの作成時に指定された 暗号化サービス プロバイダー (CSP) コンテキストが見つかりません。 |
|
操作中に CSP のメモリが不足しました。 |
注釈
CryptVerifySignature 関数はハッシュを完了します。 この呼び出しの後、ハッシュにデータを追加することはできません。 CryptHashData または CryptHashSessionKey への追加の呼び出しは失敗します。 アプリケーションがハッシュで完了したら、ハッシュ オブジェクトを破棄するために CryptDestroyHash を呼び出す必要があります。
.NET Framework API を使用して署名を生成し、CryptVerifySignature 関数を使用して検証しようとすると、関数は失敗し、GetLastError はNTE_BAD_SIGNATUREを返します。 これは、ネイティブ Win32 API と .NET Framework API の間で異なるバイト順が原因です。
ネイティブ暗号化 API ではリトル エンディアン バイト順が使用され、.NET Framework API ではビッグ エンディアンバイト順が使用されます。 .NET Framework API を使用して生成された署名を確認する場合は、CryptVerifySignature 関数を呼び出して署名を確認する前に、署名バイトの順序を入れ替える必要があります。
例
CryptVerifySignature 関数を使用する例については、「C プログラムの例: ハッシュの署名とハッシュ署名の検証」を参照してください。
注意
wincrypt.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして CryptVerifySignature を定義します。 エンコードに依存しないエイリアスをエンコードニュートラルでないコードと組み合わせて使用すると、コンパイルまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | wincrypt.h |
Library | Advapi32.lib |
[DLL] | Advapi32.dll |