blob: 3d56c6d74767fae65a0c34023aa0a0a7b63a0c02 [file] [log] [blame]
Harald Welte94e87352021-04-02 13:38:00 +02001pySim-shell
2===========
Harald Weltebe9516f2021-04-03 11:30:10 +02003
4pySim-shell is an interactive command line shell for all kind of interactions with SIM cards.
5
6The interactive shell provides command for
7
8* navigating the on-card filesystem hierarchy
9* authenticating with PINs such as ADM1
10* CHV/PIN management (VERIFY, ENABLE, DISABLE, UNBLOCK)
11* decoding of SELECT response (file control parameters)
12* reading and writing of files and records in raw, hex-encoded binary format
13* for some files where related support has been developed:
14
15 * decoded reading (display file data in JSON format)
16 * decoded writing (encode from JSON to binary format, then write)
17
18By means of using the python ``cmd2`` module, various useful features improve usability:
19
20* history of commands (persistent across restarts)
21* output re-direction to files on your computer
22* output piping through external tools like 'grep'
23* tab completion of commands and SELECT-able files/directories
24* interactive help for all commands
25
Harald Weltef2e761c2021-04-11 11:56:44 +020026Running pySim-shell
27-------------------
28
29pySim-shell has a variety of command line arguments to control
30
31* which transport to use (how to use a reader to talk to the SIM card)
32* whether to automatically verify an ADM pin (and in which format)
33* whether to execute a start-up script
34
35.. argparse::
36 :module: pySim-shell
37 :func: option_parser
38
39
Harald Weltebe9516f2021-04-03 11:30:10 +020040
41cmd2 basics
42-----------
43
44FIXME
45
46
47
48ISO7816 commands
49----------------
50
51This category of commands relates to commands that originate in the ISO 7861-4 specifications,
52most of them have a 1:1 resemblance in the specification.
53
54select
55~~~~~~
56
57The ``select`` command is used to select a file, either by its FID, AID or by its symbolic name.
58
59Try ``select`` with tab-completion to get a list of all current selectable items:
60
61::
62
63 pySIM-shell (MF)> select
64 .. 2fe2 a0000000871004 EF.ARR MF
65 2f00 3f00 ADF.ISIM EF.DIR
66 2f05 7f10 ADF.USIM EF.ICCID
67 2f06 7f20 DF.GSM EF.PL
68 2f08 a0000000871002 DF.TELECOM EF.UMPC
69
70Use ``select`` with a specific FID or name to select the new file.
71
72This will
73
74* output the [JSON decoded, if possible] select response
75* change the prompt to the newly selected file
76* enable any commands specific to the newly-selected file
77
78::
79
80 pySIM-shell (MF)> select ADF.USIM
81 {
82 "file_descriptor": {
83 "shareable": true,
84 "file_type": "df",
85 "structure": "no_info_given"
86 },
87 "df_name": "A0000000871002FFFFFFFF8907090000",
88 "proprietary_info": {
89 "uicc_characteristics": "71",
90 "available_memory": 101640
91 },
92 "life_cycle_status_int": "operational_activated",
93 "security_attrib_compact": "00",
94 "pin_status_template_do": "90017083010183018183010A83010B"
95 }
96 pySIM-shell (MF/ADF.USIM)>
97
98
99
100change_chv
101~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200102.. argparse::
103 :module: pySim-shell
104 :func: Iso7816Commands.change_chv_parser
Harald Weltebe9516f2021-04-03 11:30:10 +0200105
106
107disable_chv
108~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200109.. argparse::
110 :module: pySim-shell
111 :func: Iso7816Commands.disable_chv_parser
Harald Weltebe9516f2021-04-03 11:30:10 +0200112
Harald Weltebe9516f2021-04-03 11:30:10 +0200113
114enable_chv
115~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200116.. argparse::
117 :module: pySim-shell
118 :func: Iso7816Commands.enable_chv_parser
Harald Weltebe9516f2021-04-03 11:30:10 +0200119
120
121unblock_chv
122~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200123.. argparse::
124 :module: pySim-shell
125 :func: Iso7816Commands.unblock_chv_parser
Harald Weltebe9516f2021-04-03 11:30:10 +0200126
Harald Weltebe9516f2021-04-03 11:30:10 +0200127
128verify_chv
129~~~~~~~~~~
Harald Weltebe9516f2021-04-03 11:30:10 +0200130This command allows you to verify a CHV (PIN), which is how the specifications call
131it if you authenticate yourself with the said CHV/PIN.
132
Harald Welted36f6942021-04-04 14:37:55 +0200133.. argparse::
134 :module: pySim-shell
135 :func: Iso7816Commands.verify_chv_parser
136
Harald Weltea4631612021-04-10 18:17:55 +0200137deactivate_file
138~~~~~~~~~~~~~~~
139Deactivate the currently selected file. This used to be called INVALIDATE in TS 11.11.
140
141
142activate_file
143~~~~~~~~~~~~~
144Activate the currently selected file. This used to be called REHABILITATE in TS 11.11.
Harald Weltebe9516f2021-04-03 11:30:10 +0200145
Harald Welte703f9332021-04-10 18:39:32 +0200146open_channel
147~~~~~~~~~~~~
148.. argparse::
149 :module: pySim-shell
150 :func: Iso7816Commands.open_chan_parser
151
152close_channel
153~~~~~~~~~~~~~
154.. argparse::
155 :module: pySim-shell
156 :func: Iso7816Commands.close_chan_parser
157
Harald Weltebe9516f2021-04-03 11:30:10 +0200158
Harald Welteec950532021-10-20 13:09:00 +0200159suspend_uicc
160~~~~~~~~~~~~
161This command allows you to perform the SUSPEND UICC command on the card. This is a relatively
162recent power-saving addition to the UICC specifications, allowing for suspend/resume while maintaining
163state, as opposed to a full power-off (deactivate) and power-on (activate) of the card.
164
165The pySim command just sends that SUSPEND UICC command and doesn't perform the full related sequence
166including the electrical power down.
167
168.. argparse::
169 :module: pySim-shell
170 :func: Iso7816Commands.suspend_uicc_parser
171
172
Harald Weltebe9516f2021-04-03 11:30:10 +0200173pySim commands
174--------------
175
176Commands in this category are pySim specific; they do not have a 1:1 correspondence to ISO 7816
177or 3GPP commands. Mostly they will operate either only on local (in-memory) state, or execute
178a complex sequence of card-commands.
179
180desc
181~~~~
182
183Display human readable file description for the currently selected file.
184
185
186dir
187~~~
Harald Welted36f6942021-04-04 14:37:55 +0200188.. argparse::
189 :module: pySim-shell
190 :func: PySimCommands.dir_parser
Harald Weltebe9516f2021-04-03 11:30:10 +0200191
192
193export
194~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200195.. argparse::
196 :module: pySim-shell
197 :func: PySimCommands.export_parser
198
Harald Weltebe9516f2021-04-03 11:30:10 +0200199
200tree
201~~~~
Harald Welte7743c202021-05-03 23:30:11 +0200202
203Display a tree of the card filesystem. It is important to note that this displays a tree
204of files that might potentially exist (based on the card profile). In order to determine if
205a given file really exists on a given card, you have to try to select that file.
Harald Welted36f6942021-04-04 14:37:55 +0200206
Harald Weltebe9516f2021-04-03 11:30:10 +0200207
208verify_adm
209~~~~~~~~~~
Harald Welte7743c202021-05-03 23:30:11 +0200210
211Verify the ADM (Administrator) PIN specified as argument. This is typically needed in order
212to get write/update permissions to most of the files on SIM cards.
213
214Currently only ADM1 is supported.
Harald Weltebe9516f2021-04-03 11:30:10 +0200215
216
Harald Weltedaf2b392021-05-03 23:17:29 +0200217reset
218~~~~~
219
220Perform card reset and display the card ATR.
221
222
Harald Weltebe9516f2021-04-03 11:30:10 +0200223Linear Fixed EF commands
224------------------------
225
226These commands become enabled only when your currently selected file is of *Linear Fixed EF* type.
227
228read_record
229~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200230.. argparse::
231 :module: pySim.filesystem
232 :func: LinFixedEF.ShellCommands.read_rec_parser
233
Harald Weltebe9516f2021-04-03 11:30:10 +0200234
235read_record_decoded
236~~~~~~~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200237.. argparse::
238 :module: pySim.filesystem
239 :func: LinFixedEF.ShellCommands.read_rec_dec_parser
240
Harald Weltebe9516f2021-04-03 11:30:10 +0200241
Harald Welte850b72a2021-04-07 09:33:03 +0200242read_records
243~~~~~~~~~~~~
244.. argparse::
245 :module: pySim.filesystem
246 :func: LinFixedEF.ShellCommands.read_recs_parser
247
248
249read_records_decoded
250~~~~~~~~~~~~~~~~~~~~
251.. argparse::
252 :module: pySim.filesystem
253 :func: LinFixedEF.ShellCommands.read_recs_dec_parser
254
255
Harald Weltebe9516f2021-04-03 11:30:10 +0200256update_record
257~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200258.. argparse::
259 :module: pySim.filesystem
260 :func: LinFixedEF.ShellCommands.upd_rec_parser
261
Harald Weltebe9516f2021-04-03 11:30:10 +0200262
263update_record_decoded
264~~~~~~~~~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200265.. argparse::
266 :module: pySim.filesystem
267 :func: LinFixedEF.ShellCommands.upd_rec_dec_parser
Harald Weltebe9516f2021-04-03 11:30:10 +0200268
269
Harald Welte4145d3c2021-04-08 20:34:13 +0200270edit_record_decoded
271~~~~~~~~~~~~~~~~~~~
272.. argparse::
273 :module: pySim.filesystem
274 :func: LinFixedEF.ShellCommands.edit_rec_dec_parser
275
276This command will read the selected record, decode it to its JSON representation, save
277that JSON to a temporary file on your computer, and launch your configured text editor.
278
279You may then perform whatever modifications to the JSON representation, save + leave your
280text editor.
281
282Afterwards, the modified JSON will be re-encoded to the binary format, and the result written
283back to the record on the SIM card.
284
285This allows for easy interactive modification of records.
286
287
Harald Weltebe9516f2021-04-03 11:30:10 +0200288
289Transparent EF commands
290-----------------------
291
292These commands become enabled only when your currently selected file is of *Transparent EF* type.
293
294
295read_binary
296~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200297.. argparse::
298 :module: pySim.filesystem
299 :func: TransparentEF.ShellCommands.read_bin_parser
300
Harald Weltebe9516f2021-04-03 11:30:10 +0200301
302read_binary_decoded
303~~~~~~~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200304.. argparse::
305 :module: pySim.filesystem
306 :func: TransparentEF.ShellCommands.read_bin_dec_parser
307
Harald Weltebe9516f2021-04-03 11:30:10 +0200308
309update_binary
310~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200311.. argparse::
312 :module: pySim.filesystem
313 :func: TransparentEF.ShellCommands.upd_bin_parser
314
Harald Weltebe9516f2021-04-03 11:30:10 +0200315
316update_binary_decoded
317~~~~~~~~~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200318.. argparse::
319 :module: pySim.filesystem
320 :func: TransparentEF.ShellCommands.upd_bin_dec_parser
Harald Weltebe9516f2021-04-03 11:30:10 +0200321
Harald Welte0d4e98a2021-04-07 00:14:40 +0200322In normal operation, update_binary_decoded needs a JSON document representing the entire file contents as
323input. This can be inconvenient if you want to keep 99% of the content but just toggle one specific
324parameter. That's where the JSONpath support comes in handy: You can specify a JSONpath to an element
325inside the document as well as a new value for tat field:
326
327Th below example demonstrates this by modifying the ofm field within EF.AD:
328
329::
330
331 pySIM-shell (MF/ADF.USIM/EF.AD)> read_binary_decoded
332 {
333 "ms_operation_mode": "normal",
334 "specific_facilities": {
335 "ofm": true
336 },
337 "len_of_mnc_in_imsi": 2
338 }
339 pySIM-shell (MF/ADF.USIM/EF.AD)> update_binary_decoded --json-path specific_facilities.ofm false
340 pySIM-shell (MF/ADF.USIM/EF.AD)> read_binary_decoded
341 {
342 "ms_operation_mode": "normal",
343 "specific_facilities": {
344 "ofm": false
345 },
346 "len_of_mnc_in_imsi": 2
347 }
348
Harald Weltebe9516f2021-04-03 11:30:10 +0200349
Harald Welte4145d3c2021-04-08 20:34:13 +0200350edit_binary_decoded
351~~~~~~~~~~~~~~~~~~~
352This command will read the selected binary EF, decode it to its JSON representation, save
353that JSON to a temporary file on your computer, and launch your configured text editor.
354
355You may then perform whatever modifications to the JSON representation, save + leave your
356text editor.
357
358Afterwards, the modified JSON will be re-encoded to the binary format, and the result written
359to the SIM card.
360
361This allows for easy interactive modification of file contents.
362
Harald Weltebe9516f2021-04-03 11:30:10 +0200363
Harald Welte917d98c2021-04-21 11:51:25 +0200364
365BER-TLV EF commands
366-------------------
367
368BER-TLV EFs are files that contain BER-TLV structured data. Every file can contain any number
369of variable-length IEs (DOs). The tag within a BER-TLV EF must be unique within the file.
370
371The commands below become enabled only when your currently selected file is of *BER-TLV EF* type.
372
373retrieve_tags
374~~~~~~~~~~~~~
375
376Retrieve a list of all tags present in the currently selected file.
377
378
379retrieve_data
380~~~~~~~~~~~~~
381.. argparse::
382 :module: pySim.filesystem
383 :func: BerTlvEF.ShellCommands.retrieve_data_parser
384
385
386set_data
387~~~~~~~~
388.. argparse::
389 :module: pySim.filesystem
390 :func: BerTlvEF.ShellCommands.set_data_parser
391
392
393del_data
394~~~~~~~~
395.. argparse::
396 :module: pySim.filesystem
397 :func: BerTlvEF.ShellCommands.del_data_parser
398
399
400
Harald Welte15fae982021-04-10 10:22:27 +0200401USIM commands
402-------------
403
404authenticate
405~~~~~~~~~~~~
406.. argparse::
407 :module: pySim.ts_31_102
408 :func: ADF_USIM.AddlShellCommands.authenticate_parser
409
410
411
Harald Weltebe9516f2021-04-03 11:30:10 +0200412cmd2 settable parameters
413------------------------
414
415``cmd2`` has the concept of *settable parameters* which act a bit like environment variables in an OS-level
416shell: They can be read and set, and they will influence the behavior somehow.
417
418conserve_write
419~~~~~~~~~~~~~~
420
421If enabled, pySim will (when asked to write to a card) always first read the respective file/record and
422verify if the to-be-written value differs from the current on-card value. If not, the write will be skipped.
423Writes will only be performed if the new value is different from the current on-card value.
424
425If disabled, pySim will always write irrespective of the current/new value.
426
Harald Welte1748b932021-04-06 21:12:25 +0200427json_pretty_print
428~~~~~~~~~~~~~~~~~
429
430This parameter determines if generated JSON output should (by default) be pretty-printed (multi-line
431output with indent level of 4 spaces) or not.
432
433The default value of this parameter is 'true'.
434
Harald Weltebe9516f2021-04-03 11:30:10 +0200435debug
436~~~~~
437
438If enabled, full python back-traces will be displayed in case of exceptions
439
Harald Welte7829d8a2021-04-10 11:28:53 +0200440apdu_trace
441~~~~~~~~~~
442
443Boolean variable that determines if a hex-dump of the command + response APDU shall be printed.
444
Harald Weltebe9516f2021-04-03 11:30:10 +0200445numeric_path
446~~~~~~~~~~~~
447
448Boolean variable that determines if path (e.g. in prompt) is displayed with numeric FIDs or string names.
449
450::
451
452 pySIM-shell (MF/EF.ICCID)> set numeric_path True
453 numeric_path - was: False
454 now: True
455 pySIM-shell (3f00/2fe2)> set numeric_path False
456 numeric_path - was: True
457 now: False
458 pySIM-shell (MF/EF.ICCID)> help set