Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline mgurov  
#1 Оставлено : 27 июня 2012 г. 23:37:34(UTC)
mgurov

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

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

Здравствуйте!

возник вопрос в подписи

если я использую функцию CryptSignHash, то выходной файл весит 64 б и при его открытии винда пишет ошибку "файл не может использоваться как pkcs 7"

при использовании функции CryptSignMessage выходной файл весит больше и открывается нормально.

вот фрагмент кода
Код:


	
	// .... получаю мой сертификат

	//....
	

	HCRYPTPROV hProv;

	DWORD dwKeySpec; 

	BOOL fCallerFreeProv; 



	if(!CryptAcquireCertificatePrivateKey(

		pSignerCert, 

		CRYPT_ACQUIRE_COMPARE_KEY_FLAG, 

		NULL, 

		&hProv, 

		&dwKeySpec, 

		&fCallerFreeProv 

	))

	{

             return -3;

	}





	

	HCRYPTKEY hUserKey;



	if(! CryptGetUserKey(hProv,AT_KEYEXCHANGE,&hUserKey))

	{

             return -4;

	}



	HCRYPTHASH hHash;

	

	if(!CryptCreateHash(

		hProv, 

		CertOIDToAlgId("1.2.643.2.2.9"),//alg.aiAlgid, 

		hUserKey, 

		0, 

		&hHash)) 

	{

		return -5;

	}



    HANDLE hFile = NULL;

    BYTE rgbFile[BUFSIZE];

    DWORD cbRead = 0;

    DWORD dwStatus = 0;

    BOOL bResult = FALSE;



	hFile = CreateFile(file_name,

        GENERIC_READ,

        FILE_SHARE_READ,

        NULL,

        OPEN_EXISTING,

        FILE_FLAG_SEQUENTIAL_SCAN,

        NULL);



    if (INVALID_HANDLE_VALUE == hFile)

	{

	return -6;

	}



    while (bResult = ReadFile(hFile, rgbFile, 1024, 

        &cbRead, NULL))

    {

        if (0 == cbRead)

        {

            break;

        }



        if (!CryptHashData(hHash, rgbFile, cbRead, 0))

		{

		return -7;

		}

    }



    if (!bResult)

	{

		return -8;

	}





	BYTE  *pbSignature;

	DWORD dwSigLen;



	if(!CryptSignHash(

		hHash, 

		dwKeySpec,//AT_KEYEXCHANGE,

		NULL, 

		0, 

		NULL, 

		&dwSigLen)) 

	{

		return -9;

	}



	if((pbSignature = new BYTE[dwSigLen]) == 0) 

	{

		return -10;

	}



	if(!CryptSignHash(

		hHash, 

		dwKeySpec,

		NULL, 

		0, 

		pbSignature, 

		&dwSigLen)) 

	{

		return -11;

	}



	FILE *sf;



	if(_waccess(sign_file,0)==0)

	{

		sf = _wfopen(sign_file,L"rb+");

		if(sf!=NULL)

			fseek(sf,0,SEEK_END);

	} else

	{

		sf = _wfopen(sign_file,L"wb");

	}



	if(sf==NULL)

	{

		return -12;

	}



	if(fwrite(pbSignature,dwSigLen,1,sf)!=1)

	{

		fclose(sf);

		return -13;

	}



	fclose(sf);


скажите пожалуйста, что не так?
Offline Андрей Писарев  
#2 Оставлено : 28 июня 2012 г. 0:01:51(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,523
Мужчина
Российская Федерация

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
CryptSignHash формирует само значение ЭЦП = 64 байта (зашифрованный с участием закрытого ключа хеш) vs

CryptSignMessage => PKCS7 (содержащий сертификаты, (не)подписанные атрибуты и т.д.)


Отредактировано пользователем 28 июня 2012 г. 0:18:26(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#3 Оставлено : 28 июня 2012 г. 0:05:14(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,523
Мужчина
Российская Федерация

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
Цитата:
весит 64 б и при его открытии винда пишет ошибку "файл не может использоваться как pkcs 7"

а что должно быть?

Цитата:
винда: не могу показать вложенные сертификаты, так?

т.е. более доходчиво, чем про какой-то pkcs7...

Отредактировано пользователем 28 июня 2012 г. 0:06:54(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline mgurov  
#4 Оставлено : 28 июня 2012 г. 14:04:03(UTC)
mgurov

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

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

спасибо огромное за ликбез!

а не подскажете, можно ли имея этот зашифрованный хеш, получить как то этот самый pkcs файл?

может есть какие то структуры, которые если правильно заполнить и сохранить как набор байт, то получится желаемый результат...
Offline Андрей Писарев  
#5 Оставлено : 28 июня 2012 г. 14:32:37(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,523
Мужчина
Российская Федерация

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
mgurov написал:
спасибо огромное за ликбез!

а не подскажете, можно ли имея этот зашифрованный хеш, получить как то этот самый pkcs файл?

может есть какие то структуры, которые если правильно заполнить и сохранить как набор байт, то получится желаемый результат...


т.е. реализовать кодирование структур в ASN.1, чтобы на выходе получить тот же Pkcs7 ?

А что же мешает использовать функции, которые уже все это сами реализуют (Низкоуровневые vs Высокоуровневые функции ) ?

Отредактировано пользователем 28 июня 2012 г. 14:41:16(UTC)  | Причина: Не указана

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