Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,709 Сказал «Спасибо»: 500 раз Поблагодарили: 2051 раз в 1591 постах
|
Здравствуйте. Почему используется: Код: uint type = PROV_RSA_FULL;
? |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,709 Сказал «Спасибо»: 500 раз Поблагодарили: 2051 раз в 1591 постах
|
CSP: Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider тип: 75 |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.11.2017(UTC) Сообщений: 8
Сказал(а) «Спасибо»: 1 раз
|
Доброго дня, Андрей. Да, действительно, ошибся. Заменил на 75, но ситуация не изменилась.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 12.08.2013(UTC) Сообщений: 834 Откуда: Москва Сказал «Спасибо»: 5 раз Поблагодарили: 215 раз в 174 постах
|
Добрый день. В PP_CHANGE_PIN передаётся не пароль, а структура CRYPT_PIN_PARAM. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.11.2017(UTC) Сообщений: 8
Сказал(а) «Спасибо»: 1 раз
|
Автор: Grey Добрый день. В PP_CHANGE_PIN передаётся не пароль, а структура CRYPT_PIN_PARAM. А если не сложно, могли бы Вы привести пример, как прописать импорт функции с учетом того, что передается структура? Сроки горят, а я ни разу ни C# программист...
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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*)¶m, 0);
Вероятно, у вас будет что-то такое: Код:
CRYPT_PIN_PARAM param;
param.type = CRYPT_PIN_PASSWD;
param.dest.passwd = Encoding.ASCII.GetBytes(newPin);
bResult = UniSetProvParam(hProv, PP_CHANGE_PIN, (BYTE*)¶m, 0);
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close