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

このパラメーターには、次のいずれかのフラグを指定できます。

意味
CMSG_DETACHED_FLAG
デコードするメッセージがデタッチされることを示します。 このフラグが設定されていない場合、メッセージはデタッチされません。
CMSG_CRYPT_RELEASE_CONTEXT_FLAG
設定すると、この関数に渡された hCryptProv は、最終的な CryptMsgUpdate で解放されます。 関数が失敗した場合、ハンドルは解放されません。

[in] dwMsgType

デコードするメッセージの種類を指定します。 ほとんどの場合、メッセージの種類はメッセージ ヘッダーから決定され、このパラメーターには 0 が渡されます。 特にインターネット エクスプローラー 3.0 では、メッセージにヘッダーがないため、デコードするメッセージの種類をこの関数呼び出しで指定する必要があります。 ヘッダーが見つからない場合、このパラメーターに 0 が渡されると、関数は失敗します。

このパラメーターには、次の定義済みメッセージの種類のいずれかを指定できます。

意味
CMSG_DATA
メッセージはエンコードされたデータです。
CMSG_ENVELOPED
メッセージはエンベロープメッセージです。
CMSG_HASHED
メッセージはハッシュされたメッセージです。
CMSG_SIGNED
メッセージは署名付きメッセージです。
CMSG_SIGNED_AND_ENVELOPED
メッセージは、署名付きおよび封筒入りのメッセージです。

[in] hCryptProv

このパラメーターは使用されず、 NULL に設定する必要があります。

Windows Server 2003 および Windows XP: メッセージのハッシュに使用する暗号化プロバイダーのハンドル 指定します。 署名されたメッセージの場合、署名の検証には hCryptProv が使用されます。このパラメーターのデータ型は HCRYPTPROV です

hCryptProv で特定の暗号化プロバイダーを渡す強い理由がない限り、このパラメーターを NULL に設定しますNULL を渡すと、ハッシュ、署名検証、または受信者の暗号化操作を実行する前に、既定の RSA または DSS プロバイダーが取得されます。

[in] pRecipientInfo

このパラメーターは将来使用するために予約されており、 NULL である必要があります。

[in, optional] pStreamInfo

ストリーミングが使用されていない場合は、このパラメーターを NULL に設定する必要があります。

メモ ストリーミングは、CMSG_HASHED メッセージでは使用されません。 ハッシュされたデータを処理する場合、このパラメーターは 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、pwszProvNamedwProvTypedwFlags メンバーを使用して、CryptAcquireContext呼び出して受信者の秘密キーを取得するために必要な情報が含まれています。 取得した hCryptProv、CRYPT_KEY_PROV_INFO構造体の dwKeySpec メンバーは、内部コンテンツの復号化の開始を許可するために、CMSG_CTRL_DECRYPT_PARA構造体のメンバーとして CryptMsgControl 構造体に渡されます。 その後、ストリーミング コードは、データが入力されるときに復号化を実行します。 プレーンテキストの結果のブロックは、復号化されたメッセージの出力を処理するために、CMSG_STREAM_INFO構造体の pfnStreamOutput メンバーによって指定されたコールバック関数に渡されます。

メモエンベロープされたメッセージのストリーミング デコードは、暗号化解除を開始するために CryptMsgControl が呼び出されるまで、メモリ内の暗号テキストをキューに入れます。 蓄積された 暗号テキスト が大きくなりすぎてシステムがメモリを使い切る前に、データをディスクに保存したり、別の場所にルーティングしたりできるように、アプリケーションはタイムリーに復号化を開始する必要があります。
 

エンベロープメッセージで囲まれた署名付きメッセージの場合、エンベロープメッセージのストリーミングデコードからの プレーンテキスト 出力を別のストリーミングデコードに送り込み、署名されたメッセージを処理できます。

戻り値

関数が成功した場合、関数は開かれたメッセージのハンドルを返します。

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

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

説明
E_INVALIDARG
1 つ以上の引数が無効です。
E_OUTOFMEMORY
メモリ割り当てエラーが発生しました。

要件

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

こちらもご覧ください

CryptMsgClose

CryptMsgGetParam

CryptMsgOpenToEncode

CryptMsgUpdate

低レベルのメッセージ関数

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