FreeCalypso > hg > fc-sim-tools
annotate simtool/inval_rehab.c @ 87:0e46bbb801e0
fc-uicc-tool: internal code in preparation for porting
extended readef, savebin, restore-file and erase-file commands
from fc-simtool
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Sun, 11 Apr 2021 03:52:48 +0000 | 
| parents | ddd767f6e15b | 
| children | 
| rev | line source | 
|---|---|
| 10 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 * This module implements the rarely-used INVALIDATE and REHABILITATE | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 * SIM protocol commands. | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 */ | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 #include <sys/types.h> | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 #include <stdio.h> | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 #include "simresp.h" | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 #include "file_id.h" | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 current_ef_inval() | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 u_char cmd[5]; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 int rc; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 /* INVALIDATE command APDU */ | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 cmd[0] = 0xA0; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 cmd[1] = 0x04; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 cmd[2] = 0; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 cmd[3] = 0; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 cmd[4] = 0; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 rc = apdu_exchange(cmd, 5); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 if (sim_resp_sw != 0x9000) { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 fprintf(stderr, "bad SW response to INVALIDATE: %04X\n", | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 sim_resp_sw); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 return(-1); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 return(0); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 current_ef_rehab() | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 u_char cmd[5]; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 int rc; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 /* REHABILITATE command APDU */ | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 39 cmd[0] = 0xA0; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 cmd[1] = 0x44; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 cmd[2] = 0; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 cmd[3] = 0; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 cmd[4] = 0; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 rc = apdu_exchange(cmd, 5); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 if (sim_resp_sw != 0x9000) { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 fprintf(stderr, "bad SW response to REHABILITATE: %04X\n", | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 sim_resp_sw); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 return(-1); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 return(0); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 cmd_inval_adn() | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 int rc; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 rc = select_op(DF_TELECOM); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 rc = select_op(EF_ADN); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 65 return current_ef_inval(); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 66 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 67 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 cmd_rehab_adn() | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 70 int rc; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 71 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 72 rc = select_op(DF_TELECOM); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 74 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 75 rc = select_op(EF_ADN); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 76 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 77 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 78 return current_ef_rehab(); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 79 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 80 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 81 cmd_rehab_imsi() | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 82 { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 83 int rc; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 84 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 85 rc = select_op(DF_GSM); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 86 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 87 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 88 rc = select_op(EF_IMSI); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 89 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 90 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 91 return current_ef_rehab(); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 92 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 93 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 94 cmd_rehab_loci() | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 95 { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 96 int rc; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 97 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 98 rc = select_op(DF_GSM); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 99 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 100 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 101 rc = select_op(EF_LOCI); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 102 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 103 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 104 return current_ef_rehab(); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 105 } | 
