CryptDecodeObjectEx 関数 (wincrypt.h)

CryptDecodeObjectEx 関数は、lpszStructType パラメーターで示される型の構造体をデコードします。 CryptDecodeObjectEx は、CRYPT_DECODE_ALLOC_FLAG値を使用したメモリ割り当てをサポートすることで 、CryptDecodeObject よりもパフォーマンスが大幅に向上します。

構文

BOOL CryptDecodeObjectEx(
  [in]      DWORD              dwCertEncodingType,
  [in]      LPCSTR             lpszStructType,
  [in]      const BYTE         *pbEncoded,
  [in]      DWORD              cbEncoded,
  [in]      DWORD              dwFlags,
  [in]      PCRYPT_DECODE_PARA pDecodePara,
  [out]     void               *pvStructInfo,
  [in, out] DWORD              *pcbStructInfo
);

パラメーター

[in] dwCertEncodingType

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

X509_ASN_ENCODING |PKCS_7_ASN_ENCODING

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

  • X509_ASN_ENCODING
  • PKCS_7_ASN_ENCODING
メモ 証明書またはメッセージ エンコードの種類が必要です。 X509_ASN_ENCODINGが既定値です。 その型が示されている場合は、 が使用されます。 それ以外の場合は、PKCS7_ASN_ENCODING型が示されている場合は使用されます。
 

[in] lpszStructType

構造体の種類を定義する オブジェクト識別子 (OID) へのポインター。 lpszStructType パラメーターの上位ワードが 0 の場合、下位ワードは指定した構造体の型の整数識別子を指定します。 それ以外の場合、このパラメーターは null で終わる文字列への長いポインターです。

オブジェクト識別子の文字列、定義済みの定数、および対応する構造体の詳細については、「 CryptEncodeObject および CryptDecodeObject の定数」を参照してください。

[in] pbEncoded

デコードするデータへのポインター。 構造体は lpszStructType で指定された型である必要があります。

[in] cbEncoded

pbEncoded が指すバイト数。 これは、デコードするバイト数です。

[in] dwFlags

このパラメーターには、次のフラグを 1 つ以上指定できます。 フラグは、ビットごとの OR 演算を使用して組み合わせることができます。

説明
CRYPT_DECODE_ALLOC_FLAG
呼び出されたデコード関数は、デコードされた構造体にメモリを割り当てます。 割り当てられた構造体へのポインターは、 pvStructInfo で返されます。

pDecodePara または pDecodeParaの pfnAlloc メンバーが NULL の場合、割り当てに対して LocalAlloc が呼び出され、メモリを解放するには LocalFree を呼び出す必要があります。

pDecodeParapDecodeParaの pfnAlloc メンバーが NULL でない場合、pfnAlloc が指す関数が割り当てに対して呼び出され、pDecodeParapfnFree メンバーによって指される関数を呼び出してメモリを解放する必要があります。

CRYPT_DECODE_ENABLE_PUNYCODE_FLAG
33554432 (0x2000000)
このフラグは、Unicode 文字列値の Punycode デコードを有効にするために適用されます。 詳細については、「解説」を参照してください。

Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: このフラグはサポートされていません。

