Работает ли RSACryptoServiceProvider, когда вы пытаетесь подписать, используя закрытый ключ карты PIV и глобальный пин-код? - PullRequest
0 голосов
/ 17 апреля 2020

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

Буду признателен за любые предложения.

1 Ответ

0 голосов
/ 18 апреля 2020

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

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

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

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

...