|
|||||||||||||||||||||||||||||||||
La JavaCard GalactIC 1.0, prodotta da De La Rue, rappresenta piuttosto bene la maggior parte delle JavaCard disponibili dalla seconda metà dell’anno 1999. Il formato adottato è quello standard delle SmartCard, le risorse disponibili sono nella media rispetto ai prodotti degli altri fornitori e gli strumenti forniti a corredo permettono di affrontare tutte le problematiche legate all’installazione e all’uso delle JavaCard Applet. |
|||||||||||||||||||||||||||||||||
Nell’articolo
precedente sono state descritte le caratteristiche tecniche della JavaCard
GalactIC 1.0, gli strumenti forniti dal produttore per l’installazione
ed il test di JavaCard Applet e le principali caratteristiche tecniche
del dispositivo.
In quest’articolo saranno trattati il sistema operativo della JavaCard GalactIC 1.0, le particolarità dei comandi APDU proprie di questo dispositivo e l’interfaccia fornita per l’accesso alla JavaCard dal Personal Computer cui sono collegate. Per
la corretta interpretazione di quest’articolo si consiglia vivamente la
lettura dei precedenti articoli pubblicati dall’autore su MokaByte (numeri
di Gennaio 2000, Febbraio 2000, Marzo 2000 e Aprile 2000), oltre naturalmente
alla prima parte di quest’articolo. Alcuni dei concetti trattati in questa
sede necessitano, infatti, di conoscenze sul campo delle JavaCard.
JavaCard Galactic
1.0
Il sistema operativo implementato sulle JavaCard GalactIC permette la comunicazione della carta con il lettore tramite un opportuno protocollo e fornisce una serie d’istruzioni per la configurazione di servizio della carta. Notare che buona parte del sistema operativo è implementata da una JavaCard Applet particolare, detta Basic Card Domain (dominio della carta). Questa JavaCard Applet è la prima ad essere caricata sulla carta (tramite apposite istruzioni) ed è quella che fornisce tutti i comandi riportati in questo paragrafo. Esistono delle procedure apposite per intervenire sul dominio di una carta, che permettono, per esempio, la sostituzione dello stesso con un nuovo dominio. Queste informazioni sono purtroppo mantenute riservate da De La Rue, poiché l’opportunità di intervenire sulla carta a questo livello permetterebbe in maniera molto semplice la clonazione delle carte e quindi dell’utilizzo non autorizzato delle tecnologie sviluppate dall’azienda. Di seguito sono riportate informazioni sulle istruzioni, definite di sistema operativo, accessibili dagli sviluppatori. Queste istruzioni sono utilizzabili tramite appositi comandi APDU. I dettagli sulla sintassi di questi comandi e sulle risposte restituite dalla carta sono reperibili nel manuale del sistema operativo del kit GalactIC ver. 1.0 di De La Rue. In questo paragrafo si privilegiano invece le informazioni relative alle scelte seguite a livello concettuale dai progettisti del sistema operativo. Ecco
l’elenco delle istruzioni di sistema operativo accessibili dal programmatore
su JavaCard GalactIC ver. 1.0 tramite comandi APDU:
Il procedimento seguito dalla JavaCard e dall’entità esterna, per il calcolo delle chiavi MAC ed ENC di sessione, può essere schematizzato come mostrato in figura 1. XXX_figura1_XXX
Terminata l’analisi del sistema operativo della JavaCard GalactIC 1.0, conviene analizzare brevemente alcune caratteristiche avanzate sui comandi APDU adottati da questo dispositivo. Le JavaCard GalactIC ver. 1.0 utilizzano, infatti, una formattazione dei comandi APDU leggermente differente da quella definita dalle norme ISO 7816 parte 4. Inoltre, questa parte dell’articolo risulta molto utile per capire come reperire i risultati dalle JavaCard. La
formattazione richiesta ai comandi APDU, sia per quanto riguarda la loro
creazione all’esterno per l’invio alla JavaCard, sia per quanto riguarda
la loro disponibilità a livello di JavaCard Applet, differisce da
quella definita dalle norme ISO 7816 parte 4 per questi dettagli:
I rimanenti comandi APDU (di tipo 2 e di tipo 3), così come la risposta restituita, rispettano invece le specifiche delle norme ISO 7816 parte 4. Queste JavaCard necessitano anche della gestione esplicita, da parte dello sviluppatore, del recupero dall’esterno dei dati di risposta risultato di comandi APDU di tipo 2 e di tipo 4. La
necessità di reperire esplicitamente i dati di risposta per i comandi
APDU di tipo 2 inviati alla carta si presenta quando la lunghezza della
risposta attesa (indicata nel comando APDU e denominata Le) non è
uguale alle lunghezza della risposta effettiva restituita dalla JavaCard
correntemente selezionata. Questo può avvenire fondamentalmente
per due motivi: la lunghezza della risposta attesa è sconosciuta
(per cui nell’APDU di tipo 2 si utilizza una lunghezza Le uguale a zero,
cioè lunghezza indefinita), oppure la lunghezza indicata Le è
errata (per qualche motivo la JavaCard Applet correntemente selezionata
risponde con una lunghezza diversa da quella attesa). In questa situazione,
il sistema operativo della carta risponde con uno stato che indica quale
situazione si è verificata e la lunghezza esatta della risposta,
lasciando al programmatore il compito di reperire il risultato. Di seguito
sono riportate le possibili risposte che sono fornite dal sistema operativo:
Il
procedimento da seguire per reperire i dati di risposta nel caso in cui
sia stato restituito all’esterno uno degli stati 0x61LL esadecimale o 0x6CLL
esadecimale differisce in funzione dello stato ritornato:
Di seguito è infine trattata l’API che permette di gestire la JavaCard GalactIC 1.0 dal PC a cui questa è collegata. Questa è particolarmente importante poiché è l’unica interfaccia disponibile allo sviluppatore di applicazioni basate su JavaCard per accedere al dispositivo. Per permettere la comunicazione di applicazioni o applet scritte in Java con il CAD, e quindi con la JavaCard GalactIC, è messa a disposizione dei programmatori una classe contenente un insieme di metodi appositi. Questa classe, contenuta nel file Reader.class, è distribuita assieme al software fornito con il kit di sviluppo. In realtà, nel CD contenente il software del kit GalactIC ver. 1.0, sono contenute due classi ottimizzate rispettivamente per gli ambienti di sviluppo visuali Microsoft e Symantec, mentre la classe utilizzabile con il JDK 1.2 di JavaSoft (SUN) deve essere richiesta al supporto tecnico di De La Rue. Notare inoltre che la classe Reader.class è in realtà l’interfaccia verso due DLL di sistema che implementano la comunicazione con il lettore: nel caso di installazione di una nuova versione della Reader.class è necessario quindi provvedere manualmente alla copia delle DLL fornite insieme alla classe nella directory di sistema di Windows per permettere un corretto funzionamento della classe. I
metodi contenuti nella classe permettono di gestire la connessione con
il lettore, di accendere o spegnere il lettore (e quindi la carta eventualmente
contenuta) e di controllare la comunicazione. Di seguito è riportato
l’elenco di questi metodi corredati da una breve descrizione. Per ulteriori
informazioni si rimanda alla documentazione fornita da De La Rue.
uesto metodo permette di aprire una connessione logica con il lettore. Deve essere specificato come parametro il nome logico di una connessione (costituito, generalmente, da due lettere seguite da due cifre). Il nome logico di una connessione può essere impostato dal pannello di controllo di Windows durante la configurazione del lettore; questo metodo permette di verificare la presenza di una carta pronta a ricevere comandi all’interno del lettore. L’effettiva presenza di una carta pronta a ricevere comandi deve comunque essere verificata chiamando, subito dopo questo metodo, il metodo numberOfBytesRead(): se viene restituito 0 allora nessuna carta è presente o pronta a ricevere comandi, se viene restituito 1 allora è presente una carta in grado di ricevere comandi; questo metodo permette di accendere il lettore, cioè di alimentare la carta. Questo metodo restituisce i byte di Answer To Reset, cioè di risposta al reset della carta che avviene durante la salita dell’alimentazione, nel byte array abAtr passato per parametro. Notare che il parametro iAtr viene utilizzato esclusivamente per indicare la lunghezza del byte array passato per parametro, l’informazione sul numero di byte restituiti nel byte array deve essere ottenuta eseguendo il metodo numberOfBytesRead(); questo metodo permette di impostare, tramite il parametro iTimeout, il numero di secondi relativi al timeout del metodo transmit(byte[], int, byte[], int), cioè il numero di secondi da attendere, dopo la trasmissione di un comando, prima di lanciare un errore di mancata risposta da parte della carta; questo metodo permette di inviare un comando APDU alla carta e di ricevere la risposta (eventuali dati di ritorno e stato di ritorno). I primi due parametri (abSend e iSend) specificano rispettivamente il byte array contenente il comando APDU da inviare alla carta e la lunghezza di questo comando. I successivi due parametri (abReceive e iReceive) specificano il byte array in cui memorizzare la risposta restituita dalla carta e la lunghezza di questo byte array. Notare che il parametro iReceive viene utilizzato esclusivamente per indicare la lunghezza del byte array abReceive passato per parametro, l’informazione sul numero di byte restituiti nel byte array deve essere ottenuta eseguendo il metodo numberOfBytesRead(); questo metodo permette di spegnere il lettore, cioè di togliere alimentazione alla carta; questo metodo permette di chiudere una connessione logica precedentemente aperta tramite il metodo open(String).
- int lastErrorCode( ): questo metodo permette di ricavare lo stato di errore che si è presentato nell’esecuzione dell’ultimo metodo che ha restituito un valore booleano false. Per l’interpretazione dello stato di errore, di lunghezza pari ad un byte, consultare [Dlr98c]. Vale la pena sottolineare, per evitare eventuali fraintendimenti, che nell’uso del metodo transmit(byte[], int, byte[], int) la restituzione di uno stato di errore da parte della carta non genera la restituzione di un errore da parte del metodo. Questa situazione equivale, infatti, ad una corretta esecuzione del metodo con restituzione da parte della carta dello stato di errore nel byte array contenente i dati di risposta. L’ultimo metodo messo a disposizione dalla classe è quello che permette di ricavare il numero di byte letti durante l’esecuzione di uno dei metodi che attendono la restituzione di risultati (powerOn(byte[], int) e transmit(byte[], int, byte[], int). Questo metodo è il seguente: - int numberOfBytesRead( ): questo metodo permette di ricavare il numero di byte letti dalla carta dall’ultimo metodo eseguito. Notare che, come già detto precedentemente, viene anche utilizzato di seguito al metodo isCardPresent( ) per verificare la presenza all’interno del lettore di una carta in grado di accettare comandi. Per
ulteriori informazioni sulla classe Reader si rimanda a [Dlr98a].
Conclusioni
In questa seconda parte dell’articolo, leggermente più avanzata della precedente, si sono toccati argomenti che permettono di capire meglio il funzionamento di una JavaCard. Tali argomenti, se correttamente interpretati, permettono di apprendere alcune nozioni spesso ignorate nelle trattazioni teoriche, che portano sovente a notevoli risparmi di tempo in fase di progettazione e realizzazione di applicazioni basate su JavaCard. Proprio per questo sono convinto che siano gli strumenti come questo quelli più adeguati ai novizi per iniziare la realizzazione di applicazioni reali. Un
ultimo appunto riguarda gli strumenti forniti con la JavaCard GalactIC
1.0. Sia gli strumenti per la gestione del dispositivo che quelli per l’interfaccia
con l’applicazione esterna di controllo forniscono allo sviluppatore un’interfaccia
di livello piuttosto basso. Se da un lato questo richiede un maggior sforzo
in termini di progettazione, codifica e debug, dall’altro permette una
notevole libertà di implementazione. Questo fa sì che dispositivi
come questo siano da preferirsi in tutte quelle applicazioni delle JavaCard
che escono dai canoni delle classiche applicazioni SmartCard.
BIBLIOGRAFIA
[Dlr98a]: De La Rue Cartes et Systèmes, “GalactIC Version 1 - Smart Card Reader Java API”, 1998, Manual references: PE 993-097 / 12NC: 4311 240 26342, www.delarue.com [Dlr98b]:
De La Rue Cartes et Systèmes, “GalactIC Version 1 – Operating System”,
1998, Manual references: PE 993-100 / 12NC: 4311 240 26352, www.delarue.com
[Dlr98c]:
De La Rue Cartes et Systèmes, “GalactIC Version 1 – User Manual”,
1998, Manual references: PE: 993-099 / 12NCT: 4311 240 26362, www.delarue.com
Roberto
Fabbrica, nato a Ravenna il 28 dicembre 1972, è laureato in
Ingegneria Informatica alla Facoltà di Ingegneria dell’Università
di Bologna dal 1999. Attualmente lavora come libero professionista, fornendo
consulenze come analista programmatore in Visual Basic ed esperto SQL ad
una software house bolognese e collaborando al progetto e all’implementazione
di applicazioni Java web oriented presso il DEIS (Dipartimento di Elettronica,
Informatica e Sistemistica) della Facoltà di Ingegneria dell’Università
di Bologna, sede di Cesena.
Si informa che la società De La Rue Card Systems è stata acquisita dal Gruppo Charles Froncoise Oberthur lo scorso Ottobre assumendo il nuovo nome di OBERTHUR CARD SYSTEMS. A seguito di tale acquisizione tutti i prodotti smart card di De La Rue sono stati integrati nella gamma smart card di Oberthur mantendo per entrambi i nomi commerciali. Quindi GalactIC compare come la smart card basata su tecnologia Java di Oberthur Card Systems, la cui versione è stata aggiornata recentemente a 2.1. Per ulteriori informazioni si invita alla consultazione del sito web http://www.oberthurcs.com/. |
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|