CryptMsgOpenToEncode 関数 (wincrypt.h)

CryptMsgOpenToEncode 関数は、エンコード用の暗号化メッセージを開き、開かれたメッセージのハンドルを返します。 メッセージは、CryptMsgClose が呼び出されるまで開いたままです。

構文

HCRYPTMSG CryptMsgOpenToEncode(
  [in]           DWORD             dwMsgEncodingType,
  [in]           DWORD             dwFlags,
  [in]           DWORD             dwMsgType,
  [in]           void const        *pvMsgEncodeInfo,
  [in, optional] LPSTR             pszInnerContentObjID,
  [in]           PCMSG_STREAM_INFO pStreamInfo
);

パラメーター

[in] dwMsgEncodingType

使用するエンコードの種類を指定します。 次の例に示すように、証明書と メッセージエンコードの両方の種類 をビットごとの OR 操作と組み合わせて指定することは、常に許容されます。

X509_ASN_ENCODING |PKCS_7_ASN_ENCODING

現在定義されているエンコードの種類は次のとおりです。

  • X509_ASN_ENCODING
  • PKCS_7_ASN_ENCODING

[in] dwFlags

現在定義されている dwFlags を次の表に示します。

意味
CMSG_BARE_CONTENT_FLAG
ストリーミングされた出力には、外部の ContentInfo ラッパーは含まれません (PKCS #7 で定義されています)。 これにより、囲みメッセージにストリーム配信するのに適しています。
CMSG_DETACHED_FLAG
CryptMsgUpdate の後続の呼び出しに対して、デタッチされたデータが提供されます。
CMSG_AUTHENTICATED_ATTRIBUTES_FLAG
認証された属性は、必要でない場合に、SignerInfo (PKCS #7 で定義) に強制的に含められます。
CMSG_CONTENTS_OCTETS_FLAG
Distinguished Encoding Rules (DER) を使用してエンコードされ、エンベロープ メッセージ内に入れ子になっているメッセージのサイズを計算するときに使用されます。 これは、ストリーミングを実行する場合に特に便利です。
CMSG_CMS_ENCAPSULATED_CONTENT_FLAG
設定すると、データ型以外の内部コンテンツ が OCTET STRING 内にカプセル化されます。 署名済みメッセージとエンベロープ メッセージの両方に適用されます。
CMSG_CRYPT_RELEASE_CONTEXT_FLAG
設定した場合、この関数に渡される hCryptProv は、最終的な CryptMsgUpdate で解放されます。 関数が失敗した場合、ハンドルは解放されません。
メモ エンベロープ受信者の hCryptProvは解放されません。
 

[in] dwMsgType

メッセージの種類を示します。 これは、次のいずれかの値である必要があります。

意味
CMSG_DATA
この値は使用されません。
CMSG_SIGNED
pvMsgEncodeInfo パラメーターは、エンコード情報を含むCMSG_SIGNED_ENCODE_INFO構造体のアドレスです。
CMSG_ENVELOPED
pvMsgEncodeInfo パラメーターは、エンコード情報を含むCMSG_ENVELOPED_ENCODE_INFO構造体のアドレスです。
CMSG_SIGNED_AND_ENVELOPED
この値は現在実装されていません。
CMSG_HASHED
pvMsgEncodeInfo パラメーターは、エンコード情報を含むCMSG_HASHED_ENCODE_INFO構造体のアドレスです。

[in] pvMsgEncodeInfo

エンコード情報を含む構造体のアドレス。 データの種類は、 dwMsgType パラメーターの値によって異なります。 詳細については、「 dwMsgType」を参照してください。

[in, optional] pszInnerContentObjID

CryptMsgCalculateEncodedLength が呼び出され、CryptMsgUpdate のデータが既にメッセージ エンコードされている場合は、pszInnerContentObjID で適切なオブジェクト識別子 (OID) が渡されます。 pszInnerContentObjIDNULL の場合、内部コンテンツ タイプは以前にエンコードされていないと見なされるため、オクテット文字列としてエンコードされ、型がCMSG_DATA。

メモ ストリーミングを使用する場合、 pszInnerContentObjIDNULL またはszOID_RSA_dataである必要があります。
 
次のアルゴリズム OID が一般的に使用されます。 ユーザーは、メッセージの送信者と受信者が OID に関連付けられているセマンティクスに同意することを確認することで、新しい内部コンテンツの使用状況を定義できます。
  • szOID_RSA_data
  • szOID_RSA_signedData
  • szOID_RSA_envelopedData
  • szOID_RSA_signEnvData
  • szOID_RSA_digestedData
  • szOID_RSA_encryptedData
  • SPC_INDIRECT_DATA_OBJID

[in] pStreamInfo

ストリーミングが使用されている場合、このパラメーターは CMSG_STREAM_INFO 構造体のアドレスです。 CMSG_STREAM_INFO構造体の pfnStreamOutput メンバーによって指定されたコールバック関数は、CryptMsgUpdate の実行時に呼び出されます。 コールバックには、エンコードの結果としてエンコードされたバイトが渡されます。 コールバックの使用方法の詳細については、「 CMSG_STREAM_INFO」を参照してください。

メモストリーミングを使用する場合、アプリケーションは pvMsgEncodeInfo パラメーターで渡されるデータ ハンドル (CMSG_SIGNER_ENCODE_INFO 構造体の hCryptProv メンバーのプロバイダー ハンドルなど) を解放し、この関数によって返されたメッセージ ハンドルが CryptMsgClose 関数を使用して閉じられるまで解放することはできません。
 
ストリーミングが使用されていない場合、このパラメーターは NULL に設定されます。

ストリーミングは、 CMSG_HASHED メッセージの種類では使用されません。 ハッシュされたデータを処理する場合は、このパラメーターを NULL に設定する必要があります。

署名されたメッセージがエンベロープ メッセージで囲まれている場合を考えてみましょう。 署名されたメッセージのストリーミング エンコードからのエンコードされた出力は、エンベロープ されたメッセージの別のストリーミング エンコードにフィードされます。 ストリーミング エンコードのコールバックは 、CryptMsgUpdate を呼び出して、エンベロープされたメッセージをエンコードします。 エンベロープ メッセージのコールバックは、入れ子になった署名付きメッセージのエンコードされたバイトを受け取ります。

戻り値

関数が成功すると、開いたメッセージへのハンドルが返されます。 このハンドルは、 CryptMsgClose 関数に渡すことによって不要になったときに閉じる必要があります。

この関数が失敗した場合は、 NULL が返されます。

拡張エラー情報を取得するには、 GetLastError 関数を使用します。

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

リターン コード 説明
CRYPT_E_INVALID_MSG_TYPE
メッセージ型が無効です。
CRYPT_E_OID_FORMAT
OID の形式が正しくありません。
CRYPT_E_UNKNOWN_ALGO
暗号化アルゴリズムが不明です。
E_INVALIDARG
1 つ以上の引数が無効です。
E_OUTOFMEMORY
メモリが不足しています。
 

さらに、 dwMsgType がCMSG_SIGNEDされている場合は、 CryptCreateHash からエラーを反映できます。

dwMsgType がCMSG_ENVELOPED場合は、CryptGenKey、CryptImportKeyおよび CryptExportKey からエラーを反映できます。

dwMsgType がCMSG_HASHED場合は、CryptCreateHash からエラーを反映できます。

注釈

暗号化を実行する関数の場合、CryptExportKey が内部的に呼び出された後、暗号化された対称キーリトル エンディアン形式からビッグ エンディアン形式に反転されます。 暗号化解除を実行する関数の場合、暗号化された対称キーは 、CryptImportKey が呼び出される前に、ビッグ エンディアン形式からリトル エンディアン形式に反転されます。

CRYPT_NO_SALTは、対称キーが生成され、CryptGenKey と CryptImportKey を使用してインポートされるときに指定されます。

RC2 暗号化アルゴリズムで暗号化されたメッセージは、 CryptGetKeyParam でKP_EFFECTIVE_KEYLENを使用して、RC2 キーのインポートまたはエクスポートの有効な キー長 を決定します。

RC2 暗号化アルゴリズムを使用して暗号化されたメッセージの場合、CMSG_ENVELOPED_ENCODE_INFO構造体のContentEncryptionAlgorithm メンバーの ASN RC2 パラメーターを処理するようにエンコードおよびデコード操作が更新されました。

RC4、DES、および 3DES 暗号化アルゴリズムを使用して暗号化されたメッセージの場合、エンコード操作とデコード操作で、CMSG_ENVELOPED_ENCODE_INFO構造体の ContentEncryptionAlgorithm メンバーの ASN IV オクテット文字列パラメーターが処理されるようになりました。

この関数を使用する例については、「 例 C プログラム: メッセージの署名、エンコード、デコード、検証」、「エンベロープ メッセージを エンコードするための代替コード」、「 C プログラムの例: エンベロープメッセージのエンコード、署名付きメッセージのエンコード、および C プログラムの例: ハッシュメッセージのエンコードとデコード」を参照してください。

要件

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

こちらもご覧ください

CryptMsgClose

CryptMsgGetParam

CryptMsgOpenToDecode

CryptMsgUpdate

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

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