Доступ к ключу сертификата publi c при конфигурации x64 - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь получить доступ к 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 не вернул ноль, что действительно странно. Для меня это похоже на ошибку ...

1 Ответ

0 голосов
/ 15 января 2020

Нашел решение. Это было выравнивание структур. Очевидно, 32-битная версия библиотеки wincrypt использует то же выравнивание, что и моя конфигурация, но 64-битная использует другое выравнивание. Регулировка выравнивания конструкций исправлена.

...