次の方法で共有


CryptSignHashA 関数 (wincrypt.h)

重要 この API は非推奨です。 新規および既存のソフトウェアでは、Cryptography Next Generation API の使用を開始する必要があります。 Microsoft は、今後のリリースでこの API を削除する可能性があります。
 
CryptSignHash 関数は、データに署名します。 すべての署名アルゴリズムは非対称であるため、低速であるため、CryptoAPI ではデータを直接署名できません。 代わりに、データは最初にハッシュされ、CryptSignHash を使用してハッシュに署名します。

構文

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 を に設定する必要があります。 ただし、Microsoft Base Cryptographic Provider での下位互換性については引き続きサポートされています。

[in] dwFlags

次のフラグ値が定義されています。

価値 意味
CRYPT_NOHASHOID
0x00000001
RSA プロバイダーで使用されます。 ハッシュ オブジェクト識別子 (OID) は、RSA 公開キー暗号化に配置されません。 このフラグが設定されていない場合、既定の署名のハッシュ OID は PKCS #1 の DigestInfo の定義で指定されています。
CRYPT_TYPE2_FORMAT
0x00000002
このフラグは使用されません。
CRYPT_X931_FORMAT
0x00000004
ANSI X9.31 標準で指定されている RSA 署名パディング メソッドを使用します。

[out] pbSignature

署名データを受け取るバッファーへのポインター。

このパラメーターを NULL して、メモリ割り当てのためにバッファー サイズを設定できます。 詳細については、「不明な長さのデータの取得」を参照してください。

[in, out] pdwSigLen

pbSignature バッファーのサイズをバイト単位で指定する DWORD 値へのポインター。 関数から制御が戻るときに、DWORD 値にはバッファーに格納されているバイト数が含まれます。

メモ バッファーで返されるデータを処理する場合、アプリケーションは返されるデータの実際のサイズを使用する必要があります。 実際のサイズは、入力時に指定されたバッファーのサイズよりも少し小さくすることができます。 (入力では、バッファー サイズは通常、最大の出力データがバッファーに収まるように十分な大きさで指定されます)。出力時に、このパラメーターが指す変数は、バッファーにコピーされたデータの実際のサイズを反映するように更新されます。
 

戻り値

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

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

"NTE" で開始されるエラー コードは、使用している特定の CSP によって生成されます。 考えられるエラー コードの一部を次に示します。

リターン コード 形容
ERROR_INVALID_HANDLE
パラメーターの 1 つは無効なハンドルを指定します。
ERROR_INVALID_PARAMETER
パラメーターの 1 つに無効な値が含まれています。 これは、多くの場合、無効なポインターです。
ERROR_MORE_DATA
pbSignature パラメーターで指定されたバッファーが、返されたデータを保持するのに十分な大きさではありません。 必要なバッファー サイズ (バイト単位) は、pdwSigLenDWORD 値にあります。
NTE_BAD_ALGID
hHash ハンドルは、この CSP でサポートされていないアルゴリズムを指定するか、dwKeySpec パラメーターの値が正しくありません。
NTE_BAD_FLAGS
dwFlags パラメーターは 0 以外です。
NTE_BAD_HASH
hHash パラメーターで指定されたハッシュ オブジェクトが無効です。
NTE_BAD_UID
ハッシュ オブジェクトの作成時に指定された CSP コンテキストが見つかりません。
NTE_NO_KEY
dwKeySpec によって指定された秘密キーが存在しません。
NTE_NO_MEMORY
操作中に 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 が署名から省略されます。

場合によっては、他の場所で生成されたハッシュ値に署名する必要があります。 これを行うには、次の一連の操作を使用します。

  1. CryptCreateHash使用してハッシュ オブジェクトを作成します。
  2. CryptSetHashParamの dwParam パラメーターの HP_HASHVAL使用して、ハッシュ オブジェクトのハッシュ値を設定します。
  3. CryptSignHash 使用してハッシュ値に署名し、デジタル署名ブロックを取得します。
  4. 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

関連項目

CryptCreateHash

CryptDestroyHash

CryptHashData

CryptHashSessionKey

CryptVerifySignature

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