次の方法で共有


CryptVerifyMessageSignature 関数 (wincrypt.h)

CryptVerifyMessageSignature 関数は、署名付きメッセージの署名を検証します。

この関数を使用して、デタッチされたメッセージの署名を確認しないでください。 CryptVerifyDetachedMessageSignature 関数を使用して、デタッチされたメッセージの署名を確認する必要があります。

構文

BOOL CryptVerifyMessageSignature(
  [in]            PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
  [in]            DWORD                      dwSignerIndex,
  [in]            const BYTE                 *pbSignedBlob,
  [in]            DWORD                      cbSignedBlob,
  [out]           BYTE                       *pbDecoded,
  [in, out]       DWORD                      *pcbDecoded,
  [out, optional] PCCERT_CONTEXT             *ppSignerCert
);

パラメーター

[in] pVerifyPara

検証パラメーターを含む CRYPT_VERIFY_MESSAGE_PARA 構造体へのポインター。

[in] dwSignerIndex

目的の署名のインデックス。 複数の署名を指定できます。 CryptVerifyMessageSignature は、毎回 dwSignerIndex をインクリメントして繰り返し呼び出すことができます。 最初の署名者に対してこのパラメーターを 0 に設定するか、署名者が 1 人しかない場合は 設定します。 関数が FALSE を返し、 GetLastError が CRYPT_E_NO_SIGNERを返す場合、前の呼び出しはメッセージの最後の署名者を処理しました。

[in] pbSignedBlob

署名付きメッセージを含むバッファーへのポインター。

[in] cbSignedBlob

署名されたメッセージ バッファーのサイズ (バイト単位)。

[out] pbDecoded

デコードされたメッセージを受信するバッファーへのポインター。

このパラメーターは、デコードされたメッセージが追加の処理に必要ない場合や、メモリ割り当て目的でメッセージのサイズを設定する場合に NULL にすることができます 。 詳細については、「不明な 長さのデータの取得」を参照してください。

[in, out] pcbDecoded

pbDecoded バッファーのサイズをバイト単位で指定する DWORD 値へのポインター。 関数が戻るときに、この DWORD にはデコードされたメッセージのサイズ (バイト単位) が含まれます。 このパラメーターが NULL の場合、デコードされたメッセージは返されません。

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

[out, optional] ppSignerCert

署名者の証明書を受け取る CERT_CONTEXT 構造体ポインターのアドレス。 この構造体の使用が完了したら、このポインターを CertFreeCertificateContext 関数に渡して解放します。 署名者の証明書が必要ない場合は、このパラメーターを NULL にすることができます

戻り値

関数が成功した場合、関数は 0 以外の値を返します。 これは必ずしも署名が検証されたことを意味するとは限りません。 デタッチされたメッセージの場合、 pcbDecoded が指す変数には 0 が含まれます。 この場合、この関数は 0 以外の値を返しますが、署名は検証されません。 デタッチされたメッセージの署名を確認するには、 CryptVerifyDetachedMessageSignature 関数を 使用します。

関数が失敗すると、0 が返されます。 拡張エラー情報については、 GetLastError を呼び出します。

次の表は、 GetLastError 関数によって最も一般的に返されるエラー コードを示しています。

リターン コード 説明
ERROR_MORE_DATA
pbDecoded パラメーターで指定されたバッファーが、返されたデータを保持するのに十分な大きさでない場合、関数はERROR_MORE_DATA コードを設定し、必要なバッファー サイズをバイト単位で pcbDecoded が指す変数に格納します。
E_INVALIDARG
メッセージと証明書のエンコードの種類が無効です。 現在、PKCS_7_ASN_ENCODINGとX509_ASN_ENCODING_TYPEのみがサポートされています。 *pVerifyParacbSize が無効です。
CRYPT_E_UNEXPECTED_MSG_TYPE
署名された暗号化メッセージではありません。
CRYPT_E_NO_SIGNER
メッセージには、指定された dwSignerIndex の署名者または署名者がありません。
NTE_BAD_ALGID
不明またはサポートされていないアルゴリズムを使用して、メッセージがハッシュされ、署名されました。
NTE_BAD_SIGNATURE
メッセージの署名が検証されませんでした。
 
メモ 呼び出された関数 CryptCreateHashCryptHashDataCryptVerifySignatureおよび CryptImportKey からのエラーは、この関数に反映できます。

関数が失敗した場合、GetLastError は抽象構文表記 1 (ASN.1) エンコード/デコード エラーを返す可能性があります。 これらのエラーの詳細については、「 ASN.1 エンコード/デコードの戻り値」を参照してください。

 

解説

検証済みの署名者とメッセージの場合、 ppSignerCert は署名者の CERT_CONTEXT で更新されます。 CertFreeCertificateContext を呼び出して解放する必要があります。 それ以外の場合、 ppSignerCertNULL に設定されます。

証明書と CRL のみを含むメッセージの場合、 pcbDecodedNULL に設定されます。

この関数を使用する例については、「 サンプル C プログラム: メッセージの署名」および「メッセージ署名の検証」を参照してください。

要件

   
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー wincrypt.h
Library Crypt32.lib
[DLL] Crypt32.dll

関連項目

CryptSignMessage

CryptVerifyDetachedMessageSignature

簡略化されたメッセージ関数