2016-01-25 5 views
2

У меня есть 4 разных типа JavaCards. Для странной цели я написал следующий апплет вернуть весь буфер APDU на прием каждой команды APDU:Ошибка передачи для T = 0 JavaCards

package bufferReturner; 

import javacard.framework.APDU; 
import javacard.framework.Applet; 
import javacard.framework.ISOException; 

public class BufferReturner extends Applet { 

    private BufferReturner() { 
    } 

    public static void install(byte bArray[], short bOffset, byte bLength) 
      throws ISOException { 
     new BufferReturner().register(); 

    } 

    public void process(APDU arg0) throws ISOException { 
     arg0.setOutgoingAndSend((short)0, (short)256); 
    } 

} 

Когда я посылаю APDU команды моих карт у меня есть следующие результаты:

NXP JCOP v2.4.2 r3 карта - Работа с T = 1

OpenSCTool:> OSC.exe -s 00A404000B0102030405060708090101 -s 00000000 -s 00000000020101 
Using reader with a card: CASTLES EZ100PU 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 01 01 
Received (SW1=0x90, SW2=0x00): 
00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 01 01 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 

Sending: 00 00 00 00 02 01 01 
Received (SW1=0x90, SW2=0x00): 
00 00 00 00 02 01 01 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 

OpenSCTool:> 

Как вы видите выше, моя JCOP карта отвечает мне, как я ожидал. Но у меня есть проблема с моим T = 0 карт:

Fudan FM1280 - Работа с T = 0 (Возвращает 9000 вместо буфера!)

OpenSCTool:> OSC.exe -s 00A404000B0102030405060708090101 -s 00000000 -s 00000000020101 
Using reader with a card: CASTLES EZ100PU 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 01 01 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 00 00 00 
Received (SW1=0x90, SW2=0x00): 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
Sending: 00 00 00 00 02 01 01 
Received (SW1=0x90, SW2=0x00) 

OpenSCTool:> 

Gemalto Top дл v2 - Рабочая с Т = 0 (я сталкиваюсь с передачей не удался ошибка)

OpenSCTool:> OSC.exe -s 00A404000B0102030405060708090101 -s 00000000 -s 00000000020101 
Using reader with a card: CASTLES EZ100PU 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 01 01 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 00 00 00 
Received (SW1=0x90, SW2=0x00): 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
Sending: 00 00 00 00 02 01 01 
APDU transmit failed: Transmit failed 

OpenSCTool:> 

Неизвестной карта - рабочая с Т = 0 (я сталкиваюсь с передачи не удалось ошибка)

OpenSCTool:> OSC.exe -s 00A404000B0102030405060708090101 -s 00000000 -s 00000000020101 
Using reader with a card: CASTLES EZ100PU 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 01 01 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 00 00 00 
Received (SW1=0x90, SW2=0x00): 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
Sending: 00 00 00 00 02 01 01 
APDU transmit failed: Transmit failed 

OpenSCTool:> 

Что с T = 0 карт?

ответ

4

С вашей карточки ничего плохого. На самом деле три карты «T = 0» отвечают как «ожидаемые». Скорее, карта «T = 1»/JCOP возвращает неожиданные результаты.

Вы отправляете следующий ПБДП:

  1. 00A404000B0102030405060708090101
  2. 00000000
  3. 00000000020101

Первый и третий являются случай-3 ПБДП (Lc и поле команды DATA присутствует, Le поле отсутствует). Второй APDU является APDU case-1 (только командный заголовок, но не содержит Lc, DATA и LE). Следовательно, все три APDU четко указывают, что поле ответов не должно быть возвращено. Следовательно, вы никогда не должны вызывать методы setOutgoing*() для таких команд. Обратите внимание, что спецификация Java Card API вполне понятно, на этом и четко сказано, что команды вызова setOutgoing*() на случай-1/Case-3 может привести к неожиданному/неправильное поведение:

Этот метод должен быть вызван только на случай 2 или 4, иначе может возникнуть ошибочное поведение.

Таким образом, вы всегда должны проверять, что у вас есть, и получать и отвечать только на данные, когда это уместно (обычно вы можете определить это на основе кода команды, поскольку вы знаете, что вы ожидаете от каждой инструкции) ,

Почему корпус-1 APDU работает как вы ожидать (т.возвращает поле данных ответа) имеет отношение к формату T = 0 TPDU и способу отображения APDU в этом формате. Т = 0 БДППЫ имеют формат

CLA INS P1 P2 P3 [DATA] 

Поле Р3 всегда присутствует, в то время как поле данных присутствуют только для случая 3-ПБДПА. Следующее соответствие между TPDU и APDU применяется:

  • чехол-4 APDU: непосредственно не поддерживается T = 0 (читатель, как правило, отображает это в случае-3 + команду получить ответ)
  • чехол-3 APDU: P3 = Lc, DATA = DATA
  • Case-2 APDU: P3 = Le, DATA = отсутствует
  • Case-1 APDU: P3 = 0, DATA = отсутствует

Как вы видите, Поле P3 заполняется нулем для APDU case-1. Это означает, что карта не может различать APDU case-2 с Le = 0 и APDU case-1. В результате, при T = 0, любой APDU case-1 будет обрабатываться как APDU case-2. Следовательно, метод setOutgoingAndSend() будет работать для APDU case-1 (00000000 в вашем случае).

 Смежные вопросы

  • Нет связанных вопросов^_^