2015-04-27 32 views
10

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); 
+2

hai selezionato ISD prima di inviare inizializzare aggiornare o inviare ATR prima di inviare inizializzare aggiornamento? . –

+0

Aggiungi questa parte del tuo codice, se possibile. – Abraham

+0

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

risposta

7

6985 mezzi condizioni d'uso non soddisfatti. Dato che finora non hai usato nessuna chiave, probabilmente significa che la carta è stata bloccata o terminata.


611C è una parola di stato utilizzato per l'invio di APDU su T = 0. T = 0 non gestisce sia il comando che la risposta (ovvero "ISO case 4") nello stesso APDU, quindi è necessario un GET RESPONSE per i comandi ISO del caso 4. O la prima applicazione gestisce questo fuori campo (come fa la stessa Java Card) - combinando i due APDU - o crea una connessione T = 1 invece di una connessione T = 0.

Ha poco a che fare con la parola di stato 6985 perché si prevede che questo avviso venga prodotto prima che venga elaborata la logica di business del comando INITIALIZE UPDATE: il comando viene elaborato solo se è possibile produrre l'output.

+0

In realtà la mia carta non è bloccata perché sta dando 611C in un altro strumento, hai ragione, javax.smartcard.io gestisce la risposta internamente, quindi non c'è bisogno di preoccuparsi. Sono preoccupato perché il mio codice Java restituisce 6985 con questa scheda. – Arjun

+0

@Maarten Bodewes: Siamo spiacenti di non essere d'accordo: 69 85 significa ** condizioni d'uso non soddisfatte ** mentre * security.conditions not satisfied * è rappresentato da 69 82. – guidot

+0

@guidit Grazie, risposta sostanzialmente modificata. Ci sono state alcune cose sbagliate, ma l'essenza della risposta rimane la stessa. –

0

È possibile utilizzare BusHound per rilevare alcuni APDU, quindi confrontare e analizzare le differenze tra i due strumenti durante l'invio dei comandi.

+0

Ho provato ma non ho trovato un posto dove inviare il mio comando come: - 80 50 00 00 08 11 22 33 44 55 66 77 88 – Arjun

4
  1. Per SW '6985'

secondo le specifiche Mappatura Indirizzo della esistente Attuazione GP v2.1.1 on v2.2.1: ai sensi della sezione 6.5.2

"Se un sicuro canale è attualmente attivo su un canale logico diverso dal canale logico su cui è stato emesso questo comando (comando Initialize Update), viene restituita una risposta di '6985'. "

Gentilmente verifica con questo comportamento nel caso in cui il comando Inizializza aggiornamento non riesca con 6985.

  1. Per SW '611C'

Se l'informazione è troppo lungo per un singolo campo dati di risposta, allora la carta dovrà restituire l'inizio delle informazioni seguita da SW1 -SW2 impostato su '61XX'. Quindi una successiva risposta GET fornisce 'XX' byte di informazioni. Il processo può essere ripetuto fino a quando la carta invia SW1-SW2 impostato su '9000'.

Qui in questo caso è necessario inviare il comando GET RESPONSE con P3 come 1C e CARD restituirà 1C byte di dati.

+0

Come gestiamo il tipo di canale sicuro, noi semplicemente inviamo 80 50 00 00 08 11 22 33 44 55 66 77 88 ???? – Arjun

+0

@Rohit: 80 50 00 00 08 11 22 33 44 55 66 77 88 non è altro che un comando di aggiornamento inizializzato che con l'aiuto del comando di autenticazione esterna viene utilizzato per avviare la sessione protetta (sessione SCP02). Il comando di aggiornamento inizializzato può dare 6985 a causa di alcuni motivi, in cui uno di questi ho spiegato sopra, vale a dire se i canali logici sono supportati e la sessione protetta è attiva su un dominio di sicurezza in un canale logico, quindi se si tenta di avviare una sessione sicura (tramite l'invio Inizializzato Comando di aggiornamento) sullo stesso dominio di sicurezza in un altro canale logico, il comando di aggiornamento iniziale darà 6985. – LearnAndHelp

+0

