Appunti per Scuola e Università
humanisticheUmanistiche
Appunti e tesine di tutte le materie per gli studenti delle scuole medie riguardanti le materie umanistiche: dall'italiano alla storia riguardanti le materie umanistiche: dall'italiano alla storia 
sceintificheScientifiche
Appunti, analisi, compresione per le scuole medie suddivisi per materie scientifiche, per ognuna troverai appunti, dispense, esercitazioni, tesi e riassunti in download.
tecnicheTecniche
Gli appunti, le tesine e riassunti di tecnica amministrativa, ingegneria tecnico, costruzione. Tutti gli appunti di AppuntiMania.com gratis!
Appunti
informatica
CComputerDatabaseInternetJava
Linux unixReti


AppuntiMania.com » Informatica » Appunti di Java » Controllo del flusso di informazione a runtime

Controllo del flusso di informazione a runtime




Visite: 1696Gradito:apreciate stela [ Grande appunti ]
Leggi anche appunti:

La sicurezza delle Java card


La sicurezza delle Java card Le procedure di sicurezza delle Java Card sono

La politica di sicurezza dinamica mediante Firewall


La politica di sicurezza dinamica mediante Firewall La politica di sicurezza

Controllo del flusso di informazione a runtime


Controllo del flusso di informazione a runtime In questo capitolo analizzeremo
immagine di categoria



Scarica gratis Controllo del flusso di informazione a runtime

Controllo del flusso di informazione a runtime



In questo capitolo analizzeremo nel dettaglio la soluzione proposta al pro-blema di flusso illegale di informazioni.

Per prima cosa analizzeremo una possibile implementazione del caso di studio proposto dalla Gemplus - Pacap [6], realizzando i package purse airfrance e rentacar con le relative applet Purse, AirFranceApplet e RentaCarApplet, che rispettino le specifiche viste nel capitolo precedente.



Successivamente modificheremo la loyalty RentaCarApplet in modo che si verifichi il flusso illegale di informazioni ed infine proporremo una soluzio-ne implementativa di Purse che eviti tale flusso illegale.



Caratteristiche delle applet del sistema


Prima di passare ad illustrare il codice delle applet che compongono il nostro caso di studio occorre, anche per una migliore comprensione del caso di studio stesso, presentare alcune caratteristiche delle applet che compongono il sistema in esame come la specifica degli AID delle applet, la struttura delle APDU di command e di response per le applet e la definizione dei parametri identifi-cativi dei metodi condivisi di una applet del sistema.


Specifica degli AID per le applet del sistema


Nelle Java Card, come abbiamo avuto modo di vedere, ciascuna istanza di applet è univocamente identificata e selezionata attraverso un Application IDentifier detto AID. Anche ai package viene associato un AID.

Un AID sappiamo essere costituito da due parti: il RID (5 bytes) ed il PIX (da 0 a 11 bytes) .

Di seguito riportiamo gli AID assegnati ai package ed alle applet dei package del nostro sistema:


purse AID

RID

0xa0, 0x00, 0x00, 0x00, 0x62

Package PIX

0x03, 0x01, 0x0c, 0x01

Applet PIX

0x03, 0x01, 0x0c, 0x01, 0x01

Tabella 1 : Struttura dell'AID del package purse


airfrance AID

RID

0xa0, 0x00, 0x00, 0x00, 0x62

Package PIX

0x03, 0x01, 0x0c, 0x02

Applet PIX

0x03, 0x01, 0x0c, 0x02, 0x02


Tabella 2 : Struttura dell'AID del package airfrance


rentacar AID

RID

0xa0, 0x00, 0x00, 0x00, 0x62

Package PIX

0x03, 0x01, 0x0c, 0x01

Applet PIX

0x03, 0x01, 0x0c, 0x01, 0x01


Tabella 3 : Struttura dell'AID del package rentacar



Struttura delle APDU per le applet del sistema


Ogni applet che è in esecuzione su una Java Card può comunicare con una host application, relativa al CAD in cui viene inserita la carta, mediante APDU.

Occorre, prima di passare alla scrittura del codice delle applet, definire la struttura delle APDU di command in grado di essere inviate dall' host application ed in grado di essere riconosciute come valide dalle applet del sistema così da mandare in esecuzione uno dei metodi dell'applet stessa.


La struttura delle APDU di command delle applet relative al nostro sistema, comprensive anche delle relative APDU di command per la sele-zione delle applet del sistema, è la seguente.






Struttura delle APDU per Purse


Purse - Select APDU - command APDU

CLA

INS

P1

P2

Lc

Campo Dati

Le

0x00

0xa4

0x04

0x00

0x0a

Purse AID



Purse - Select APDU - response APDU

Dati

SW1

SW2

Significato del codice SW1 - SW2


0X90

0X00

Selezione avvenuta con successo


0X69

0X99

L'applet non può essere selezionata


Purse - debit APDU - command APDU

CLA

INS

P1

P2

Lc

Campo Dati

Le

0xb0

0x30

0x00

0x00

0x02

transactionValue, transactionID



Purse - debit APDU - response APDU

Dati

SW1

SW2

Significato del codice SW1 - SW2


0X90

0X00

Operazione avvenuta con successo


0X6a

0X85

Server AID ritornato null


0X6a

0X87

SIO ritornato null

Purse - getCredit APDU - command APDU

CLA

INS

P1

P2

Lc

Campo Dati

Le

0xb0

0x40

0x00

0x00



0x02


Purse - getCredit APDU - response APDU

Dati

SW1

SW2

Significato del codice SW1 - SW2

balance

0X90

0X00

Operazione avvenuta con successo

Tabella 4 : Struttura delle APDU per Purse


Struttura delle APDU per AirFranceApplet



AirFranceApplet - Select APDU - command APDU

CLA

INS

P1

P2

Lc

Campo Dati

Le

0x00

0xa4

0x04

0x00

0x0a

AirFranceApplet AID



AirFranceApplet - Select APDU - response APDU

Dati

SW1

SW2

Significato del codice SW1 - SW2


0X90

0X00

Selezione avvenuta con successo


0X69

0X99

L'applet non può essere selezionata


AirFranceApplet - debitPoints APDU - command APDU

CLA

INS

P1

P2

Lc

Campo Dati

Le

0xb0

0x30

0x00

0x00

0x01

debitPoints



AirFranceApplet - debitPoints APDU - response APDU

Dati

SW1

SW2

Significato del codice SW1 - SW2


0X90

0X00

Operazione avvenuta con successo


0X6b

0X83

Valore di punti non valido


0X6b

0X85

Server AID ritornato null


0X6b

0X87

SIO ritornato null

AirFranceApplet - getPoints APDU - command APDU

CLA

INS

P1

P2

Lc

Campo Dati

Le

0xb0

0x40

0x00

0x00



0x04


