logo Обзор КриптоПро NGate для защищённого доступа к корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Vasko  
#1 Оставлено : 12 декабря 2008 г. 17:56:34(UTC)
Vasko

Статус: Участник

Группы: Участники
Зарегистрирован: 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"". но как преобразовать не могу понять. .. подскажите плз, если кто знает.
Заранее благодарен.
Offline Максим Коллегин  
#2 Оставлено : 12 декабря 2008 г. 18:09:35(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 5,640
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 12 раз
Поблагодарили: 545 раз в 495 постах
MultiByteToWideChar

Отредактировано пользователем 12 декабря 2008 г. 18:10:12(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline Vasko  
#3 Оставлено : 12 декабря 2008 г. 18:50:21(UTC)
Vasko

Статус: Участник

Группы: Участники
Зарегистрирован: 13.11.2008(UTC)
Сообщений: 27
Откуда: Russia

спс за ссылочку. делаю следующим образом:
Код:
WCHAR SIGNER_NAME1[256];
MultiByteToWideChar(CP_ACP, 0, SIGNER_NAME, strlen(SIGNER_NAME)+1, SIGNER_NAME1,strlen(SIGNER_NAME)+1);
_tprintf(TEXT("tratata\n"), SIGNER_NAME1);
 

но не уверен что правильно задаю последние 2 параметра. . .
Offline Максим Коллегин  
#4 Оставлено : 12 декабря 2008 г. 19:01:10(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 5,640
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 12 раз
Поблагодарили: 545 раз в 495 постах
Знания в базе знаний, поддержка в техподдержке
Offline Vasko  
#5 Оставлено : 12 декабря 2008 г. 19:08:04(UTC)
Vasko

Статус: Участник

Группы: Участники
Зарегистрирован: 13.11.2008(UTC)
Сообщений: 27
Откуда: Russia

спасибо большое!!! вроде всё работает.. .
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.