CRYPT_DECODE_NOCOPY_FLAG
このフラグは、"コピーなし" 最適化を有効にするように設定できます。 この最適化により、pvStructInfo メンバーは、コンテンツのコピーを作成して pvStructInfo に追加する代わりに、pbEncoded 内に存在するコンテンツを指すように更新されます。 呼び出し元のアプリケーションでは、割り当てるメモリが少なくて済み、コピーが作成されないため、実行が高速になります。 "コピーなし" デコードを実行する場合、pvStructInfo が解放されるまで pbEncoded を解放できないことに注意してください。
CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG
このフラグは、X509_UNICODE_NAME、X509_UNICODE_NAME_VALUE、またはX509_UNICODE_ANY_STRINGをデコードするときに適用されます。 既定では、CERT_RDN_T61_STRINGエンコードされた値は、最初は UTF8 としてデコードされます。 UTF8 デコードが失敗した場合、値は 8 ビット文字としてデコードされます。 このフラグが設定されている場合、値を UTF8 としてデコードする最初の試行はスキップされ、値は 8 ビット文字としてデコードされます。
CRYPT_DECODE_TO_BE_SIGNED_FLAG
既定では、 pbEncoded が指すバッファーの内容には、署名されたコンテンツと署名が含まれていました。 このフラグが設定されている場合、バッファーには "署名する" コンテンツのみが含まれます。 このフラグは、X509_CERT_TO_BE_SIGNED、X509_CERT_CRL_TO_BE_SIGNED、X509_CRT_REQUEST_TO_BE_SIGNED、およびX509_KEYGEN_REQUEST_TO_BE_SIGNEDオブジェクトに適用されます。
CRYPT_DECODE_SHARE_OID_STRING_FLAG
このフラグを設定すると、OID 文字列は、返されたデータ構造にコピーされるのではなく、Crypt32.dll に割り当てられ、共有されます。 呼び出し元がアンロードされる前に Crypt32.dll がアンロードされない場合は、このフラグを設定できます。
CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG
既定では、署名バイトは逆になります。 このフラグが設定されている場合、このバイト反転は禁止されます。

[in] pDecodePara

段落情報のデコードを含む CRYPT_DECODE_PARA 構造体へのポインター。 pDecodePara がNULL に設定されている場合、LocalAllocLocalFree を使用してメモリを割り当てて解放します。 pDecodePara がCRYPT_DECODE_PARA構造体を指している場合、その構造体はコールバック関数を渡してメモリを割り当てて解放します。 これらのコールバック関数は、 LocalAlloc と LocalFree の既定のメモリ割り当てをオーバーライド します

[out] pvStructInfo

dwFlags CRYPT_ENCODE_ALLOC_FLAGが設定されている場合、pvStructInfo はバッファーへのポインターではなく、バッファーへのポインターのアドレスです。 メモリは関数内に割り当てられ、ポインターは *pvStructInfo に格納されるため、 pvStructInfoNULL にすることはできません。

CRYPT_ENCODE_ALLOC_FLAGが設定されていない場合、 pvStructInfo はデコードされた構造体を受け取るバッファーへのポインターです。 指定されたバッファーがデコードされた構造体を受け取るのに十分な大きさでない場合、関数はERROR_MORE_DATAコードを設定し、必要なバッファー サイズをバイト単位で pcbStructInfo が指す変数に格納します。

このパラメーターは、メモリ割り当てのためにこの情報のサイズを取得するために NULL にすることができます 。 詳細については、「 不明な長さのデータの取得」を参照してください。

[in, out] pcbStructInfo

pvStructInfo パラメーターによって指されるバッファーのサイズ (バイト単位) を含む DWORD 変数へのポインター。 関数が戻ると、 DWORD 値にはバッファーに格納されているバイト数が含まれます。 pcbStructInfo が指す変数に含まれるサイズは、デコードされた構造体に補助データへのポインターを含めることができるため、デコードされた構造体よりも大きいサイズを示すことができます。 このサイズは、デコードされた構造体と補助データに必要なサイズの合計です。

CRYPT_DECODE_ALLOC_FLAGが設定されている場合、*pcbStructInfo の初期値は関数によって使用されず、戻り値として *pcbStructInfo には pvStructInfo に割り当てられたバイト数が含まれます。

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

戻り値

関数が成功した場合、関数は 0 以外 (TRUE) を返します。

関数が失敗した場合は、0 (FALSE) を返します。 拡張エラー情報については、 GetLastError を呼び出します。 次の表に、考えられるエラー コードの一部を示します。

