Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
Ошибка при шифровании "неправильная подпись"
Статус: Новичок
Группы: Участники
Зарегистрирован: 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.
Из-за чего может быть такая ошибка и куда копать?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,392 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 715 раз в 620 постах
|
А исходники приложения можете предоставить? Вместе с инструкцией по воспроизведению. |
|
|
|
|
Статус: Администратор
Группы: Администраторы, Участники Зарегистрирован: 28.12.2007(UTC) Сообщений: 350 Откуда: ООО "КРИПТО-ПРО"
Поблагодарили: 6 раз в 5 постах
|
Вы уверены, что эту ошибку возвращает именно вызов CryptAcquireContext ??? Т.е. в Вашем коде контролируется код возврата именно этой функции и вызывается GetLastError?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 13.03.2008(UTC) Сообщений: 5
|
Уверен. GetLastError вызывается сразу после того, как из CryptAcquireContext возвращается 0. Пробую воспроизвести ошибку в чистом виде без лишнего кода, чтобы привести исходник.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,392 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 715 раз в 620 постах
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,392 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 715 раз в 620 постах
|
Пока удалось уронить только на win7 build 7000 x86 и win2008 x64 - падает на старте одного из потоков - очень похоже на проблему в Windows - попробуйте первый раз грузить провайдер монопольно (до старта рабочих потоков). |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 13.03.2008(UTC) Сообщений: 5
|
maxdm написал:Пока удалось уронить только на win7 build 7000 x86 и win2008 x64 - падает на старте одного из потоков - очень похоже на проблему в Windows - попробуйте первый раз грузить провайдер монопольно (до старта рабочих потоков). А в чем именно "проблема в Windows", а то это напоминает бубен? Верно ли, что теоретически должно работать и без первой монопольной загрузки?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,392 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 715 раз в 620 постах
|
Проверка подписи под файлом провайдера - что конкрентно падает - не понял - но проблема точно там. Похожую ошибку MS исправлял в Vista SP1 по нашей наводке, но, похоже, исправили не все. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 13.03.2008(UTC) Сообщений: 5
|
Ага, спасибо! Наводите их еще раз :) А мы будем первый раз грузить провайдера в одном потоке - вроде как это де-факто работает.
|
|
|
|
Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
Ошибка при шифровании "неправильная подпись"
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close