CryptSignHashA 関数 (wincrypt.h)
構文
BOOL CryptSignHashA(
[in] HCRYPTHASH hHash,
[in] DWORD dwKeySpec,
[in] LPCSTR szDescription,
[in] DWORD dwFlags,
[out] BYTE *pbSignature,
[in, out] DWORD *pdwSigLen
);
パラメーター
[in] hHash
署名する ハッシュ オブジェクトのハンドル。
[in] dwKeySpec
プロバイダーのコンテナーから使用する秘密キーを識別します。 AT_KEYEXCHANGEまたはAT_SIGNATUREできます。
使用される署名アルゴリズムは、キー ペアが最初に作成されるときに指定されます。
Microsoft Base Cryptographic Provider がサポートする署名アルゴリズムは、RSA 公開キー アルゴリズムだけです。
[in] szDescription
このパラメーターは使用されなくなり、セキュリティの脆弱性を防ぐために NULL を
[in] dwFlags
次のフラグ値が定義されています。
価値 | 意味 |
---|---|
|
RSA プロバイダーで使用されます。 ハッシュ オブジェクト識別子 (OID) は、RSA 公開キー暗号化に配置されません。 このフラグが設定されていない場合、既定の署名のハッシュ OID は PKCS #1 の DigestInfo の定義で指定されています。 |
|
このフラグは使用されません。 |
|
ANSI X9.31 標準で指定されている RSA 署名パディング メソッドを使用します。 |
[out] pbSignature
署名データを受け取るバッファーへのポインター。
このパラメーターを NULL
[in, out] pdwSigLen
pbSignature バッファーのサイズをバイト単位で指定する DWORD 値へのポインター。 関数から制御が戻るときに、DWORD 値にはバッファーに格納されているバイト数が含まれます。
戻り値
関数が成功した場合、関数は TRUE
関数が失敗した場合は、FALSE
"NTE" で開始されるエラー コードは、使用している特定の CSP によって生成されます。 考えられるエラー コードの一部を次に示します。
リターン コード | 形容 |
---|---|
|
パラメーターの 1 つは無効なハンドルを指定します。 |
|
パラメーターの 1 つに無効な値が含まれています。 これは、多くの場合、無効なポインターです。 |
|
pbSignature パラメーターで指定されたバッファーが、返されたデータを保持するのに十分な大きさではありません。 必要なバッファー サイズ (バイト単位) は、pdwSigLenDWORD 値にあります。 |
|
hHash ハンドルは、この CSP でサポートされていないアルゴリズムを指定するか、dwKeySpec パラメーターの値が正しくありません。 |
|
dwFlags パラメーターは 0 以外です。 |
|
hHash パラメーターで指定されたハッシュ オブジェクトが無効です。 |
|
ハッシュ オブジェクトの作成時に指定された CSP コンテキストが見つかりません。 |
|
dwKeySpec によって指定された秘密キーが存在しません。 |
|
操作中に CSP のメモリが不足しました。 |
備考
この関数を呼び出す前に、CryptCreateHash 関数を呼び出して、ハッシュ オブジェクトへのハンドルを取得する必要があります。 CryptHashData または CryptHashSessionKey 関数を使用して、データ キーまたはセッション キーをハッシュ オブジェクトに追加します。 CryptSignHash 関数はハッシュを完了します。
DSS CSP では MD5 と SHA ハッシュ アルゴリズムの両方を使用したハッシュがサポートされますが、DSS CSP では SHA ハッシュの署名のみがサポートされます。
この関数が呼び出されると、ハッシュにデータを追加できなくなります。 CryptHashData または CryptHashSessionKey
アプリケーションでハッシュの使用が完了したら、CryptDestroyHash 関数を呼び出してハッシュ オブジェクトを破棄します。
既定では、Microsoft RSA プロバイダーは署名に PKCS #1 パディング メソッドを使用します。 署名の DigestInfo 要素のハッシュ OID は、ハッシュ オブジェクトに関連付けられているアルゴリズム OID に自動的に設定されます。 CRYPT_NOHASHOID フラグを使用すると、この OID が署名から省略されます。
場合によっては、他の場所で生成されたハッシュ値に署名する必要があります。 これを行うには、次の一連の操作を使用します。
- CryptCreateHash
使用してハッシュ オブジェクトを作成します。 - CryptSetHashParamの
dwParam パラメーターのHP_HASHVAL 値使用して、ハッシュ オブジェクトのハッシュ値を設定します。 - CryptSignHash
使用してハッシュ値に署名し、デジタル署名ブロックを取得します。 - CryptDestroyHashを使用してハッシュ オブジェクトを破棄します。
例
次の例では、最初に署名するデータをハッシュし、次に CryptSignHash 関数を使用してハッシュに署名することで、データの署名を示します。
//-------------------------------------------------------------
// Declare and initialize variables.
HCRYPTPROV hProv;
BYTE *pbBuffer= (BYTE *)"Sample data that is to be signed.";
DWORD dwBufferLen = strlen((char *)pbBuffer)+1;
HCRYPTHASH hHash;
//--------------------------------------------------------------------
// This code assumes that a cryptographic context handle, hProv,
// and a hash handle, hHash, are available.
// For code needed to acquire the context, see "Example C Program:
// Signing a Hash and Verifying the Hash Signature."
//--------------------------------------------------------------------
// Compute the cryptographic hash of the buffer.
if(CryptHashData(
hHash,
pbBuffer,
dwBufferLen,
0))
{
printf("The data buffer has been hashed.\n");
}
else
{
printf("Error during CryptHashData.\n");
exit(1);
}
//--------------------------------------------------------------------
// Determine the size of the signature and allocate memory.
dwSigLen= 0;
if(CryptSignHash(
hHash,
AT_SIGNATURE,
szDescription,
0,
NULL,
&dwSigLen))
{
printf("Signature length %d found.\n",dwSigLen);
}
else
{
printf("Error during CryptSignHash\n");
exit(1);
}
//--------------------------------------------------------------------
// Allocate memory for the signature buffer.
if(pbSignature = (BYTE *)malloc(dwSigLen))
{
printf("Memory allocated for the signature.\n");
}
else
{
printf("Out of memory\n");
exit(1);
}
//--------------------------------------------------------------------
// Sign the hash object.
if(CryptSignHash(
hHash,
AT_SIGNATURE,
szDescription,
0,
pbSignature,
&dwSigLen))
{
printf("pbSignature is the hash signature.\n");
}
else
{
printf("Error during CryptSignHash.\n");
exit(1);
}
//--------------------------------------------------------------------
// Destroy the hash object.
if(hHash)
CryptDestroyHash(hHash);
このコードのコンテキストを含む完全な例については、「例 C プログラム: ハッシュの署名とハッシュ署名の検証」を参照してください。
手記
wincrypt.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして CryptSignHash を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows XP [デスクトップ アプリのみ] |
サポートされる最小サーバー | Windows Server 2003 [デスクトップ アプリのみ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | wincrypt.h |
ライブラリ | Advapi32.lib |
DLL | Advapi32.dll |