2016-06-30 2 views
1

Ниже вы видите простой апплет, который возвращает 0x6781 на входящие APDU команды с INS = 0x70 или INS = 0x71:Java Card имеют странный ответ на APDU с INS = 0x70

package testPack; 
import javacard.framework.*; 

public class TestApp extends Applet 
{ 

    public static void install(byte[] bArray, short bOffset, byte bLength) 
    { 
     new TestApp().register(bArray, (short) (bOffset + 1), bArray[bOffset]); 
    } 

    public void process(APDU apdu) 
    { 
     if (selectingApplet()) 
     { 
      return; 
     } 

     byte[] buf = apdu.getBuffer(); 
     switch (buf[ISO7816.OFFSET_INS]) 
     { 
     case (byte)0x70: 
      ISOException.throwIt((short)0x6781); 
      break; 
     case (byte)0x71: 
      ISOException.throwIt((short)0x6781); 
      break; 
     default: 
      ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); 
     } 
    } 
} 

Проблема заключается в том, что, Я получаю 0x6C01 команде APDU с INS = 0x70:

Send: 00 A4 04 00 07 01 02 03 04 05 00 00 00 
Recv: 90 00 

Send: 00 70 00 00 00 
Recv: 6C 01 
Send: 00 70 00 00 01 
Recv: 01 90 00 

Send: 00 71 00 00 00 
Recv: 67 81 

я попробовал два различных Java-карт (Один NXP JCOP v2.4.2 r3, а другой представляет собой Java Card KONA) через оба контактных и бесконтактных интерфейсов и USI ng два разных файла cap, созданных внутри двух разных ноутбуков через две разные IDE !!! (Как подозрительно я? : D) Но ответ равен.

Я подозреваю, что у PCSC или Card Manager есть этот странный ответ. Потому что в симуляторе даже метод process не требует этого специального значения INS.

Что в этом плохого?

ответ

4

INS = 70 с CLA = 00 является командой MANAGE CHANNEL в соответствии со спецификацией ISO-7816, а также INS = A4 означает SELECT.

Если вы хотите использовать эти коды INS, вы должны использовать CLA >= 0x80, чтобы указать, что это ваша проприетарная команда.

+0

Спасибо, дорогой Войта. Имеются ли эти специальные значения только для команды SELECT APDU и для команды MANAGE CHANNEL APDU? Или я должен использовать другую CLA, отличную от 0x00, для всех других команд ISO7816? Я имею в виду, например, я могу использовать 'A2' как INS с CLA = 00 в своем апплете или потому, что он определен для SEARCH RECORD, я должен избегать использования его с CLA = 0x00 тоже? (Можете ли вы, пожалуйста, проверить свой gmail на этот вопрос, связанный с разработкой апплета на SIM-карте?) – Abraham

1

Я думаю, что если класс представляет класс межотраслевого только тогда INS будет работать, как это определено в стандарте, здесь CLA - 00 представляют interindusty команду таким образом, ответ карты behvaiour было как такое же поведение, как управлять командой канала, потому что вы использовали INS = 70.

6.16.4 Response message (nominal case) 

Table 73 - MANAGE CHANNEL response APDU 
Data field Logical channel number if P1-P2='0000' 
Empty if P1-P2!='0000' 
SW1-SW2  Status bytes 

На самом деле ваша карта возвращала вам логический канал no -01. ManageChannel

Мне кажется, что если класс является профессией. здесь INS не будет рассматриваться как определенный INS в стандарте. Надежда CLA 80 с тем же INS 0x70 даст вам требуемый результат.

надеюсь, что это поможет.

[Bit 8 set to 1 indicates the proprietary class] 
Смежные вопросы