AirFranceApplet - getPoints APDU - response APDU

Dati

SW1

SW2

Significato del codice SW1 - SW2

balance, extended balance

0X90

0X00

Operazione avvenuta con successo

0X6b

0X85

Server AID ritornato null

0X6b

0X87

SIO ritornato null


Tabella 5 : Struttura delle APDU per AirFranceApplet



Struttura delle APDU per RentaCarApplet



RentaCarApplet - Select APDU - command APDU

CLA

INS

P1

P2

Lc

Campo Dati

Le

0x00

0xa4

0x04

0x00

0x0a

RentaCarApplet AID



RentaCarApplet - Select APDU - response APDU

Dati

SW1

SW2

Significato del codice SW1 - SW2


0X90

0X00

Selezione avvenuta con successo


0X69

0X99

L'applet non può essere selezionata




RentaCarApplet - debitPoints APDU - command APDU

CLA

INS

P1

P2

Lc

Campo Dati

Le

0xb0

0x30

0x00

0x00

0x01

debitPoints



RentaCarApplet - debitPoints APDU - response APDU

Dati

SW1

SW2

Significato del codice SW1 - SW2


0X90

0X00

Operazione avvenuta con successo


0X6b

0X83

Valore di punti non valido


0X6b

0X85

Server AID ritornato null


0X6b

0X87

SIO ritornato null

RentaCarApplet - getPoints APDU - command APDU

CLA

INS

P1

P2

Lc

Campo Dati

Le

0xb0

0x40

0x00

0x00



0x04


RentaCarApplet - getPoints APDU - response APDU

Dati

SW1

SW2

Significato del codice SW1 - SW2

balance, extended balance

0X90

0X00

Operazione avvenuta con successo

0X6b

0X85

Server AID ritornato null

0X6b

0X87

SIO ritornato null


Tabella 6 : Struttura delle APDU per RentaCarApplet



Definizione dei parametri identificativi dei metodi condivisi


Abbiamo visto nel capitolo 3 che il metodo getAppletShareableInterface-Object invocato da una applet client per richiedere un SIO utilizza un campo-dati chiamato parameter, utile all'applet  server per identificare il servizio richiesto dall'applet client.

Ecco di seguito gli identificativi dei servizi offerti da ciascuna applet del sistema:


Applet

servizio

Identificativo

Purse

getTransaction

0xa2

loyalties

logFull

0xa2

loyalties

getBalance

0xc1

loyalties

updatePoints

0xc2


Tabella 7 : Parametri identificativi dei metodi condivisi



2 Implementazione del package purse


Per prima cosa analizziamo la struttura del package purse:

Figura 1 : Package purse


Nella Figura 1 abbiamo suddiviso la classe Purse che implementa l'ap-plet in quattro sezioni denominate rispettivamente "import", "variables", "private" e "pubblic" mentre in una freccia abbiamo racchiuso i metodi condivisi dal package purse con altri package.


Nella sezione "import" sono riportate le classi o interfacce che debbono essere importate dalla classe Purse per il suo corretto funzionamento nella forma nomepackage.nomeclasse. Oltre al javacard.framework.* (che consente di implementare l'applet) occorre includere l'interfaccia PurseInterface del package purse che implementa i metodi condivisi del-l'applet Purse e l'interfaccia AirFranceInterface del package airfrance che implementa i metodi condivisi della loyalty AirFranceApplet.


Nella sezione "variables" sono riportati i campi-dati della classe Purse; balance rappresenta il campo che contiene il credito disponibile sulla carta ed è inizializzato al suo valore massimo;

transactionID[4] e transactionValue[4] implementano il transactionLog del purse utilizzato per contenere le transazioni effettuate con Purse e rappresentano rispettivamente l'identificatore della loyalty interessata dalla transazione (transazione che dunque verrà utilizzata per aggiornare i campi della loyalty cui fa riferimento) ed il valore della transazione. La dimensione del transactionLog è limitata a contenere al massimo quattro diverse transazioni; dopo aver ricevuto quattro transazioni, Purse è costretto a sovrascrivere le transazioni precedenti.

Infine il campo numTransaction rappresenta l'indice della riga libera o riscrivibile del transactionLog.


Nella sezione "private" sono riportati i metodi privati della classe Purse e dunque i metodi accessibili solo dal contesto cui appartiene Purse. A questa sezione appartengono il costruttore Purse ed i metodi getCredit che ritorna il credito residuo di Purse e debit che consente di effettuare transazioni di pagamento dal Purse.

Come è chiaramente rappresentato nella Figura 1 il metodo debit ef-fettua una chiamata al metodo condiviso logFull di airfrance per segnalare alla loyalty che ha sottoscritto il servizio che il transactionLog si è riempito invitandola quindi a prelevarsi le transazioni ad essa riferite.


Nella sezione "public" sono invece riportati i metodi pubblici della classe Purse accessibili dal livello del JCRE. A questa sezione appartengono i metodi install, select, deselect, process e getShareableInterfaceObject.


Infine, racchiuso nella freccia, è riportato il metodo condiviso (shareable) getTransaction che Purse mette a disposizione delle loyalty per prelevare le transazioni dal transactionLog ed aggiornare i punti relativi.

Questo metodo appartiene all'interfaccia PurseInterface del package purse.


L'implementazione di Purse proposta rappresenta una semplificazione utile a verificare il problema del flusso illegale di informazioni, pertanto tutte le parti di codice inessenziali a questa verifica sono state tralasciate.


2.1 Codice delle interfacce importate da Purse


Di seguito riportiamo il codice delle interfacce realizzate ed importate dalla

classe Purse :


purse.PurseInterface


package purse;

import javacard.framework.Shareable;


public interface PurseInterface extends Shareable

questa interfaccia, che estende la classe shareable, dichiara il metodo condiviso di Purse denominato getTransaction.



airfrance.AirFranceInterface


package airfrance;

import javacard.framework.Shareable;


public interface AirFranceInterface extends Shareable


questa interfaccia, che estende la classe shareable, dichiara i metodi con-divisi della loyalty airfrance denominati rispettivamente logFull, getBalance e updatePoints.


2.2 Codice della classe Purse


Di seguito riportiamo il codice della classe Purse che implementa le fun-zionalità essenziali di un purse in grado di registrare transazioni che decurtano il campo dati balance, di segnalare mediante invocazione a logFull il riempimento del transactionLog e di far prelevare alle loyalty, mediante metodo condiviso getTransaction, le transazioni dal transactionLog e di ritornare il valore attuale del balance disponibile sul-l'applet Purse.

package purse;


import javacard.framework.*;

import airfrance.AirFranceInterface;

import purse.PurseInterface;


public class Purse extends Applet implements PurseInterface;

final static byte[] Purse_AID_bytes = new byte[] ;

final static byte[] RentaCar_AID_bytes =

new byte[] ;


// id delle loyalties

final static byte AIRFRANCE_ID = (byte)0x02;

final static byte RENTACAR_ID = (byte)0x03;


// codici dei metodi condivisi utilizzati da Purse

final static byte logFull_ID = (byte)0xA1;

final static byte getTransaction_ID = (byte)0xA2;


// codici di errore specifici dell'Applet

final static short SW_SERVER_AID_NULL = 0x6A85;

final static short SW_SIO_NULL = 0x6A87;

final static short SW_UNAUTHORIZED_CLIENT = 0x6A89;


// variabili dell'applet

private short balance;

private short numTransaction;

private byte[] transactionValue = new byte[4];

private byte[] transactionID = new byte[4];


// metodo install

public static void install(byte[] bArray,short bOffset,byte bLength) // fine metodo install


// costruttore dell'applet

private Purse (byte[] bArray, short bOffset, byte bLength) // fine costruttore


// metodo select

public boolean select() // fine metodo select


// metodo deselect

public void deselect() // fine metodo deselect


// metodo process

public void process(APDU apdu)


} // fine metodo process


