メッセージのエンコードとデコードの手順
一般的なメッセージをエンコードする手順は次のとおりです。
メッセージをエンコードするには
- 目的のデータ型に適したデータ構造を初期化します。
- CryptMsgOpenToEncode を呼び出し、必要な引数を渡します。 CryptMsgOpenToEncode を呼び出すときに、CryptMsgUpdate に提供されるデータが既にメッセージエンコードされている場合は、pszInnerContentObjID で適切なオブジェクト識別子 (たとえば、szOID_RSA_signedDataの "1.2.840.113549.1.7.2") を渡します。 pszInnerContentObjID が NULL の場合、内部コンテンツ タイプは以前にエンコードされていないと見なされ、適切に処理されます。
- メッセージを完了するために必要な回数だけ CryptMsgUpdate を呼び出します。 最後の呼び出しで、 fFinal パラメーターを TRUE に設定 します。 (詳細については、「 CryptMsgUpdate」を参照してください)。
- CryptMsgGetParam を呼び出して、コンテンツなどの目的のパラメーターへのポインターを取得します。 単純で一般的なデータをエンコードする場合は、 dwParamtype にCMSG_CONTENT_PARAMを使用します。
- CryptMsgClose を呼び出してメッセージを閉じます。
このプロシージャは、関数呼び出しで指定された型のエンコードされたメッセージになります。
一般的なメッセージをデコードする手順は次のとおりです。
メッセージをデコードするには
- CryptMsgCalculateEncodedLength を使用して、バッファーがエンコードされたデータを保持するために必要な長さを決定します。
- CryptMsgOpenToDecode を呼び出し、必要な引数を渡します。 インターネット エクスプローラー バージョン 3.0 との互換性を維持するために、dwMsgType パラメーターが提供されます。 インターネット エクスプローラー 3.0 で作成された署名済みデータには、ヘッダー情報が含まれていません。 したがって、このようなメッセージがファイル署名から抽出される場合は、メッセージの種類を 関数に渡す必要があります。 dwMsgType パラメーターに 0 が渡された場合、関数はメッセージのヘッダーからメッセージの種類を読み取ります。 ヘッダーが見つからない場合、関数呼び出しは失敗します。 成功した場合は、開かれたメッセージへのハンドルが返されます。
- CryptMsgUpdate を 1 回呼び出します。 これにより、メッセージの種類に応じて、メッセージに対して適切なアクションが実行されます。
- 追加の暗号化解除や署名の検証など、メッセージの追加処理を行う場合は、 CryptMsgControl を呼び出し、 dwCtrlType で目的のアクションを渡します。
- CryptMsgGetParam を呼び出して、コンテンツなどの目的のパラメーターへのポインターを取得します。 単純な一般的なデータをデコードするには、 dwParamtype パラメーターにCMSG_CONTENT_PARAMを使用します。
- メッセージを閉じるには 、CryptMsgClose を呼び出します。
これらの手順を実装する例については、「 サンプル C プログラム: データのエンコードとデコード」を参照してください。 署名付きメッセージの署名のエンコード、デコード、検証のプロセスを示す手順と例については、「 C プログラムの例: 署名、エンコード、デコード、およびメッセージの検証」を参照してください。