Verificare se la sessione protetta è attualmente attiva sullo stesso dominio di sicurezza (su cui si sta inviando il comando di aggiornamento Inizializzato) in qualche altro canale logico. Meglio chiudere tutti gli altri canali logici (se possibile) tramite il comando del canale di Mange (vedere la specifica della piattaforma globale) e quindi controllare lo scenario. – LearnAndHelp

0

Posso chiederti di provare anche questo programma?

public static void main(String[] args) { 
    try{ 
     factory = TerminalFactory.getDefault(); 
     terminals = factory.terminals().list(); 
     terminal = terminals.get(0); 

     card = terminal.connect("*"); 
     channel =card.getBasicChannel(); 

     CommandAPDU cmdAPDU1; 
     CommandAPDU cmdAPDU2; 
     ResponseAPDU response1; 
     ResponseAPDU response2; 

     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 }; 
     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 }; 

     cmdAPDU1 = new CommandAPDU(select_isd); 
     cmdAPDU2 = new CommandAPDU(INIT_UPDATE); 
     response1 = channel.transmit(cmdAPDU1); 
     response2 = channel.transmit(cmdAPDU2); 
     } 
    catch(Exception ex) 
    { 

    } 
} 

Ho paura che se le new CommandAPDU tra transmit metodi, reimpostare la connessione tra la scheda e il lettore.

Aggiornamento:

Se il programma di cui sopra restituiscono lo stesso errore, riprova anche questo:

public static void main(String[] args) { 
    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 }; 
     byte[] get_response={(byte)0x00,(byte)0xC0 ,(byte)0x00 ,(byte)0x00 ,(byte)0x12}; 
     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(select_isd); 
     response = channel.transmit(cmdAPDU); 

     cmdAPDU = new CommandAPDU(get_response); 
     response = channel.transmit(cmdAPDU); 

     cmdAPDU = new CommandAPDU(INIT_UPDATE); 
     response = channel.transmit(cmdAPDU); 

     } 
    catch(Exception ex) 
    { 

    } 
} 

in trepidante attesa per la risposta.

Update-2:

Penso che cercando uno script Python è utile per scoprire qual è il problema. Puoi provare anche questo:

>>> from smartcard.System import readers 
>>> from smartcard.util import toHexString 
>>> 
>>> r=readers() 
#if you have more than one reader or a dual interface reader, put the right index in the below line instead of `0` 
>>> connection = r[0].createConnection() 
>>> connection.connect() 
>>> 
>>> SELECT = [0xA0, 0xA4, 0x04, 0x00, 0x08 , 0xA0 , 0x00 , 0x00 , 0x00 , 0x03 , 0x00 , 0x00 , 0x00 ] 
>>> GET_RESPONSE = [ 0x00, 0xC0, 0x00, 0x00, 0x12] 
>>> INIT_UPDATE= [0x80, 0x50, 0x00, 0x00, 0x08, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88] 
>>> 
>>> data, sw1, sw2 = connection.transmit(SELECT) 
>>> print "%s %x %x" % (data, sw1, sw2) 
>>> 
#if the sw1 and sw2 of above command is not `0x6112`, don't send GET_RESPOSE command. 
>>> data, sw1, sw2 = connection.transmit(GET_RESPONSE) 
>>> print "%s %x %x" % (data, sw1, sw2)  
>>> 
>>> data, sw1, sw2 = connection.transmit(INIT_UPDATE) 
>>> print "%s %x %x" % (data, sw1, sw2) 

Nota che lo script di cui sopra è per Python 2.7 e si deve istall PySCard anche

+0

grazie per il suggerimento. ma il tuo primo esempio restituisce ResponseAPDU: 20 byte, SW = 9000 ResponseAPDU: 2 byte, SW = 6985 e secondo esempio restituendo ResponseAPDU: 20 byte, SW = 9000 ResponseAPDU: 2 byte, SW = 6f00 ResponseAPDU: 2 byte, SW = 6985 – Arjun

+0

È un comportamento totalmente strano. Non so perché sta accadendo. – Arjun

+0

@rohitamitpathak Posso chiederti di provare anche lo script Python che ho aggiunto al mio asnwer nella sezione ** Updae-2 **? – Abraham