Работает ли RSACryptoServiceProvider, когда вы пытаетесь подписать с помощью закрытого ключа карты PIV и глобального PIN-кода?

Я пытаюсь использовать RSACryptoServiceProvider с параметрами CspParameters, которые указывают на глобальный контакт. Он работает правильно, если я использую пин-код приложения, но когда я использую глобальный пин-код, он выдает ошибку: «Невозможно получить доступ к карте, потому что был представлен неправильный пин-код».

Будет ли это работать, когда я использую глобальный пин-код? Есть ли опция, которая сообщает ему, какой тип булавки искать?

Заранее спасибо.

Обновлять:

Я получаю объект обнаружения со смарт-карты, если он существует. Это скажет мне две вещи, которые я хочу знать.

1). Если у карты есть и прикладной, и глобальный пин. (первый байт использования вывода >= 60)

2). Какой пин считать первичным. (второй байт 0x10 = приложение, 0x20 = глобальный)

У меня есть карта NIST Test Pivcard 3, у которой есть оба контакта, но глобальный контакт является основным. Для этой карты, когда я ввожу глобальный пин-код в свою тестовую форму, я могу выполнить проверку, и она правильно проверяет пин-код. (CLA=0x00, INS=0x20, P1=0x00, P2=0x00, Lc=0x8)

Я могу сделать то же самое для этой карты, если вместо этого введу пин-код приложения (с P2, установленным на 0x80), и он проверит его правильно.

После проверки PIN-кода, установки AID и получения других данных x509 с карты я пытаюсь подписать некоторые хешированные данные с помощью закрытого ключа карты.

Используя RSACryptoServiceProvider и CspParameters, он терпит неудачу всякий раз, когда я передаю ему глобальный контакт. Я получаю "Невозможно получить доступ к карте, потому что был представлен неправильный PIN-код".

Если я передам ему действительный пин-код приложения, он будет работать нормально.

Мой код выглядит так:

try
{
SecureString ss = new SecureString();
char[] PINs = PIN.ToCharArray();
foreach (char a in PINs)
{
    ss.AppendChar(a);
}
CspParameters csp = new CspParameters(1, "Microsoft Base Smart Card Crypto Provider");
csp.Flags = CspProviderFlags.UseDefaultKeyContainer;
csp.KeyPassword = ss;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
byte[] data = File.ReadAllBytes(hashFile);
sig = rsa.SignHash(data, "SHA1");
bool verified = rsa.VerifyHash(data, CryptoConfig.MapNameToOID("SHA1"), sig);
}
catch (Exception ex)
{
  txt_msg.Text = ex.Message;
  etc...
}

Есть ли здесь какой-то флаг, который мне не хватает, чтобы сказать, что используемый контакт является глобальным контактом? Или нам не разрешено использовать глобальный пин? Или я пропустил что-то еще здесь? Это моя первая попытка использовать RSACryptoServiceProvider, и я, вероятно, упускаю некоторые основы.

Мы ценим любые предложения.


person Dsm_01    schedule 17.04.2020    source источник
comment
Вы должны написать новый PIN-код, прежде чем сможете открыть его с помощью нового PIN-кода. Так вы сохранили PIN-код?   -  person jdweng    schedule 17.04.2020
comment
Я просто пытаюсь использовать закрытый ключ карты и существующий пин-код для подписи некоторых хешированных данных. Я не пытаюсь сделать новый PIN-код. Он завершается с ошибкой при выполнении команды RSACryptoServiceProvider. то есть CspParameters csp = new CspParameters(1, "Microsoft Base Smart Card Crypto Provider"); csp.Flags = CspProviderFlags.UseDefaultKeyContainer; csp.KeyPassword = ss; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);   -  person Dsm_01    schedule 17.04.2020


Ответы (1)


Вы, кажется, предполагаете, что PIN-коды в некоторой степени заменяемы в том смысле, что глобальный PIN-код является подходящей заменой для конкретного приложения. Это неправда.

Хотя карта могла быть настроена таким образом (принимая глобальный PIN-код, скажем, № 1, ИЛИ PIN-код приложения № 2), ваша карта, очевидно, не подходит. Если карта не предлагает выбора, поставщик услуг не может добиться успеха. Даже если поставщик услуг использует нужный вам PIN-код и сравнение прошло успешно, карта не позволит использовать закрытый ключ.

И нет, вы не можете изменить идентификатор PIN-кода, необходимого для подписи, по своему усмотрению, поскольку этот путь также будет доступен для злоумышленника.

(Все эти ответы предполагают, что вам не разрешено изменять содержимое карты, например, вы являетесь обычным держателем карты.)

person guidot    schedule 17.04.2020
comment
Привет Гвидо. Спасибо за ответ. Я использую тестовую карту NIST № 3, если вы знакомы с их картами. У него есть объект обнаружения, который показывает, что он допускает оба типа контактов (глобальный и прикладной). Он также указывает, что глобальный PIN-код является основным PIN-кодом. Когда я использую pkcs15-crypt для подписи данных с помощью этой карты, она работает с любым PIN-кодом. Но когда я использую RSACryptoServiceProvider и глобальный PIN-код, он не работает. Однако PIN-код приложения работает. Мне просто кажется, что если глобальный PIN-код является основным, я смогу использовать его для подписи. Но, возможно, я что-то упускаю. - person Dsm_01; 18.04.2020
comment
Я обновил пост, пытаясь прояснить ситуацию. - person Dsm_01; 22.04.2020