16.05.2007 14:54:51Получение контекста сертификата Ответов: 7
Волков
Пытаюсь получить контекст сертификата следующим образом:
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. Криптопровайдеры использую майкрософта.
 
Ответы:
16.05.2007 17:05:39Kirill Sobolev
А CryptGetKeyParam без ошибок отрабатывает?
17.05.2007 8:32:32Волков
Отрабатывает с ошибкой 8009000a!
17.05.2007 9:05:24Волков
Если же исаользовать в качестве криптопровайдера КриптоПРО то контекст сертификата получить удается а вот
CertGetNameString(
pCertContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
NULL,
dataSize)
отрабатывет с ошибкой с кодом 0.
17.05.2007 10:45:39Kirill Sobolev
Код 0 - это значит что ошибок нет. С чего Вы взяли что функция отрабатывает с ошибкой?
17.05.2007 12:17:52Волков
А что делать с 8009000a?
17.05.2007 12:34:11Волков
После того как отработает функция:
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 равен нулю??? почему
17.05.2007 13:37:50Kirill Sobolev
8009000a - возможно, провайдер не поддерживает KP_CERTIFICATE?
dataSize равен нулю потому что Вы сами задаете
DWORD dataSize=0;