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