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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Denis0515  
#1 Оставлено : 23 мая 2019 г. 15:20:05(UTC)
Denis0515

Статус: Новичок

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

Поблагодарили: 1 раз в 1 постах
Здравствуйте!

При вызове функции CryptMsgControl с параметром CMSG_CTRL_DECRYPT происходит утечка памяти (если верить Valgrind).

valgrind:
Код:
==1017== 
==1017== 48 bytes in 1 blocks are definitely lost in loss record 75 of 213
==1017==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1017==    by 0x51C05DF: CryptImportKey (in /opt/cprocsp/lib/amd64/libcapi10.so.4.0.4)
==1017==    by 0x573B1FE: ??? (in /opt/cprocsp/lib/amd64/libcapi20.so.4.0.4)
==1017==    by 0x54A8532: ??? (in /opt/cprocsp/lib/amd64/libcapi20.so.4.0.4)
==1017==    by 0x54A8ED9: ??? (in /opt/cprocsp/lib/amd64/libcapi20.so.4.0.4)
==1017==    by 0x54F32E1: CryptMsgControl (in /opt/cprocsp/lib/amd64/libcapi20.so.4.0.4)
==1017==    by 0x4011C7: decrypt() (main.cpp:60)
==1017==    by 0x40129F: main (main.cpp:70)
==1017== 


пример кода:
Код:
	const DWORD dwEnc = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;

	std::ifstream f("file", std::ios::in | std::ios::binary);

	CMSG_STREAM_INFO streamInf;
	...

	auto hMsg = CryptMsgOpenToDecode(dwEnc, 0, 0, 0, nullptr, &streamInf);

	char buffer[1024];

	auto n = sizeof(buffer);
	while (n == sizeof(buffer)) {
		n = f.readsome(buffer, sizeof(buffer));
		CryptMsgUpdate(hMsg, reinterpret_cast<BYTE*>(buffer), n,
				n < sizeof(buffer));
	}

	DWORD cbSize = 0;
	CryptMsgGetParam(hMsg, CMSG_RECIPIENT_INFO_PARAM, 0, nullptr, &cbSize);

	auto info = reinterpret_cast<CERT_INFO*>(new char[cbSize]);
	CryptMsgGetParam(hMsg, CMSG_RECIPIENT_INFO_PARAM, 0, info, &cbSize);


	auto certStore = CertOpenSystemStore(0, "MY");
	auto cert = CertFindCertificateInStore(certStore, dwEnc, 0,
			CERT_FIND_SUBJECT_CERT, info, nullptr);

	CMSG_CTRL_DECRYPT_PARA decrPara;
	bzero(&decrPara, sizeof(decrPara));
	decrPara.cbSize = sizeof(decrPara);

	CryptAcquireCertificatePrivateKey(cert, CRYPT_ACQUIRE_CACHE_FLAG |
			CRYPT_ACQUIRE_COMPARE_KEY_FLAG, nullptr,
			&decrPara.hCryptProv, &decrPara.dwKeySpec, nullptr);
	CryptMsgControl(hMsg, 0, CMSG_CTRL_DECRYPT, &decrPara);


	CryptReleaseContext(decrPara.hCryptProv, 0);
	delete [] reinterpret_cast<char*>(info);
	CertFreeCertificateContext(cert);
	CertCloseStore(certStore, 0);
	CryptMsgClose(hMsg);


ОС Ubuntu Linux 16.04.
CryptoPro for Linux 4.0 R4. (x86_64, deb).

Примечание:
если убрать CMSG_STREAM_INFO, то утечки не будет.

Отредактировано пользователем 23 мая 2019 г. 15:32:59(UTC)  | Причина: Не указана

Offline Denis0515  
#2 Оставлено : 24 мая 2019 г. 12:34:24(UTC)
Denis0515

Статус: Новичок

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

Поблагодарили: 1 раз в 1 постах
Попробовал скомпилировать с КриптоПро 4.0 r5 (4.0.9969-5_amd64), проблема сохраняется.
Offline Русев Андрей  
#3 Оставлено : 24 мая 2019 г. 14:51:08(UTC)
Русев Андрей

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

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,260

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 442 раз в 322 постах
Спасибо за диагностику, посмотрим. В нашем коде похожие куски, но valgrind на них не выдаёт ошибок. Надо разобраться повнимательней.
Официальная техподдержка. Официальная база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.