SLIDE 15 A PIN Verify procedure with countermeasures (CM)
1 char triesLeft = maxTries; 2 char triesLeftBackup = -maxTries; // triesleft BACKUP 3 BYTE Verify(char buffer [4]) { 4 int i; 5 int stepCounter = INITIAL_VALUE ; // instruction counter 6 short char t1 = triesLeft; 7 if(t1 != -triesLeftBackup ) goto CM ; // check with triesleft BACKUP 8 if(triesLeft <= 0) return EXIT_FAILURE ; 9 t1 --; triesLeft = t1; triesLeftBackup ++; 10 if(triesLeft != -triesLeftBackup ) goto CM ; 11 equal = BOOL_TRUE; 12 for(i = 0; i < 4; i++) 13 {equal=equal &(( buffer[i]!= pin[i])?BOOL_FALSE : BOOL_TRUE); 14 stepCounter ++; }; 15 if(equal == BOOL_TRUE) { 16 if(equal != BOOL_TRUE) goto CM ; // redundant test 17 triesLeft = maxTries; triesLeftBackup = -maxTries; 18 if (triesLeft != -triesLeftBackup ) goto CM ; 19 authenticated = 1; 20 if( stepCounter == INITIAL_VALUE + 4) // check instruction counter 21 return EXIT_SUCCESS ; } // TO BE REACHED 22 else { 23 authenticated = 0; 24 if( stepCounter == INITIAL_VALUE + 4) // check instruction counter 25 return EXIT_FAILURE ; } 26 }
(a) Colored CFG for bb12 to be reached entry: T F CM: bb: T F bb17: bb1: bb2: T F bb3: return: bb8: T F bb4: T F bb9: T F bb5: bb6: bb7: bb10: T F bb15: T F bb11: T F bb16: bb12: T F bb13: bb14:
Lazart: a symbolic approach for evaluating the robustness of secured codes against control flow fault injections 15/19