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
[in] lpszStructType
構造体の種類を定義する オブジェクト識別子 (OID) へのポインター。 lpszStructType パラメーターの上位ワードが 0 の場合、下位ワードは指定した構造体の型の整数識別子を指定します。 それ以外の場合、このパラメーターは null で終わる文字列への長いポインターです。
オブジェクト識別子の文字列、定義済みの定数、および対応する構造体の詳細については、「 CryptEncodeObject および CryptDecodeObject の定数」を参照してください。
[in] pbEncoded
デコードするデータへのポインター。 構造体は lpszStructType で指定された型である必要があります。
[in] cbEncoded
pbEncoded が指すバイト数。 これは、デコードするバイト数です。
[in] dwFlags
このパラメーターには、次のフラグを 1 つ以上指定できます。 フラグは、ビットごとの OR 演算を使用して組み合わせることができます。
値 | 説明 |
---|---|
|
呼び出されたデコード関数は、デコードされた構造体にメモリを割り当てます。 割り当てられた構造体へのポインターは、 pvStructInfo で返されます。
pDecodePara または pDecodeParaの pfnAlloc メンバーが NULL の場合、割り当てに対して LocalAlloc が呼び出され、メモリを解放するには LocalFree を呼び出す必要があります。 pDecodePara と pDecodeParaの pfnAlloc メンバーが NULL でない場合、pfnAlloc が指す関数が割り当てに対して呼び出され、pDecodePara の pfnFree メンバーによって指される関数を呼び出してメモリを解放する必要があります。 |
|
このフラグは、Unicode 文字列値の Punycode デコードを有効にするために適用されます。 詳細については、「解説」を参照してください。
Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: このフラグはサポートされていません。 |
|
このフラグは、"コピーなし" 最適化を有効にするように設定できます。 この最適化により、pvStructInfo メンバーは、コンテンツのコピーを作成して pvStructInfo に追加する代わりに、pbEncoded 内に存在するコンテンツを指すように更新されます。 呼び出し元のアプリケーションでは、割り当てるメモリが少なくて済み、コピーが作成されないため、実行が高速になります。 "コピーなし" デコードを実行する場合、pvStructInfo が解放されるまで pbEncoded を解放できないことに注意してください。 |
|
このフラグは、X509_UNICODE_NAME、X509_UNICODE_NAME_VALUE、またはX509_UNICODE_ANY_STRINGをデコードするときに適用されます。 既定では、CERT_RDN_T61_STRINGエンコードされた値は、最初は UTF8 としてデコードされます。 UTF8 デコードが失敗した場合、値は 8 ビット文字としてデコードされます。 このフラグが設定されている場合、値を UTF8 としてデコードする最初の試行はスキップされ、値は 8 ビット文字としてデコードされます。 |
|
既定では、 pbEncoded が指すバッファーの内容には、署名されたコンテンツと署名が含まれていました。 このフラグが設定されている場合、バッファーには "署名する" コンテンツのみが含まれます。 このフラグは、X509_CERT_TO_BE_SIGNED、X509_CERT_CRL_TO_BE_SIGNED、X509_CRT_REQUEST_TO_BE_SIGNED、およびX509_KEYGEN_REQUEST_TO_BE_SIGNEDオブジェクトに適用されます。 |
|
このフラグを設定すると、OID 文字列は、返されたデータ構造にコピーされるのではなく、Crypt32.dll に割り当てられ、共有されます。 呼び出し元がアンロードされる前に Crypt32.dll がアンロードされない場合は、このフラグを設定できます。 |
|
既定では、署名バイトは逆になります。 このフラグが設定されている場合、このバイト反転は禁止されます。 |
[in] pDecodePara
段落情報のデコードを含む CRYPT_DECODE_PARA 構造体へのポインター。 pDecodePara がNULL に設定されている場合、LocalAlloc と LocalFree を使用してメモリを割り当てて解放します。 pDecodePara がCRYPT_DECODE_PARA構造体を指している場合、その構造体はコールバック関数を渡してメモリを割り当てて解放します。 これらのコールバック関数は、 LocalAlloc と LocalFree の既定のメモリ割り当てをオーバーライド します。
[out] pvStructInfo
dwFlags CRYPT_ENCODE_ALLOC_FLAGが設定されている場合、pvStructInfo はバッファーへのポインターではなく、バッファーへのポインターのアドレスです。 メモリは関数内に割り当てられ、ポインターは *pvStructInfo に格納されるため、 pvStructInfo を NULL にすることはできません。
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 を呼び出します。 次の表に、考えられるエラー コードの一部を示します。
リターン コード | 説明 |
---|---|
|
デコード中にエラーが発生しました。 |
|
指定した dwCertEncodingType および lpszStructType に対してデコード関数が見つかりませんでした。 |
|
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
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
以下の一覧の 各X509_UNICODE_NAME 定数には、 pvStructInfo パラメーターによって指される構造体型が関連付けられています。
- X509_UNICODE_NAME
例
この関数を使用する例については、「 サンプル C プログラム: ASN.1 エンコードとデコード」を参照してください。
要件
サポートされている最小のクライアント | Windows XP [デスクトップ アプリ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | wincrypt.h |
Library | Crypt32.lib |
[DLL] | Crypt32.dll |