FreeCalypso > hg > fc-sim-tools
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/Low-level-commands Sun Mar 14 07:57:09 2021 +0000 @@ -0,0 +1,196 @@ +fc-simtool is a tool built from the bottom up: at the foundation there is a set +of low-level commands that provide raw access to the actual SIM protocol APDU +commands, these low-level commands can be used to do everything that the SIM +protocol allows, and all higher-level commands merely provide user-friendly +utilities for the most common particular use cases. This document describes +these low-level commands. Readers of this document are expected to know the +SIM interface protocol as defined in GSM TS 11.11 and its successor 3GPP TS +51.011. + +Exploring and reading commands +============================== + +atr + +This command displays the ATR (Answer To Reset) byte string which the SIM sent +to the reader when it powered up. + +select File_ID + +This fc-simtool command sends a SELECT command to the SIM, follows up with a +GET RESPONSE command as expected in the T=0 protocol, and provides some human- +readable parsing of the most important fields in the SIM response structure. +If a correctly formed response was received from the SIM and this response +structure indicates that a record-based EF has been selected, the indicated +record length is saved in an internal variable used by readrec and update-rec +commands. + +The file ID can be specified either in hexadecimal (exactly 4 hex digits, *no* +0x prefix) or as a symbolic name. fc-simtool knows the following symbolic +names: + +* MF +* DF_GSM, DF_DCS1800 and DF_TELECOM +* "gsm" and "telecom" as shorthand names for DF_GSM and DF_TELECOM +* Some of the most classic EFs, but not all + +Important note: regardless of whether you specify the file ID in raw hex or +symbolically, this low-level select command will send only one SELECT command +to the SIM. Per the SIM protocol, in order to successfully select an EF, you +have to be in the right directory first, i.e., select MF, DF_GSM or DF_TELECOM +as appropriate before the EF of interest. Our low-level select command does +NOT do this extra step on its own, you have to do it explicitly, even if you +use symbolic names for EFs. + +sim-resp + +This command displays in raw hex the content of the internal buffer that holds +the last response received from the SIM. This internal buffer is filled by the +GET RESPONSE command that follows up after SELECT or RUN GSM ALGORITHM, and by +the READ BINARY or READ RECORD commands, whether they are invoked directly as +low-level commands (select, readbin, readrec or a38) or internally as part of +higher-level fc-simtool commands. + +readbin offset len + +This fc-simtool command sends a READ BINARY command to the SIM and displays the +SIM response in raw hex, internally invoking the same function as sim-resp. +The two arguments are exactly as in the READ BINARY protocol command; each +number is interpreted as decimal by default or as hex if preceded by 0x. + +readrec record-index [len] + +This fc-simtool command sends a READ RECORD command to the SIM (absolute +addressing mode) and displays the SIM response in raw hex, internally invoking +the same function as sim-resp. The arguments are decimal or hex as in the +readbin command. + +If no explicit length argument is given, readrec uses the internal variable set +by the last select operation. This one-argument form is almost always used in +practice, as the SIM will normally reject any requested length that does not +match the current EF record length. + +readef File_ID + +This fc-simtool command provides a slightly higher-level facility for examining +the content of EFs, combining select and readbin or readrec operations. The +sole File_ID argument is the same as for the low-level select command; the SIM +response to SELECT is then parsed to decide what to do next. Transparent EFs +are read using as many READ BINARY commands as necessary (up to 256 bytes can +be read in one APDU exchange) and displayed as a continuous hex dump. For +record-based EFs (linear fixed and cyclic), readef reads and separately +hex-dumps every record. + +Just like with the low-level select command, there is no built-in MF/DF +selection. + +savebin File_ID out-bin-file + +This command selects the specified EF (just like with low-level select and +readef, you need to be in the right MF/DF directory) and saves its complete +content in a raw binary file on the UNIX host file system. This command +supports all 3 types of EF (transparent, linear fixed and cyclic) and uses the +correct READ BINARY or READ RECORD commands based on the SELECT response. +Record-based EFs are read in the order of increasing record number and are saved +in the host binary file with all records simply abutted together. + +Writing commands +================ + +update-bin offset hexfile + +This fc-simtool command reads a hex data file (an ASCII text file containing +only hex byte values and nothing else, with or without white space between +bytes, newlines treated as any other white space) and sends this byte content +to the SIM in an UPDATE BINARY command. The offset argument is the same as in +the readbin command. The length is the number of bytes read from the hex data +file. + +update-bin-imm offset hex-string + +This command works like update-bin, but the bytes to be written are given as a +hex string direct argument (like an immediate operand in assembly languages), +rather than via a hex data file. + +update-rec record-index hexfile + +This fc-simtool command reads a hex data file (just like update-bin) and sends +this byte content to the SIM in an UPDATE RECORD command, using either absolute +or PREVIOUS addressing mode. The record-index argument is the same as in the +readrec command for the absolute addressing mode, or 'prev' keyword to use the +PREVIOUS addressing mode for writing to cyclic EFs. The number of bytes in the +hex data file must equal the EF record length. + +update-rec-imm record-index hex-string + +This command works like update-rec, but the bytes to be written are given as a +hex string direct argument (like an immediate operand in assembly languages), +rather than via a hex data file. + +update-rec-fill record-index fill-byte + +This fc-simtool command sends an UPDATE RECORD command to the SIM with payload +equal to the specified fill byte, replicated to the record length. The fill +byte argument is always interpreted as hexadecimal. + +restore-file File_ID host-bin-file + +This command restores a binary backup previously made with savebin back to the +SIM, or writes new bits into the EF if you can construct the necessary binary +image with tools like xxd. The arguments are the same as for the savebin +command. This command supports all 3 types of EF (transparent, linear fixed +and cyclic) and uses the correct UPDATE BINARY or UPDATE RECORD commands based +on the SELECT response. Cyclic files are restored by writing every record in +the reverse order from the last index to the first. + +erase-file File_ID [fill-byte] + +This command erases the specified EF by overwriting its content with the +specified fill byte, which defaults to 0xFF if the second argument is omitted. +All 3 EF types (transparent, linear fixed and cyclic) are supported: for +transparent EFs fc-simtool issues as many UPDATE BINARY commands as needed to +overwrite the whole file, whereas for record-based EFs every record is +overwritten with UPDATE RECORD. + +INVALIDATE and REHABILITATE +=========================== + +cur-ef-inval will send an INVALIDATE command to the SIM; cur-ef-rehab will send +a REHABILITATE command. The naming of these low-level fc-simtool commands +reflects the fact that you have to manually select the EF of interest first. + +GSM authentication testing +========================== + +a38 RAND + +This fc-simtool command exercises the SIM card's RUN GSM ALGORITHM command. +The user-specified RAND value (a hex string of 16 bytes) is sent to the SIM, +and the SIM response is parsed to display SRES and Kc. + +Per SIM specs GSM TS 11.11 and 3GPP TS 51.011, RUN GSM ALGORITHM can only be +executed when DF_GSM is selected. fc-simtool a38 command does NOT include a +built-in SELECT of DF_GSM, hence you need to manually issue 'select DF_GSM' +first. + +This a38 command can be used to verify if the SIM card's Ki and A38 algorithm +match what you expect them to be. To perform this test, issue an a38 command +to the SIM with some made-up RAND and note the SRES and Kc response. Then use +the osmo-auc-gen utility from Osmocom to run the expected algorithm with the +expected Ki (and the expected OPc if MILENAGE is used) and the same RAND, and +see if SRES and Kc match. + +Exploring proprietary APDUs +=========================== + +If the SIM you are working with is known or suspected to implement some +non-standard or proprietary APDUs for which there is no explicit support in +fc-simtool, you can use this low-level debug command to send arbitrary APDUs: + +apdu "xx xx xx xx xx ..." + +The sole argument is a raw string of bytes (quotes are needed if there are +spaces between bytes), and the APDU needs to be given exactly as it is sent in +the T=0 protocol: 5 bytes of header (including the length byte) followed by +data bytes, if any. After executing the APDU exchange, the apdu command simply +prints the SW response code from the SIM.