// metodo debit che effettua transazioni dal purse

private void debit(APDU apdu)


} // fine metodo debit


// metodo getCredit che ritorna il credito residuo

private void getCredit(APDU apdu) // fine metodo getCredit


// metodo condiviso getTransaction che ritorna

// alla loyalty la somma delle

// transazioni effettuate sul purse per la --

// compagnia cui la loyalty appartiene

public byte getTransaction(byte loyaltySN)


// calcola il valore delle transazioni

// relative alla loyalty di ID loyaltySN

for (byte i=0;i<4;i++)     

}

return transactionAmount;


} // fine metodo condiviso getTransaction


// metodo getShareableInterfaceObject che ritorna

// alle loyalty autorizzate

// un riferimento al SIO

public Shareable getShareableInterfaceObject

(AID client_aid, byte parameter) // fine metodo getShareableinterfaceObject



} // fine Purse




3 Implementazione del package airfrance


Per prima cosa analizziamo la struttura del package airfrance:

Figura 2 : Package airfrance


Nella Figura 2 abbiamo suddiviso la classe AirFranceApplet che imple-menta l'applet in quattro sezioni denominate rispettivamente "import", "variables", "private" e "pubblic" mentre in una freccia abbiamo racchiuso i metodi condivisi dal package airfrance con altri package.


Nella sezione "import" sono riportate le classi o interfacce che debbono essere importate dalla classe AirFranceApplet per il suo corretto funzionamento nella forma nomepackage.nomeclasse. Oltre al javacard.framework.* (che consente di implementare l'applet) occorre includere l'interfaccia PurseInterface del package purse che implementa i metodi condivisi dell'applet Purse, l'interfaccia AirFranceInterface del package airfrance che implementa i metodi condivisi della loyalty AirFranceApplet e l'interfaccia RentacarInterface del package rentacar che implementa i metodi condivisi della loyalty RentaCarApplet.


Nella sezione "variables" sono riportati i campi-dati della classe AirFranceApplet; balance rappresenta il campo-dati che contiene i punti raccolti da transazioni effettuate sull'applet Purse e relative ad AirFrance-Applet ed è inizializzato al valore zero;

extended_balance rappresenta il campo-dati che contiene la somma dei punti raccolti da transazioni effettuate sull'applet Purse da tutte le loyalty partner (nel nostro caso da AirFranceApplet e RentaCarApplet) ed è inizializzato al valore zero.


Nella sezione "private" sono riportati i metodi privati della classe AirFranceApplet e dunque i metodi accessibili solo dal contesto cui appartiene AirFranceApplet. A questa sezione appartengono il costruttore AirFranceApplet ed i metodi getPoints che ritorna il valore dei campi-dati balance e extended_balance e debitPoints che consente di "spendere" una quota o il totale dei punti accumulati.

Come è chiaramente rappresentato nella Figura 2 i metodi debitPoints e getPoints effettuano chiamate a metodi condivisi: debitPoints chiama updatePoints per aggiornare i campi-dati della loyalty RentaCarApplet affiliata mentre getPoints chiama getTransacion di Purse e getBalance di RentaCarApplet rispettivamente per prelevare le proprie transazioni da Purse e per aggiornare il campo-dati extended_balance.


Nella sezione "public" sono invece riportati i metodi pubblici della classe AirFranceApplet accessibili dal livello del JCRE. A questa sezione appartengono i metodi install, select, deselect, process e getShareable-InterfaceObject.


Infine, racchiusi nella freccia, sono riportati i metodi condivisi (shareable) logFull, updatePoints e getBalance che AirFranceApplet mette a disposi-zione di Purse (relativamente a logFull) e di RentaCarApplet (relativamen-te a updatePoints e getBalance) rispettivamente per consentire a Purse di segnalare che il transactionLog è pieno, per comunicare a RentaCar-Applet di aggiornare i propri campi dati e per ottenere il valore del campo dati extended_balance di RentaCarApplet.

Questi metodi appartengono all'interfaccia AirFranceInterface del package airfrance.


L'implementazione di AirFranceApplet proposta rappresenta una semplifi-cazione utile a verificare il problema del flusso illegale di informazioni, pertanto tutte le parti di codice inessenziali a questa verifica sono state tralasciate.


3.1 Codice delle interfacce importate da AirFranceApplet


Prima di procedere ad analizzare il codice di AirFranceApplet riportiamo di seguito il codice delle interfacce realizzate ed importate dalla classe AirFranceApplet :


purse.PurseInterface


package purse;

import javacard.framework.Shareable;


public interface PurseInterface extends Shareable

questa interfaccia, che estende la classe shareable, dichiara il metodo condiviso del Purse denominato getTransaction.



airfrance.AirFranceInterface


package airfrance;

import javacard.framework.Shareable;


public interface AirFranceInterface extends Shareable


questa interfaccia, che estende la classe shareable, dichiara i metodi condivisi della loyalty airfrance denominati rispettivamente logFull, getBalance e updatePoints.


rentacar.RentaCarInterface


package rentacar;

import javacard.framework.Shareable;


public interface RentaCarInterface extends Shareable


questa interfaccia, che estende la classe shareable, dichiara i metodi condivisi della loyalty RentaCarApplet denominati rispettivamente logFull, getBalance e updatePoints.


3.2 Codice della classe AirFranceApplet


Di seguito riportiamo il codice della classe AirFranceApplet che implemen-ta le funzionalità essenziali di una loyalty in grado di registrare i punti raccolti mediante transazioni effettuate sull'applet Purse, di registrare i punti totali raccolti da tutte le loyalty partner, di aggiornare i campi-dati della loyalty ogni qualvolta i punti vengono consumati e di ritornare il valore dei campi-dati.


package airfrance;


import javacard.framework.*;

import airfrance.AirFranceInterface;

import rentacar.RentaCarInterface;

import purse.PurseInterface;


public class AirFranceApplet extends Applet implements AirFranceInterface;

final static byte[] RentaCar_AID_bytes =

new byte[] ;


// id dell'applet per ottenere le transazioni da

// Purse

final static byte AIRFRANCE_ID = (byte)0x02;


// codici dei metodi condivisi

final static byte logFull_ID = (byte)0xA1;

final static byte getBalance_ID = (byte)0xC1;

final static byte getTransaction_ID = (byte)0xA2;

final static byte updatePoints_ID = (byte)0xC2;


// codici di errore specifici dell'Applet

final static short SW_INVALID_POINTS = 0x6B83;

final static short SW_SERVER_AID_NULL = 0x6B85;

final static short SW_SIO_NULL = 0x6B87;

final static short SW_UNAUTHORIZED_CLIENT =

0x6B89;


// variabili dell'applet

short balance;

short extended_balance;


// metodo install

public static void install(byte[] bArray,

short bOffset,byte bLength) // fine metodo install


// costruttore dellapplet

private AirFranceApplet (byte[] bArray, short

bOffset, byte bLength) // fine costruttore


// metodo select

public boolean select() // fine metodo select


// metodo deselect

public void deselect() // fine metodo deselect


// metodo process

public void process(APDU apdu)


} // fine metodo process


