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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline postoronnim74  
#1 Оставлено : 13 декабря 2017 г. 15:22:42(UTC)
postoronnim74

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

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

Сказал(а) «Спасибо»: 1 раз
Доброго дня.
Разрабатываю систему изготовления ключевых носителей с использованием УЦ 2.0. Версия КриптоПро CSP: 3.9.8495. Язык разработки - C#.
Требуется заменить дефолтовый ПИН контейнера на вновь сгенерированный с дальнейшей печатью этого ПИН на ПИН-конверт.
Использую следующую функцию:
Код:

        public static void ChangeContainerPin(String container, String oldPin, String newPin)
        {
            String provider = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider";
            uint type = PROV_RSA_FULL;
            uint cspflags = 0; // CRYPT_VERIFYCONTEXT | CSPKEYTYPE;  //no private key access required.
            IntPtr hProv = IntPtr.Zero;

            if (!CryptAcquireContext(ref hProv, container, provider, type, cspflags))
            {
                throw new Exception("Ошибка получения контекста криптопровайдера.", new Win32Exception(Marshal.GetLastWin32Error()));
            }

            if (!CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, Encoding.ASCII.GetBytes(oldPin), 0))
            {
                throw new Exception("Ошибка ввода пин-кода.", new Win32Exception(Marshal.GetLastWin32Error()));
            }

            if (!CryptSetProvParam(hProv, PP_CHANGE_PIN, Encoding.ASCII.GetBytes(newPin), 0))
            {
                var error = Marshal.GetLastWin32Error();
                Console.WriteLine(error.ToString());
                throw new Exception("Ошибка ввода пин-кода.", new Win32Exception(Marshal.GetLastWin32Error()));
            }
        }



Вызов CryptSetProvParam() с флагом PP_CHANGE_PIN возвращает ошибку 0x80090020.
Вызов ChangeContainerPin() производится так:

Код:

CryptoProHelper.ChangeContainerPin("lr-c55e03f0-0780-46c2-be44-df16b5a113c7", "11111111", "1234");


Контейнер с указанным именем на карте присутствует, oldPin правильный.
PP_CHANGE_PIN определен как const uint PP_CHANGE_PIN = 0x0000006C;
Функция CryptSetProvParam() импортируется следующим образом:

Код:

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool CryptSetProvParam(
            IntPtr hProv,
            uint dwParam,
            [In] byte[] pbData,
            uint dwFlags
        );


Подскажите, в чем может быть проблема?

Отредактировано пользователем 13 декабря 2017 г. 15:28:07(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#2 Оставлено : 13 декабря 2017 г. 15:29:04(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2044 раз в 1585 постах
Здравствуйте.


Почему используется:
Код:
 uint type = PROV_RSA_FULL; 
?
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#3 Оставлено : 13 декабря 2017 г. 15:29:40(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2044 раз в 1585 постах
CSP: Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider
тип: 75
Техническую поддержку оказываем тут
Наша база знаний
Offline postoronnim74  
#4 Оставлено : 13 декабря 2017 г. 15:43:29(UTC)
postoronnim74

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

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

Сказал(а) «Спасибо»: 1 раз
Доброго дня, Андрей.
Да, действительно, ошибся. Заменил на 75, но ситуация не изменилась.
Offline Агафьин Сергей  
#5 Оставлено : 13 декабря 2017 г. 15:47:19(UTC)
Grey

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

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

Сказал «Спасибо»: 5 раз
Поблагодарили: 215 раз в 174 постах
Добрый день.
В PP_CHANGE_PIN передаётся не пароль, а структура CRYPT_PIN_PARAM.
С уважением,
Сергей
Техническую поддержку оказываем здесь.
Наша база знаний.
Offline postoronnim74  
#6 Оставлено : 13 декабря 2017 г. 16:39:48(UTC)
postoronnim74

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Grey Перейти к цитате
Добрый день.
В PP_CHANGE_PIN передаётся не пароль, а структура CRYPT_PIN_PARAM.


А если не сложно, могли бы Вы привести пример, как прописать импорт функции с учетом того, что передается структура? Сроки горят, а я ни разу ни C# программист...
Offline Агафьин Сергей  
#7 Оставлено : 13 декабря 2017 г. 17:07:02(UTC)
Grey

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

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

Сказал «Спасибо»: 5 раз
Поблагодарили: 215 раз в 174 постах
Автор: postoronnim74 Перейти к цитате
Автор: Grey Перейти к цитате
Добрый день.
В PP_CHANGE_PIN передаётся не пароль, а структура CRYPT_PIN_PARAM.


А если не сложно, могли бы Вы привести пример, как прописать импорт функции с учетом того, что передается структура? Сроки горят, а я ни разу ни C# программист...


Я тоже ни разу не C#-программист, но на Си выглядит так:
Код:

            CRYPT_PIN_PARAM param;
            param.type = CRYPT_PIN_PASSWD;
            param.dest.passwd = new_password;
            bResult = UniSetProvParam(hProv, PP_CHANGE_PIN, (BYTE*)&param, 0);


Вероятно, у вас будет что-то такое:
Код:

            CRYPT_PIN_PARAM param;
            param.type = CRYPT_PIN_PASSWD;
            param.dest.passwd = Encoding.ASCII.GetBytes(newPin);
            bResult = UniSetProvParam(hProv, PP_CHANGE_PIN, (BYTE*)&param, 0);
С уважением,
Сергей
Техническую поддержку оказываем здесь.
Наша база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.