| ||||
| ||||
Пытаюсь получить контекст сертификата следующим образом: if (!CryptAcquireContextA( &tmpProv, containerName[NumberCont], ProvName[ContIndex-1], ProvType[ContIndex-1], 0)) { printf("Error CryptAcquireContextA..."); getch(); return 0; } if (!CryptGetUserKey( tmpProv, AT_KEYEXCHANGE, &hKey)) { CryptGetUserKey( tmpProv, AT_SIGNATURE, &hKey); } CryptGetKeyParam( hKey, KP_CERTIFICATE, NULL, &pcbCert, 0); pbCert=(BYTE*)malloc(pcbCert); CryptGetKeyParam( hKey, KP_CERTIFICATE, pbCert, &pcbCert, 0); pCertContext=CertCreateCertificateContext( PKCS_7_ASN_ENCODING|X509_ASN_ENCODING, pbCert, pcbCert); но pCertContext всегда NULL. Криптопровайдеры использую майкрософта. | ||||
Ответы: | ||||
| ||||
А CryptGetKeyParam без ошибок отрабатывает? | ||||
| ||||
Отрабатывает с ошибкой 8009000a! | ||||
| ||||
Если же исаользовать в качестве криптопровайдера КриптоПРО то контекст сертификата получить удается а вот CertGetNameString( pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, NULL, dataSize) отрабатывет с ошибкой с кодом 0. | ||||
| ||||
Код 0 - это значит что ошибок нет. С чего Вы взяли что функция отрабатывает с ошибкой? | ||||
| ||||
А что делать с 8009000a? | ||||
| ||||
После того как отработает функция: DWORD dataSize=0; BYTE *data; char *tmpString; DWORD tmpStringSize; if(!CertGetNameString( pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, NULL, dataSize)); { MyError("Error first call CertGetNameString"); } параметр dataSize равен нулю??? почему | ||||
| ||||
8009000a - возможно, провайдер не поддерживает KP_CERTIFICATE? dataSize равен нулю потому что Вы сами задаете DWORD dataSize=0; | ||||