smartcard
Transcript
smartcard
MODUGNO-impaginato 29-04-2004 12:03 Pagina 26 TUTORIAL SMARTCARD: UN’INTRODUZIONE TEORICA di Giuseppe Modugno [email protected] Questo primo articolo approfondisce gli aspetti teorici che sono alla base delle smartcard, ampiamente diffuse ed utilizzate da tutti (al Bancomat, nel cellulare, al lavoro, ecc.). Nel corso delle altre puntate, analizzeremo in dettaglio gli aspetti tecnici delle smartcard a memoria e delle smartcard a microprocessore, realizzeremo un lettore universale di smartcard e lo utilizzeremo in due interessanti applicazioni (gestione crediti e gestiore rubrica/SMS delle SIM). FACCIAMO UNA PARTITA A CARTE? Uno sguardo superficiale alle tessere in nostro possesso Oggigiorno è difficile trovare una sola persona che non abbia, nel suo portafogli o in tasca, una carta (o, Figura 1: per dirla all'inglese, una card). Non si sta ovviamente parlando di assi o picche ma di tessere plastificate della dimensione di una carta di credito, utilizzate un po' dappertutto: controllo presenze dei dipendenti, bancomat, carte di credito, raccolta In questa foto si possono osservare vari tipi di carte, comunemente usate e che riempiono il mio portafogli 26 TUTORIAL punti del supermercato sotto casa, crediti per l'ingresso in palestra, patente, SIM per il cellulare, carta d’identità, carta della salute. Ovviamente questi sono solo alcuni esempi… l'elenco potrebbe essere molto più lungo. Per iniziare a conoscere questi piccoli ma utilissimi oggetti, apriamo il nostro portafogli e distribuiamo le carte su un tavolo. Così ho fatto io ed il risultato è mostrato nella foto in figura 1. Se ad una prima vista possono sembrarci tutte uguali, a parte qualche differenza di dimensione per le SIM dei cellulari, in realtà un’analisi più accurata ci può svelare molte diversità. Nel corso di questi articoli impareremo a conoscerle nel dettaglio e ad utilizzarle a nostro piacimento. Per prima cosa, però, cerchiamo di fare un po’ d’ordine… DIVIDIAMO LE ROSSE DALLE NERE Le tessere magnetiche Se raccogliamo tutte le carte in MODUGNO-impaginato 29-04-2004 12:03 Pagina 27 TUTORIAL nostro possesso, possiamo fare una prima classificazione in due grandi gruppi: carte a banda magnetica e smartcard. Le carte a banda magnetica sono quelle contraddistinte da una banda nerastra sul retro, di circa 1 cm di altezza. Per esempio, la maggior parte delle tessere per il controllo presenze sono di tipo magnetico, così come le tessere utilizzate nelle prime cabine telefoniche pubbliche di Telecom Italia, la maggior parte dei bancomat e delle carte di credito circolanti in Italia. Nella foto in figura 2 è mostrata una scheda per il rilevamento presenza in un’azienda privata. Figura 2: Foto di una carta a banda magnetica utilizzata per il controllo presenze Al di sotto della banda nerastra, coperto da uno strato protettivo, è presente del materiale magnetico che può essere utilizzato per memorizzare alcuni dati numerici, dell’ordine delle decine di byte. Per esempio, è possibile memorizzare un numero seriale che individua una carta (e quindi l’utente) univocamente nel nostro gruppo, un credito in denaro o in punti, ecc. I dati memorizzati possono essere letti da un apposito dispositivo dotato generalmente di una fessura, all’interno della quale l’utente fa scorrere (striscia) la carta, facendo in modo che la parte magnetica passi vicino ad una testina di lettura. È lo stesso principio delle vecchie musicassette, con l’unica differenza che, per queste ultime, il nastro magnetico viene trascinato automaticamente da un motorino, mentre nel caso delle carte è l’utente che deve effettuare il movimento. Quanti di voi compio- no l’azione di “strisciare”, ogni mattina entrando nell’ambiente di lavoro, per comunicare l’ora d’arrivo? In alcuni casi, come nelle vecchie cabine telefoniche o nei moderni bancomat, la tessera viene solo leggermente inserita in una fessura ed automaticamente “risucchiata”, quindi letta, dalla circuiteria interna, senza che l’utente faccia alcun movimento meccanico. Questa tecnologia è stata la prima a comparire sul mercato commerciale ed è attualmente molto economica, anche se presenta numerosi punti deboli. Per esempio, la bassa capacità di memoria e la smagnetizzazione dovuta a campi elettromagnetici esterni. Le smartcard Proprio per far fronte a questi problemi, è nata una nuova tecnologia di carte, definite smartcard. In realtà, il termine smartcard è molto generico e di difficile traduzione diretta in italiano. Potrebbe essere tradotto, abbastanza liberamente, come "carta intelligente". Oltre alla parola smartcard, possono essere usati altri termini, come: chipcard, IC-card, memory card, carte a microprocessore, ecc. Alcuni di questi termini indicano dei tipi di smartcard ben precisi, ma spesso vengono usati, erroneamente, per indicare generalmente tutte le smartcard. Nel seguito dell’articolo cercheremo di fare chiarezza sui vari termini. Anziché essere dispositivi magnetici, le smartcard sono dispositivi elettronici e si distinguono facilmente dalla presenza di 6-8 contatti elettrici ravvicinati a forma rettangolare sul lato superiore (naturalmente, è assente la banda magnetica sul retro, anche se sono previste carte ibride). In figura 3 è mostrata una nuova scheda telefonica, una smartcard appunto. Spesso vengono chiamate IC-card Figura 3: Una smartcard: scheda telefonica utilizzata da Telecom Italia poiché integrano all'interno della plastica (spesso PVC) dei veri e propri circuiti integrati, come le memorie (RAM, ROM, EPROM, EEPROM, FLASH), porte logiche, microprocessori general-purpose (PIC, Atmel) o specifici (ST, Atmel). A differenza delle carte a banda magnetica, le smartcard: • Essendo elettroniche non vanno incontro al fenomeno della smagnetizzazione. • Possono memorizzare un maggior numero di informazioni. • Essendo elettroniche possono interfacciarsi più facilmente con gli attuali apparecchi che ne fanno uso (telefoni cellulari, set-top-box, cabine telefoniche, ecc.). • Presentano delle protezioni contro la lettura/scrittura non voluta (per esempio, mediante l'utilizzo di PIN). • Possono implementare degli algoritmi, più o meno complessi, al loro interno (per esempio, crittografia per rendere più sicure le transazioni). • Possono essere multiapplicazione, cioè una singola carta può essere usata contemporaneamente in più contesti (per esempio, per registrarsi alla rete cellulare del proprio provider ed effettuare delle transazioni commerciali in tutta sicurezza). A fronte di questi vantaggi, l'unico svantaggio che attualmente ha senso considerare è probabilmente il maggior costo (delle carte e dei TUTORIAL 27 MODUGNO-impaginato 29-04-2004 12:03 Pagina 28 TUTORIAL lettori) dovuto alla tecnologia più evoluta, anche se è già alla portata di tutti (hobbisti e professionisti). DIVIDIAMO I CUORI DAI QUADRI Tipologie di smartcard: una prima classificazione Una prima classificazione che si può operare sulle smartcard è tra le carte a contatto (contact-card) e carte senza contatto (contactless-card). Le prime vanno inserite all'interno di un apposito dispositivo (chiamato comunemente lettore) che comunica con esse mediante contatto elettrico dei pin che si trovano sulla smartcard. Le contactless-card, invece, hanno un'antenna integrata che permette, quando viene avvicinata ad una certa distanza dal dispositivo di lettura, sia l'alimentazione dei circuiti integrati interni, sia la comunicazione wireless dei dati. Queste tipologie di carte si differenziano a seconda della distanza massima dal lettore alla quale devono trovarsi per un corretto funzionamento (pochi centimetri o alcuni metri). Naturalmente, le contact-card vanno incontro ad una maggiore usura soprattutto se devono essere inserite/disinserite molte volte all'interno di un lettore. Inoltre sono più scomode da usare poiché l'utente deve necessariamente impiegare del tempo per inserire e disinserire la carta dal dispositivo, cosa che non avviene con le contactless-card. Avete idea della differenza tra Viacard e Telepass per il pagamento del pedaggio autostradale? In commercio sono di gran lunga più diffuse le smartcard a contatto, soprattutto perché più economiche, anche se è possibile trovare soluzioni contactless e addirittura ibride. Nel futuro, comunque, si prevede un aumento delle carte contactless. Tipologie di smartcard: una seconda classificazione Oltre a raggruppare le smartcard a 28 TUTORIAL contatto e quelle senza contatto, è possibile dividerle in smartcard a memoria e smartcard a microprocessore, in funzione dei circuiti integrati presenti all’interno. Le smartcard a memoria contengono internamente delle semplici memorie a cui si può accedere in lettura/scrittura mediante i contatti presenti sulla carta. Per esempio, è possibile integrare in una smartcard una memoria seriale I2C, come le diffusissime 24LCxx della Microchip. In questo caso, i pin della smartcard rappresentano le alimentazioni della memoria (Vcc e GND) e le linee di comunicazione del bus I2C (DATA e CLOCK). In altre parole, il chip, anziché essere integrato nei classici package dual-in-line o SMD, viene integrato in una carta plastificata. Queste smartcard, in cui è possibile accedere al contenuto senza protezione, sono chiamate a memoria libera (free memory card). Se una tessera di questo tipo viene rubata o persa, può essere usata senza difficoltà da un'altra persona, anche non autorizzata. C’è da dire, comunque, che questo tipo di carte sono poco diffuse. Molto più diffuse sono le smartcard a memoria protetta che integrano non solo una zona di memoria (generalmente EEPROM) ma anche della logica aggiuntiva che permette la protezione del contenuto agli utenti non accreditati. Normalmente lo scopo viene raggiunto memorizzando all'interno della carta, in una zona di memoria diversa da quella utilizzata per i dati, un PIN non leggibile dall'esterno. Per poter leggere e/o scrivere il contenuto della memoria dati sarà necessario presentare correttamente il PIN alla carta che, solo dopo averlo confrontato con quello memorizzato al suo interno, permette il libero accesso al contenuto della memoria. Infine, esistono le smartcard a microprocessore, dette anche chipcard o IC-card. Sono dei sistemi elettronici integrati nella tessera plastificata e possono essere anche molto complessi. Normalmente all'interno si trova una zona di memoria non volatile per la memorizzazione dei dati anche a carta scollegata (EEPROM e/o Flash), una memoria volatile per l'elaborazione dei dati durante l'uso (RAM), un microprocessore più o meno complesso che gestisce sia il protocollo di comunicazione con l'esterno, sia l'elaborazione dei dati (si possono trovare degli economici PIC della Microchip oppure dei microprocessori dedicati più complessi prodotti, per esempio, da Atmel e ST). La presenza di una piccola (ma anche grande) capacità di elaborazione assicura un livello di sicurezza impossibile da raggiungere con le normali smartcard a memoria. Spesso vengono implementati degli algoritmi di crittografia complessi, che aumentano il grado di sicurezza di transazioni commerciali, permettendo al sistema di riconoscere un determinato utente con un alto grado di affidabilità. Infatti, la clonazione di questo tipo di carte è molto complicata (anche se non impossibile, come dimostrano la pirateria satellitare e i recenti tentativi di clonazione delle SIM GSM). Esternamente le smartcard a memoria e le smartcard a microprocessore sono identiche sia in termini di dimensioni che in termini di contatti elettrici. Solo un’attenta analisi del comportamento elettrico della scheda (protocollo di trasmissione usato e dati effettivamente scambiati) può rivelarci la natura della carta. A CHE GIOCO GIOCHIAMO? Le applicazioni delle smartcard Col tempo le smartcard hanno invaso il tradizionale campo delle bande MODUGNO-impaginato 29-04-2004 12:03 Pagina 29 TUTORIAL magnetiche e si stanno diffondendo in numerose altre applicazioni, prima impensabili. Per quanto riguarda le smartcard a memoria, esse sono molto usate nelle raccolte punti dei supermercati o distributori di benzina. Per esempio, le tessere utilizzate dalla AGIP appartengono a questa categoria di smartcard. Tali carte vengono anche usate da strutture che prevedono l’accesso della clientela a certi servizi. Per esempio, può essere usata per l’ingresso nelle palestre e per l’utilizzo delle docce a pagamento in un campeggio. Ad ogni ingresso l’utente inserisce la carta nell'apposito dispositivo ed il numero di ingressi (o crediti) memorizzato viene decrementato, magari aprendo automaticamente l'accesso agli spogliatoi o abilitando l’erogazione dell’acqua. Anche le ultime schede telefoniche per le cabine pubbliche appartengono a questa categoria di smartcard. In alcuni casi possono essere usate per il controllo accessi: in ogni carta viene memorizzato un codice identificativo dell’utente che, inserendola nel dispositivo di lettura, magari digitando l’opportuno codice segreto (PIN), comunica il proprio accesso al sistema. Molto usate sono anche le carte a microprocessore che hanno subito nel corso degli anni una notevole diminuzione di costo. La maggiore applicazione per queste carte (la cosiddetta killer application) è sicuramente la telefonia cellulare GSM. Tutti noi sappiamo, infatti, che il sistema GSM prevede l’utilizzo di una scheda SIM (Subscriber Identity Module) personale, da inserire nel telefonino, che si preoccupa di autenticarci alla rete (comunica al provider chi siamo, dal quale si può risalire al contratto e all’eventuale credito residuo) e quindi abilita l’accesso ai servizi di telefonia mobile a cui abbiamo diritto. Le SIM sono schede molto diffuse (sicuramente più di un lettore sarà in possesso di diverse schede SIM, qualcuna ormai non più usata, altre usate addirittura contemporaneamente) ma non tutti sanno che sono delle smartcard a microprocessore. Una grande differenza con le smartcard a cui siamo abituati a pensare è la dimensione. Infatti una scheda SIM ormai viene distribuita in un formato più piccolo, che permette di ingombrare molto poco all’interno del telefonino, un oggetto che tende sempre più alla miniaturizzazione. In figura 4 è mostrata una SIM del provider Wind. Figura 4: Una scheda SIM altro non è che una smartcard a microprocessore Il formato piccolo delle SIM è relativamente recente, poiché i primi telefonini (chi non si ricorda il Motorola 8700?) avevano l’alloggio per schede della normale dimensioni di una carta di credito. Solo con la necessità di miniaturizzare il telefonino, sono comparse sul mercato SIM del formato ridotto. Cosa succede se qualcuno ha la necessità di utilizzare una “SIM ridotta" in un telefonino di vecchio tipo? Esistono in commercio degli adattatori che servono proprio allo scopo (sono molto utili se volete utilizzare la vostra SIM nel lettore universale di smartcard che costruiremo in uno degli articoli successivi). L'altra applicazione tipica delle smartcard a microprocessore è la TV digitale. Oggi è possibile usufruire solo della TV digitale satellitare (DVB-S) ma nell'immediato futuro non è escluso di poter utilizzare delle smartcard per il digitale terrestre (DVB-T). Come per il GSM, tali carte vengono usate dal provider per accertare che l'utente sia effettivamente un suo cliente e abbia i diritti per la visione dei canali su cui si sintonizza (in parole povere, abbia pagato). Le applicazioni del futuro (non tanto lontano!) Nell'immediato futuro, le smartcard a microprocessore potranno essere utilizzate anche per firmare elettronicamente documenti ufficiali e validi a tutti gli effetti di legge, alla stessa stregua dei documenti manoscritti. In questo settore l'Italia è particolarmente attiva ed ha già iniziato le sperimentazioni sulla Carta d'Identità Elettronica e sulla Carta Nazionale dei Servizi. Questo sistema di sottoscrizione prende il nome di firma digitale. Attraverso la firma digitale sarà possibile firmare elettronicamente un documento pubblico garantendo la veridicità (documento non alterato), l’autenticità dell’autore, la non ripudiabilità (l’autore non può sostenere di non aver scritto il documento in futuro), la confidenzialità (nessuno, fuorché il destinatario, potrà leggere quel documento). Potete ben capire come queste carte siano molto importanti e delicate e devono garantire una certa sicurezza. Per questo sono dotate di un PIN segreto, noto solo al legittimo titolare della carta, che deve essere ogni volta inserito per accedere al servizio della firma digitale. Ma vi fidereste di sottoscrivere un atto pubblico con una smartcard? La coppia carta/PIN garantisce un certo grado di sicurezza sull'autenticità dell'individuo, ma questa non è assoluta. La carta può essere rubata o persa ed il PIN può essere ritrovato (per esempio, scritto su un foglietto all'interno del portafogli oppure memorizzato all'interno della rubrica del nostro cellulare, oppure semplicemente scritto dietro TUTORIAL 29 MODUGNO-impaginato 29-04-2004 12:03 Pagina 30 TUTORIAL la carta) o rubato anch'esso (attraverso spycam o POS/ATM fraudolentemente modificati). È per questo che attualmente la coppia carta/PIN non è più sintomo di elevata sicurezza e si sta sperimentando la possibilità di memorizzare, all'interno della carta, caratteristiche biometriche dell'individuo (impron- te digitali, scansione della retina o dell'iride, voce, volto). In questo modo sarà possibile aumentare il grado di sicurezza sull’autenticità dell’individuo poiché i dati biometrici appartengono al nostro corpo e non possono essere clonati così facilmente (oggi, almeno, ciò non è possibile… un domani chissà). Parte 1 Caratteristiche fisiche (dimensioni, resistenza meccanica, radiazioni elettromagnetiche, ecc.) Parte 2 Numero, posizione e dimensione dei contatti elettrici e relativo significato. Parte 3 Tensioni e correnti massime per ciascun contatto. Descrizione del protocollo asincrono di comunicazione. Parte 4 Comandi standard per la gestione dei dati (lettura e scrittura) in tutta sicurezza. Parte 8 Aggiunge sistemi di crittografia (a chiave simmetrica ed asimmetrica) ai comandi definiti nella Parte 4. Parte 10 Definisce il protocollo di comunicazione per le smartcard sincrone. Tabella 1: Elenco degli standard più importanti facenti capo all’ISO7816. Numero Nome Direzione Descrizione C1 VCC I Alimentazione della smartcard, normalmente a 5V, anche se sono previste alimentazioni a tensioni inferiori (3V o meno). C2 RST I Linea di reset utilizzata dal dispositivo di lettura per inizializzare la scheda, prima di un qualsiasi trasferimento di dati. I Linea utilizzata per fornire il clock ai circuiti sequenziali integrati nella smartcard (carte asincrone), oppure per lo scambio dei dati (carte sincrone). C3 CLK C4 RFU C5 GND Riservata per usi futuri. I Massa. C6 VPP I Tensione di programmazione, eventualmente utilizzata per la programmazione (cancellazione/scrittura) della memoria non volatile integrata nella smartcard (EEPROM, Flash). C7 I/O I/O Linea bidirezionale utilizzata per lo scambio dei dati tra smartcard e dispositivo di lettura. C8 RFU Tabella 2: Riservata per usi futuri. Descrizione di tutti i contatti eventualmente presenti su una smartcard. Il numero è relativo alla figura 5, mentre la direzione (I=Input, O=Output, I/O=Input/Output) è relativa alla carta 30 TUTORIAL Un'altra applicazione molto interessante, che sicuramente utilizzeremo spesso in un prossimo futuro, è la Carta della Salute (health card). In questa smartcard saranno memorizzati tutti i nostri dati anagrafici insieme alla nostra storia da un punto di vista medicale. Per esempio è possibile memorizzare il gruppo sanguigno, allergie, malattie o disturbi gravi, interventi, cura farmaceutica abituale, ecc. A cosa può servire tutto ciò? Immaginate di aver bisogno di cure mediche immediate, per esempio in un pronto soccorso. Supponete di essere soli o, magari, in viaggio in un paese straniero in cui non conoscete bene la lingua o impossibilitati a parlare (per esempio, perché svenuti). Avendo a disposizione la vostra Carta della Salute, il medico potrà avere un quadro dettagliato sulla vostra condizione fisica e potrà intervenire in modo tempestivo con cure efficaci. Naturalmente i dati memorizzati sulla card non saranno consultabili da tutti, ma solo da enti e personale autorizzato, magari a più livelli di accessibilità. Ecco che una futura Carta della Salute dovrà necessariamente ricorrere a tecnologie sofisticate di protezione dei dati e autenticazione dell'utente, e forse sono questi gli ostacoli più difficili da superare. Infatti, la più veloce accessibilità di una grande quantità di dati strettamente personale è in netta contraddizione con i diritti alla nostra privacy. QUALI SONO LE REGOLE DEL GIOCO? Gli standard Dalla discussione precedente avrete sicuramente capito come il mondo delle smartcard sia molto diversificato e in continua evoluzione. Per evitare la nascita di sistemi completamente diversi e non interoperabili, sono stati pubblicati degli standard di riferimento dai maggiori organi- MODUGNO-impaginato 29-04-2004 12:03 Pagina 31 TUTORIAL Figura 5: Rappresentazione della “geometria” di una smartcard secondo lo standard di riferimento ISO7816 (vista lato contatti) smi internazionali per la standardizzazione. Il maggiore standard di riferimento è sicuramente l’ISO7816, definito dall’ISO (International Standard Organization). Esso è diviso in numerose sezioni, ognuna della quali si occupa di un particolare aspetto di una smartcard. In tabella 1 è presente un elenco delle sezioni più importanti insieme ad una breve descrizione del contenuto. LE DIMENSIONI E I CONTATTI Secondo l’ISO7816-1, una smartcard è un “rettangolo” di plastica (generalmente PVC) della dimensione di circa 85,6x53,98 mm. Lo spessore è di 0,78 mm. In realtà esiste anche un’altra dimensione, che è quella comunemente usata dalle SIM del sistema GSM. È possibile stampare qualcosa sui due lati della scheda, anche in rilievo (entro certi limiti fissati). Ci sono delle aziende specializzate che possono fornirvi delle smartcard bianche oppure prestampate. In alcuni casi è possibile utilizzare direttamente una stampante da PC, soprattutto quelle che hanno la possibilità di stampare sui CDROM. Sul lato superiore sono presenti dei contatti elettrici, da un minimo di 4 ad un massimo di 8. La dimensione minima di ogni contatto è di 1,7x2 mm ed è definita anche la posizione di ognuno di essi. In figura 5 è rappresentata una schematizzazione di una smartcard e dei suoi contatti. Se guardassimo una smartcard in nostro possesso e la confrontassimo con il disegno in figura, ci accorgeremmo subito di una differenza nella forma e nella disposizione dei contatti. La carta in nostro possesso è, comunque, con molta probabilità, standard. Infatti, l’ISO7816 impone solo una dimensione minima dei contatti, ma lascia al produttore la possibilità di modificarne la forma e la grandezza. L’unica restrizione è che, per ogni contatto, l’area minima definita dallo standard sia comunque “coperta” dal contatto corrispondente. È per questo motivo che la disposizione dei contatti può sembrare, da carta a carta, molto diversa. In figura 6 sono mostrati i particolari della zona dei contatti di due smartcard in mio possesso. Abbiamo detto che lo standard prevede fino ad 8 contatti, ognuno dei quali ha un significato ben preciso, come mostrato nella tabella 2. OK, SIETE STANCHI DI GIOCARE? Cosa contiene il prossimo articolo Dopo questa panoramica, di orientamento prettamente teorico, sulle smartcard, nel prossimo articolo studieremo in dettaglio un particolare tipo di carta: la smartcard a memoria protetta del tipo SLE4442, la più diffusa tra questa tipologia. Impareremo a gestire la memoria dati interna per la scrittura/lettura di informazioni generiche. Figura 6: Disposizione dei contatti di due smartcard. Pur essendo diverse, queste schede sono comunque standard BIBLIOGRAFIA Faq sulle smartcard (in inglese): http://www.scdk.com/atsfaq.htm Tutorial sulle smartcard (in inglese): http://www.smartcard.co.uk/resources/tutorials/sct-itsc.pdf Carta Nazionale dei Servizi: http://punto-informatico.it/p.asp?i=47159 - http://www.card.infocamere.it/ Health Card (in inglese): http://www.iso.ch/iso/en/commcentre/isobulletin/articles/2003/pdf/medicalcard03-06.pdf Standard di riferimento (in inglese): http://www.iso.ch/ TUTORIAL 31 MODUGNO-impaginato 27-05-2004 16:46 Pagina 22 TUTORIAL SMARTCARD seconda parte LE SMARTCARD A MEMORIA di Giuseppe Modugno [email protected] Nella prima parte dell’articolo abbiamo introdotto il termine smartcard approfondendone gli aspetti teorici: le tipologie esistenti sul mercato, le applicazioni attuali e future, gli standard di riferimento. In questo secondo articolo, parleremo delle smartcard a memoria dal punto di vista tecnico (caratteristiche, protocollo di comunicazione, sicurezza, ecc.) soffermandoci sulle carte basate sul diffusissimo chip SLE4442. RIPRENDIAMO LA NOSTRA PARTITA A CARTE Cosa ci siamo detti nell’ultimo articolo Nel precedente articolo siamo entrati nel mondo delle smartcard definendole da un punto di vista teorico e commentandone i vantaggi a dispetto delle tessere magnetiche, illustrandone le caratteristiche peculiari, raggruppandole e classificandole a seconda delle funzionalità e modalità d’uso, approfondendone i campi d’applicazione in cui sono attualmente utilizzate, oltre a proiettarci nell’immediato futuro dando uno sguardo alle prossime applicazioni che le vedranno coinvolte. Per ultimo, abbiamo iniziato l’approccio tecnico alle smartcard analizzando gli standard più diffusi e descrivendo i contatti elettrici utilizzati per l’alimentazione dei circuiti integrati interni e per lo scambio dei dati con il mondo esterno. Come già detto, questi oggetti possono classificarsi in smartcard a memoria e smartcard a microprocessore. In questo articolo parleremo ampiamente della prima categoria soffermandoci su un chip molto diffuso, prodotto inizialmente dalla Siemens e conosciuto con la sigla SLE4442. 22 TUTORIAL Le smartcard a memoria Le smartcard a memoria sono delle carte utilizzate principalmente per la memorizzazione di dati digitali di vario tipo (numero di punti accumulati nel nostro supermercato di fiducia, credito residuo per il noleggio di DVD o VHS, numero di conto corrente in applicazioni bancarie, ecc). Poiché le smartcard sono formate da circuiti a semiconduttore, la capacità di memorizzazione è molto più elevata rispetto alle tessere magnetiche: attualmente è possibile raggiungere capacità dell’ordine dei Mb (megabit, milioni di bit), anche se, nella maggior parte dei casi, qualche Kb (chilobit, migliaia di bit) può essere più che sufficiente. Possiamo pensare alle smartcard a memoria come a delle unità di memorizzazione (tipo i floppy-disk o i CD-ROM) che, in alcuni casi, possono offrire anche un certo grado di sicurezza. LE SMARTCARD A MEMORIA LIBERA Le più semplici smartcard a memoria esistenti sono quelle definite a memoria libera (free-memory smartcard). Questo termine indica una smartcard che integra soltanto una memoria non volatile (tipicamente una EEPROM) e nient’altro. L’accesso in scrittura e/o lettura avviene tramite i contatti presenti direttamente sulla smartcard. Sono generalmente delle memorie seriali poiché il numero dei contatti utili per la comunicazione dei dati, secondo lo standard di riferimento ISO7816, sono soltanto tre (RST, I/O, CLK). Quindi, l’accesso ad una parola della memoria (8, 16 o 32 bit) avviene mediante la trasmissione seriale dei singoli bit sul contatto di I/O, sincronizzati agli impulsi di clock sulla linea CLK. Normalmente la linea RST non viene usata, o viene usata solo per abilitare l’accesso alla scheda. Le smartcard I2C Un protocollo molto diffuso utilizzato dalle memorie seriali non volatili è il bus I2C, definito dalla Philips ma utilizzato ormai da molti altri produttori di chip a semiconduttore. L’I2C è un bus, utilizzato molto spesso per l’interconnessione di più circuiti integrati su scheda, mediante due sole piste, definite SDA ed SCL: la prima è una linea bidirezionale utilizzata per lo scambio dei dati, la seconda è il segnale di clock imposto da un dispositi- MODUGNO-impaginato 27-05-2004 16:46 Pagina 23 TUTORIAL vo master. Normalmente sul bus è presente un solo integrato che ne controlla l’utilizzo, detto master, l’unico che può iniziare una comunicazione sul bus e che fornisce il segnale di clock a tutti i chip connessi, detti slave. Nel caso di una smartcard I2C, normalmente il bus si riduce a due soli nodi: il master, rappresentato dal lettore di smartcard, e uno slave, rappresentato dalla stessa smartcard (o meglio, dalla memoria integrata all’interno). È evidente che la linea SDA del bus I2C coinciderà con il pin I/O della smartcard, mentre la linea SCL coinciderà con il pin CLK. Le smartcard I2C più diffuse integrano una EEPROM seriale del tipo 24LCxx, prodotte dalla Microchip. Queste memorie partono da pochi Kb per arrivare sino a qualche Mb. La stessa Microchip integra le proprie EEPROM seriali I2C in smartcard plastificate: i relativi prodotti hanno lo stessa sigla della memoria integrata con l’aggiunta delle lettere SC in coda (per esempio, 24LC64SC). In figura 1 è rappresentato il pinout di una smartcard a memoria libera del tipo I2C. Come si può osservare, in questa semplice configurazione, solo quattro pin della smartcard sono usati. Le smartcard I2C sono molto semplici da usare; affidabili poiché basate Figura 1: Associazione dei pin di una smartcard I2C. su un protocollo, l’I2C appunto, ormai uno standard nel mondo dei circuiti integrati; poco costose, poiché l’elettronica da integrare nella carta plastificata si riduce praticamente ad un singolo chip. Le altre smartcard a memoria libera più diffuse Oltre a questo tipo, esistono altre smartcard a memoria libera con semplici funzionalità aggiuntive. Abbastanza diffuse sono le carte che integrano dei chip inizialmente prodotti dalla Siemens (per esempio, SLE4418 o SLE4432): esse vengono chiamate, dal costruttore, EEPROM intelligenti, poiché hanno alcune funzionalità di protezione da scrittura di alcune zone della memoria. Per esempio, l’SLE4432 è una EEPROM a 256 byte (parola ad 8 bit) in cui è possibile proteggere definitivamente in scrittura (EEPROM → ROM) i primi 32 byte (anche singolarmente ed isolatamente). Il resto della memoria (256-32=234 byte) rimane a disposizione per qualsiasi operazione di lettura e/o scrittura. Il chip SLE4418, invece, implementa una EEPROM intelligente di 1024 byte in cui è possibile proteggere da scrittura in modo definitivo ogni singolo byte. Di questi chip esistono, e sono maggiormente diffusi, anche le controparti a memoria protetta. Per maggiori dettagli sulle smartcard SLExxxx si veda il paragrafo successivo sulle smartcard a memoria protetta. Grande diffusione, anche se non in Italia, hanno avuto le smartcard della Gemplus come schede telefoniche prepagate. Forse le prime smartcard a memoria, ormai obsolete, le Gemplus GPM256 sono state usate, per esempio, da France Telecom. Sono memorie che possono conservare fino a 256 bit di dati, di cui i primi 96 rappresentano un identificativo (numero di serie della carta, identificatore del produttore, ecc) ed i restanti 160 bit rappresentano le unità rimanenti del credito prepagato. I punti deboli delle smartcard a memoria libera Il più grande svantaggio delle carte a memoria libera, cosa per niente trascurabile, è la loro scarsa sicurezza. A differenza di un floppydisk, il contenuto di una smartcard è spesso molto personale: all’interno possono essere memorizzati il numero di conto corrente, il credito accumulato per il noleggio di VHS o il numero di ingressi in una palestra. In alcuni casi è necessario che questi dati rimangano segreti per problemi legati alla privacy (per esempio, i dati personali); in altri casi, perché possono essere usati per truffe ai danni del proprietario della carta (per esempio, numero di conto corrente); in altri ancora, perché i dati rappresentano del denaro che deve essere usato solo dal legittimo proprietario (per esempio, il credito per il noleggio di video o gli ingressi in una palestra). È ovvio che se una smartcard a memoria libera viene persa, sarà molto semplice, per chi ne viene in possesso, utilizzare o leggere il contenuto senza dover scomodare grosse conoscenze di hacker. Per questo motivo tali carte sono poco diffuse, quindi non entreremo nei dettagli nella restante parte dell’articolo. Per chi volesse approfondire l’argomento, consiglio di consultare i datasheet delle memorie 24LCxx della Microchip e lo standard I2C, seguendo i link in bibliografia, oppure consultare i siti Web dei maggiori costruttori di smartcard a memoria (Siemens, Infineon, Gemplus). LE SMART CARD A MEMORIA PROTETTA La semplicità d’uso, la flessibilità TUTORIAL 23 MODUGNO-impaginato 27-05-2004 16:46 Pagina 24 TUTORIAL dei contenuti e soprattutto la facile trasportabilità, hanno portato ad utilizzare le smartcard come contenitori tecnologicamente avanzati di dati del tutto personali, e ciò ha inevitabilmente portato alla risoluzione dei problemi legati alla sicurezza ed alla privacy. In parole molto semplici, l’accesso (in scrittura e/o lettura) dei dati contenuti all’interno della smartcard deve essere abilitato solo dal personale autorizzato, che può essere il titolare della carta oppure un’altra persona (il nostro medico, il personale della nostra banca, ecc). È per questo scopo che vengono utilizzate le smartcard a memoria protetta. Il cuore dell’elettronica integrata nell’involucro plastificato è sempre rappresentato da una memoria digitale non volatile (EEPROM o Flash) ma, a differenza delle smartcard a memoria libera, in quelle a memoria protetta è presente anche della logica aggiuntiva che protegge il contenuto contro gli accessi non autorizzati. In commercio esistono diverse smartcard a memoria protetta che hanno differenti caratteristiche. La scelta di una smartcard dipende molto dall’applicazione e deve essere effettuata considerando tutti gli aspetti possibili, tra cui ricordiamo: • Capacità ROM (normalmente scritta dal costruttore degli integrati). • Capacità PROM (normalmente è una zona di memoria che può essere scritta una sola volta dall’utilizzatore). • Capacità EEPROM (memoria non volatile che contiene i dati utili). • Tempi d’accesso in scrittura/lettura. • Tensione d’alimentazione (normalmente a 5V). • Assorbimento (parametro importante in applicazioni a batteria). 24 TUTORIAL • Numero di operazioni di scrittura (dell’ordine di molte migliaia). • Tempo di conservazione dei dati in memoria (dell’ordine dei dieci anni). • Modalità di protezione (solo in scrittura o solo in lettura o in entrambe le modalità). • Meccanismo di protezione (PIN, parametri biometrici, ecc.). • Compatibilità con i dispositivi di interfacciamento esistenti. • Kit di sviluppo. • Reperibilità. • Costo. I maggiori produttori di smartcard a memoria protetta sono Siemens, Infineon, Gemplus e Philips. In realtà, le memorie per IC-card prodotte inizialmente dalla Siemens, sono passate sotto il controllo di Infineon, conservandone il partname. Tengo a sottolineare che questi sono solo i produttori dei chip. Accanto a questi nomi, ed insieme ad essi, ci sono numerose aziende che si occupano dell’integrazione di questi chip nella carte plastificate, fornendo in alcuni casi anche servizi di stampa. In tabella 1 sono elencate le memorie protette più diffuse, insieme ad alcune loro caratteristiche fondamentali. Ci sono altri chip molto diffusi ma solo a livello industriale e per grossi quantitativi. In questo articolo consideriamo solo le carte più diffuse a livello hobbistico e più facilmente reperibili. Le memorie della Gemplus seguo- no a tutti gli effetti le caratteristiche delle più diffuse memorie della Siemens/Infineon: la GPM2K è equivalente alla SLE4442, così come la GPM8K è equivalente alla SLE4428. Nel seguito dell’articolo, parleremo diffusamente delle smartcard a memoria basate sul chip SLE4442, poiché rappresenta attualmente la soluzione migliore come rapporto qualità/prezzo, includendo la facile reperibilità e la facilità d’uso. SLE4442 Caratteristiche generali È possibile comprare da molti distributori (in Italia e all’estero) smartcard SLE4442 bianche oppure prestampate, arrivando a costare anche meno di 1 euro per grossi quantitativi. Normalmente si possono trovare a 3 euro per poche quantità (vedere la bibliografia per i distributori da me trovati). Alcune delle caratteristiche di questa smartcard sono riassunte nel seguente elenco: • Contatti compatibili con lo standard ISO7816. • ATR (Answer To Reset) come da standard ISO7816. • Protocollo di comunicazione a 2 fili. • EEPROM organizzata in 256x8 bit (256 byte). • Indirizzamento al byte. • Protezione irreversibile di ogni singolo byte tra i primi 32 (PROM). • Tempo di programmazione pari Nome Produttore Capacità PROM Capacità EEPROM SLE4442 Infineon 32 byte 256 byte SLE4428 Infineon 1024 byte 1024 byte GPM2K Gemplus 32 byte 256 byte GPM8K Gemplus 1024 byte 1024 byte Tabella 1: Elenco delle memorie protette più diffuse in ambito smartcard MODUGNO-impaginato 27-05-2004 16:46 Pagina 25 TUTORIAL Numero Nome Direzione Descrizione C1 VCC I Alimentazione C2 RST I Reset C3 CLK I Clock C4 RFU C5 GND I Massa C6 VPP I Non connesso C7 I/O I/O Linea dati C8 RFU Non connesso Non connesso Figura 2: Tabella 2: • • • • Contatti nel chip SLE4442 a 2.5ms per byte. Almeno 10.000 cicli di scrittura garantiti. Conservazione dei dati garantita per almeno 10 anni. Protezione in scrittura mediante un PSC a 3 byte. Blocco irreversibile in scrittura dopo tre tentativi errati di presentazione del PSC. Disposizione dei contatti In figura 2 è mostrata la disposizione degli 8 contatti ISO7816 sul chip SLE4442. L’associazione tra contatto e funzionalità segue lo standard ISO, riassunto in tabella 2. Dei 6 contatti utili previsti dallo standard ISO7816, solo 5 vengono usati nell’integrato SLE4442, poiché non è prevista alcuna tensione di programmazione Vpp ed il pin relativo è non connesso. Oltre alla disposizione, notare la forma dei contatti che è tipica di Parametro Alimentazione (Vcc) Tabella 3: Le condizioni operative dell’integrato devono rientrare in quelle mostrate nella tabella 3. Organizzazione interna L’SLE4442 ha tre diverse zone di memoria di diversa capacità e funzionalità. La più capiente, definita Main Memory, è quella destinata alla memorizzazione dei dati dell’utente. Essa è organizzata a byte e può contenere 256 byte. I primi 32 byte possono essere resi definitivamente di sola lettura (PROM) scrivendo un opportuno bit nella Protection Memory (vedi dopo). Tutti i byte della Main Memory possono essere sempre letti in qualsiasi momento, mentre possono Minimo Tipico Massimo 4.75 V 5.0 V 5.25 V 3 mA 10 mA Corrente (Icc) Temperatura questo integrato. Se una smartcard ha la stessa disposizione e forma dei contatti come in figura 2, molto probabilmente è una smartcard SLE4442. 0 °C Condizioni operative del chip SLE4442. 70 °C Disposizione e forma dei contatti del chip SLE4442 essere scritti solo dopo aver inserito il PSC (vedi dopo). I byte protetti da scrittura non possono comunque essere modificati, anche inserendo correttamente il PSC. Dopo tre tentativi errati di presentazione del PSC, la memoria non può più essere scritta e diventa una ROM a tutti gli effetti. La Protection Memory è una memoria di 32 bit (4 byte) ed ha lo scopo di rendere irreversibilmente di sola lettura i primi 32 byte della Main Memory. Ogni bit della Protection Memory rappresenta un byte della Main Memory (dall’indirizzo 0 all’indirizzo 31). Scrivendo, per esempio, il bit 10 della Protection Memory si proteggerà il byte di indirizzo 10 della Main Memory da successive operazioni di scrittura (anche dopo aver presentato correttamente il PSC alla scheda). È possibile sempre leggere il contenuto della Protection Memory, mentre è possibile scrivere tali bit solo una volta: ciò vuol dire che, dopo aver protetto un byte della Main Memory, non è più possibile togliere tale protezione. La Security Memory è una memoria di 4 byte e contiene, partendo dall’indirizzo 0, il cosiddetto Error Counter e il PSC (Programmable Security Code) che occupa 3 byte. L’Error Counter è un contatore che TUTORIAL 25 MODUGNO-impaginato 27-05-2004 16:46 Pagina 26 TUTORIAL memorizza il numero di tentativi errati di inserimento del PSC, il quale rappresenta una specie di PIN, cioè di codice segreto che abilita l’utente alle operazioni di scrittura. Poiché il PSC è formato da 3 byte, cioè 24 bit, ci sono 224 (circa 16.000.000) combinazioni possibili, troppe per poter indovinare la giusta combinazione in tre tentativi. Oltre alle memorie, l’SLE4442 contiene la logica aggiuntiva per gestire l’interfacciamento con l’esterno (ATR, comandi, ecc) e l’accesso in scrittura/lettura alle diverse zone di memoria. In figura 3 è rappresentata l’organizzazione interna dell’SLE4442. Tutto quello che diremo per la smartcard a memoria protetta SLE4442 è valido anche per la smartcard a memoria libera SLE4432, con l’unica differenza che, in quest’ultima, è assente il meccanismo della protezione in scrittura mediante PSC (quindi, è assente la Security Memory). Accesso alla memoria Come si è accennato, è sempre possibile leggere il contenuto delle tre zone di memoria (Main, Security e Protection Memory), tranne i tre byte che formano il PSC nel caso in cui questo non sia ancora stato presentato correttamente. È sufficiente alimentare la scheda e utilizzare l’apposito protocollo, spiegato più avanti in questo articolo, per ottenere il contenuto della memoria, senza dover necessariamente conoscere il PSC, l’analogo del PIN. Questo vuol dire che la carta non potrà essere utilizzata per memorizzare dati che possono essere letti solo da personale autorizzato (per esempio, tutti i dati sensibili per la privacy), ma solo quei dati che devono essere protetti dalla scrittura non autorizzata. Infatti, per poter scrivere un solo bit di una qualsiasi zona di memoria (tranne i bit dell’Error Counter) è necessario conoscere e presentare correttamente il PSC alla scheda, la quale abiliterà le operazioni di scrittura. Ciò può essere molto utile quando vogliamo utilizzare una smartcard per memorizzare i punti accumula- ti da un nostro cliente o gli ingressi alla nostra struttura effettivamente pagati (palestre, docce, ecc). In questo caso, pur avendo a disposizione un lettore di smartcard SLE4442, sarà possibile, al massimo, leggere il numero dei crediti memorizzati nella scheda, ma non modificarli, per esempio aumentarli senza diritto. Solo chi conosce il PSC, cioè il proprietario della struttura/negozio, potrà aggiornare il numero di crediti in base agli acquisti del cliente. Inoltre, utilizzando tecniche di crittografia, è possibile comunque cifrare le informazioni memorizzate in modo che anche l’eventuale lettura sia vanificata (vedere, a tal proposito, uno dei prossimi articoli). Per la particolare tecnologia con cui sono realizzate le memorie dell’SLE4442, una operazione di cancellazione (erase) può avvenire solo su un intero byte e porta tutti i bit ad 1 logico. Quindi cancellare un byte vuol dire portarlo alla combinazione 1111 1111 (FF in esadecimale). Anche l’operazione di scrittura avviene a byte (non è possibile accedere direttamente ad un singolo bit di una qualsiasi zona di memoria), in modo leggermente più complicato. Per motivi tecnologici, il valore di un bit del byte a cui stiamo facendo riferimento, dopo l’operazione di scrittura sarà uguale ad un AND logico tra il vecVecchio Nuovo Risultato 1 1 1 1 0 0 0 1 0 0 0 0 Tabella 4: Figura 3: Organizzazione interna del chip SLE4442 26 TUTORIAL Tabella di verità dell’operazione logica AND in relazione alle operazioni di scrittura nella SLE4442. MODUGNO-impaginato 27-05-2004 16:46 Pagina 27 TUTORIAL chio valore memorizzato in quel bit e il nuovo valore che vogliamo scrivere. Spieghiamo meglio questo meccanismo, ricordando inizialmente la tabella di verità dell’operazione logica AND, mostrata nella tabella 4. Se il valore memorizzato nel bit è 1 (Vecchio=1), dalla tabella risulta che è possibile lasciare tale bit ad 1 (Risultato=1), scrivendo sempre 1 (Nuovo=1), oppure è possibile scrivere 0 (Risultato=0) scrivendo 0 (Nuovo=0). Se, invece, il valore memorizzato è 0 (Vecchio=0), sarà possibile lasciare tale bit a 0 (Risultato=0) scrivendo sempre 0 (Nuovo=0) ma non sarà possibile trasformarlo in 1, anche scrivendo 1 (Nuovo=1), come si evince dalla terza riga nella tabella 4. In quest’ultimo caso, cioè se dobbiamo scrivere 1 in un bit in cui è memorizzato 0, sarà necessario cancellare (operazione di erase) inizialmente l’intero byte, portando tutti i bit ad 1, da cui è possibile scrivere sia 0 che 1. In tabella 5 sono mostrati alcuni esempi di scrittura, evidenziando, per ognuno, se è necessario procedere con una operazione di erase. Nel primo e nel secondo caso, non è necessaria alcuna operazione di cancellazione del byte poiché tutti i bit rimangono ad 1 logico, oppure passano dal valore 1 al valore 0. Nel terzo ed ultimo esempio, un solo bit del byte deve passare dal valore 0 al valore 1 e, quindi, è necessaria un’operazione di erase. Ricordando che questa operazione avviene su un intero byte, si capisce come il byte 0000 0010 diventa, dopo la cancellazione, 1111 1111 e, successivamente, dopo l’operazione di scrittura, 1000 0010. Il meccanismo è relativamente complicato ma la buona notizia è che la logica interna del chip SLE4442 si occupa di tutto, in modo completamente trasparente. In altre parole, se un’operazione di scrittura prevede il passaggio di almeno un bit dal valore 0 al valore 1, il byte a cui si fa riferimento viene prima automaticamente cancellato. Naturalmente ciò comporta un diverso tempo di completamento della procedura: nei primi due casi sarà di circa 5ms, nell’ultimo caso sarà di circa 2.5ms. Generalità sul protocollo di comunicazione L’accesso ai dati contenuti in una smartcard è possibile tramite un dispositivo di interfacciamento, generalmente formato da un connettore utilizzato per l’inserimento della carta, un microcontrollore che si preoccupa di generare gli opportuni segnali sulle linee I/O e CLK, un display/tastiera oppure un collegamento seriale con un PC. Tale dispositivo verrà chiamato successivamente, riprendendo la terminologia contenuta nel datasheet dell’SLE4442, IFD (InterFace Device, dispositivo di interfacciamento). Il protocollo di comunicazione dell’SLE4442 utilizza le due linee, I/O e CLK. La linea I/O è bidirezionale e, in modalità output (direzione smartcard-IFD) lo stadio d’uscita è un open-drain. Per questo motivo è necessario utilizzare una resistenza di pull-up esterna su tale linea per una corretta comunicazione (si veda uno dei prossimi articoli sulla realizzazione di un lettore universale di smartcard). La linea CLK è sempre un ingresso per la smartcard e viene utilizzata dall’IFD per fornire il necessario segnale di clock per la sincronizzazione. Il protocollo è chiamato sincrono (e spesso anche tali smartcard vengono chiamate sincrone per questo motivo) poiché le transizioni sulla linea di I/O sono sincronizzate con gli impulsi di clock della linea CLK. ATR (Answer To Reset) Dopo aver alimentato la scheda, Valore memorizzato Nuovo valore Erase 1111 1111 1001 0010 NO 1001 0010 0000 0010 NO 0000 0010 1000 0010 SI Tabella 5: Figura 4: Esempi di operazioni di scrittura su un byte di memoria. Su ogni riga è indicato se è necessaria anche una operazione di cancellazione (Erase). Forme d’onda dei segnali durante l’operazione di reset TUTORIAL 27 MODUGNO-impaginato 27-05-2004 16:46 Pagina 28 TUTORIAL Byte 1 Byte 2 Byte 3 Byte 4 D7…D0 D15 ... D8 D23 ... D16 D31 ... D24 Tabella 6: Associazione tra i byte dell’ATR ed i bit trasmessi dalla smartcard come in figura 4. applicando una tensione di 5V tra i contatti Vcc e GND, la scheda è pronta per essere utilizzata. La prima operazione da effettuare è il Reset dell’integrato, senza della quale non è possibile iniziare alcuna comunicazione. Il reset della scheda viene effettuato generando un impulso di clock mentre la linea RST è a livello alto, come si può osservare nella figura 4. Successivamente, ad ogni impulso di clock, la scheda pone sulla linea I/O i primi 4 byte della Main Memory, trasmettendo ogni byte a partire dal bit meno significativo (vedere figura 4). Poiché ogni byte è formato da 8 bit, l’operazione di reset della carta viene completata dopo 33 impulsi di clock, contando anche il primo impulso. Dopo il 33esimo colpo di clock, la smartcard si mette in attesa di un comando impostando la linea di I/O come ingresso (alta impedenza). Considerando l’ordine di trasmissione dei bit e dei byte, i 4 byte dell’ATR sono formati dai bit trasmessi come indicato nella tabella 6. La risposta della carta al reset, cioè i 4 byte trasmessi con i successivi 32 colpi di clock, è detta Answer To Reset (risposta al reset) o, brevemente, ATR. Essa rappresenta un’informazione molto importante per tutte le smartcard, sincrone ed asincrone, oltre ad essere ufficializzata nello standard ISO7816. Spesso l’analisi dell’ATR permette di risalire al produttore, al fornitore, all’applicazione, alla capienza, al tipo di protocollo della smartcard. Il dispositivo di interfacciamento può anche controllare la correttezza dell’ATR e decidere di 28 TUTORIAL scartare la smartcard in cui sia errato o non compatibile, oppure selezionare l’opportuno protocollo di comunicazione se ne supporta diversi. Una smartcard SLE4442 vergine ha un ATR già programmato e non modificabile, uguale alla sequenza esadecimale A2 13 10 91. Senza entrare nei dettagli sulla composizione di un ATR di una smartcard sincrona, tale valore di ATR indica, tra l’altro, l’utilizzo di un protocollo di comunicazione a due fili ed una capacità di 256 byte. Il lettore di smartcard può controllare tale valore e, se compatibile solo con le SLE4442, scartare tutte le card con diverso ATR. Precisiamo che questi 4 byte si trovano normalmente memorizzati nei primi 4 byte della Main Memory, a partire dall’indirizzo 0: tali byte sono protetti da scrittura, mediante la Protection Memory, dalla fabbrica. È possibile risalire nuovamente all’ATR della scheda, dopo l’operazione di reset, andan- Figura 5: do a leggere il contenuto dei primi byte della Main Memory. COMANDI A parte la modalità di Reset e Answer-to-Reset, il chip SLE4442 aspetta indefinitamente un comando utile proveniente dall’IFD (Command Mode). Il lettore inizia un comando mediante una condizione di start (transizione verso il basso della linea I/O mentre la linea CLK è alta) e prosegue con la sua trasmissione mediante 24 successivi impulsi di clock. Infatti, ogni comando è formato da 3 byte, trasmessi serialmente bit a bit sulla linea di I/O a partire dall’LSB (Least Significant Bit, bit meno significativo). Il primo byte rappresenta il comando vero e proprio (lettura, scrittura, ecc), il secondo byte rappresenta un indirizzo ed il terzo byte un dato. A seconda del comando, il secondo e/o terzo byte potrebbero non essere usati (in questo caso, devono essere comunque trasmessi). Dopo i 24 impulsi di clock, il lettore genera una condizione di stop (transizione verso l’alto della linea di I/O mentre la linea CLK è alta). Durante questa fase (Command Mode), la linea di I/O ha direzione Forme d’onda associate ad un comando con modalità Outgoing e modalità Processing MODUGNO-impaginato 27-05-2004 16:46 Pagina 29 TUTORIAL lettore-smartcard, cioè il lettore determina il valore della linea mentre il chip ne legge lo stato. Dopo i 24 impulsi di clock e la condizione di stop, in funzione del comando trasmesso, si entra nella modalità trasmissione (Outgoing Mode) oppure di elaborazione (Processing Mode). In entrambe le modalità, la linea di I/O cambia direzione, cioè viene imposta dalla smartcard e letta dall’IFD. Nella modalità Outgoing, normalmente associata ai comandi di lettura di una zona di memoria, la smartcard trasmette i dati richiesti generando gli opportuni livelli sulla linea di I/O, sincronizzandoli con gli impulsi di clock provenienti dall’IFD. In questa fase, il lettore dovrà fornire un numero sufficiente di impulsi di clock a seconda dei dati che dovranno essere scambiati, i quali verranno trasmessi, come al solito, a partire dal bit meno significativo. Nella modalità Processing, normalmente associata ai comandi di scrittura, la smartcard esegue internamente il comando ricevuto. In questo caso, la linea di I/O è posta a livello basso dalla smartcard mentre il lettore dovrà contemporaneamente leggere tale livello e fornire un sufficiente numero di impulsi di clock. Non appena l’elaborazione termina, la smartcard pone a livello alto il pin di I/O. Dopo la modalità Outgoing o Processing, il lettore può trasmettere un successivo comando alla smartcard. In figura 5 sono mostrate le forme d’onda delle due linee I/O e CLK nel caso di un comando con modalità Outgoing e di un comando con modalità Processing. Tutti i comandi previsti per le smartcard SLE4442 sono riassunti in tabella 7. Per ognuno di essi sono specificati i tre byte e la modalità di funzionamento. Ricordo che la trasmissione dei tre byte costituenti il comando prevede la trasmissione a partire dal bit meno significativo. Quindi, volendo trasmettere il comando READ PROTECTION MEMORY, si dovranno trasmettere i bit nell’ordine 0010 1100, al contrario di come sono scritti in tabella. Nei successivi paragrafi verranno descritti in dettaglio tutti i comandi. VISUAL PARSIC Compilatore grafico per Microchip Picmicro Per chi vuole scrivere un programma in Assembler senza scrivere un solo rigo di codice Display LCD/VFD Noritake Cristallfontz Programmatori PIC ICD Debugger Programmatori Willem originali olandesi Gruppi di continuità da 500 VA fino a 160 KVA Schede PLC per PICmicro Telecamere a colori e b/n trasmittenti e via cavo Display a carattere scorrevole in offerta speciale WWW.PARSICITALIA.IT Via Rovereto, 13 - 48020 Savio (RA) - Tel 0544.927468 - Fax 178.6040078 - Email: [email protected] TUTORIAL 29 MODUGNO-impaginato 27-05-2004 16:46 Pagina 30 TUTORIAL Operazione Byte 1 COMANDO Byte 2 INDIRIZZO Byte 3 DATO Modalità READ MAIN MEMORY 0011 0000 Usato Non usato OUTGOING UPDATE MAIN MEMORY 0011 1000 Usato Usato PROCESSING READ PROTECTION MEMORY 0011 0100 Non usato Non usato OUTGOING WRITE PROTECTION MEMORY 0011 1100 Usato Usato PROCESSING READ SECURITY MEMORY 0011 0001 Non usato Non usato OUTGOING UPDATE SECURITY MEMORY 0011 1001 Usato Usato PROCESSING COMPARE VERIFICATION DATA 0011 0011 Usato Usato PROCESSING Tabella 7: Comandi previsti per le smartcard SLE4442 (i bit di ogni byte sono specificati dal più significativo al meno significativo). READ MAIN MEMORY È uno dei comandi maggiormente usati e consente di leggere il contenuto della Main Memory, formata da 256 byte. Come si può vedere in tabella 7, questo comando utilizza il byte di indirizzo (il secondo byte trasmesso), mentre ignora il dato (il terzo byte). Il byte di indirizzo viene usato come puntatore al primo byte della Main Memory da leggere. Ad ogni impulso di clock generato dall’IFD, la smartcard pone un bit del byte da leggere sulla linea di I/O, partendo come al solito dal meno significativo. Dopo aver trasmesso un intero byte, l’indirizzo di memoria viene automaticamente incrementato. Ciò permette al lettore di leggere il contenuto di tutta la Main Memory a partire da un dato indirizzo, mediante un unico comando e fornendo un numero sufficiente di impulsi di clock. Dopo l’ultimo bit (il più significativo del byte di indirizzo 255) sarà necessario un ulteriore impulso di clock per riportare la smartcard in attesa di un nuovo comando (linea I/O in ingresso). 30 TUTORIAL Quindi, per leggere la memoria partendo dal byte di indirizzo N (N=0…255), saranno necessari (256-N)x8+1 impulsi di clock. Per interrompere tale operazione, per esempio quando si vuole leggere un solo byte, è possibile generare un evento di break, come spiegato più avanti in questo articolo. UPDATE MAIN MEMORY È il comando che permette di modificare il contenuto della memoria principale, utilizzata per la conservazione dei dati utente. Il byte di indirizzo rappresenta l’indirizzo da modificare, mentre il byte dato rappresenta il nuovo valore da memorizzare. La logica interna della scheda procede alla cancellazione del byte nel caso sia necessaria, se cioè qualche bit del dato deve passare dal valore 0 al valore 1. In questa situazione, saranno necessari 255 impulsi di clock (corrispondenti a circa 5 ms). Invece, nel caso in cui non è necessaria alcuna operazione di erase, l’elaborazione del comando impiega 123 impulsi di clock (corrispondenti a circa 2.5 ms). Naturalmente, la scrittura del dato avviene effettivamente solo se il byte da modificare è accessibile in scrittura: nel caso della Main Memory, ciò avviene se è stato presentato correttamente il PSC e, nel caso di indirizzo compreso tra 0 e 31, il corrispondente bit della Protection Memory sia al valore 1. La scrittura viene inibita anche quando il dato che si vuole memorizzare è identico al dato già presente nella locazione di riferimento. In questi casi, cioè quando la scrittura non avviene, la fase di elaborazione del comando termina dopo soli due impulsi di clock. READ PROTECTION MEMORY Mediante questo comando è possibile leggere l’intero contenuto, a partire dal primo byte, della Protection Memory. I due byte di indirizzo e dato non sono usati. Poiché la Protection Memory è formata da 4 byte, saranno necessario 4x8+1=33 impulsi di clock, di cui i primi 32 sono necessari per la trasmissione di ogni singolo bit e l’ultimo impulso di clock è necessario per portare la carta nella modalità di attesa di un ulteriore comando. In MODUGNO-impaginato 27-05-2004 16:46 Pagina 31 TUTORIAL questo caso, i bit trasmessi rappresentano gli indirizzi 0, 1… 31 della Main Memory. Ricordiamo che ogni bit della Protection Memory rappresenta uno dei primi 32 byte della Main Memory. Se il bit corrispondente nella Protection Memory vale 0, tale byte nella Main Memory non può più essere modificato. Ovviamente, una volta che un bit della Protection Memory è stato scritto (trasformato nel valore 0), non potrà più essere cancellato (portato al valore originario 1). WRITE PROTECTION MEMORY È il comando che permette di modificare il contenuto della Protection Memory. Il byte di indirizzo, compreso tra 0 e 3, rappresenta il byte della memoria da modificare, mentre il byte dato rappresenta il nuovo valore da memorizzare. Come si è già detto, i 32 bit dei 4 byte che formano la Protection Memory permettono di proteggere da scrittura i primi 32 byte della Main Memory, in maniera irreversibile. Un bit a 0 nella Protection Memory, rappresenta un byte protetto nella Main Memory. Poiché questa operazione è irreversibile, non è più possibile cambiare il valore di un bit della Protection Memory da 0 nuovamente ad 1. La fase di elaborazione di questo comando termina sempre dopo 123 impulsi di clock, poiché non è possibile cancellare (portare ad FF) un byte della Protection Memory. Se non è stato ancora inserito il PSC corretto, oppure il dato che si vuol scrivere prevede il passaggio di un bit dal valore 0 al valore 1, la scrittura non avviene e l’elaborazione termina dopo soli 2 impulsi di clock. READ SECURITY MEMORY Allo stesso modo dei comandi READ MAIN MEMORY e READ PROTEC- TION MEMORY, questo comando legge l’intero contenuto della Security Memory, formata da 4 byte. I byte di indirizzo e di dato non sono usati. Come per la Protection Memory, sono necessari 4x8+1=33 impulsi di clock per ricevere l’intero contenuto di questa zona di memoria. Il primo byte, corrispondente all’indirizzo 0, è l’Error Counter che permette di conteggiare il numero di tentativi errati di inserimento del PSC. Il meccanismo di presentazione del PSC è spiegato più avanti in questo articolo. Gli altri tre byte della Security Memory contengono il PSC (Programmable Security Code), che rappresenta un codice identificativo che permette di abilitare l’accesso in scrittura di tutte le zone di memoria. Questi tre byte sono gli unici a non poter essere letti prima di un corretto inserimento del PSC: tentando di leggere il contenuto della Security Memory in questa condizione, la scheda restituirà il byte corretto dell’Error Counter ma tutti byte 00 (tutti i bit a 0) per il PSC. Dopo aver inserito correttamente il PSC, sarà possibile leggere e modificare lo stesso codice. UPDATE SECURITY MEMORY Mediante questo comando è possibile modificare il contenuto della Security Memory, quindi è possibile modificare il valore dell’Error Counter e del PSC. Il byte di indirizzo del comando rappresenta il byte da modificare nella Security Memory (0 per l’Error Counter, 1..3 per un byte del PSC), mentre il byte di dato rappresenta il nuovo valore da memorizzare. Per l’Error Counter, è possibile modificare solo il valore dei tre bit meno significativi, poiché gli altri non sono fisicamente implementati e vengono completamente ignorati. Anche per questo comando di scrit- tura, l’elaborazione termina in 123 impulsi di clock se la scrittura avviene effettivamente, oppure termina dopo soli due impulsi di clock se la scrittura viene inibita. Ciò accade quando si vuole modificare il PSC senza aver inserito correttamente il precedente codice (notare che il byte dell’Error Counter, invece, può essere sempre modificato), oppure quando il dato da scrivere è identico a quello già memorizzato. COMPARE VERIFICATION DATA Il comando COMPARE VERIFICATION DATA, da usare sempre in combinazione con una operazione di scrittura dell’Error Counter (vedi il paragrafo successivo per dettagli), permette di verificare un byte del PSC. Il byte di indirizzo rappresenta il byte del PSC da verificare: 1 per il primo byte, 2 per il secondo byte, 3 per il terzo byte. Il byte di dato, invece, rappresenta il contenuto di quel byte del PSC da confrontare con quello memorizzato nella smartcard. Dopo l’invio del comando, la smartcard entra in Processing Mode e termina l’elaborazione dopo due impulsi di clock. Figura 6: Diagramma di flusso da utilizzare per la verifica del PSC TUTORIAL 31 MODUGNO-impaginato 27-05-2004 16:46 Pagina 32 TUTORIAL Presentazione del PSC Più volte si è detto che le smartcard SLE4442 sono protette da un codice programmabile, definito PSC, formato da 3 byte e memorizzato nella Security Memory, agli indirizzi 1, 2 e 3. Per poter modificare il contenuto della Main Memory, della Protection Memory o della Security Memory stessa, è necessario presentare correttamente alla smartcard il PSC attualmente memorizzato nella scheda. In altre parole, è necessario utilizzare tre diversi comandi COMPARE VERIFICATION DATA per confrontare ogni singolo byte del PSC. In dettaglio, l’algoritmo da utilizzare per inserire il codice PSC è mostrato, attraverso il suo diagramma di flusso, in figura 6. Come prima operazione è necessario leggere il contenuto dell’Error Counter, mediante il comando READ SECURITY MEMORY. In questo byte sono implementati solo i tre bit meno significativi, mentre gli altri bit sono sempre letti al valore 0. I tre bit meno significativi rappresentano il numero dei tentativi di inserimento del PSC ancora rimasti. Se, per esempio, l’Error Counter vale 07 (0000 0111) abbiamo ancora tre tentativi a disposizione. Se, invece, l’Error Counter vale 00 (0000 0000) non è più possibile inserire correttamente il PSC e quindi il contenuto della scheda non potrà più essere modificato. Se ci sono ancora tentativi disponibili, è necessario scrivere uno dei bit dell’Error Counter, cioè cambiare il suo valore da 1 a 0, mediante una operazione di UPDATE SECURITY MEMORY. Senza di questo comando, i successivi comandi di verifica PSC non saranno accettati. Successivamente è possibile inviare i tre comandi COMPARE VERIFICATION DATA per confrontare ogni singolo byte del PSC. Se il PSC inserito è corretto, sarà possibile modificare il contenuto delle varie zone di 32 TUTORIAL memoria. Per controllare ciò, è possibile procedere ad una cancellazione dell’Error Counter, in modo da portare nuovamente a 3 i tentativi disponibili. Ciò è possibile utilizzando il comando UPDATE SECURITY MEMORY con indirizzo 0 (Error Counter) e dato 07 (0000 0111). Inviamo, ora, il comando di READ SECURITY MEMORY e confrontiamo il valore di Error Counter. Se questi è pari a 07, l’inserimento del PSC è andato a buon fine, tant’è che siamo riusciti a ricaricare completamente l’Error Counter. In caso contrario, invece, la smartcard non ha accettato il PSC trasmesso ed infatti l’Error Counter non è stato ricaricato. In questo caso, l’operazione ha comportato una diminuzione del numero di tentativi a disposizione prima che la smartcard venga completamente e definitivamente protetta da scrittura. Break Generando una condizione di Break, la smartcard interrompe eventuali operazioni in corso, pone la linea di I/O in alta impedenza ed aspetta un successivo comando. Ciò può essere utile, per esempio, se vogliamo leggere una zona limitata della Main Memory. Come si è visto, il comando READ MAIN MEMORY permette di leggere l’intero contenuto della memoria, a partire da un certo indirizzo. Durante questa operazione, non appena l’IFD riceve l’ultimo byte della zona di memoria che ci interessa, può generare una condizione di Break. Tale condizione si verifica portando a livello alto la linea RST mentre la linea CLK è a livello basso. STANCHI DI GIOCARE? Cosa contiene il prossimo articolo Nel successivo articolo, scopriremo l’altra tipologia di smartcard, cioè le carte a microprocessore. Anche queste carte sono molto diffuse, pure a livello hobbistico, e permettono di raggiungere un grado di sicurezza ed una capacità di elaborazione impossibile rispetto alle smartcard a memoria. Naturalmente sono rivolte a sistemi più complessi e delicati. BIBLIOGRAFIA • Home page Microchip, sezione memorie seriali I2C (in inglese): www.microchip.com • Home page I2C di Philips Semiconductor (in inglese): www.semiconductors.philips.com/buses/i2c/index.html • Smartcard a memoria della Gemplus (in inglese): www.gemplus.com/products/card_memo.html • Home page Infineon, sezione Product → Security + Chip Card ICs (in inglese): www.infineon.com • Alcuni distributori smartcard SLE4442 (l’elenco è sicuramente incompleto): • www.vimascard.com • www.smartcardsupply.com • www.didya.com • www.epm.it • www.futuranet.it • www.finim.com (prezzi un po’ esagerati) • shop.blutronics.com • www.pikappa.com MODUGNO-impaginato 28-06-2004 18:02 Pagina 38 TUTORIAL SMARTCARD terza parte SMARTCARD A MICROPROCESSORE di Giuseppe Modugno [email protected] Dopo aver discusso, nel precedente articolo, delle smartcard a memoria, in questa terza parte del tutorial approfondiamo le smartcard a microprocessore: cosa sono, in cosa si differenziano dalle smartcard a memoria, quali sono i loro vantaggi, dove vengono usate. RIPRENDIAMO LA NOSTRA PARTITA A CARTE Cosa ci siamo detti negli articoli precedenti Il primo articolo ha introdotto il termine smartcard, ha fatto una panoramica sulle maggiori applicazioni che le utilizzano e le ha classificate in base alle loro caratteristiche interne e in base alla modalità d’utilizzo. Un accenno agli standard internazionali di riferimento (ISO7816) conclude la prima parte. Nel secondo articolo si può trovare una descrizione dettagliata sulle smartcard a memoria libera e protetta, con un maggiore approfondimento sulle carte basate sul diffusissimo chip SLE4442. In questo articolo verranno trattate le altre smartcard esistenti sul mercato, definite smartcard a microprocessore. Cosa sono le smartcard a microprocessore A differenza delle smartcard a memoria, in quelle a microprocessore sono presenti diversi integrati complessi tra cui, il principale, è un microprocessore dedicato oppure di tipo generico. Nelle prime, una memoria EEPROM e della semplice logica digitale di 38 TUTORIAL autenticazione rappresenta l’intero contenuto della smartcard, quindi molto semplice da realizzare e gestire. Le smartcard a microprocessore, invece, sono sistemi elettronici sicuramente più complessi, poiché contengono internamente un vero e proprio microprocessore. Naturalmente, oltre a questo integrato, di per sé già complesso, sono presenti delle memorie volatili (RAM) e non volatili (EPROM, EEPROM, Flash) che permettono di gestire i dati durante l’elaborazione e conservarli durante il trasporto. Se nelle smartcard a memoria l’intelligenza del sistema è tutta spostata da un lato, e cioè nel dispositivo di interfacciamento (lettore) o nel sistema di gestione della carta, comunque esterna alla smartcard, in quelle a microprocessore l’intelligenza e la potenza di calcolo è presente anche, ed in alcuni casi completamente, all’interno della carta stessa. Ciò porta a numerosi vantaggi impossibili da raggiungere con una semplice smartcard a memoria. La maggiore potenza di calcolo permette di implementare all’interno della carta degli algoritmi di crittografia avanzati a chiave simmetrica o, come maggiormente accade, a chia- ve asimmetrica. Ciò rende la comunicazione tra carta e sistema d’identificazione decisamente più sicura nei confronti di tentativi di intrusione da parte di pirati informatici. Solo per giustificare tale affermazione, rivolgiamo la nostra attenzione alle più semplici smartcard a memoria protetta SLE4442, di cui abbiamo ampiamente parlato nel precedente articolo. Com’è stato detto, queste smartcard hanno un codice segreto a tre byte, denominato PSC, che ha la stessa funzione di un PIN per le sole operazioni di scrittura. In parole semplici, la logica di sicurezza interna alla carta blocca qualsiasi operazione di scrittura se non è stato precedentemente inserito il PSC. Per fare ciò, è necessario inviare alla carta tre comandi COMPARE VERIFICATION DATA e, per ognuno di questi, specificare chiaramente un byte del PSC. Senza ricorrere a conoscenze elevate di intrusione in sistemi di autenticazione e senza spendere milioni di euro in macchinari sofisticati, è possibile “spiare” il corretto PSC che transita in chiaro tra il lettore di smartcard e la carta stessa. Basterebbe un dispositivo che legga continuamente lo stato della linea I/O MODUGNO-impaginato 28-06-2004 18:02 Pagina 39 TUTORIAL e, individuati i comandi COMPARE VERIFICATION DATA, legga e memorizzi i byte relativi che, appunto, rappresentano il PSC in chiaro. Il punto debole di questo sistema sta nel canale di comunicazione smartcard-lettore che, almeno in alcuni casi, è insicuro: in canali di comunicazione insicuri non devono transitare in chiaro dati sensibili, come il PSC, poiché potrebbero essere catturati per scopi fraudolenti. In sistemi di autenticazione basati su smartcard a microprocessore, è possibile trasmettere i dati sensibili in forma criptata che la smartcard decodifica mediante una operazione di elaborazione ed un algoritmo di decifrazione eseguito dal microprocessore stesso. Questa misura di sicurezza non può essere utilizzata in semplici smartcard a memoria, seppur protetta, come le SLE4442, poiché manca la potenza di calcolo per l’esecuzione dell’algoritmo. Due applicazioni molto importanti di questa tecnica sono la rete di telefonia cellulare GSM e la televisione digitale satellitare a pagamento, sistemi in cui sono ampiamente utilizzate smartcard a microprocessore per l’autenticazione dell’utente e per la gestione dei diritti di utilizzo o di visione. Oltre ai vantaggi relativi alla sicurezza delle informazioni contenute nella smartcard, la presenza di un microprocessore aumenta notevolmente la flessibilità della carta. Per esempio, è possibile creare delle smartcard multiapplicazione utilizzate, cioè, in diverse applicazioni che possono essere la telefonia cellulare, l’acquisto mediante traffico prepagato, la richiesta di certificati nella pubblica amministrazione, tutte presenti all’interno di un’unica carta. In questo modo, il microprocessore può gestire contemporaneamente più dati ed applicazioni, fornendo a ciascuna di queste l’elaborazione necessaria per portarle a termine, oltre alla gestione della memoria sufficiente per la conservazione dei dati. In smartcard di questo tipo, è possibile creare o eliminare “al volo” alcune applicazioni personalizzate e, quindi, abilitare la scheda a certe operazioni oppure ad altre. Per esempio, in un futuro non molto lontano, potrebbe essere possibile ricevere dal comune di residenza una carta d’identità elettronica, equivalente a tutti gli effetti alla carta d’identità cartacea ed utilizzabile in tutti i contesti in cui è utilizzata quest’ultima e, successivamente, portarla alla motorizzazione per abilitarla a “funzionare” anche come patente di guida. In questo modo, con un unico supporto facilmente trasportabile, sarà possibile richiedere automaticamente il proprio stato di famiglia dall’ufficio anagrafe e comprovare il titolo di “guidatori autorizzati” ad un controllo dei carabinieri su strada. Naturalmente, per utilizzare questa carta è necessario che il sistema riconosca nel portatore il legittimo proprietario, per esempio mediante la digitazione di un codice PIN segreto oppure mediante l’analisi di fattori biometrici, quali le impronte digitali o, magari, mediante entrambe le soluzioni. Inizialmente sono nate delle smartcard che utilizzavano dei semplici microprocessori generici, cioè non progettati per l’integrazione in ICcard. Successivamente, le esigenze di elaborazione e memorizzazione si sono così evolute da portare molti produttori di chip a realizzare dei microprocessori dedicati ad applicazioni per smartcard. In quest’ambito, particolarmente attivi sono Atmel, STMicroelectronics, Philips, Siemens, Infineon e tanti altri nomi di minor calibro. Come al solito, gli standard di riferimento per le smartcard a microprocessore, così come per le smartcard a memoria, sono quelli denominati ISO7816, in cui vengono specificati i protocolli di comunicazione, i comandi e la gestione dei dati mediante file system dedicato. Nel seguito dell’arti- colo, approfondiremo le smartcard a microprocessore di tipo standard, dopo aver fatto una panoramica sulle smartcard a microprocessore non standard o “quasi standard” nel prossimo paragrafo. D’ora in poi, per brevità, il termine smartcard farà riferimento alle smartcard a microprocessore, tranne dove esplicitamente indicato. LE SMARTCARD NON STANDARD O “QUASI STANDARD” Iniziamo la nostra panoramica sulle smartcard a microprocessore partendo dalle meno evolute e che ho definito “non standard” o “quasi standard”. Sottolineo che questa non è una terminologia diffusa, ma la utilizzo in questo articolo per facilitare la comprensione. Con smartcard non standard intendo una smartcard che integra un microprocessore o, in molti casi, un microcontrollore di tipo generico, non progettato esclusivamente per l’utilizzo in carte intelligenti. Una smartcard di questo tipo è normalmente identica ad una smartcard ISO7816 per quanto riguarda le dimensioni e la posizione dei contatti sulla superficie superiore, ma, inglobando un microprocessore general-purpose, non implementa necessariamente delle tecniche di comunicazione identiche a quelle definite negli standard ISO. Normalmente i contatti VCC e GND forniscono l’alimentazione al microprocessore, CLK fornisce il clock per il funzionamento, RST, VPP e I/O rappresentano dei pin di I/O generici del microprocessore (GPIO, GeneralPurpose Input Output). Esternamente, quindi, una smartcard di questo tipo non è altro che un microprocessore che dobbiamo alimentare tramite due contatti, a cui dobbiamo fornire il clock di riferimento tramite un altro contatto e con cui possiamo comunicare mediante tre linee. Non essendo smartcard a micropro- TUTORIAL 39 MODUGNO-impaginato 28-06-2004 18:02 Pagina 40 TUTORIAL cessore standard, non dovrebbero avere un grande mercato, ma hanno una grande diffusione nelle applicazioni hobbistiche. Cerchiamo di capire quali sono i vantaggi e gli svantaggi nell’utilizzare una di queste carte nelle proprie applicazioni. Innanzitutto, integrando solo un microprocessore per scopi generici molto diffuso sul mercato, queste smartcard hanno un costo relativamente basso, in molti casi simile ad una smartcard a memoria. Oltre al costo, un altro vantaggio è sicuramente la più facile reperibilità, anche per piccole quantità. In applicazioni dove il costo, piuttosto che lo standard utilizzato, è di fondamentale importanza e, magari, dove i numeri in gioco non sono elevati, può fare molto comodo una smartcard di questo tipo. Naturalmente sarà necessario scrivere un programma (firmware) per tale microcontrollore ed avere la strumentazione necessaria per scaricarlo nella sua memoria (normalmente, per questo scopo, si utilizza un programmatore realizzato appositamente per il microcontrollore utilizzato). Com’è facile intuire, a fronte di questi vantaggi, ci sono numerosi svantaggi da prendere in debita considerazione, tutti quanti derivati dal fatto che tali smartcard non seguono gli standard internazionali di riferimento. Quindi questo vuol dire che, molto probabilmente, non potrò utilizzare un lettore standard di smartcard, ma dovrò realizzarne uno personalizzato, il che può richiedere, oltre a tempi di progettazione e realizzazione inadeguati con la mia applicazione, dei costi notevoli. Si pensi ad un sistema in cui i punti di utilizzo delle smartcard siano tanti (una catena di supermercati con tante casse in ognuna delle quali l’operatore può gestire la “carta fedeltà” del cliente di turno). Posso anche decidere di utilizzare una soluzione non standard comprando, a poco prezzo delle smartcard di questo tipo, ma devo anche realizzare 40 TUTORIAL tanti lettori personalizzati di tali carte piuttosto che comprare, a basso costo, dei lettori universali. Inoltre, se in futuro volessi cambiare il tipo di carta per un qualsiasi motivo (capacità di memorizzazione, reperibilità, costi, ecc.) molto probabilmente dovrò affrontare il costo della sostituzione di tutti i lettori nel mio sistema o, quantomeno, la loro riprogrammazione. Poiché il microcontrollore può essere programmato in qualsiasi modo per utilizzare i tre pin generici (RST, I/O, VPP) è anche possibile “mimare” il comportamento di una smartcard standard soprattutto in termini di protocollo, in modo tale che all’esterno possa apparire una vera e propria smartcard standard. Il vantaggio di questo metodo è che, almeno in alcuni casi, è possibile utilizzare i lettori di smartcard standard che funzioneranno senza problemi, credendo di dialogare con una smartcard standard a tutti gli effetti. Naturalmente la emulazione di una smartcard standard difficilmente è completa e, comunque, potrebbe creare problemi in alcune situazioni, da valutare caso per caso. Sono queste le smartcard che ho definito “quasi standard”. La maggiore “applicazione” di questa tecnica è, purtroppo, la pirateria satellitare dove una carta, basata su un microcontrollore generico, viene programmata in modo che emuli, per quanto possibile, una smartcard originale, soprattutto per quello che riguarda il protocollo di comunicazione ed i dati scambiati relativi ai diritti di visione. Le smartcard basate sui PIC Le più diffuse smartcard di questo tipo sono quelle che integrano uno dei diffusissimi microcontrollori della Microchip, i cosiddetti PIC. È molto facile trovare, nei negozi di elettronica e nelle fiere, carte che contengono PIC16F84, PIC16F628, PIC16F876 e PIC16F877. Sono tutti microcontrollori dotati di una Flash utilizzata per la memorizzazione del firmware (il PIC16F84 ha una Flash di 1024 istruzioni, il 16F628 di 2048, il 16F876 e il 16F877 di 8192 istruzioni). Le caratteristiche sono molto simili tra loro, soprattutto se integrati in una smartcard, e la scelta deve essere fatta considerando soprattutto la quantità di memoria programma necessaria al nostro firmware. A differenza di altri microcontrollori di altri produttori, questi PIC contengono un’area di memoria Flash distinta, dedicata solo alla conservazione del programma, quella di cui abbiamo appena parlato ed una EEPROM per la memorizzazione dei dati dell’applicazione in modo non volatile (conservati, cioè, anche ad alimentazione Figura 1: Schema di interconnessione tra il PIC, la EEPROM ed i contatti ISO7816 in una goldcard MODUGNO-impaginato 28-06-2004 18:02 Pagina 41 TUTORIAL assente). Il PIC16F84 ed il 16F628 hanno una EEPROM di 64 byte, mentre i PIC16F876 e 16F877 hanno una EEPROM di 256 byte. Si può ben comprendere come tali quantità sono, oggigiorno, troppo limitanti: in molti casi, anche un semplice numero di serie o una chiave crittografica può occupare 64 byte, senza considerare i dati necessari all’applicazione, normalmente personalizzabili dall’utente o dal gestore della carta. Per questo motivo, la maggior parte delle smartcard basate su PIC, oltre a contenere un microcontrollore, integrano anche una EEPROM seriale I2C del tipo 24LCxx, prodotta sempre dalla Microchip. Le interconnessioni tra il microcontrollore e la EEPROM esterna sono effettuate nella smartcard dal produttore che si preoccupa di integrare i chip sotto i contatti ISO7816. Il programmatore del firmware, conoscendo l’interconnessione interna tra PIC ed EEPROM esterna, può scrivere il codice in modo da sfruttare la capacità di questa memoria addizionale, normalmente utilizzata per la conservazione dei dati dell’utente e/o dell’applicazione. Sul mercato, queste smartcard hanno dei nomi non ufficiali ma accettati dalla comunità degli utilizzatori: ad ogni tipo è associato un colore diverso. La goldcard (carta d’oro) contiene un PIC16F84 ed una EEPROM 24LC16 da 2KB. La canarycard (carta giallo-canarino) contiene un PIC16F628 ed una EEPROM 24LC16. La silvercard (carta d’argento) contiene un PIC16F877 ed una EEPROM 24LC64 da 8KB. La greencard (carta verde) contiene un PIC16F877 ed una EEPROM 24LC128 da 16KB. Poiché i nomi non sono standard, è possibile che in alcuni casi si utilizzino in modo diverso, soprattutto per quello che riguarda la capacità della EEPROM che può variare. Purtroppo non è semplice capire, avendo una smartcard di questo tipo, quali sono gli integrati che si trovano internamente, soprattutto per quello che riguarda la capacità della EEPROM, che in alcuni casi può anche essere assente. È bene verificare con il venditore la composizione delle smartcard che stiamo acquistando. In figura 1 è mostrato lo schema di interconnessione tra il PIC16F84, la EEPROM 24LC16 e i contatti ISO7816 della smartcard, in una goldcard, mentre nella Tabella 1 sono descritti i vari collegamenti. Come si può notare, l’alimentazione positiva Vcc viene collegata al pin di alimentazione del microcontrollore e della EEPROM, così come la massa Vss. Inoltre, il pin WP (Write Protect) della EEPROM viene messo a livello zero per abilitare la scrittura. Anche i pin A0, A1 e A2 della EEPROM sono posti a zero logico, impostando così un indirizzo I2C pari ad A0 (1010 0000) nelle operazioni di scrittura e A1 (1010 0001) nelle operazioni di lettura. Il pin RST è collegato diretta- ISO7816 16F84 24LC16 1 (Vcc) 14 (Vcc) 8 (Vcc) 2 (RST) 4 (MCLR) 3 (CLK) 12 (RB6), 16 (CLKIN) 5 (Vss) 5 (Vss) 7 (I/O) 13 (RB7) 1 (A0), 2 (A1), 3 (A2), 4 (Vss), 7 (WP) 11 (RB5) 6 (SCL) 10 (RB4) 5 (SDA) Tabella 1: Dettaglio delle interconnessioni in una goldcard. mente all’MCLR del microcontrollore, in modo che funzioni come un segnale di reset (il PIC 16F84 viene messo nello stato di reset se il suo pin MCLR viene posto a livello basso): in questo modo, il lettore di smartcard può generare una condizione di reset del microcontrollore, e quindi di tutta la smartcard, ponendo il segnale RST a livello basso e riportandolo a livello alto. Il pin di I/O è collegato ad un GPIO del 16F84, cioè l’RB7. Il segnale CLK è collegato al pin CLKIN del microcontrollore, cioè al pin d’ingresso utilizzato come segnale di clock. Esso è anche collegato al GPIO RB6 del microcontrollore. Il motivo per cui CLK è collegato anche ad RB6 ed il pin I/O proprio al pin RB7 deriva dalla necessità di poter programmare il microcontrollore utilizzando i soli pin accessibili dalla smartcard, e cioè i pin ISO7816. Come molti sapranno, i PIC hanno una modalità di programmazione seriale che prevede l’utilizzo, tra gli altri, dei due pin RB6 ed RB7. Il primo, durante la fase di programmazione, viene utilizzato come segnale di clock, mentre il secondo come segnale dei dati. Tali pin sono accessibili all’esterno mediante i contatti CLK e I/O della smartcard e ciò rende possibile la programmazione del microcontrollore mediante un apposito programmatore di PIC dotato di connettore per smartcard ISO7816. Ecco perché, come pin di I/O, è stato scelto proprio il pin RB7 del 16F84 e perché il segnale CLK è collegato anche al pin RB6 dello stesso microcontrollore. In caso contrario, non sarebbe stato possibile programmare dall’esterno il PIC, rendendo completamente inutile la smardcard. Infine, il collegamento tra EEPROM seriale e microcontrollore avviene tramite il bus I2C, composto da due sole linee denominate SCL (clock) e SDA (dati). I pin SCL ed SDA della EEPROM sono collegati rispettivamente ai pin RB5 e RB4 del micro- TUTORIAL 41 MODUGNO-impaginato 28-06-2004 18:02 Pagina 42 TUTORIAL Figura 2: Lato rame in scala 1:1 di una wafercard basata su PIC16F84 e 24LC16 Figura 3: Piano di montaggio della wafercard controllore. Anche questa non è una scelta casuale in quanto, per poter funzionare correttamente, il bus I2C prevede l’utilizzo di due resistenze di pull-up su ogni linea. La porta B del PIC16F84, di cui fanno parte i due pin RB4 ed RB5, ha delle resistenze di pull-up che è possibile abilitare trami- Figura 4: Wafercard con gli integrati PIC16F84 e 24LC16 montati 42 TUTORIAL te software (basta mettere a 0 il pin RBPU del registro OPTION_REG). Faccio notare che tali pull-up sono per default disabilitati sulla porta B, quindi è necessario abilitarli prima di poter utilizzare la EEPROM esterna. La filosofia delle altre smartcard basate sui PIC (canarycard, silvercard, greencard e tante altre dai nomi più strani) rimane la stessa. Quello che cambia è il tipo di PIC integrato e la quantità di memoria EEPROM esterna al microcontrollore disponibile. Le smartcard basate sui microcontrollori ATMEL I microcontrollori della Microchip sono molto diffusi ed economici ed anche le smartcard basate su questi integrati hanno subito la stessa sorte sul mercato. Esistono però altre smartcard non standard basate sul microcontrollore della ATMEL AT90S8515 ed una EEPROM 24LC64. Generalmente queste smartcard sono identificate dal nome funcard. Questo microcontrollore è basato sull’architettura consolidata AVR della ATMEL. L’integrato AT90S8515 è dotato di 8 KB di memoria Flash e 512 byte di EEPROM e può essere pilotato con una frequenza di clock fino ad 8 MHz (esistono due versioni di questo chip, una con limite superiore pari a 4 MHz ed un’altra fino ad 8 MHz). Attualmente è un prodotto sconsigliato dalla ATMEL per nuovi progetti, poiché sostituito con altri microcontrollori più recenti della serie ATmega. Così come per i PIC, anche questo integrato si è molto diffuso tra gli hobbisti per la facile reperibilità, il basso costo e soprattutto per la possibilità di costruire facilmente un programmatore. Le smartcard fatte in casa Non possiamo chiudere la nostra panoramica sulle smartcard “non standard” ignorando la possibilità di costruire delle carte in casa. Nella maggior parte dei casi, una smartcard viene inserita in un apposito dispositivo di interfacciamento, sporgendo leggermente dalla fessura (in altri casi, invece, la smartcard viene “risucchiata” completamente dal dispositivo per essere, alla fine delle operazioni, restituita all’utente). Questo vuol dire che è possibile utilizzare delle smartcard di uguale spessore e larghezza, ma più lunghe, a patto che i contatti ISO7816 siano sempre nella stessa posizione. È possibile, quindi, realizzare un circuito stampato su una basetta delle stesse dimensioni di una smartcard standard ma, appunto, più lunga, in modo da poter montare degli integrati (come un microcontrollore o una memoria) che rimarranno all’esterno del lettore. Naturalmente, dovremo utilizzare una basetta da 0.8mm per avere uno spessore simile a quello di una smart- MODUGNO-impaginato 28-06-2004 18:02 Pagina 43 TUTORIAL card standard. I contatti ISO7816, formati da piazzole di sufficiente dimensione e opportuna posizione, saranno collegati ai pin degli integrati che si troveranno dall’altro lato della smartcard, nello spazio che sporgerà dal lettore. In questo modo, potremo realizzare, per esempio, una simil-goldcard (come quella schematizzata in figura 1) che funzionerà allo stesso modo, con l’unica differenza dovuta alle dimensioni ed all’estetica. È ovvio che una smartcard di questo tipo non è assolutamente standard, è più scomoda da trasportare e può essere utilizzata solo con i dispositivi di lettura che non “ingoiano” completamente la carta. Utilizzando degli zoccoli, sarà possibile programmare gli integrati estraendoli dalla smartcard e reinserirli successivamente già programmati. In questo modo, non è più necessario programmare il microcontrollore in-circuit e, quindi, le connessioni in Tabella 1 possono essere modificate a piacimento (a parte i pin di alimentazione). Nella maggior parte dei casi, però, le connessioni rimangono le stesse di quelle delle versioni plastificate per mantenere la compatibilità tra i firmware dei microcontrollori. Spesso, queste carte fatte in casa, che difficilmente possono essere chiamate smartcard per la grande differenza che esiste con queste ultime, vengono indicate con il termine wafercard. La figura 2 mostra il lato rame di una goldcard su wafercard in scala 1:1 che può essere usata per la realizzazione mediante fotoincisione su una qualsiasi basetta dello spessore di 0.8mm. In figura 3 è mostrato il semplice piano di montaggio. È possibile trovare dei kit di montaggio di wafer card, con il circuito stampato già realizzato: in figura 4 è mostrata una wafercard di questo tipo con gli integrati inseriti nei relativi zoccoli. Termino qui la discussione sulle smartcard “non standard” e “quasi stan- dard”, passando finalmente alle smartcard a microprocessore ISO7816 a tutti gli effetti. Con questa breve panoramica ho voluto solo informare dell’esistenza di tali carte sul mercato, soprattutto hobbistico, ma sconsiglio vivamente di utilizzarle in proprie applicazioni, se non in casi eccezionali. È sempre preferibile utilizzare uno standard, quando esiste, soprattutto se il mercato lo ha recepito così diffusamente come nel caso dell’ISO7816. LE SMARTCARD STANDARD Oltre alle caratteristiche fisiche ed elettriche di una generica smartcard, lo standard ISO7816, nella parte III, specifica anche il protocollo di comunicazione tra la carta ed il mondo esterno. Consideriamo un sistema formato da una smartcard inserita nell’apposito dispositivo di lettura. Questo sistema è costituito da due chip intelligenti, probabilmente due microprocessori, uno integrato nella smartcard ed uno presente nel lettore, che devono dialogare tra loro utilizzando un protocollo comune. Per aumentare l’interoperabilità tra le carte e i dispositivi d’interfaccia, lo standard specifica una serie di protocolli che possono essere negoziati durante la fase di reset ed utilizzati da entrambe le parti. In questo modo sarà possibile utilizzare lettori e smartcard di diversi produttori senza problemi di incompatibilità. Il protocollo T=0 Il protocollo più semplice e maggior- mente utilizzato è quello denominato “T=0”. È un protocollo half-duplex asincrono orientato al byte molto simile allo standard RS232 utilizzato praticamente su tutti i PC. Esso è orientato al byte poiché il trasmettitore (la smartcard oppure il lettore) invia un singolo byte al ricevitore incapsulato in un opportuno frame per il trasporto. Esiste anche un altro tipo di protocollo, di cui non parleremo in questo articolo, denominato “T=1” che è, invece, orientato a blocchi di byte. Il protocollo T=0 è di tipo half-duplex, cioè a domanda e risposta, poiché il canale di comunicazione è formato da un unico segnale, il contatto I/O della smartcard. Per questo motivo, è possibile trasmettere dati dalla smartcard verso il lettore oppure viceversa, ma mai contemporaneamente. Naturalmente questo comporta che il pin di I/O sia bidirezionale. Questa caratteristica differenzia il protocollo T=0 dall’RS232 in quanto, in quest’ultima, ci sono due fili che possono ospitare contemporaneamente trasferimenti di dati in entrambe le direzioni (full-duplex). L’hardware della smartcard e del dispositivo di interfacciamento, dovrà essere in grado di cambiare la direzione del pin dei dati, cioè dovrà cambiare continuamente da trasmettitore a ricevitore, a seconda dei dati scambiati. Ciò comporta necessariamente un tempo di ritardo, definito line turnaround time, tra la domanda e la risposta, dovuto al cambio di direzione. Figura 5: Segnale di I/O relativo alla trasmissione di un byte nel protocollo T=0 TUTORIAL 43 MODUGNO-impaginato 28-06-2004 18:02 Pagina 44 TUTORIAL Così come l’RS232, il protocollo T=0 è asincrono: il trasmettitore può iniziare la trasmissione di un byte in qualsiasi momento senza dover sincronizzare questo evento con un segnale di clock. È per questo che le smartcard a microprocessore vengono anche chiamate comunemente smartcard asincrone, a differenza delle smartcard a memoria che, al contrario, utilizzano un protocollo sincrono (per maggiori dettagli, vedere l’articolo precedente). Poiché il protocollo è half-duplex e la comunicazione è asincrona, per evitare collisioni dovute alla trasmissione contemporanea dei due nodi, come regola generale, è sempre il lettore che inizia la trasmissione di un byte. In funzione del protocollo utilizzato, la smartcard risponderà ai comandi trasmessi dal lettore. Quindi la smartcard non può mai decidere di trasferire dati al lettore autonomamente (a parte l’ATR che si vedrà più avanti in questo articolo). In figura 5 è rappresentata la forma d’onda del segnale I/O relativa alla trasmissione di un byte dalla smartcard al dispositivo di lettura o viceversa. Normalmente, quando non c’è alcuna trasmissione, lo stato della linea di I/O è a livello alto (stato Z). L’invio di un byte inizia sempre con un bit di start S generato dal trasmettitore imponendo un livello basso (stato A) per un tempo di bit, definito ETU (Elementary Time Unit). Successivamente vengono trasmessi gli 8 bit che formano il byte (ba, bb, bc, bd, be, bf, bg, bh), seguiti dal bit di parità P, ognuno dei quali dura sempre un ETU. Il bit di parità viene calcolato in modo tale che il numero di bit ad 1 sia pari. Dopo il bit di parità, il trasmettitore mette il bit di I/O in ricezione, rilasciando la linea nuovamente nello stato Z. Nessun ulteriore invio di dati può avvenire per un tempo di guardia (guard time) pari almeno a 2 ETU. La distanza tempo- 44 TUTORIAL rale tra un byte ed il successivo sarà, quindi, di almeno di 12 ETU. Ma quanto vale questa unità di tempo chiamata ETU? Essa dipende lineramente dalla frequenza di clock che il dispositivo di interfacciamento genera ed invia alla smartcard. La relazione matematica è 1 ETU = 372/fi dove fi è la frequenza di clock. Utilizzando il diffusissimo quarzo 3,579545MHz è possibile ottenere un tempo di bit pari a circa 1/9600s, cioè la trasmissione di 9600 bit ogni secondo. È comunque possibile utilizzare delle frequenze di clock diverse, con una conseguente diminuzione o aumento della velocità di trasmissione: il limite inferiore della frequenza di clock è pari ad 1MHz, mentre il limite superiore è pari a 5MHz. Cosa succede se il ricevitore si accorge di un errore di parità, cioè conta un numero di bit ad 1 dispari? Durante il tempo di guardia, esso può mettere a livello basso la linea di I/O per comunicare al trasmettitore, che durante il tempo di guardia legge lo stato della linea, che c’è stato un errore di trasmissione sull’ultimo byte trasmesso. In questo caso, il trasmettitore dovrà ritrasmettere lo stesso byte. Il controllo d’errore sul bit di parità è obbligatorio per le smartcard, mentre il lettore può anche ignorare tale bit. C’è da dire, comunque, che il canale di comunicazione tra smartcard e dispositivo d’interfacciamento è sufficientemente stabile e disturbi o errori di trasmissione sono veramente rari. Reset Come è stato già detto nel precedente articolo a proposito delle smartcard a memoria, anche per le smartcard a microprocessore, esiste una condizione di reset e una risposta al reset. La condizione di reset deve essere sempre generata dal dispositivo di interfacciamento prima di iniziare qualsiasi comunicazione con la carta. Esistono smartcard che hanno un reset attivo a livello basso (active-low reset smartcard) ed altre che hanno un reset attivo alto (active-high reset smartcard). Dopo aver alimentato la smartcard e fornito un clock stabile, il lettore aspetta una risposta dalla carta mantenendo RST a livello basso. Se la carta non risponde entro un periodo di tempo (40000 cicli di clock), il segnale RST viene posto a livello alto ed il lettore rimane nuovamente in ascolto. Se anche in questo caso la smartcard non risponde, c’è sicuramente qualche problema di interfacciamento, oppure la carta non è valida ed il lettore può rifiutare la transazione. Answer To Reset Tutti i byte trasmessi dalla smartcard in risposta al reset formano l’ATR (Answer To Reset). Esso è formato da un byte di sincronismo TS seguito da non più di 32 byte, come si può osservare schematicamente nella figura 6. Il primo byte TS è detto byte di sincronismo ed è fondamentale per una corretta comunicazione tra lettore e smartcard. Il lettore attento si sarà accorto che in figura 5 non è specificata la relazione tra i bit del dato ed i bit effettivamente trasmessi. Questa relazione è indicata proprio nel primo Figura 6: Struttura dell’ATR di una smartcard a microprocessore standard MODUGNO-impaginato 28-06-2004 18:02 Pagina 45 TUTORIAL Figura 7: Le due convenzioni possibili del byte di sincronismo TS byte dell’ATR che può seguire due differenti convenzioni, come mostrato in figura 7. Nella convenzione diretta, il livello alto rappresenta un bit pari ad 1, il livello basso un bit pari a 0. Inoltre, il byte viene trasmesso a partire dal bit meno significativo (LSB). Per questo motivo, il byte TS in convenzione diretta ha il valore esadecimale pari a 3B (0011 1011). Nella convenzione inversa, invece, i livelli sono invertiti (il livello alto corrisponde al bit 0 ed il livello basso al bit 1) e la trasmissione del byte avviene a partire dal bit più significativo (MSB). In questo caso, il valore esadecimale di TS è 3F (0011 1111). La convenzione utilizzata nel byte TS viene seguita da tutti gli altri byte dell’ATR e delle successive trasmissioni. Il dispositivo di interfacciamento dovrà, quindi, riconoscere “al volo” la convenzione utilizzata dalla smartcard, guardando il byte di sincronismo dell’ATR ed interpretare di conseguenza tutti i byte successivi ricevuti dalla smartcard. Anche i byte trasmessi dal lettore dovranno seguire la stessa convenzione. Il byte di sincronismo è seguito dal byte obbligatorio T0, denominato byte di formato. Esso indica la composizione dei successivi byte dell’ATR. Il nibble (4 bit) meno significativo di T0 indica il numero K, compreso tra 0 e 15, dei byte storici T1, T2… TK. Ogni bit del nibble più significativo di T0 indica la presenza o meno dei byte di interfaccia TA1, TB1, TC1, TD1, trasmessi subito dopo T0: se un bit è 1, il byte relativo è presente. Per esempio, se T0=37 (0011 0111) ci saranno 7 (0111) byte storici ed i byte d’interfaccia TA1 e TB1, mentre saranno assenti i byte TC1 e TD1. Dopo questi byte possono essere presenti altri byte di interfaccia: TA2, TB2, TC2, TD2, TA3, TB3, TC3, TD3… ecc. Il nibble più significativo di TDi indica la presenza o meno del successivo quartetto di byte TAi+1, TBi+1, TCi+1, TDi+1, così come il nibble più significativo di T0 indicava la presenza o meno del quartetto di byte TA1, TB1, TC1 e TD1. Se TDi è assente, saranno assenti anche i successivi byte d’interfaccia. Non entriamo nei dettagli del significato dei vari byte di interfaccia anche perché, molto spesso, sono codificate delle informazioni importanti solo in fase di inizializzazione della smartcard oppure per utilizzare dei protocolli più evoluti e con velocità più elevate rispetto al semplice protocollo T=0. Importante è il byte TD1 che indica, oltre alla presenza dei byte TA2, TB2, TC2 e TD2 nel nibble più significativo, il protocollo utilizzato dalla smartcard nel nibble meno significativo. Tale numero, indicato comunemente con il simbolo T, può avere diversi valore. Nel caso T=0, il protocollo utilizzato dalla smartcard è proprio quello spiegato in questo articolo. È anche possibile che in una smartcard siano implementati diversi protocolli con diverse velocità, informazioni codificate sempre nei byte d’interfaccia dell’ATR. Il lettore potrà, quindi, scegliere, mediante opportuni comandi, di utilizzare uno qualsiasi di questi protocolli. Successivamente ai byte di interfaccia sono trasmessi i byte storici. Il nume- ro dei byte storici è variabile, ma è specificato nel byte T0, come visto precedentemente. Il significato dei byte storici non è indicato nello standard cha lascia completa libertà al costruttore della carta sulla codifica di questi byte. Per esempio, potrebbero essere usati per codificare un numero di versione del firmware della smartcard oppure un numero di serie o altre informazioni ancora. L’ultimo byte TCK è utilizzato come controllo di integrità dell’intero ATR. Viene calcolato in modo tale che il risultato dell’operazione booleana XOR di tutti i byte dell’ATR, compreso il TCK, sia zero. Esso è sempre trasmesso, tranne nel protocollo T=0. Per fare chiarezza sul formato, consideriamo un esempio di ATR ottenuto da una SIM di un operatore telefonico olandese. Esso è 3B 85 00 87 25 01 39 00. Il byte di sincronismo TS=3B indica l’utilizzo della convenzione diretta. Il byte di formato T0=85 (1000 0101) indica la presenza del byte di interfaccia TD1 (nibble più significativo 1000) e 5 byte storici (nibble meno significativo 0101). Il byte di interfaccia TD1=00 indica l’utilizzo del protocollo T=0 (nibble meno significativo 0000) e l’assenza degli ulteriori byte di interfaccia TA2, TB2, TC2 e TD2 (nibble più significativo 0000). Seguono i byte storici T1=87 T2=25 T3=01 T4=39 T5=00 che non hanno alcun significato a livello di protocollo, ma sono usati dal gestore della scheda per scopi specifici. Poiché il protocollo utilizzato è T=0, è TUTORIAL 45 MODUGNO-impaginato 28-06-2004 18:02 Pagina 46 TUTORIAL assente il byte di controllo TCK. Comandi Dopo aver ottenuto un ATR corretto dalla smartcard, il dispositivo di interfacciamento può procedere con l’invio dei comandi (lettura, scrittura, ecc). Il protocollo T=0 prevede l’utilizzo di messaggi tra lettore e smartcard. Come si è già avuto modo di dire, solo il lettore può iniziare una comunicazione con la smartcard mediante la trasmissione di una intestazione di 5 byte (CLA INS P1 P2 LEN). Il primo byte CLA rappresenta la classe del comando, il byte INS il tipo di istruzione. Normalmente il byte di classe rappresenta l’applicazione presente nella smartcard e il byte INS il tipo di comando. Nelle smartcard monoapplicazione, come la maggior parte delle carte in circolazione, il byte CLA ha sempre un determinato valore (per esempio, nel caso delle SIM del sistema GSM, CLA=A0). I byte P1 e P2 rappresentano dei parametri che dipendono dal comando (per esempio, indirizzi di memoria o dati da scrivere). Il byte LEN rappresenta la lunghezza dei dati da trasferire. La direzione del trasferimento (da smartcard a lettore o viceversa) è implicita nel tipo di comando e ciò comporta che sia il lettore che la smartcard conoscano tutte le possibili istruzioni e le direzioni di trasferimento associate. Se LEN è uguale a zero, il numero di byte scambiati è nullo nel caso la direzione del trasferimento sia dal lettore alla smartcard; il numero di byte trasferiti dalla smartcard al lettore è invece 256 se LEN=0. Dopo l’invio dell’intestazione di 5 byte da parte del dispositivo di interfaccia, la smartcard risponde con un procedure byte. Per mezzo di questo byte, il dispositivo controlla la tensione di programmazione Vpp della EPROM integrata nella carta. In molte smartcard odierne la tensione di programmazione non è usata a livello utente e il procedure byte è ridondante. Molto spesso la smartcard risponde con un procedure byte uguale al byte INS dell’intestazione del comando. Successivamente avviene il trasferimento dei dati dalla smartcard oppure dal dispositivo di lettura. Alla fine del trasferimento, la smartcard risponde con una parola di stato (status word), formata dai due byte SW1 e SW2, che indica l’esito positivo o negativo dell’elaborazione fornendo, in alcuni casi, dettagli sull’eventuale problema. Nel caso di risultato positivo, i due byte valgono rispettivamente, in esadecimale, 90 (1001 0000) 00 (0000 0000). In figura 8 è schematizzato l’invio di un comando completo nel caso di trasferimento dati dal dispositivo di lettura alla smartcard e viceversa. Lo standard ISO7816 (parti 1, 2 e 3) specifica solo come incapsulare i dati da trasferire nei comandi appena descritti, ma non dice nulla sul significato di questi dati. È compito del pro- grammatore di smartcard dare un significato ai dati trasferiti che possono indicare dei dati anagrafici dell’utilizzatore, numeri di serie, crediti, ecc. Ancor di più è compito del programmatore organizzare i dati nella smartcard e accedere con opportuni comandi. Sistemi che rispondono a questi standard non sono definitivamente interoperabili, poiché i dati che vengono scambiati dipendono dall’applicazione e da come è stata progettata. Per questo motivo è stato proposto un nuovo standard, ISO7816 parte 4, che definisce uno strato software comune di gestione dei file (informazioni) memorizzati nella smartcard. Rimando ad uno dei prossimi articoli, sulla gestione delle SIM GSM, per maggiori dettagli su questo tipo di gestione. STANCHI DI GIOCARE? Cosa ci aspetta nel prossimo articolo Dopo aver illustrato tutti i concetti più importanti sulle smartcard a memoria ed a microprocessore, nel prossimo articolo sarà presentato un progetto di un lettore universale di smartcard basato su PIC16F628. Mediante questo dispositivo è possibile, programmando opportunamente il PIC, gestire un qualsiasi tipo di smartcard, sia in modalità stand-alone che collegato ad un PC tramite seriale. Per maggiori dettagli, rimando ad uno dei prossim articoli sulla gestione di una SIM GSM. BIBLIOGRAFIA E LINK Figura 8: Invio di un comando ad una smartcard a microprocessore standard con trasferimento dati da lettore (a sinistra) e da smartcard (a destra) 46 TUTORIAL • Standard di riferimento (in inglese e a pagamento): www.iso.ch • Estratto dello standard ISO7816 parti 1, 2, 3 (in inglese): http://www.gsm-hacking.dk/papers/iso7816.txt • Estratto dello standard ISO7816 parte 4 (in inglese): http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4.aspx • Microchip (in inglese): www.microchip.com • ATMEL (in inglese): www.atmel.com MODUGNO-impaginato 20-07-2004 16:37 Pagina 48 TUTORIAL SMARTCARD quarta parte UNIREADER: PROGETTO DI UN LETTORE DI SMARTCARD di Giuseppe Modugno [email protected] In questo quarto articolo del nostro tutorial, verrà progettato un lettore universale di smartcard compatibile sia con le carte a memoria, come le SLE4442, sia con quelle a microprocessore, come le SIM dei cellulari GSM. Il cuore di UniReader è un microcontrollore PIC 16F628 che permette di utilizzare il lettore sia in connessione con un PC, sia in modalità standalone. RIPRENDIAMO LA NOSTRA PARTITA A CARTE Cosa ci siamo detti negli articoli precedenti Prima di poter affrontare la progettazione e la realizzazione di un lettore di smartcard, è necessario conoscere in dettaglio questi oggetti in tutti i loro aspetti. Per questo motivo, potete trovare, nei precedenti articoli, una trattazione teorica sulle smartcard che indaga sulle varie tipologie e ne discute i campi di utilizzo attuali e futuri. Inoltre, potete trovare un articolo sulle smartcard a memoria ed uno sulle smartcard a microprocessore, i due tipi in cui si classificano 48 TUTORIAL tutte le smartcard, entrambi compatibili con UniReader. Non mi limiterò semplicemente a mostrare uno schema elettrico e il suo sbroglio con le solite istruzioni per il montaggio, ma cercherò di descrivere in dettaglio tutte le fasi di progettazione giustificando le varie scelte. Per comprendere al meglio il contenuto di questo articolo, consiglio al lettore di leggere anche i precedenti articoli del tutorial. Cos’è un lettore di smartcard Prima di lanciarci nella progettazione, è necessario riflettere sull’oggetto che dobbiamo realizzare e che abbiamo chiamato lettore universale di smartcard. L’attributo universale sta ad indicare che esso deve essere compatibile sia con le smartcard a memoria, sia con le smartcard a microprocessore: qualunque sia la carta in nostro possesso, il lettore dovrà essere in grado di gestirla correttamente. Il termine lettore, invece, è sicuramente da commentare in modo più approfondito. Se domandiamo ad un profano quali compiti deve eseguire un lettore di smartcard, sicuramente ci risponderà che deve essere in grado di leggere i dati memorizzati nella carta e presentarli all’utente in varia forma (per MODUGNO-impaginato 20-07-2004 16:37 Pagina 49 TUTORIAL esempio, su carta, su display, ecc) oppure trasmetterli ad un altro dispositivo elettronico (per esempio, ad un computer). Chi ci ha seguito con attenzione sin dalla prima parte del tutorial, può subito capire come questa immagine sia alquanto riduttiva. Infatti, un lettore di smartcard non si limita a leggere ma effettua sulla carta una serie di altre operazioni più o meno complesse che possono andare dalla lettura dei dati presenti sulla carta all’autenticazione dell’utente, dalla modifica dei dati (scrittura) all’esecuzione di algoritmi di cifratura complessi. Per quello che abbiamo detto, il termine “lettore di smartcard” appare decisamente restrittivo. Sarebbe meglio parlare a tal proposito di dispositivo di interfacciamento con la smartcard o, dall’inglese, interface device (IFD) ma, pur nell’imprecisione, nel seguito di questo articolo faremo riferimento al termine lettore di smartcard poiché più comunemente usato. A prima vista può sembrare che un dispositivo di questo tipo, che può compiere diverse operazioni, anche complesse, con una qualsiasi smartcard, sia di difficile realizzazione, soprattutto per un hobbista. In realtà, come vedremo nel corso dell’articolo, tutte queste operazioni si riducono, al livello più basso, alla trasmissione e ricezione di comandi, formati da una successione più o meno lunga di byte verso e dalla smartcard. Il particolare comando determina l’operazione, anche complessa, che l’utente, tramite il lettore, vuole far eseguire alla smartcard. Da queste considerazioni ci si può convincere di come un lettore sia semplicemente un dispositivo di interfaccia che converte le “volontà” dell’utente o del sistema in opportuni comandi da trasmettere o dati da ricevere dalla smartcard, mediante un opportuno protocollo. PROGETTAZIONE Ovviamente, tralasciamo la parte che dovrebbe precedere qualsiasi progetto e che corrisponde alla documentazione e allo studio, poiché coincide con i nostri precedenti articoli. Partiamo, quindi, da una panoramica generale del nostro dispositivo, cioè da un’analisi attenta del suo schema a blocchi. Schema a blocchi Come abbiamo già detto, il nostro lettore di smartcard è un dispositivo di interfacciamento che si preoccupa di convertire le “volontà” dell’utente o del sistema in comandi da trasmettere e ricevere dalla smartcard. Questo ruolo di “intermediazione” è facilmente comprensibile guardando lo schema in figura 1. Da una parte c’è l’utente dell’applicazione che può essere rappresentato dalla persona al Bancomat oppure dal telefonino GSM. In quest’ottica, il termine UTENTE utilizzato in Figura 1 è un concetto molto più allargato rispetto alla persona fisica. Dall’altra parte è presente la smartcard, dove sono memorizzati i dati necessari per l’esecuzione dell’operazione (per esempio, numero di conto corrente o crediti) oppure dove è possibile effettuare operazioni di cifratura per l’autenticazione al sistema (per esempio, alla rete GSM del nostro provider). Al centro è presente il LETTORE di smartcard che si preoccupa di convertire il flusso di operazioni provenienti dall’UTENTE in comandi da trasmettere alla SMARTCARD e viceversa. L’UTENTE può comunicare con il lettore in entrambe le direzioni e in diversi modi, a seconda dell’applicazione. Il lettore può gestire il flusso in input (UTENTE ‡ LETTORE) mediante una tastiera, una connessione seriale RS232 o USB, ecc. Allo stesso modo, in output (LETTORE > UTENTE) il lettore può gestire dei led, un display LCD, una connessione RS232 o USB, dei relé, ecc. Se, per esempio, l’ap- Figura 1: Il lettore come dispositivo d’interfacciamento TUTORIAL 49 MODUGNO-impaginato 20-07-2004 16:37 Pagina 50 TUTORIAL plicazione prevede l’apertura di un cancello all’inserimento di una smartcard valida, utilizzeremo un relé pilotato dal lettore che azionerà l’apricancello ad autenticazione correttamente avvenuta. Per quanto riguarda il lato SMARTCARD, l’implementazione è facilitata dal fatto che sia le smartcard a memoria che le smartcard a microprocessore standard hanno lo stesso formato e la stessa disposizione dei contatti: questo ci permette di utilizzare un unico connettore ISO7816 da interfacciare al lettore. Dal lato UTENTE, invece, facciamo la scelta di implementare nel nostro prototipo soltanto una connessione seriale RS232 con un eventuale PC. In questo modo, mediante un semplice software per computer, sarà possibile gestire la comunicazione con il lettore in entrambe le direzioni e, quindi, con la smartcard. Per mostrare come sia possibile far funzionare il lettore in modalità stand-alone, è previsto un led che può significare l’abilitazione all’utilizzazione della risorsa nel caso di accesso consentito al titolare della smartcard. La scelta del microcontrollore Precisiamo subito che la presenza di un microcontrollore in un lettore di smartcard non è necessaria. Esistono dei semplici lettori, chiamati generalmente dumb (stupidi), in cui i contatti della smartcard sono collegati ai pin di una seriale RS232 mediante una semplice traslazione di livello (ricordiamo che la smart- 50 TUTORIAL card è compatibile con logica a 5V, mentre la seriale RS232 prevede segnali di circa –10V e +10V). Ciò è possibile poiché, come ricorderà chi ha letto l’articolo sulle smartcard a microprocessore, il protocollo T=0 è molto simile al protocollo RS232 con 8 bit di dati, 1 bit di parità, 2 bit di stop alla velocità di 9600 bit/s. Tutta la logica di funzionamento viene quindi completamente spostata nel software del computer. Anche le smartcard a memoria possono essere gestite direttamente dalla RS232 di un PC senza un microcontrollore, utilizzando alcuni pin della seriale (DTR, RTS, ecc) per pilotare direttamente i segnali CLK, RST e I/O. La domanda è d’obbligo: perché abbiamo utilizzato un microcontrollore nell’UniReader? Per alcuni motivi che andiamo subito a commentare. • La presenza di un microcontrollore ci permette di utilizzare il lettore anche in modalità stand-alone, senza alcuna connessione con un PC. Il software di gestione non sarà in esecuzione nel PC, ma nel microcontrollore. • Il protocollo T=0, seppur molto simile al protocollo utilizzato nella RS232, si discosta in alcuni punti da questo. Per esempio, nel protocollo T=0, utilizzato dalle smartcard a microprocessore, è previsto un controllo di parità “al volo” che è impossibile implementare utilizzando la sola RS232 (per maggiori dettagli si veda l’articolo precedente sulle smartcard a microprocessore). • La presenza di un microcontrollore ci permette di riutilizzare l’hardware anche per altri tipi di smartcard e/o protocolli di comunicazione anche molto diversi dal protocollo RS232. In questo caso, basta cambiare opportunamente il firmware del microcontrollore per gestire tali particolari situazioni. • Mediante il microcontrollore è possibile gestire della circuiteria elettronica aggiuntiva che potrebbe essere impossibile pilotare tramite la sola connessione seriale (si pensi, per esempio, all’eccitazione di un relè in funzione della carta inserita nel lettore oppure ad un display LCD). Dopo aver giustificato l’utilizzo di un microcontrollore, passiamo alla sua scelta. Come abbiamo detto, si utilizzerà il PIC 16F628 della Microchip che ci è sembrato una buona soluzione per tanti motivi. Innanzitutto, è un chip molto diffuso nei negozi di elettronica ad un prezzo sicuramente accessibile alla maggior parte degli hobbisti. Inoltre, per la memorizzazione del firmware, è dotato di una memoria Flash da 2048 istruzioni che permette la riprogrammazione in caso di errori o di aggiornamenti del programma. È dotato di un oscillatore interno a 4MHz, a differenza del suo “fratello più piccolo” 16F84, che semplifica ulteriormente la complessità del circuito. Internamente ha una porta USART che permette l’interconnessione con una RS232 di un PC in modo molto semplice sia a MODUGNO-impaginato 20-07-2004 16:37 Pagina 51 TUTORIAL livello hardware, ma soprattutto a livello di programmazione (il 16F84 non è dotato di porta USART). Inutile puntare su microcontrollori più evoluti, poiché ciò non giustificherebbe l’aumento del prezzo e della complessità in relazione ai nostri scopi. È ovvio che, a seconda delle necessità, sarà possibile riprogettare il lettore utilizzando un qualsiasi altro microcontrollore. Scegliendo, invece, il più piccolo 16F84, avremmo dovuto rinunciare a metà della memoria Flash, con la conseguenza di non poter creare programmi molto complessi; alla porta USART, con la maggiore complessità di programmazione relativa alla gestione della connessione RS232 e quindi ad un maggior aumento del codice, già penalizzato da una memoria ridotta; all’oscillatore interno a 4MHz, con la conseguenza di complicare il circuito. Pensiamo che il minor costo del 16F84 non giustifichi tutti questi svantaggi, anche perché la differenza di prezzo è, in molti casi, irrisoria o addirittura assente. Schema elettrico In figura 2 è mostrato lo schema elettrico del nostro lettore di smartcard basato su PIC 16F628. L’alimentazione dell’intero circuito viene fornita mediante il connettore J1 a due contatti, a cui è possibile applicare una tensione continua di almeno 8V. Per esempio, è possibile collegare direttamente una batteria da 9V, magari sostituendo il connettore J1 con il classico connettore per tali batterie, oppure è possibile utilizzare un qualsiasi alimentatore da muro che abbia una Figura 2: Schema elettrico TUTORIAL 51 MODUGNO-impaginato 20-07-2004 16:37 Pagina 52 TUTORIAL uscita continua di almeno 8V (generalmente 9V o 12V). Non è necessario che tale tensione sia regolata, poiché essa viene stabilizzata mediante un regolatore lineare 7805 (IC1) che genera il livello di 5V utilizzato per l’alimentazione della smartcard, del microcontrollore e degli altri integrati. Il diodo D1 ha il solo scopo di evitare problemi nel caso si colleghi il polo positivo e negativo dell’alimentazione nel verso opposto. Il led verde DL1 è collegato direttamente alla tensione di 5V, quindi si accende ogni volta che viene alimentato il circuito e può essere usato come test di presenza alimentazione. L’interruttore S1 è utile per staccare l’alimentazione dal circuito. Il cuore del nostro lettore di smartcard è il microcontrollore PIC 16F628 (IC3). Esso verrà programmato in modo da utilizzare l’oscillatore interno a 4MHz, quindi i pin RA7/OSC1 e RA6/OSC2 sono usati come pin di input/output generici. Il pin MCLR non viene usato, quindi la funzionalità di reset dovrà essere disabilitata durante la programmazione, azzerando il flag relativo. I pin RX e TX sono rispettivamente i pin di ricezione e trasmissione della porta USART che ci permette di gestire in modo semplice la programmazione del protocollo seriale. Lo standard RS232 prevede livelli positivi di circa +10V e livelli negativi di –10V, mentre la USART del microcontrollore gestisce segnali TTL 0-5V. Per questo motivo è necessario utilizzare un circuito traslatore di livello che converta 52 TUTORIAL i livelli TTL in RS232 e, viceversa, i livelli RS232 in livelli TTL. Il chip maggiormente usato per questo scopo è il MAX232 (IC2) prodotto dalla Maxim o uno dei suoi numerosissimi equivalenti di altri produttori, molto spesso compatibili anche con il pinout. Esso realizza questa conversione di livello mediante la tecnica definita “pompa di carica” che si serve di quattro condensatori esterni (C7, C8, C9, C10) per raddoppiare la tensione da 5V a 10V e creare la tensione negativa –10V. Il connettore RS232 utilizzato è il tipico D-SUB 9 pin femmina, in cui è usato il pin 2 per la trasmissione ed il pin 3 per la ricezione. Il connettore maschio a 9 poli generalmente utilizzato nei PC come porta seriale, utilizza, invece, il pin 3 per la trasmissione ed il pin 2 per la ricezione. Questo ci permette di collegare direttamente il lettore di smartcard alla porta seriale del computer mediante un cavo “pin to pin” maschio-femmina dove, cioè, il pin 1 del connettore maschio è collegato al pin 1 del connettore femmina, il pin 2 del maschio è collegato al pin 2 della femmina, ecc. In realtà, la nostra seriale utilizza soltanto tre conduttori (RX, TX e GND), quindi basterebbe un semplice cavo dove siano collegati i pin 2, 3 e 5. Gli altri eventuali conduttori non sono usati e potrebbero essere assenti nel cablaggio senza inficiare la corretta comunicazione. Il connettore per smartcard (J3) utilizzato, prodotto dalla AMP, oltre agli 8 contatti ISO7816, presenta due contatti aggiuntivi (SW1 e SW2) che sono normal- mente chiusi e si aprono quando viene inserita una carta. Tramite la linea SC_DETECT ed il pull-up R3, il microcontrollore può sapere se nel lettore è stata inserita una smartcard o meno. Esistono in commercio connettori ISO7816 senza questi due contatti oppure con contatti normalmente aperti: in questi casi basta modificare leggermente il firmware del microcontrollore per ignorare la linea SC_DETECT oppure per invertirne la logica di funzionamento. I pin RST, VPP e I/O sono direttamente collegati al microcontrollore ai pin RA2, RA1 e RA4 rispettivamente. I pin RST e VPP sono normalmente degli ingressi per la smartcard, quindi delle uscite per il microcontrollore. In questo prototipo la linea VPP è stata collegata ad un pin del microcontrollore, anche se difficilmente verrà gestita, in quanto generalmente non utilizzata o, nel caso in cui venga usata, spesso rappresenta una tensione maggiore di 5V che il microcontrollore non può fornire. Queste situazioni non possono essere gestite da UniReader, poiché molto diverse da caso a caso. Il pin I/O, invece, è una linea bidirezionale, quindi dovrà essere usata sia come input che come output dal microcontrollore: il pin RA4 ha questa caratteristica. In alcuni casi, come nelle smartcard a memoria SLE4442, il pin di I/O è un open-drain ed è quindi necessario utilizzare un pull-up (R4) per generare entrambi i livelli 0 e 1. Il pin CLK della smartcard può essere pilotato direttamente dal microcontrollore (smartcard a memoria) MODUGNO-impaginato 20-07-2004 16:37 Pagina 53 TUTORIAL oppure direttamente da un oscillatore (smartcard a microprocessore). Per questo motivo, le porte NAND IC4B, IC4C e IC4D sono collegate in modo da formare un semplice multiplexer a due linee di segnale e due linee di controllo. Mediante questo multiplexer è possibile scegliere il segnale di clock da fornire alla smartcard tra quello proveniente dall’oscillatore (IC4A+Q1) a 3.579MHz e quello proveniente direttamente dal microcontrollore (SC_SCLK) e precisamente dal pin RA0. Questa selezione viene effettuata dalle linee RA6 e RA7: se RA6=1 e RA7=0, l’uscita della porta NAND IC4D è sempre pari ad 1, mentre l’uscita della porta IC4B è il negato del segnale di clock proveniente dall’oscillatore IC4A+Q1. Quindi, all’uscita della porta IC4C, cioé all’ingresso del pin CLK della smartcard, ci sarà un clock a 3.579MHz, utilizzato dalle smartcard a microprocessore. Viceversa, nel caso RA6=0 e RA7=1, il segnale all’uscita della porta IC4C, quindi all’ingresso del pin CLK della smartcard, sarà uguale al segnale SC_SCLK proveniente direttamente dal microcontrollore ed utilizzato nelle smartcard a memoria. L’oscillatore basato sul quarzo Q1 e il multiplexer sono realizzati mediante quattro porte NAND, tutte presenti nell’inte- grato 74HC00 (IC4). Il led rosso DL2 è pilotato direttamente dal 16F628 e può essere usato per scopi generici che possono variare a seconda dell’applicazione. Nel prossimo articolo, rappresenterà un utilizzatore, per esempio, un apricancello comandato dal lettore di smartcard in funzione della carta inserita. REALIZZAZIONE In figura 3 è mostrato il lato rame del nostro prototipo, in scala 1:1, sbrogliato su singola faccia. Esso può essere usato per la realizzazione del dispositivo mediante fotoincisione o tecnica analoga. La dimensione del cir- PIC® Microcontroller By Example Un CD-ROM che non può mancare alla tua collezione! Finalmente è disponibile il CD-ROM con il corso completo PIC® Microcontroller By Example in formato ACROBAT (PDF). Tutte le lezioni pronte per la consultazione con i sorgenti dei progetti immediatamente utilizzabili nelle tue applicazioni. Il modo migliore per avere sempre sottomano la soluzione per il tuo progetto con i PICmicro®. Il CD-ROM PIC® Microcontroller By Example contiene una sezione “Contenuti Speciali” tutta da scoprire. Ordinalo subito su www.farelettronica.com/pbe oppure telefonando allo 02.66504794 Inware Edizioni Via Cadorna, 27/31 - 20032 Cormano (MI) TUTORIAL 53 MODUGNO-impaginato 20-07-2004 16:37 Pagina 54 TUTORIAL cuito è di 10x8 cm, mezza eurocard (10x16 cm). Dopo aver realizzato il circuito stampato, procedete con la foratura dei vari pin di tutti i componenti. I fori più grandi sono necessari per alloggiare il connettore della seriale (J2) e della Figura 3: Lato rame in scala 1:1 Figura 4: Schema di montaggio 54 TUTORIAL smartcard (J3). Se volete, potete anche fare quattro fori ai quattro angoli per eventuale fissaggio ad un contenitore o per montare dei distanziatori. Tenete presente, però, che questi fori non sono presenti in Figura 3. Aiutandovi con lo schema di montaggio in figura 4 e con l’elenco componenti, procedete con la saldatura di tutti i componenti. Per comodità, potete iniziare con la saldatura dei componenti a basso profilo, come i tre ponticelli, le resistenze e i diodi. Proseguite con gli zoccoli per gli integrati IC2, IC3 ed IC4, con i condensatori, stando ben attenti alle polarità di quelli elettrolitici, con i led e i connettori. Il regolatore di tensione 7805 (IC1) può essere montato tranquillamente “in piedi” senza alcuna aletta di raffreddamento, poiché assorbe una potenza minima e non scalda in modo pericoloso. È importante migliorare lo smaltimento di calore di questo integrato se utilizzate tensioni d’ingresso molto grandi oppure se modificate il circuito in modo che assorba correnti elevate. In figura 5 potete vedere una foto del prototipo dell’UniReader con una scheda Agip bianca inserita nello slot ISO7816,, il cavo di collegamento per il PC ed il cavo di alimentazione. SVILUPPO DEL FIRMWARE L’utilizzo di un dispositivo programmabile come il microcontrollore PIC16F628, prevede la scrittura di un firmware per tale componente. Nel caso dell’UniReader, è necessario sviluppare un firmware che gestisca la eventuale connessione seriale RS232, il multiplexer per la scelta del segnale di clock da inviare alla smartcard, il protocollo di comunicazione con la carta eventualmente inse- MODUGNO-impaginato 20-07-2004 16:37 Pagina 55 TUTORIAL rita. Il nostro prototipo prevede anche la gestione di un led che può rappresentare, in un’applicazione pratica, un relé o qualche altro circuito di controllo. Il microcontrollore PIC16F628 può essere programmato diret- tamente in assembler, poiché ha un set di istruzioni compatto e semplice da capire e imparare. Tuttavia, per il prototipo dell’UniReader, ho scelto di utilizzare il linguaggio C poiché più intuitivo, leggibile e portabile. È Elenco componenti Sigla Valore R1, R2 330 Ω 1/4 W R3, R4 10 KΩ 1/4 W R5 1 MΩ 1/4 W C1, C4, C5, C11÷C13 100 nF ceramico C2, C3 10 µF elettrolitico C6÷C10 1µF elettrolitico C14, C15 22 pF ceramico D1 1N4004 (o equivalente) DL1 Led verde 5 mm DL2 Led rosso 5 mm IC1 7805 IC2 MAX232 + zoccolo 16 pin IC3 PIC 16F628 + zoccolo 18 pin IC4 74HC00 + zoccolo 14 pin J1 Morsettiera a due vie J2 Connettore D-SUB9 femmina 90° per cs J3 Connettore ISO7816 Q1 Quarzo 3.579 MHz S1 Deviatore Figura 5: Foto del prototipo di UniReader noto che un programma scritto con un linguaggio ad alto livello, appunto come il C, occupa sicuramente più spazio rispetto allo stesso programma scritto direttamente in assembler. Nel nostro caso, i compiti del microcontrollore sono molto semplici e quindi la ridondanza aggiunta dal compilatore non genera mai un codice troppo grande rispetto alla memoria programma del 16F628. Se volete complicare il firmware, aggiungendo altre gestioni, probabilmente sarà necessario prendere in considerazione la possibilità di scrivere il programma direttamente in assembler per evitare eseguibili troppo grandi, oppure l’utilizzo di un dispositivo con una maggiore memoria. Come compilatore C ho scelto il CC5X (www.bknd.com) che ha una edizione FREE, in cui sono assenti alcune ottimizzazioni ed utilizzabile solo in applicazioni non commerciali, restrizioni che non creano alcun problema nella nostra situazione. Per maggiori informazioni su questo compilatore, leggete il riquadro apposito in questo stesso articolo. Il firmware utilizzato per il test di UniReader e quelli che verranno presentati negli articoli successivi possono essere tutti scaricati dal sito di Fare Elettronica. Essi sono presenti sia in formato sorgente (file con estensione .C), sia in formato eseguibile già compilati (file con estensione .HEX). Tutti coloro che non fossero interessati allo sviluppo del firmware possono utilizzare semplicemente i file eseguibili per programmare il microcon- TUTORIAL 55 MODUGNO-impaginato 20-07-2004 16:37 Pagina 56 TUTORIAL trollore ed utilizzarlo subito nel circuito. Se siete interessati a capire il funzionamento del firmware, oppure a modificarlo secondo le vostre necessità, potete consultare e modificare i file sorgenti relativi. COLLAUDO Prima di dare alimentazione al circuito, controllate eventuali cortocircuiti fra piste, soprattutto tra i due contatti dell’alimentazione del connettore J1. Controllate anche che non ci siano cortocircuiti tra l’uscita del 7805 (pin 3) e la massa. Per maggiore sicurezza, senza montare i tre integrati IC2, IC3, IC4 nei rispettivi zoccoli, collegate l’alimentazione e accendete il circuito mediante il deviatore S1 (se utilizzate uno “a levetta”, spostate la levetta verso l’interno del circuito per accendere). Il led verde DL1 dovrebbe subito accendersi, indicando una tensione di circa 5V all’uscita del 7805; misurate tale tensione con un voltmetro. Controllate che tale tensione sia presente all’integrato IC2 (pin 16), IC3 (pin 14), IC4 (pin 14) e al connettore ISO7816. Potete anche controllare che sia presente una tensione di circa –10V sul pin 7 del MAX232 (IC2) che rappresenta il segnale di trasmissione su RS232. TEST Se tutto è corretto, inserite il MAX232 e il 74HC00 nei rispettivi zoccoli, programmate il microcontrollore con il firmware UNIREADER_TEST.HEX ed inseritelo nello zoccolo. Collegate il lettore alla porta RS232 del PC mediante un cavo “pin to pin” maschio-femmina 56 TUTORIAL ed eseguite su PC il software Hyperterminal, normalmente in Start > Programmi > Accessori > Comunicazioni > Hyperterminal > Hypertrm.exe (se non doveste averlo, potete installarlo in un secondo momento dal CD di Windows). Nel seguito faremo riferimento a questo programma, ma tenete presente che potete utilizzare un qualsiasi altro software di emulazione terminale. Dopo aver eseguito Hyperterminal, scegliete un nome qualsiasi da dare alla connessione, per esempio “Test”. Cliccate su OK e scegliete, dal campo “Connetti”, la porta seriale che avete utilizzato per il collegamento con UniReader (per esempio, “direttamente a COM2” se state utilizzando la seconda porta seriale). Cliccate su OK ed impostate i parametri della connessione, come in figura 6. Si tratta di un protocollo seriale alla velocità di 19200bps, 8 bit di dati, nessuna parità, 1 bit di stop senza controllo di flusso (naturalmente il firmware è stato scritto per utilizzare la porta USART con queste impostazioni). Cliccate su File > Proprietà > Impostazioni > Impostazioni ASCII ed abilitate la casella di controllo “Aggiungi avanzamento riga ad ogni ritorno a capo ricevuto”. Confermate la modifica. A questo punto potete inserire una smartcard a memoria SLE4442 nel lettore ed accenderlo. Se tutto è corretto, dovreste visualizzare nella finestra di Hyperterminal un messaggio del tipo mostrato in figura 7. Alla pressione del tasto ‘R’, inviato al lettore mediante RS232, UniReader genera un evento di reset e legge la risposta della carta al reset (ATR) che viene trasmesso sempre su RS232. STANCHI DI GIOCARE? Il circuito che ho proposto è solo un prototipo di lettore che potete utilizzare per divertirvi con le smartcard. Le modifiche che si possono fare sono numerosissime. Per esempio, potete modificare il circuito in modo da utilizzare un PIC 16F84. In questo caso dovete gestire il pin MCLR come reset e aggiungere un oscillatore per il clock. Potete anche utilizzare il segnale a 3.579MHz già presente nel circuito come clock del microcontrollore. È possibile aggiungere un relé, con relativo circuito di pilotaggio, al posto del led rosso di test, o insieme ad esso. Potete sostituire la connessione RS232 con un collegamento USB oppure utilizzare una tastiera ed un display per l’interfaccia con l’utente. Eseguito con successo il collaudo del lettore di smartcard, potete divertirvi a scrivere una bozza di programma per la gestione di una smartcard SLE4442: lettura e scrittura delle diverse zone di memoria e confronto del PSC. Chi ha letto l’articolo su queste smartcard dovrebbe essere in grado di sviluppare un firmware di questo tipo senza grossi problemi. Se non avete a disposizione una SLE4442 vergine, potete utilizzare una tessera telefonica digitale oppure la MODUGNO-impaginato 20-07-2004 16:37 Pagina 57 TUTORIAL tessera punti dell’AGIP o di qualche altro distributore di benzina. Se non ci riuscite, dovete solo aspettare il prossimo articolo… Cosa ci aspetta nel prossimo articolo Nei prossimi due articoli utilizzeremo l’UniReader rispettivamente in applicazioni con smartcard a memoria e smartcard a micro- Figura 6: Impostazioni della connessione seriale in Hyperterminal processore. In entrambi i casi, sarà necessario sviluppare un firmware ad-hoc che gestisca la relativa tipologia di smartcard. Infine, faremo degli esempi concreti di utilizzo di smartcard a memoria (raccolta punti di un negozio e utilizzo docce a pagamento in un campeggio) e smartcard a microprocessore (gestione della rubrica e degli SMS di una SIM GSM). BIBLIOGRAFIA E LINK Compilatore C per PIC CC5X (in inglese): www.bknd.com Maxim (in inglese): www.maxim-ic.com Amp (in inglese): www.amp.com Microchip (in inglese): www.microchip.com Figura 7: Messaggio trasmesso dal lettore all’accensione IL COMPILATORE Il compilatore CC5X è distribuito dalla B Knudsen Data (http://www.bknd.com/) e supporta molti microcontrollori PIC della Microchip, in particolare quelli con un core a 12 e 14 bit, tra cui il PIC 16F628 utilizzato nell’UniReader. È possibile scaricare liberamente una versione gratuita del compilatore, alla pagina http://www.bknd.com/cc5x/download.shtml, dove è presente anche un manuale in PDF. Per studenti o progetti non commerciali, la versione FREE del compilatore gestisce al massimo 1024 istruzioni per modulo ed è privo della completa ottimizzazione. Potete scaricare sia una versione a 16 bit per DOS, sia una versione a 32 bit per Windows. Consiglio di scaricare quest’ultima versione (CC5XFREE.ZIP) che potrà essere utilizzata anche in una finestra DOS di Windows. Una caratteristica molto interessante di questo compilatore è la possibilità di integrarlo completamente nel sistema di sviluppo MPLAB della Microchip, con la possibilità di scrivere il programma, compilarlo e farne il debug senza utilizzare le finestre DOS. Comunque, per brevità, nel seguito verrà illustrato il procedimento di compilazione a riga di comando. Il pacchetto scaricato (CC5XFREE.ZIP), relativo alla versione 3.2, contiene, tra l’altro, l’eseguibile principale del compilatore (CC5X.EXE) e il file include 16F628.H (oltre a quelli relativi agli altri PIC supportati) per poter compilare un sorgente per il microcontrollore PIC 16F628. Potete decomprimere il file scaricato CC5XFREE.ZIP, per esempio nella cartella C:\CC5X ed aggiungere questo percorso al PATH mediante il comando DOS SET PATH=%PATH%;C:\CC5X. TUTORIAL 57 MODUGNO-impaginato 20-07-2004 16:37 Pagina 58 TUTORIAL Consiglio di creare un’apposita cartella dove conservare tutti i file relativi al firmware, come C:\UNIREADER nel caso del programma per il nostro lettore. Inoltre, copiate il file 16F628.H dalla cartella C:\CC5X in C:\UNIREADER. Per scrivere il sorgente in C si può utilizzare un qualsiasi editor di testi, come il Blocco Note di Windows. È bene iniziare con la direttiva #pragma chip PIC16F628 per indicare al compilatore il microcontrollore per cui deve generare il file eseguibile. Per esempio, potete scrivere il seguente programma che fa lampeggiare il led rosso dell’UniReader. #pragma chip PIC16F628 /* Bit di configurazione. */ #define CP_OFF |= 0x3C00 /* Code Protection Program Memory OFF. */ #define CPD_OFF |= 0x0300 /* Data Code Protection OFF. */ #define LVP_OFF &= 0x3F7F /* Low Voltage Programming OFF. */ #define BOD_ON |= 0x0040 /* Brown Out Detect Disabled. */ #define MCLR_OFF &= 0x3FDF /* MCLR disabled (internally tied to Vcc). */ #define PWRT_ON &= 0x3FF7 /* Power Up Timer enabled. */ #define WDT_OFF &= 0x3FFB /* Watchdog Timer disabled. */ #define FOSC_INTRCIO |= 0x0010, &= 0x3FFC /* Int RC without CLKOUT. */ #pragma config CP_OFF, CPD_OFF, LVP_OFF, BOD_ON, MCLR_OFF, PWRT_ON, WDT_OFF, FOSC_INTRCIO bit LED @ PORTB.3; void main( void { /* Metti PORTB = TRISB &= /* LED collegato al PIC. */ ) in output il pin del LED spegnendolo. */ 0xFF; 0xF7; while(1) { unsigned char i1, i2; /* Pausa */ for( i1=1; i1<100; i1++ ) for( i2=1; i2<0xFF; i2++ ) ; /* Cambia lo stato del LED */ if (LED) LED = 0; else LED = 1; } } Salvate il file come C:\UNIREADER\UNIREADER.C e compilatelo in una finestra DOS mediante il comando CC5X UNIREADER.C eseguito, naturalmente, all’interno della cartella C:\UNIREADER. Se la compilazione è andata a buon fine, potete osservare un messaggio simile a quello in Figura 8. Tra le altre cose, il compilatore fornisce informazioni sull’utilizzo della RAM, sull’esito dell’ottimizzazione, sul numero di istruzioni generate, ecc. Il file eseguibile ottenuto si chiama UNIREADER.HEX e potrà essere utilizzato per pro- 58 TUTORIAL MODUGNO-impaginato 20-07-2004 16:37 Pagina 59 TUTORIAL grammare fisicamente il microcontrollore. Figura 8: Risultato della compilazione in una finestra DOS All’interno di questo file è inserita anche la parola di configurazione per il PIC, molto importante durante la fase di programmazione del dispositivo. Se il software che utilizzate per questo scopo non gestisce la parola di configurazione memorizzata nel file .HEX, dovete specificarla manualmente, disabilitando qualsiasi protezione (sul codice e sui dati), la programmazione a bassa tensione, l’MCLR, il watchdog. Abilitate soltanto il Brown-Out-Detect e il Power-UpTimer. Inoltre, selezionate come sorgente di clock l’oscillatore interno a 4 MHz senza utilizzare il pin CLKOUT come uscita di questo clock. In Figura 9 è presente la schermata di programmazione, con i bit di configurazione, del diffusissimo software IcProg. Figura 9: Schermata del software IcProg che mette in evidenza i bit di configurazione utilizzati per la programmazione del PIC 16F628 TUTORIAL 59 MODUGNO-impaginato 15-09-2004 11:03 Pagina 54 TUTORIAL SMARTCARD quinta parte APPLICAZIONI CON LE SMARTCARD A MEMORIA di Giuseppe Modugno [email protected] In questo articolo, riprendiamo tra le mani le smartcard a memoria, in particolare le SLE4442, utilizzandole in due diverse applicazioni: carte di fidelizzazione, con relativa gestione dei crediti e dei dati dei clienti e utilizzazione automatica di risorse in base ai diritti dell’utente memorizzati nella carta. In entrambi i casi, utilizzeremo UniReader, presentato nel precedente articolo di questo tutorial, come lettore di smartcard: nel primo caso in modalità slave, nel secondo caso in modalità stand-alone. Infine, proporremo alcune varianti per migliorare le prestazioni del nostro sistema. RIPRENDIAMO LA NOSTRA PARTITA A CARTE Cosa ci siamo detti negli articoli precedenti In questo e nel successivo articolo, metteremo a frutto tutte le conoscenze acquisite nei primi tre articoli del tutorial, in cui abbiamo parlato dettagliatamente delle smartcard da un punto di vista teorico, delle smartcard a memoria (in particolare le SLE4442) e delle smartcard a microprocessore. Tutti i concetti presentati precedentemente saranno ripresi e, finalmente, concretizzati. Oltre alle discussioni teoriche, nell’articolo precedente abbiamo avuto l’occasione 54 TUTORIAL di realizzare l’UniReader, un lettore di smartcard universale, compatibile sia con le smartcard a memoria, sia con le smartcard a microprocessore. Naturalmente, ci serviremo di questo hardware nelle applicazioni che mostreremo nel presente e nel successivo articolo. Breve panoramica sulle SLE4442 Nel seguito, svilupperemo due applicazioni per smartcard SLE4442, dettagliatamente analizzate nella seconda parte di questo tutorial. Sono applicazioni molto comuni per tali smartcard e cioè la gestione di un siste- ma di fidelizzazione della clientela, per esempio di un negozio o di una catena di supermercati, e lo sfruttamento automatico delle risorse (docce in un campeggio) in base ai diritti degli utenti memorizzati nella smartcard. Prima di iniziare, però, facciamo una breve panoramica su questo tipo di smartcard. La sigla SLE4442 indica un integrato per smartcard a memoria sviluppato inizialmente da Siemens. La sua diffusione sul mercato è stata così elevata da portare anche altri produttori di silicio, come Infineon e Philips, a produrre integrati del tutto equivalenti. Tali smartcard pos- MODUGNO-impaginato 15-09-2004 11:03 Pagina 55 TUTORIAL sono essere trovate molto facilmente a prezzi relativamente bassi: per grossi quantitativi, si può arrivare a spendere meno di 1€ per carta, ma normalmente si possono trovare a 3€ per pochi quantitativi. Le smartcard SLE4442 contengono tre zone di memoria: Main Memory, Protection Memory e Security Memory. La Main Memory è una EEPROM di 256 byte, riservata ai dati specifici dell’applicazione (numero di serie, numero e dati del cliente, crediti, ecc). I primi 32 byte possono essere protetti singolarmente e permanentemente da scritture successive: la mappa dei dati protetti si trova nella Protection Memory, una memoria di 32 bit. Il meccanismo di protezione è irreversibile. Una smartcard SLE4442 vergine può avere già alcuni byte protetti da scrittura (tra cui l’ATR, che occupa i primi quattro byte della Main Memory), per cui non è detto che si abbiano a disposizione 256 byte per la propria applicazione (comunque non saranno meno di 256-32=224 byte). Il contenuto della Main Memory e della Protection Memory è protetto solo in scrittura, mentre può essere letto liberamente in qualsiasi momento, utilizzando un comune lettore. La protezione da scrittura avviene tramite la Security Memory, un’altra zona di memoria di 4 byte che contiene il PSC (3 byte), simile ad un PIN ed un Error Counter (1 byte). Per poter scrivere nelle tre zone di memoria, è necessario inserire il corretto PSC. Si hanno a disposizione tre tentativi consecutivi, memorizzati nell’Error Counter. Dopo tre tentativi consecutivi di inserimento errato del PSC, la smartcard diventa una ROM a tutti gli effetti, cioè non sarà più possibile scrivere in alcuna zona di memoria. Rimando il lettore alla seconda parte del tutorial per maggiori dettagli sul funzionamento di queste carte. SVILUPPO DI UN FIRMWARE GENERICO PER UNIREADER Prima di creare le nostre applicazioni in base alle nostre esigenze (o assecondando la nostra fantasia), vediamo come utilizzare UniReader per gestire, tramite PC, una SLE4442 a basso livello. Per fare questo, ho scritto un firmware generico che aspetta indefinitamente dei comandi dalla seriale, eseguendoli di volta in volta. I comandi hanno una corrispondenza “uno a uno” con i sette comandi della smartcard SLE4442: READ MAIN MEMORY, READ PROTECTION MEMORY, READ SECURITY MEMORY, WRITE MAIN MEMORY, WRITE PROTECTION MEMORY, WRITE SECURITY MEMORY, COMPARE VERIFICATION DATA. Per rendere l’utilizzo ancora più semplice, anche per coloro che non digeriscono bene la programmazione su PC, ho pensato di utilizzare delle stringhe di caratteri ASCII per i comandi da trasmettere e per le risposte provenienti da UniReader. In questo modo, è possibile utilizzare un qualsiasi software di emulazione terminale per gestire la comunicazione con la smartcard, senza dover scrivere o installare software aggiuntivi. Come molti sapranno, un software di emula- zione terminale è già presente nel sistema operativo Windows e si chiama Hyperterminal: se non doveste averlo (normalmente si trova in Start > Programmi > Accessori > Comunicazioni) potete installarlo successivamente dal CD di Windows. Nel seguito faremo riferimento ad Hyperterminal, ma tenete presente che potete utilizzare un qualsiasi altro software di emulazione terminale. Il protocollo seriale utilizzato è del tipo 19200bps, 8 bit di dati, 1 bit di stop, nessun bit di parità e nessun controllo di flusso (consultate l’articolo precedente per i dettagli sulla configurazione di Hyperterminal per il corretto funzionamento con UniReader). All’accensione di UniReader, il firmware inizializza la porta USART e il multiplexer per gestire correttamente le carte sincrone (il clock da fornire alla smartcard proviene direttamente dal microcontrollore), trasmette su seriale un messaggio iniziale ed un prompt (“>“) ed aspetta indefinitamente un comando dalla seriale. Ogni carattere inviato dal PC all’UniReader viene ritrasmesso dall’UniReader verso il PC (echo): in questo modo è possibile visualizzare quello che viene scritto sulla tastiera senza abilitare impostazioni particolari dell’emulatore terminale. Ogni comando termina con il carattere di ritorno carrello che è possibile trasmettere premendo il tasto Invio sulla tastiera. A questo punto, non vi rimane altro che scaricare dal sito di Fare Elettronica il firmware UniReader_SLE4442 e program- TUTORIAL 55 MODUGNO-impaginato 15-09-2004 11:03 Pagina 56 TUTORIAL mare il microcontrollore PIC16F628 (come al solito, oltre all’eseguibile troverete il sorgente in C che potrete studiare e modificare a vostro piacimento). Interfaccia testuale Collegate l’UniReader al PC, inserite una SLE4442 nel lettore, eseguite e configurate Hyperterminal su PC e alimentate l’UniReader. Il lettore si presenta con un numero di versione (vedi figura 1) ed aspetta un comando tra quelli elencati in tabella 1. Inserite normalmente i comandi mediante tastiera direttamente nella finestra di Hyperterminal, rispettando le maiuscole e le minuscole. I parametri possono indicare un indirizzo di memoria (aa) oppure dei dati (dd), entrambi specificati in esadecimale con lettere maiuscole; se il numero esadecimale è ad una cifra, è necessario farlo precedere dallo zero in modo che il parametro occupi sempre due caratteri. Ogni comando va terminato con il tasto Invio (“↵“). Purtroppo il firmware gestisce il prompt e i comandi ricevuti in maniera molto semplice, quindi non è possibile utilizzare i tasti per l’editazione (cancellazione dei carat- Comando Comando SLE4442 Parametri R - - rm READ MAIN MEMORY aa rs READ SECURITY MEMORY - rp READ PROTECTION MEMORY - wm WRITE MAIN MEMORY aadd wp WRITE PROTECTION MEMORY aadd ws WRITE SECURITY MEMORY aadd c COMPARE VERIFICATION DATA aadd Tabella 1: Elenco dei comandi disponibili per la gestione di una SLE444 Figura 1: Schermata di Hyperterminal all’accensione di UniReader 56 TUTORIAL teri, frecce, ecc.), per cui digitate attentamente i vari comandi sulla tastiera. Se sbagliate, potete premere la combinazione di tasti CTRL+Z per annullare il comando ed iniziarne uno nuovo. Il comando “R” è l’unico che non abbia un corrispettivo fra quelli della SLE4442: ad esso corrisponde una condizione di reset e la risposta della carta a tale evento (ATR) viene letta da UniReader e trasmessa tramite seriale. Prima di utilizzare una qualsiasi smartcard, è necessario sempre generare una condizione di reset e verificare che l’ATR corrisponda a quello delle SLE4442 (A2 13 10 91). Il comando “rm” (READ MAIN MEMORY) accetta un parametro che identifica un indirizzo (0255). Tale comando legge il contenuto della Main Memory a partire dall’indirizzo specificato fino alla fine della memoria (indirizzo 255). Per leggere l’intero contenuto della Main Memory è possibile usare il comando “rm00↵“. Il comando “rp” (READ PROTECTION MEMORY), senza parametri, legge il contenuto della Protection Memory (32 bit), visualizzandolo sotto forma di bit a partire dal meno significativo, associato all’indirizzo 00 della Main Memory. Allo stesso modo, il comando “rs” (READ SECURITY MEMORY), senza alcun parametro, legge l’intero contenuto della Security Memory (4 byte) e cioè, in sequenza, l’Error Counter (1 byte) e il PSC (3 byte). In figura 2 è mostrata la schermata di Hyperterminal dopo l’esecuzione del comando di Reset (“R↵“) e dei comandi di lettura MODUGNO-impaginato 15-09-2004 11:03 Pagina 57 TUTORIAL Figura 2: Schermata di Hyperterminal dopo il comando di Reset ed i comandi di lettura. (“rm00↵“, “rp↵“, “rs↵“) su una SLE4442 vergine. Come si può notare, l’ATR della carta è A2 13 10 91, tipico di queste smartcard. Il contenuto della Protection Memory indica che, anche per una carta vergine, alcuni byte (precisamente 12) sono già protetti in scrittura, tra cui i primi quattro byte che contengono l’ATR. La Security Memory indica che ci sono ancora 3 tentativi (07) per l’inserimento del PSC e che quest’ultimo viene letto come 00 00 00 poiché non è ancora stato inserito correttamente. Infine, il contenuto della Main Memory ci mostra come tutti i byte, dopo i primi 32, valgono FF che è il valore che si ottiene dopo la cancellazione di una locazione di memoria. I comandi di scrittura “wm” (WRITE MAIN MEMORY), “wp” (WRITE PROTECTION MEMORY) e “ws” (WRITE SECURITY MEMORY) necessitano di due parametri, un indirizzo ed un dato. Nel caso dei comandi “wm” e “ws”, l’indirizzo indica il byte da modificare ed il dato rappresenta il nuovo valore da scri- Figura 3: Sequenza dei comandi per l’inserimento del PSC in una carta SLE4442 vergine. vere. Invece, il comando “wp” protegge un byte della Main Memory da ulteriori scritture: l’indirizzo rappresenta il byte da proteggere (0÷31) e il dato l’attuale contenuto di questo byte. Se il dato specificato è diverso dal contenuto effettivo di quel byte, il comando viene interrotto e quel byte non viene protetto. Naturalmente, affinché questi comandi abbiano successo, è necessario aver inserito precedentemente il corretto PSC. Il comando “c” (COMPARE VERIFICATION DATA) permette di inserire il PSC per abilitare i comandi di scrittura. Il PSC è formato da tre byte memorizzati nella Security Memory a partire dall’indirizzo 1. Sono necessari, quindi, tre comandi “c” in cui il parametro dell’indirizzo vale successivamente 01, 02 e 03 ed il dato rappresenta il byte del PSC da verificare. Per esempio, supponendo che il PSC sia 5A873F (in esadecimale), saranno necessari i comandi “c015A↵“, “c0287↵“ e “c033F↵“ per inserire correttamente il PSC. È necessario ricordarsi di azzerare almeno un bit dell’Error Counter (byte di indirizzo 00 della Security Memory) prima dei tre comandi “c” (per maggiori informazioni si veda la seconda parte di questo tutorial). In figura 3 è mostrata la sequenza dei comandi necessari per inserire correttamente il PSC in una carta vergine (in questo caso il PSC vale FF FF FF). Si controlla il numero dei tentativi a disposizione (“rs↵“), si scrive un bit dell’Error Counter (“ws0003↵“), si trasmettono i tre comandi di inserimento del PSC (“c01FF↵“, “c02FF↵“ e “c03FF↵“), si scrivono nuovamente tutti i bit dell’Error Counter (“ws0007↵“), infine si controlla che l’ultimo comando abbia avuto esito positivo, cioè l’Error Counter valga 07 (“rs↵“). Se è stato inserito un PSC errato (o la sequenza dei comandi è diversa), l’Error Counter sarebbe rimasto al valore 03, con l’ovvia conseguenza di aver diminuito il numero dei tentativi rimasti. Dopo tre tentativi errati, la carta non può essere più modificata. Come si può osservare, il primo comando di lettura della Security Memory non ci permette di leg- TUTORIAL 57 MODUGNO-impaginato 15-09-2004 11:03 Pagina 58 TUTORIAL gere il valore corretto del PSC poiché non è ancora stato inserito: in questo caso viene letto come 00 00 00, anche se il suo valore è un altro. L’ultimo comando di lettura della Security Memory, invece, ci permette di leggere chiaramente anche il PSC, poiché è stato appena inserito correttamente. Interfaccia grafica Per evitare di utilizzare l’emulatore di terminale e il meccanismo dei comandi ASCII, ho preparato un programma in Visual Basic che gestisce le carte SLE4442 mediante una interfaccia grafica più intuitiva e semplice da usare, rimanendo sempre a “basso livello”. Potete scaricare sia il sorgente in Visual Basic (SLE4442_src.zip), sia il file di installazione del programma (SLE4442_setup.zip). In figura 4 è mostrata la finestra del programma attraverso la quale potete scegliere la porta seriale a cui è collegato l’UniReader, resettare la carta visualizzando l’ATR e trasmettere i sette comandi mediante gli appositi tasti. Dopo aver cliccato sul tasto “Reset” e successivamente sui tutti i tasti “Leggi”, ho ottenuto il risultato mostrato sempre in figura 4 su una smartcard vergine. Naturalmente i risultati sono gli stessi ottenuti mediante l’emulatore di terminale (mostrati in figura 2), ma organizzati graficamente in modo più intuitivo. Per rendere un po’ più semplice l’inserimento del PSC, cliccando sul tasto “PSC” sarà sufficiente inserire l’intero codice di 3 byte (sempre in esadecimale) ed automaticamente il software invierà i 58 TUTORIAL Figura 4: Schermata del programma SLE4442 dopo la lettura di tutte le zone di memoria di una smartcard vergine. tre comandi COMPARE VERIFICATION DATA. Come al solito, dovete ricordarvi di cancellare almeno un bit dell’Error Counter prima di inviare i comandi di verifica PSC. Il programma SLE4442 non è stato realizzato con lo scopo di essere utilizzato in un’applicazione finale, poiché gestisce le smartcard a basso livello, mediante i singoli comandi previsti dal chip. Nel seguito, a seconda dell’applicazione, sarà realizzato un programma ad hoc molto più semplice da gestire anche per coloro che non sanno quasi nulla delle carte SLE4442. CARTA FEDELTÁ Una tipica applicazione in cui vengono usate le memory card è sicuramente la “carta fedeltà” dei clienti, per esempio di un supermercato. Una smartcard a memoria è facile “da portare dietro” nel portafogli e permette di conservare dei dati, tra cui, per esempio, il numero dei punti che il cliente ha accumulato (eventualmente, per il ritiro di un premio o per uno sconto). In questo caso, è necessario che solo il personale autorizzato del supermercato possa modificare il numero dei punti memorizzati nella carta, mentre l’operazione deve essere impossibile al cliente per evitare che possa aumentarsi il credito impropriamente. Le smartcard SLE4442 rispondono a questo requisito in quanto sono protette in scrittura mediante il meccanismo del PSC. E’ sufficiente che solo il personale del supermercato (in realtà, il software in suo possesso) conosca il corretto codice senza divulgarlo. Nella peggiore delle ipotesi, il cliente che abbia letto il nostro tutorial e abbia realizzato il nostro UniReader, potrà solo leggere il contenuto della carta, quindi il proprio credito, ma non potrà modificarlo. Se cercherà di inserire un PSC casuale, dopo tre tentativi la carta sarà automaticamente bloccata. MODUGNO-impaginato 15-09-2004 11:03 Pagina 59 TUTORIAL Per questa applicazione, supponiamo che il personale che gestisce i punti della carta fedeltà abbia a disposizione un PC ed il nostro lettore UniReader. Sarà necessario realizzare un apposito firmware per il lettore ed un software per PC. Il firmware Come firmware dell’UniReader per questa applicazione, possiamo tranquillamente utilizzare quello generico per carte SLE4442 descritto precedentemente (UniReader_SLE4442.hex). Come si è potuto vedere, questo firmware aspetta un qualsiasi comando SLE4442 dalla seriale e lo esegue immediatamente. In questa applicazione, sarà il software su PC che avrà il compito di inviare gli opportuni comandi al lettore per eseguire le varie operazioni ad alto livello: aumento del credito, cancellazione del credito, creazione nuova carta fedeltà, ecc. Il software Il software Gestione Carte, scritto in Visual Basic, può essere scaricato dal sito di Fare Elettronica sia in formato sorgente (GestioneCarte_src.zip) sia in formato eseguibile (GestioneCarte_setup.zip). La schermata principale del programma è mostrata in figura 5. Utilizzando le linguette Gestione, Nuova Carta, Impostazioni è possibile accedere a tre differenti schermate nelle quali si può, rispettivamente, modificare il contenuto delle carte (punti e dati del cliente), inizializzare una smartcard SLE4442, modificare le impostazioni del software. Nella schermata Impostazioni, visualizzata in figura 6, è possibile scegliere la porta seriale alla quale è collegato il lettore, il PSC scelto per le carte del nostro circuito, il PSC di default delle smartcard SLE4442 vergini. Ricordo che il PSC deve essere tenuto segreto, soprattutto non divulgato ai nostri clienti che potrebbero modificare a loro piacimento i punti memorizzati sulla carta. Le impostazio- ni vengono salvate nel file di configurazione “config.dat” e caricate automaticamente all’avvio del programma. La schermata relativa alla linguetta Nuova Carta (figura 7) permette di inizializzare una smartcard SLE4442 vergine per la nostra applicazione. Nella Main Memory della carta vengono memorizzati un numero associato al cliente (da 0 a 9999), il suo Cognome (massimo 20 caratteri) ed il suo Nome (massimo 20 caratteri). Cliccando sul tasto Crea, il software inserisce il PSC di default, cambia il suo valore in quello utilizzato nella nostra applicazione (scelto nella schermata delle impostazioni) e memorizza i tre dati Numero Cliente, Cognome e Nome. Il Numero Cliente è memorizzato come stringa di 4 caratteri ASCII a partire dall’indirizzo 20; il Cognome è memorizzato come stringa di 20 caratteri a partire dall’indirizzo 24 (se il cognome occupa meno spazio, vengono aggiunti dei caratteri TUTORIAL 59 MODUGNO-impaginato 15-09-2004 11:03 Pagina 60 TUTORIAL Figura 5: Schermata principale del software Carta Fedeltà. nulli); il Nome è memorizzato come stringa di 20 caratteri a partire dall’indirizzo 38 (stessa cosa del Cognome se il dato occupa meno di 20 caratteri). Tutti gli indirizzi sono indicati in esadecimale. Nella Main Memory viene anche memorizzato un numero di Punti nullo come stringa di 4 caratteri ASCII, a partire dall’indirizzo 4C. Come per il numero cliente, anche il numero dei punti deve essere compreso tra 0 e 9999. Per maggiore sicurezza, all’indirizzo FF della Main Memory viene memorizzata una checksum in modo tale che la somma binaria (XOR) di tutti i byte (dall’indirizzo 00 all’indirizzo FF) sia nulla. L’ultima schermata (figura 5), chiamata Gestione, è quella che viene normalmente usata dal personale del supermercato. Mediante questa schermata è possibile modificare i punti memorizzati in una smartcard precedentemente inizializzata. È sufficiente inserire la smartcard in UniReader e cliccare sul tasto Aggiorna per rileggere il contenuto della carta: se la carta inserita è valida, cioè se la checksum 60 TUTORIAL Figura 6: Schermata delle Impostazioni del software “Carta Fedeltà”. risulta corretta, vengono letti i quattro dati (Numero Cliente, Cognome, Nome, Punti) e visualizzati. E’ possibile modificare i punti memorizzati utilizzando i tasti + per incrementare, - per decrementare, > per reimpostare e Azzera per azzerare. E’ anche possibile modificare i dati del cliente (numero, cognome e nome) cliccando sul tasto Modifica. In figura 8 è mostrato il contenuto della Main Memory di una SLE4442 utilizzata nella nostra applicazione. Si può notare come i byte dall’indirizzo 20 all’indirizzo 4F sono occupati dai dati del nostro cliente e la checksum è memorizzata all’indirizzo FF e vale A6. I più bravi potranno leggere il contenuto di questa Main Memory e capire chi è il cliente del supermercato a cui appartiene questa carta e quanti punti egli ha. Alcuni miglioramenti Faccio notare che tutti i dati relativi ad un cliente sono memorizzati esclusivamente nella sua smartcard, quindi è possibile rea- lizzare ed utilizzare contemporaneamente più UniReader su diversi computer, in ognuno dei quali è in esecuzione il software “Gestione Carte”. Il software può essere utilizzato così com’è in applicazioni reali, ma consiglio a tutti di testarlo per le proprie esigenze. In altre parole, non posso dare garanzie che esso sia privo di bachi. Per questo motivo, fornisco anche il sorgente in Visual Basic che potete modificare a piacimento. Il sistema che ho descritto è molto semplice ed ha avuto l’obiettivo di mostrare la flessibilità del lettore UniReader e la semplicità di utilizzo delle smartcard SLE4442, ma non vuole essere assolutamente una soluzione finale. Numerosi sono i miglioramenti che è possibile fare. Per esempio, potete creare un database di clienti sul vostro computer ogni volta che create una nuova carta. È possibile memorizzare altri dati relativi al cliente oltre al Cognome e Nome (indirizzo, data creazione, ultimo acquisto, ecc). Infine, potete creare un mecca- MODUGNO-impaginato 15-09-2004 11:03 Pagina 61 TUTORIAL nismo per rendere segreto il PSC utilizzato nella vostra applicazione anche al personale che userà il software. Infatti, l’operatore può cliccare sulla linguetta “Impostazioni” e leggere il PSC utilizzato, oppure leggerlo direttamente nel file config.dat. Per evitare ciò, è possibile memorizzare il PSC in forma criptata nel file config.dat e obbligare l’operatore ad inserire il PSC utilizzato prima di passare nella schermata Impostazioni. CAMPEGGIO Nella precedente applicazione abbiamo usato il nostro lettore di smartcard UniReader come slave di un PC, tramite il collegamento seriale. La flessibilità di UniReader ci permette di utilizzarlo anche in modalità stand-alone, uno dei vantaggi derivanti dall’avere un microcontrollore a bordo che può gestire le situazioni più diverse. In questo esempio, supponiamo di dover installare un sistema di docce in un campeggio. Ogni cliente ha un certo numero di crediti che corrisponde al numero di docce che può effettuare, per esempio in funzione dei giorni di permanenza. Se il cliente ha bisogno di più utilizzazioni, può pagare un certo quantitativo per farsi aumentare i crediti in qualsiasi momento. Come per la situazione precedente, anche in questo caso le smartcard SLE4442 rispondono ai requisiti di facile trasportabilità, memorizzazione non volatile di una manciata di byte, robustezza, ecc. Ad ogni nuovo cliente possiamo fornire una smartcard in cui memorizziamo un certo numero di crediti iniziale, per esempio uno al giorno. Il cliente potrà usare la carta per abilitare l’erogazione dell’acqua calda per un certo periodo, decrementando automaticamente il credito di una unità. Per fare questo è ovviamente necessario realizzare una versione leggermente diversa del UniReader presentato nel precedente articolo, in quanto sarà necessario fissare il circuito a muro, completamente chiuso, a parte la fessura per l’inserimento della carta. Naturalmente dovrebbero essere prese delle precauzioni per evitare che l’acqua o l’umidità, sicuramente presenti in questi luoghi, possano creare problemi (cortocircuiti o altro). Infine, il nostro Figura 7: Schermata “Nuova Carta” relativa al software “Gestione Carte” prototipo di UniReader non prevede alcun utilizzatore vero e proprio, ma semplicemente un led pilotato direttamente dal microcontrollore. In questo esempio, il led acceso rappresenterà l’erogazione dell’acqua abilitata, il led spento rappresenterà l’erogazione disabilitata. Nel caso reale, probabilmente sarà necessario pilotare un relè anziché un led e, magari, aggiungere un display per eventuali messaggi, come il numero di crediti rimasti sulla scheda. Tutto sommato, la filosofia dell’UniReader rimane la stessa. Ricapitolando, avremo un lettore per ogni risorsa (doccia) inscatolato e fissato a muro, programmato con un firmware ben preciso (descritto nel successivo paragrafo). Inoltre, ci sarà un posto centrale, per esempio in direzione, in cui è presente un PC collegato alla nostra versione originale dell’UniReader. L’operatore, utilizzando lo stesso software sviluppato per la precedente applicazione (Gestione Carte) potrà modificare i dati memorizzati nella carta, tra cui il numero dei crediti (precedentemente chiamati punti) in funzione della somma pagata, dei gior- Figura 8: Contenuto della Main Memory di una “Carta Fedeltà” TUTORIAL 61 MODUGNO-impaginato 15-09-2004 11:03 Pagina 62 TUTORIAL ni di permanenza o altro. Ci rimane da sviluppare, quindi, soltanto il firmware per i lettori che comandano direttamente le docce. Il firmware Per abilitare l’erogazione dell’acqua, il cliente dovrà semplicemente inserire la sua carta nel lettore associato. Il microcontrollore a bordo dell’UnIReader si accorge automaticamente dell’inserimento di una carta tramite la linea SC_DETECT (vedere lo schema elettrico sul numero precedente) e controlla la validità dei dati memorizzati (praticamente l’ATR e la checksum). Successivamente controlla il numero dei crediti e, se è maggiore di zero, inserisce il PSC scelto per il nostro sistema, decrementa di una unità il credito e abilita l’erogazione (accende il led, nel nostro prototipo) per un certo periodo di tempo. Potete scaricare l’archivio compresso UniReader_campeggio.zip dal sito di Fare Elettronica, in cui è presente il file eseguibile (UniReader_campeggio.hex) per la programmazione del dispositivo e il sorgente del firmware (UniReader_campeggio.c) che potete modificare a vostro piacimento. Provate ad inizializzare una nuova carta con il software “Gestione Carte” su PC ed il firmware UniReader_SLE4442.hex per l’UniReader, aggiungendo almeno un credito. Quindi programmate l’UniReader con il firmware UniReader_campeggio.hex ed inserite la carta. Se tutto è andato bene, il led pilotato dal microcontrollore si accenderà per qualche secondo a testimonianza dell’abilitazione dell’erogazione. Nel frattempo, il credito sarà decrementato di una unità. L’erogazione, cioè l’accensione del led, sarà abilitata per un numero di volte pari al credito memorizzato inizialmente nella carta. Naturalmente la versione standalone dell’UniReader deve conoscere il PSC utilizzato per poter decrementare il numero dei crediti ad ogni utilizzazione. Per questo, il firmware UniReader_campeggio memorizza tale PSC, in modo non volatile, all’interno della EEPROM del PIC16F628. All’accensione, il microcontrollore legge il PSC dalla EEPROM ed è Figura 9: Inserimento di un nuovo PSC nell’applicazione campeggio 62 TUTORIAL già operativo (ciò è molto comodo in caso di black-out). Per cambiare il PSC, o memorizzarlo per la prima volta, è sufficiente collegare il lettore ad un PC mediante RS232, eseguire Hyperterminal con la solita configurazione e premere ESC. L’UniReader ascolta continuamente la seriale e, in presenza del tasto ESC, passa nella modalità di “Inserimento PSC”. Sempre mediante Hyperterminal, potete inserire i 6 caratteri esadecimali che formano il nuovo codice che volete utilizzare. L’UniReader legge questo nuovo codice e lo memorizza nella EEPROM. Se tutto è avvenuto senza errori, UniReader vi risponderà con “OK” (vedi figura 9). Alcuni miglioramenti Il sistema di gestione delle docce può essere migliorato sotto molti aspetti. Per esempio, la carta che forniamo al cliente può essere utilizzata anche per altri scopi. Può essere utilizzata per l’ingresso autorizzato in certe aree del campeggio (piscina, ecc) oppure per memorizzare i punti fatti in tornei interni. E’ possibile memorizzare la data di fine permanen- Figura 10: Contenuto di una Carta Fedeltà “criptata” con gli stessi dati della fig. 8 MODUGNO-impaginato 15-09-2004 11:03 Pagina 63 TUTORIAL za nella struttura e controllare che sia posteriore alla data attuale (per evitare che carte non esaurite possano passare da un cliente che parte ad un cliente che arriva). Molto interessante sarebbe poter configurare, da un unico punto (per esempio dalla direzione), tutti gli UniReader abilitati, per esempio per modificare il PSC utilizzato. Poiché il nostro lettore ha una interfaccia seriale, è possibile creare una rete RS485 a due fili unidirezionale di tipo puntomultipunto. Dalla direzione, mediante un opportuno hardware (convertitore RS232-RS485), è possibile trasmettere il comando di impostazione PSC ai vari nodi della rete che verranno configurati contemporaneamente senza la necessità di doverli configurare uno dopo l’altro mediante un portatile, con un enorme vantaggio in termini di tempo. Naturalmente, si possono comprare delle smartcard SLE4442 vergini prestampate con il simbolo del campeggio: il sistema viene recepito dal cliente in modo più professionale e l’immagine della struttura ne trae giovamento. VARIANTI SUL TEMA Come si è potuto vedere, il lettore di smartcard UniReader, che abbiamo proposto nel precedente articolo, si presta molto bene a funzionare in modalità slave (connesso ad un PC) e standalone (autonomamente). In questo articolo abbiamo preso in considerazione le smartcard a memoria SLE4442 in cui è possibile proteggere i dati in scrittura mediante il codice segreto PSC. In situazioni più delicate, però, questo grado di sicurezza potrebbe non essere accettabile e bisognerebbe utilizzare sistemi di autenticazione più complessi e robusti, sicuramente più costosi. In quest’ultima parte dell’articolo, prendo in considerazione alcuni aspetti “deboli” delle SLE4442, mostrando come si possa, con un po’ di fantasia, migliorarli. Proteggere i dati anche in lettura Come si è detto più volte in questo tutorial, le smartcard SLE4442 sono protette soltanto in scrittura ma non in lettura. In altre parole, il cliente del nostro supermercato (o del nostro campeggio) potrebbe inserire la carta che gli abbiamo dato (o che ha trovato o derubato) in un suo lettore di smartcard e potrebbe leggere, senza difficoltà alcuna, il contenuto della Main Memory. Con un po’ di fortuna ed intuito, potrebbe capire dove e in quale formato sono memorizzati i dati, quindi risalire al numero del cliente, al cognome, al nome ed ai punti del proprietario della carta. In molte situazioni questo non crea grossi problemi, soprattutto se i campi Cognome, Nome e Numero Cliente non sono utilizzati. In altre situazioni, però, la lettura non protetta dei dati potrebbe essere un problema. Prima di valutare e passare a soluzioni più complesse e costoste (per esempio, altri tipi di smartcard) possiamo rendere la lettura non autorizzata dei dati, se non impossibile, almeno più difficile. In questo caso, ci viene in aiuto la crittografia, la tecnica che ci permette di trasformare una stringa di byte chiaramente leggibile (e interpretabile), in una stringa di byte difficilmente comprensibile. In figura 8 è mostrato il contenuto della memoria di una smartcard utilizzata in una nostra applicazione ed ho già sfidato il lettore a risalire ai dati memorizzati. Chiunque abbia una tabella ASCII a portata di mano potrebbe risalire al cliente, al suo codice ed ai suoi punti, in quanto i dati sono stati memorizzati “in chiaro”, cioè in modo facilmente comprensibile. Per rendere la lettura più difficile, possiamo pensare di codificare i dati mediante un algoritmo crittografico, scelto dall’ampia letteratura o inventato da noi stessi. In questo caso, se l’algoritmo deve essere eseguito direttamente dal microcontrollore del lettore, sarà necessario evitare operazioni troppo complesse, a patto di non passare a microcontrollori più evoluti e performanti. Nel caso sia possibile far eseguire l’algoritmo di cifratura direttamente su un computer, ci si può sbizzarrire molto di più, cercando sistemi molto complessi e difficili da decifrare. Per esempio, gli stessi dati memorizzati nella carta di figura 8, sono stati codificati (anche se molto debolmente) e memorizzati in una carta il cui contenuto è mostrato in figura 10. Come potete osservare, ora non è più facile risalire ai dati in chiaro e le operazioni di lettura sono più complicate (anche se non impossibili). Complicando il software/firmware siamo riusciti a rendere le SLE4442 protette TUTORIAL 63 MODUGNO-impaginato 15-09-2004 12:48 Pagina 64 TUTORIAL anche in scrittura, senza aumentare i costi del sistema. Cambiare il PSC ad ogni uso Il PSC è l’unico codice che ci permette di proteggere la carta da operazioni non autorizzate di scrittura. Come si è detto, è un codice a 3 byte, quindi è possibile scegliere una combinazione tra 224=16.777.216. Se immaginiamo di provare ogni secondo una combinazione diversa, potremmo impiegare anche 200 giorni circa di lavoro ininterrotto per trovare il PSC corretto. In realtà, l’operazione è resa molto più complicata dal fatto che, su una singola scheda, è possibile inserire un PSC errato non più di 3 volte, dopo le quali la carta si blocca definitivamente. Tenendo presente ciò, all’intrusore potrebbero servire anche più di 5.000.000 di smartcard per trovare il PSC corretto (oltre ad un aumento del tempo necessario dovuto al cambio della carta nel lettore). Il meccanismo del PSC sembra essere molto sicuro ma, in alcuni casi, potrebbe risultare una protezione debole. Infatti, quando un lettore di SLE4442 invia i comandi per l’inserimento del PSC trasmette quest’ultimo in chiaro. Se la postazione non è presidiata e l’intrusore ha la possibilità di sondare le linee I/O e CLK, potrebbe risalire ai comandi di comparazione PSC (COMPARE VERIFICATION DATA) e, con un po’ di pazienza, al codice corretto. Per rinforzare queste debolezze intrinseche delle carte SLE4442, è possibile memorizzare, direttamente nella Main Memory, il 64 TUTORIAL PSC. In questo modo il lettore, per conoscere il PSC della carta, dovrà prima leggerlo direttamente dalla Main Memory. Il vantaggio è che, con questo meccanismo, è possibile modificare il PSC in modo casuale ad ogni utilizzo della scheda. Se l’intrusore legge il PSC, sondando le linee I/O e CLK, non potrà comunque utilizzarlo poiché è stato cambiato durante la sessione. Lo svantaggio di questo meccanismo è che il PSC è facilmente leggibile poiché memorizzato nella Main Memory, ma difficilmente l’intrusore sa che abbiamo utilizzato questo metodo o riesce a capire in quale posizione della memoria abbiamo memorizzato il codice (potrebbe tranquillamente confonderlo con i dati). Inoltre l’operazione è ancora più complicata se utilizziamo algoritmi crittografici per nascondere il PSC prima di memorizzarlo. Memorizzare solo un codice cliente Ultimo trucco che è possibile adottare per rendere ancora più sicuro il nostro sistema è quello di memorizzare nella carta soltanto un codice cliente. Tutto il resto (nome, cognome, crediti, punti, ecc.) viene conservato in un database centrale e non sulla carta. In questo modo, ogni volta che si vuole utilizzare la carta, verrà letto il codice cliente e verranno modificati i dati (per esempio, i punti) direttamente nel database, senza modificare il contenuto della carta. Il cliente furbo che riesce a trovare il PSC e a scrivere la carta, potrà al massimo modifi- care il codice cliente, ma non saprà mai quale scegliere per aumentare il proprio credito o i propri punti, poiché le informazioni sono memorizzate segretamente nel nostro database centrale. Questo metodo può essere attuato molto semplicemente quando è presente un solo lettore di smartcard collegato ad un PC. Il tutto si complica se nel nostro sistema il lettore funziona in modalità stand-alone oppure se ci sono diversi lettori di smartcard dislocati in diversi punti, poiché bisogna prevedere una connessione al server dove risiede il database clienti. STANCHI DI GIOCARE? Le applicazioni in cui possiamo utilizzare le SLE4442 sono veramente tante e limitate solo dalla fantasia del progettista. In questo articolo ho solo accennato a due possibili applicazioni dell’UniReader come lettore di carte SLE4442 in funzionamento stand-alone e slave di PC. Cosa ci aspetta nel prossimo articolo Nel prossimo articolo incontreremo finalmente le smartcard a microprocessore (smartcard asincrone) in applicazioni pratiche. La più semplice e diffusa smartcard a microprocessore è sicuramente la SIM dei cellulari GSM che tutti noi abbiamo. Nel prossimo articolo, verrà descritta la struttura dei dati memorizzati nelle SIM e verrà utilizzato l’UniReader per leggere/scrivere la rubrica e gli SMS memorizzati nella scheda. MODUGNO-impaginato 1-10-2004 17:11 Pagina 54 TUTORIAL SMARTCARD sesta parte LA SIM: UN ESEMPIO DI SMARTCARD A MICROPROCESSORE di Giuseppe Modugno [email protected] In questo articolo, prenderemo tra le mani un tipo molto diffuso di smartcard a microprocessore, le SIM comunemente usate all’interno dei telefonini GSM. Verrà descritto il funzionamento di tali smartcard all’interno del sistema di telefonia mobile GSM: funzionalità, organizzazione interna dei dati, comandi, ecc. RIPRENDIAMO LA NOSTRA PARTITA A CARTE Cosa ci siamo detti negli articoli precedenti Per chi non avesse avuto la possibilità di leggerci sin dall’inizio del nostro tutorial, facciamo una breve panoramica dei contenuti degli articoli precedenti. Nella prima parte, abbiamo introdotto il termine smartcard. Abbiamo effettuato alcune classificazioni fondamentali (tra cui, le smartcard a memoria e a microprocessore) e presentato gli standard internazionali di riferimento, formulati dall’ISO, che le smartcard più diffuse devono seguire. Nel secondo e terzo articolo, sono state approfondite rispettivamente le 54 TUTORIAL smartcard a memoria (in particolare quelle basate sul chip SLE4442) e le smartcard a microprocessore (standard e “meno standard”). Nella quarta parte, abbiamo finalmente messo mano al saldatore, realizzando un economico lettore universale di smartcard, denominato UniReader, compatibile sia con le smartcard a memoria che con quelle a microprocessore. Infine, nel precedente articolo (quinta parte), abbiamo utilizzato le smartcard a memoria in alcune applicazioni pratiche, realizzando un firmware ad hoc per l’UniReader (sia in versione stand-alone, sia in versione slave). In questa parte e nella successi- va, descriveremo nei dettagli una smartcard che, con molta probabilità, è già in nostro possesso, magari in più esemplari: la SIM dei telefoni GSM. Il lettore che ci segue sin dall’inizio sa bene che questo oggetto non è altro che una smartcard a microprocessore che può essere gestita alla stessa stregua delle altre smartcard. Descriveremo gli standard a cui le SIM fanno riferimento, le funzioni nel sistema GSM, i comandi che permettono la gestione dei dati interni, l’organizzazione delle varie informazioni utilizzate dal sistema. Breve panoramica sulle smartcard a microprocessore Consiglio al lettore che non MODUGNO-impaginato 1-10-2004 17:11 Pagina 55 TUTORIAL avesse letto il nostro tutorial di recuperare almeno la terza parte che contiene una descrizione dettagliata sulle smartcard a microprocessore (oltre alla prima parte che considero propedeutica). In questo breve paragrafo farò solo una veloce panoramica su questo tipo di carte per “rinfrescare” la memoria. Le smartcard a microprocessore sono delle normali smartcard che integrano internamente, a differenza delle semplici smartcard a memoria, un vero e proprio microprocessore, una memoria volatile e veloce (RAM), una memoria permanente più lenta (EEPROM o FLASH) ed un porta seriale. Possiamo paragonare una di queste smartcard ad un vero e proprio computer miniaturizzato, dotato di una CPU, di una memoria e di una sola periferica di I/O, la porta seriale ISO7816 (da non confondere con la classica RS232 presente sui PC). Attraverso la porta seriale la carta comunica con il mondo esterno (dispositivo di interfaccia) ricevendo e rispondendo ai comandi più svariati. Questo collegamento seriale utilizza un preciso protocollo di trasferimento dei dati, tra cui il più diffuso e semplice è quello denominato “T=0”, descritto nella parte terza dello standard ISO7816. Il microprocessore, insieme alla memoria RAM, effettua tutte le elaborazioni necessarie per la gestione dei dati memorizzati nella carta (lettura e scrittura) e per la esecuzione degli eventuali algoritmi di cifratura necessari per la segretezza delle transazioni. La memoria non volatile è naturalmente usata per la memorizzazione dei dati dell’utente o dell’applicazione anche ad alimentazione assente: numeri seriali, dati anagrafici, chiavi crittografiche, ecc. Come abbiamo visto nella terza parte, lo standard ISO7816-3 definisce un preciso protocollo per l’invio dei comandi. Questi sono formati da una intestazio- www.artek.it NUTCHIP IL TODDLER TAOS LU - LA divertirsi è facile un ROBOT che cammina per voi IN KIT Sensore di colore Logic Analyzer USB 200 MHz • • • • • Divertirsi è facile 4 Ingressi 4 Uscite 1 Comparatore Opera con RTX Aurel Opera con telecomandi TV Discrimina 100 colori per Basic Stamp o Microcontroller 16 canali su porta USB 1 MByte di memoria per canale Programmabile in 5 minuti Rivenditori Welcome STARTER KIT KIT08 per Micro MOTOROLA MC68HC908 GP32 HS3 50 MHZ 12 BIT USB QV502 PLAYER MP3 MINI TELECAMERA CCD A COLORI • • • • • con Compact Flash controllato via RS232 con Microfono completa di Trasmettitore e Ricevitore a 2,4 GHz Oscilloscopio Analizzatore di Spettro Registratore Transitori Voltmetro Generatore Forme onda Sali a bordo e naviga sul sito WEB ARTEK per informazioni Tel. 0542.55900 - Fax 0542.55488 TUTORIAL 55 MODUGNO-impaginato 1-10-2004 17:11 Pagina 56 TUTORIAL ne di cinque byte, denominati CLA INS P1 P2 LEN e trasferiti sempre dal lettore verso la smartcard: in altre parole, la smartcard non può mai decidere di iniziare un trasferimento dati di sua iniziativa, ma può solo rispondere ai comandi ricevuti dal dispositivo di interfaccia. Subito dopo l’invio di questo comando, la smartcard risponde con un procedure byte che indica al lettore come gestire correttamente la tensione di programmazione Vpp: nella maggior parte dei casi, quando la tensione Vpp non viene usata, il procedure byte coincide con il byte INS. Dopo l’invio di questo byte, la smartcard può rispondere con un pacchetto di byte oppure il lettore può inviare ulteriori dati alla smartcard: il verso del trasferimento dei dati dipende dal tipo di comando inviato (fondamentalmente dalla coppia dei byte CLA e INS). È necessario che sia il lettore che la smartcard abbiano la stessa conoscenza a priori del significato dei vari comandi e, quindi, della direzione di trasferimento dei byte. Se il comando prevede un trasferimento dalla carta verso il lettore, LEN=0 indica l’invio di 256 byte; viceversa, se il comando indica un trasferimento dal lettore verso la carta, LEN=0 indica che non ci sarà alcun trasferimento di byte. ISO7816 PARTE 4 Nell’articolo sulle smartcard a microprocessore abbiamo fatto riferimento allo standard ISO7816 parte 3. Come abbiamo visto, questo standard si limita a definire, per le smart- 56 TUTORIAL card asincrone (cioè quelle a microprocessore), la struttura dell’ATR ed il protocollo T=0 per il trasferimento di dati e comandi nelle due direzioni. Non entra nel merito dell’organizzazione interna dei dati né su come devono essere gestiti all’interfaccia lettore-smartcard. In altre parole, limitandosi alla terza parte dell’ISO7816, è possibile creare smartcard e lettori incompatibili tra loro. Basti pensare, per esempio, ad una diversa codifica dei comandi (CLA e/o INS). È per questo motivo che è stata pubblicata una quarta parte dello standard ISO7816 che definisce una organizzazione logica dei dati alla sezione smartcard-lettore. L’implementazione interna, cioè l’allocazione dei dati e la loro codifica nella memoria interna della smartcard, rimane ancora non definita e può essere liberamente ideata dallo sviluppatore dell’applicazione. La cosa importante è che questi dati possano “apparire” nel modo standard al lettore. Poiché le SIM GSM seguono anche questo standard, è utile approfondirne almeno alcuni aspetti principali. Organizzazione logica dei dati: i file Così come in un PC, anche nelle smartcard ISO7816-4 i dati vengono organizzati in una struttura gerarchica di file. Lo standard definisce i Dedicated File (DF) e gli Elementary File (EF): i primi sono una sorta di cartelle, spesso chiamati directory, mentre i secondi assomigliano ai file veri e propri di un PC. Il DF principale viene chiamato Master File (MF) e rappresenta la radice della struttura gerarchica ad albero. L’MF può contenere altri DF oppure EF. A loro volta, i DF di primo livello possono contenere altri DF oppure EF e così via. Ogni file è individuato da un identificatore (file identifier) di due byte. L’MF è sempre identificato da ‘3F00’, il valore ‘FFFF’ è riservato per usi futuri, mentre il valore ‘3FFF’ è riservato per la selezione di un file mediante percorso relativo (vedi oltre). Come nel vecchio DOS, anche per le smartcard c’è una directory (DF) corrente; inoltre, c’è anche un file (EF) corrente. All’inizio della sessione (dopo l’ATR) l’MF è la directory corrente, mentre non c’è alcun file selezionato. Successivamente, è possibile selezionare un diverso file (DF o EF) mediante il comando SELECT FILE, attraverso le seguenti modalità: • referenziando il suo identificatore a 2 byte; • referenziando il suo percorso assoluto (a partire dall’MF) o relativo (a partire dal DF corrente) citando gli identificatori di tutti i file intermedi; • referenziando l’identificatore breve (short file identifier) del file (se implementato); • referenziando il nome univoco (da 1 a 16 byte) associato al DF che si vuole selezionare (se implementato). Lo standard prevede due tipi di file: transparent file e record file. I primi sono visti come una sequenza di byte a partire dal- MODUGNO-impaginato 1-10-2004 17:11 Pagina 57 TUTORIAL l’indirizzo 0 fino all’indirizzo n-1, dove n è la dimensione dei dati del file. Per esempio, è possibile memorizzare un numero di serie o una chiave crittografica in un file di questo tipo. I file basati su record, invece, possono essere letti e scritti solo a gruppi di n byte, dove n è generalmente costante e dipende dal file. Per esempio, è possibile utilizzare un file di record per memorizzare una rubrica di numeri di telefono: ogni nominativo occuperà un intero record. Esistono tre tipi di file basati su record: linear fixed file, linear variable file e cyclic file. I linear fixed file sono una sequenza di record a lunghezza fissa a cui si può accedere mediante un numero di record. I linear variable file sono identici ai fixed con la differenza che la dimensione di ogni record può essere variabile (non sono molto usati nelle applicazioni comuni). Infine, i cyclic file sono sempre basati su record a lunghezza fissa a cui si può accedere ciclicamente: l’ultimo record aggiunto (in ordine di tempo) sarà il primo ad essere letto. Nei transparent file è possibile accedere ai dati mediante un offset relativo al primo byte (indirizzo 0). Nei file strutturati a record, invece, si può accedere ai dati mediante un numero di record (a partire da 1) oppure mediante un puntatore ad un record corrente. Il software di gestione della smartcard può conoscere il tipo di file e tutti i suoi attributi (dimensione, numero di record, lunghezza dei record, ecc.) tramite la risposta al comando SELECT FILE che rappresenta il File Control Information (FCI). È una sequenza di byte che permette di risalire al tipo di file ed a tutti i suoi parametri. Ad ogni file è associato un meccanismo di sicurezza che protegge i dati da operazioni di lettura, scrittura, ecc. Per esempio, se un file è protetto in lettura, sarà necessario inserire correttamente un codice segreto (PIN) per abilitare tale operazione. Anche il tipo di protezione è indicato nell’FCI. In realtà, lo standard ISO7816-4 è molto complicato e generico e descrive una serie di comandi per l’accesso ai dati memorizzati nei file della smartcard: comandi di lettura e scrittura, di autenticazione, di selezione dei file, ecc. Nella maggior parte dei casi pratici, però, sono implementati solo una parte dei comandi e delle funzionalità descritte nello standard. Per questo motivo, non approfondiamo ulteriormente il contenuto di queste direttive e rivolgiamo subito la nostra attenzione alle SIM. SUBSCRIBER IDENTITY MODULE Cos’è una SIM La SIM (Subscriber Identity Module) è una smartcard utilizzata nel ben noto sistema di telefonia cellulare GSM per scopi di autenticazione dell’utente e sicurezza delle conversazioni durante le comunicazioni con gli apparati di rete del proprio gestore di servizi. Gli innumerevoli standard che formano il sistema GSM sono formalizzati dall’ETSI e disponibili gratuita- mente sul suo sito, previa registrazione. I più importanti documenti relativi alle SIM e al loro funzionamento, sono: • GSM 02.17 “Subscriber Identity Modules, Functional Characteristics”, che descrive le funzionalità (a livello logico) ed il ruolo di una SIM all’interno del sistema GSM; • TS 100 977 (3GPP TS 11.11) “Specification of the SIM-ME Interface”, che descrive l’interfaccia (ad un livello tecnico) tra la SIM ed il telefono cellulare. Una SIM è una smartcard (o ICCard, utilizzando i termini standard) che individua un cliente, o un abbonamento, di un determinato provider. La responsabilità della gestione della carta è del provider che la fornisce al cliente sottoscrittore di un qualsiasi abbonamento. Il sistema GSM ha introdotto per la prima volta, nell’ambito della telefonia mobile, l’idea di separare logicamente (e fisicamente) il telefono cellulare dall’utente e dai suoi dati. Usando la terminologia degli standard, il telefonino viene definito Mobile Equipment (ME), mentre il telefonino dotato di SIM è definito Mobile Station (MS). L’ME è solo l’apparato elettronico che permette di effettuare e ricevere telefonate sfruttando la rete GSM, ma ha bisogno della SIM per acquisire i permessi e autenticare il cliente presso il gestore telefonico (solo le telefonate d’urgenza possono essere effettuate senza una SIM valida inserita nell’ME), oppure per deci- TUTORIAL 57 MODUGNO-impaginato 1-10-2004 17:11 Pagina 58 TUTORIAL frare il traffico dati (voce, SMS, ecc.) da e verso la rete. Sono previsti due tipi di smartcard a livello fisico: le IC-Card, che hanno le stesse dimensioni delle smartcard ISO7816 (tipo carta di credito) e le Plug-In SIM che hanno una dimensione ridotta (25x15 mm). Le prime possono normalmente essere estratte dal telefonino in modo molto semplice e possono essere delle carte multiapplicazioni di cui il GSM è solo una di queste. Il secondo tipo di carta, molto più piccolo delle IC-Card, è stato introdotto per permettere la miniaturizzazione dei telefonini e, normalmente, è semipermanente. A parte la dimensione fisica, elettricamente e logicamente i due tipi di SIM sono identici. Faccio notare che in commercio esistono degli adattatori che permettono di trasformare una Plug-In SIM in una IC-Card. Consiglio al lettore che volesse sperimentare con le SIM mediante l’UniReader, così come descritto nel prossimo articolo, di procurarsi questo adattatore, dal costo irrisorio, presso tabaccherie o negozi per telefonia, in quanto il nostro lettore prevede solo le IC-Card. In alternativa, è possibile costruirsene uno facendo del semplice bricolage, ritagliando opportunamente un cartoncino (o plastica) rigido dello spessore di una SIM e incollando due fogli da entrambe le parti, in modo che rimanga esternamente una finestrella per l’inserimento della SIM e per i suoi contatti. Autenticazione Il sistema di autenticazione in 58 TUTORIAL una qualsiasi rete di telecomunicazioni è estremamente importante poiché potrebbe inficiarne il reale utilizzo e la sua diffusione. Basti pensare alla precedente tecnologia di telefonia cellulare ETACS e ai numerosissimi casi di clonazione dell’identità dell’utente. Il sistema GSM è completamente digitale e permette, quindi, di utilizzare tecniche più efficaci di autenticazione (crittografia). In questo paragrafo farò un piccolo accenno al meccanismo utilizzato dalla rete GSM per riconoscere un cliente che ha diritto di usufruire dei servizi messi a disposizione dall’infrastruttura. Ogni SIM rilasciata al cliente dal gestore, proprietario di una rete di telefonia cellulare GSM (PLMN, Public Land Mobile Network), è individuata univocamente da un numero, chiamato IMSI (International Mobile Subscriber Identity) formato al più da 15 cifre decimali: MCC (Mobile Country Code) di 3 cifre, che individua la nazione dell’operatore (222 per l’Italia); MNC (Mobile Network Code), che indi- Figura 1: Procedura di autenticazione alla rete GSM vidua l’operatore all’interno della nazione (10 per Vodafone in Italia); MSIN (Mobile Station Identification Number) al più di 10 cifre, che rappresenta il numero seriale creato dal provider e che individua univocamente un suo cliente. Non è un numero segreto, tant’è che è possibile leggerlo, come faremo nel prossimo articolo, direttamente dalla SIM selezionando il file relativo. Associato all’IMSI c’è un altro identificatore di 16 byte, denominato Ki, che individua univocamente il cliente. Il numero Ki è memorizzato segretamente all’interno della SIM, da cui è impossibile leggerlo e all’interno degli apparati di rete del gestore. Infine, la SIM ha la possibilità di eseguire un algoritmo crittografico (definito A3) che permette di trasformare un numero casuale di 16 byte (RAND) in un numero di 4 byte (SRES), utilizzando come chiave la Ki. In figura 1 è mostrato il flusso di informazioni tra la rete GSM e la SIM del cliente (tramite l’ME) durante la fase di autenticazione alla MODUGNO-impaginato 1-10-2004 17:11 Pagina 59 TUTORIAL rete del gestore. All’accensione (o quando è necessaria l’autenticazione), l’ME richiede l’IMSI alla SIM e lo invia alla rete dell’operatore mediante l’interfaccia radio. Gli apparati di rete controllano l’esistenza dell’IMSI all’interno di un proprio database e, in caso affermativo, trasmettono alla SIM (tramite l’ME) un numero casuale di 16 byte denominato RAND. Indipendentemente, la SIM e la rete calcolano il numero di 4 byte SRES a partire dal numero casuale RAND e dalla chiave crittografica segreta Ki, utilizzando l’algoritmo comune A3. A questo punto, l’ME richiede alla SIM il valore SRES calcolato e lo trasmette al gestore che può controllare la coincidenza tra l’SRES calcolato dalla SIM e quello calcolato dagli apparati di rete. Se i due numeri sono uguali, vuol dire che la SIM è autentica (conosce sia l’algoritmo A3 che la chiave segreta Ki) e può essere abilitata ai servizi di rete. Faccio notare che lo standard GSM non definisce i dettagli dell’algoritmo A3 ma solo l’input (la chiave Ki di 16 byte ed il numero RAND di 16 byte) e l’output (il numero di 4 byte SRES); l’operatore telefonico può utilizzare un qualsiasi algoritmo e, possibilmente, tenerlo segreto. Questo sistema di autenticazione è molto efficace, poiché si basa sulla segretezza della chiave Ki memorizzata nel database del gestore e nella SIM del cellulare. Essendo la SIM una smartcard a microprocessore, è possibile effettuare elaborazioni (come l’esecuzione dell’algoritmo A3) e rendere invisibli i dati (come la Ki), rendendo il sistema molto più sicuro. In realtà, il meccanismo descritto in precedenza è semplificato rispetto al caso reale. Per esempio, non è stata presa in considerazione la possibilità che l’IMSI ricevuto dalla rete appartenga ad un altro provider, magari di un’altra nazione. In questo caso, è necessario decidere se è possibile effettuare il roaming consultando le infrastrutture del provider del cliente, mediante uno scambio di informazioni ben più complesso. Accenno solo al fatto che l’autenticazione alla rete avviene di continuo durante l’operatività dell’ME, sfruttando spesso un numero seriale temporaneo (TMSI) piuttosto che l’IMSI per aumentare l’efficienza del sistema. Segretezza Oltre al classico problema di autenticazione, una rete di telecomunicazioni deve anche garantire la segretezza delle informazioni scambiate. Ciò è ancor più importante nelle reti di telefonia mobile, poiché il mezzo trasmissivo, cioè la tratta radio tra l’ME e la stazione base (comunemente detta cella o, più tecnicamente, BTS) è “di dominio pubblico”. Anche in questo caso, la tecnologia digitale ci permette di utilizzare tecniche di crittografia per cifrare le informazioni in transito e renderle illeggibili ad eventuali “ascoltatori non autorizzati”. Nel vecchio sistema di telefonia mobile analogico ETACS era possibile, con appositi strumenti, demodulare il segnale trasmesso in chiaro (per esempio, mediante un analizzatore di spettro evoluto) ed ascoltare le telefonate in corso. Il sistema GSM, invece, prevede la cifratura di tutti i messaggi scambiati tra l’MS (il telefonino) e la BTS (l’antenna più vicina con cui l’MS comunica) mediante un algoritmo standardizzato ed implementato in ogni cellulare GSM e denominato A5. Durante la comunicazione tra MS e BTS, i dati vengono cifrati mediante l’algoritmo A5, utilizzando una chiave crittografica temporanea di 8 byte, memorizzata nella SIM del cellulare e denominata Kc. Quello che normalmente accade è che la SIM esegue sia l’algoritmo A3, descritto precedentemente ed utilizzato in fase di autenticazione per la generazione del numero SRES, sia un altro algoritmo, detto A8, per la generazione della chiave di decifrazione dei messaggi Kc. Spesso, la coppia degli algoritmi A3 e A8 vengono implementati come un unico algoritmo, comunemente detto A38, all’interno della SIM, in modo che vengano generati automaticamente sia il numero SRES, sia la chiave Kc. Tutte le informazioni che il telefonino scambia con l’antenna sono codificate con tale chiave. Essa viene cambiata numerose volte durante una sessione (per esempio, una chiamata telefonica) per evitare che si possa risalire alla chiave Kc, intercettando una lunga sequenza di dati codificati con lo stesso codice. Struttura logica di una SIM Le SIM GSM sono delle smart- TUTORIAL 59 MODUGNO-impaginato 1-10-2004 17:11 Pagina 60 TUTORIAL card a microprocessore che seguono gli standard ISO7816-3 e ISO7816-4. Per questo motivo, i dati sono organizzati logicamente in file, così come descritto in precedenza. Come al solito, esiste un MF con identificatore ‘3F00’ e numerosi DF ed EF figli. Nelle SIM, i DF di primo livello (figli diretti dell’MF) sono identificati da “7Fxx”, mentre i DF di secondo livello sono identificati da “5Fxx”. Gli EF contenuti direttamente nell’MF sono identificati da ‘2Fxx’, quelli contenuti nei DF di primo livello sono identificati da “6Fxx”, infine quelli contenuti nei DF di secondo livello da ‘4Fxx’. In altre parole, il primo byte dell’identificatore permette di risalire alla posizione (livello) del file all’interno della struttura gerarchica. Nell’assegnazione degli identificatori è necessario che nessun file abbia lo stesso identificatore di un altro contenuto nella stessa directory (DF), così come non possono esserci due file con lo stesso nome in una stessa cartella di un PC. Ad un EF è associato un header, che indica il tipo di file ed i suoi attributi ed un corpo dati di dimensione variabile. Un DF, invece, ha solo funzioni di contenitore (directory), quindi ha solo un header senza dati. Per poter accedere correttamente ai dati contenuti in un file, è necessario leggere e interpretare l’header associato. In una SIM sono previsti tre tipi di EF: • transparent file: una sequenza di byte a cui si può accedere 60 TUTORIAL Figura 2: Possibile struttura di file in una SIM mediante un offset relativo (indirizzo), rispetto al primo byte del file (indirizzo 0); • linear fixed file: una sequenza di record a lunghezza fissa a cui è possibile accedere mediante un numero di record (a partire da 1), un puntatore o una ricerca; • cyclic file: una sequenza ciclica di record a lunghezza fissa in cui esiste un collegamento tra il primo record e l’ultimo record, in modo da memorizzare dati in ordine cronologico. Selezione dei file Così come descritto nello standard ISO7816-4, esiste un comando apposito per la selezione dei file in una SIM, definito SELECT FILE. Dopo l’ATR, viene automaticamente selezionata la directory MF. Selezionando un DF (o di nuovo l’MF), viene modificata la directory corrente. Dopo questa operazione, non c’è alcun EF corrente. Selezionando un EF, viene impostato come DF corrente la directory padre dell’EF selezionato. Ovviamente, l’EF corrente risulta quello appena selezionato. In qualsiasi momento, in funzione dell’ultimo file selezionato, è possibile selezionare: 1 un qualsiasi file contenuto nella directory corrente; 2 un qualsiasi DF contenuto nel DF padre della directory corrente; 3 il padre della directory corrente; 4 il DF corrente; 5 il Master File. Per rendere più chiaro il meccanismo, più semplice da capire che da spiegare, consideriamo l’esempio in figura 2, dove è mostrato una possibile struttura gerarchica di file memorizzata in una SIM (l’esempio è identico a quello presente sullo standard). In Tabella 1 sono mostrati tutti i file che è possibile selezionare, mediante un singolo comando SELECT FILE, a partire da un altro file corrente. Per esempio, se il file corrente è l’EF2, sarà possibile selezionare MF (5), DF1 (4), DF2 (2), DF3 (1). Tra parentesi è indicata la regola MODUGNO-impaginato 1-10-2004 17:11 Pagina 61 TUTORIAL relativa che permette la selezione di quel file. Ultimo file selezionato Selezioni valide MF DF1, DF2, EF1 Anche se non è stato messo in evidenza, è sempre possibile selezionare il file corrente, cioè l’ultimo file selezionato. DF1 MF, DF2, DF3, EF2 DF2 MF, DF1, EF3, EF4 DF3 MF, DF1, EF5 Modalità d’accesso ai file Ogni EF in una SIM ha una modalità d’accesso relativo ad ogni comando (lettura o ricerca, scrittura, abilitazione, ecc). Tale modalità assume un valore intero da 0 a 15, secondo la Tabella 2. EF1 MF, DF1, DF2 EF2 MF, DF1, DF2, DF3 EF3 MF, DF1, DF2, EF4 EF4 MF, DF1, DF2, EF3 EF5 MF, DF1, DF3 Tabella 1: Selezioni valide per la struttura di file mostrata in Figura 2. I due codici segreti CHV1 e CHV2 rappresentano dei meccanismi di sicurezza che permettono solo all’utente, che conosce tali codici, di accedere alle informazioni più sensibili della SIM (rubrica, SMS, IMSI, impostazioni, ecc). Il CHV1 (Card Holder Verification 1) è il PIN (vecchia terminologia) formato da un minimo di 4 ad un massimo di 8 cifre decimali, il CHV2 (Card Holder Verification 2) è un altro codice segreto che può essere utilizzato per altri scopi (blocco chiamate in entrata e/o in uscita, ecc). Tali condizioni per l’accesso al file non sono da considerare in modo gerarchico: in altre parole, l’aver inserito correttamente il CHV2 non permette di effettuare comandi su file che prevedono l’inserimento del CHV1. Come molti sapranno, è possibile inserire fino a tre volte un CHV1 errato dopo le quali il codice viene bloccato. Per poter essere sbloccato, sarà necessario utilizzare un altro codice segreto denominato UNBLOCK CHV1 (PUK nella vecchia terminologia). Lo stesso vale anche per il CHV2 che ha un suo relativo UNBLOCK CHV2 (PUK2). È possibile inserire in modo errato l’UNBLOCK CHV1 o 2 un massimo di 10 volte consecutive, dopo le quali il codice bloccato non può più essere sbloccato dal cliente e la SIM deve essere TUTORIAL 61 MODUGNO-impaginato 1-10-2004 17:11 Pagina 62 TUTORIAL Livello Modalità d’accesso 0 ALW (always, sempre): operazione sempre permessa 1 CHV1: operazione permessa solo dopo la verifica del codice segreto CHV1 (o se il codice CHV1 è disabilitato) 2 CHV2: operazione permessa solo dopo la verifica del CHV2 3 Riservato per usi futuri da 4 a 14 ADM: operazione permessa solo durante la fase amministrativa (riservata al gestore) 15 NEV (Never, mai): operazione mai permessa Tabella 2: Modalità d’accesso di un file riportata al gestore. Il CHV1 può essere anche disabilitato dall’utente: in questo caso, la modalità d’accesso CHV1 sarà sempre soddisfatta. Nessuna condizione per l’accesso è associata alle directory (DF e MF). Comandi Così come per tutte le smartcard ISO7816-3, il dispositivo d’interfaccia (nel caso GSM è rappresentato dall’ME) colloquia con la carta mediante dei comandi trasmessi e delle risposte ricevute. Tali comandi e risposte non sono altro che una sequenza di byte trasportata mediante un preciso protocollo, per esempio il già citato T=0. Tutte le SIM prevedono almeno questo protocollo, ma possono offrire altri sistemi di trasmissione più evoluti (indicati, come al solito, nell’ATR). Per i nostri esperimenti utilizzeremo sempre il protocollo standard T=0. Usando la terminologia dello standard ISO, la sequenza di byte che forma un comando trasmesso dall’interfaccia o la risposta della SIM viene chiamata APDU (Application 62 TUTORIAL Protocol Data Unit). Nel primo caso si parlerà di command APDU (o semplicemente comando), nel secondo di response APDU (o semplicemente risposta). Normalmente, ad ogni comando c’è sempre una risposta da parte della SIM. Come già detto nella terza parte del tutorial, un comando è formato da una intestazione (header) di cinque byte ed eventualmente dei dati. Nel caso siano presenti dei dati, il byte LEN (il quinto dell’intestazione) coincide con il numero dei byte trasferiti alla SIM. Quest’ultima risponde con due byte che rappresentano la Status Word, cioè il risultato dell’elaborazione del comando. Se, invece, deve avvenire un trasferimento opposto di dati (dalla SIM all’ME), il comando sarà formato dalla sola intestazione (cinque byte) dove il byte LEN indicherà il numero di byte che la SIM dovrà trasmettere, mentre la risposta sarà formata da LEN byte di dati, più i due byte della Status Word. È da notare che, in questo caso, se LEN=0, ci sarà un trasferimento di 256 byte dalla SIM all’ME. In realtà, la casistica è più complicata per i seguenti due motivi: • un solo comando potrebbe prevedere il trasferimento simultaneo di dati in entrambe le direzioni; • l’ME potrebbe non sapere a priori il numero dei byte che la SIM dovrà trasmettere, quindi non può “riempire” correttamente il byte LEN del comando relativo. Per risolvere entrambe le situazioni, è previsto un comando dedicato (GET RESPONSE) che permette all’ME di ottenere una nuova risposta dalla SIM. Per maggiore chiarezza, in figura 3 sono rappresentati tutti i cinque casi possibili di trasferimento dati tra ME e SIM. Il primo caso è semplice e prevede l’invio di un comando dall’ME alla SIM senza alcun dato né in uscita né in entrata. Il byte LEN sarà quindi nullo e la risposta della SIM conterrà solo i due byte della Status Word (90 00, nel caso non ci siano errori). MODUGNO-impaginato 1-10-2004 17:11 Pagina 63 TUTORIAL Il secondo caso è relativo al solo trasferimento di dati, di lunghezza nota, dalla SIM verso l’ME. Il comando è for- mato solo dall’header di cinque byte dove LEN rappresenta il numero di byte da trasferire (se LEN=0, i dati trasferiti Figura 3: Rappresentazione dei cinque casi di trasferimenti ME-SIM saranno 256). L’APDU di risposta sarà formato dai LEN byte richiesti più i due byte della Status Word. Nel terzo caso, l’ME richiede alla SIM dei dati di cui non conosce la lunghezza. L’ME trasmette un comando con il byte LEN=0 e la SIM risponde con una Status Word 9F L1, dove L1 rappresenta la lunghezza dei dati. A questo punto, l’ME può trasmettere un comando GET RESPONSE per ottenere i dati richiesti, dove specifica correttamente il byte LEN=L2, normalmente uguale a L1 (in alcuni casi potrebbe essere inferiore). Anche il quarto caso è molto semplice e prevede un trasferimento di dati solo dall’ME verso la SIM. Infine, l’ultimo caso è il più complicato, poiché prevede un trasferimento di dati dall’ME alla SIM, ma anche un trasferimento nella direzione opposta (di lunghezza conosciuta o meno). In questo caso l’ME trasmette un comando in cui invia i propri dati ed aspetta una Status Word del tipo 9F L1, dove L1 rappresenta la lunghezza dei dati di risposta. Successivamente, l’ME invia il comando GET RESPONSE in cui riempie correttamente il byte LEN con L2, normalmente pari ad L1 o inferiore. In Tabella 3 è mostrato l’elenco di tutti i comandi che una SIM riconosce, insieme alla codifica dei parametri INS, P1, P2 e LEN. Il verso di trasmissione dei dati è indicato nella colonna S/R dove S indica che i dati sono trasmessi (Send) dall’ME TUTORIAL 63 MODUGNO-impaginato 1-10-2004 17:11 Pagina 64 TUTORIAL ed R indica che i dati sono ricevuti (Received) dall’ME. Ovviamente, alcuni comandi possono prevedere entrambe le direzioni (grazie al comando GET RESPONSE). Per l’applicazione GSM, il byte CLA del comando è sempre pari ad ‘A0’. Alcuni comandi gestiscono direttamente i file (EF o DF) memorizzati nella SIM, altri hanno scopi diversi (per esempio, l’esecuzione degli algoritmi A3 e A8). In Tabella 4 sono elencati tutti i comandi che riguardano i file, specificandone il tipo su cui possono essere eseguiti. Per esempio, il comando SELECT e STATUS possono essere effettuati su tutti i tipi di file, mentre il comando READ BINARY può essere eseguito solo su un transparent file. STANCHI DI GIOCARE? Cosa ci aspetta nel prossimo articolo Terminiamo qui questo articolo per non renderlo troppo lungo e noioso. Nel prossimo continueremo la nostra analisi sul funzionamento delle SIM, in COMANDO INS P1 P2 LEN S/R SELECT A4 00 00 02 S/R STATUS F2 00 00 lunghezza R READ BINARY B0 indirizzo alto indirizzo basso lunghezza R UPDATE BINARY D6 indirizzo alto indirizzo basso lunghezza S READ RECORD B2 n. record modalità lunghezza R UPDATE RECORD DC n. record modalità lunghezza S SEEK A2 00 tipo/modalità lunghezza S/R INCREASE 32 00 00 03 S/R VERIFY CHV 20 00 n. CHV 08 S CHANGE CHV 24 00 n. CHV 10 S DISABLE CHV 26 00 01 08 S ENABLE CHV 28 00 01 08 S UNBLOCK CHV 2C 00 00 o 02 10 S INVALIDATE 04 00 00 00 - REHABILITATE 44 00 00 00 - RUN GSM ALGORITHM 88 00 00 10 S/R SLEEP FA 00 00 00 - GET RESPONSE C0 00 00 lunghezza R TERMINAL PROFILE 10 00 00 lunghezza S ENVELOPE C2 00 00 lunghezza S/R FETCH 12 00 00 lunghezza R TERMINAL RESPONSE 14 00 00 lunghezza S Tabella 3: Elenco dei comandi di una SIM 64 TUTORIAL MODUGNO-impaginato 1-10-2004 17:11 Pagina 65 TUTORIAL particolare descriveremo in dettaglio i comandi ed i file più importanti. Inoltre, tramite un apposito firmware per l’UniReader vedremo come è possibile sperimentare direttamente con le SIM senza l’utilizzo di un telefonino. Con un semplice software per PC, saremo quindi capaci di leggere e salvare sul nostro computer la rubrica e gli SMS memorizzati nella scheda. BIBLIOGRAGIA E LINK Normative GSM (in inglese): www.etsi.org Standard ISO7816 (in inglese, a pagamento): www.iso.org Comando MF DF Transparent Linear-fixed Cyclic File SELECT ✓ ✓ ✓ ✓ ✓ STATUS ✓ ✓ ✓ ✓ ✓ READ RECORD ✓ ✓ UPDATE RECORD ✓ ✓ SEEK ✓ READ BINARY ✓ UPDATE BINARY ✓ INCREASE ¸ INVALIDATE ✓ ✓ ✓ REHABILITATE ✓ ✓ ✓ Tabella 4: Comandi relativi ai file. VISUAL PARSIC Compilatore grafico per Microchip Picmicro Per chi vuole scrivere un programma in Assembler senza scrivere un solo rigo di codice Display LCD/VFD Noritake Cristallfontz Programmatori PIC ICD Debugger Programmatori Willem originali olandesi Gruppi di continuità da 500 VA fino a 160 KVA Schede PLC per PICmicro Telecamere a colori e b/n trasmittenti e via cavo Display a carattere scorrevole in offerta speciale WWW.PARSICITALIA.IT Via Rovereto, 13 - 48020 Savio (RA) - Tel 0544.927468 - Fax 178.6040078 - Email: [email protected] TUTORIAL 65 MODUGNO-impaginato 16-11-2004 10:29 Pagina 52 TUTORIAL SMARTCARD settima parte APPLICAZIONI CON LE SIM di Giuseppe Modugno [email protected] In questo ultimo articolo, continueremo la descrizione delle SIM utilizzate nel sistema GSM, commentando i comandi ed i file più importanti. Successivamente, svilupperemo un apposito firmware per il microcontrollore PIC16F628 del lettore UniReader per la gestione di smartcard asincrone ISO7816. Infine, mediante un software per PC ad hoc, scritto in Visual Basic, potremo interagire direttamente con una SIM senza l’utilizzo di un telefonino, per esempio per salvare sul nostro computer il contenuto della rubrica e gli SMS. RIPRENDIAMO LA NOSTRA PARTITA A CARTE Cosa ci siamo detti negli articoli precedenti Siamo arrivati all’ultima parte di questo lungo tutorial sulle smartcard. Per coloro che non ci hanno potuto leggere sin dall’inizio, facciamo qui un breve riassunto sul contenuto degli articoli precedenti. Nella prima parte del tutorial, abbiamo introdotto le smartcard da un punto di vista teorico, rispondendo a domande del tipo: cosa sono, quanti tipi ne esistono e come si classificano, quali sono le normative internazionali di riferimento, ecc. Nella seconda parte è stata descritta in dettaglio una particolare tipologia di smartcard, utilizzata in molte applicazioni comuni: le smartcard a memo52 TUTORIAL ria. In particolare, è stato analizzato il diffusissimo chip SLE4442. Nella terza parte, invece, abbiamo analizzato le smartcard a microprocessore, standard e “meno standard”, introducendo termini come ATR, convenzione diretta/inversa, comandi ISO7816-3, protocollo di comunicazione T=0, ecc. Nella quarta parte, abbiamo finalmente concretizzato le conoscenze acquisite nei precedenti articoli, progettando e realizzando un economico e semplice da costruire lettore universale di smartcard a memoria e a microprocessore, basato sul PIC16F628, chiamato UniReader. Potete trovare due esempi tipici di applicazione delle smartcard a memoria SLE4442 nella quinta parte del tutorial, in cui è stata mostrata la versatilità di UniReader come lettore slave di un PC o stand-alone. Infine, nel precedente articolo (sesta parte), abbiamo iniziato la descrizione di una particolare tipologia di smartcard a microprocessore, le SIM del sistema GSM. Abbiamo descritto brevemente le normative ISO7816-4 che le SIM seguono. Inoltre, abbiamo fatto una breve panoramica sui problemi di autenticazione e segretezza delle informazioni nella rete GSM, garantiti proprio dalla SIM. DESCRIZIONE DEI COMANDI Ci siamo lasciati con un lungo elenco di comandi previsti dalle normative che tutte le SIM devono correttamente interpretare. I più importanti saranno qui analizzati. MODUGNO-impaginato 16-11-2004 10:29 Pagina 53 TUTORIAL Byte Descrizione Lunghezza 1-2 Riservati per usi futuri 2 3-4 Spazio disponibile nella directory non allocato ad alcun EF o DF 2 5-6 File ID 2 Tipo di file (01 per l’MF, 02 per DF) 1 Riservati per usi futuri 5 13 Lunghezza dei dati che seguono 1 14 Caratteristiche del file 1 15 Numero di DF contenuti nel DF selezionato 1 16 Numero di EF contenuti nel DF selezionato 1 17 Numero di codici segreti (CHV e simili) 1 18 Riservato per usi futuri 1 19 Stato CHV1 1 20 Stato UNBLOCK CHV1 1 21 Stato CHV2 1 22 Stato UNBLOCK CHV2 1 23 Riservato per usi futuri 1 7 8-12 24-34 Riservato per scopi di gestione della SIM 0÷11 Tabella 1: Struttura della risposta al comando SELECT per un DF SELECT È il comando che permette di selezionare un file (EF o DF) della SIM, specificando il suo identificatore a due byte. I file che è possibile selezionare sono quelli che seguono le regole descritte nel precedente articolo. Ricordo che dopo l’ATR la directory selezionata è l’MF. Per poter selezionare, per esempio, il DFTELECOM (7F10) che è contenuto nell’MF, è necessario inviare alla SIM il seguente APDU: A0 A4 00 00 02 7F 10. Come indicato nella Tabella 3 del precedente articolo, il comando prevede un invio di dati dall’ME alla SIM (l’identificatore del file di due byte da selezionare, 7F10 nell’esempio di DFTELECOM) ed una risposta da parte della SIM. Per ottenere questa risposta, di lunghezza variabile, è necessario utilizzare il comando GET RESPONSE. Essa riporta il tipo di file appena selezionato, i suoi attributi (dimensione totale, dimensione record, ecc), le modalità d’accesso ed altre informazioni. Essa ha una diversa struttura a seconda che venga selezionato un DF oppure un EF. Nel primo caso, la sintassi della risposta al comando SELECT è mostrata nella Tabella 1: essa è formata da almeno 22 byte ed al massimo 34. I campi in grigio sono opzionali e potrebbero non essere tra- smessi dalla SIM. Il byte 14 indica, tra l’altro, se la SIM prevede una modalità di funzionamento in cui il clock può essere bloccato per diminuire il consumo di energia (molto importante in apparecchi portatili come un telefonino). Inoltre, se il bit più significativo di questo byte vale 1, il CHV1 (PIN) è disabilitato; al contrario, se tale bit è nullo, il CHV1 è abilitato. I byte dal 19 al 22 forniscono maggiori informazioni relative ai codici segreti CHV1, UNBLOCK CHV1, CHV2 e UNBLOCK CHV2. Nei quattro bit meno significativi di ogni byte, è memorizzato il TUTORIAL 53 MODUGNO-impaginato 16-11-2004 10:29 Pagina 54 TUTORIAL Byte Descrizione Lunghezza 1-2 Riservati per usi futuri 2 3-4 Dimensione del file 2 5-6 Identificatore del file 2 7 Tipo di file (04 nel caso di un EF) 1 8 Riservato per usi futuri (il bit più significativo, nel caso di cyclic file, indica la possibilità di usare il comando INCREASE) 1 Condizioni d’accesso 3 12 Stato del file 1 13 Lunghezza dei dati successivi 1 14 Struttura dell’EF 1 15 Lunghezza di un record (obbligatorio nel caso di linear fixed e cyclic file) 1 Riservati per usi futuri - 9-11 16 e seg. Tabella 2: Struttura della risposta al comando SELECT per un EF numero di tentativi rimasti per l’inserimento del relativo codice segreto (per i due CHV sono al massimo 3, per i due UNBLOCK CHV sono al massimo 10). Se questi quattro bit sono tutti nulli, il relativo codice segreto è bloccato: se si tratta di un CHV, si potrà usare l’UNBLOCK CHV corrispondente per lo sblocco, altrimenti la SIM dovrà essere restituita al gestore, poiché non più utilizzabile dall’utente. Nel caso di selezione di un EF, la risposta della SIM al comando SELECT è formata da un minimo di 14 byte (15 byte nel caso di linear fixed e cyclic file), come mostrato in Tabella 2. Come al solito, i campi su sfondo grigio sono opzionali e potrebbero non essere trasmessi dalla SIM. La dimensione del file (byte 3-4) indica il numero dei byte di un transparent file, oppure il nume- 54 TUTORIAL ro dei record moltiplicato per la dimensione di un record nel caso di un linear fixed file e di un cyclic file. Le condizioni d’accesso (byte 9-11) indicano i permessi necessari per effettuare le operazioni sul file. Il byte 9 indica i permessi per il comando UPDATE (nibble meno significativo) e READ/SEEK (nibble più significativo). Il byte 10 contiene i permessi del comando INCREASE (nibble più significativo). Il byte 11 indica i permessi per il comando INVALIDATE (nibble meno significativo) e per il comando REHABILITATE (nibble più significativo). Il nibble che rappresenta il permesso relativo ad un comando può valere “0” per accesso sempre consentito, “1” per accesso consentito solo dopo aver inserito correttamente il CHV1, “2” per accesso consentito solo dopo aver inserito correttamente il CHV2, “F” per accesso mai consentito. La struttura del file (byte 14) vale “00” per transparent file, “01” per linear fixed file, “03” per cyclic file. Infine, nel caso di file basato su record, il byte 15 indica la lunghezza (in byte) di un singolo record, altrimenti vale “00”. STATUS La risposta a questo comando è identica alla risposta ottenuta dal comando SELECT sulla directory corrente. READ BINARY È il comando che permette di leggere i dati memorizzati all’interno di un transparent file. I parametri dell’intestazione (P1 e P2) indicano l’offset del primo byte da leggere (a partire da 0), mentre il byte LEN indica il numero di byte da leggere. L’APDU di risposta contiene i byte MODUGNO-impaginato 16-11-2004 10:29 Pagina 55 TUTORIAL desiderati dell’EF correntemente selezionato. Tale comando non può essere usato sui linear fixed file e sui cyclic file. Naturalmente, può essere eseguito solo se il permesso relativo al comando READ è soddisfatto. UPDATE BINARY Il comando UPDATE BINARY permette di scrivere una parte dei dati memorizzati in un transparent file. In questo caso, è il dispositivo di interfaccia che trasmette i dati da memorizzare, mentre la SIM risponde solo con la Status Word. È necessario soddisfare il relativo permesso di UPDATE. P1 P2 00 02 Next Record Legge/scrive il record successivo a quello corrente. 00 03 Previous Record Legge/scrive il record precedente a quello corrente. Absoulte/Current Record Legge/scrive il record corrente (n=0) oppure il record numero n (n≠0) a partire dal primo. Il record corrente non viene modificato. n 04 Modalità READ RECORD Il comando READ RECORD permette di leggere un record dal file corrente di tipo linear fixed o cyclic. Ovviamente, è necessario che sia soddisfatta la condizione d’accesso in lettura relativa al file. Il record da leggere dipende dai parametri P1 e P2 dell’header Descrizione Tabella 3: Modalità di lettura/scrittura di un record mediante i comandi READ/UPDATE RECORD VISUAL PARSIC Compilatore grafico per Microchip Picmicro Per chi vuole scrivere un programma in Assembler senza scrivere un solo rigo di codice Display LCD/VFD Noritake Cristallfontz Programmatori PIC ICD Debugger Programmatori Willem originali olandesi Gruppi di continuità da 500 VA fino a 160 KVA Schede PLC per PICmicro Telecamere a colori e b/n trasmittenti e via cavo Display a carattere scorrevole in offerta speciale WWW.PARSICITALIA.IT Via Rovereto, 13 - 48020 Savio (RA) - Tel 0544.927468 - Fax 178.6040078 - Email: [email protected] TUTORIAL 55 MODUGNO-impaginato 16-11-2004 10:29 Pagina 56 TUTORIAL del comando, così come descritto nella Tabella 3. Selezionando un file, non c’è alcun record corrente: in questo caso, la modalità Next restituisce il primo, quella Previous l’ultimo record. In un linear fixed file, se è selezionato il primo record ed è usata la modalità Previous oppure se è selezionato l’ultimo record ed è usata la modalità Next, nessun record verrà letto e la SIM risponderà con una Status Word d’errore (94 02). Invece, in un cyclic file, verrà letto il primo record con la modalità Next se l’ultimo record è quello corrente; verrà letto l’ultimo record con la modalità Previous se il record corrente è il primo. Il record corrente viene modificato solo con le modalità Next e Previous Record. UPDATE RECORD Il comando UPDATE RECORD modifica il contenuto di un record all’interno del file corrente (linear o cyclic), sempre che siano verificati i permessi di scrittura. Anche per questo comando è possibile usare le modalità descritte in Tabella 3 relative al comando READ RECORD. A differenza di questo, per i cyclic file è possibile usare solo la modalità Previous. In questo caso, il record meno recente sarà modificato e diventerà il record numero 1 della lista. SEEK Il comando SEEK permette di ricercare un record all’interno di un linear fixed file che inizia con una particolare sequenza di byte. E’ necessario avere i permessi di 56 TUTORIAL lettura per poter utilizzare questo comando. Esistono due tipi di ricerca: il primo tipo modifica solo il record corrente, ma non prevede alcuna risposta da parte della SIM; il secondo tipo, oltre a modificare il record corrente, trasmette in risposta il numero di record appena trovato. Se la ricerca non ha successo, il record corrente non viene modificato e la SIM risponderà con la Status Word d’errore (94 04). La massima lunghezza della stringa da ricercare è 16 byte ma, naturalmente, non può superare la dimensione di un intero record. Esistono quattro modalità di ricerca, elencate nella Tabella 4. Il nibble più significativo di P2, indicato in Tabella con “x”, vale 0 per il primo tipo, 1 per il secondo tipo del comando SEEK. Come al solito, se non c’è alcun record corrente, la ricerca parte dal primo record se P2=x2, dall’ultimo record se P2=x3. È il comando che viene usato dal telefonino quando si accede alla rubrica della SIM per ricercare un nome che inizia con una determinata sequenza di lettere. VERIFY CHV Tutti noi sappiamo che, all’accensione del telefonino, dobbiamo effettuare una semplice, ma molto spesso noiosa, operazione che è quella dell’inserimento del PIN (sempre che non sia stato precedentemente disabilitato). Quello che realmente succede è l’invio, da parte dell’ME, del comando VERIFY CHV alla SIM. Il comando prevede l’invio degli 8 byte che formano il CHV, mentre il byte P2 indica il codice da verificare: CHV1 se P2=01, CHV2 se P2=02. Se il codice trasmesso è uguale a quello memorizzato nella SIM, il numero di tentativi di inserimento viene inizializzato al valore 3, altrimenti viene decrementato di una unità. Dopo tre tentativi consecutivi errati, il codice è bloccato ed è necessario utilizzare il comando UNBLOCK CHV insieme al codice di sblocco relativo. Naturalmente il comando viene processato dalla SIM solo se il CHV indicato dal parametro P2 non è disabilitato, né bloccato. Il CHV è formato da un minimo di 4 ad un massimo di 8 cifre decimali. Ad ogni cifra corrisponde un byte che rappresenta, in P1 P2 00 x0 Effettua la ricerca a partire dal primo record. 00 x1 Effettua la ricerca a partire dall’ultimo record. 00 x2 Effettua la ricerca a partire dal record successivo a quello corrente. 00 x3 Effettua la ricerca a partire dal record precedente a quello corrente. Tabella 4: Modalità di ricerca del comando SEEK Descrizione MODUGNO-impaginato 16-11-2004 10:29 Pagina 57 TUTORIAL decimale, quella cifra. I byte rimanenti, nel caso il CHV avesse una lunghezza inferiore ad 8, devono essere posti al valore esadecimale FF. RUN GSM ALGORITHM È il comando meno noto all’utente ma più interessante tecnicamente, poiché è quello che permette di effettuare l’autenticazione alla rete GSM durante la fase di inizializzazione, per esempio subito dopo l’accensione. L’ME invia alla SIM, tramite questo comando, il numero casuale RAND di 16 byte ricevuto dalla rete e riceve dalla SIM il numero SRES (4 byte) e la chiave crittografica Kc (8 byte). Il primo numero viene ottenuto eseguendo l’algoritmo A3, il secondo tramite l’algoritmo A8. Il primo permette l’autenticazione della SIM alla rete, il secondo la segretezza delle informazioni scambiate. Il comando viene eseguito dalla SIM solo se è stato verificato il CHV1 e la directory corrente è la DFGSM o una sua sotto-directory. Potete trovare maggiori informazioni su questo argomento nell’articolo precedente. Struttura di alcuni file di una SIM In una SIM GSM sono presenti alcuni file (EF e DF) obbligatori, oltre ad altri file opzionali che possono essere creati liberamente dal gestore della rete. In figura 1 è rappresentata solo una minima parte della struttura gerarchica presente nello standard ETSI, contenente i file che andremo ad analizzare nel corso di questo articolo. Tralasciamo le cartelle MF (“3F00”), DFGSM (“7F20”) e DFTELECOM (“7F10”) e analizziamo i tre EF. EFICCID (2FE2) E’ un transparent file di 10 byte, contenuto direttamente nell’MF, in cui è memorizzato un numero identificativo della carta, normalmente stampigliato su uno dei lati della SIM. È formato da un massimo di 20 cifre decimali codificate in BCD in 10 byte: i nibble non utilizzati sono riempiti con la cifra esadecimale “F”. È possibile sempre leggere il contenuto di tale file, ma non è possibile scriverlo in alcun caso. EFIMSI (6F07) L’EFIMSI è un transparent file, figlio della directory DFGSM, che contiene il codice IMSI della SIM. Il file ha una lunghezza di 9 byte, di cui il primo indica la lunghezza del codice IMSI, in byte, che può essere al massimo di 15 cifre decimali. Come al solito, l’IMSI è codificato in BCD dove i nibble non usati (nel caso di lunghezza inferiore a 15 cifre) sono posti a “F”. Il nibble meno significativo del primo byte rappresenta un codice di parità. Naturalmente, per leggere l’IMSI è necessario aver verificato il CHV1, mentre può modificarlo solo il gestore. EFADN (6F3A) È il file che contiene la rubrica dei numeri di telefono memorizzati Figura 1: Struttra gerarchica dei file descritti nell’articolo TUTORIAL 57 MODUGNO-impaginato 18-11-2004 10:45 Pagina 58 TUTORIAL nella scheda. Il file è strutturato a record in modo sequenziale (linear fixed file) dove ogni record rappresenta un numero di telefono. Naturalmente, per poter leggere e scrivere su questo file è necessario aver verificato il CHV1. Ad ogni numero di telefono è possibile associare un testo opzionale, normalmente il nome della persona. Se la lunghezza del numero di telefono è fissa (10 byte), lo spazio dedicato al testo associato varia a seconda della SIM. In Tabella 5 è presente la struttura di un record di questo EF. Come si può osservare, la lunghezza del record è pari a X+14, dove X può variare a seconda della SIM e rappresenta la lunghezza del testo associato al numero. È possibile conoscere il valore di X sottraendo 14 alla lunghezza di un singolo record, ottenuta dalla risposta al comando SELECT. I primi X byte contengono l’alpha-tagging, cioè la stringa di testo associata al numero telefonico. Faccio notare che il record inizia proprio con il testo e ciò permette di utilizzare il comando SEEK per ricercare un nome in rubrica che inizia con una particolare sequenza di lettere (è praticamente quello che fa il cellulare quando consultiamo la rubrica). La codifica è molto simile all’ASCII, almeno per quello che riguarda i caratteri più diffusi. Rimando il lettore alla lettura dello standard per maggiori approfondimenti. Il byte X+1 indica la lunghezza, in byte, del numero di telefono, compreso il byte TON+NPI. Tale lunghezza può essere al massimo di 11 byte. Il byte TON+NPI rappresenta il Type Of Number e il Numbering Plan Identification. Qui la normativa è piuttosto complessa e non serve scendere troppo nei dettagli. Questo byte è formato, leggendo da sinistra, da un bit pari sempre ad 1, dal TON di 3 bit e dall’NPI di 4 bit. Normalmente il TON è pari a 000 e l’NPI a 0001, così da ottenere il byte 1000 0001, cioè 81 in esadecimale. Il numero di telefono è codificato in BCD dove la cifra precedente è codificata nel nibble meno signi- Byte Descrizione Lunghezza da 1 a X Testo X X+1 Lunghezza del numero di telefono (compreso il byte TON+NPI) 1 X+2 TON+NPI 1 da X+3 a X+12 Numero di telefono 10 X+13 CCI 1 X+14 Estensione 1 Tabella 5: Struttura di un record dell’EFADN 58 TUTORIAL ficativo e la cifra successiva nel nibble più significativo. Poiché ogni byte ha due nibble, è possibile memorizzare in un record dell’EFADN un numero di al massimo 20 cifre. I nibble eventualmente non usati sono messi ad “F”. Il simbolo “*” e “#” sono memorizzati rispettivamente con la cifra esadecimale “A” e “B”. Il byte CCI (Capability/Configuration Identifier) viene utilizzato se la chiamata al numero telefonico necessita di parametri o requisiti particolari. In questo caso, il byte rappresenta un identificatore del record nel file EFCCP dove sono memorizzate queste informazioni. Normalmente questo byte non viene usato e, in questo caso, viene messo ad “FF”. Infine, il byte Estensione è utilizzato se il numero telefonico è più lungo di 20 cifre e, quindi, ha una estensione memorizzata in un altro file, denominato EFEXT1. Normalmente non viene usato e viene messo ad “FF”. Per chiarire meglio il tutto, vi sottopongo il seguente esempio di record di un EFADN dove X=12: 53 65 67 72 65 74 65 72 69 61 FF FF 06 81 83 00 00 44 11 FF FF FF FF FF FF FF I più attenti dovrebbe risalire al nome ed al numero di telefono associato a questo record (se avete ancora dei dubbi, potete scrivermi). EFSMS L’EFSMS è un linear fixed file che contiene i brevi messaggi di testo (SMS) ricevuti e memorizzati nella SIM. Anche in questo caso, MODUGNO-impaginato 16-11-2004 10:29 Pagina 59 TUTORIAL la lettura e la scrittura è permessa solo dopo aver verificato il CHV1. Il record di questo file ha una lunghezza di 176 byte, strutturato come in Tabella 6. Il primo byte rappresenta lo stato del record. Se il bit meno significativo è nullo, quel record non è utilizzato. Se i tre bit meno significativi valgono 001, il record contiene un SMS ricevuto e letto; se valgono 011, si tratta di un SMS ricevuto ma ancora da leggere. È possibile memorizzare nella SIM anche SMS inviati alla rete ed in questo caso il byte di stato indicherà se l’SMS è già stato inviato, se è stata ottenuta la conferma di invio, ecc. Nel seguito ci soffermeremo solo sugli SMS ricevuti. Dal secondo byte viene memorizzato il numero del Centro Servizi, utilizzato dalla rete GSM per lo smistamento degli SMS. Come per il numero telefonico memorizzato in un record dell’EFADN, questo campo è for- mato da un byte che indica la lunghezza del numero (compreso il byte TON+NPI), un byte che indica il TON+NPI ed infine il numero vero e proprio in formato BCD. Questo campo può avere dimensione variabile, indicata in Tabella 6 con X. I byte rimanenti contengono il cosiddetto TPDU (Transfer Protocol Data Unit), cioè l’SMS opportunamente codificato per Byte Descrizione Lunghezza 1 Stato 1 da 2 a X+1 Numero Centro Servizi X da X+2 a 176 TPDU 175-X Tabella 6: Struttura di un record dell’EFSMS Byte Descrizione Lunghezza 1 Primo byte 1 2 Lunghezza in cifre del numero del mittente 1 da 3 a Y+2 Numero del mittente Y Y+3 Identificatore del protocollo 1 Y+4 Schema di codifica dei dati 1 da Y+5 a Y+11 Orario e data di invio 7 Y+12 Lunghezza dei dati utente (in caratteri) 1 da Y+13 a 175 Dati utente - Tabella 7: Struttura di un TPDU SMS-DELIVER TUTORIAL 59 MODUGNO-impaginato 16-11-2004 10:29 Pagina 60 TUTORIAL essere trasmesso o ricevuto dalla rete GSM. La struttura del TPDU non è per niente semplice, in quanto lo standard prevede numerosissimi parametri e possibilità, aumentate nel tempo con l’aggiunta di SMS concatenati, immagini, suonerie, ecc. In Tabella 7 è mostrata la struttura del più tipico TPDU denominato SMS-DELIVER, associato ad un SMS in entrata correttamente ricevuto. Anche in questo caso è inutile scendere troppo nei dettagli. Basti sapere che nel TPDU si trovano codificati il numero del mittente, la data e l’ora in cui il messaggio è stato inviato e preso in consegna dal Centro Servizi, nonché il messaggio vero e proprio (generalmente una stringa di testo). Il tutto si complica poiché lo standard prevede diverse codifiche dei dati (testo) ed anche una forma di compressione: la codifica usata nell’SMS è indicata nel byte Y+4. Nella maggior parte dei casi, tale byte vale “00” ed indica la codifica standard GSM. Un’altra complicazione è dovuta al fatto che il testo, memorizzato nell’ultimo campo, non è codificato come l’alphatagging di un record dell’EFADN visto in precedenza (fondamentalmente ASCII), ma è utilizzato un apposito algoritmo per trasformare la sequenza di caratteri (7 bit) in byte (8 bit). Chi volesse approfondire questo aspetto, può leggere il sorgente del programma in Visual Basic che verrà illustrato successivamente in questo articolo, oppure leggere direttamente i non semplici standard ETSI per gli SMS (riferimen- 60 TUTORIAL ti in bibliografia). ESPERIMENTI SVILUPPO DEL FIRMWARE PER UNIREADER Per verificare le potenzialità del nostro lettore con le smartcard a microprocessore, ho scritto un firmware che gestisce gli APDU inviati e ricevuti dalla carta asincrona. I comandi provengono, mediante collegamento seriale, da un computer. Il firmware è molto generico e può essere usato con una qualsiasi smartcard asincrona standard che utilizzi il protocollo di trasporto “T=0”. Come al solito, ho utilizzato il compilatore CC5X della B. Knudsen per la stesura del firmware in linguaggio C. Sul sito di Fare Elettronica, potete trovare sia il sorgente, da usare per eventuali modifiche o solo per scopi didattici, sia il file eseguibile per la programmazione del microcontrollore, all’interno del file compresso. Dopo la prima fase di inizializzazione in cui vengono impostate le direzioni dei pin, la modalità di funzionamento dell’UniReader per la gestione delle carte asincrone e la porta USART, si entra nel ciclo principale in cui il microcontrollore controlla alternativamente e continuamente la presenza di un byte nel buffer di ricezione della porta seriale ed un eventuale bit di start sul pin di I/O ISO7816. Ogni byte ricevuto dalla smartcard sarà automaticamente trasmesso, in binario, sulla seriale verso il PC. Per questo motivo non è possibile utilizzare un emulatore terminale, poiché i byte in binario verrebbero visualizzati come simboli non facilmente interpretabili. Sarà necessario sviluppare un software apposito per la comunicazione. I comandi provenienti da PC tramite seriale sono solo di tre tipi e terminano con il carattere di ritorno carrello “↵”: • “r↵”, che effettua il reset della smartcard ponendo la linea RST bassa; • “R↵”, che effettua il reset della smartcard ponendo la linea RST alta; • “xx↵”, dove xx rappresenta un byte in esadecimale che verrà trasmesso alla smartcard. Come al solito, all’accensione di UniReader sarà necessario inviare un segnale di reset per inizializzare la smartcard. Questa risponderà con l’ATR in corrispondenza del corretto livello di reset. Successivamente sarà possibile inviare i byte trasmettendoli in esadecimale ed intervallandoli dal carattere “↵”. SVILUPPO DEL SOFTWARE Ho sviluppato un software in Visual Basic, denominato SIMReader, che permette di automatizzare e semplificare tutte le operazioni che devono essere effettuate per la lettura dei dati di una carta SIM. Come al solito, potete trovare sul sito di Fare Elettronica sia il pacchetto con i sorgenti, sia il programma di installazione. In figura 2 è mostrata la schermata iniziale di SIMReader mediante la quale è possibile leggere il numero seriale della smartcard, normalmente stampigliato direttamente su di essa, e il MODUGNO-impaginato 16-11-2004 10:29 Pagina 61 TUTORIAL numero IMSI utilizzato durante la procedura di autenticazione alla rete GSM (vedi articolo precedente). Prima di tutto, però, è necessario impostare correttamente la porta seriale a cui è collegato l’UniReader (ovviamente il PIC16F628 del lettore deve essere programmato con il firmware UniReader_async.hex). Per fare ciò, basta cliccare sulla scheda delle “Impostazioni” e scegliere (o digitare) la porta seriale utilizzata. Inserite una SIM all’interno dell’UniReader, magari utilizzando l’apposito adattatore, e accendete il lettore. Ora è possibile premere i tasti “Leggi” in corrispondenza del numero seriale e del codice IMSI per ottenere questi codici dalla carta. Nella schermata denominata Rubrica (figura 3) è possibile leggere l’intero contenuto della rubrica memorizzata nella SIM. Per fare questo è sufficiente cliccare sul tasto “Leggi”. Se la comunicazione avviene correttamente, il software invierà alla SIM, tramite il lettore, gli appositi comandi per la selezione del file EFADN e per la lettura di tutti i record memorizzati. Potete salvare la rubrica così ottenuta cliccando sul tasto Salva: verrà creato, nella cartella di installazione del programma, il file di testo “rubrica.txt” che potrete consultare con un qualsiasi editor di testo (per esempio, Blocco Note). La schermata SMS (figura 4) può essere usata per la lettura degli SMS conservati nella SIM. Anche in questo caso, premendo il tasto “Leggi”, il software invierà tutti i comandi appositi per la selezione del file EFSMS e la lettura di tutti i record, estraendo per ognuno i campi più importanti: data/ora, mittente, centro servizi, testo. Sottolineo che solo gli SMS del tipo SMS-DELIVER sono corretta- Figura 2: Schermata iniziale di SIMReader Figura 4: Schermata di SIMReader per la lettura degli SMS Figura 3: Schermata di SIMReader per la lettura della rubrica Figura 5: Schermata di SIMReader per l’invio dei singoli comandi mente gestiti dal programma, mentre gli altri non saranno visualizzati. Per salvare gli SMS è possibile cliccare sul tasto “Salva” che creerà il file “sms.txt” sempre all’interno della cartella di installazione di SIMReader. La schermata che, però, reputo più importante di tutte è quella denominata genericamente Comandi (figura 5). Tramite questa è possibile resettare ed inviare un qualsiasi comando alla SIM o ad una generica smartcard ISO7816 asincrona. In questo modo potrete sperimentare di persona l’invio dei vari comandi alla SIM e ricavare ulteriori informazioni utili che, per motivi di spazio, non sono state commentate in questo articolo. Per evitare di bloccare la SIM, ho preferito non includere i comandi per l’inserimento del PIN. Per questo motivo, è necessario disabilitare il PIN mediante telefonino prima di utilizzarla con UniReader e SIMReader. In caso contrario, la SIM risponderà con un errore ad ogni tentativo di lettura protetto dal codice segreto. Naturalmente, se volete, potete completare il software aggiungendo i comandi necessari per l’inserimento del PIN, dopo averlo richiesto all’utente. Dopo aver utilizzato il programma SIMReader per comunicare con una SIM, potete consultare il file “log.txt”, nella cartella di installazione di SIMReader, in cui sono elencati tutti i comandi e le risposte inviate e ricevute dall’UniReader. È molto interessante per poter capire le informazioni scambiate durante le opera- TUTORIAL 61 MODUGNO-impaginato 16-11-2004 10:29 Pagina 62 TUTORIAL zioni di lettura IMSI, seriale, rubrica e SMS. SVILUPPI FUTURI Come al solito, anche in questo articolo non ho voluto presentare un sistema “chiavi in mano” da riutilizzare senza alcuna modifica. Piuttosto ho cercato di spiegare il funzionamento del sistema GSM relativamente alle SIM in modo che possiate personalizzare in ogni punto sia il firmware per UniReader, sia il software per PC. Le possibilità per incrementare le funzionalità del sistema sono veramente tante. Mi accontento di elencarvene qualcuna. Potete inserire nel software SIMReader la possibilità di specificare un PIN in modo che venga automaticamente inviato alla SIM senza dover necessariamente disabilitare tale protezione con un telefonino. Sarà necessario inviare correttamente il comando VERIFY CHV ed interpretarne la risposta. E’ un’operazione abbastanza delicata, poiché, se fatta in modo errato, potrebbe bloccare la SIM dopo tre tentativi. Verificate prima di possedere il relativo UNBLOCK CHV e che sia corretto e funzionante. Un’altra caratteristica che potete aggiungere alla vostra versione di SIMReader è quella di poter modificare, oltre che leggere, il contenuto della rubrica. Anziché inviare comandi READ RECORD, sarà necessario utilizzare il comando UPDATE RECORD. È importante, in questo caso, codificare il nome ed il numero di telefono così come descritto precedentemente ed inviare l’intera sequenza di byte insieme al comando. Si può pensare di 62 TUTORIAL avere una rubrica su PC ed una rubrica sulla SIM e di sincronizzare i dati mediante SIMReader. I più bravi potrebbero salvare i dati ricavati dalla SIM all’interno della rubrica di Windows o, al contrario, leggerli da questa per inviarli alla SIM. Salendo in ordine di difficoltà, potete anche modificare il contenuto degli SMS utilizzando sempre i comandi UPDATE RECORD anziché READ RECORD sul file EFSMS. Qualcuno potrebbe simulare un SMS mai ricevuto, con tanto di data e mittente, e leggerlo sul telefonino come un vero messaggio. La complessità è dovuta alla codifica dei vari campi dell’SMS, tra cui il testo, che è abbastanza contorta. Una attenta lettura degli standard ETSI è d’obbligo. Infine, potete cercare di estendere la decodifica degli SMS non solo per le tipologie SMS-DELIVER. Anche per questo, è necessario leggere attentamente gli standard relativi. STANCHI DI GIOCARE? Sono arrivato alla fine di questo lungo tutorial e spero di aver fornito a molti gli strumenti necessari per lo sviluppo di applicazioni basate su una qualsiasi tipologia di smartcard. Piuttosto che offrire una unica soluzione finita e limitata, ho preferito discutere su tutti gli aspetti di questo meraviglioso mondo dell’elettronica in modo che ognuno di voi possa autonomamente progettare e realizzare il sistema che più gli serve. Grazie ai molti che mi hanno scritto e continuano a scrivermi per i complimenti e le critiche. Non esitate a contattarmi per qualsiasi informazione o solo per darmi un vostro feedback su quanto avete letto. Un’affettuoso grazie anche a Mariangela per avermi corretto le bozze Se avete ancora dubbi o curiosità sul mondo delle smartcard, comunicatele: chissà, in futuro ci potrebbe essere una nuova… partita a carte! BIBLIOGRAFIA E LINK ETSI TS 100 977: Specification of the SIM-ME Interface. ETSI GSM 02.17: Subscriber Identity Modules, Functional Characteristics ETSI TS 123 038: Alphabets and language-specific information. ETSI TS 100 940: Mobile radio interface layer 3 specification. ETSI TS 124 011: Point-to-Point (PP) Short Message Service (SMS) Support on Mobile Radio Interface. ETSI TS 123 040: Technical realization of Short Message Service (SMS). ISO7816 parti 1, 2, 3, 4. ERRATA CORRIGE Nello schema elettrico dell’UniReader, pubblicato sul numero 231 di Settembre 2004, sono presenti due errori. I condensatori C8 e C10, relativi al MAX232, hanno le polarità invertite. Lo schema di montaggio è, invece, corretto. Grazie a Luca da Perugia che mi ha puntualmente fatto notare il problema. MODUGNO - SIM 8 5 19-04-2005 11:41 PRATICA Pagina 28 TEORIA RISORSE SPECIALE Sesta parte Le SIM: un esempio di smartcard a microprocessore Settima parte Applicazioni con le SIM Ottava parte Smartcard SIMCopier Q FARE ELETTRONICA - MAGGIO 2005 Pratica 28 uanti di voi hanno dovuto cambiare, per un motivo o per un altro, la propria SIM? Avevate perso la precedente, avete cambiato operatore telefonico, avete ricevuto una nuova SIM più potente e capiente dello stesso gestore. In tutti questi casi, vi sarete imbattuti in un noiosissimo problema: trasferire la vostra rubrica sulla nuova scheda. COMINCIAMO UNA NUOVA PARTITA A CARTE Cosa ci siamo detti negli articoli precedenti Come previsto nell’ultimo articolo del tutorial sulle smartcard, pubblicato in sette puntate su Fare Elettronica a partire dal n. 227 di Maggio 2004 al n. 234 del Dicembre 2004, si è presentata l’occasione per cominciare una nuova partita a carte, o meglio… a smartcard. In questo articolo, verranno utilizzati numerosi concetti già sviluppati nel corso delle precedenti puntate del tutorial. Qui farò solo un velocissimo riassunto. Come i miei lettori ormai sanno molto bene, una SIM non è altro che una smartcard asincrona a microprocessore utilizzata, tra le altre cose, per conservare alcuni dati utili all’utente (per esempio, la rubrica telefonica e gli SMS) e altri dati utili durante l’accesso alla rete (per esem- Smartcard pio, il gestore telefonico e il numero seriale della SIM, insieme alla chiave segreta utilizzata per l’autenticazione). Le SIM, come molte altre smartcard che seguono lo standard ISO7816-4, presentano un’interfaccia con l’esterno che mostra una organizzazione razionale dei dati sotto forma di un file-system, formato da EF (Elementary File) e DF (Dedicated File). I primi sono paragonabili ai file presenti in un normale hard-disk di un PC, mentre i secondi possono essere accomunati alle cartelle o directory. Tutti questi file sono organizzati ad albero, così come nella maggior parte dei sistemi operativi che abitualmente utilizziamo sui nostri computer, a partire da una cartella principale denominata MF (Master File). Così come nel buon vecchio DOS, oltre che nei molti sistemi operativi che mettono a disposizione shell di comandi, è possibile “navigare” all’interno di questo file system mediante appositi comandi da inviare alla SIM. Questi e gli altri comandi sono definiti in seno agli innumerevoli standard GSM emanati dall’ETSI (a tal proposito, si veda la bibliografia a fine articolo). Per esempio, il comando definito SELECT FILE permette di cambiare la “cartella corrente”, indicandone l’identificativo di due byte, in modo simile al comando CD del DOS. Sempre con lo stesso comando, è possibile selezionare un EF per poi leggerlo e/o scriverlo. Gli standard GSM definiscono alcuni EF e DF, il loro significato, la loro posizione nell’albero. Per esempio, l’EF denominato ADN ed indicato come EFADN è un file che si trova all’interno del DFTELECOM che, a sua volta, è contenuto nell’MF. Questo file è quello che contiene la rubrica all’interno della nostra SIM. Si tratta di un file basato su record, in cui ogni record rappresenta un nome in rubrica. Il numero e la dimensione di un record possono cambia- MODUGNO - SIM 8 5 19-04-2005 11:41 Pagina 29 di Giuseppe Modugno [email protected] SIMCopier re a seconda della capacità di memorizzazione della SIM fornita dal nostro operatore: più recente è la SIM, più numeri avremo a disposizione in rubrica e più lunghi saranno i nomi memorizzabili. La composizione di un singolo record dell’EFADN è mostrata in figura 1. 29 FARE ELETTRONICA - MAGGIO 2005 Figura 1 Rappresentazione di un record del file EFADN INTRODUZIONE L’Idea Poco tempo fa ho accettato una proposta del mio operatore di telefonia mobile che mi invitava a sostituire la mia vecchia SIM GSM (100 numeri in rubrica da 12 caratteri e 10 SMS) con un’altra moderna e più capiente (250 numeri in rubrica da 18 caratteri e 50 SMS). Ovviamente i vantaggi della nuova SIM non si limitano alla capacità di memorizzazione ma, ai fini di questo articolo, è quello che ci interessa maggiormente. Deciso ad effettuare questa conversione di scheda, mi reco in un punto vendita autorizzato dove mi forniscono la nuova e fiammante SIM che sarebbe stata abilitata dopo qualche ora. La simpatica addetta mi chiede se volessi fare il trasferimento automatico della rubrica sulla nuova SIM, cosa che ha subito stimolato la mia curiosità. Alla mia risposta affermativa, la commessa inserisce in un piccolo apparecchio da tavolo, utilizzando gli appositi adattatori per le carte SIM, la mia vecchia SIM e la nuova, digita, tramite apposita tastiera, i due PIN e avvia l’operazione. Dopo qualche minuto, tutta sorridente mi riconsegna entrambe le SIM. Inutile dire che la mia rubrica era stata effettivamente copiata sulla nuova SIM, in modo indolore. Naturalmente, l’idea di progettare un apparato simile che mi permettesse di copiare la rubrica delle SIM m’è venuta immediatamente, portandomi alla realizzazione del SIMCopier e, ovviamente, a questo articolo. Pratica Il primo campo, la cui dimensione dipende dalle caratteristiche della SIM, è definito alpha-identifier ed è utilizzato per la memorizzazione del nome associato al numero telefonico. Gli altri campi del record, di lunghezza complessiva pari a 14 byte, conservano altre importanti informazioni associate ad un numero telefonico, tra cui il numero stesso. A chi volesse maggiori dettagli su questo e sugli altri file presenti in una SIM, consiglio di leggere la parte VI e VII del tutorial o di leggere gli standard relativi. La dimensione totale del record, da cui si può ricavare la lunghezza massima dei nomi, sottraendo 14, e il numero dei record possono essere ricavati dalla risposta al comando GET RESPONSE subito dopo aver selezionato il file EFADN. Così come un telefonino, anche un lettore di smartcard può accedere al file-system contenuto nella SIM, selezionare i file e leggere/scrivere il contenuto. Per un file basato su record, esistono due comandi utilizzati per la lettura e la scrittura: READ RECORD e UPDATE RECORD. In entrambi i casi, l’operazione avviene con successo solo se è soddisfatta la condizione d’accesso, cioè se è già stato inserito il CHV1 (PIN), se questi è abilitato. In caso contrario, prima di poter leggere e/o scrivere i record in rubrica, sarà necessario procedere all’inserimento del PIN, mediante il comando VERIFY CHV. MODUGNO - SIM 8 5 19-04-2005 11:41 PRATICA Ottava parte FARE ELETTRONICA - MAGGIO 2005 Pratica 30 Pagina 30 TEORIA RISORSE SPECIALE Smartcard: SIMCopier Descrizione Cos’è dunque questo SIMCopier? Dal nome stesso, si intuisce subito che si tratta di un circuito che effettua la copia di una SIM. Tecnicamente quello che viene copiato è il solo file EFADN che contiene la rubrica telefonica. Ciò può essere utile in numerosissime situazioni. Per esempio, come nel mio caso, quando si vuole utilizzare una SIM più capiente dello stesso operatore. Ma questa è solo una delle possibili situazioni in cui il SIMCopier può rivelarsi utile. Esso può essere un toccasana quando perdete la vostra SIM: avendo fatto in precedenza la copia della rubrica mediante SIMCopier, potete tranquillamente recuperarla dalla SIM di backup. Ancora, se volete cambiare operatore potete trasferire la rubrica dalla vecchia SIM del vostro Figura 2 Schema elettrico precedente gestore alla SIM del nuovo operatore telefonico. Il SIMCopier è, infatti, compatibile con tutte le SIM, indipendentemente dall’operatore e può effettuare la copia della rubrica tra due SIM di diversi gestori. La scheda che dovremo progettare sarà quindi formata almeno da due connettori per smartcard, un tasto e qualche led di indicazione. Un connettore ospiterà la SIM sorgente, quella che contiene la rubrica da copiare, l’altro verrà utilizzato per la SIM destinazione, dove la rubrica verrà copiata. Uno dei problemi che ho dovuto affrontare è stato quello relativo all’inserimento del PIN. Come tutti voi sapete, per poter accedere alla rubrica della vostra SIM, sia in lettura che in scrittura, è necessario conoscere ed inserire il MODUGNO - SIM 8 5 19-04-2005 11:42 Pagina 31 (SOURCE) e destinazione (DESTINATION), alimentare il SIMCopier e premere il tasto di avvio copia (COPY). SCHEMA ELETTRICO Lo schema elettrico del SIMCopier è mostrato in figura 2. La sezione di alimentazione (in basso nello schema elettrico) è formata dal solito regolatore lineare di tensione 7805 (IC3), che permette di avere, in uscita, una tensione continua stabilizzata a 5V, che servirà per alimentare tutti gli integrati e le smartcard del circuito. La tensione d’ingresso dovrà essere applicata al comunissimo connettore J1, molto spesso già presente negli alimentatori a muro. Questa tensione non dovrà essere necessariamente stabilizzata, poiché sarà il regolatore 7805 a mantenerla costante. Si può quindi usare un semplice trasformatore seguito da un 31 Pratica PIN corretto. Questo avrebbe complicato notevolmente il prototipo, poiché avrei dovuto prevedere almeno un display ed un tastierino numerico, mentre la mia idea era quella di un copiatore di SIM veramente compatto e semplice. Così ho sfruttato la possibilità di disabilitare il PIN, per esempio tramite un qualsiasi telefonino (dall’apposito menu sulle impostazioni della sicurezza) oppure tramite un lettore di smartcard (come l’UniReader proposto nella parte III del tutorial), inviando l’apposito comando DISABLE CHV. Quindi, per poter effettuare la copia della rubrica con il nostro SIMCopier, sarà necessario prima di tutto disabilitare, su entrambe le schede, il PIN. Fatto questo, sarà sufficiente inserire le due SIM all’interno dei rispettivi connettori, rispettando la posizione della SIM sorgente S.V.M. ELETTRONICA Vendita per corrispondenza Tel./Fax 0331/640569 Caratteristiche tecniche e vendita on-line www.svmelettronica.com INVERTER 12VDC/220VAC WHS150W-12 €. 40,00 WHS200W-12 €. 45,00 WHS300W-12 €. 52,00 Sistema di videosorveglianza wireless operante sulla banda dei 2,4GHz composto da 4 telecamere a colori da esterno con illuminatore IR a 12 LED, e da un ricevitore multicanale con switcher e telecomando. SOFT-START WHS400W-12 WHS600W-12 €. 60,00 €. 95,00 Navigatore Mio268 Sw Italia SD 256Mb SW Italiano. COD. RC268I €. 422,00 Kit telecamera 1/3CMOS waterproof a colori + ricevitore senza fili con illuminatore IR operante sulla banda dei 2.4GHz.il kit include telec., ricev. a 4 canali e alimentatori. Multimetro digitale con ingressi protetti COD. TE/6300E €. 48,00 COD. 37/150 €. 115,00 Tutti i prezzi si intendono IVA inclusa. FARE ELETTRONICA - MAGGIO 2005 COD. 37/310 €. 360.00 MODUGNO - SIM 8 5 19-04-2005 11:42 PRATICA Ottava parte Pratica 32 TEORIA RISORSE SPECIALE Smartcard: SIMCopier ponte di diodi. La tensione minima necessaria per far funzionare correttamente il 7805 è di circa 8V, ma può essere aumentata anche fino a 24V. Il polo positivo del connettore J1 è quello centrale. Il diodo D2 è utilizzato per bloccare la corrente nel caso in cui la tensione di ingresso venisse applicata con polarità opposta. Il led verde DL1 è collegato direttamente alla 5V, quindi si accende non appena viene data alimentazione al circuito. Esso può essere utilizzato per controllare il corretto funzionamento della sezione di alimentazione del SIMCopier. Come si può osservare, il cuore di tutto il circuito è rappresentato dall’integrato PIC16F628 (IC1), cioè un diffusissimo microcontrollore a 8 bit della Microchip con memoria Flash da 2048 istruzioni per il codice, 128 byte di EEPROM e 224 byte di RAM. È lo stesso microcontrollore utilizzato nel lettore di smartcard UniReader, anche se in modo diverso. In questo caso, infatti, il clock necessario al micro per la corretta esecuzione del programma proviene da un oscillatore esterno formato dall’integrato Numero FARE ELETTRONICA - MAGGIO 2005 Pagina 32 Nome Direzione 74HC00 (IC2), dal quarzo a 3.579MHz (Q1), dai due condensatori C1 e C2 e dalla resistenza R1. La strana frequenza utilizzata, tipicamente presente nei lettori di smartcard, permette una comunicazione seriale con la carta alla velocità standard di 9600bps (per una esauriente spiegazione si rimanda alla parte III del tutorial). Per questo motivo, il clock generato dall’oscillatore pilota non solo il microcontrollore, ma anche le due smartcard. Naturalmente in fase di programmazione del PIC, sarà necessario impostare la parola di configurazione sulla modalità EC (External Clock). In questa modalità, verrà disabilitato l’oscillatore interno del microcontrollore ed utilizzato il clock presente al pin CLKIN (pin 16). Gli ingressi delle porte NAND non utilizzate del 74HC00 sono collegate a massa per evitare di lasciarle in condizione di alta impedenza. La sezione formata dal condensatore C10, dalle resistenze R2 e R8 e dal diodo D1, forma il circuito di reset del microcontrollore. Il PIC necessita di un livello alto sul pin MCLR (Master Descrizione C1 VCC I Alimentazione della smartcard, normalmente a 5V, anche se sono previste alimentazioni a tensioni inferiori (3V o meno) C2 RST I Linea di reset utilizzata dal dispositivo di lettura per inizializzare la scheda, prima di un qualsiasi trasferimento di dati C3 CLK I Linea utilizzata per fornire il clock ai circuiti sequenziali integrati nella smartcard (carte asincrone), oppure per lo scambio dei dati (carte sincrone) C4 RFU C5 GND Riservata per usi futuri I Massa C6 VPP I Tensione di programmazione, eventualmente utilizzata per la programmazione (cancellazione/scrittura) della memoria non volatile integrata nella smartcard (EEPROM, Flash) C7 I/O I/O Linea bidirezionale utilizzata per lo scambio dei dati tra smartcard e dispositivo di lettura C8 RFU Tabella 1 Riservata per usi futuri Gli 8 contatti di una smartcard ISO7816 (la direzione è relativa alla smartcard) MODUGNO - SIM 8 5 19-04-2005 11:42 Pagina 33 to un solo deviatore, collegato al PIC, in modo che il pin relativo venga messo a massa alla pressione del tasto. Quando il tasto non è premuto, il pin viene portato a livello alto grazie alla resistenza di pull-up interna al microcontrollore. Non è un caso, infatti, che ho collegato il tasto al pin RB0, in quanto per questo, e per tutti gli altri pin della porta B, possono essere abilitati dei pull-up via software (in particolare, mettendo a 0 il bit 7 del registro OPTION). È bene ricordare, però, che è possibile abilitare o disabilitare i pull-up su tutti i pin della porta B contemporaneamente (in altre parole, non è possibile, per esempio, abilitare un pull-up su RB0 e disabilitarlo su RB4). I led DL2 e DL3 sono collegati direttamente ad un pin del PIC, tramite le resistenze di limitazione della corrente R4 e R5, e sono utilizzati come 33 Pratica Clear) per poter iniziare l’esecuzone del programma memorizzato in Flash. All’accensione del circuito, il livello di tensione su questo pin sale lentamente seguendo la legge di carica del condensatore C10, limitata solo dalla resistenza R2. Questo permette di ritardare l’esecuzione del programma da parte del PIC in modo che il clock generato dall’oscillatore si stabilizzi. Il diodo D1, invece, forma un “canale veloce” di scarica del condensatore C10, quando viene tolta l’alimentazione al circuito. In questo modo, il microcontrollore viene immediatamente resettato per riprendere l’esecuzione non appena l’alimentazione ritorna a 5V. Il tasto T1, collegato direttamente ad un pin del micro, viene utilizzato per iniziare la copia della rubrica. Quello utilizzato nel nostro prototipo è un tasto momentaneo che sposta, premendolo, due deviatori. Nel nostro circuito, viene utilizza- FARE ELETTRONICA - MAGGIO 2005 MODUGNO - SIM 8 5 19-04-2005 PRATICA Ottava parte FARE ELETTRONICA - MAGGIO 2005 Pratica 34 11:42 Pagina 34 TEORIA RISORSE SPECIALE Smartcard: SIMCopier segnalazione di presenza SIM. L’accensione del led DL2 indica la presenza di una SIM nello slot destinazione; l’accensione di DL3 indica la presenza di una SIM nello slot sorgente. In questo modo, prima di iniziare la copia premendo l’apposito tasto, è possibile accertarsi che le due SIM siano correttamente inserite nei rispettivi connettori. Ciò è molto importante soprattutto se utilizziamo, come molto probabilmente accadrà, degli adattatori per SIM che, se di scarsa qualità, potrebbero non effettuare un buon contatto tra i pin delle carte e i pin del connettore. I led potranno essere accesi via software semplicemente mettendo ad 1 l’uscita della porta relativa (RA2 per DL2 e RA3 per DL3). Ricordo che tale collegamento può essere fatto poiché il PIC16F628, come molti altri PIC, riesce a fornire delle correnti di source (in uscita dal pin) anche di Figura 3 Diagramma di flusso del firmware relativo alla rilevazione della presenza di una SIM 25mA, corrente sufficiente per l’accensione del led. Il componente DL4 è un bi-led, formato cioè da un led verde ed un led rosso connessi a catodo comune. È possibile accenderli singolarmente oppure contemporaneamente producendo, in quest’ultimo caso, un colore simile al giallo. Entrambi i led sono collegati, così come per DL2 e DL3, ad un pin del microcontrollore e sono usati per indicare lo stato di avanzamento della copia. Alla pressione del tasto e durante la copia, vengono accesi entrambi i led (portando a livello alto il pin RA0 e RA1). Se la copia viene terminata con successo, viene acceso solo il led verde; se, invece, viene riscontrato qualche errore (per esempio, una delle SIM ha il PIN abilitato), viene acceso solo il led rosso. L’ultima sezione del circuito riguarda l’interfacciamento tra i due connettori per smartcard ed il microcontrollore. Come per l’UniReader, ho utilizzato uno slot ISO7816 dotato di un interruttore normalmente chiuso che si apre all’inserimento di una smartcard. Quindi, ogni connettore ha 10 pin: 8 rappresentano i contatti della smartcard (C1-C8) e due rappresentano quelli dell’interruttore (SW1 e SW2). Così come per il tasto T1, gli interruttori dei due slot sono collegati direttamente ad un pin del micro. Normalmente tali pin sono a livello basso, poiché connessi direttamente a massa tramite l’interruttore; inserendo una smartcard, l’interruttore si apre ed il pin si porta a livello alto grazie ai soliti pull-up interni. Infatti, i pin utilizzati, RB4 e RB5, appartengono alla porta B. In questo modo, il microcontrollore può accorgersi dell’inserimento o disinserimento di una smartcard. Gli 8 contatti di una generica smartcard sono elencati in tabella 1. Di questi, solo 6 sono specificati dagli standard ISO, mentre gli altri due contatti (C4 e C8) sono riservati per usi futuri. Inoltre, nelle SIM anche il contatto Vpp (C6) non viene utilizzato e quindi è lasciato non connesso nel SIMCopier. Il pin CLK (C3), come detto precedentemente, è collegato all’uscita dell’oscillatore e fornisce alla carta a micropro- MODUGNO - SIM 8 5 19-04-2005 11:42 Pagina 35 Rilevare la presenza di una SIM Il compito che si prevedeva più semplice è diventato un pò più complicato del previsto. Infatti, inizialmente avevo pensato di rilevare la presenza di una SIM inserita in uno slot, monitorando lo stato dell’interruttore integrato nel connettore. Dopo qualche tentativo, però, mi sono reso conto che questa idea non era molto funzionale: cosa succede se viene inserita una smartcard diversa da una SIM o, addirittura, l’adattatore per le SIM privo della scheda? Poiché l’interruttore è meccanico, questo rileverebbe comunque la presenza di una SIM! Ho risolto questo problema complicando leggermente questo controllo di rilevazione presenza, così come mostrato nel diagramma di flusso in figura 3. Figura 4 Diagramma di flusso relativo alla selezione dei file Oltre a controllare che l’interruttore sia aperto, cioè che una smartcard (o qualcosa di simile) sia stata inserita nel connettore, il firm-ware prova a generare una condizione di Reset mediante il pin RST. Com’è noto (si veda la parte III del tutorial), una smartcard risponde alla condizione di Reset con l’ATR (Answer To Reset, risposta al Reset). Controllando la validità di questa risposta, che rispetta certe regole, il microcontrollore può decidere con assoluta certezza se la “cosa” inserita nello zoccolo è effettivamente una SIM correttamente comunicante oppure no. Nel primo caso, viene acceso il led relativo. Naturalmente questo controllo viene fatto ciclicamente sia per la SIM sorgente che per la SIM destinazione. 35 FARE ELETTRONICA - MAGGIO 2005 FIRMWARE Ovviamente, quando c’è di mezzo un microcontrollore, non basta disegnare lo schema elettrico, ma è anche necessario scrivere un firmware. Nel caso del SIMCopier, il programma in esecuzione nel PIC dovrà rilevare la presenza delle SIM all’interno dei connettori e aspettare la pressione del tasto. Successivamente, dovrà trasmet- tere gli opportuni comandi alle due SIM per effettuare la copia della rubrica, cioè di ogni record presente all’interno del file EFADN. Pratica cessore il segnale di clock necessario per il corretto funzionamento. A parte i contatti di alimentazione (C1, collegato direttamente a 5V) e di massa (C5, collegato direttamente a massa), rimangono i due pin RST (C2) e I/O (C7). Entrambi vengono utilizzati per lo scambio dei dati con il dispositivo di interfacciamento. Il primo rappresenta un ingresso per la smartcard e viene utilizzato per generare la condizione di Reset che porta la SIM al suo funzionamento, così come avviene con il Reset di un microcontrollore (non dimentichiamo che, tutto sommato, all’interno di una SIM c’è proprio un microprocessore). Nel SIMCopier il pin RST di entrambe le smartcard è collegato ad un pin del PIC (RB6 e RB3) che, via software, può generare la condizione di Reset. Il pin I/O è il canale di comunicazione vero e proprio tra smartcard e lettore: attraverso questo contatto, i due dispositivi si scambiano le informazioni. Essendo un unico contatto, esso è bidirezionale ed è anch’esso collegato ad un pin del micro per entrambi i connettori (RB1 e RB7). I condensatori da 100nF C3, C8, C9, C11 sono utilizzati come vie di fuga per eventuali disturbi o variazioni veloci dell’alimentazione. Per questo sono stati posizionati, sul PCB, il più vicino possibile al componente di riferimento. MODUGNO - SIM 8 5 19-04-2005 PRATICA Ottava parte 11:42 Pagina 36 TEORIA RISORSE SPECIALE Smartcard: SIMCopier Pratica 36 FARE ELETTRONICA - MAGGIO 2005 Figura 5 Esempio di copia di un record tra due SIM di dimensione differente Copiare la rubrica Nella routine principale del firmware, oltre a controllare la presenza delle SIM, viene anche controllata la pressione del tasto che fa partire la procedura di copia della rubrica. Se il tasto viene premuto e le due SIM sono entrambe presenti nei rispettivi connettori, la copia ha effettivamente inizio. Come abbiamo già detto all’inizio dell’articolo, la rubrica si trova memorizzata all’interno del file EFADN, contenuto nel DFTELECOM contenuto, a sua volta, nell’MF. Prima di poter leggere o scrivere un qualsiasi EF, è necessario selezionarlo mediante l’apposito comando SELECT FILE. Tenendo presente le regole di selezione dei file, per poter selezionare l’EFADN, è necessario selezionare prima il DFTELECOM (non è necessario selezionare l’MF poiché automaticamente selezionato dopo un Reset). Dopo aver selezionato il file EFADN, ne viene letto l’header mediante il comando GET RESPONSE. Analizzando la risposta a quest’ultimo comando, è possibile conoscere numerose Figura 6 Diagramma di flusso relativo alla copia dei record della rubrica MODUGNO - SIM 8 5 19-04-2005 11:42 Pagina 37 informazioni sul file appena selezionato. Nel nostro caso, ci interessa sapere il numero dei record presenti nel file e la loro dimensione: infatti, questi due valori possono cambiare a seconda della capacità di memorizzazione della SIM. Per essere precisi, nell’header di un file basato su record vengono indicati il numero dei record e la dimensione totale del file; per conoscere la dimensione di un singolo record, è necessario dividere la dimensione totale del file per il numero dei record. Gli stessi comandi inviati alla SIM sorgente vengono inviati anche alla SIM destinazione. Questa parte del firmware è rappresentata nel diagramma di flusso in figura 4. 37 Pratica Quest’ultima parte del firmware è rappresentata sotto forma di diagramma di flusso in figura 6. Alla fine dell’operazione di copia, verrà acceso solo il led verde di DL4 per mostrare l’avvenuta copia. Se, per un qualsiasi motivo, c’è un problema durante la copia dei record, il firmware si blocca e viene acceso il solo led rosso di DL4 ad indicazione dell’errore. REALIZZAZIONE PROTOTIPO Montaggio Ho sbrogliato lo schema elettrico precedentemente descritto su un circuito delle dimensioni di 10x8 cm (mezza eurocard). In figura 7 è mostrato il solo lato rame con le piste, le piazzole ed i fori in scala 1:1. Utilizzando questa figura, potete realizzare il circuito stampato del SIMCopier, avvalendovi del solito sistema di fotoincisione o di altro equivalente. Una volta realizzato il circuito FARE ELETTRONICA - MAGGIO 2005 L’ultima parte del programma riguarda la copia di tutti i record dalla SIM sorgente alla SIM destinazione, mediante i comandi READ RECORD e UPDATE RECORD. Si tratta semplicemente di effettuare un ciclo su tutti i record della SIM sorgente, a cui viene inviato il comando READ RECORD ed il comando UPDATE RECORD alla SIM destinazione. Ma anche questa apparente semplice operazione nasconde alcune difficoltà, dovute al fatto che la capacità di memorizzazione delle due SIM può essere diversa. Prima di tutto, potrebbe essere diverso il numero dei record. È facile trovare in giro SIM che riescono a memorizzare 100 o 250 nomi in rubrica. Cosa succede se due schede diverse vengono utilizzate nel SIMCopier? L’unica soluzione che ho trovato è quella di copiare al massimo il numero di record ospitabili nella SIM destinazione. In altre parole, se la SIM sorgente ha 100 record in rubrica e la SIM destinazione 250, verranno copiati tutti i 100 record nelle prime posizioni della rubrica della SIM destinazione. Al contrario, se la SIM sorgente memorizza 250 record e la SIM destinazione solo 100, verranno copiati solo i primi 100 record della SIM sorgente! È come se si volesse copiare il contenuto di un DVD su un CD: al massimo, si potrà solo copiare una parte. Il secondo problema riguarda la dimensione di un singolo record, anche questa variabile a seconda della capacità di memorizzazione della SIM. Cosa succede se il record della SIM sorgente è più grande o più piccolo di quello della SIM destinazione? Come già detto precedentemente (vedi figura 1), il campo di dimensione variabile è quello relativo al nome associato al numero telefonico: i restanti 14 byte del record sono fissi e conservano, tra l’altro, il numero telefonico. Per poter adattare un record dalla SIM sorgente alla SIM destinazione, è possibile manipolare solo il primo “campo anagrafico”. Così, se il record della SIM sorgente è più piccolo, verrà allungato lo spazio relativo al nome aggiungendo dei byte di riempimento (FF in esadecimale, così come da normative). Al contrario, se il record sorgente è più grande del record destinazione, il nome verrà opportunamente troncato. Questa operazione è illustrata schematicamente in figura 5, nel caso di un record di dimensione pari a 26 e 29 byte (12 e 15 caratteri per nomi). MODUGNO - SIM 8 5 19-04-2005 11:42 Pagina 38 PRATICA Ottava parte TEORIA Pratica FARE ELETTRONICA - MAGGIO 2005 Sigla Valore C1, C2 Condensatore 22pF C3, C4, C5, 8, C9, C11 Condensatore 100nF C6, C7 Condensatore elettrolitico 10µF C10 Condensatore elettrolitico 1µF D1 Diodo 1N4148 D2 Diodo 1N4004 o equivalente DL1, DL2, L3 Diodo led verde 3mm DL4 Diodo led bicolore rosso-verde 3mm IC1 Microcontrollore PIC16F628A IC2 74HC00 IC3 7805 Q1 Quarzo 3.579MHz R1 Resistenza 1MΩ R2 Resistenza 4.7kΩ R3, R4, R5, R6, R7 Resistenza 330Ω R8 Resistenza 100Ω S1 Deviatore per circuito stampato a levetta T1 Tasto momentaneo due deviatori 4 contatti J1 Connettore per alimentazione J2, J3 Connettore ISO7816 con interruttore normalmente chiuso Tabella 2 SPECIALE Smartcard: SIMCopier Elenco componenti 38 RISORSE Elenco componenti stampato, potete passare al montaggio dei vari componenti, aiutandovi con lo schema di montaggio illustrato in figura 8 e con l’elenco componenti in tabella 2. Il SIMCopier non presenta particolari difficoltà di montaggio. Iniziate come al solito con i componenti a basso profilo: ponticelli, resistenze, diodi, zoccoli e connettori. Per una pura questione estetica, ho preferito localizzare tutti i ponticelli sotto altri componenti in modo che potessero essere nascosti. È consigliabile saldare subito i ponticelli e successivamente i componenti che li nascondono. Ce ne sono tre sotto lo zoccolo della SIM sorgente (J3), quattro sotto lo zoccolo della SIM destinazione (J2) ed uno sotto il microcontrollore (IC1). Proseguite con i componenti a più alto profilo, quali i condensatori, i led, il quarzo, il 7805 e il deviatore dell’alimentazione. Infine, inserite l’integrato 74HC00 e il PIC16F628 nei rispettivi zoccoli. Ovviamente il PIC va precedentemente programmato con l’apposito file eseguibile che trovate sul sito di Fare Elettronica nelle pagine relative a questo articolo. Il file eseguibile si chiama SIMCopier.hex che potete utilizzare con il software che normalmente usate per la programmazione dei PIC. La parola di configurazione è memorizzata all’interno del file eseguibile, quindi non dovreste fare nulla di più che caricare il file e scaricarlo nella memoria Flash del microcontrollore. Nel caso il vostro programma non legga correttamente la parola di configurazione all’interno del file eseguibile, dovete abilitare i bit PWRT (PoWeR up Timer), BODEN (Brown Out Detect ENable) e MCLRE (Master Clear Enable), impostare come funzionamento dell’oscillatore un clock esterno (EC, External Clock) e scegliere come volete i bit per la protezione dalla lettura del codice. In figura 9 è mostrata la finestra di ICProg, un noto software freeware utilizzato per la programmazione dei PIC, in cui sono mostrati anche i bit di configurazione. Alla fine del montaggio, vi consiglio di etichettare i due connettori per le SIM come SOURCE (sorgente) e DESTINATION (destinazione), in modo che non possiate confonder- MODUGNO - SIM 8 5 19-04-2005 11:42 Pagina 39 li. Tenete presente che, se invertite le SIM, otterrete la sovrascrittura, quindi la perdita, della SIM che, invece, volevate duplicare. Nel mio prototipo ho applicato una etichetta anche al tasto per indicarne il funzionamento. Il risultato è quello che vedete in figura 10. FARE ELETTRONICA - MAGGIO 2005 Figura 8 Piano di montaggio 39 Pratica Figura 7 Circuito stampato in scala 1:1 (lato rame) Funzionamento Il funzionamento del circuito è molto semplice ed è stato già descritto tra le righe. Non appena alimentate il circuito, dovrà accendersi il led verde relativo all’alimentazione, indicando la corretta presenza della tensione 5V. Se inserite una SIM all’interno dei connettori ISO7816, il led relativo si accenderà ad indicare che il microcontrollore comunica correttamente con la scheda. Se provate ad inserire una carta a banda magnetica o una smartcard diversa da una SIM, il microcontrollore non riuscirà a comunicare con la scheda ed il led rimarrà spento. Ricordate di disabilitare il PIN su entrambe le SIM prima di inserirle nel SIMCopier. In caso contrario, i led di stato si accenderanno ugualmente, ma la procedura di copia terminerà con un errore. Dopo aver inserito le due SIM e, quindi, dopo l’accensione dei due led di stato, potete iniziare la procedura di copia premendo il tasto. Il led bicolore diventerà giallo durante tutta l’operazione mentre i led di stato delle SIM cominceranno a lampeggiare: ad ogni comandi READ RECORD verrà acceso il led relativo alla SIM sorgente, mentre ad ogni comando UPDATE RECORD verrà acceso il led relativo alla SIM destinazione. Dopo qualche decina di secondi, la copia termina, lasciando i due led di stato delle SIM spenti e il led bicolore acceso: rosso (copia fallita) o verde (copia effettuata con successo). A questo punto, potete spegnere il SIMCopier ed inserire le SIM in un telefonino per verificare l’av- MODUGNO - SIM 8 5 19-04-2005 11:42 Pagina 40 PRATICA Ottava parte TEORIA RISORSE SPECIALE Smartcard: SIMCopier essere sempre letto e/o scritto. E allora perché non utilizzare quella vecchia SIM buttata in un cassetto come backup della vostra rubrica? Questa semplice operazione potrebbe risultare molto utile nel caso in cui smarrite o distruggete la SIM che utilizzate. È bene precisare che il SIMCopier duplica la rubrica presente all’interno di una SIM e non quella eventualmente presente nella memoria del telefono. Pratica 40 Figura 9 Finestra del programma ICProg venuta copia. Se è il caso, ricordate di riabilitare il PIN. FARE ELETTRONICA - MAGGIO 2005 STANCHI DI GIOCARE? Faccio notare che la SIM destinazione può essere tranquillamente una vecchia SIM che avete dimenticato da qualche parte e che è stata disabilitata dal gestore telefonico. Non è importante, ai fini della copia della rubrica, che la SIM sia abilitata alle telefonate, poiché il contenuto del file della rubrica può comunque Sviluppi futuri Il SIMCopier è nato solo per curiosità e non si può certo ritenere un prodotto completo o paragonabile ad apparati commerciali che fanno la stessa cosa. Chi volesse ampliarne le caratteristiche potrebbe pensare di aggiungere un tastierino numerico ed un display. In questo modo, sarebbe possibile inserire direttamente il PIN delle SIM senza doverlo disabilitare prima di utilizzarle. Inoltre, il display permetterebbe di avere maggiori informazioni sullo stato di avanzamento della copia: per esempio, è possibile visualizzare il numero dei record di entrambe le SIM, la lunghezza di un nome in rubrica, eventuali errori, ecc. Un’altra possibilità molto interessante è quella di copiare non soltanto il contenuto del file EFADN, ma anche quello del file EFSMS che conserva gli SMS. Ringraziamenti Desidero ringraziare l’amico Giuseppe de Gennaro per il grande aiuto che mi ha dato durante lo sbroglio e la realizzazione del prototipo. Figura 10 Foto del prototipo BIBLIOGRAFIA ETSI TS 100 977: Specification of the SIM-ME Interface. ETSI GSM 02.17: Subscriber Identity Modules, Functional Characteristics ISO7816 parti 1, 2, 3, 4.