// metodo debitPoints che sottrae i punti passati

// dall'APDU

private void debitPoints(APDU apdu)


else


else

ISOException.throwIt(

SW_INVALID_POINTS);

}


AID server_aid = JCSystem.lookupAID

(RentaCar_AID_bytes,(short)0,

(byte)RentaCar_AID_bytes.length);

if (server_aid == null)

ISOException.throwIt(

SW_SERVER_AID_NULL);


RentaCarInterface sio = (RentaCarInterface)

(JCSystem.getAppletShareableInterfaceObject

(server_aid,updatePoints_ID));


if (sio == null)

ISOException.throwIt(SW_SIO_NULL);

// chiamata al metodo condiviso

sio.updatePoints(debit,ex_balance);


} // fine metodo debitPoints


// metodo getPoints che ritorna il contenuto dei

// campi balance e extended_balance

private void getPoints (APDU apdu)


// ritorna i valori dei campi-dati

byte[] buffer = apdu.getBuffer();

short le = apdu.setOutgoing();

apdu.setOutgoingLength((byte)4);

Util.setShort(buffer, (short)0, balance);

Util.setShort(buffer, (short)2,

extended_balance);

apdu.sendBytes((short)0,(short)4);


} // fine metodo getPoints



// metodo condiviso logFull che AirFranceApplet ha

// sottoscritto con Purse

// per essere informato sul transactionLog pieno

public void logFull()


AID server_aid = JCSystem.lookupAID

(Purse_AID_bytes,(short)0,

(byte)Purse_AID_bytes.length);


if (server_aid == null)

ISOException.throwIt(

SW_SERVER_AID_NULL);


PurseInterface sio = (PurseInterface)

(JCSystem.getAppletShareableInterfaceObject

(server_aid,logFull_ID));


if (sio == null)

ISOException.throwIt(SW_SIO_NULL);

// chiamata al metodo condiviso

byte airFrancePoints =  

sio.getTransaction(AIRFRANCE_ID);

balance = (short)(balance +

(short)airFrancePoints);


AID server2_aid = JCSystem.lookupAID

(RentaCar_AID_bytes,(short)0,

(byte)RentaCar_AID_bytes.length);


if (server2_aid == null)

ISOException.throwIt(

SW_SERVER_AID_NULL);


RentaCarInterface sio2 = (RentaCarInterface)

(JCSystem.getAppletShareableInterfaceObject

(server2_aid,getBalance_ID));


if (sio2 == null)

ISOException.throwIt(SW_SIO_NULL);

// chiamata al metodo condiviso

short rentaCarPoints = sio2.getBalance();

if (rentaCarPoints>=extended_balance)


} // fine metodo condiviso logFull


// metodo condiviso getBalance che loyalty

// partner possono accedere

// per aggiornare il campo extended_balance

public short getBalance()


return extended_balance;


} // fine metodo condiviso getBalance



// metodo condiviso updatePoints che loyalty

// partner possono chiamare

// per aggiornare il campo extended_balance in

// seguito ad una decurtazione di punti


public void updatePoints(byte debit,

short ex_balance)


extended_balance = ex_balance;

extended_balance = (short)(extended_balance -

(short)debit);


if (balance > extended_balance)

balance= (byte)extended_balance;


} // fine metodo condiviso updatePoints


// metodo getShareableInterfaceObject che le

// applet possono chiamare

// per ottenere un riferimento al SIO

public Shareable getShareableInterfaceObject(

AID client_aid, byte parameter) // fine metodo getShareableInterfaceObject



} //fine AirFranceApplet




Implementazione del package rentacar


Per prima cosa analizziamo la struttura del package rentacar:

Figura 3 : Package rentacar


Nella Figura 3 abbiamo suddiviso la classe RentaCarApplet che imple-menta l'applet in quattro sezioni denominate rispettivamente "import", "variables", "private" e "pubblic" mentre in una freccia abbiamo racchiuso i

metodi condivisi dal package rentacar con altri package.

