blob: 3ab1113fdf27a8ca3718bef05977699fb2fd2a57 [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 Weltebd02f842021-10-21 14:40:39 +0200199Please note that `export` works relative to the current working
200directory, so if you are in `MF`, then the export will contain all known
201files on the card. However, if you are in `ADF.ISIM`, only files below
202that ADF will be part of the export.
203
204Furthermore, it is strongly advised to first enter the ADM1 pin
205(`verify_adm`) to maximize the chance of having permission to read
206all/most files.
207
Harald Weltebe9516f2021-04-03 11:30:10 +0200208
209tree
210~~~~
Harald Welte7743c202021-05-03 23:30:11 +0200211
212Display a tree of the card filesystem. It is important to note that this displays a tree
213of files that might potentially exist (based on the card profile). In order to determine if
214a given file really exists on a given card, you have to try to select that file.
Harald Welted36f6942021-04-04 14:37:55 +0200215
Harald Weltebe9516f2021-04-03 11:30:10 +0200216
217verify_adm
218~~~~~~~~~~
Harald Welte7743c202021-05-03 23:30:11 +0200219
220Verify the ADM (Administrator) PIN specified as argument. This is typically needed in order
221to get write/update permissions to most of the files on SIM cards.
222
223Currently only ADM1 is supported.
Harald Weltebe9516f2021-04-03 11:30:10 +0200224
225
Harald Weltedaf2b392021-05-03 23:17:29 +0200226reset
227~~~~~
Harald Weltedaf2b392021-05-03 23:17:29 +0200228Perform card reset and display the card ATR.
229
Harald Weltebd02f842021-10-21 14:40:39 +0200230intro
231~~~~~
232[Re-]Display the introductory banner
233
234
235equip
236~~~~~
237Equip pySim-shell with a card; particularly useful if the program was
238started before a card was present, or after a card has been replaced by
239the user while pySim-shell was kept running.
240
241bulk_script
242~~~~~~~~~~~
243.. argparse::
244 :module: pySim-shell
245 :func: PysimApp.bulk_script_parser
246
247Run a script for bulk-provisioning of multiple cards.
248
249
250echo
251~~~~
252.. argparse::
253 :module: pySim-shell
254 :func: PysimApp.echo_parser
255
256
Harald Weltedaf2b392021-05-03 23:17:29 +0200257
Harald Weltebe9516f2021-04-03 11:30:10 +0200258Linear Fixed EF commands
259------------------------
260
261These commands become enabled only when your currently selected file is of *Linear Fixed EF* type.
262
263read_record
264~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200265.. argparse::
266 :module: pySim.filesystem
267 :func: LinFixedEF.ShellCommands.read_rec_parser
268
Harald Weltebe9516f2021-04-03 11:30:10 +0200269
270read_record_decoded
271~~~~~~~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200272.. argparse::
273 :module: pySim.filesystem
274 :func: LinFixedEF.ShellCommands.read_rec_dec_parser
275
Harald Weltebe9516f2021-04-03 11:30:10 +0200276
Harald Welte850b72a2021-04-07 09:33:03 +0200277read_records
278~~~~~~~~~~~~
279.. argparse::
280 :module: pySim.filesystem
281 :func: LinFixedEF.ShellCommands.read_recs_parser
282
283
284read_records_decoded
285~~~~~~~~~~~~~~~~~~~~
286.. argparse::
287 :module: pySim.filesystem
288 :func: LinFixedEF.ShellCommands.read_recs_dec_parser
289
290
Harald Weltebe9516f2021-04-03 11:30:10 +0200291update_record
292~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200293.. argparse::
294 :module: pySim.filesystem
295 :func: LinFixedEF.ShellCommands.upd_rec_parser
296
Harald Weltebe9516f2021-04-03 11:30:10 +0200297
298update_record_decoded
299~~~~~~~~~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200300.. argparse::
301 :module: pySim.filesystem
302 :func: LinFixedEF.ShellCommands.upd_rec_dec_parser
Harald Weltebe9516f2021-04-03 11:30:10 +0200303
304
Harald Welte4145d3c2021-04-08 20:34:13 +0200305edit_record_decoded
306~~~~~~~~~~~~~~~~~~~
307.. argparse::
308 :module: pySim.filesystem
309 :func: LinFixedEF.ShellCommands.edit_rec_dec_parser
310
311This command will read the selected record, decode it to its JSON representation, save
312that JSON to a temporary file on your computer, and launch your configured text editor.
313
314You may then perform whatever modifications to the JSON representation, save + leave your
315text editor.
316
317Afterwards, the modified JSON will be re-encoded to the binary format, and the result written
318back to the record on the SIM card.
319
320This allows for easy interactive modification of records.
321
322
Harald Weltebe9516f2021-04-03 11:30:10 +0200323
324Transparent EF commands
325-----------------------
326
327These commands become enabled only when your currently selected file is of *Transparent EF* type.
328
329
330read_binary
331~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200332.. argparse::
333 :module: pySim.filesystem
334 :func: TransparentEF.ShellCommands.read_bin_parser
335
Harald Weltebe9516f2021-04-03 11:30:10 +0200336
337read_binary_decoded
338~~~~~~~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200339.. argparse::
340 :module: pySim.filesystem
341 :func: TransparentEF.ShellCommands.read_bin_dec_parser
342
Harald Weltebe9516f2021-04-03 11:30:10 +0200343
344update_binary
345~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200346.. argparse::
347 :module: pySim.filesystem
348 :func: TransparentEF.ShellCommands.upd_bin_parser
349
Harald Weltebe9516f2021-04-03 11:30:10 +0200350
351update_binary_decoded
352~~~~~~~~~~~~~~~~~~~~~
Harald Welted36f6942021-04-04 14:37:55 +0200353.. argparse::
354 :module: pySim.filesystem
355 :func: TransparentEF.ShellCommands.upd_bin_dec_parser
Harald Weltebe9516f2021-04-03 11:30:10 +0200356
Harald Welte0d4e98a2021-04-07 00:14:40 +0200357In normal operation, update_binary_decoded needs a JSON document representing the entire file contents as
358input. This can be inconvenient if you want to keep 99% of the content but just toggle one specific
359parameter. That's where the JSONpath support comes in handy: You can specify a JSONpath to an element
360inside the document as well as a new value for tat field:
361
362Th below example demonstrates this by modifying the ofm field within EF.AD:
363
364::
365
366 pySIM-shell (MF/ADF.USIM/EF.AD)> read_binary_decoded
367 {
368 "ms_operation_mode": "normal",
369 "specific_facilities": {
370 "ofm": true
371 },
372 "len_of_mnc_in_imsi": 2
373 }
374 pySIM-shell (MF/ADF.USIM/EF.AD)> update_binary_decoded --json-path specific_facilities.ofm false
375 pySIM-shell (MF/ADF.USIM/EF.AD)> read_binary_decoded
376 {
377 "ms_operation_mode": "normal",
378 "specific_facilities": {
379 "ofm": false
380 },
381 "len_of_mnc_in_imsi": 2
382 }
383
Harald Weltebe9516f2021-04-03 11:30:10 +0200384
Harald Welte4145d3c2021-04-08 20:34:13 +0200385edit_binary_decoded
386~~~~~~~~~~~~~~~~~~~
387This command will read the selected binary EF, decode it to its JSON representation, save
388that JSON to a temporary file on your computer, and launch your configured text editor.
389
390You may then perform whatever modifications to the JSON representation, save + leave your
391text editor.
392
393Afterwards, the modified JSON will be re-encoded to the binary format, and the result written
394to the SIM card.
395
396This allows for easy interactive modification of file contents.
397
Harald Weltebe9516f2021-04-03 11:30:10 +0200398
Harald Welte917d98c2021-04-21 11:51:25 +0200399
400BER-TLV EF commands
401-------------------
402
403BER-TLV EFs are files that contain BER-TLV structured data. Every file can contain any number
404of variable-length IEs (DOs). The tag within a BER-TLV EF must be unique within the file.
405
406The commands below become enabled only when your currently selected file is of *BER-TLV EF* type.
407
408retrieve_tags
409~~~~~~~~~~~~~
410
411Retrieve a list of all tags present in the currently selected file.
412
413
414retrieve_data
415~~~~~~~~~~~~~
416.. argparse::
417 :module: pySim.filesystem
418 :func: BerTlvEF.ShellCommands.retrieve_data_parser
419
420
421set_data
422~~~~~~~~
423.. argparse::
424 :module: pySim.filesystem
425 :func: BerTlvEF.ShellCommands.set_data_parser
426
427
428del_data
429~~~~~~~~
430.. argparse::
431 :module: pySim.filesystem
432 :func: BerTlvEF.ShellCommands.del_data_parser
433
434
435
Harald Welte15fae982021-04-10 10:22:27 +0200436USIM commands
437-------------
438
439authenticate
440~~~~~~~~~~~~
441.. argparse::
442 :module: pySim.ts_31_102
443 :func: ADF_USIM.AddlShellCommands.authenticate_parser
444
445
Harald Welte95ce6b12021-10-20 18:40:54 +0200446ARA-M commands
447--------------
448
449The ARA-M commands exist to manage the access rules stored in an ARA-M applet on the card.
450
451ARA-M in the context of SIM cards is primarily used to enable Android UICC Carrier Privileges,
452please see https://source.android.com/devices/tech/config/uicc for more details on the background.
453
454
455aram_get_all
456~~~~~~~~~~~~
457
458Obtain and decode all access rules from the ARA-M applet on the card.
459
460NOTE: if the total size of the access rules exceeds 255 bytes, this command will fail, as
461it doesn't yet implement fragmentation/reassembly on rule retrieval. YMMV
462
463::
464
465 pySIM-shell (MF/ADF.ARA-M)> aram_get_all
466 [
467 {
468 "ResponseAllRefArDO": [
469 {
470 "RefArDO": [
471 {
472 "RefDO": [
473 {
474 "AidRefDO": "ffffffffffff"
475 },
476 {
477 "DevAppIdRefDO": "e46872f28b350b7e1f140de535c2a8d5804f0be3"
478 }
479 ]
480 },
481 {
482 "ArDO": [
483 {
484 "ApduArDO": {
485 "generic_access_rule": "always"
486 }
487 },
488 {
489 "PermArDO": {
490 "permissions": "0000000000000001"
491 }
492 }
493 ]
494 }
495 ]
496 }
497 ]
498 }
499 ]
500
501aram_get_config
502~~~~~~~~~~~~~~~
503Perform Config handshake with ARA-M applet: Tell it our version and retrieve its version.
504
505NOTE: Not supported in all ARA-M implementations.
506
507.. argparse::
508 :module: pySim.ara_m
509 :func: ADF_ARAM.AddlShellCommands.get_config_parser
510
511
512aram_store_ref_ar_do
513~~~~~~~~~~~~~~~~~~~~
514Store a [new] access rule on the ARA-M applet.
515
516.. argparse::
517 :module: pySim.ara_m
518 :func: ADF_ARAM.AddlShellCommands.store_ref_ar_do_parse
519
520For example, to store an Android UICC carrier privilege rule for the SHA1 hash of the certificate used to sign the CoIMS android app of Supreeth Herle (https://github.com/herlesupreeth/CoIMS_Wiki) you can use the following command:
521
522::
523
524 pySIM-shell (MF/ADF.ARA-M)> aram_store_ref_ar_do --aid FFFFFFFFFFFF --device-app-id E46872F28B350B7E1F140DE535C2A8D5804F0BE3 --android-permissions 0000000000000001 --apdu-always
525
526
527aram_delete_all
528~~~~~~~~~~~~~~~
529This command will request deletion of all access rules stored within the
530ARA-M applet. Use it with caution, there is no undo. Any rules later
531intended must be manually inserted again using `aram_store_ref_ar_do`
532
533
Harald Welte15fae982021-04-10 10:22:27 +0200534
Harald Weltebe9516f2021-04-03 11:30:10 +0200535cmd2 settable parameters
536------------------------
537
538``cmd2`` has the concept of *settable parameters* which act a bit like environment variables in an OS-level
539shell: They can be read and set, and they will influence the behavior somehow.
540
541conserve_write
542~~~~~~~~~~~~~~
543
544If enabled, pySim will (when asked to write to a card) always first read the respective file/record and
545verify if the to-be-written value differs from the current on-card value. If not, the write will be skipped.
546Writes will only be performed if the new value is different from the current on-card value.
547
548If disabled, pySim will always write irrespective of the current/new value.
549
Harald Welte1748b932021-04-06 21:12:25 +0200550json_pretty_print
551~~~~~~~~~~~~~~~~~
552
553This parameter determines if generated JSON output should (by default) be pretty-printed (multi-line
554output with indent level of 4 spaces) or not.
555
556The default value of this parameter is 'true'.
557
Harald Weltebe9516f2021-04-03 11:30:10 +0200558debug
559~~~~~
560
561If enabled, full python back-traces will be displayed in case of exceptions
562
Harald Welte7829d8a2021-04-10 11:28:53 +0200563apdu_trace
564~~~~~~~~~~
565
566Boolean variable that determines if a hex-dump of the command + response APDU shall be printed.
567
Harald Weltebe9516f2021-04-03 11:30:10 +0200568numeric_path
569~~~~~~~~~~~~
570
571Boolean variable that determines if path (e.g. in prompt) is displayed with numeric FIDs or string names.
572
573::
574
575 pySIM-shell (MF/EF.ICCID)> set numeric_path True
576 numeric_path - was: False
577 now: True
578 pySIM-shell (3f00/2fe2)> set numeric_path False
579 numeric_path - was: True
580 now: False
581 pySIM-shell (MF/EF.ICCID)> help set