06.03.2007 14:53:53Имя владельца сертификата Ответов: 2
Волков
следующим кодом хочу перечислить имя контейнера и имя получателя сертификата, но еслм имя содержит пробелы например Иванов Иван Иваныч, то его не удается получить, а строка в которой должно быть это имя остается пустой, причем имена состоящие из одного слова, нормально отображаются!
f (!CryptAcquireContextA(
&hCryptProv,
NULL,
NULL,
75,
CRYPT_VERIFYCONTEXT))
{
printf("Error CryptAcquireContext...");
getch();
return;
while(CryptGetProvParam(
hCryptProv,
PP_ENUMCONTAINERS,
result,
&size,
fParam))
{
fParam = 0;

HCRYPTPROV tmpProv = NULL;
LPCSTR containerName = (LPCSTR)result;

CryptAcquireContextA(
&tmpProv,
containerName,
"",
75,
0);

StringGrid1->Cells[2][j+1]=containerName;

HCRYPTKEY hKey = NULL;

if (!CryptGetUserKey(tmpProv, AT_KEYEXCHANGE, &hKey))
{
CryptGetUserKey(tmpProv, AT_SIGNATURE, &hKey);
}

BYTE* pbCert = NULL;
DWORD pcbCert = 0;
PCCERT_CONTEXT certContext;

CryptGetKeyParam(
hKey,
KP_CERTIFICATE,
NULL,
&pcbCert,
0);
pbCert = (BYTE*)malloc(pcbCert);
CryptGetKeyParam(hKey,
KP_CERTIFICATE,
pbCert,
&pcbCert,
0);

certContext = CertCreateCertificateContext(
MY_ENCODING_TYPE,
pbCert,
pcbCert);

DWORD dataSize;
BYTE* data;
char* tmpString;
DWORD tmpStringSize;

// Äîáàâëÿåì õýø

CertGetCertificateContextProperty(
certContext,
CERT_HASH_PROP_ID,
NULL,
&dataSize);

data = (BYTE*)malloc(dataSize);
tmpString = (char*)malloc((dataSize * 2) + 1);

CertGetCertificateContextProperty(
certContext,
CERT_HASH_PROP_ID,
data,
&dataSize);

CryptBinaryToString(data,
dataSize,
CRYPT_STRING_HEX,
NULL,
&tmpStringSize);

tmpString = (char*)malloc(tmpStringSize);

CryptBinaryToString(
data,
dataSize,
CRYPT_STRING_HEX,
tmpString,
&tmpStringSize);


//Èìÿ Ïîëó÷àòåëÿ
CertGetNameString(
certContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
NULL,
dataSize);
tmpString = (char*)malloc(dataSize);
CertGetNameString(
certContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
tmpString,
dataSize);

StringGrid1->Cells[0][j+1]=tmpString;

j++;
free(pbCert);
free(data);
free(tmpString);
}
в чем проблема?
 
Ответы:
06.03.2007 15:22:53Kirill Sobolev
Первый вызов CertGetNameString дб что-то вроде этого:
dataSize = CertGetNameString(
certContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
NULL,
0);
07.03.2007 6:39:26Волков
Благодарю!