2015-11-22 6 views
0

Я тестирую несколько неизвестных смарт-карт, которые, как я знаю, соответствуют ISO7816-4. Карты, которые я собрал, принадлежат одному и тому же оператору, и все они могут работать взаимозаменяемо.Javax SmartCardIO Weird Error 6700 Length Неверный

Я отправлял команды APDU на карту через библиотеку Java SmartCardIO и считыватель ACR122U, а также с помощью телефона Android через библиотеку ISODEP.

На моем устройстве Android, я послал следующее APDU и все работает отлично,

tag.transceive(new byte[] {(byte)0x80, (byte)0x30, (byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00 }) 

Все 10 из 10 карт работать находку.

На моем рабочем столе у ​​меня есть следующий код:

answer = channel.transmit(new CommandAPDU(new byte[] { (byte)0x80, (byte)0x30, (byte)0x03, (byte)0x00, (byte)0x00 })); 

этот код отлично с 3 из 10 карт работает, другие 7 я получаю неправильную ошибку 6700 длины. Для остальных 7 я должен использовать этот код,

answer = channel.transmit(new CommandAPDU(new byte[] { (byte)0x90, (byte)0x32, (byte)0x03, (byte)0x00, (byte)0x00,(byte)0x00, (byte)0x00 })); 

Я также не могу использовать этот код для указанных выше 3-х карт, я получаю ошибку неправильной длин.

Я не могу понять, в чем проблема, почему добавление дополнительных 2 нулевых байтов заставляет его работать? Я не сталкиваюсь с этой проблемой на своем устройстве Android, все карты работают только с одной строкой.

ответ

2

Поскольку все эти инструкции относятся к запатентованному диапазону, я не слишком уверен в значении и случаях (DECREASE?), Но предполагаю, что это случай 4, позволяющий командные данные и ответ.

Все ваши APDU явно искажены. Если у вас нет данных команды, LC = 0 не должен указываться. Нули также не могут быть LE, так как это либо закодировано в один байт (короткий), либо 3 байта (расширенная длина) в отсутствие LC. Это добавление двух нулевых байтов работает, означает, что вы несколько успешно переходите к расширенной длине,

Я рекомендую обратиться к парам ответа на команды ISO 7816-4.