2016-06-30 37 views
1

Unten Sie ein einfaches Applet sehen, die 0x6781 auf eingehende APDU gibt Befehle mit IN = 0x70 oder IN = 0x71:Java Card hat eine seltsame Antwort mit auf APDU IN = 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); 
     } 
    } 
} 

Das Problem ist, dass, ich erhalte 0x6C01 zum APDU-Befehl mit 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 

ich zwei verschiedene Java Cards versucht (One ist NXP JCOP v2.4.2 r3 und das andere eine KONA Java-Karte) durch beide kontaktbehaftete und kontakt Schnittstellen und usi ng zwei verschiedene cap-dateien, die in zwei verschiedenen laptops über zwei verschiedene IDEs erzeugt werden !!! (Wie verdächtig bin ich? : D) Aber die Antwort ist gleich.

Ich vermute, der PCSC oder Card Manager für diese seltsame Antwort. Weil im Simulator selbst die Methode process diesen speziellen INS-Wert nicht benötigt.

Was ist los damit?

Antwort

4

INS = 70 mit CLA = 00 ist der Befehl MANAGE CHANNEL gemäß der Spezifikation ISO-7816, und INS = A4 bedeutet SELECT.

Wenn Sie diese INS-Codes verwenden möchten, müssen Sie verwenden, um anzugeben, dass es sich um Ihren proprietären Befehl handelt.

+0

Vielen Dank liebe Vojta. Sind diese speziellen Werte auf den SELECT APDU-Befehl und den MANAGE CHANNEL APDU-Befehl beschränkt? Oder muss ich eine andere CLA als 0x00 für alle anderen ISO7816-Befehle auch verwenden? Ich meine, zum Beispiel, kann ich 'A2' als INS mit CLA = 00 in meinem Applet verwenden oder weil es für SEARCH RECORD definiert ist, muss ich vermeiden, es auch mit CLA = 0x00 zu verwenden? (Könnten Sie bitte auch Ihre Gmail für die SIM-Karten-Applet-Entwicklungsfrage überprüfen?) – Abraham

1

Ich denke, wenn Klasse interindustriellen Klasse haben, dann nur INS wird in Standard definiert arbeiten, hier CLA - 00 daher interindusty Befehl darstellen, Karten Antwort behvaiour wie gleiche Verhalten wurde als Kanalbefehl verwalten, weil Sie INS verwendet = 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 

tatsächlich hat Ihre Karte den logischen Kanal Nr. -01 an Sie zurückgegeben. ManageChannel

Es scheint mir, dass wenn Klasse propriatry ist. Hier wird INS im Standard nicht als definiertes INS behandelt. Hope CLA 80 mit demselben INS 0x70 wird Ihnen das Ergebnis liefern.

hoffe es hilft.