Я пытаюсь использовать 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, и я, вероятно, упускаю некоторые основы.
Мы ценим любые предложения.
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