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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline i25061  
#1 Оставлено : 28 марта 2012 г. 21:44:00(UTC)
i25061

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

Группы: Участники
Зарегистрирован: 09.03.2011(UTC)
Сообщений: 28
Мужчина
Откуда: Екатеринбург

Сказал «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Программирую под КриптоПро, сервер ЭЦП для ФТС России... возникают проблемы с утечками памяти.
Были утечки в CSP 3.0, и, наверное и сейчас есть, когда программа пользователя многопоточна. В однопоточной программе утечек нет. В связи с чем,
использование этой версии CSP в серверных приложениях требует постоянных перезагрузок оных - абсолютно невозможно!
Новая версия CSP... и опять натыкаюсь на утечки... КриптоПро CSP 3.6R3 Windows32 Течёт криптоапи функция CryptMsgUpdate, примерно, точно не могу сказать, на 170 байтов при каждом вызове. Ещё и возвращает FALSE, когда должна TRUE. Попробуйте - сами увидите.
И чего делать? Знаю, знаю... я - дурак, у меня руки кривые и мозгов нет. Исходник, демонстрирующий проблему - есть
Offline Максим Коллегин  
#2 Оставлено : 28 марта 2012 г. 21:46:01(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Тест в студию. И точную версию CSP и ОС.
Знания в базе знаний, поддержка в техподдержке
Offline Андрей Писарев  
#3 Оставлено : 28 марта 2012 г. 23:00:59(UTC)
Андрей *

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

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

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


i25061 написал:
КриптоПро CSP 3.6R3 Windows32 Течёт криптоапи функция CryptMsgUpdate, примерно, точно не могу сказать, на 170 байтов при каждом вызове. Ещё и возвращает FALSE, когда должна TRUE. Попробуйте - сами увидите.


т.е. если подписывать большой файл + использовать небольшой буфер => на каждый вызов -> дается гарантия утечки?
ушел подписывать большой файл...



p.s. только в Windows32 ?

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

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

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

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

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
Проверил на CryptoPRO R3 (3.6.7027)
OC: Windows 8 Consumer Preview 64x...

Размер подписываемого файла: 2.5 Гб
Размер буфера: 1 мб
Кол-во вызовов CryptMsgUpdate ~ 2500

2500*170 ~ 415 Кб - не выявилось...

Утечки: не выявлено... возможно не так выявляю... Think
Поведение CryptMsgUpdate: адекватное

