Java card


Le JavaCard sono dei particolari tipi di smart card che presentano una serie di caratteristiche che le rendono estremamente competitive. Queste sono:

  • Indipendenza dalla piattaforma: un’applicazione per Java Card (Java Card Applet) può essere utilizzata senza modifiche su Java Card fornite da costruttori diversi;

  • Supporto a più applicazioni: su una stessa JavaCard possono coesistere diverse Java Card Applet indipendenti fra loro e selezionabili singolarmente in fase di esecuzione;

  • Caricamento di nuove applicazioni dopo la consegna: dopo che una Java Card è stata consegnata all’utente finale, è ancora possibile procedere al caricamento di nuove applicazioni attraverso gli IFD

  • Flessibilità: il linguaggio utilizzato per programmare le JavaCard è un subset del linguaggio Java, quindi la programmazione può sfruttare il paradigma della programmazione ad oggetti;
  • Compatibilità con gli standard delle SmartCard: le JavaCard sono compatibili con lo standard ISO 7816.
  • L'infrastruttura di una JavaCard è descritta dalla seguente figura.

    Figura 1 - infrastruttura Java Card

    Analizziamo singolarmente le varie parti:

  • Metodi Nativi: sono i metodi che forniscono le funzionalità di I/O, le funzionalità crittografiche e i servizi di allocazione della memoria;

  • JCVM (Java Card Virtual Machine): è l’entità che si occupa dell’interpretazione del bytecode Java Card e che fornisce il supporto al linguaggio. Questa è in pratica un interprete del subset del linguaggio Java utilizzato in ambiente Java Card;

  • Framework: è l’insieme delle classi che implementano l’API Java Card. Esso include sia i package standard sia le eventuali estensioni. Questo componente provvede infine alla distribuzione agli altri componenti dei comandi provenienti dall’esterno, alla gestione delle operazioni atomiche e all’installazione delle Java Card Applet;

  • Java Card API: si tratta dell’interfaccia utilizzata dalle Java Card Applet per l’accesso al JCRE e ai Metodi Nativi. Questo componente fornisce quindi un insieme di classi che permette di accedere alle risorse standardizzate presenti sulla Java Card: tutto ciò rappresenta un passo necessario alla realizzazione di un ambiente indipendente e multi-piattaforma.

  • JCRE (Java Card Runtime Environment): questo componente raggruppa al suo interno la JCVM, il Framework, i Metodi Nativi e l’API Java Card. Questo è, in effetti, l’ambiente Java Card che permette la portabilità del codice.

  • Estensioni Proprietarie: si tratta di classi aggiuntive definite dal costruttore della Java Card, che possono essere utilizzate dalle Java Card Applet. Appartengono a queste classi aggiuntive tutte quelle classi che forniscono accessi a certi tipi di funzionalità dedicate, relative a Java Card per applicazioni particolari quali Java Card che integrano al loro interno orologi a tempo reale, hardware dedicati per l’esecuzione di particolari operazioni aritmetiche o altro ancora. Non devono essere confuse con le estensioni standard del Framework, che sono invece definite come classi opzionali dall’API Java Card;

  • Java Card Applet: sono applicazioni scritte in un subset del linguaggio Java per essere eseguite su Java Card. Queste applicazioni implementano, in pratica, tutte le funzionalità della Java Card accessibili dall’esterno. L’applicazione esterna di controllo può selezionarle una alla volta, in maniera esclusiva, e richiedergli certi servizi, quali la memorizzazione o la restituzione di dati o l’esecuzione di operazioni.

JCVM

Questo tipo di Virtual Machine ha funzionalità ridotte rispetto alla Java Virtual Machine disponibili per i PC o le workstation. La JCVM è, in effetti, solo una porzione della JVM e non è in grado di eseguire il loading delle classi e la risoluzione dei riferimenti: lo scopo per cui è progettata è quello di eseguire il bytecode Java Card e gestire gli oggetti. Per questo motivo i Converter (convertitori utilizzati per tradurre il bytecode Java compilato su PC in un formato che ne permetta il caricamento su Java Card) eseguono anche i compiti di loading delle classi e risoluzione dei riferimenti.