Статус: Активный участник
Группы: Участники
Зарегистрирован: 30.07.2012(UTC) Сообщений: 34
|
Код:
HCERTSTORE hCertStore = NULL;
PCCERT_CONTEXT pSignerCert=NULL;
LPCSTR lpszCertSubject;
DWORD chpData = 0;
DWORD err;
PCRYPT_KEY_PROV_INFO pCryptKeyProvInfo = NULL;
CRYPT_KEY_PROV_PARAM key_prov_param;
HCRYPTPROV hProv = 0;
BOOL fCallerFreeProv = FALSE;
BYTE *pbPin = (BYTE *)"1234";
DWORD cbPin = 4;
HCRYPTPROV hCryptContProv = NULL;
char* cont_name;
wchar_t *convCp_wbuf = NULL;
char *convCp_buf = NULL;
unsigned short convCp_wbuf_len, convCp_buf_len;
HCRYPTKEY hKey=0;
convCp_wbuf_len = MultiByteToWideChar( CP_ACP , 0, "ne nastupil", -1, NULL, 0);
convCp_wbuf = calloc( sizeof( wchar_t ) , convCp_wbuf_len );
if(MultiByteToWideChar( CP_ACP, 0, "ne nastupil", -1, convCp_wbuf, convCp_wbuf_len)){
lpszCertSubject = (LPCSTR)convCp_wbuf;
}
if ( !( hCertStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
CERT_STORE_NAME)))
{
printf("The MY store could not be opened.");
return(-1);
}else printf("Store opened\n\n");
if(pSignerCert = CertFindCertificateInStore(
hCertStore,
MY_ENCODING_TYPE,
0,
CERT_FIND_SUBJECT_STR,
lpszCertSubject,
NULL))
{
printf("The signer's certificate was found.\n");
}
else
{
printf("Signer certificate not found.");
return(-1);
}
if(!CertGetCertificateContextProperty(pSignerCert,
CERT_KEY_PROV_INFO_PROP_ID,
0,
&chpData))
{
err = GetLastError();
if(err == CRYPT_E_NOT_FOUND)
printf("Не найдена структура ключа");
printf("1");
}
if(!(pCryptKeyProvInfo =
(CRYPT_KEY_PROV_INFO *)malloc(chpData)))
{
printf("Error in allocation of memory.");
}
if(CertGetCertificateContextProperty(
pSignerCert,
CERT_KEY_PROV_INFO_PROP_ID,
pCryptKeyProvInfo,
&chpData))
{
printf("\n The current key container is %S.",
pCryptKeyProvInfo->pwszContainerName);
}
convCp_buf_len = WideCharToMultiByte( CP_UTF8 , 0, pCryptKeyProvInfo->pwszContainerName, -1, NULL, 0, NULL, NULL);
convCp_buf = calloc( sizeof( char ) , convCp_buf_len );
WideCharToMultiByte( CP_UTF8, 0, pCryptKeyProvInfo->pwszContainerName, wcslen(pCryptKeyProvInfo->pwszContainerName), convCp_buf, convCp_buf_len, NULL, NULL );
if(!CryptAcquireContext(
&hCryptContProv,
convCp_buf,
NULL,
PROV_GOST_2001_DH,
0))
{
printf("Контейнер не открылсо");
}
if(!CryptSetProvParam(
hCryptContProv,
PP_SIGNATURE_PIN,
pbPin,
0))
{
printf("Pin не установилсо");
}
if(!CryptSetProvParam(
hCryptContProv,
PP_KEYEXCHANGE_PIN,
pbPin,
0))
{
printf("Pin не установилсо");
}
CryptReleaseContext(hCryptContProv,0);
memset(&key_prov_param, 0, sizeof(CRYPT_KEY_PROV_PARAM));
pCryptKeyProvInfo->cProvParam = 1;
pCryptKeyProvInfo->rgProvParam = &key_prov_param;
key_prov_param.dwFlags = 0;
key_prov_param.dwParam = PP_KEYEXCHANGE_PIN;
key_prov_param.cbData = cbPin;
key_prov_param.pbData = pbPin;
if(!CertSetCertificateContextProperty(pSignerCert,
CERT_KEY_PROV_INFO_PROP_ID,
0,
pCryptKeyProvInfo))
{
err = GetLastError();
if(err == CRYPT_E_NOT_FOUND)
printf("Не найдена структура ключа");
printf("1");
}
if (!CryptAcquireCertificatePrivateKey(pSignerCert,
CRYPT_ACQUIRE_SILENT_FLAG | CRYPT_ACQUIRE_COMPARE_KEY_FLAG,
//CRYPT_ACQUIRE_COMPARE_KEY_FLAG,
NULL,
&hProv,
&chpData,
&fCallerFreeProv)) {
err = GetLastError();
if (err == NTE_BAD_PUBLIC_KEY)
printf ("bad pub");
if (err == NTE_SILENT_CONTEXT)
printf ("silent");
}
|