C A P I T O L O
6
Risultati ottenuti
Vengono proposti ora due dump di una verifica verbosa (per comodità sono state
riportate solo le parti “interessanti” dell’output, cioè i punti in cui si devono
applicare le regole enunciate nel capitolo 3 della tesi) ed una tabella riepilogativa di
verifiche effettuate con il tool implementato; nella tabella viene visualizzata la
dimensione massima del dizionario per il verificatore standard, cioè il numero di
massimo di frames di targets differenti, e la dimensione massima per il verificatore
basato sull’ipd, con e senza frames duplicati.
6.1 Verifica
verbosa:
JavaPurse, method number 8
Caratteristica: tableswitch che falsa la "reale" dimensione del dizionario. package com.sun.javacard.samples.JavaPurse.JavaPurse
method number 8 ['private void processCompleteUpdate(javacard.framework.APDU apdu)'] Ipd:
97: tableswitch[170](67) -> {278, 164, 180, 278, ...} IPD = 284: aload_0[42](1) Instruction list: .... 97: tableswitch[170](67) -> {278, 164, 180, 278, ...} 164: aload_0[42](1) 165: aload_1[43](1) 166: aload_0[42](1) 167: getfield[180](3) 22 170: invokespecial[183](3) 62 173: aload_0[42](1) 174: invokespecial[183](3) 63 177: goto[167](3) -> 284: aload_0 180: aload_0[42](1) 181: aload_1[43](1) 182: aload_0[42](1) 183: getfield[180](3) 23 186: invokespecial[183](3) 62 189: goto[167](3) -> 284: aload_0 192: aload_0[42](1) 193: aload_1[43](1) 194: aload_0[42](1) 195: getfield[180](3) 5 198: invokespecial[183](3) 64 201: goto[167](3) -> 284: aload_0
CAPITOLO 6:RISULTATI OTTENUTI 204: aload_0[42](1) 205: aload_1[43](1) 206: aload_0[42](1) 207: getfield[180](3) 4 210: invokespecial[183](3) 64 213: goto[167](3) -> 284: aload_0 216: aload_0[42](1) 217: aload_1[43](1) 218: iconst_2[5](1) 219: invokespecial[183](3) 65 222: goto[167](3) -> 284: aload_0 225: aload_0[42](1) 226: aload_1[43](1) 227: iconst_4[7](1) 228: invokespecial[183](3) 65 231: goto[167](3) -> 284: aload_0 234: aload_0[42](1) 235: aload_1[43](1) 236: invokespecial[183](3) 66 239: goto[167](3) -> 284: aload_0 242: aload_0[42](1) 243: aload_1[43](1) 244: iconst_0[3](1) 245: invokespecial[183](3) 67 248: goto[167](3) -> 284: aload_0 251: aload_0[42](1) 252: aload_1[43](1) 253: iconst_1[4](1) 254: invokespecial[183](3) 67 257: goto[167](3) -> 284: aload_0 260: aload_0[42](1) 261: aload_1[43](1) 262: iconst_2[5](1) 263: invokespecial[183](3) 67 266: goto[167](3) -> 284: aload_0 269: aload_0[42](1) 270: aload_1[43](1) 271: iconst_3[6](1) 272: invokespecial[183](3) 67 275: goto[167](3) -> 284: aload_0 278: sipush[17](3) 27265 281: invokestatic[184](3) 39 284: aload_0[42](1) 285: getfield[180](3) 19 288: iconst_0[3](1) 289: aload_0[42](1) 290: getfield[180](3) 19 293: arraylength[190](1) 294: i2s[147](1) 295: iconst_0[3](1) 296: invokestatic[184](3) 54 299: pop[87](1) 300: aload_0[42](1) 301: getfield[180](3) 19 304: iconst_0[3](1) 305: aload_2[44](1) 306: iconst_0[3](1) 307: bipush[16](2) 8 309: invokestatic[184](3) 48 312: pop[87](1) 313: aload_1[43](1) 314: iconst_0[3](1) 315: bipush[16](2) 8 317: invokevirtual[182](3) 49 320: aload_0[42](1) 321: getfield[180](3) 16 324: iconst_1[4](1) 325: iconst_0[3](1)
CAPITOLO 6:RISULTATI OTTENUTI 326: bastore[84](1) 327: return[177](1) .... Verifica verbosa: ... ...
Istruzione eseguita: 97: tableswitch[170](67) -> {278, 164, 180, 278, ...} apertura salto condizionato: aggiorno dizionario
/***** inizio aggiornamento dizionario ****************/ Aggiunta una entry al dizionario: 278: sipush[17](3) 27265 Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:1 Dimensione reale del dizionario:1
Aggiunta una entry al dizionario: 180: aload_0[42](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:2 Dimensione reale del dizionario:1
Aggiunta una entry al dizionario: 192: aload_0[42](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:3 Dimensione reale del dizionario:1
Aggiunta una entry al dizionario: 204: aload_0[42](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:4 Dimensione reale del dizionario:1
CAPITOLO 6:RISULTATI OTTENUTI
Aggiunta una entry al dizionario: 216: aload_0[42](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:5 Dimensione reale del dizionario:1
Aggiunta una entry al dizionario: 225: aload_0[42](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:6 Dimensione reale del dizionario:1
Aggiunta una entry al dizionario: 234: aload_0[42](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:7 Dimensione reale del dizionario:1
Aggiunta una entry al dizionario: 242: aload_0[42](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:8 Dimensione reale del dizionario:1
Aggiunta una entry al dizionario: 251: aload_0[42](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:9 Dimensione reale del dizionario:1
Aggiunta una entry al dizionario: 260: aload_0[42](1) Frame:
CAPITOLO 6:RISULTATI OTTENUTI Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:10 Dimensione reale del dizionario:1
Aggiunta una entry al dizionario: 269: aload_0[42](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:11 Dimensione reale del dizionario:1
/***** fine aggiornamento dizionario *****************/ Istruzione eseguita: 164: aload_0[42](1)
Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 1 MaxStack: 6.
com.sun.javacard.samples.JavaPurse.JavaPurse (Size: 1) ....
....
Istruzione eseguita: 177: goto[167](3) -> 284: aload_0 Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
/********************************************************************/ Aggiornata una entry del dizionario: 284: aload_0[42](1)
Dimensione apparente del dizionario:12 Dimensione reale del dizionario:1
Raggiunto ipd ma restano ancora rami da esaminare: esecuzione rimandata /********************************************************************/ ....
....
Istruzione eseguita: 278: sipush[17](3) 27265 Frame:
Local Variables:
0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU
CAPITOLO 6:RISULTATI OTTENUTI
2: byte[] 3: int 4: int OperandStack:
Slots used: 1 MaxStack: 6. int (Size: 1)
Istruzione eseguita: 281: invokestatic[184](3) 39 Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 0 MaxStack: 6.
/********************************************************************/ Aggiornata una entry del dizionario: 284: aload_0[42](1)
Dimensione apparente del dizionario:12 Dimensione reale del dizionario:1
Raggiunto ipd e tutti rami eseguiti: aggiorno currentInFrame Rimozione entries non necessarie:
[ 278: sipush[17](3) 27265, 180: aload_0[42](1), 192: aload_0[42](1), 204: aload_0[42](1), 216: aload_0[42](1), 225: aload_0[42](1), 234: aload_0[42](1), 242: aload_0[42](1), 251: aload_0[42](1), 260: aload_0[42](1), 269: aload_0[42](1), 284: aload_0[42](1) ] Dimensione apparente del dizionario:0
Dimensione reale del dizionario:0
/********************************************************************/ Istruzione eseguita: 284: aload_0[42](1)
Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: int 4: int OperandStack:
Slots used: 1 MaxStack: 6.
com.sun.javacard.samples.JavaPurse.JavaPurse (Size: 1) ....
CAPITOLO 6:RISULTATI OTTENUTI
6.2 Verifica
verbosa:
JavaPurse, method number 6
Caratteristica: blocchi sequenziali che consentono di rimuovere entries dal dizionario package com.sun.javacard.samples.JavaPurse.JavaPurse
method number 6 ['private void processCompleteTransaction(javacard.framework.APDU apdu)']
Ipds:
6: ifne[154](3) -> 15: aload_1 IPD = 15: aload_1[43](1) 25: if_icmpeq[159](3) -> 34: aload_2 IPD = 34: aload_2[44](1) Instruction list: .... 5: baload[51](1) 6: ifne[154](3) -> 15: aload_1 9: sipush[17](3) -28412 12: invokestatic[184](3) 39 15: aload_1[43](1) 16: invokevirtual[182](3) 34 19: astore_2[77](1) 20: aload_2[44](1) 21: iconst_4[7](1) 22: baload[51](1) 23: bipush[16](2) 13 25: if_icmpeq[159](3) -> 34: aload_2 28: sipush[17](3) 26368 31: invokestatic[184](3) 39 34: aload_2[44](1) .... Verifica verbosa: ... ...
Istruzione eseguita: 5: baload[51](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: <unknown object> 3: <unknown object> 4: <unknown object> 5: <unknown object> 6: <unknown object> 7: <unknown object> 8: <unknown object> 9: <unknown object> 10: <unknown object> OperandStack:
Slots used: 1 MaxStack: 6. int (Size: 1)
Istruzione eseguita: 6: ifne[154](3) -> 15: aload_1 Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: <unknown object> 3: <unknown object> 4: <unknown object> 5: <unknown object> 6: <unknown object> 7: <unknown object> 8: <unknown object>
CAPITOLO 6:RISULTATI OTTENUTI
9: <unknown object> 10: <unknown object> OperandStack:
Slots used: 0 MaxStack: 6.
apertura salto condizionato: aggiorno dizionario
/***** inizio aggiornamento dizionario ****************/ Aggiunta una entry al dizionario: 15: aload_1[43](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: <unknown object> 3: <unknown object> 4: <unknown object> 5: <unknown object> 6: <unknown object> 7: <unknown object> 8: <unknown object> 9: <unknown object> 10: <unknown object> OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:1 Dimensione reale del dizionario:1
/***** fine aggiornamento dizionario *****************/ Istruzione eseguita: 9: sipush[17](3) -28412
Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: <unknown object> 3: <unknown object> 4: <unknown object> 5: <unknown object> 6: <unknown object> 7: <unknown object> 8: <unknown object> 9: <unknown object> 10: <unknown object> OperandStack:
Slots used: 1 MaxStack: 6. int (Size: 1)
Istruzione eseguita: 12: invokestatic[184](3) 39 Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: <unknown object> 3: <unknown object> 4: <unknown object> 5: <unknown object> 6: <unknown object> 7: <unknown object> 8: <unknown object> 9: <unknown object> 10: <unknown object> OperandStack:
CAPITOLO 6:RISULTATI OTTENUTI
/*****************************************************************/ Aggiornata una entry del dizionario: 15: aload_1[43](1)
Dimensione apparente del dizionario:1 Dimensione reale del dizionario:1
Raggiunto ipd e tutti rami eseguiti: aggiorno currentInFrame Rimozione entries non necessarie:[ 15: aload_1[43](1)] Dimensione apparente del dizionario:0
Dimensione reale del dizionario:0
/*****************************************************************/ ...
...
Istruzione eseguita: 23: bipush[16](2) 13 Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: <unknown object> 4: <unknown object> 5: <unknown object> 6: <unknown object> 7: <unknown object> 8: <unknown object> 9: <unknown object> 10: <unknown object> OperandStack:
Slots used: 2 MaxStack: 6. int (Size: 1)
int (Size: 1)
Istruzione eseguita: 25: if_icmpeq[159](3) -> 34: aload_2 Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: <unknown object> 4: <unknown object> 5: <unknown object> 6: <unknown object> 7: <unknown object> 8: <unknown object> 9: <unknown object> 10: <unknown object> OperandStack:
Slots used: 0 MaxStack: 6.
apertura salto condizionato: aggiorno dizionario
/***** inizio aggiornamento dizionario ****************/ Aggiunta una entry al dizionario: 34: aload_2[44](1) Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: <unknown object> 4: <unknown object> 5: <unknown object> 6: <unknown object> 7: <unknown object> 8: <unknown object> 9: <unknown object> 10: <unknown object> OperandStack:
Slots used: 0 MaxStack: 6.
Dimensione apparente del dizionario:1 Dimensione reale del dizionario:1
CAPITOLO 6:RISULTATI OTTENUTI
/***** fine aggiornamento dizionario *****************/ Istruzione eseguita: 28: sipush[17](3) 26368
Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: <unknown object> 4: <unknown object> 5: <unknown object> 6: <unknown object> 7: <unknown object> 8: <unknown object> 9: <unknown object> 10: <unknown object> OperandStack:
Slots used: 1 MaxStack: 6. int (Size: 1)
Istruzione eseguita: 31: invokestatic[184](3) 39 Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: <unknown object> 4: <unknown object> 5: <unknown object> 6: <unknown object> 7: <unknown object> 8: <unknown object> 9: <unknown object> 10: <unknown object> OperandStack:
Slots used: 0 MaxStack: 6.
/*****************************************************************/ Aggiornata una entry del dizionario: 34: aload_2[44](1)
Dimensione apparente del dizionario:1 Dimensione reale del dizionario:1
Raggiunto ipd e tutti rami eseguiti: aggiorno currentInFrame Rimozione entries non necessarie:[ 34: aload_2[44](1)] Dimensione apparente del dizionario:0
Dimensione reale del dizionario:0
/*****************************************************************/ Istruzione eseguita: 34: aload_2[44](1)
Frame: Local Variables: 0: com.sun.javacard.samples.JavaPurse.JavaPurse 1: javacard.framework.APDU 2: byte[] 3: <unknown object> 4: <unknown object> 5: <unknown object> 6: <unknown object> 7: <unknown object> 8: <unknown object> 9: <unknown object> 10: <unknown object> OperandStack:
Slots used: 1 MaxStack: 6. byte[] (Size: 1)
.... ....
CAPITOLO 6:RISULTATI OTTENUTI
6.3 Tabella sintetica dei risultati
Metodo Verificatore standard Verificatore basato sull’ipd Verificatore basato sull’ipd, senza frames duplicati nel dizionario com.sun.javacard.samples.JavaPurse.JavaPurse processInitializeTransaction(...) 4 1(25%) 1(25%) processCompleteTransaction(...) 12 3(25%) 1(9%) processInitializeUpdate(...) 4 2(50%) 1(25%) processCompleteUpdate(...) 16 12(75%) 1(7%) processVerifyPIN(...) 4 3(75%) 1(25%) checkTransactionValues(...) 5 4(80%) 2(40%) setIsPersonalized() 1 1(100%) 1(100%) updateParametersFile(...) 2 2(100%) 1(50%) processSelectFile(...) 5 4(80%) 2(40%) processReadRecord(...) 22 7(32%) 2(9%) updateLoyaltyProgram(...) 3 2(67%) 2(67%) com.sun.javacard.samples.wallet.Wallet process(...) 6 5(84%) 1(17%) credit(...) 6 2(34%) 1(17%) debit(...) 6 2(34%) 1(17%) getBalance(...) 1 1(100%) 1(100%)
CAPITOLO 6:RISULTATI OTTENUTI com.sun.javacard.samples.JavaLoyalty.JavaLoyalty grantPoints(...) 4 2(50%) 1(25%) getShareableInterfaceObject(...) 1 1(100%) 1(100%) com.sun.javacard.samples.SecureRMIDemo.SecurePurseImpl debit(...) 4 1(25%) 1(25%) credit(...) 4 1(25%) 1(25%) getBalance(...) 2 1(50%) 1(50%) setAccountNumber(...) 3 1(34%) 1(34%) getAccountNumber(...) 2 1(50%) 1(50%) com.sun.javacard.samples.SecureRMIDemo.MySecurityService isCommandSecure(...) 2 2(100%) 1(50%) isAuthenticated(...) 2 2(100%) 1(50%) checkAndRemoveChecksum(...) 5 3(60%) 1(20%) com.sun.javacard.samples.JavaPurse.ParametersFile addRecord(...) 1 1(100%) 1(100%) getRecord(...) 2 2(100%) 1(50%) findRecord(...) 5 4(80%) 2(40%) com.sun.javacard.samples.ChannelsDemo.ConnectionManager process(...) 5 4(80%) 1(20%) timeTick(...) 6 2(34%) 1(17%) setConnection(...) 5 2(40%) 1(20%)
CAPITOLO 6:RISULTATI OTTENUTI com.sun.javacard.samples.HelloWorld.HelloWorld process(...) 2 2(100%) 1(50%) com.sun.javacard.samples.ChannelsDemo.AccountAccessor process(...) 4 3(75%) 1(25%) debit(...) 3 2(67%) 1(34%) credit(...) 5 2(40%) 1(20%) getBalance(...) 1 1(100%) 1(100%) com.sun.javacard.samples.odSample.packageA.A setupTransient() 4 2(50%) 1(25%) verifyTransientDeselect() 5 4(80%) 2(20%) verifyTransientReset() 5 4(80%) 2(20%) analyzeRemoveTrees() 3 1(34%) 1(34%) analyzeTransientDeselectMem() 3 1(34%) 1(34%) analyzeTransientResetMem() 2 1(50%) 1(50%) analyzeRemoveAllAttributes() 3 1(34%) 1(34%) compareWithInitial() 1 1(100%) 1(100%) getShareableRef() 2 1(50%) 1(50%) process(...) 15 15(100%) 2(14%)