FreeCalypso > hg > fc-sim-tools
comparison doc/Low-level-commands @ 18:da6e9d0b2ee6
data, doc, scripts: import from previous fc-pcsc-tools repo
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sun, 14 Mar 2021 07:57:09 +0000 |
| parents | |
| children | 871281cb0555 |
comparison
equal
deleted
inserted
replaced
| 17:372ecc4aa2c4 | 18:da6e9d0b2ee6 |
|---|---|
| 1 fc-simtool is a tool built from the bottom up: at the foundation there is a set | |
| 2 of low-level commands that provide raw access to the actual SIM protocol APDU | |
| 3 commands, these low-level commands can be used to do everything that the SIM | |
| 4 protocol allows, and all higher-level commands merely provide user-friendly | |
| 5 utilities for the most common particular use cases. This document describes | |
| 6 these low-level commands. Readers of this document are expected to know the | |
| 7 SIM interface protocol as defined in GSM TS 11.11 and its successor 3GPP TS | |
| 8 51.011. | |
| 9 | |
| 10 Exploring and reading commands | |
| 11 ============================== | |
| 12 | |
| 13 atr | |
| 14 | |
| 15 This command displays the ATR (Answer To Reset) byte string which the SIM sent | |
| 16 to the reader when it powered up. | |
| 17 | |
| 18 select File_ID | |
| 19 | |
| 20 This fc-simtool command sends a SELECT command to the SIM, follows up with a | |
| 21 GET RESPONSE command as expected in the T=0 protocol, and provides some human- | |
| 22 readable parsing of the most important fields in the SIM response structure. | |
| 23 If a correctly formed response was received from the SIM and this response | |
| 24 structure indicates that a record-based EF has been selected, the indicated | |
| 25 record length is saved in an internal variable used by readrec and update-rec | |
| 26 commands. | |
| 27 | |
| 28 The file ID can be specified either in hexadecimal (exactly 4 hex digits, *no* | |
| 29 0x prefix) or as a symbolic name. fc-simtool knows the following symbolic | |
| 30 names: | |
| 31 | |
| 32 * MF | |
| 33 * DF_GSM, DF_DCS1800 and DF_TELECOM | |
| 34 * "gsm" and "telecom" as shorthand names for DF_GSM and DF_TELECOM | |
| 35 * Some of the most classic EFs, but not all | |
| 36 | |
| 37 Important note: regardless of whether you specify the file ID in raw hex or | |
| 38 symbolically, this low-level select command will send only one SELECT command | |
| 39 to the SIM. Per the SIM protocol, in order to successfully select an EF, you | |
| 40 have to be in the right directory first, i.e., select MF, DF_GSM or DF_TELECOM | |
| 41 as appropriate before the EF of interest. Our low-level select command does | |
| 42 NOT do this extra step on its own, you have to do it explicitly, even if you | |
| 43 use symbolic names for EFs. | |
| 44 | |
| 45 sim-resp | |
| 46 | |
| 47 This command displays in raw hex the content of the internal buffer that holds | |
| 48 the last response received from the SIM. This internal buffer is filled by the | |
| 49 GET RESPONSE command that follows up after SELECT or RUN GSM ALGORITHM, and by | |
| 50 the READ BINARY or READ RECORD commands, whether they are invoked directly as | |
| 51 low-level commands (select, readbin, readrec or a38) or internally as part of | |
| 52 higher-level fc-simtool commands. | |
| 53 | |
| 54 readbin offset len | |
| 55 | |
| 56 This fc-simtool command sends a READ BINARY command to the SIM and displays the | |
| 57 SIM response in raw hex, internally invoking the same function as sim-resp. | |
| 58 The two arguments are exactly as in the READ BINARY protocol command; each | |
| 59 number is interpreted as decimal by default or as hex if preceded by 0x. | |
| 60 | |
| 61 readrec record-index [len] | |
| 62 | |
| 63 This fc-simtool command sends a READ RECORD command to the SIM (absolute | |
| 64 addressing mode) and displays the SIM response in raw hex, internally invoking | |
| 65 the same function as sim-resp. The arguments are decimal or hex as in the | |
| 66 readbin command. | |
| 67 | |
| 68 If no explicit length argument is given, readrec uses the internal variable set | |
| 69 by the last select operation. This one-argument form is almost always used in | |
| 70 practice, as the SIM will normally reject any requested length that does not | |
| 71 match the current EF record length. | |
| 72 | |
| 73 readef File_ID | |
| 74 | |
| 75 This fc-simtool command provides a slightly higher-level facility for examining | |
| 76 the content of EFs, combining select and readbin or readrec operations. The | |
| 77 sole File_ID argument is the same as for the low-level select command; the SIM | |
| 78 response to SELECT is then parsed to decide what to do next. Transparent EFs | |
| 79 are read using as many READ BINARY commands as necessary (up to 256 bytes can | |
| 80 be read in one APDU exchange) and displayed as a continuous hex dump. For | |
| 81 record-based EFs (linear fixed and cyclic), readef reads and separately | |
| 82 hex-dumps every record. | |
| 83 | |
| 84 Just like with the low-level select command, there is no built-in MF/DF | |
| 85 selection. | |
| 86 | |
| 87 savebin File_ID out-bin-file | |
| 88 | |
| 89 This command selects the specified EF (just like with low-level select and | |
| 90 readef, you need to be in the right MF/DF directory) and saves its complete | |
| 91 content in a raw binary file on the UNIX host file system. This command | |
| 92 supports all 3 types of EF (transparent, linear fixed and cyclic) and uses the | |
| 93 correct READ BINARY or READ RECORD commands based on the SELECT response. | |
| 94 Record-based EFs are read in the order of increasing record number and are saved | |
| 95 in the host binary file with all records simply abutted together. | |
| 96 | |
| 97 Writing commands | |
| 98 ================ | |
| 99 | |
| 100 update-bin offset hexfile | |
| 101 | |
| 102 This fc-simtool command reads a hex data file (an ASCII text file containing | |
| 103 only hex byte values and nothing else, with or without white space between | |
| 104 bytes, newlines treated as any other white space) and sends this byte content | |
| 105 to the SIM in an UPDATE BINARY command. The offset argument is the same as in | |
| 106 the readbin command. The length is the number of bytes read from the hex data | |
| 107 file. | |
| 108 | |
| 109 update-bin-imm offset hex-string | |
| 110 | |
| 111 This command works like update-bin, but the bytes to be written are given as a | |
| 112 hex string direct argument (like an immediate operand in assembly languages), | |
| 113 rather than via a hex data file. | |
| 114 | |
| 115 update-rec record-index hexfile | |
| 116 | |
| 117 This fc-simtool command reads a hex data file (just like update-bin) and sends | |
| 118 this byte content to the SIM in an UPDATE RECORD command, using either absolute | |
| 119 or PREVIOUS addressing mode. The record-index argument is the same as in the | |
| 120 readrec command for the absolute addressing mode, or 'prev' keyword to use the | |
| 121 PREVIOUS addressing mode for writing to cyclic EFs. The number of bytes in the | |
| 122 hex data file must equal the EF record length. | |
| 123 | |
| 124 update-rec-imm record-index hex-string | |
| 125 | |
| 126 This command works like update-rec, but the bytes to be written are given as a | |
| 127 hex string direct argument (like an immediate operand in assembly languages), | |
| 128 rather than via a hex data file. | |
| 129 | |
| 130 update-rec-fill record-index fill-byte | |
| 131 | |
| 132 This fc-simtool command sends an UPDATE RECORD command to the SIM with payload | |
| 133 equal to the specified fill byte, replicated to the record length. The fill | |
| 134 byte argument is always interpreted as hexadecimal. | |
| 135 | |
| 136 restore-file File_ID host-bin-file | |
| 137 | |
| 138 This command restores a binary backup previously made with savebin back to the | |
| 139 SIM, or writes new bits into the EF if you can construct the necessary binary | |
| 140 image with tools like xxd. The arguments are the same as for the savebin | |
| 141 command. This command supports all 3 types of EF (transparent, linear fixed | |
| 142 and cyclic) and uses the correct UPDATE BINARY or UPDATE RECORD commands based | |
| 143 on the SELECT response. Cyclic files are restored by writing every record in | |
| 144 the reverse order from the last index to the first. | |
| 145 | |
| 146 erase-file File_ID [fill-byte] | |
| 147 | |
| 148 This command erases the specified EF by overwriting its content with the | |
| 149 specified fill byte, which defaults to 0xFF if the second argument is omitted. | |
| 150 All 3 EF types (transparent, linear fixed and cyclic) are supported: for | |
| 151 transparent EFs fc-simtool issues as many UPDATE BINARY commands as needed to | |
| 152 overwrite the whole file, whereas for record-based EFs every record is | |
| 153 overwritten with UPDATE RECORD. | |
| 154 | |
| 155 INVALIDATE and REHABILITATE | |
| 156 =========================== | |
| 157 | |
| 158 cur-ef-inval will send an INVALIDATE command to the SIM; cur-ef-rehab will send | |
| 159 a REHABILITATE command. The naming of these low-level fc-simtool commands | |
| 160 reflects the fact that you have to manually select the EF of interest first. | |
| 161 | |
| 162 GSM authentication testing | |
| 163 ========================== | |
| 164 | |
| 165 a38 RAND | |
| 166 | |
| 167 This fc-simtool command exercises the SIM card's RUN GSM ALGORITHM command. | |
| 168 The user-specified RAND value (a hex string of 16 bytes) is sent to the SIM, | |
| 169 and the SIM response is parsed to display SRES and Kc. | |
| 170 | |
| 171 Per SIM specs GSM TS 11.11 and 3GPP TS 51.011, RUN GSM ALGORITHM can only be | |
| 172 executed when DF_GSM is selected. fc-simtool a38 command does NOT include a | |
| 173 built-in SELECT of DF_GSM, hence you need to manually issue 'select DF_GSM' | |
| 174 first. | |
| 175 | |
| 176 This a38 command can be used to verify if the SIM card's Ki and A38 algorithm | |
| 177 match what you expect them to be. To perform this test, issue an a38 command | |
| 178 to the SIM with some made-up RAND and note the SRES and Kc response. Then use | |
| 179 the osmo-auc-gen utility from Osmocom to run the expected algorithm with the | |
| 180 expected Ki (and the expected OPc if MILENAGE is used) and the same RAND, and | |
| 181 see if SRES and Kc match. | |
| 182 | |
| 183 Exploring proprietary APDUs | |
| 184 =========================== | |
| 185 | |
| 186 If the SIM you are working with is known or suspected to implement some | |
| 187 non-standard or proprietary APDUs for which there is no explicit support in | |
| 188 fc-simtool, you can use this low-level debug command to send arbitrary APDUs: | |
| 189 | |
| 190 apdu "xx xx xx xx xx ..." | |
| 191 | |
| 192 The sole argument is a raw string of bytes (quotes are needed if there are | |
| 193 spaces between bytes), and the APDU needs to be given exactly as it is sent in | |
| 194 the T=0 protocol: 5 bytes of header (including the length byte) followed by | |
| 195 data bytes, if any. After executing the APDU exchange, the apdu command simply | |
| 196 prints the SW response code from the SIM. |