リターン コード 説明
CRYPT_E_BAD_ENCODE
デコード中にエラーが発生しました。
ERROR_FILE_NOT_FOUND
指定した dwCertEncodingType および lpszStructType に対してデコード関数が見つかりませんでした。
ERROR_MORE_DATA
pvStructInfo パラメーターで指定されたバッファーが、返されるデータを保持するのに十分な大きさでない場合、関数はERROR_MORE_DATA コードを設定し、必要なバッファー サイズをバイト単位で pcbStructInfo が指す変数に格納します。
 

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

解説

優先する CryptEncodeObjectEx 関数を使用して暗号化オブジェクトをエンコードする場合、終端の NULL 文字が含まれます。 デコード時に、優先する CryptDecodeObjectEx 関数を使用すると、終端の NULL 文字は保持されません。

以下の一覧の各定数には、 pvStructInfo パラメーターによって指される構造体型が関連付けられています。 直接または間接的に指す構造体には、 CERT_ALT_NAME_ENTRY 構造体への参照があります。

  • X509_ALTERNATE_NAME
  • szOID_AUTHORITY_INFO_ACCESS
  • X509_AUTHORITY_INFO_ACCESS
  • X509_AUTHORITY_KEY_ID2
  • szOID_AUTHORITY_KEY_IDENTIFIER2
  • szOID_CRL_DIST_POINTS
  • X509_CRL_DIST_POINTS
  • szOID_CROSS_CERT_DIST_POINTS
  • X509_CROSS_CERT_DIST_POINTS
  • szOID_ISSUER_ALT_NAME
  • szOID_ISSUER_ALT_NAME2
  • szOID_ISSUING_DIST_POINT
  • X509_ISSUING_DIST_POINT
  • X509_NAME_CONSTRAINTS
  • szOID_NAME_CONSTRAINTS
  • szOID_NEXT_UPDATE_LOCATION
  • OCSP_REQUEST
  • zOID_SUBJECT_ALT_NAME
  • szOID_SUBJECT_ALT_NAME2
CRYPT_DECODE_ENABLE_PUNYCODE_FLAG フラグは、CERT_ALT_NAME_ENTRY構造体の dwAltNameChoice メンバーの値と組み合わせて、文字列のエンコード方法を決定します。
dwAltNameChoice 結果
CERT_ALT_NAME_DNS_NAME ホスト名に Punycode でエンコードされた IA5String 文字列が含まれている場合、それに相当する Unicode に変換されます。
CERT_ALT_NAME_RFC822_NAME 電子メール アドレスのホスト名の部分に Punycode でエンコードされた IA5String 文字列が含まれている場合は、Unicode に相当する文字列に変換されます。
CERT_ALT_NAME_URL URI がデコードされます。 URI のサーバー ホスト名に Punycode でエンコードされた IA5String 文字列が含まれている場合、ホスト名の文字列は Unicode と同等の文字列にデコードされます。
 

以下の一覧の各定数には、 pvStructInfo パラメーターによって指される構造体型が関連付けられています。 直接または間接的に指す構造体には、 CERT_HASHED_URL 構造体への参照があります。

  • szOID_LOGOTYPE_EXT
  • X509_LOGOTYPE_EXT
  • szOID_BIOMETRIC_EXT
  • X509_BIOMETRIC_EXT
CERT_HASHED_URL構造体の値をデコードすると、URI がデコードされます。 ホスト名に Punycode でエンコードされたホスト名が含まれている場合、それに相当する Unicode に変換されます。

以下の一覧の 各X509_UNICODE_NAME 定数には、 pvStructInfo パラメーターによって指される構造体型が関連付けられています。

  • X509_UNICODE_NAME
CERT_RDN_ATTR構造体の pszObjId メンバーが szOID_RSA_emailAddr に設定され、Value メンバーの電子メール アドレスに Punycode でエンコードされた文字列が含まれている場合は、Unicode と同等の文字列に変換されます。

この関数を使用する例については、「 サンプル C プログラム: ASN.1 エンコードとデコード」を参照してください。

要件

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

関連項目

CryptDecodeObject

CryptEncodeObject

CryptEncodeObjectEx

オブジェクト エンコード関数とデコード関数