2016-06-08 29 views
2

Ich entwickle ein Programm in Java Card. manchmal, wenn ich einen Befehl an die Karte senden, antwortet es als "0X61 0Xxx" was bedeutet, es gibt eine Antwort mit 0Xxx Länge und ich sollte antworten, um es zu bekommen.Wie wird die 2-stufige Kartenantwort in 1-Schritt geändert?

Meine Frage ist, wie kann ich diese Art von Antworten vermeiden und die Antwort sofort erhalten?

Vielen Dank im Voraus

+4

Unterstützt Ihre Karte das 'T = 1'-Protokoll (Sie können es von der ATR [hier] (http://www.ruimtools.com/atr.php) herausfinden)? Wenn ja - verbinden Sie sich tatsächlich mit diesem Protokoll (hängt davon ab, wie Sie mit der Karte sprechen)? Erhalten Sie diesen 0x61xx-Status jedes Mal, wenn die Kartenantwort Daten enthält (oder hängt sie von der tatsächlichen Befehls-APDU ab - d. H. Was bedeutet "manchmal")? – vlp

+0

@vlp In der Tat bekomme ich diese Nachricht einmal in zehn Befehle und es kommt in vielen Fällen nicht zurück Ich schreibe Funktionen in meinem Applet! Bedeutet das, dass ich eine korrekte Schreibweise in meinem Applet verwenden oder eine richtige APDU senden kann, um es nicht zu bekommen? Unterstützt meine Karte T = 1? – MJay

+0

@MJay ​​Sehr geehrter Herr Jalali, das Applet in meiner Antwort gibt '6CXX' anstelle von' 61XX' zurück. Vielleicht möchtest du es abmelden. – Abraham

Antwort

4

Kommt drauf an!

Manchmal empfangen Sie 61XX, weil Sie mit einem Applet kommunizieren, das als solches geschrieben wird! Ich meine, das Applet ist so geschrieben, dass es seine Daten mit GET RESPONSE APDU-Befehl zurückgibt. In diesem Fall können Sie nichts anderes tun, als den Applet-Entwickler aufzufordern, das Applet wie gewünscht zu ändern.

Aber manchmal ist es nicht das Applet, das die Daten wie oben beschrieben zurückgibt, aber es ist die Smartcard. Die Smartcard gibt Daten tatsächlich als solche zurück. Sie müssen also nur Ihre Smartcard zu einer neueren Karte wechseln, die das Kommunikationsprotokoll T=1 unterstützt. In diesem Fall verfügen Sie über eine einzelne Applet-CAP-Datei und bei der Installation auf einer -Karte werden Daten in zwei Schritten zurückgegeben. Wenn Sie sie auf einer Smartcard T=1 installieren, werden die Daten in einem Schritt zurückgegeben.


Angenommen, Sie haben Ihr Programm wie folgt geschrieben. Es verfügt über vier verschiedene APDU-Befehle (INS = 00, 01, 02, 03) den temp Byte-Array Inhalt Benutzer zurückzukehren:

package soq; 

import javacard.framework.*; 

public class SOQ extends Applet 
{ 
    byte[] temp = {(byte)'T',(byte)'h',(byte)'i',(byte)'s', 
        (byte)'-',(byte)'I',(byte)'s',(byte)'-', 
        (byte)'A',(byte)'-',(byte)'T',(byte)'e',(byte)'s',(byte)'t'}; 

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

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

     byte[] buf = apdu.getBuffer(); 
     short le; 

     switch (buf[ISO7816.OFFSET_INS]) 
     { 
     case (byte)0x00: 
      apdu.setOutgoing(); 
      apdu.setOutgoingLength((short)14); 
      apdu.sendBytesLong(temp, (short)0, (short)14); 
      break; 

     case (byte) 0x01: 
      Util.arrayCopyNonAtomic(temp, (short)0, buf, (short)0, (short)14); 
      apdu.setOutgoingAndSend((short)0, (short)14); 
      break; 

     case (byte) 0x02: 
      le = apdu.setOutgoing(); 
      if (le != (short)0x000E){ 
       ISOException.throwIt((short)0x6C0E); 
      }else{ 
       Util.arrayCopyNonAtomic(temp, (short)0, buf, (short)0, (short)14); 
       apdu.setOutgoingLength((short)le); 
       apdu.sendBytes((short)0, le); 
      } 
      break; 

     case (byte) 0x03: 
      le = apdu.setOutgoing(); 
      if (le != (short)0x000E){ 
       ISOException.throwIt((short)0x6C0E); 
      }else{ 
       apdu.setOutgoingLength((short)14); 
       apdu.sendBytesLong(temp, (short)0, le); 
      } 
      break; 
     default: 
      ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); 
     } 
    } 

} 

Wenn es auf einer Karte installiert ist, der auf T=1 Protokollen mit Benutzern kommunizieren, dann haben Sie:

Select Applet begin... 
Select Applet successful. 

Send: 00 00 00 00 00 
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00 

Send: 00 01 00 00 00 
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00 

Send: 00 02 00 00 00 
Recv: 6C 0E 
Send: 00 02 00 00 0E 
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00 

Send: 00 03 00 00 00 
Recv: 6C 0E 
Send: 00 03 00 00 0E 
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00 

Und wenn es auf einer Karte installiert ist, der auf T=0 Protokollen mit Benutzern kommunizieren, dann haben Sie:

Select Applet begin... 
Select Applet successful. 

Send: 00 00 00 00 00 
Recv: 6C 0E 
Send: 00 00 00 00 0E 
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00 

Send: 00 01 00 00 00 
Recv: 6C 0E 
Send: 00 01 00 00 0E 
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00 

Send: 00 02 00 00 00 
Recv: 6C 0E 
Send: 00 02 00 00 0E 
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00 

Send: 00 03 00 00 00 
Recv: 6C 0E 
Send: 00 03 00 00 0E 
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00 

Wie Sie oben sehen, geben APDU-Befehle mit INS=0x2 or 0x03 und Le=0x00 in beiden Fällen 0x6C0E zurück. Dies liegt daran, dass das Applet als solches geschrieben wird. Aber für INS=0x00 or 0x01 hängt der Rückgabewert vom Kommunikationsprotokoll ab. Für T=1 geben sie 0x6C0E zurück und für T=1 geben sie die Daten zurück.

+0

Wie ich denke, sendBytesLong() Funktion ist etwas von der Karte zurückzugeben. wenn für irgendein INS der Code mit dieser Funktion endet, d. h. etwas zurückgibt. Wird es immer noch von T = 0 oder T = 1 Protokoll abhängen? Könnten Sie klarstellen, dass das Abrufen von Daten von der Karte davon abhängt, wie der Code ausgeführt wurde [z. B. Karte, die die Funktion sendBytesLong() zum Zurückgeben von Daten verwendet] oder Protokoll, das von der Karte unterstützt wird. hoffe mein Zweifel ist dir klar .. – Arjun

+1

@Arjun Liebe Rohit, überprüfe die aktualisierte Antwort. Ich habe etwas Code hinzugefügt, um es klarzustellen. – Abraham