Статус: Участник
  Группы: Участники
 Зарегистрирован: 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"".  но как преобразовать не могу понять. ..  подскажите плз, если кто знает.  Заранее благодарен.   
            
	  
         
     |