CERT_INFO 구조체 디코딩
인증서가 제공되면 인증서 BLOB 를 디코딩하는 첫 번째 단계는 CertCreateCertificateContext를 호출하여 인코딩된 인증서(BLOB)에 대한 포인터를 전달하는 것입니다. 이 함수가 호출되면 인코딩된 인증서의 복제본을 만들고 , CERT_CONTEXT 형식의 구조를 만들고, CERT_INFO 형식의 구조를 만듭니다. 다음 그림과 같이 인증서 컨텍스트 에는 원래 인증서 BLOB, CERT_CONTEXT 형식의 C 구조 및 CERT_INFO 형식의 C 구조가 포함됩니다. CERT_CONTEXT 구조체의 멤버 중 하나는 CERT_INFO 구조를 가리키고 다른 하나는 인코딩된 인증서 BLOB을 가리킵니다.
인코딩된 개체(데이터 멤버)는 항상 CryptDecodeObject 함수에 대한 입력으로 제공되며, 출력은 프로세스의 정도에 따라 인코딩된 멤버가 있을 수도 있고 없을 수도 있는 C 구조체입니다.
일부 디코딩이 필요한 다른 멤버가 있으며, 이는 Extension 멤버입니다. CERT_INFO 수준에서 인코딩되지는 않지만 일부 인코딩된 정보가 포함되어 있습니다. 이 정보를 디코딩하려면 다음 그림과 같이 계속 진행합니다.
CERT_INFO 구조에서 멤버 rgExtension은 CERT_EXTENSION 구조체의 배열에 대한 포인터입니다. 각 CERT_EXTENSION 구조체에는 인코딩된 형식이며 디코딩해야 하는 Value 멤버가 있습니다. Value 멤버는 CryptDecodeObject 함수에 전달된 다음 함수의 출력은 pszObjId 멤버의 값에 따라 달라집니다. 그림에서는 pszObjId 값에 따라 두 개의 구조체(CERT_BASIC_CONSTRAINTS_INFO 형식 중 하나와 CERT_AUTHORITY_KEY_ID_INFO 형식 중 하나)가 생성됩니다.