CryptMsgOpenToDecode 関数 (wincrypt.h)
CryptMsgOpenToDecode 関数は、デコードのために暗号化メッセージを開き、開かれたメッセージのハンドルを返します。 メッセージは、 CryptMsgClose 関数が呼び出されるまで開いたままです。
Secure /Multipurpose Internet Mail Extensions (S/MIME) 電子メールの相互運用性をサポートするために、エンベロープされたメッセージの処理に影響を与える重要な変更が CryptoAPI に加えられています。 詳細については、 CryptMsgOpenToEncode の「解説」セクションを参照してください。
構文
HCRYPTMSG CryptMsgOpenToDecode(
[in] DWORD dwMsgEncodingType,
[in] DWORD dwFlags,
[in] DWORD dwMsgType,
[in] HCRYPTPROV_LEGACY hCryptProv,
[in] PCERT_INFO pRecipientInfo,
[in, optional] PCMSG_STREAM_INFO pStreamInfo
);
パラメーター
[in] dwMsgEncodingType
使用するエンコードの種類を指定します。 次の例に示すように、証明書と メッセージエンコードの両方の種類 をビットごとの OR 操作と組み合わせて指定することは、常に許容されます。
X509_ASN_ENCODING |PKCS_7_ASN_ENCODING
現在定義されているエンコードの種類は次のとおりです。
- X509_ASN_ENCODING
- PKCS_7_ASN_ENCODING
[in] dwFlags
このパラメーターには、次のいずれかのフラグを指定できます。
値 | 意味 |
---|---|
|
デコードするメッセージがデタッチされることを示します。 このフラグが設定されていない場合、メッセージはデタッチされません。 |
|
設定すると、この関数に渡された hCryptProv は、最終的な CryptMsgUpdate で解放されます。 関数が失敗した場合、ハンドルは解放されません。 |
[in] dwMsgType
デコードするメッセージの種類を指定します。 ほとんどの場合、メッセージの種類はメッセージ ヘッダーから決定され、このパラメーターには 0 が渡されます。 特にインターネット エクスプローラー 3.0 では、メッセージにヘッダーがないため、デコードするメッセージの種類をこの関数呼び出しで指定する必要があります。 ヘッダーが見つからない場合、このパラメーターに 0 が渡されると、関数は失敗します。
このパラメーターには、次の定義済みメッセージの種類のいずれかを指定できます。
値 | 意味 |
---|---|
|
メッセージはエンコードされたデータです。 |
|
メッセージはエンベロープメッセージです。 |
|
メッセージはハッシュされたメッセージです。 |
|
メッセージは署名付きメッセージです。 |
|
メッセージは、署名付きおよび封筒入りのメッセージです。 |
[in] hCryptProv
このパラメーターは使用されず、 NULL に設定する必要があります。
Windows Server 2003 および Windows XP: メッセージのハッシュに使用する暗号化プロバイダーのハンドル を 指定します。 署名されたメッセージの場合、署名の検証には hCryptProv が使用されます。このパラメーターのデータ型は HCRYPTPROV です。
hCryptProv で特定の暗号化プロバイダーを渡す強い理由がない限り、このパラメーターを NULL に設定します。 NULL を渡すと、ハッシュ、署名検証、または受信者の暗号化操作を実行する前に、既定の RSA または DSS プロバイダーが取得されます。
[in] pRecipientInfo
このパラメーターは将来使用するために予約されており、 NULL である必要があります。
[in, optional] pStreamInfo
ストリーミングが使用されていない場合は、このパラメーターを NULL に設定する必要があります。
ストリーミングが使用されている場合、pStreamInfo パラメーターは、CryptMsgUpdate が実行されたとき、またはストリーム化されたエンベロープ メッセージをデコードするときに CryptMsgControl が実行されるときに呼び出されるコールバックへのポインターを含む、CMSG_STREAM_INFO構造体へのポインターです。
署名されたメッセージの場合、コールバックには、メッセージの 内部コンテンツ からデコードされたバイトのブロックが渡されます。
エンベロープメッセージの場合、CryptMsgUpdate を呼び出すたびに、CryptMsgGetParam 関数を呼び出してCMSG_ENVELOPE_ALGORITHM_PARAM プロパティを使用できるかどうかを判断チェック必要があります。 CryptMsgGetParam は失敗し、CryptMsgUpdate がメッセージを十分に処理して CMSG_ENVELOPE_ALGORITHM_PARAM プロパティを使用できるようになるまで、GetLastError はCRYPT_E_STREAM_MSG_NOT_READYを返します。 CMSG_ENVELOPE_ALGORITHM_PARAM プロパティを使用できる場合は、受信者を反復処理し、CryptMsgGetParam 関数を使用して各受信者のCERT_INFO構造を取得し、CMSG_RECIPIENT_INFO_PARAM プロパティを取得できます。 人為的に大きなヘッダー ブロックを持つエンベロープ メッセージからのサービス拒否攻撃を防ぐには、このプロセス中に CryptMsgUpdate 関数に渡されたメモリの量を追跡する必要があります。 CMSG_ENVELOPE_ALGORITHM_PARAM プロパティが使用可能になる前に、データの量がアプリケーション定義の制限を超えた場合は、メッセージの処理を停止し、 CryptMsgClose 関数を呼び出して、オペレーティング システムがメッセージに割り当てられたメモリを解放する必要があります。 推奨される制限は、メッセージの最大許容サイズです。 たとえば、メッセージの最大サイズが 10 MB の場合、このテストの制限は 10 MB である必要があります。
CERT_INFO構造体は、CertGetSubjectCertificateFromStore 関数を使用して、以前に開いた証明書ストアで一致する証明書を検索するために使用されます。 正しい証明書が見つかると、CERT_KEY_PROV_INFO_PROP_ID パラメーターを持つ CertGetCertificateContextProperty 関数が呼び出され、 CRYPT_KEY_PROV_INFO 構造体が取得されます。 構造体には、CRYPT_KEY_PROV_INFO構造体の pwszContainerName、pwszProvName、dwProvType、dwFlags メンバーを使用して、CryptAcquireContext を呼び出して受信者の秘密キーを取得するために必要な情報が含まれています。 取得した hCryptProv と、CRYPT_KEY_PROV_INFO構造体の dwKeySpec メンバーは、内部コンテンツの復号化の開始を許可するために、CMSG_CTRL_DECRYPT_PARA構造体のメンバーとして CryptMsgControl 構造体に渡されます。 その後、ストリーミング コードは、データが入力されるときに復号化を実行します。 プレーンテキストの結果のブロックは、復号化されたメッセージの出力を処理するために、CMSG_STREAM_INFO構造体の pfnStreamOutput メンバーによって指定されたコールバック関数に渡されます。
エンベロープメッセージで囲まれた署名付きメッセージの場合、エンベロープメッセージのストリーミングデコードからの プレーンテキスト 出力を別のストリーミングデコードに送り込み、署名されたメッセージを処理できます。
戻り値
関数が成功した場合、関数は開かれたメッセージのハンドルを返します。
関数が失敗した場合は、NULL が返されます。 拡張エラー情報については、 GetLastError を呼び出します。
次の表に、 GetLastError 関数によって最も一般的に返されるエラー コードを示します。
値 | 説明 |
---|---|
|
1 つ以上の引数が無効です。 |
|
メモリ割り当てエラーが発生しました。 |
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP [デスクトップ アプリ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | wincrypt.h |
Library | Crypt32.lib |
[DLL] | Crypt32.dll |