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.
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
@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
@MJay Sehr geehrter Herr Jalali, das Applet in meiner Antwort gibt '6CXX' anstelle von' 61XX' zurück. Vielleicht möchtest du es abmelden. – Abraham