Как использовать расширенный APDU с Windows SmartCard Framework - PullRequest
4 голосов
/ 31 марта 2011

Я использую WinSCard для считывания смарт-карты, совместимой с ISO 7816 (точнее, это карта PIV).На карте есть картинка размером примерно 12 КБ.Прямо сейчас я подключаюсь в режиме T = 1 и использую функцию SCardTransmit для отправки моей команды GET DATA APDU, за которой следует набор команд GET RESPONSE APDU.В итоге я получаю все данные с карты, но для SCardTransmit требуется более 40 вызовов, потому что я могу получить только 256 байтов за вызов.Для завершения каждого вызова требуется около полсекунды, поэтому для считывания 12 КБ данных требуется почти 20 секунд.

Я думаю, что смогу сделать это быстрее.Спецификация NIST гласит, что «Время извлечения 12,5 килобайт (КБ) данных через контактный интерфейс считывателя не должно превышать 2,0 секунды».Спецификация ссылается на APDU расширенной длины, поэтому я думаю, что он поддерживается, но его использование не задокументировано.Я попытался выяснить это, но не могу заставить его работать.

Вот текущая команда, которая возвращает 256 байтов со статусом 0x61 0x00, что означает, что есть больше данных для получения.

new byte[] {
     0x00,               // CLA
     0xCB,               // INS
     0x3F,               // P1
     0xFF,               // P2
     0x05,               // Lc
     0x5C, 0x03,         // Data Field
     0x5F, 0xC1, 0x09,   // ... (Data)
     0x00                // Le
};

Часть 5.3.2 спецификации ISO-7815-4 говорит это о кодировке Le:

Случай 4E - L = 5 + (B2 || B3), (B1)= 0 и (B2 || B3) = 0

  • Поле Lc состоит из первых 3 байтов, где B2 и B3 код Lc (! = 0) оцениваются от 1 до 65535
  • B4-Bl-2 - это байты Lc поля данных
  • Поле Le состоит из последних 2 байтов Bl-1 и Bl, код Le которых имеет значение от 1 до 65536

Я понял, что моя команда должна выглядеть так:

new byte[] {
     0x00,               // CLA
     0xCB,               // INS
     0x3F,               // P1
     0xFF,               // P2
     0x00, 0x00, 0x05,   // Lc
     0x5C, 0x03,         // Data Field
     0x5F, 0xC1, 0x09,   // ... (Data)
     0x00, 0x00          // Le
};

Но это не работает.Я получаю код ответа 0x67 0x00, что означает «неправильная длина», и данные не извлекаются с карты.Идеи?

Ответы [ 2 ]

4 голосов
/ 01 апреля 2011

Расширенный APDU, который вы пытаетесь отправить, правильный, но возможно, что ваша карта не поддерживает расширенные APDU.Версия Java Card на карте должна быть выше 2.2.2, чтобы можно было отправлять такие команды.

0 голосов
/ 05 апреля 2011

Для получения дополнительной справочной информации (также относится к Windows): http://pcsclite.alioth.debian.org/ccid_extended_apdu.html

...