// Ext520.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include int _tmain(int argc, _TCHAR* argv[]) { HCRYPTPROV hProv; HCERTSTORE hStore; PCCERT_CONTEXT pcCert; // 証明書ストアのオープンと電子証明書の選択 if(OpenAndGetCertificate(&hProv, &hStore, &pcCert) < 0) { fprintf(stderr, "Error\n"); return 1; } // 拡張情報 int cExt; char pstr[2000]; DWORD cstr = 2000; printf("Num = %d\n", (cExt = pcCert->pCertInfo->cExtension)); for(int i = 0; i < cExt; i++) { printf("%2d: %s\n", i, pcCert->pCertInfo->rgExtension[i].pszObjId); if(!strcmp(pcCert->pCertInfo->rgExtension[i].pszObjId, "2.5.29.35")) { printf("Authority Key Identifier\n%s\n", pcCert->pCertInfo->rgExtension[i].fCritical ? "critical" : "non-critical"); cstr = 2000; CryptBinaryToString(pcCert->pCertInfo->rgExtension[i].Value.pbData, pcCert->pCertInfo->rgExtension[i].Value.cbData, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Value =\n%s\n", pstr); } else if(!strcmp(pcCert->pCertInfo->rgExtension[i].pszObjId, "2.5.29.14")) { printf("Subject Key Identifier\n%s\n", pcCert->pCertInfo->rgExtension[i].fCritical ? "critical" : "non-critical"); cstr = 2000; CryptBinaryToString(pcCert->pCertInfo->rgExtension[i].Value.pbData, pcCert->pCertInfo->rgExtension[i].Value.cbData, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Value =\n%s\n", pstr); } else if(!strcmp(pcCert->pCertInfo->rgExtension[i].pszObjId, "2.5.29.15")) { printf("Key Usage\n%s\n", pcCert->pCertInfo->rgExtension[i].fCritical ? "critical" : "non-critical"); CryptBinaryToString(pcCert->pCertInfo->rgExtension[i].Value.pbData, pcCert->pCertInfo->rgExtension[i].Value.cbData, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Value =\n%s\n", pstr); } else if(!strcmp(pcCert->pCertInfo->rgExtension[i].pszObjId, "2.5.29.32")) { printf("Certificate Policy\n%s\n", pcCert->pCertInfo->rgExtension[i].fCritical ? "critical" : "non-critical"); cstr = 2000; CryptBinaryToString(pcCert->pCertInfo->rgExtension[i].Value.pbData, pcCert->pCertInfo->rgExtension[i].Value.cbData, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Value =\n%s\n", pstr); } else if(!strcmp(pcCert->pCertInfo->rgExtension[i].pszObjId, "2.5.29.17")) { printf("Subject Antanatve Name\n%s\n", pcCert->pCertInfo->rgExtension[i].fCritical ? "critical" : "non-critical"); cstr = 2000; CryptBinaryToString(pcCert->pCertInfo->rgExtension[i].Value.pbData, pcCert->pCertInfo->rgExtension[i].Value.cbData, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Value =\n%s\n", pstr); } else if(!strcmp(pcCert->pCertInfo->rgExtension[i].pszObjId, "2.5.29.37")) { printf("Extended Key Usage\n%s\n", pcCert->pCertInfo->rgExtension[i].fCritical ? "critical" : "non-critical"); cstr = 2000; CryptBinaryToString(pcCert->pCertInfo->rgExtension[i].Value.pbData, pcCert->pCertInfo->rgExtension[i].Value.cbData, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Value =\n%s\n", pstr); } } // 後始末 CertFreeCertificateContext(pcCert); CertCloseStore(hStore, 0); CryptReleaseContext(hProv, 0); return 0; }