Nella sezione "import" sono riportate le classi o interfacce che debbono essere importate dalla classe RentaCarApplet per il suo corretto funzionamento nella forma nomepackage.nomeclasse. Oltre al javacard.framework.* (che consente di implementare l'applet) occorre in-cludere l'interfaccia PurseInterface del package purse che implementa i metodi condivisi di purse, l'interfaccia AirFranceInterface del package airfrance che implementa i metodi condivisi della loyalty AirFranceApplet e l'interfaccia RentacarInterface del package rentacar che implementa i metodi condivisi della loyalty RentaCarApplet.


Nella sezione "variables" sono riportati i campi-dati della classe RentaCarApplet; balance rappresenta il campo-dati che contiene i punti raccolti da transazioni effettuate sul purse e relative a RentaCarApplet ed è inizializzato al valore zero;

extended_balance rappresenta il campo-dati che contiene la somma dei punti raccolti da transazioni effettuate sull'applet Purse da tutte le loyalty partner (nel nostro caso da AirFranceApplet e RentaCarApplet) ed è ini-zializzato al valore zero.


Nella sezione "private" sono riportati i metodi privati della classe RentaCarApplet e dunque i metodi accessibili solo dal contesto cui appartiene RentaCarApplet. A questa sezione appartengono il costruttore RentaCarApplet ed i metodi getPoints che ritorna il valore dei campi-dati balance e extended_balance e il metodo debitPoints che consente di "spendere" una quota o il totale dei punti accumulati.




Come è chiaramente rappresentato nella Figura 3 i metodi debitPoints e getPoints effettuano chiamate a metodi condivisi: debitPoints chiama updatePoints per aggiornare i campi-dati della loyalty AirFRanceApplet affiliata mentre getPoints chiama getTransaction di Purse e getBalance di AirFRanceApplet rispettivamente per prelevare le proprie transazioni dall'applet Purse e per aggiornare il campo-dati extended_balance.


Nella sezione "public" sono invece riportati i metodi pubblici della classe RentaCarApplet accessibili dal livello del JCRE. A questa sezione appartengono i metodi install, select, deselect, process e getShareable-InterfaceObject.


Infine, racchiusi nella freccia, sono riportati i metodi condivisi (shareable) logFull, updatePoints e getBalance che RentaCarApplet mette a disposi-zione di Purse (relativamente a logFull) e di AirFranceApplet (relativa-mente a updatePoints e getBalance) rispettivamente per consentire a Purse di segnalare che il transactionLog è pieno, per comunicare a Air-FranceApplet di aggiornare i propri campi-dati e per ottenere il valore del campo-dati extended_balance di AirFranceApplet.

Questi metodi appartengono all'interfaccia RentaCarInterface del package rentacar.


L'implementazione di RentaCarApplet proposta rappresenta una semplifi-cazione utile a verificare il problema del flusso illegale di informazioni, pertanto tutte le parti di codice inessenziali a questa verifica sono state tralasciate.



4.1 Codice delle interfacce importate da RentaCarApplet


Prima di procedere ad analizzare il codice di RentaCarApplet riportiamo di seguito il codice delle interfacce realizzate ed importate dalla classe RentaCarApplet:


purse.PurseInterface


package purse;

import javacard.framework.Shareable;


public interface PurseInterface extends Shareable

questa interfaccia, che estende la classe shareable, dichiara il metodo condiviso di Purse denominato getTransaction.



airfrance.AirFranceInterface


package airfrance;

import javacard.framework.Shareable;


public interface AirFranceInterface extends Shareable


questa interfaccia, che estende la classe shareable, dichiara i metodi condivisi della loyalty AirFranceApplet denominati rispettivamente logFull, getBalance e updatePoints.


rentacar.RentaCarInterface


package rentacar;

import javacard.framework.Shareable;


public interface RentaCarInterface extends Shareable


questa interfaccia, che estende la classe shareable, dichiara i metodi condivisi della loyalty RentaCarApplet denominati rispettivamente logFull, getBalance e updatePoints.


4.2 Codice della classe RentaCarApplet


Di seguito riportiamo il codice della classe RentaCarApplet che implemen-ta le funzionalità essenziali di una loyalty in grado di registrare i punti raccolti mediante transazioni effettuate sull'applet Purse, di registrare i punti totali raccolti da tutte le loyalty partner, di aggiornare i campi-dati della loyalty ogni qualvolta i punti vengono consumati e di ritornare il valo-re dei campi-dati.



package rentacar;


import javacard.framework.*;

import airfrance.AirFranceInterface;

import rentacar.RentaCarInterface;

import purse.PurseInterface;



public class RentaCarApplet extends Applet implements RentaCarInterface{


// codice per il campo CLA del command APDU

final static byte CLA = (byte)0xB0;


// codici per il campo INS del command APDU      

final static byte DEBIT_POINTS = (byte) 0x30;

final static byte GET_POINTS = (byte) 0x40;


// AID_bytes delle applets a cui richiede metodi

// condivisi

final static byte[] Purse_AID_bytes = new byte[] ;

final static byte[] AirFrance_AID_bytes =

new byte[] ;


// id dell'applet

final static byte RENTACAR_ID = (byte)0x03;


// codici dei metodi condivisi

final static byte logFull_ID = (byte)0xA1;

final static byte getBalance_ID = (byte)0xC1;

final static byte getTransaction_ID = (byte)0xA2;

final static byte updatePoints_ID = (byte)0xC2;



// codici di errore specifici dell'Applet

final static short SW_INVALID_POINTS = 0x6C83;

final static short SW_SERVER_AID_NULL = 0x6C85;

final static short SW_SIO_NULL = 0x6C87;

final static short SW_UNAUTHORIZED_CLIENT =

0x6C89;


// variabili dell'applet

short balance;

short extended_balance;


// metodo install

public static void install(byte[] bArray,

short bOffset,byte bLength) // fine metodo install


// costruttore dell'applet

private RentaCarApplet (byte[] bArray, short

bOffset, byte bLength) // fine costruttore


// metodo select

public boolean select() // fine metodo select


// metodo deselect

public void deselect() // fine metodo deselect


// metodo process

public void process(APDU apdu)


} // fine metodo process


// metodo debitPoints che sottrae i punti passati

// dall'APDU

private void debitPoints(APDU apdu)


else


else

ISOException.throwIt(

SW_INVALID_POINTS);

}


AID server_aid = JCSystem.lookupAID(

AirFrance_AID_bytes,(short)0,

(byte)AirFrance_AID_bytes.length);


if (server_aid == null)

ISOException.throwIt(

SW_SERVER_AID_NULL);


AirFranceInterface sio = (AirFranceInterface)

(JCSystem.getAppletShareableInterfaceObject

(server_aid,updatePoints_ID));


if (sio == null)

ISOException.throwIt(SW_SIO_NULL);

// chiamata al metodo condiviso

sio.updatePoints(debit, ex_balance);


} // fine metodo debitPoints


// metodo getPoints che ritorna il contenuto dei

// campi balance e extended_balance

private void getPoints (APDU apdu)


byte[] buffer = apdu.getBuffer();

short le = apdu.setOutgoing();

apdu.setOutgoingLength((byte)4);

Util.setShort(buffer,(short)0, balance);

Util.setShort(buffer,(short)2,

extended_balance);

apdu.sendBytes((short)0,(short)4);


} // fine metodo getPoints



// metodo condiviso logFull che RentaCarApplet non

// ha sottoscritto con Purse

public void logFull()


AID server_aid = JCSystem.lookupAID

(Purse_AID_bytes,(short)0,

(byte)Purse_AID_bytes.length);


if (server_aid == null)

ISOException.throwIt(

SW_SERVER_AID_NULL);


PurseInterface sio = (PurseInterface)

(JCSystem.getAppletShareableInterfaceObject

(server_aid,logFull_ID));


if (sio == null)

ISOException.throwIt(SW_SIO_NULL);

// chiamata al metodo condiviso

byte rentaCarPoints =

sio.getTransaction(RENTACAR_ID);

balance = (short)(balance +

(short)rentaCarPoints);


AID server2_aid = JCSystem.lookupAID(

AirFrance_AID_bytes,(short)0,

(byte)AirFrance_AID_bytes.length);


if (server2_aid == null)

