CERT_INFO構造体のデコード
証明書を指定すると、証明書 BLOB をデコードする最初の手順は 、CertCreateCertificateContext を呼び出し、エンコードされた証明書 (BLOB) へのポインターを渡すことです。 この関数を呼び出すと、エンコードされた証明書の複製が作成され、CERT_CONTEXT型の構造 が作成され、CERT_INFO型の構造 が作成されます。 次の図に示すように、 証明書コンテキスト には、元の証明書 BLOB、CERT_CONTEXT型の C 構造体、 および型CERT_INFOの C 構造体 が含まれます。 CERT_CONTEXT構造体のメンバーの 1 つは CERT_INFO 構造を指し、もう 1 つはエンコードされた証明書 BLOB を指します。
エンコードされたオブジェクト (データ メンバー) は常に CryptDecodeObject 関数への入力として提供され、出力は、プロセスの実行距離に応じて、エンコードされたメンバーを持つ場合とそうでない場合がある C 構造体です。
何らかのデコードを必要とする他の 1 つのメンバーがあり、それが Extension メンバーです。 CERT_INFO レベルではエンコードされませんが、エンコードされた情報が含まれています。 この情報をデコードするには、次の図に示すように続行します。
CERT_INFO構造体では、メンバー rgExtension は、CERT_EXTENSION構造体の配列へのポインターです。 各 CERT_EXTENSION 構造体には、エンコードされた形式の Value メンバーがあり、デコードする必要があります。 Value メンバーは CryptDecodeObject 関数に渡され、関数からの出力は pszObjId メンバーの値によって異なります。 この図では、pszObjId の値に応じて、CERT_BASIC_CONSTRAINTS_INFO型とCERT_AUTHORITY_KEY_ID_INFO型の 2 つの異なる構造体が生成されます。