Я пытаюсь получить доступ к c ключу сертификата из хранилища сертификатов, используя Windows CryptoAPI. Он работает в конфигурации проекта x86, но не в конфигурации x64, так как структура, которую он заполняет, пуста. Я не могу изменить конфигурацию проекта, потому что тогда я должен изменить многое. Кто-нибудь знает способ сделать это в 64-битной конфигурации?
Вот что я имею в x86:
HCERTSTORE CertStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"My" );
PCCERT_CONTEXT CertContext = CertFindCertificateInStore( CertStore, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, CertName, NULL );
CryptDecodeObjectEx((PKCS_7_ASN_ENCODING | X509_ASN_ENCODING),
CNG_RSA_PUBLIC_KEY_BLOB,
CertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData, // The pbData member is filled correctly
CertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData, // The cbData member is filled with the correct length of the public key
CRYPT_ENCODE_ALLOC_FLAG,
NULL,
&DecodedPublicKey,
&DecodedPublicLength); // Executes with success, returns the public key, which I am sure is correct, because I tested it.
И для x64 у меня точно такая же вещь, но pbData и члены cbData не заполняются из CertFindCertificateInStore
:
HCERTSTORE CertStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"My" );
PCCERT_CONTEXT CertContext = CertFindCertificateInStore( CertStore, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, CertName, NULL );
CryptDecodeObjectEx((PKCS_7_ASN_ENCODING | X509_ASN_ENCODING),
CNG_RSA_PUBLIC_KEY_BLOB,
CertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData, // pbData member is null
CertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData, // cbData member is 0
CRYPT_ENCODE_ALLOC_FLAG,
NULL,
&DecodedPublicKey,
&DecodedPublicLength);
Фактически, каждый член CertContext
пуст, но CertFindCertificateInStore
не вернул ноль, что действительно странно. Для меня это похоже на ошибку ...