ISOException.throwIt(

SW_SERVER_AID_NULL);


AirFranceInterface sio2 =(AirFranceInterface)

(JCSystem.getAppletShareableInterfaceObject

(server2_aid,getBalance_ID));


if (sio2 == null)

ISOException.throwIt(SW_SIO_NULL);

//chiamata al metodo condiviso

short airFrancePoints = sio2.getBalance();


if (airFrancePoints >= extended_balance)


} // fine metodo condiviso logFull


// metodo condiviso getBalance che loyalty

// partner possono accedere

// per aggiornare il campo extended_balance

public short getBalance()


return extended_balance;


} // fine metodo condiviso getBalance



// metodo condiviso updatePoints che loyalty

// partner possono chiamare

// per aggiornare il campo extended_balance in

// seguito ad una decurtazione di punti

public void updatePoints(byte debit,

short ex_balance)


extended_balance = ex_balance;

extended_balance = (short)(extended_balance -

(short)debit);

if (balance > extended_balance)

balance= (byte)extended_balance;


} // fine metodo condiviso updatePoints


// metodo getShareableInterfaceObject che le

// applet possono chiamare

// per ottenere un riferimento al SIO

public Shareable getShareableInterfaceObject(

AID client_aid, byte parameter) // fine metodo getShareableInterfaceObject



} //fine RentaCarApplet



5 Esempio di funzionamento


Analizziamo ora una possibile sequenza di select e Command APDU (in-viate dall'host alla carta) e di response APDU (inviate dalla carta all' host  che dimostrano il corretto funzionamento del sistema Purse - AirFrance-Applet - RentaCarApplet.

Nel caso specifico che stiamo analizzando vogliamo in particolare verificare che AirFranceApplet, che ha sottoscritto il servizio di logFull con Purse riesce a recuperare tutte le proprie transazioni mentre RentaCarApplet, che non ha sottoscritto il servizio con Purse, può perdere alcune proprie transazioni e dunque può perdere punti per la propria loyalty.


Per riuscire in questo supponiamo che l'applicazione host dapprima invii quattro transazioni (pagamenti) all'applet Purse, riempiendo completa-mente il transactionLog; ecco di seguito la tabella che riassume le quattro transazioni eseguite dall'host riportando l'entità (supposta in euro) delle transazioni e la loyalty cui quella transazione compete:




i-esima transazione

transactionValue[i]

transactionID[i]


I

0x03


I

0x03


I

0x02


I

0x02


Tabella 8 : Transazioni inviate dall'host a Purse


Supponiamo inoltre che, dopo ciascuna transazione, l'host selezioni entrambe le loyalty (AirFranceApplet e RentaCarApplet) per ottenere il valore dei rispettivi campi-dati; eseguita la quarta transazione, Purse invocherà il metodo logFull di AirFranceApplet ma l'effetto di questa ope-razione sarà ininfluente in quanto tutte le precedenti transazioni sono state recuperate dalle rispettive loyalty e dunque non vi sarà l'eventualità che RentaCarApplet possa perdere delle transazioni in seguito ad operazioni di riscrittura del transactionLog.

La tabella che segue riporta la situazione dei campi-dati delle due loyalty dopo che l'host ha effettuato le quattro transazioni illustrate in Tabella 8 ed ha lanciato il metodo getPoints di entrambe le loyalty (abbiamo sup-posto di assegnare 1 punto per ogni euro di transazione che equivale rispettivamente ad un chilometro di volo gratuito per AirFranceApplet ed a un'ora di noleggio gratuita per RentaCarApplet):


Loyalty

Campi-dati

Valore

AirFranceApplet

balance

0x0050

extended-balance

0x0090

RentaCarApplet

balance

0x0040

extended-balance

0x0090


Tabella 9 : Valore dei campi-dati delle loyalty


Supponiamo infine che l'host effettui le otto ulteriori transazioni (riportate nella Tabella 10) senza mai richiedere i valori dei campi-dati alle loyalty (ovvero senza mai invocare i metodi getPoints delle loyalty).

A causa delle dimensioni limitate del transactionLog (che può contenere fino ad un massimo di quattro diverse transazioni), le due transazioni indicate in grigio nella Tabella 10 saranno soprascritte dalle due transazioni in nero nella stessa tabella. Come conseguenza di ciò, quando, dopo le otto transazioni, l'host invocherà il metodo getPoints delle loyalty, AirFranceApplet, per effetto del servizio di logFull avrà recuperato tutte e sei le transazioni utili per aggiornare il proprio paniere di punti mentre RentaCarApplet, per effetto della soprascrizione delle due transazioni, avrà perso due transazioni utili ad aggiornare i relativi campi-dati.


i-esima transazione

transactionValue[i]

transactionID[i]


I

0x02


I

0x02


I

0x03


I

0x03


I

0x02


I

0x02


I

0x02


I

0x02


Tabella 10 : Secondo gruppo di transazioni inviate dall'host a Purse


La situazione delle loyalty al termine di queste operazioni svolte dall'host è la seguente:


Loyalty

Campi-dati

Valore

Punti persi

AirFranceApplet

balance

0x0130

0x0000

extended-balance

0x0170


RentaCarApplet

balance

0x0040

0x0040

extended-balance

0x0170



Tabella 11 : Valore dei campi-dati delle loyalty al termine delle transazioni


Ecco di seguito il recoconto delle APDU di select, command e response scambiate tra host e carta che dimostrano il corretto funzionamento del sistema Purse - AirFranceApplet - RentaCarApplet [1] :


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getCredit()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 02,

// ritorna balance

ff, ff, SW1: 90, SW2: 00


// transazione di 30I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 10I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 10, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 20I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 20, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 20I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 20, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 10I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 10, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 20I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 20, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)



CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 10I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 10, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getCredit()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 02,

// ritorna balance

fe, 4f, SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00




6 Implementazione di RentaCarApplet che realizza un flusso illegale di informazioni


Supponiamo adesso che l'implementatore di RentaCarApplet decida di effettuare la modifica alla funzione getBalance riportata di seguito (in neretto):





// metodo condiviso getBalance che loyalties

// partners possono accedere

// per aggiornare il campo extended_balance

public short getBalance()


AID server_aid = JCSystem.lookupAID(

Purse_AID_bytes,(short)0,

(byte)Purse_AID_bytes.length);


if (server_aid == null)

ISOException.throwIt(SW_SERVER_AID_NULL);


PurseInterface sio = (PurseInterface)

(JCSystem.getAppletShareableInterfaceObject(

server_aid,getTransaction_ID));

if (sio == null)

ISOException.throwIt(SW_SIO_NULL);


//chiamata al metodo condiviso

byte rentaCarPoints = sio.getTransaction(RENTACAR_ID);


balance = (short)(balance +

(short)rentaCarPoints);


