LETTURA SMART CARD

di il
3 risposte

LETTURA SMART CARD

Ciao a tutti sono nuovissimo di questo forum e spero che qualcuno possa darmi una mano !
Per motivi di lavoro mi sono trovato a dover utilizzare un dispositivo per la firma digitale per l'esattezza un "ELCOM Secure Sign" al cui interno è presente un lettore di Smart card OMNIKEY CardMan 3x21 ...
Detto ciò , dovrei scrivere un programmino in JAVA che mi restituisca piu dati possibili dalle diverse smartcard in circolazione (logicamente solo quelli fruibili non i dat protetti come date , codici di sicurezza etcc ) per esempio il PAN di una carta di credito o il codice fiscale di una CRS.
Sto chiedendo aiuto perchè sto incontrando serie difficoltà nell inviare le (da me odiate) APDU alle smart card per poter ottenere i dati che mi servono .
Al momento posto una parte di codice che mi serve per collegarmi al lettore e vedere se la carta inserita è presente ...
... sono bloccato , in crisi , non trovo documentazione e ho gia consultato centinaia di siti,forum,libri relative alle smart card alla loro programmazione .

import java.util.List;

import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;



public class Prova {

   public static void main(String [] args) throws CardException
   {
    // stampo lista lettori
    TerminalFactory factory = TerminalFactory.getDefault();
    List<CardTerminal> terminals = factory.terminals().list();
    System.out.println("Terminals: " + terminals);
   
    // prendo il primo lettore
    CardTerminal terminal = terminals.get(0);
   
    //stabilisco connessioen con la carta
    Card card = terminal.connect("T=1"); //T1 per CRS -- dovrò implementare anche il T0 per le altre carte
    System.out.println("card: " + card);
    CardChannel channel = card.getBasicChannel();
   
    /*CommandAPDU(byte[] apdu)
   Constructs a CommandAPDU from a byte array containing the complete APDU contents (header and body).
   farò cosi
     */
   

    //cosi ho selezionato la MF
    ResponseAPDU r = channel.transmit(new CommandAPDU((byte)0x00,(byte)0xA4,(byte)0x00,(byte)0x00,(byte)0x3F));
    System.out.println(r);
    // disconnect
    card.disconnect(false);
   }
}
Spero che qualcuno mi posso aiutare .

3 Risposte

  • Re: LETTURA SMART CARD

    Aggiungo una parte di codice che mi permette di ricavare l'ATR di una qualsiasi smart card ma sono allo stesso punto non so come utilizzare le APDu tramite il CommandAPDU help me!!!
    
    import java.util.List;
    
    import javax.smartcardio.ATR;
    import javax.smartcardio.Card;
    import javax.smartcardio.CardChannel;
    import javax.smartcardio.CardException;
    import javax.smartcardio.CardTerminal;
    import javax.smartcardio.CommandAPDU;
    import javax.smartcardio.ResponseAPDU;
    import javax.smartcardio.TerminalFactory;
    
    
    
    public class LetturaSmartCard {
    
    	public static void main(String [] args) throws CardException
    	{
    	
    	 // stampo lista lettori 
        TerminalFactory factory = TerminalFactory.getDefault();
        List<CardTerminal> terminals = factory.terminals().list();
        System.out.println("Lista lettori smart card collegati: " + terminals);
        
        // prendo il primo lettore
        CardTerminal terminal = terminals.get(0);
        
        System.out.println("Lettore utilizzato: " + terminal);
        //stabilisco connessione con la carta
        
        Card card = terminal.connect("*"); 
        // System.out.println(card.getProtocol());
        System.out.println("\n\nCarta inserita: " + card);
        CardChannel channel = card.getBasicChannel();
    
    
     
        ATR atr = card.getATR();
        byte[] ATR = atr.getBytes();
        System.out.println("ATR della carta: "+LetturaSmartCard.bytesToHex(ATR));
        
        
        
        
        // disconnect
        card.disconnect(false);
        
    	
    
    
    	}
    	 public static String bytesToHex (byte[] bytes) {
    	        StringBuilder sb = new StringBuilder(bytes.length * 2);
    	        for (int i=0; i< bytes.length; i++) {
    	            sb.append(String.format("%02x", bytes[i]));
    	        }
    	                
    	        return sb.toString();
    	    }
    	 
    }
    
    Aspetto notizie !! Help me !!
  • Re: LETTURA SMART CARD

    Ho risolto tramite diversi tool ...
    Premetto il tutto che per programmare utilizzo ECLIPSE sono quindi andato ad importare un progetto Open Smart Card Developer questo è il link dove ci sono tutte le istruzioni per scaricare il tool di scripting con il progetto scripts contenete un infinità di script per la lettura / test di tutte le principali EMV ...
    un aiuto aggiuntivo ceh mi sento di darvi è questo link http://dexterous-programmer.blogspot.it/2012/04/emv-transaction-step-1-application.html contenete la lista competa delle principali AID da utilizare per la lettura dei principali tipi di EMV in commercio
    spero che queste informazioni possano servire a qualcuno se io le avessi avute prima avrei risparmiato 2giornate di ricerche
  • Re: LETTURA SMART CARD

    Che dati sei riuscito ad estrarre?
    Io con questi due comandi (uno di select file e l'altro di get data) riesco ad estrarre "ID", "DATAINIZIO", "DATASCADENZA", "COGNOME", "NOME", "DATANASCITA", "SESSO", "CF", "PROVINCIA", "COMUNE".
    
    public static final byte[] SELECT_FILE_APDU = {(byte) 0x00, (byte) 0xA4, (byte) 0x08, (byte) 0x00, (byte) 0x04, (byte) 0x11, (byte) 0x00, (byte) 0x11, (byte) 0x02, (byte) 0x00};
    
    public static final byte[] READ_BINARY_APDU = {(byte) 0x00, (byte) 0xB0, (byte) 0x00, (byte) 0x00, (byte) 0xff};
    
Devi accedere o registrarti per scrivere nel forum
3 risposte