2016-09-01 3 views
2

Ich schrieb ein Java-Card-Applet, das einige Daten in den APDU-Puffer bei Offset ISO7816.OFFSET_CDATA speichert und diese Bytes als Antwort sendet.Was bedeutet das Antwortstatuswort 0x61xx von einer Smartcard?

Util.arrayCopy(Input_Data, (short)0, buffer, (short) ISO7816.OFFSET_CDATA, (short)Datalength); 
apdu.setOutgoing(); 
apdu.setOutgoingLength((short)(DataLength)); 

apdu.sendBytesLong(buffer, ISO7816.OFFSET_CDATA, (short)(DataLength)); 

Ich habe dies in einem Simulator ohne Probleme getestet. Aber wenn ich das auf einer echten Chipkarte (Java Card v2.2.1 von Gemalto) teste, bekomme ich als Antwort das Statuswort 0x6180.

Mein Befehl APDU ist 00 40 00 00 80 Data, wo Daten eine Länge von 128 Bytes hat, so habe ich 4 + 128 Bytes im Puffer und (260- (4 + 128)) Byte ist Null.

Antwort

4

Ihr Simulator verwendet wahrscheinlich T=1 Transportprotokoll, aber Ihre echte Karte nicht. Es verwendet das Protokoll , was bedeutet, dass es entweder Daten empfangen oder Daten in einer einzigen APDU senden kann.

Das Statuswort 0x6180 zeigt an, dass 0x80 Bytes von der Karte empfangen werden. Im Allgemeinen bedeutet 61XXXX Bytes zu empfangen.

Wie Sie sie erhalten? Nun, es gibt einen speziellen APDU-Befehl namens GET RESPONSE. Sie sollten es jedes Mal aufrufen, wenn Sie 61XX Statuswort erhalten. Verwenden Sie XX als Le Byte Ihrer GET RESPONSE APDU

APDU -> 61 XX 
00 C0 00 00 XX -> your data 90 00 

Einige andere Hinweise auf Ihrem Code:

  • Datalength vs DataLength?
  • Kopieren Sie Ihre Ausgangsdaten an 0 statt ISO7816.OFFSET_CDATA
  • Warum Sie DataLength-short jedes Mal geworfen haben? Ist es short? Dann nicht gießen. Ist es byte? Sie werfen es dann falsch, weil der vorzeichenlose Byte-Wert > 0x80 in einen negativen short umgewandelt wird. Der korrekte Cast von einem unsigned byte zu einem short ist (short) (DataLength & 0xFF)
  • Verwenden Sie setOutgoingAndSend wann immer Sie können. Es ist viel einfacher.
  • Verwenden Sie arrayCopyNonAtomic anstelle von arrayCopy, wenn Sie nicht in ein persistentes Array kopieren. Leistung von arrayCopyNonAtomic ist viel besser.
+0

Entschuldigen Sie..Ich nicht und apdu 00 C0 00 00 xx. Ich sende apdu 00 40 00 00 80 Daten, die meine Funktion mit INS = 40 auswählt. Wie wähle ich meine Funktion aus Wenn ich C0 in apdu verwende? –

+0

@FatemeJafari Sie verwenden '00 40 00 00 80 Daten', dann erhalten Sie' 61XX', dann verwenden Sie '00 C0 00 00 XX'. Es ist nur ein spezieller Befehl zum Empfangen von Daten von der Karte. Es gibt Ihnen die Antwort für Ihren '40' Befehl. Sie müssen kein anderes Applet wählen ... – vojta

+0

Vielen Dank Lieber Vojta. In diesem Zustand werde ich meine Antwort in einem Apdu bekommen Wenn ich eine Antwort mehr als 256 habe, was soll ich tun? –