AID server2_aid = JCSystem.lookupAID(

AirFrance_AID_bytes,(short)0,

(byte)AirFrance_AID_bytes.length);


if (server2_aid == null)

ISOException.throwIt(SW_SERVER_AID_NULL);


AirFranceInterface sio2 = (AirFranceInterface)

(JCSystem.getAppletShareableInterfaceObject(

server2_aid,getBalance_ID));


if (sio2 == null)

ISOException.throwIt(SW_SIO_NULL);


//chiamata al metodo condiviso      

short airFrancePoints = sio2.getBalance();


if (airFrancePoints >= extended_balance)


return extended_balance;


} // fine metodo condiviso getBalance





Con la modifica sopra illustrata, quando AirFranceApplet, a seguito di una chiamata di logFull, invoca il metodo condiviso getBalance di RentaCar-Applet, quest'ultima invoca il metodo condiviso getTransaction di Purse ottenendo tutte le proprie transazioni.


Cosi facendo RentaCarApplet ottiene gratuitamente il servizio di logFull per il quale invece AirFrance ha pagato sottoscrivendolo con Purse.


Si verifica così un flusso illegale di informazioni in quanto l'informazione di transactionLog pieno, inviata da Purse ad AirFranceApplet mediante il servizio di logFull, risulta filtrare anche a RentaCarApplet che non aveva sottoscritto il servizio.


Se adesso l'host esegue esattamente la stessa sequenza di APDU il-lustrata nel precedente paragrafo, è facile verificare che RentaCarApplet adesso non perderà più le due transazioni segnalate in grigio nella Tabella 10, ma riuscirà a recuperarle pur non avendo sottoscritto alcun servizio di logFull con Purse.

Vediamo prima la situazione delle loyalty al termine di queste operazioni svolte dall'host:


Loyalty

Campi-dati

Valore

Punti persi

AirFranceApplet

balance

0x0130

0x0000

extended-balance

0x01b0


RentaCarApplet

balance

0x0080

0x0000

extended-balance

0x01b0



Tabella 12 : Valore dei campi-dati delle loyalty con RentaCarApplet che genera flusso illegale


Vediamo infine il recoconto delle APDU di select, command e response scambiate tra host e carta che dimostrano l'avvenuto flusso illegale di in-formazioni nel sistema modificato Purse - AirFranceApplet - Renta-CarApplet :


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getCredit()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 02,

// ritorna balance

ff, ff, SW1: 90, SW2: 00


// transazione di 30I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 10I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 10, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 20I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 20, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 20I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 20, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 10I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 10, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 20I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 20, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 10I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 10, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getCredit()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 02,

// ritorna balance

fe, 4f, SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

01, 30, 01, b0, SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

00, 80, 01, b0, SW1: 90, SW2: 00




7 Implementazione di un Purse sicuro


Realizziamo adesso la soluzione implementativa che abbiamo accennato nel capitolo precedente così da rendere Purse sicuro, ovvero da rendere Purse capace di rilevare e contrastare questo possibile flusso illegale di informazioni.

La soluzione implementativa che proponiamo, oltre ad impedire che il flusso illegale di informazioni provochi un accesso illegale a dati di Purse, garantisce che il sistema Purse - AirFranceApplet - RentaCar "illegale" non divenga inconsistente e dunque non più utilizzabile in futuro. La nostra soluzione infatti garantisce che il sistema continui a funzionare correttamente come se il flusso illegale di informazioni non si fosse mai verificato, provvedendo a segnalare all'host la presenza di un tentativo di flusso illegale di informazioni. Tale segnalazione potrebbe ad esempio essere utilizzata dall'host per procedere ad una operazione di disinstal-lazione dell'applet corrotta dalla carta [4], riportando il sistema in sicurez-za.


Vediamo nel dettaglio la soluzione proposta.



7.1 Codice della classe SecureApplet


Per prima cosa abbiamo realizzato una classe che abbiamo nominato SecureApplet che contiene tutti i campi-dati ed i metodi necessari per ren-dere Purse sicuro.

Di seguito proponiamo il codice della classe SecureApplet :


package purse;


import javacard.framework.*;


class SecureApplet // fine costruttore


// metodo setNotNested che da inizio a chiamate di

// metodi non innestati

void setNotNested(AID actCxt) // fine metodo setNotNested


// metodo checkSecure che verifica se vi e' stato

// illegal flow

boolean checkSecure( AID prvCxt)

}

return true;


} // fine metodo checkSecure


// metodo resetNotNested che pone fine a chiamate

// di metodi non innestati

void resetNotNested()                      


} // fine metodo resetNotNested


}// fine class SecureApplet




7.2 Modifiche al codice della classe Purse


Vediamo adesso le modifiche da apportare alla classe Purse per rendere il purse effettivamente sicuro.

Per prima cosa occorre importare la nuova classe che abbiamo illustrato nel precedente paragrafo:


package purse;


import javacard.framework.*;

import airfrance.AirFranceInterface;

import purse.PurseInterface;

import purse.SecureApplet;



Successivamente occorre dichiarare, tra le variabili della classe Purse, una nuova variabile di tipo SecureApplet:




// variabili dell'applet

private SecureApplet sa = new SecureApplet();

private byte[] transactionValue = new byte[4];

private byte[] transactionID = new byte[4];

private short balance;

private short numTransaction;




Occorre poi modificare il codice del metodo debit in modo da poter settare la variabile notNestedActiveContext con l'AID dell'applet cui appartiene il metodo che sta per essere invocato (indicando che la chiamata a metodo condiviso che sta per essere invocato non dovrà formare un ciclo di chia-mate innestate) :



private void debit(APDU apdu)

} // fine metodo debit



Occorre infine modificare il metodo condiviso getTransaction che potrebbe generare flusso illegale di informazione. Dobbiamo infatti inserire, subito dopo il metodo getPreviousContextAID un controllo che verifichi se la variabile notNestedActiveContext è diversa da Null (non vogliamo cicli di chiamate innestate). In caso affermativo dobbiamo imporre un ulteriore controllo di sicurezza dinamica, imposto adesso a programma e non a livello di Firewall, che verifichi che l'AID del chiamante (prodotto da getPreviousContextAID) non differisca dall'AID dell'applet registrato nel campo-dati notNestedActiveContext (corrispondente all'applet verso cui è stato invocato il metodo in modalità non innestata) o da null (che equivale all'AID del JCRE). Se l'AID del chiamante dovesse differire allora viene settato il campo-dati checkSecure a false consentendo, al ritorno del metodo logFull, di rilevare il tentativo di flusso illegale e di sollevare un se-gnale di errore.

Se il metodo ritornava un valore, allora, in caso di flusso illegale, per non causare malfunzionamenti del sistema complessivo, occorre ritornare un valore "neutro" in grado cioè di non modificare il contenuto informativo del chiamante (nel nostro caso ritorna il valore zero).



public byte getTransaction(byte loyaltySN)


for (byte i=0;i<4;i++)

}

