Ho una scheda java e scrivo un piccolo codice per inviare APDU alla scheda java. qui quando mi mando comando Init_Update, ricevo 0x6985 come: -Aggiornamento iniziale dato 6985 e 61xx in due diversi scenari
CMD -> 80 50 00 00 08 11 22 33 44 55 66 77 88
RES <- 6985
Ma quando mando questo comando con altro strumento, che sta dando risultato richiesto, come: -
Transmit: 80 50 00 00 08 []
11 22 33 44 55 66 77 88 ."3DUfw.
Card answered: 61 1C
Il mio codice Java sta funzionando bene per altre carte java che ho. Qualcuno potrebbe dirmi ciò che può essere causa di questo comportamento diverso ..
// full java code
public static void main(String[] args) {
// TODO code application logic here
try
{
factory = TerminalFactory.getDefault();
terminals = factory.terminals().list();
terminal = terminals.get(0);
card = terminal.connect("*");
channel =card.getBasicChannel();
CommandAPDU cmdAPDU;
ResponseAPDU response;
byte[] select_isd = {(byte) 0x00,(byte) 0xA4,(byte) 0x04,(byte) 0x00,(byte) 0x08,(byte) 0xA0,(byte) 0x00,
(byte) 0x00,(byte) 0x00,(byte) 0x03,(byte) 0x00,(byte) 0x00,(byte) 0x00 };
cmdAPDU = new CommandAPDU(select_isd);
response = channel.transmit(cmdAPDU);
byte[] INIT_UPDATE = {(byte) 0x80,(byte) 0x50,(byte) 0x00,(byte) 0x00,(byte) 0x08,(byte) 0x11,(byte) 0x22,
(byte) 0x33,(byte) 0x44,(byte) 0x55,(byte) 0x66,(byte) 0x77,(byte) 0x88 };
cmdAPDU = new CommandAPDU(INIT_UPDATE);
response = channel.transmit(cmdAPDU);
}
catch(Exception ex)
{
}
}
altro registro strumento è assomigliare: -
Card opened
12 bytes ATR received:
3B 68 00 00 00 73 C8 40 00 00 90 00
Transmit: 00 A4 04 00 08 [SELECT FILE]
A0 00 00 00 03 00 00 00 ........
Card answered: 61 12
Transmit: 00 C0 00 00 12 [GET RESPONSE]
Card answered: 90 00
6F 10 84 08 A0 00 00 00 03 00 00 00 A5 04 9F 65 o..............e
01 FF ..
Transmit: 80 50 00 00 08 []
11 22 33 44 55 66 77 88 ."3DUfw.
Card answered: 61 1C
Ma quando ho eseguito il mio codice Java sto ottenendo 6985 per il comando INIT_UPDATE .
Per favore fatemi sapere se richiedere qualsiasi altra informazione per il mio lato ..
== === appena aggiunto Ho provato a eseguire il mio script di shell JCOP, il mio script è come: -
/mode trace=on
/terminal
/atr
/send 80CAA08D05
/send 802E000014B555C94B0B2368B4840201808502032288020060
/send 80D8000000
/atr
/send 80500000081122334455667788
e mi dà il risultato richiesto. Lo stesso ho cercato di implementare in Java, il mio nuovo codice Java è assomigliare: - ===== Nuovo aggiornamento codice Java ===
factory = TerminalFactory.getDefault();
terminals = factory.terminals().list();
terminal = terminals.get(0);
card = terminal.connect("*");
channel =card.getBasicChannel();
CommandAPDU cmdAPDU;
ResponseAPDU response;
byte[] x = { (byte) 0x80, (byte) 0xCA, (byte) 0xA0,(byte) 0x8D,(byte)0x05};
byte[] y = { remove command for security reasons};
byte[] z = { (byte) 0x80, (byte) 0xD8, (byte) 0x00, (byte) 0x00, (byte) 0x00}; // it set default key
cmdAPDU = new CommandAPDU(x);
response = channel.transmit(cmdAPDU);
System.out.println(response.toString());
cmdAPDU = new CommandAPDU(y);
response = channel.transmit(cmdAPDU);
System.out.println(response.toString());
cmdAPDU = new CommandAPDU(z);
response = channel.transmit(cmdAPDU);
System.out.println(response.toString());
card.disconnect(true);
card = terminal.connect("*");
channel =card.getBasicChannel();
byte[] INIT_UPDATE = {(byte) 0x80,(byte) 0x50,(byte) 0x00,(byte) 0x00,(byte) 0x08,(byte) 0x11,(byte) 0x22,(byte) 0x33,(byte) 0x44,(byte) 0x55,(byte) 0x66,(byte) 0x77,(byte) 0x88 };
cmdAPDU = new CommandAPDU(INIT_UPDATE);
response = channel.transmit(cmdAPDU);
hai selezionato ISD prima di inviare inizializzare aggiornare o inviare ATR prima di inviare inizializzare aggiornamento? . –
Aggiungi questa parte del tuo codice, se possibile. – Abraham
611C significa che ci sono 0x1C = 28 byte da leggere. Dovresti rispondere a 61XX con il comando GET RESPONSE (00 C0 00 00 XX) per ottenere i tuoi dati di risposta. – vojta