Статус: Участник
Группы: Участники
Зарегистрирован: 13.11.2008(UTC) Сообщений: 27 Откуда: Russia
|
Добрый день. работаю над созданием и верификацией цифровой подписи с использованием eToken. Возникла проблема следующего рода: если при создании ЭЦП объявлять SIGNER_NAME как #define SIGNER_NAME L"Петров Петр Петрович" всё ок. Но мне нужно "Петров Петр Петрович" получать программно с eToken. Делаю это следующим образом: Код:LPBYTE pbUserCert;
HCRYPTKEY hKey = 0;
HCRYPTPROV phProv;
DWORD size;
DWORD fParam = CRYPT_FIRST;
PCCERT_CONTEXT pUserCert=0;
DWORD dwUserCertLength=0;
DWORD name_size;
char *SIGNER_NAME;
CString CERT_STORE;
CryptAcquireContext( &phProv,
NULL,
"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",75,
CRYPT_VERIFYCONTEXT
);
while( CryptGetProvParam(phProv, PP_ENUMCONTAINERS, NULL, &size, fParam) )
{
BYTE * ContNameD=(BYTE*)malloc(sizeof(BYTE*)*size);
int len = (int)size;
CryptGetProvParam(phProv, PP_ENUMCONTAINERS, ContNameD, &size, fParam);
ContNameD[len]=0;
CERT_STORE = (CString) ContNameD;
printf(CERT_STORE);
fParam = 0;
}
if(!CryptAcquireContext(&phProv,CERT_STORE,
"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",75,CRYPT_MACHINE_KEYSET))
MyHandleError("CryptAcquireContext");
if(!CryptGetUserKey(phProv,AT_KEYEXCHANGE,&hKey))
MyHandleError("CryptGetUserKey");
/*if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, NULL,&dwUserCertLength, 0))
{
MyHandleError ("Error during GetKeyParam.\n");
}
pbUserCert = (BYTE*)malloc (dwUserCertLength);
if (pbUserCert == NULL)
{
MyHandleError ("Error during malloc.\n");
}
if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, pbUserCert,&dwUserCertLength, 0))
{
MyHandleError ("Error during GetKeyParam.\n");
}
/*pUserCert = CertCreateCertificateContext (
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbUserCert,
dwUserCertLength);
if (pUserCert == NULL)
{
MyHandleError ("Error during CertCreateCertificateContext.\n");
}
name_size = CertNameToStr(MY_ENCODING_TYPE,
&(pUserCert->pCertInfo->Subject),
CERT_SIMPLE_NAME_STR,
NULL,
0);
if(!(SIGNER_NAME = (char *)malloc(name_size * sizeof(TCHAR))))
{
MyHandleError(TEXT("Memory allocation failed."));
}
name_size = CertNameToStr(MY_ENCODING_TYPE,
&(pUserCert->pCertInfo->Subject),
CERT_SIMPLE_NAME_STR,
SIGNER_NAME,
name_size);
_tprintf(TEXT("Subject -> %s.\n"), SIGNER_NAME);
CryptReleaseContext(phProv,0);
for(int l=0;l<=3;l++) *SIGNER_NAME=*SIGNER_NAME++;
printf("\n");
//CharToOem(SIGNER_NAME,SIGNER_NAME);
//OemToAnsi(SIGNER_NAME,SIGNER_NAME);
//long SIGNER_NAME=SIGNER_NAME;
_tprintf(SIGNER_NAME);
и тогда возникает ошибка при вызове(т.е. говорит что не может найти сертификат) Код:CertFindCertificateInStore(
hCertStore,
MY_ENCODING_TYPE,
0,
CERT_FIND_SUBJECT_STR,
SIGNER_NAME,
NULL))
Я так понимаю что проблема в том, что в программе получаю SIGNER_NAME типа char * , а надо как L"". но как преобразовать не могу понять. .. подскажите плз, если кто знает. Заранее благодарен.
|