return transactionAmount;

}


} // fine metodo condiviso getTransaction



Verifichiamo anche graficamente (Figura 4) la correttezza e la capacità di rilevare ed evitare un flusso illegale di informazioni e dati del metodo implementativo proposto:


a seguito della chiamata ad un ciclo innestato di metodi condivisi (rap-presentato dal percorso costituito dalle frecce 1, 4 e 5 di Figura 4), quando RentaCarApplet  effettua la chiamata a getTransaction (freccia n. 5), quest'ultima rileva flusso illegale e setta la variabile checkSecure a false ritornando al metodo getBalance (freccia n. 6) un valore, il valore zero, in grado al tempo stesso di non realizzare il flusso illegale di dati ma anche di non compromettere il funzionamento del sistema.

Quando il metodo logFull si conclude (freccia n. 8) il sistema comunica all'host che è stato rilevato un tentativo (fermato) di flusso illegale di informazioni e dati emettendo il codice di errore 6A99.


Adesso l'host potrà, a seguito della segnalazione di errore, provvedere ad esempio a disinstallare RentaCarApplet per riportare il sistema nuova-mente in sicurezza.


Figura 4 : Meccanismo di rilevamento del flusso illegale


Di seguito riportiamo il recoconto delle APDU di select, command e response scambiate tra host e carta che dimostrano il corretto funziona-mento del sistema Purse_sicuro - AirFranceApplet - RentaCarApplet :



// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getCredit()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 02,

// ritorna balance

ff, ff, SW1: 90, SW2: 00


// transazione di 30I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 10I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 10, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 20I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 20, 02, Le: 00,

// response APDU; rileva il possibile illegal flow

SW1: 6a, SW2: 99


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 20I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 20, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 10I relativa a RentaCarApplet(0x03)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 10, 03, Le: 00,

// response APDU; rileva il possibile illegal flow

SW1: 6a, SW2: 99


// seleziona Purse

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 01, 01, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 20I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 20, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 30I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 30, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00


// transazione di 10I relativa a AirFranceApplet(0x02)

CLA: b0, INS: 30, P1: 00, P2: 00, Lc: 02, 10, 02, Le: 00,

// response APDU; rileva il possibile illegal flow

SW1: 6a, SW2: 99


// seleziona AirFranceApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 02, 02, Le: 00,

// response APDU

SW1: 90, SW2: 00

// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00


// seleziona RentaCarApplet

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0a, a0, 00, 00, 00, 62, 03, 01, 0c, 03, 03, Le: 00,

// response APDU

SW1: 90, SW2: 00


// invoca getPoints()

CLA: b0, INS: 40, P1: 00, P2: 00, Lc: 00, Le: 04,

// ritorna balance e extended_balance

, SW1: 90, SW2: 00




8 Generalizzazione delle tecniche di programmazione sicura viste

E' possibile ottenere una procedura che consenta all'implementatore di applet di generare un codice in grado di resistere agli attacchi di tipo "flus-so illegale di informazioni e dati" fin qui visti?


Crediamo che sia possibile dare risposta affermativa.


Concludiamo questa trattazione proponendo uno schema complessivo che rappresenta una sorta di guida per l'implementatore di applet, utile a garantire che l'applet creata non possa essere oggetto delle principali forme di flusso illegale di informazioni e dati, analizzate in questo lavoro, da parte di alcuna applet installata con cui venga ad interagire.


Le principali regole implementative ricavate sono:


Se l'applet offre metodi condivisi:

In ciascun metodo condiviso occorre invocare, necessariamente come prima istruzione del metodo, il metodo getPreviousContext-AID per ricavare l'AID dell'applet richiedente il metodo condiviso stesso e confrontare tale AID ottenuto con la lista degli AID delle applet autorizzate ad utilizzare il metodo condiviso. Se l'AID in questione non appartiene alla lista, allora l'esecuzione del metodo condiviso deve essere conclusa.

Se l'applet offre dei servizi utilizzabili da alcune applet client del sistema ma non da tutte (servizi a pagamento o a sottoscrizione):

occorre dichiarare, nell'applet in questione, una variabile della clas-se SecureApplet;

per ciascun servizio che si intende offrire ad altre applet occorre:

a.     chiamare il metodo setNotNested sulla variabile di tipo SecureApplet (per indicare che ha inizio una chiamata ad un metodo condiviso che non vogliamo formi un ciclo di chiama-te innestate) immediatamente prima di invocare il servizio stesso;

b.     chiamare il metodo resetNotNested sulla variabile di tipo SecureApplet (per indicare che ha termine una chiamata a metodo condiviso "senza ciclo" e per rilevare se vi è stato tentativo di flusso illegale) subito dopo l'istruzione di invoca-zione del servizio stesso e comunque dopo le eventuali istruzioni necessarie a garantire il corretto funzionamento del sistema; in caso si sia verificato un tentativo di flusso ille-gale, il metodo resetNotNested ritorna il codice di errore 6A99.

nell'implementazione di ciascun metodo condiviso che può subire flusso illegale a seguito di un ciclo di chiamate innestate di metodi condivisi occorre:

a.     inserire, subito dopo l'invocazione della getPreviousContext-AID, la chiamata al metodo checkSecure sulla variabile di tipo SecureApplet (per verificare si sta tentando un flusso illegale); se il metodo ritorna true (non vi è stato flusso illegale di informazioni o dati) allora la funzione può operare normalmente altrimenti il metodo in questione setta il campo-dati checkSecure a false e termina oppure, se è previsto che ritorni un valore, ritorna un valore in grado al tempo stesso di non realizzare il flusso illegale di dati e di non compromet-tere il funzionamento del sistema.








Per rendere più intelleggibile il resoconto abbiamo deciso di suddividere ogni APDU tra la sua parte select o command (caratterizzata da un allineamento a sinistra) e la parte response (caratterizzata da un allineamento a destra). Ricordiamo inioltre che i valori numerici dei vari campi degli APDUs sono espressi in base 16 e raggruppati per byte ( p.e. 0xFFFF è riportato come ff, ff ).

Scarica gratis Controllo del flusso di informazione a runtime
Appunti su:





});





Scarica 100% gratis e , tesine, riassunti



Registrati ora

Password dimenticata?
  • Appunti superiori
  • In questa sezione troverai sunti esame, dispense, appunti universitari, esercitazioni e tesi, suddivisi per le principali facoltà.
  • Università
  • Appunti, dispense, esercitazioni, riassunti direttamente dalla tua aula Universitaria
  • all'Informatica
  • Introduzione all'Informatica, Information and Comunication Tecnology, componenti del computer, software, hardware ...

Appunti database database
Tesine internet internet
Lezioni c c