Я пытаюсь использовать RSACryptoServiceProvider с CspParameters, которые указывают на глобальный вывод. Он работает правильно, если я использую пин-код приложения, но когда я использую глобальный пин-код, происходит сбой со следующим: «Невозможно получить доступ к карте, поскольку был представлен неправильный пин-код».
Будет ли работать, когда я использую глобальный пин-код? Есть ли опция, которая сообщает, какой тип булавки искать?
Заранее спасибо.
Обновление:
Я получаю объект обнаружения со смарт-карты, если это существует. Это скажет мне две вещи, которые я хочу знать.
1). Если на карте есть как приложение, так и глобальные контакты. (первый байт использования вывода> = 60)
2). Какой вывод считается основным. (второй байт 0x10 = app, 0x20 = global)
У меня есть карта, NIST Test Pivcard 3, которая имеет оба контакта, но глобальный контакт является первичным. Для этой карты, когда я ввожу глобальный пин-код в моей тестовой форме, я могу сделать проверку по ней, и она правильно проверит пин-код. (CLA = 0x00, INS = 0x20, P1 = 0x00, P2 = 0x00, Lc = 0x8)
Я могу сделать то же самое для этой карты, если вместо этого введу контакт приложения (с P2, установленным в 0x80) и он проверяет его правильно.
После того, как я проверил пин-код, установил 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, и я, вероятно, упускаю некоторые основы.
Буду признателен за любые предложения.