Il sito dedicato all'informatica ideato da Iasparra Francesco

Firma digitale: rilevare la Smart Card o Token

  • Come rilevare il dipositivo di firma attraverso le nuove API di SmartCardIO di Java

  • Data: 02/10/2015 Autore: Iasparra Francesco 

Prima di tutto, per incominciare un po' di teoria:

PC/SC è lo standard riguardando l'interazione di un computer (PC) con una o diverse smart card (SC), e ovviamente via uno o vari lettori/ scrittori. PC/SC è disponibile nella maggior parte dei sistemi operativi, come Windows, Linux e Mac OS. Una Smart Card comunica con l’esterno attraverso dati incapsulati in APDU (Application Protocol Data Unit), che rappresenta il blocco minimo di Byte scambiati tra carta e dispositivo lettore. Il processore della carta assume un ruolo passivo (inizialmente) in cui aspetta un messaggio di Reset da parte del terminale cui è collegato (attraverso il lettore). Dopo tale segnale la carta risponde inviando un messaggio particolare, definito come ATR (Answer To Reset), poi aspetta ulteriori comandi. Sono definiti due protocolli di comunicazione, T=0 e T=1.

Pinout card

Esistono vari standard legati alle Smart Card, uno dei più utilizzati è il PKCS#11 sviluppato dalla RSA; le Card che sono conformi a questo standard vengono fornite insieme ad una libreria di funzioni, generalmente scritte in C, che ne permettono l'implementazione. Queste librerie possono essere sfruttate anche attraverso altri linguaggi di programmazione tramite delle interfacce chiamate Wrapper.

Le operazioni di I/O sulla Smart Card possono avvenire attraverso due tipi differenti di Wrapper:

- lo IAIK PKCS#11 (Wrapper sviluppato dall'Institute for Applied Information Processing and Communication dell'University of Technology di Graz)

- SunPKCS#11 (Wrapper prodotto dalla Sun disponibile a partire dalla release 1.5 del development kit).

Il pacchetto Java SmartCard I/O API (javax.smartcardio) è definito dal JSR 268 e implementato dal 6 (JRE / JDK 1.6). È un mezzo portatile e interoperabile di fare communicare applet o applicazione Java con le smart card. Funziona come un wrapper alla pila PC/SC.

L'ATR nelle smart card è l'acronimo per "Answer To Reset", ovvero il primo messaggio che la smart card restituisce dopo un reset del lettore. L'ATR viene anche usato per identicare il tipo di smart card.

Infatti l'ATR identifica univocamente il modello esatto di una smart card, è composto da caratteri alfanumerici e viene assegnato in fabbrica dal produttore. L'ATR di norma viene usato per validare una smart card o per capire di che modello si tratti.

Per determinare quale wrapper PCKS11 deve essere utilizzato e' importante ottenere l'ATR del dispositivo.

L'ATR viene rilevato utilizzando alcune semplici chiamate PCSC, che ovviamente presuppongono la presenza di un servizio PCSC funzionante sul sistema.

Se il proprio token non utilizza PCSC (alcuni token USB usano il protocollo HID), e' necessatio configurare manualmente la libreria pkcs11 da utilizzare.

package appletsign.smartcard;

import java.util.List;
import javax.smartcardio.*;
import org.bouncycastle.util.encoders.Hex;

public class DeterminesType {

    sun.security.pkcs11.wrapper.PKCS11 PKCS11=null;
    
    public static String getATRType() throws Exception{
        String result="";
        TerminalFactory factory = TerminalFactory.getDefault();
        List terminals = factory.terminals().list();
        if (terminals.size()>0){
            CardTerminal terminal = terminals.get(0);
            Card card = terminal.connect("*");
            ATR atr=card.getATR();
            result=new String(Hex.encode(atr.getBytes()));
            CardChannel channel = card.getBasicChannel();
            card.disconnect(false);
        }
        return result;
    }
    
    public static void doSomeLowLevelOperation() throws CardException {
        TerminalFactory factory = TerminalFactory.getDefault();
        List terminals = factory.terminals().list();
        CardTerminal terminal = terminals.get(0);
        Card card = terminal.connect("*");
        card.disconnect(false);
    }
}    

La funzione getATRType() restutuira', la dove viene rilevata una Smart Card o Token collagata con protocollo PC/SC, una stringa che ci identifica il tipo di scheda.


  • Java

  • Php

  • Mysql

  • Apache ant

  • Eclipse

  • Spring

  • Hibernate

  • Netbeans

  • Debian

  • Linux

  • Maven