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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline stepa  
#1 Оставлено : 17 февраля 2009 г. 16:03:34(UTC)
stepa

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

Группы: Участники
Зарегистрирован: 13.03.2008(UTC)
Сообщений: 5

Добрый день!

Имеем:
Windows 2008 x64 Standard Edition
Версия Крипто Про КС1 3.6.5031 (или 5236)

Примерно на 3000 операций успешного шифрования мы получаем 10 случаев, когда возникает ошибка "System.ComponentModel.Win32Exception: Неправильная подпись". Ошибка возникает еще до собственно шифрования при вызове функции CryptAcquireContext с параметрами pszContainer - NULL, pszProvider - "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider", dwProvType - 75, dwFlags - CRYPT_VERIFYCONTEXT.

Из-за чего может быть такая ошибка и куда копать?
Offline Максим Коллегин  
#2 Оставлено : 18 февраля 2009 г. 14:43:11(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
А исходники приложения можете предоставить? Вместе с инструкцией по воспроизведению.
Знания в базе знаний, поддержка в техподдержке
Offline Василий Дементьев  
#3 Оставлено : 18 февраля 2009 г. 14:45:52(UTC)
Василий Дементьев

Статус: Администратор

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

Поблагодарили: 6 раз в 5 постах
Вы уверены, что эту ошибку возвращает именно вызов CryptAcquireContext ???
Т.е. в Вашем коде контролируется код возврата именно этой функции и вызывается GetLastError?
Offline stepa  
#4 Оставлено : 18 февраля 2009 г. 17:17:06(UTC)
stepa

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

Группы: Участники
Зарегистрирован: 13.03.2008(UTC)
Сообщений: 5

Уверен. GetLastError вызывается сразу после того, как из CryptAcquireContext возвращается 0. Пробую воспроизвести ошибку в чистом виде без лишнего кода, чтобы привести исходник.
Offline stepa  
#5 Оставлено : 19 февраля 2009 г. 11:30:48(UTC)
stepa

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

Группы: Участники
Зарегистрирован: 13.03.2008(UTC)
Сообщений: 5

Добрый день!

Вот такой код почти стабильно воспроизводит ошибку:
Код:

	internal class Program
	{
		private static void Main()
		{
			Thread[] threads = new Thread[8];
			for(int i = 0; i < threads.Length; i++)
			{
				threads[i] = new Thread(Start);
				threads[i].Name = "thread" + i;
				threads[i].Start();
//				Thread.Sleep(1000);
			}
			for(int i = 0; i < threads.Length; i++)
				threads[i].Join();
			Log("the whole work was done!");
		}

		private static void Start()
		{
			const string containerName = null;
			const string cryptoProviderName = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider";
			const int cryptoProviderType = 75;

			for(int i = 0; i < Int32.MaxValue; i++)
			{
				if(i % 10000 == 0)
					Log(string.Format("{0} iterations done", i));
				try
				{
					IntPtr cryptoProvider = IntPtr.Zero;
					try
					{
						if(!CryptAcquireContext(out cryptoProvider, containerName, cryptoProviderName, cryptoProviderType, CRYPT_VERIFYCONTEXT))
							throw new Win32Exception();
					}
					finally
					{
						if(cryptoProvider != IntPtr.Zero && !CryptReleaseContext(cryptoProvider, 0))
							throw new Win32Exception();
					}
				}
				catch(Exception e)
				{
					Log(string.Format("i = {0}: {1}", i, e));
				}
			}
		}
		
		private static void Log(string message)
		{
			Console.WriteLine(string.Format("{0}: {1}", Thread.CurrentThread.Name, message));
		}

		[DllImport("Advapi32.dll", SetLastError = true)]
		public static extern Boolean CryptAcquireContext([Out] out IntPtr cryptoProvider, String container, String providerName, Int32 providerType, int flags);

		[DllImport("Advapi32.dll", SetLastError = true)]
		public static extern Boolean CryptReleaseContext(IntPtr cryptoProvider, Int32 flags);

		public const int CRYPT_VERIFYCONTEXT = unchecked((int)0xF0000000);
	}


Причем если раскомментировать "Thread.Sleep(1000);", то ошибка не воспроизводится. А еще ошибка происходит на других версиях криптопро (КС1 3.0.3293), но с другим сообщением: "Win32Exception: Неправильный зарегистрированный набор ключей".

То есть все дело в многопоточности. Остается только понять, как правильно ее готовить.

Upd: еще, судя по всему, на каких-то версиях криптопро (или винды), ошибка не воспроизводится, так как мы ее стали наблюдать недавно

Отредактировано пользователем 19 февраля 2009 г. 11:37:39(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#6 Оставлено : 19 февраля 2009 г. 12:19:02(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
А долго ждать ошибку?
Знания в базе знаний, поддержка в техподдержке
Offline Максим Коллегин  
#7 Оставлено : 19 февраля 2009 г. 13:17:37(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Пока удалось уронить только на win7 build 7000 x86 и win2008 x64 - падает на старте одного из потоков - очень похоже на проблему в Windows - попробуйте первый раз грузить провайдер монопольно (до старта рабочих потоков).
Знания в базе знаний, поддержка в техподдержке
Offline stepa  
#8 Оставлено : 19 февраля 2009 г. 13:25:10(UTC)
stepa

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

Группы: Участники
Зарегистрирован: 13.03.2008(UTC)
Сообщений: 5

maxdm написал:
Пока удалось уронить только на win7 build 7000 x86 и win2008 x64 - падает на старте одного из потоков - очень похоже на проблему в Windows - попробуйте первый раз грузить провайдер монопольно (до старта рабочих потоков).

А в чем именно "проблема в Windows", а то это напоминает бубен? Верно ли, что теоретически должно работать и без первой монопольной загрузки?
Offline Максим Коллегин  
#9 Оставлено : 19 февраля 2009 г. 15:21:16(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Проверка подписи под файлом провайдера - что конкрентно падает - не понял - но проблема точно там. Похожую ошибку MS исправлял в Vista SP1 по нашей наводке, но, похоже, исправили не все.
Знания в базе знаний, поддержка в техподдержке
Offline stepa  
#10 Оставлено : 19 февраля 2009 г. 16:03:39(UTC)
stepa

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

Группы: Участники
Зарегистрирован: 13.03.2008(UTC)
Сообщений: 5

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