Отредактировано пользователем 28 марта 2012 г. 23:56:25(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline i25061  
#5 Оставлено : 29 марта 2012 г. 13:48:25(UTC)
i25061

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

Группы: Участники
Зарегистрирован: 09.03.2011(UTC)
Сообщений: 28
Мужчина
Откуда: Екатеринбург

Сказал «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
maxdm написал:
Тест в студию. И точную версию CSP и ОС.
Приготовил тест...
Версия CSP:
Версия ядра СКЗИ: 3.6.5359KC1
Версия продукта: 3.6.6796
Версия ОС:
Название ОС: Microsoft Windows XP Professional
Версия ОС: 5.1.2600 Service Pack 3 сборка 2600
Тип системы: X86-based PC

Запустите программу и понаблюдайте за ней в TaskManager. Очень быстро растёт.
Закоментаренный код покажет, что в массиве signValue находится значение ЭЦП,
а не ещё чего-нибудь.
Подпись сгенерирована на ключе сертификата, взятого с вашего тестового УЦ
алгоритмом "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"
Код:

#include "stdafx.h"
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>

const BYTE signValue[] = {
	0x30, 0x82, 0x02, 0x39, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 
	0x0d, 0x01, 0x07, 0x02, 0xa0, 0x82, 0x02, 0x2a, 0x30, 0x82, 0x02, 
	0x26, 0x02, 0x01, 0x01, 0x31, 0x0c, 0x30, 0x0a, 0x06, 0x06, 0x2a, 
	0x85, 0x03, 0x02, 0x02, 0x09, 0x05, 0x00, 0x30, 0x0b, 0x06, 0x09, 
	0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0x31, 0x82, 
	0x02, 0x04, 0x30, 0x82, 0x02, 0x00, 0x02, 0x01, 0x01, 0x30, 0x73, 
	0x30, 0x65, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 
	0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x11, 0x69, 0x6e, 0x66, 
	0x6f, 0x40, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x70, 0x72, 0x6f, 
	0x2e, 0x72, 0x75, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 
	0x06, 0x13, 0x02, 0x52, 0x55, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 
	0x55, 0x04, 0x0a, 0x13, 0x0a, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 
	0x2d, 0x50, 0x52, 0x4f, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 
	0x04, 0x03, 0x13, 0x16, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x65, 
	0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 
	0x2d, 0x50, 0x52, 0x4f, 0x02, 0x0a, 0x4e, 0x0b, 0x76, 0x24, 0x00, 
	0x02, 0x00, 0x01, 0x6a, 0xd2, 0x30, 0x0a, 0x06, 0x06, 0x2a, 0x85, 
	0x03, 0x02, 0x02, 0x09, 0x05, 0x00, 0xa0, 0x82, 0x01, 0x2a, 0x30, 
	0x18, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 
	0x03, 0x31, 0x0b, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 
	0x01, 0x07, 0x01, 0x30, 0x1c, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 
	0xf7, 0x0d, 0x01, 0x09, 0x05, 0x31, 0x0f, 0x17, 0x0d, 0x31, 0x32, 
	0x30, 0x33, 0x31, 0x39, 0x30, 0x38, 0x33, 0x36, 0x33, 0x38, 0x5a, 
	0x30, 0x2f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 
	0x09, 0x04, 0x31, 0x22, 0x04, 0x20, 0x2c, 0x5d, 0xce, 0x3a, 0x6a, 
	0xc7, 0xca, 0x90, 0xc8, 0xaf, 0xc4, 0xb8, 0x2e, 0x21, 0x16, 0x85, 
	0xb8, 0x65, 0x30, 0xb8, 0xdf, 0xa2, 0x64, 0xf7, 0x38, 0xbd, 0x77, 
	0x6b, 0x63, 0x7b, 0xbb, 0x94, 0x30, 0x81, 0xbe, 0x06, 0x0b, 0x2a, 
	0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x2f, 0x31, 
	0x81, 0xae, 0x30, 0x81, 0xab, 0x30, 0x81, 0xa8, 0x30, 0x81, 0xa5, 
	0x30, 0x08, 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x09, 0x04, 
	0x20, 0xc7, 0x78, 0x6e, 0xd5, 0x3a, 0xbf, 0xae, 0x25, 0x13, 0xb6, 
	0x2c, 0x8f, 0x54, 0x9a, 0x73, 0x77, 0x4c, 0x7c, 0x1a, 0x4f, 0x73, 
	0x2e, 0x16, 0x5f, 0x1a, 0x90, 0x4b, 0x3f, 0xeb, 0xeb, 0x6f, 0x5b, 
	0x30, 0x77, 0x30, 0x69, 0xa4, 0x67, 0x30, 0x65, 0x31, 0x20, 0x30, 
	0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 
	0x01, 0x16, 0x11, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x63, 0x72, 0x79, 
	0x70, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x2e, 0x72, 0x75, 0x31, 0x0b, 
	0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x52, 0x55, 
	0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 
	0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x2d, 0x50, 0x52, 0x4f, 0x31, 
	0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x54, 
	0x65, 0x73, 0x74, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 
	0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x2d, 0x50, 0x52, 0x4f, 0x02, 
	0x0a, 0x4e, 0x0b, 0x76, 0x24, 0x00, 0x02, 0x00, 0x01, 0x6a, 0xd2, 
	0x30, 0x0a, 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x13, 0x05, 
	0x00, 0x04, 0x40, 0x4f, 0x61, 0x6b, 0xac, 0xa4, 0x6c, 0xfd, 0xe0, 
	0x98, 0xc2, 0x27, 0xcb, 0xd0, 0xd1, 0x00, 0x35, 0xdd, 0x9e, 0xc9, 
	0xda, 0x91, 0x4f, 0x40, 0x58, 0xeb, 0x30, 0x5d, 0xab, 0xb9, 0x34, 
	0xfe, 0x92, 0x0f, 0x58, 0x01, 0x03, 0x0a, 0xa2, 0xad, 0xbe, 0x0b, 
	0xde, 0x41, 0xf3, 0x91, 0x9f, 0x5a, 0xb0, 0xca, 0xf0, 0x10, 0xa9, 
	0x96, 0x7f, 0x47, 0xbf, 0xf8, 0xad, 0x1b, 0xf2, 0x26, 0x31, 0x31, 
	0x39
};

void CryptMsgUpdateTest( const BYTE *signValue, DWORD signSize, PFILETIME pft  )
{
	BOOL				bRes = FALSE;
	HCRYPTPROV			hCryptProv = 0;
	HCRYPTMSG			hMsg = 0;
	DWORD				flags = 0;
	int					ret, signerIndex=0;
	DWORD				authAttr_len = 0;
	DWORD				size = 0;
	PCRYPT_ATTR_BLOB	timeBlob = NULL;

	hMsg = CryptMsgOpenToDecode( X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
					flags,
					0,
					hCryptProv,
					NULL,
					NULL);
	if( hMsg )
	{
		ret = CryptMsgUpdate(hMsg, signValue, signSize, TRUE);
		ret = 1; // возвращается FALSE???
/*		if( ret )
		{
			ret = CryptMsgGetParam( hMsg, CMSG_SIGNER_AUTH_ATTR_PARAM,
					signerIndex,
					NULL,
					&authAttr_len);
			if( ret && authAttr_len > 0 )
			{
				PCRYPT_ATTRIBUTES	authAttr = NULL;

				authAttr = (PCRYPT_ATTRIBUTES) malloc(authAttr_len);
				if( authAttr )
				{
					ret = CryptMsgGetParam( hMsg, CMSG_SIGNER_AUTH_ATTR_PARAM,
								signerIndex,
								authAttr,
								&authAttr_len);
					if( ret )
					{
						unsigned int i;

						for (i = 0; i < authAttr->cAttr; i++)
						{
							if (strcmp (authAttr->rgAttr[i].pszObjId, szOID_RSA_signingTime) == 0 &&
									authAttr->rgAttr[i].cValue )
							{
								timeBlob =(authAttr->rgAttr[i]).rgValue;
								size = sizeof (FILETIME);
								ret = CryptDecodeObject(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 
											szOID_RSA_signingTime,    
											timeBlob->pbData,    
											timeBlob->cbData,          
											0,
											(DWORD*) pft,
											&size);
								if( ret )
								{
									bRes = TRUE;
									break;
								}
							}
						}
					}
					free( authAttr );
				}
			}
			else // Нет времени подписи
			{
				if (GetLastError() == CRYPT_E_ATTRIBUTES_MISSING)
				{
				}
			}
		}
*/
		ret = CryptMsgClose( hMsg );
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	FILETIME ft;

	for( int i=0; i < 1000000; i++ )
	{
		if( i%1000==0 ) printf( "i=%d\n", i );
		CryptMsgUpdateTest( signValue, 573, &ft  );
	}
	return 0;
}

Offline Андрей Писарев  
#6 Оставлено : 29 марта 2012 г. 13:55:11(UTC)
Андрей *

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

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

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
i25061 написал:
maxdm написал:
Тест в студию. И точную версию CSP и ОС.
Приготовил тест...
Версия CSP:
Версия ядра СКЗИ: 3.6.5359KC1
Версия продукта: 3.6.6796
Версия ОС:
Название ОС: Microsoft Windows XP Professional
Версия ОС: 5.1.2600 Service Pack 3 сборка 2600
Тип системы: X86-based PC

Запустите программу и понаблюдайте за ней в TaskManager. Очень быстро растёт.
Закоментаренный код покажет, что в массиве signValue находится значение ЭЦП,
а не ещё чего-нибудь.
Подпись сгенерирована на ключе сертификата, взятого с вашего тестового УЦ
алгоритмом "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"
Код:

#include "stdafx.h"
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>

const BYTE signValue[] = {
	0x30, 0x82, 0x02, 0x39, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 
	0x0d, 0x01, 0x07, 0x02, 0xa0, 0x82, 0x02, 0x2a, 0x30, 0x82, 0x02, 
	0x26, 0x02, 0x01, 0x01, 0x31, 0x0c, 0x30, 0x0a, 0x06, 0x06, 0x2a, 
	0x85, 0x03, 0x02, 0x02, 0x09, 0x05, 0x00, 0x30, 0x0b, 0x06, 0x09, 
	0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0x31, 0x82, 
	0x02, 0x04, 0x30, 0x82, 0x02, 0x00, 0x02, 0x01, 0x01, 0x30, 0x73, 
	0x30, 0x65, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 
	0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x11, 0x69, 0x6e, 0x66, 
	0x6f, 0x40, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x70, 0x72, 0x6f, 
	0x2e, 0x72, 0x75, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 
	0x06, 0x13, 0x02, 0x52, 0x55, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 
	0x55, 0x04, 0x0a, 0x13, 0x0a, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 
	0x2d, 0x50, 0x52, 0x4f, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 
	0x04, 0x03, 0x13, 0x16, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x65, 
	0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 
	0x2d, 0x50, 0x52, 0x4f, 0x02, 0x0a, 0x4e, 0x0b, 0x76, 0x24, 0x00, 
	0x02, 0x00, 0x01, 0x6a, 0xd2, 0x30, 0x0a, 0x06, 0x06, 0x2a, 0x85, 
	0x03, 0x02, 0x02, 0x09, 0x05, 0x00, 0xa0, 0x82, 0x01, 0x2a, 0x30, 
	0x18, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 
	0x03, 0x31, 0x0b, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 
	0x01, 0x07, 0x01, 0x30, 0x1c, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 
	0xf7, 0x0d, 0x01, 0x09, 0x05, 0x31, 0x0f, 0x17, 0x0d, 0x31, 0x32, 
	0x30, 0x33, 0x31, 0x39, 0x30, 0x38, 0x33, 0x36, 0x33, 0x38, 0x5a, 
	0x30, 0x2f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 
	0x09, 0x04, 0x31, 0x22, 0x04, 0x20, 0x2c, 0x5d, 0xce, 0x3a, 0x6a, 
	0xc7, 0xca, 0x90, 0xc8, 0xaf, 0xc4, 0xb8, 0x2e, 0x21, 0x16, 0x85, 
	0xb8, 0x65, 0x30, 0xb8, 0xdf, 0xa2, 0x64, 0xf7, 0x38, 0xbd, 0x77, 
	0x6b, 0x63, 0x7b, 0xbb, 0x94, 0x30, 0x81, 0xbe, 0x06, 0x0b, 0x2a, 
	0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x2f, 0x31, 
	0x81, 0xae, 0x30, 0x81, 0xab, 0x30, 0x81, 0xa8, 0x30, 0x81, 0xa5, 
	0x30, 0x08, 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x09, 0x04, 
	0x20, 0xc7, 0x78, 0x6e, 0xd5, 0x3a, 0xbf, 0xae, 0x25, 0x13, 0xb6, 
	0x2c, 0x8f, 0x54, 0x9a, 0x73, 0x77, 0x4c, 0x7c, 0x1a, 0x4f, 0x73, 
	0x2e, 0x16, 0x5f, 0x1a, 0x90, 0x4b, 0x3f, 0xeb, 0xeb, 0x6f, 0x5b, 
	0x30, 0x77, 0x30, 0x69, 0xa4, 0x67, 0x30, 0x65, 0x31, 0x20, 0x30, 
	0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 
	0x01, 0x16, 0x11, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x63, 0x72, 0x79, 
	0x70, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x2e, 0x72, 0x75, 0x31, 0x0b, 
	0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x52, 0x55, 
	0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 
	0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x2d, 0x50, 0x52, 0x4f, 0x31, 
	0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x54, 
	0x65, 0x73, 0x74, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 
	0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x2d, 0x50, 0x52, 0x4f, 0x02, 
	0x0a, 0x4e, 0x0b, 0x76, 0x24, 0x00, 0x02, 0x00, 0x01, 0x6a, 0xd2, 
	0x30, 0x0a, 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x13, 0x05, 
	0x00, 0x04, 0x40, 0x4f, 0x61, 0x6b, 0xac, 0xa4, 0x6c, 0xfd, 0xe0, 
	0x98, 0xc2, 0x27, 0xcb, 0xd0, 0xd1, 0x00, 0x35, 0xdd, 0x9e, 0xc9, 
	0xda, 0x91, 0x4f, 0x40, 0x58, 0xeb, 0x30, 0x5d, 0xab, 0xb9, 0x34, 
	0xfe, 0x92, 0x0f, 0x58, 0x01, 0x03, 0x0a, 0xa2, 0xad, 0xbe, 0x0b, 
	0xde, 0x41, 0xf3, 0x91, 0x9f, 0x5a, 0xb0, 0xca, 0xf0, 0x10, 0xa9, 
	0x96, 0x7f, 0x47, 0xbf, 0xf8, 0xad, 0x1b, 0xf2, 0x26, 0x31, 0x31, 
	0x39
};

void CryptMsgUpdateTest( const BYTE *signValue, DWORD signSize, PFILETIME pft  )
{
	BOOL				bRes = FALSE;
	HCRYPTPROV			hCryptProv = 0;
	HCRYPTMSG			hMsg = 0;
	DWORD				flags = 0;
	int					ret, signerIndex=0;
	DWORD				authAttr_len = 0;
	DWORD				size = 0;
	PCRYPT_ATTR_BLOB	timeBlob = NULL;

	hMsg = CryptMsgOpenToDecode( X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
					flags,
					0,
					hCryptProv,
					NULL,
					NULL);
	if( hMsg )
	{
		ret = CryptMsgUpdate(hMsg, signValue, signSize, TRUE);
		ret = 1; // возвращается FALSE???
/*		if( ret )
		{
			ret = CryptMsgGetParam( hMsg, CMSG_SIGNER_AUTH_ATTR_PARAM,
					signerIndex,
					NULL,
					&authAttr_len);
			if( ret && authAttr_len > 0 )
			{
				PCRYPT_ATTRIBUTES	authAttr = NULL;

				authAttr = (PCRYPT_ATTRIBUTES) malloc(authAttr_len);
				if( authAttr )
				{
					ret = CryptMsgGetParam( hMsg, CMSG_SIGNER_AUTH_ATTR_PARAM,
								signerIndex,
								authAttr,
								&authAttr_len);
					if( ret )
					{
						unsigned int i;

						for (i = 0; i < authAttr->cAttr; i++)
						{
							if (strcmp (authAttr->rgAttr[i].pszObjId, szOID_RSA_signingTime) == 0 &&
									authAttr->rgAttr[i].cValue )
							{
								timeBlob =(authAttr->rgAttr[i]).rgValue;
								size = sizeof (FILETIME);
								ret = CryptDecodeObject(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 
											szOID_RSA_signingTime,    
											timeBlob->pbData,    
											timeBlob->cbData,          
											0,
											(DWORD*) pft,
											&size);
								if( ret )
								{
									bRes = TRUE;
									break;
								}
							}
						}
					}
					free( authAttr );
				}
			}
			else // Нет времени подписи
			{
				if (GetLastError() == CRYPT_E_ATTRIBUTES_MISSING)
				{
				}
			}
		}
*/
		ret = CryptMsgClose( hMsg );
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	FILETIME ft;

	for( int i=0; i < 1000000; i++ )
	{
		if( i%1000==0 ) printf( "i=%d\n", i );
		CryptMsgUpdateTest( signValue, 573, &ft  );
	}
	return 0;
}






Цитата:
hMsg = CryptMsgOpenToDecode( X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
flags,
0,
hCryptProv,
NULL,
NULL);

... много кода....
Цитата:
ret = CryptMsgClose( hMsg );



а вызов CryptReleaseContext(hCryptProv,0); не нужен?

или его кто будет и когда освобождать...




for( int i=0; i < 1000000; i++ )
жестоко....
170 байт на 1 млн вызовов... 170 мб ОЗУ ... так что ли?


Отредактировано пользователем 29 марта 2012 г. 14:10:13(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Максим Коллегин  
#7 Оставлено : 29 марта 2012 г. 14:52:58(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Странная техника обработки ошибок, где про такую можно почитать?
Освобождать контекст нужно, если конечно он не 0.

Отредактировано пользователем 29 марта 2012 г. 14:54:50(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline i25061  
#8 Оставлено : 29 марта 2012 г. 15:03:28(UTC)
i25061

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

Группы: Участники
Зарегистрирован: 09.03.2011(UTC)
Сообщений: 28
Мужчина
Откуда: Екатеринбург

Сказал «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
maxdm написал:
Освобождать контекст нужно, если конечно он не 0.


HCRYPTPROV hCryptProv = 0;

и больше нигде не меняется.
Offline Андрей Писарев  
#9 Оставлено : 29 марта 2012 г. 15:06:22(UTC)
Андрей *

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

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

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
...

Отредактировано пользователем 29 марта 2012 г. 15:10:07(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Максим Коллегин  
#10 Оставлено : 29 марта 2012 г. 15:24:40(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Ну и самое главное - причем здесь КриптоПро?
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (5)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.