|
Appunti informatica |
|
Visite: 1857 | Gradito: | [ Grande appunti ] |
Leggi anche appunti:La sicurezza delle Java cardLa sicurezza delle Java card Le procedure di sicurezza delle Java Card sono La politica di sicurezza dinamica mediante FirewallLa politica di sicurezza dinamica mediante Firewall La politica di sicurezza Controllo del flusso di informazione a runtimeControllo del flusso di informazione a runtime In questo capitolo analizzeremo |
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.
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.
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
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.
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
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
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
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
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.
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.
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
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.
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.
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
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.
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.
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
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
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
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.
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
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
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 ).
Appunti su: |
|
Appunti database | |
Tesine internet | |
Lezioni c | |